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

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


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

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

二、先分清几个核心概念

1. 路径 / 目录

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

2. 文件系统实例

  • 一个"文件系统实例"是指一个具体被挂载上的东西,例如:
    • 磁盘分区上的 ext4:/dev/sda1 上的 ext4 挂到 /;
    • 内存文件系统:tmpfs、devtmpfs;
    • 虚拟文件系统: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,是重启后会重新生成的。
  • 根 / 下面的每个目录都属于某个文件系统,但不一定都属于"磁盘上的那个根文件系统本体";很多只是挂载点,真正内容来自其他(内存/虚拟/独立磁盘分区)文件系统。
相关推荐
wjkjpcba19 小时前
PCBA烧录程序是什么:PCBA包工包料厂家解析烧录与测试
linux·数据库·人工智能·smt贴片加工·pcba贴片加工厂
꯭自꯭闭꯭19 小时前
达梦事物特性及MVCC
linux·运维·数据库
羔羊++21 小时前
18_实验十七_其他命令与自定义启动变量
linux
DYWorker0011 天前
Linux驱动:RK3568 GMAC + YT8531C 千兆以太网全流程解剖
linux
lisanmengmeng1 天前
NRPE 添加命令(一)
linux·运维·服务器
树下水月1 天前
Typora破解
linux·服务器·前端
沫璃染墨1 天前
《从零入门Linux系统篇(五十七):线程篇·十——生产者消费者模型进阶:从环形缓冲区到POSIX信号量》
linux·运维·服务器·开发语言·c++·系统架构·信号处理
wuminyu1 天前
LockStack在虚拟线程Mount和Unmount拷贝过程剖析
java·linux·c语言·jvm·c++
深念Y1 天前
rime-雾凇拼音-配置记录
linux·junit·软件·拼音·kde
殷色玫瑰1 天前
C++ string类详解:常用接口、字符串操作与模拟实现
java·linux·c语言·开发语言·数据结构·c++