綁定掛載 - CentOS 6 和 CentOS 7 上的不同結果
我在 chroot 環境中掛載了幾個目錄(綁定掛載),但它們在 CentOS 6 和 7 上的行為不同 - 完全相同的命令。
例子:
我有我的 chroot 環境
/chroot/base
。然後我將它安裝在每個使用者上:
mount --bind /chroot/base /chroot/$user
然後我掛載
/home/$user
在同一個使用者的 chroot 中:
mount --bind /home/$user /chroot/$user/home/$user
在 CentOS 6 上它工作正常,並且它安裝的正是這些目錄,但在 CentOS 7 上我得到這樣的東西:
/dev/mapper/cl_cp-home /chroot/user1/home/user1 xfs rw,relatime,attr2,inode64,usrquota 0 0 /dev/mapper/cl_cp-home /chroot/user2/home/user1 xfs rw,relatime,attr2,inode64,usrquota 0 0 /dev/mapper/cl_cp-home /chroot/user3/home/user1 xfs rw,relatime,attr2,inode64,usrquota 0 0 /dev/mapper/cl_cp-home /chroot/user2/home/user2 xfs rw,relatime,attr2,inode64,usrquota 0 0 /dev/mapper/cl_cp-home /chroot/user3/home/user2 xfs rw,relatime,attr2,inode64,usrquota 0 0 /dev/mapper/cl_cp-home /chroot/user1/home/user2 xfs rw,relatime,attr2,inode64,usrquota 0 0 /dev/mapper/cl_cp-home /chroot/user3/home/user3 xfs rw,relatime,attr2,inode64,usrquota 0 0
每個使用者的 homedir 都安裝在其他使用者的 chroot 環境中。
為什麼會這樣?CentOS6/7 之間有什麼變化可能導致這種情況?
編輯:
例如
ls
在文件夾上執行(是一個簡單的文件):user1``123user1``touch /home/user1/123user1
root@server:~# ls /chroot/user1/home/user1/ 123user1 root@server:~# ls /chroot/user2/home/user1/ 123user1 root@server:~# ls /chroot/user3/home/user1/ 123user1
更奇怪的是:
root@server:~# ls /chroot/base/home/user1/ 123user1
我沒有在任何階段安裝它
行為的來源似乎更改了共享子樹操作的預設值。核心文件Documentation/sharedsubtree.txt中提到這
private
是預設的,實際上是shared
可以通過/proc/self/mountinfo
掛載目錄後查看獲得的--bind
。root@localhost ~]# mount --bind /chroot/base /chroot/test [root@localhost ~]# grep test /proc/self/mountinfo 234 62 253:1 /chroot/base /chroot/test rw,relatime shared:1 - xfs /dev/vda1 rw,attr2,inode64,noquota
這會導致/chroot/test下的掛載傳播回*/chroot/base*,然後影響從*/chroot/base*派生的其他綁定掛載。
要恢復舊行為,必須在*/etc/fstab*
--make-private
中明確指定或private
作為掛載選項。[root@localhost ~]# umount /chroot/test [root@localhost ~]# mount --bind --make-private /chroot/base /chroot/test [root@localhost ~]# grep test /proc/self/mountinfo 234 62 253:1 /chroot/base /chroot/test rw,relatime - xfs /dev/vda1 rw,attr2,inode64,noquota
我認為將
private
選項應用於您希望恢復舊行為的任何綁定安裝是節省的。更新
由於更好的容器支持
private
,核心預設仍然systemd
是重新掛載文件系統。shared
從systemd github 站點:關於掛載傳播,將根目錄標記為共享。核心預設為“私有”,但我們認為預設為“共享”更有意義,這樣 nspawn 和容器工具可以開箱即用。如果特定設置需要其他設置,他們可以在需要時將傳播模式重置為私有。請注意,我們僅在核心直接呼叫時才設置它。如果我們被容器管理器呼叫,我們假設容器管理器知道它在做什麼(例如,因為它設置了一些具有不同傳播模式的目錄)。