linux – 为什么不挂载尊重绑定挂载的只读选项?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了linux – 为什么不挂载尊重绑定挂载的只读选项?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4244字,纯文字阅读大概需要7分钟。
内容图文
![linux – 为什么不挂载尊重绑定挂载的只读选项?](/upload/InfoBanner/zyjiaocheng/959/0319e263bd004f6fa23fae1497110446.jpg)
在我的Arch Linux系统(Linux Kernel 3.14.2)上,绑定挂载不遵循只读选项
# mkdir test
# mount --bind -o ro test/ /mnt
# touch /mnt/foo
创建文件/ mnt / foo. / proc / mounts中的相关条目是
/dev/sda2 /mnt ext4 rw,noatime,data=ordered 0 0
mount选项与我请求的选项不匹配,但是匹配bind挂载的读/写行为和用于最初挂载/ dev / sda2的选项/
/dev/sda2 / ext4 rw,noatime,data=ordered 0 0
但是,如果我重新安装mount,那么它会尊重只读选项
# mount --bind -o remount,ro test/ /mnt
# touch /mnt/bar
touch: cannot touch ‘/mnt/bar’: Read-only file system
以及/ proc / mounts /中的相关条目
/dev/sda2 /mnt ext4 ro,relatime,data=ordered 0 0
看起来像我可能期望的那样(虽然事实上我希望看??到测试目录的完整路径). / proc / mounts /中/ dev / sda2 / on /的orignal挂载条目也保持不变并保持读/写
/dev/sda2 / ext4 rw,noatime,data=ordered 0 0
至少从2008开始就知道了这种行为和解决方法,并在mount的手册页中有记录
Note that the filesystem mount options will remain the same as those on the original mount point, and cannot be changed by passing the -o option along with –bind/–rbind. The mount options can be changed by a separate remount command
并非所有分布都表现相同. Arch似乎默默地不尊重这些选项,而Debian在绑定挂载没有以只读方式挂载时会生成警告
mount: warning: /mnt seems to be mounted read-write.
据报道,这种行为在Debian Lenny and Squeeze中被“修复”了,虽然它似乎不是universal fix,但它仍然可以在Debian Wheezy中使用.使bind绑定与初始挂载上的只读选项相关的难点是什么?
解决方法:
Bind mount只是……好吧……绑定装载.即这不是一个新的坐骑.它只是“链接”/“公开”/“认为”一个子目录作为新的挂载点.因此,它不能改变安装参数.这就是你收到投诉的原因:
# mount /mnt/1/lala /mnt/2 -o bind,ro
mount: warning: /mnt/2 seems to be mounted read-write.
但正如你所说的普通绑定挂载工作原理:
# mount /mnt/1/lala /mnt/2 -o bind
然后一个ro remount也有效:
# mount /mnt/1/lala /mnt/2 -o bind,remount,ro
然而,发生的是你正在改变整个安装而不仅仅是这个绑定安装.如果您查看/ proc / mounts,您会看到bind mount和原始mount更改为只读:
/dev/loop0 /mnt/1 ext2 ro,relatime,errors=continue,user_xattr,acl 0 0
/dev/loop0 /mnt/2 ext2 ro,relatime,errors=continue,user_xattr,acl 0 0
所以你要做的就是将初始挂载更改为只读挂载,然后执行绑定挂载,这当然是只读的.
更新2016-07-20:
对于4.5内核,以下情况属实,但对于4.3内核则不然(这是错误的.请参阅下面的更新#2):
内核有两个控制只读的标志:
> MS_READONLY:指示挂载是否为只读
> MNT_READONLY:指示“用户”是否希望它为只读
在4.5内核上,执行mount -o bind,ro实际上就可以了.例如,这个:
# mkdir /tmp/test
# mkdir /tmp/test/a /tmp/test/b
# mount -t tmpfs none /tmp/test/a
# mkdir /tmp/test/a/d
# mount -o bind,ro /tmp/test/a/d /tmp/test/b
将创建/ tmp / test / a / d的只读绑定挂载到/ tmp / test / b,它将在/ proc / mounts中显示为:
none /tmp/test/a tmpfs rw,relatime 0 0
none /tmp/test/b tmpfs ro,relatime 0 0
在/ proc / self / mountinfo中可以看到更详细的视图,它考虑了用户视图(命名空间).相关的行将是这些:
363 74 0:49 / /tmp/test/a rw,relatime shared:273 - tmpfs none rw
368 74 0:49 /d /tmp/test/b ro,relatime shared:273 - tmpfs none rw
在第二行,你可以看到它表示ro(MNT_READONLY)和rw(!MS_READONLY).
最终结果如下:
# echo a > /tmp/test/a/d/f
# echo a > /tmp/test/b/f
-su: /tmp/test/b/f: Read-only file system
更新2016-07-20#2:
进一步深入研究表明,该行为实际上取决于libmount的版本,而libmount是util-linux的一部分.此commit添加了对此的支持,并在2.27版本中发布:
commit 9ac77b8a78452eab0612523d27fee52159f5016a Author: Karel Zak Date: Mon Aug 17 11:54:26 2015 +0200 libmount: add support for "bind,ro" Now it's necessary t use two mount(8) calls to create a read-only mount: mount /foo /bar -o bind mount /bar -o remount,ro,bind This patch allows to specify "bind,ro" and the remount is done automatically by libmount by additional mount(2) syscall. It's not atomic of course. Signed-off-by: Karel Zak
这也提供了解决方法.在较旧和较新的mount上使用strace可以看到该行为:
旧:
mount("/tmp/test/a/d", "/tmp/test/b", 0x222e240, MS_MGC_VAL|MS_RDONLY|MS_BIND, NULL) = 0 <0.000681>
新:
mount("/tmp/test/a/d", "/tmp/test/b", 0x1a8ee90, MS_MGC_VAL|MS_RDONLY|MS_BIND, NULL) = 0 <0.011492>
mount("none", "/tmp/test/b", NULL, MS_RDONLY|MS_REMOUNT|MS_BIND, NULL) = 0 <0.006281>
结论:
要获得所需的结果,需要运行两个命令(如@Thomas已经说过):
mount SRC DST -o bind
mount DST -o remount,ro,bind
较新版本的mount(util-linux> = 2.27)在运行时自动执行此操作
mount SRC DST -o bind,ro
内容总结
以上是互联网集市为您收集整理的linux – 为什么不挂载尊重绑定挂载的只读选项?全部内容,希望文章能够帮你解决linux – 为什么不挂载尊重绑定挂载的只读选项?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。