文章目录

    • 后背发凉
    • 软链接搞的鬼
    • 破案

后背发凉

使用 mount 命令查看设备挂载情况

/# mount/dev/root on / type ext4 (rw,noatime)proc on /proc type proc (rw,nosuid,nodev,noexec,noatime)sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,noatime)cgroup2 on /sys/fs/cgroup type cgroup2 (rw,nosuid,nodev,noexec,relatime,nsdelegate)tmpfs on /tmp type tmpfs (rw,nosuid,nodev,noatime)tmpfs on /dev type tmpfs (rw,nosuid,noexec,noatime,size=512k,mode=755)devpts on /dev/pts type devpts (rw,nosuid,noexec,noatime,mode=600,ptmxmode=000)debugfs on /sys/kernel/debug type debugfs (rw,noatime)bpffs on /sys/fs/bpf type bpf (rw,nosuid,nodev,noexec,noatime,mode=700)

输出信息含义为:某某设备 挂载在 某某目录

虽然不像下面这行这么容易理解(磁盘设备 sda1 挂载在根目录)

/dev/sda1 on / type ext4 (rw,relatime,errors=remount-ro,data=ordered)

但,上面几行信息也可以勉强理解
proc 是内核创造的虚拟设备,挂载在 /proc 目录
sysfs 是内核创造的虚拟设备,挂载在 /sys 目录
tmpfs 是内核创造的虚拟设备,挂载在 /tmp 目录
tmpfs 是内核创造的虚拟设备,挂载在 /dev 目录
debugfs 是内核创造的虚拟设备,挂载在 /sys/kernel/debug 目录

然而,/dev/root 是个什么设备?
心急的小伙伴可能要跳出来了,/dev/root 不比 proc 好理解的多啊,它不就和 /dev/sda1 一样是个真实设备嘛?
真的那么简单吗?
我们查看一下

# ls /dev/rootls: /dev/root: No such file or directory

傻眼了吧,根本没有这个设备。
不禁后背发凉,心想,没有这个设备,那怎么挂载上的??
别急,待我给你慢慢道来

软链接搞的鬼

我们为磁盘设备 /dev/mmcblk0p2 创建一个软链接 pp2

# ln -s /dev/mmcblk0p2 pp2

然后将 pp2 挂载到 /mnt

# mount pp2 /mnt

查看挂载

# mount/dev/root on / type ext4 (rw,noatime)proc on /proc type proc (rw,nosuid,nodev,noexec,noatime)sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,noatime)cgroup2 on /sys/fs/cgroup type cgroup2 (rw,nosuid,nodev,noexec,relatime,nsdelegate)tmpfs on /tmp type tmpfs (rw,nosuid,nodev,noatime)tmpfs on /dev type tmpfs (rw,nosuid,noexec,noatime,size=512k,mode=755)devpts on /dev/pts type devpts (rw,nosuid,noexec,noatime,mode=600,ptmxmode=000)debugfs on /sys/kernel/debug type debugfs (rw,noatime)bpffs on /sys/fs/bpf type bpf (rw,nosuid,nodev,noexec,noatime,mode=700)pp2 on /mnt type ext4 (rw,relatime)

查看目录内容

# ls /mnt/bin lib overlay rom sys vardev lost+foundpp2 roottmp wwwetc mnt procsbinusr

其实 mmcblk0p2 就是存放 rootfs 的

删除 pp2,再次查看挂载情况

# rm pp2 # mount/dev/root on / type ext4 (rw,noatime)proc on /proc type proc (rw,nosuid,nodev,noexec,noatime)sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,noatime)cgroup2 on /sys/fs/cgroup type cgroup2 (rw,nosuid,nodev,noexec,relatime,nsdelegate)tmpfs on /tmp type tmpfs (rw,nosuid,nodev,noatime)tmpfs on /dev type tmpfs (rw,nosuid,noexec,noatime,size=512k,mode=755)devpts on /dev/pts type devpts (rw,nosuid,noexec,noatime,mode=600,ptmxmode=000)debugfs on /sys/kernel/debug type debugfs (rw,noatime)bpffs on /sys/fs/bpf type bpf (rw,nosuid,nodev,noexec,noatime,mode=700)pp2 on /mnt type ext4 (rw,relatime)

神奇地发现,pp2 on /mnt type ext4 (rw,relatime) 这行还在,
查看目录内容

# ls /mnt/bin lib overlay roottmp wwwdev lost+foundprocsbinusretc mnt rom sys var

而且目录内容仍然正常

如法炮制,再挂载个 pp3,也正常

# mkdir mnt3# mount pp3 /mnt3# rm pp3# mount/dev/root on / type ext4 (rw,noatime)proc on /proc type proc (rw,nosuid,nodev,noexec,noatime)sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,noatime)cgroup2 on /sys/fs/cgroup type cgroup2 (rw,nosuid,nodev,noexec,relatime,nsdelegate)tmpfs on /tmp type tmpfs (rw,nosuid,nodev,noatime)tmpfs on /dev type tmpfs (rw,nosuid,noexec,noatime,size=512k,mode=755)devpts on /dev/pts type devpts (rw,nosuid,noexec,noatime,mode=600,ptmxmode=000)debugfs on /sys/kernel/debug type debugfs (rw,noatime)bpffs on /sys/fs/bpf type bpf (rw,nosuid,nodev,noexec,noatime,mode=700)pp2 on /mnt type ext4 (rw,relatime)pp3 on /mnt3 type ext4 (rw,relatime)# ls /mnt3bin lib mnt3rom sys vardev lost+foundoverlay roottmp wwwetc mnt procsbinusr

破案

并且,/、/mnt/、/mnt3/ 目录下都有同一个文件 aaa,说明它们三个目录挂载的是同一个设备,所以根目录 / 挂载的也是 /dev/mmcblk0p2 设备(像数学推理证明有木有)

root@OpenWrt:/# ls / | grep aaaaaaroot@OpenWrt:/# ls /mnt | grep aaaaaaroot@OpenWrt:/# ls /mnt3 | grep aaaaaa

最后,得出一个结论:
/dev/root 曾经是 /dev/mmcblk0p2 的软链接,在使用这个软链接将该设备挂载到根目录后,又将该软链接删除了。