mount 命令中的“仅限内部”意味着什么?为什么不调用 /sbin/mount 文件系统?

Ale*_*xel -1 bash mount chrome-os

下面的命令,它用于在用户的主目录中生成可执行文件

mount -i -o remount,exec /home/chronos/user
Run Code Online (Sandbox Code Playgroud)
  • 我知道该-o参数是针对选项的,在本例中重新安装并在用户主目录中生成可执行文件

来自安装手册:

-i, --internal-only
不调用 /sbin/mount.filesystem 帮助程序,即使它存在。

为什么不调用 sbin/mount 文件系统?

请举例。

Voj*_*fny 5

一些文件系统(通常是用FUSE实现的)有特殊的挂载程序/sbin,例如 NTFS FUSE 驱动程序 ntfs-3g 有它自己的mount.ntfs-3g。如果不使用-i该选项,则在挂载文件系统时将通过命令调用此程序,mount而不是调用挂载系统调用。

所以对于 NTFS 你可以这样做

$ sudo mount /dev/vdb2 /mnt/test -i
Run Code Online (Sandbox Code Playgroud)

强制内核 NTFS 驱动程序

$ mount | grep vdb2
/dev/vdb2 on /mnt/test type ntfs (ro,relatime,uid=0,gid=0,fmask=0177,dmask=077,nls=utf8,errors=continue,mft_zone_multiplier=1
Run Code Online (Sandbox Code Playgroud)

看到这里的类型是ntfs,文件系统被挂载为只读(ro),因为内核驱动程序不支持读写。

与默认情况相比,没有-i哪个将使用mount.ntfs-3g哪个使用FUSE驱动程序

$ sudo mount /dev/vdb2 /mnt/test
$ mount | grep vdb2
/dev/vdb2 on /mnt/test type fuseblk (rw,relatime,user_id=0,group_id=0,allow_other,blksize=4096)
Run Code Online (Sandbox Code Playgroud)

现在类型是fuseblk(因为 NTFS-3G 是 FUSE 驱动程序)并且文件系统以读写方式挂载。

您还可以使用LIBMOUNT_DEBUG=all环境变量来获取mount.

如果没有-i它调用/sbin/mount.ntfs助手:

2124: libmount:      CXT: [0x5584880d2a50]: mount: do mount
2124: libmount:      CXT: [0x5584880d2a50]: mount: executing helper /sbin/mount.ntfs
2124: libmount:      CXT: [0x5584880d2a50]: mount: generate helper mount options
2125: libmount:      CXT: [0x5584880d2a50]: argv[0] = "/sbin/mount.ntfs"
2125: libmount:      CXT: [0x5584880d2a50]: argv[1] = "/dev/vdb2"
2125: libmount:      CXT: [0x5584880d2a50]: argv[2] = "/mnt/test"
2125: libmount:      CXT: [0x5584880d2a50]: argv[3] = "-o"
2125: libmount:      CXT: [0x5584880d2a50]: argv[4] = "rw"
2124: libmount:      CXT: [0x5584880d2a50]: /sbin/mount.ntfs executed [status=0, rc=0]
Run Code Online (Sandbox Code Playgroud)

它只-i调用 mount 系统调用:

2119: libmount:      CXT: [0x559aa1a8ba50]: mount: do mount
2119: libmount:      CXT: [0x559aa1a8ba50]: mount(2) [source=/dev/vdb2, target=/mnt/test, type=ntfs,  mountflags=0x00000000, mountdata=<none>]
Run Code Online (Sandbox Code Playgroud)