为什么 Linux 要用“挂载”?而不是直接显示 C 盘、D 盘?
为什么 Linux 要用挂载?而不是像 Windows 一样直接显示 C 盘、D 盘?刚开始学 Linux 的时候,很多人都会遇到一个很奇怪的问题:我插了一个 U 盘,为什么系统里不会像 Windows 一样直接多出来一个 E 盘、F 盘?`mount /dev/sdb1 /mnt/data`这个“挂载”到底是什么意思?为什么 Linux 非要这样设计?是不是故意把事情搞复杂?挂载,是理解 Linux 文件系统非常重要的一道门槛。只要你搞懂了挂载,就会发现 Linux 的磁盘、分区、目录、U 盘、光盘、网络存储,其实都是一套统一的逻辑。很多人最早接触电脑,都是从 Windows 开始的。C 盘一般是系统盘,D 盘可能放软件,E 盘可能放资料,插入 U 盘以后,系统可能又多出一个 F 盘。所以很多人第一次接触 Linux 时,会下意识地问:但 Linux 从一开始就不是按照“盘符”来组织文件的。注意,这里的根目录不是 root 用户的 `/root`,而是整个 Linux 文件系统的起点。在 Linux 里,没有 C 盘、D 盘这种概念。它只有一棵从 `/` 开始的目录树。/etc
/home
/var
/usr
/tmp
/mnt
/opt
这就是 Linux 和 Windows 在文件系统组织方式上最大的区别之一:把一个存储设备,接到 Linux 目录树上的某个位置。比如你有一块新硬盘,它在 Linux 里的设备文件可能是:但这个设备文件本身并不代表你能直接像普通目录一样进去存文件。`mount /dev/sdb1 /mnt/data`把 `/dev/sdb1` 这个分区,挂到 `/mnt/data` 这个目录下面。看到的就不再是原来这个空目录,而是 `/dev/sdb1` 这个分区里的文件内容。也就是说,`/mnt/data` 这个目录变成了访问这块硬盘的入口。这就像在一座城市里,原本有一条主干道 `/`,你现在修了一条通往新仓库的路,入口就设在 `/mnt/data`。以后所有人都从这个入口进去访问新仓库。所以挂载不是“复制文件”,也不是“移动文件”,它只是建立一个访问入口。硬盘是文件,分区是文件,U 盘是文件,终端是文件,进程信息也可以通过文件形式暴露出来。/dev/sda
/dev/sda1
/dev/sdb
/dev/sdb1
这些就是 Linux 里常见的磁盘和分区设备文件。- `/dev/sda1` 通常表示第一块硬盘的第一个分区。
- `/dev/sdb1` 通常表示第二块硬盘的第一个分区。
但是,设备文件只是系统识别到了这个设备,并不等于它已经被放进文件系统目录树里了。Linux 已经知道仓库存在了,但是还没有给这个仓库修入口。Linux 不使用盘符,而是选择把所有设备都接入统一的目录树,这样做的好处是整个系统结构会非常统一。不管是本地硬盘、U 盘、光盘、网络磁盘,还是远程 NFS 存储,都可以被挂载到某个目录下。/data
/backup
/www
/mnt/usb
/var/lib/mysql
程序不需要关心这个目录背后到底是一块本地硬盘,还是一台远程服务器上的网络存储。因为 `/dev/sdb1` 不是一个普通目录,而是一个设备文件。mkdir /mnt/usb
mount /dev/sdb1 /mnt/usb
注意命令是 `umount`,不是 `unmount`。很多新手刚开始会觉得麻烦:为什么还要卸载?直接拔不行吗?因为系统写入文件时,不一定是你复制完成的那一刻就立刻完全写入 U 盘。Linux 可能会先把部分数据放在缓存里,再慢慢写入设备。我要拔掉这个设备了,请把该写入的数据都写完,并断开这个目录和设备之间的关系。所以,挂载和卸载,其实是一套完整的设备接入和安全移除机制。`mount /dev/sdc1 /backup`但是一旦有设备挂载到这个目录上,这个目录就变成了访问设备内容的入口。如果一个目录原来里面有文件,然后你把一块硬盘挂载到这个目录上,原来的文件会不会被删除?挂载完成后,你再看 `/data`,看到的是 `/dev/sdb1` 里的内容,而不是原来的 `a.txt` 和 `b.txt`。原来的文件没有被删,只是被挂载进来的文件系统“遮住了”。这也是为什么生产环境里挂载磁盘一定要小心,尤其不要随便把新磁盘挂载到已经有重要数据的目录上。很多云服务器新加一块数据盘后,常见操作是把它挂载到:/data
/www
/var/lib/mysql
/backup
如果系统盘出现问题,只要数据盘还在,就可以重新挂载到新的系统上。当业务数据越来越大时,可以单独扩容数据盘,而不是动整个系统盘。比如你要把 MySQL 数据迁移到更大的磁盘上,就可以把新磁盘挂载到数据库数据目录,或者先同步数据再切换挂载点。不同类型的数据放在不同挂载点下面,运维管理起来更清楚。它们很多时候并不只是普通目录,而是背后挂着独立磁盘、独立分区,甚至远程存储。在 Linux 里,可以用几个常见命令查看挂载情况。它可以看到每个文件系统的容量、已用空间、剩余空间,以及挂载点。/dev/sda1 40G 15G 25G 38% /
/dev/sdb1 200G 80G 120G 40% /data
- `/dev/sda1` 挂载到了 `/`,也就是系统根目录。
- `/dev/sdb1` 挂载到了 `/data`,也就是数据目录。
很多监控工具和系统命令,本质上也是从这些地方读取信息。它只在当前系统运行期间生效,重启后系统不会自动记住你之前手动挂载过什么。这个文件可以理解成 Linux 的“开机自动挂载清单”。系统启动时,会读取 `/etc/fstab`,然后按照里面的配置,把指定设备挂载到指定目录。`UUID=xxxx-xxxx /data ext4 defaults 0 0`这表示把某个 UUID 对应的分区,开机自动挂载到 `/data`,文件系统类型是 `ext4`。为什么更推荐用 UUID,而不是直接写 `/dev/sdb1`?今天你的数据盘可能是 `/dev/sdb1`,但如果以后机器上新增、删除、调整了磁盘顺序,它可能变成 `/dev/sdc1`。所以生产环境里,写 `/etc/fstab` 时通常建议用 UUID。- 分区是在硬盘上划出来的区域,比如 `/dev/sdb1`。
- 文件系统是分区里的组织规则,比如 `ext4`、`xfs`、`ntfs`。
- 第三步,格式化成文件系统:`mkfs.ext4 /dev/sdb1`
- 第五步,挂载:`mount /dev/sdb1 /data`
- 第六步,如果要开机自动挂载,写入 `/etc/fstab`。
这就是一块新磁盘从“硬件设备”变成“可访问目录”的完整过程。很多人之所以觉得挂载难,是因为把这些概念混在了一起。硬盘负责提供空间,文件系统负责组织数据,挂载负责提供入口。在 Linux 里,不管数据来自哪里,都可以放到同一棵目录树下面。比如 `/proc` 并不是真实存在于磁盘上的目录,而是内核暴露系统运行信息的虚拟文件系统。你看到的 CPU 信息、内存信息、进程信息,很多都来自 `/proc`。它是 Linux 把各种资源接入统一目录树的一种机制。不管底层资源是什么,最终都可以通过路径来访问。对用户来说,是目录。对程序来说,是路径。对系统来说,是统一管理。挂载只是建立访问入口,不会把设备里的文件复制到挂载点。`/mnt` 只是传统上用来临时挂载的目录。你也可以挂载到 `/data`、`/backup`、`/www`,只要符合你的管理习惯。系统识别到 `/dev/sdb1`,只表示设备存在。你还需要文件系统和挂载点,才能正常访问。`umount` 只是断开设备和目录之间的关系,不会删除设备里的数据。`/etc/fstab` 写错了,可能导致系统开机挂载失败,严重时甚至进不了系统。生产环境修改前一定要备份,并用下面命令测试:Linux 的挂载机制,刚开始看确实不如 Windows 盘符直观。前者更适合普通用户快速理解,后者更适合服务器长期稳定管理。当你理解了挂载,就会明白 Linux 为什么没有 C 盘、D 盘,也会明白为什么服务器经常把数据盘挂到 `/data`,为什么 `/proc`、`/sys` 这些目录不是普通目录,为什么 `/etc/fstab` 对系统启动这么重要。Linux 把所有存储和资源,都统一接入从 `/` 开始的目录树中。当你从“找盘符”转变成“看挂载点”的时候,说明你已经开始真正理解 Linux 的文件系统了。你第一次接触 Linux 挂载时,是卡在 U 盘、数据盘,还是 /etc/fstab?欢迎在评论区聊聊。