如何从/proc/self/mountinfo文件确定挂载的真实来源?
我来给你把这个问题讲明白,其实/proc/self/mountinfo的每一行都有固定的字段逻辑,咱们先拆解清楚字段含义,再对照你给的例子分析就懂啦!
首先,先搞懂mountinfo每行的结构:每一行用空格分隔字段,其中有个特殊的-作为分隔符,把内核内部的挂载信息和文件系统相关的信息分开。具体字段(从左到右):
- 第一个是挂载ID,用来唯一标识这个挂载
- 第二个是父挂载ID,指向它的上级挂载
- 第三个是设备ID(格式是主设备号:次设备号)
- 第四个是文件系统内的根路径:也就是这个挂载在它所属的文件系统里的起始路径
- 第五个是主机上的挂载点:就是咱们在系统里看到的挂载路径
- 第六个是挂载选项(比如rw、nosuid这些)
- 第七个是共享挂载的相关信息
- 然后是分隔符
- - 第九个是文件系统类型(比如devtmpfs、ext4)
- 第十个是挂载源:可以是设备路径、虚拟文件系统名,或者其他挂载对象
- 第十一个及以后是超级块选项
现在回到你给的例子:
先看第一行:
19 60 0:5 / /dev rw,nosuid shared:2 - devtmpfs devtmpfs rw,seclabel,size=1930460k,nr_inodes=482615,mode=755
这里第四个字段是/,说明是把整个devtmpfs文件系统挂载到/dev,所以挂载源就是devtmpfs本身(第十个字段),这和你理解的一致。
再看第二行:
119 74 0:5 /sda1 /home/abc/def rw,nosuid shared:2 - devtmpfs devtmpfs rw,seclabel,size=1930460k,nr_inodes=482615,mode=755
重点看第四个字段/sda1——这是在devtmpfs文件系统内部的路径,而devtmpfs的挂载点是/dev,所以这个路径对应到主机上就是/dev/sda1。这一行的意思是:把devtmpfs里的/sda1(也就是实际的磁盘分区/dev/sda1)挂载到/home/abc/def。
所以结论是:/home/abc/def的真实挂载源是/dev/sda1,而不是/dev。
最后给你总结个判断小技巧:
- 如果第四个字段是
/,说明是挂载整个文件系统,这时直接看分隔符后的挂载源(第十个字段)就行; - 如果第四个字段不是
/,那真实挂载源就是「这个挂载所属的父文件系统的挂载点」加上「第四个字段」,也就是把文件系统内部的路径映射到主机的实际路径。
备注:内容来源于stack exchange,提问作者codego123

