过去,在 NAS 故障期间丢失了数百 TB 的数据,出于习惯,我总是将服务器上的挂载点设置为不可变。这样可以防止对挂载点下的磁盘结构进行任何更改。这样可以防止挂载在该挂载点的磁盘断开连接,内核反而开始将这些文件写入挂载点。将其设置为不可变可以防止根卷填满,并导致安全警钟开始响起,这有助于我们更快地注意到问题。
正常情况下,这很好用。如果我创建 /mnt/mountpoint,并使其不可变,则无法以 root 身份在那里创建任何文件。如果我在 /mnt/mountpoint 上安装卷,则可以毫无问题地在那里创建测试文件。
[root@test-vm-1 ~]# mkdir /mnt/test
[root@test-vm-1 ~]# touch /mnt/test/testfile
[root@test-vm-1 ~]# ls /mnt/test/testfile
/mnt/test/testfile
[root@test-vm-1 ~]# rm -f /mnt/test/testfile
[root@test-vm-1 ~]# chattr +i /mnt/test/
[root@test-vm-1 ~]# touch /mnt/test/testfile
touch: cannot touch `/mnt/test/testfile': Permission denied
[root@bcv-ub-test-vm-1 ~]# mkfs.ext4 /dev/sdb1
mke2fs 1.41.12 (17-May-2010)
TEXT OMMITTED
[root@test-vm-1 ~]# mount /dev/sdb1 /mnt/test/
[root@test-vm-1 ~]# touch /mnt/test/testfile
[root@test-vm-1 ~]# umount /mnt/test
[root@test-vm-1 ~]# umount /mnt/test/testfile
umount: /mnt/test/testfile: not found
[root@test-vm-1 ~]# touch /mnt/test/testfile
touch: cannot touch `/mnt/test/testfile': Permission denied
因此,除非在那里安装了卷,否则您无法写入安装点。
但是,我使用剧本在 ansible 中运行以下命令:
- name: Validate that VIVALogger volume group is created and added
stat:
path: /dev/sdb1
register: stat_result
- name: Configure export volume - add mountpoint
file:
path: /mnt/test
state: directory
- name: Make test mountpoint immutable
command: "chattr +i /mnt/test"
- name: Configure export volume - mount export volume
mount:
path: /mnt/test
src: /dev/sdb1
fstype: xfs
state: mounted
opts: inode64,nobarrier
dump: 0
passno: 2
when: stat_result.stat.exists
- name: Pause for 30 seconds for volume to mount properly
pause:
seconds: 30
- name: Create testfile
command: "touch /mnt/test/testfile"
无法将任何文件写入已挂载的卷。似乎不可变性正在递归应用于该卷的所有子目录。
我也尝试过使用文件模块来配置不变性,其行为是一样的。
有人见过这种行为吗? 我正在针对 RHEL 5、6 和 7 使用 ansible 2.6.3。