Centos

綁定掛載 - CentOS 6 和 CentOS 7 上的不同結果

  • May 21, 2018

我在 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是重新掛載文件系統。sharedsystemd github 站點

關於掛載傳播,將根目錄標記為共享。核心預設為“私有”,但我們認為預設為“共享”更有意義,這樣 nspawn 和容器工具可以開箱即用。如果特定設置需要其他設置,他們可以在需要時將傳播模式重置為私有。請注意,我們僅在核心直接呼叫時才設置它。如果我們被容器管理器呼叫,我們假設容器管理器知道它在做什麼(例如,因為它設置了一些具有不同傳播模式的目錄)。

引用自:https://serverfault.com/questions/913053