从 / 和 /dev 说起:Linux 文件系统与挂载点一文理清

先给一句总的结论,再把你上面那一大段内容按"概念 → /dev → 根目录各路径"整理成一份便于记忆的笔记。


一、总的结论(先记住这三条)

  1. 任何能访问到的路径,一定属于某个"已挂载的文件系统实例",只不过这个文件系统可以是磁盘上的,也可以是内存/虚拟的。
  2. /dev 这个挂载点本身通常存在于根文件系统中,但运行时你看到的 /dev 内容一般来自挂载在其上的内存文件系统(devtmpfs 等),重启会重建。
  3. / 下面的各个目录:有的是根文件系统里的真实目录,有的只是挂载点,内容来自其他文件系统(磁盘分区、内存文件系统、虚拟文件系统等)。

二、先分清几个核心概念

1. 路径 / 目录

  • /dev/proc/home 这些,是 路径 / 目录项(dentry),用于组织文件层次结构。
  • "某个路径能被访问" ⇒ 说明它必然位于某个 已挂载的文件系统 中。

2. 文件系统实例

  • 一个"文件系统实例"是指一个具体被挂载上的东西,例如:
    • 磁盘分区上的 ext4:/dev/sda1 上的 ext4 挂到 /
    • 内存文件系统:tmpfsdevtmpfs
    • 虚拟文件系统:procfs/proc)、sysfs/sys)等。
  • 每挂一次,就是一个实例;每个实例有自己的根目录、自己的 inode/dentry 树。

3. 挂载点

  • 挂载点是"父文件系统中的一个目录",用来接入一个新的文件系统实例。
  • 挂载前:
    • 这个目录是父文件系统里的普通目录;
  • 挂载后:
    • ls 看到的内容来自新文件系统;
    • 原来目录的内容被"遮住",除非卸载。

三、关于 /dev 目录的结论整理

1. /dev 本身在不在"实际文件系统"(磁盘)中?

  • 在大多数发行版中:
    • 根文件系统(通常在磁盘上)里 确实有一个 /dev 目录,作为挂载点。
  • 系统启动后:
    • 会在 /dev 上挂载一个 内存文件系统 ,常见的是:
      • devtmpfs(内核自动创建基础设备节点);
      • 一些系统还会在其上再叠加 tmpfs
    • 挂载完成后:
      • 磁盘上原来的 /dev 目录被新挂上来的文件系统覆盖,平时看不到。

所以:

  • 从"目录是否存在"的角度:
    /dev 这个挂载点通常存在于根文件系统(往往在磁盘)中。
  • 从"你运行时看到的内容"的角度:
    你看到的 /dev 内容来自内存里的文件系统,不是磁盘上的那份。

2. /dev 下的设备文件是不是"仅存在于内存中"?

需要区分三层:

(1)设备文件(device node)本身是什么?

  • 是一种 特殊文件类型 (字符设备 / 块设备),在 inode 里存着:
    • 主设备号(major)
    • 次设备号(minor)
  • 意义:这个文件是"访问某个内核设备/驱动"的入口

(2)设备文件可以存在在哪里?

  • 设备文件可以创建在 任何支持设备节点的文件系统 上:

    • 可以是磁盘文件系统(如 ext4);
    • 也可以是内存文件系统(tmpfs / devtmpfs);
  • 例如,你完全可以在一个挂到 /mnt 的 ext4 分区上:

    bash 复制代码
    sudo mknod /mnt/mydev c 1 3

    这就是一个"存在于磁盘上的设备文件"。

  • 但在 现代 Linux 的默认设计里

    • /dev 通常挂的是 devtmpfs(内存文件系统);
    • /dev/null/dev/sda 等设备节点的 inode 和目录树,都存在于这块内存文件系统中;
    • 重启后这些节点会消失,再由内核和 udev 在启动阶段重新生成。

(3)底层真实设备在哪?

  • 真正的硬件设备 + 内核驱动当然不在文件系统里;
  • /dev/sda 这种设备文件只是一个"名字 + 入口":
    • 对它读写 ⇒ 内核根据主/次设备号找到对应驱动 ⇒ 操作硬件。

归纳成一句话:

  • 在典型现代 Linux 系统上:
    运行时 /dev 里的设备文件确实"只存在于内存中的 devtmpfs",不直接写入磁盘;重启后依赖内核/udev 重新创建设备节点。
  • 但从机制上讲: 设备文件并不"只能在内存里",也可以建在磁盘的 ext4 等文件系统里,只是现在默认不这么做。

四、关于"根 / 下面各目录是否都在文件系统中"的结论

你的问题可以拆成两层:

  1. 抽象层:根下所有路径是不是都属于某个文件系统?
  2. 具体层:是不是都属于"磁盘上的根文件系统"?

1. 抽象层:任何路径都属于某个文件系统实例

  • 从内核视角:
    • 任何可访问路径,必然位于某个已挂载的文件系统实例
  • 这些文件系统实例可能是:
    • 磁盘文件系统(如 ext4、xfs);
    • 内存文件系统(如 tmpfs、devtmpfs);
    • 虚拟文件系统(如 procfs、sysfs、cgroupfs、debugfs 等)。

所以抽象回答:

  • "根下面的各个目录(路径)都存在于某个文件系统中吗?" → 是的。

2. 具体层:是不是都在"磁盘根文件系统"里?------ 不一定

根文件系统(root filesystem)

  • 启动时,第一个挂到 / 上的文件系统;
  • 通常位于某个磁盘分区或只读镜像上;
  • 包含最基本的目录,如:
    • /bin/sbin
    • /etc
    • /lib/usr

挂载点覆盖的情况:

  • 某些目录在启动后会被其他文件系统"覆盖",常见如:
    • /dev → 挂载 devtmpfs(内存)
    • /proc → 挂载 procfs(虚拟)
    • /sys → 挂载 sysfs(虚拟)
    • /run → 通常挂载 tmpfs(内存)
    • /home → 经常单独挂载一个磁盘分区(比如 /dev/sda3
  • 挂载之后:
    • 这个目录依然作为"挂载点"存在于原来的根文件系统中
    • 但你看到的内容来自新挂载的文件系统。

因此:

  • 如果你问的是:
    "根 / 下面每个路径是不是都存在于磁盘里的那个根文件系统?"
    • 答案是:不一定
    • 一部分是(如 /bin/etc/usr 经常就是根 FS 的一部分);
    • 一部分只是"目录 + 挂载点",实际内容来自其他文件系统(磁盘分区 / 内存 / 虚拟 FS)。

五、你可以在自己的系统上如何验证

可以用几个命令自己确认:

  1. 查看根 / 挂的是什么:
bash 复制代码
mount | grep ' on / '
  1. /dev/proc/sys
bash 复制代码
mount | egrep ' on /(dev|proc|sys|run) '

一般会看到类似:

text 复制代码
devtmpfs on /dev type devtmpfs ...
proc on /proc type proc ...
sysfs on /sys type sysfs ...
tmpfs on /run type tmpfs ...
  1. 看某个设备文件的类型:
bash 复制代码
ls -l /dev/null

你会看到类似:

text 复制代码
crw-rw-rw- 1 root root 1, 3 ... /dev/null
  • 最前面的 c 表示字符设备;
  • 1, 3 是主/次设备号。

六、最后用两句话帮你记忆

  • /dev 本身作为目录(挂载点)一般在根文件系统里;但你运行时看到的 /dev/* 绝大部分来自内存里的 devtmpfs,是重启后会重新生成的。
  • / 下面的每个目录都属于某个文件系统,但不一定都属于"磁盘上的那个根文件系统本体";很多只是挂载点,真正内容来自其他(内存/虚拟/独立磁盘分区)文件系统。
相关推荐
哇哈哈202117 小时前
信号量和信号
linux·c++
不是二师兄的八戒17 小时前
Linux服务器挂载OSS存储的完整实践指南
linux·运维·服务器
一个人旅程~18 小时前
如何用命令行把win10/win11设置为长期暂停更新?
linux·windows·经验分享·电脑
2302_7995257419 小时前
PCI、PCIe 和 NVLink
linux
~远在太平洋~19 小时前
Linux 基础命令
linux·服务器·数据库
Gofarlic_oms119 小时前
避免Kisssoft高级分析模块过度采购的科学评估方法
大数据·linux·运维·人工智能·matlab
~远在太平洋~20 小时前
Debian系统如何删除多余的kernel
linux·网络·debian
linux kernel20 小时前
第十一部分(下):进程通信
linux·服务器
2401_8639054420 小时前
haproxy
linux