什么是“绑定挂载”?我怎么做一个?到底有什么好处呢?
有人告诉我要为某些东西使用绑定安装,但我不明白它是什么或如何使用它。
在我的 Arch Linux 系统(Linux Kernel 3.14.2)上,绑定挂载不遵守只读选项
# mkdir test
# mount --bind -o ro test/ /mnt
# touch /mnt/foo
Run Code Online (Sandbox Code Playgroud)
创建文件/mnt/foo。相关条目/proc/mounts是
/dev/sda2 /mnt ext4 rw,noatime,data=ordered 0 0
Run Code Online (Sandbox Code Playgroud)
安装选项不符合我要求的选择,但这样做同时匹配绑定的读/写性能和安装使用的选项最初安装/dev/sda2上/
/dev/sda2 / ext4 rw,noatime,data=ordered 0 0
Run Code Online (Sandbox Code Playgroud)
但是,如果我重新安装挂载,则它尊重只读选项
# mount --bind -o remount,ro test/ /mnt
# touch /mnt/bar
touch: cannot touch ‘/mnt/bar’: Read-only file system
Run Code Online (Sandbox Code Playgroud)
和相关条目 /proc/mounts/
/dev/sda2 /mnt ext4 ro,relatime,data=ordered 0 0
Run Code Online (Sandbox Code Playgroud)
看起来像我所期望的(尽管实际上我希望看到test目录的完整路径)。on/proc/mounts/的原始挂载入口也没有变化,保持读/写/dev/sda2//
/dev/sda2 / ext4 rw,noatime,data=ordered 0 0
Run Code Online (Sandbox Code Playgroud)
这种行为和解决方法至少从 …
而不是使用mount | grep,我想使用mount -l -t bind,但这不起作用,并-t none显示所有坐骑。
我正在使用 fstab 在我自己的一个目录中绑定属于另一个用户的文件夹。我知道我可以在安装 SSHFS 时映射用户,我一直在做一些研究,但找不到mount --bind等效的。
有什么办法可以将其他用户的文件夹和文件挂载为我自己的?
更新:它不一定必须是mount --bind。它只需要在映射用户时做一些类似的事情,并且可以在启动时完成。
很多人一直说 Linux 不保存有关绑定挂载的信息,因此无法获得它们及其来源的列表。这里有些例子:
来自这里的评论之一:
IIRC 此信息不会保存在任何地方:之后mount --bind,两个副本是等价的,没有一个比另一个更“原始”。毕竟,如果您已经卸载/mnt.
来自本网站的回答:
因此,记住哪些挂载是绑定挂载的唯一方法是将挂载命令的日志保留在/etc/mtab. 绑定安装操作由绑定安装选项指示(这会导致文件系统类型被忽略)。但是 mount 没有选项只列出使用一组特定选项安装的文件系统。
来自Debian 错误报告:
这是故意的。两个挂载点在所有方面都完全相同,因此内核不会保留任何标志来区分它们。
不过以上都是废话。该工具findmnt能够列出绑定安装的源路径(以 的形式device[source-path];我也试图让它仅列出源路径而不是设备)。如果 Linux 内核要维护一个绑定挂载,那么该信息必须存储在某个地方,否则它无法知道/home绑定到/users. 那么这些数据在哪里呢?它是否存储在 RAM 中的某个模糊区域?是否findmnt在/proc某处查看?
所以我试图了解 Linux 的 mount 命名空间是如何工作的。所以,我做了一个小实验并打开了两个终端并运行了以下内容:
1号航站楼
root@goliath:~# mkdir a b
root@goliath:~# touch a/foo.txt
root@goliath:~# unshare --mount -- /bin/bash
root@goliath:~# mount --bind a b
root@goliath:~# ls b
foo.txt
Run Code Online (Sandbox Code Playgroud)
2 号航站楼
root@goliath:~# ls b
foo.txt
Run Code Online (Sandbox Code Playgroud)
为什么在 2 号航站楼可以看到安装座?由于它不是挂载命名空间的一部分,我希望该目录在此处显示为空。我也尝试通过-o shared=no和使用--make-private选项mount,但我得到了相同的结果。
我错过了什么,我怎样才能让它真正私密?
为什么这不起作用?
$ unshare -rm mount --bind / /mnt
mount: /mnt: wrong fs type, bad option, bad superblock on /, missing codepage or helper program, or other error.
Run Code Online (Sandbox Code Playgroud)
这些工作正常:
$ unshare -rm mount --bind /tmp /mnt
$ unshare -rm mount --bind /root /mnt
$
Run Code Online (Sandbox Code Playgroud)
$ uname -r # Linux kernel version
4.17.3-200.fc28.x86_64
Run Code Online (Sandbox Code Playgroud) 在serverfault 上被问到但没有得到足够的关注,所以在这里重新发布,希望这里的一些人知道答案。
还有另一个问题在讨论卸载 rbind 挂载,但该解决方案有不良影响。考虑以下目录布局:
.
??? A_dir
? ??? mount_b
??? B_dir
? ??? mount_c
??? C_dir
Run Code Online (Sandbox Code Playgroud)
现在我绑定C_dir到B_dir/mount_c和 rbindB_dir到A_dir/mount_b:
[hidden]$ sudo mount --bind C_dir B_dir/mount_c
[hidden]$ sudo mount --rbind B_dir A_dir/mount_b
[hidden]$ mount | grep _dir | wc -l
3
Run Code Online (Sandbox Code Playgroud)
现在umount A_dir/mount_b会失败,这并不奇怪。根据网络上随处可见的答案,我们需要umount A_dir/mount_b/mount_c先然后umount A_dir/mount_b。但是,umount A_dir/mount_b/mount_c也会 unmount B_dir/mount_c,这是不需要的:
[hidden]$ sudo umount A_dir/mount_b/mount_c
[hidden]$ mount | grep _dir | wc …Run Code Online (Sandbox Code Playgroud) 我想cryptsetup在systemd-nspawn容器内安装一个加密的图像文件。但是,我收到此错误消息:
[root@container ~]# echo $key | cryptsetup -d - open luks.img luks
Cannot initialize device-mapper. Is dm_mod kernel module loaded?
Cannot use device luks, name is invalid or still in use.
Run Code Online (Sandbox Code Playgroud)
该dm_mod内核模块被加载在主机系统上,虽然事情看起来有点容器内的怪异:
[root@host ~]# grep dm_mod /proc/modules
dm_mod 159744 2 dm_crypt, Live 0xffffffffc12c6000
[root@container ~]# grep dm_mod /proc/modules
dm_mod 159744 2 dm_crypt, Live 0x0000000000000000
Run Code Online (Sandbox Code Playgroud)
strace表示cryptsetup无法创建/dev/mapper/control:
[root@etrial ~]# echo $key | strace cryptsetup -d - open luks.img luks 2>&1 | …Run Code Online (Sandbox Code Playgroud) Btrfs wiki 的系统管理员指南(此处)说道:
Btrfs 子卷可以被视为 POSIX 文件命名空间。
我记得一开始它说子卷是一个“POSIX 文件命名空间”,而不是被认为是“POSIX 文件命名空间”。Google 搜索"POSIX file namespace"仅显示有关 Btrfs 的内容,因此该短语没有帮助。
Btrfs 中的子卷到底是什么?如果子卷可以作为文件系统根目录中的目录进行访问,那么挂载子卷与将任何其他文件系统上的目录绑定挂载到另一个位置(无需中间挂载所述文件系统的根)有何不同?这就是我的意思:
# standard bind mount
mkdir /mnt/data
mkdir /mnt/docs
mount /dev/sda2 /mnt/data
mount --bind /mnt/data/docs /mnt/docs
umount /mnt/data
rmdir /mnt/data
# hypothetical method of directly mounting
# a file/directory on a filesystem
# to some path that achieves the same
# as the above
mkdir /mnt/docs
mount -o path_on_fs=/docs /dev/sda2 /mnt/docs
# if /docs on sda2 …Run Code Online (Sandbox Code Playgroud) bind-mount ×10
mount ×8
linux ×6
namespace ×3
filesystems ×2
btrfs ×1
container ×1
linux-kernel ×1
readonly ×1
unmounting ×1
userns ×1
users ×1