如果我做
# cd /
# ln -s /home test
# cd test
# mount --bind $PWD /mnt
中的条目/proc/mounts
是
/dev/sda2 /mnt ext4 rw,noatime,data=ordered 0 0
这是安装到的设备/home
,并且不容易从中推断出$PWD
是/test
。/proc/mounts
鉴于绑定挂载可能指向可能被符号链接、其他绑定挂载等“遮挡”的目录/文件,我如何确定一般将显示哪个设备(即 /dev/sda2) ?
答案1
如果我理解你的问题,你想知道哪个设备用于给定的安装。为此,您可以使用以下df
命令:
$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/fedora_greeneggs-root 50G 21G 27G 44% /
devtmpfs 3.8G 0 3.8G 0% /dev
tmpfs 3.8G 14M 3.8G 1% /dev/shm
tmpfs 3.8G 984K 3.8G 1% /run
tmpfs 3.8G 0 3.8G 0% /sys/fs/cgroup
tmpfs 3.8G 3.4M 3.8G 1% /tmp
/dev/sda1 477M 99M 349M 23% /boot
/dev/mapper/fedora_greeneggs-home 402G 184G 198G 49% /home
要查找在哪个设备上找到特定文件/目录,请将文件作为参数提供给df
.使用你的例子:
$ df -h /mnt
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 477M 99M 349M 23% /
您还可以使用mount
命令:
$ mount | grep '^/dev'
/dev/mapper/fedora_greeneggs-root on / type ext4 (rw,relatime,seclabel,data=ordered)
/dev/sda1 on /boot type ext4 (rw,relatime,seclabel,data=ordered)
/dev/mapper/fedora_greeneggs-home on /home type ext4 (rw,relatime,seclabel,data=ordered)
为每个设备安装的目录是上面输出中的第三个参数。所以对于设备来说/dev/sda1
就是/boot
.其他设备正在使用 LVM(逻辑卷管理),需要进一步查询以了解 LVM 正在使用哪个实际设备。
答案2
在 Linux 上,我们findmnt
专门util-linux
为此设计了
findmnt -n -o SOURCE --target /path/to/FILE
其他解决方案的优点是,如果路径被符号链接或重复的绑定安装遮盖,它仍然有效。
答案3
我所知道的最准确的方法是使用 lstat() 系统调用的输出。具体来说,是 st_dev 字段。有一个命令行实用程序 stat(1) 可用于查看此信息。例如,我的笔记本电脑上“stat /etc/issue”的输出:
File: ‘/etc/issue’
Size: 65 Blocks: 8 IO Block: 4096 regular file
Device: 801h/2049d Inode: 1610916043 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
请注意第三行,第一个字段,“Device”。这里列出了 801h。该值可以分为两个字节:8 和 1。第一个字节称为主编号,第二个字节称为次编号。因此,下一步是弄清楚主要 8、次要 1 是什么设备。
我发现咨询 /proc/partitions 是最快的。就我而言,/proc/partitions 的内容如下:
major minor #blocks name
8 16 234431064 sdb
8 17 33554432 sdb1
8 18 200875608 sdb2
8 0 500107608 sda
8 1 500106584 sda1
从该输出中可以清楚地看出,主要 8、次要 1 是 sda1。我们可以使用 ls -l /dev/sda1 来确认这一点
brw-rw---- 1 root disk 8, 1 May 8 05:33 /dev/sda1
请注意日期戳之前的 8、1。
重要的是要理解/记住,像 /dev/sda1 这样的设备文件的名称只是一个标签。主设备号和次设备号是设备文件中最重要的值。如果您感到好奇,请查看用于创建设备文件的 mknod(1) 实用程序。我可以使用以下语法创建一个名为 aardvark 的新 /dev 条目,其主要版本为 8,次要版本为 18:
mknod /dev/aardvark b 8 18
然后,我可以轻松安装它:
mount /dev/aardvark /mnt
并且,如果我们查看 mount 命令的输出或 /proc/mounts 的内容,我们会看到:
/dev/aardvark on /mnt type xfs (rw,relatime,attr2,inode64,noquota)
df -h 显示:
/dev/aardvark 192G 154G 38G 81% /mnt
...无论如何,所有这一切的目的是为了说明识别块设备的重要细节是主设备号和次设备号 - 而不是设备文件标签 - 并且使用 lstat() 系统调用是识别块设备的最佳方法查询这些值。
作为最后一条评论,我只是重读了您的问题以确保我正在回答它,并且我意识到您在询问绑定安装的 /proc/mounts 中会显示什么源设备标签。这将与绑定挂载的文件系统挂载点源的原始 mount(2) 调用中使用的源设备标签相同。也许一个例子会有所帮助:
我有 /dev/sdb2 和 /dev/aardvark (与上面相同)。它们都是主要版本 8,次要版本 18。注意,我将挂载相同的文件系统两次。我执行以下操作:
mkdir /mnt1 /mnt2 /foo
mount /dev/aardvark /mnt1
mount /dev/sdb2 /mnt2
请注意,我在 /mnt1 中创建了目录 somedir。但由于 /mnt1 和 /mnt2 安装了相同的文件系统,因此也可以通过 /mnt2 访问 somedir。
mkdir /mnt1/somedir
mkdir /foo/left /foo/right
mount -o bind /mnt1/somedir /foo/left
mount -o bind /mnt2/somedir /foo/right
现在,如果我们检查 /proc/mounts,我们会看到:
/dev/aardvark /mnt1 xfs rw,relatime,attr2,inode64,noquota 0 0
/dev/sdb2 /mnt2 xfs rw,relatime,attr2,inode64,noquota 0 0
/dev/aardvark /foo/left xfs rw,relatime,attr2,inode64,noquota 0 0
/dev/sdb2 /foo/right xfs rw,relatime,attr2,inode64,noquota 0 0
/foo/... 绑定挂载上的源设备标签与文件系统 mount(2) 调用中最初提供的值相同。请记住,我的示例中的 /dev/aardvark 和 /dev/sdb2 是同一设备。
我意识到我刚刚打了一本小说,前半部分根本没有真正回答你的问题,但删除它似乎太浪费了。也许它会帮助别人。
祝你好运。
PS 请记住,某些文件系统是基于网络的(如 NFS 或 CIFS),或者是虚拟的(如 procfs 或 sysfs),并且没有源块设备。我不知道统计输出中的设备会返回什么,只是因为它的价值。
答案4
du
可以使用开关调用该命令-x
来忽略其他已安装文件系统的内容。
该-k
开关以 KB 为单位显示目录大小。
显示大小 >~ 1MB 的目录。
du -xk / | awk ' $1 > 1000000 { print } '