为什么 USB 闪存驱动器使用 nodev 选项安装?

为什么 USB 闪存驱动器使用 nodev 选项安装?

mount(8) OS X 手册页描述nodev选项:

不解释文件系统上的字符或块特殊设备。此选项对于文件系统包含除自身架构之外的其他架构的特殊设备的服务器很有用。

仅就这一点而言,我还不完全明白…… 

…对我来说,这个问题更重要的部分——可能有助于我理解这个选项——是:

为什么 USB 闪存驱动器使用 nodev 选项安装?

例子:

sh-3.2$ mount
/dev/disk1 on / (hfs, local, journaled)
devfs on /dev (devfs, local, nobrowse)
/dev/disk0s2 on /Volumes/swap (hfs, local, journaled)
/dev/disk0s4 on /Volumes/spare (hfs, local, journaled)
map -hosts on /net (autofs, nosuid, automounted, nobrowse)
map auto_home on /home (autofs, automounted, nobrowse)
localhost:/Eiu9XWYlwq4E8x9l_bQTiX on /Volumes/MobileBackups (mtmfs, nosuid, read-only, nobrowse)
/dev/disk3 on /Volumes/gjp22 (zfs, local, journaled, noatime)
/dev/disk3s1 on /opt (zfs, local, journaled, noatime)
/dev/disk6 on /Volumes/zhandy (zfs, local, journaled, noatime)
/dev/disk8s1 on /Volumes/experiment (hfs, local, nodev, nosuid, journaled, noowners)
/dev/disk10 on /Volumes/tall (zfs, local, journaled, noatime)
/dev/disk11s2 on /Volumes/LaCie Little Big Disk (hfs, local, nodev, nosuid, journaled, noowners)
/dev/disk12 on /Volumes/twoz (zfs, local, journaled, noatime)
Wuala on /Volumes/WualaDrive (osxfusefs, local, nodev, nosuid, synchronous, mounted by gjp22)
/dev/disk14s2 on /Volumes/Time Machine Backups (hfs, local, nodev, nosuid, journaled)

在该示例中,四个卷包括nodev

  1. 实验– 在 USB 闪存盘上
  2. LaCie Little Big Disk– 在 FireWire 400 的硬盘驱动器上,此卷包含一个 Time MachineBackups.backupdb
  3. 乌拉– 文件系统集成使用 OS X 的 FUSE
  4. 时间机器备份

粗略地说,我可以理解 2、3 和 4 是特殊的。但是:

  • 我不明白这nodev与 USB 闪存驱动器有何关系。

其他参考

自动挂载 USB 磁盘(工作原理)– Unix 和 Linux

背景

希望了解为什么 Lion 和 Mountain Lion 中的 Time Machine 无法从 USB 闪存驱动器备份。但这个问题更一般地是关于选项的nodev

答案1

nodev选项告诉系统不允许创建和访问设备节点– 您所拥有的特殊文件类型/dev

例如,/dev/disk0让你直接访问存储在第一个磁盘上的所有数据,而无需经过更高级别(如文件系统或权限检查代码)——仅有的检查的权限是您是否被允许打开该特定的设备节点进行读取或写入。

这意味着如果/dev/disk0让其变得世界可读,任何用户可以轻松读取同一磁盘上任何其他用户的文件(如果它们未加密),只需读取即可/dev/sda

根据操作系统的不同,/dev通常会有许多其他类型的设备节点,包括/dev/mem允许访问系统整个(物理和/或虚拟)内存的设备节点——尽管运行编译的内核的系统除外CONFIG_STRICT_DEVMEM(除非)。

因此,只有通常被允许创建设备节点(对于其他用户,mknod将返回“操作不允许”),并且所有现有设备节点都保存在单个位置(/dev),并具有严格的文件权限,不授予普通用户读取或写入访问权限。(有一些例外。) 然而,在现代,任何人都可以轻松绕过仅限 root 的限制,只需转到另一台他们已经具有 root 访问权限的计算机,使用它在 USB 驱动器上创建一些设备节点,设置非常开放的权限,然后将该驱动器连接到你的电脑。

这就是该nodev选项可以防止的情况——即使有人在自己的驱动器上创建了一个全球可读/全球可写的设备节点,由于nodev安装时使用了该选项,操作系统也会拒绝对其执行任何操作。


同样的原因也适用于该nosuid选项,它告诉操作系统忽略设置用户标识/usr/bin/sudo位,这通常会导致程序以与用户不同的权限执行。例如,设置用户标识位并且归 root 所有,因此它将始终具有与 root 相同的权限。

相关内容