![我尝试过的选项和可能的替代方案](https://linux22.com/image/1174090/%E6%88%91%E5%B0%9D%E8%AF%95%E8%BF%87%E7%9A%84%E9%80%89%E9%A1%B9%E5%92%8C%E5%8F%AF%E8%83%BD%E7%9A%84%E6%9B%BF%E4%BB%A3%E6%96%B9%E6%A1%88.png)
总结:
我想要一个 /dev 镜像,比如 /dev_ro,它是明确只读的;任何时候我成为 root 并搞砸了一个命令,或者任何时候我需要检查原始设备但不需要写入它们,只要我使用/dev_ro/sda
而不是/dev/sda
我就可以免受任何意外的伤害
我想知道是否有任何聪明的方法可以将 devtmpfs 实例挂载为只读
(我在 arch 上输入,所以我不确定 Ubuntu 是否专门使用 devtmpfs,但我通常启动基于 Ubuntu 的系统,所以首先在这里询问)这样我就可以为我的系统拥有一组设备文件,它们将镜像 /dev 中的文件,但明确是只读的。
在任何基于 Linux 的系统中,从设备文件读取通常都是超级用户的工作,因为,例如,允许未经授权的用户读取磁盘并创建映像以供稍后在个人机器上检查会绕过文件系统中的权限系统。因此,我们经常希望以 root 身份运行从磁盘读取的任何应用程序。
但是,一旦我们成为 root 后,就很容易犯错误,覆盖磁盘、删除分区或进行任何其他坏事 :TM:,因为一旦我们成为 root,我们就拥有了所有权力,即使我们不需要或不打算使用它。
我希望安装一个只读的 devtmpfs(或等效物,见上文),这样我就可以安全地减少作为管理员可能犯错误的次数,尤其是凌晨 4 点更常见的拼写错误和其他特殊错误,这样我就可以以 root 身份访问磁盘,但可以防止在不必要的情况下对磁盘进行任何写入操作。
例如,我目前正在编写一个脚本,尽可能完整地备份我的磁盘的 MBR 或 GPT,并在进行任何分区工作之前运行,这样每次我都可以回退。在这种情况下,我明确不想在脚本的任何时候向磁盘写入任何内容,但根据默认设置,我需要成为 root 才能读取磁盘,如果我的脚本中有任何错误(可能性不大),那么我可能会破坏我的磁盘,而不是按预期备份分区表,因为执行这项工作的大多数命令都需要使用 sudo 运行。
例如,如果我可以运行,sudo sfdisk --dump /dev_ro/sda
那么这将避免以下风险:如果我给了 sfdisk 一些错误的选项,比如sudo sfdisk --delete /dev_ro/sda #WHOOPS!
当它到达 /dev_ro/sda 时,它将无法物理地写入它。
如果不是因为链接不能拥有自己的权限而是重定向到原始文件,我很乐意找到一个像创建符号链接树一样简单的解决方案。
我尝试过的选项和可能的替代方案
- 使用只读绑定挂载
- 这会使文件系统变为只读,但其中的文件不是
dd if=/dev/zero of=/dev_ro/null
成功
- 这会使文件系统变为只读,但其中的文件不是
- 使用 ro 选项挂载 devtmpfs
- 如上
- 使用 mode=440 选项挂载 devtmpfs
- 检查 mtab,这个选项似乎被忽略了,我不确定相关文档在哪里。结果似乎与上面的相同
- 将我的用户添加到拥有设备文件的组(在 arch 上)——如果非法用户设法成为我,这将暴露一个漏洞,如果我需要以 sudo 身份运行命令(例如克隆磁盘)
disk
,这将不起作用sudo dd if=/dev_ro/sda of=/dev/sdb
- 编写一个 C 程序,以只读方式打开设备并将所有请求转发到设备
- 看起来工作风险很大
- 使用 flock 管理读写锁
- 我不知道这是否有任何潜力,我以前没有使用过它们。可以像上面一样安装文件系统,然后我们会自动对里面的所有文件调用 flock 以获取读取锁定。后续程序也必须包装以获取锁定,这可能会阻止它们写入设备。如果磁盘拒绝解锁,则在移除磁盘时可能会导致问题。
- 编辑:新选项,使用为所有设备触发的 udev 规则。从文档中我看到,可以设置创建的设备文件的模式,或添加符号链接,但目前还不能创建另一个设备文件。但是,可以运行命令
mknod
并在 ro 文件夹中使用主/次编号创建只读设备文件。通过初步测试,这似乎可行,但如果没有任何确认可以这样做,我就会犹豫。
有人能建议我通过什么方法来实现这一点,并在文件系统的某个地方安装一个 /dev 的镜像,其中包含我所有的设备文件,但有一个警告,即它们都是只读的?
谢谢您的任何建议!