转载:小红书 赵楠的成长日记
前言🔖
为什么 Linux 要用“挂载”?
Linux 走的是完全相反的路——“以业务(内容)为中心”。Linux 的世界里没有盘符,只有一棵长相完美的“大树”(根目录 /)。无论你插多少块硬盘、U盘、网络存储,它们在用户眼里,都只是这棵大树上的“树枝”(文件夹)。
什么是挂载?
挂载(Mount),本质上就是“把一块物理硬件,强行绑定到一个虚拟文件夹上”的过程。
举个通俗的例子:
你有一个大书架(根目录 /),上面贴了标签叫 【电影】(/movie 文件夹)。
- Windows 的做法: 给你一个标着“一号仓库”的物理箱子(D盘),你想看电影,必须先记住电影在“一号仓库”里。
- Linux 的做法: 它不管你箱子叫什么。你把一个 2TB 的新硬盘买回家,Linux 说:“把这个硬盘,挂载到 【电影】 文件夹上!” 挂载成功后,你往 【电影】 文件夹里放片子,数据其实就自动写进了这块新硬盘里。在你眼里,根本不需要关心什么硬盘 A、硬盘 B,你只需要认准 【电影】 这个入口就行了。
为什么 Linux 要用挂载?而不是像 Windows 一样直接显示 C 盘、D 盘?
刚开始学 Linux 的时候,很多人都会遇到一个很奇怪的问题:我插了一个 U 盘,为什么系统里不会像 Windows 一样直接多出来一个 E 盘、F 盘?
我新加了一块硬盘,为什么不能直接访问?为什么还要执行什么:
mount /dev/sdb1 /mnt/data
甚至还要改 /etc/fstab?
这个 “挂载” 到底是什么意思?为什么 Linux 非要这样设计?是不是故意把事情搞复杂?
其实不是。挂载,是理解 Linux 文件系统非常重要的一道门槛。只要你搞懂了挂载,就会发现 Linux 的磁盘、分区、目录、U 盘、光盘、网络存储,其实都是一套统一的逻辑。
先从 Windows 的“盘符思维” 说起🔖
很多人最早接触电脑,都是从 Windows 开始的。
在 Windows 里,我们非常熟悉这种结构:C 盘一般是系统盘,D 盘可能放软件,E 盘可能放资料,插入 U 盘以后,系统可能又多出一个 F 盘。
这种方式很直观。你看到一个盘符,就知道它代表一个独立的存储区域。
所以很多人第一次接触 Linux 时,会下意识地问:
Linux 的 C 盘在哪里? Linux 的 D 盘在哪里? 我插的 U 盘为什么没有显示成 E 盘?
但 Linux 从一开始就不是按照 “盘符” 来组织文件的。
Linux 的世界里,所有东西都从一个地方开始:
/
这个 / 叫做根目录。注意,这里的根目录不是 root 用户的 /root,而是整个 Linux 文件系统的起点。
在 Linux 里,没有 C 盘、D 盘这种概念。它只有一棵从 / 开始的目录树。
你看到的:都是这棵树上的不同分支。
这就是 Linux 和 Windows 在文件系统组织方式上最大的区别之一:
- Windows 是多个盘符并列存在。
- Linux 是所有文件统一挂在一棵目录树下面。
什么是挂载?🔖
挂载这个词听起来有点抽象,其实可以理解成一句话:把一个存储设备,接到 Linux 目录树上的某个位置。
比如你有一块新硬盘,它在 Linux 里的设备文件可能是:
/dev/sdb1
但这个设备文件本身并不代表你能直接像普通目录一样进去存文件。
你需要先准备一个目录,比如:
/mnt/data
然后执行:
mount /dev/sdb1 /mnt/data
这句话的意思就是:把 /dev/sdb1 这个分区,挂到 /mnt/data 这个目录下面。
挂载成功后,你再进入:
cd /mnt/data
看到的就不再是原来这个空目录,而是 /dev/sdb1 这个分区里的文件内容。也就是说,/mnt/data 这个目录变成了访问这块硬盘的入口。这就像在一座城市里,原本有一条主干道 /,你现在修了一条通往新仓库的路,入口就设在 /mnt/data。以后所有人都从这个入口进去访问新仓库。
所以挂载不是 “复制文件”,也不是 “移动文件”,它只是建立一个访问入口。
为什么 Linux 不直接显示成一个新盘?🔖
这个问题的关键在于 Linux 的设计哲学。
Linux 很强调一个理念:一切皆文件。
硬盘是文件,分区是文件,U 盘是文件,终端是文件,进程信息也可以通过文件形式暴露出来。
比如:
这些就是 Linux 里常见的磁盘和分区设备文件。
其中:
/dev/sda通常表示第一块硬盘。/dev/sda1通常表示第一块硬盘的第一个分区。/dev/sdb通常表示第二块硬盘。/dev/sdb1通常表示第二块硬盘的第一个分区。
但是,设备文件只是系统识别到了这个设备,并不等于它已经被放进文件系统目录树里了。
你可以把它理解成:
Linux 已经知道仓库存在了,但是还没有给这个仓库修入口。
挂载,就是给这个仓库修入口。
Linux 不使用盘符,而是选择把所有设备都接入统一的目录树,这样做的好处是整个系统结构会非常统一。不管是本地硬盘、U 盘、光盘、网络磁盘,还是远程 NFS 存储,都可以被挂载到某个目录下。
比如:
从用户和程序的角度看,它们都是普通目录。程序不需要关心这个目录背后到底是一块本地硬盘,还是一台远程服务器上的网络存储。它只需要读写路径就行了。
这就是 Linux 挂载设计非常强大的地方:把复杂的存储设备,统一抽象成目录访问。
举个最简单的例子:U 盘为什么要挂载?🔖
假设你插入一个 U 盘。Linux 识别到它之后,可能会出现一个设备:
/dev/sdb1
但这时候你还不能直接:
cd /dev/sdb1
因为 /dev/sdb1 不是一个普通目录,而是一个设备文件。
你需要找一个目录作为入口,比如:
/mnt/usb
然后你就可以:
mount /dev/sdb1 /mnt/usb
这时看到的就是 U 盘里的内容。
如果用完了,要安全移除,就需要卸载:
umount /mnt/usb
注意命令是 umount,不是 unmount。
很多新手刚开始会觉得麻烦:为什么还要卸载?直接拔不行吗?
最好不要。因为系统写入文件时,不一定是你复制完成的那一刻就立刻完全写入 U 盘。Linux 可能会先把部分数据放在缓存里,再慢慢写入设备。如果你没有卸载就直接拔掉,可能会导致文件损坏。
执行 umount 的作用,就是告诉系统:
我要拔掉这个设备了,请把该写入的数据都写完,并断开这个目录和设备之间的关系。
所以,挂载和卸载,其实是一套完整的设备接入和安全移除机制。
挂载点是什么?🔖
你经常会听到一个词:挂载点。
挂载点其实就是设备接入目录树的位置。
比如:
mount /dev/sdb1 /data
这里的 /data 就是挂载点。
再比如:
mount /dev/sdc1 /backup
这里的 /backup 就是挂载点。挂载点本质上就是一个普通目录。但是一旦有设备挂载到这个目录上,这个目录就变成了访问设备内容的入口。
这里有一个新手很容易踩的坑:如果一个目录原来里面有文件,然后你把一块硬盘挂载到这个目录上,原来的文件会不会被删除?
不会。但是它们会暂时 “看不见”。
比如 /data 目录里原来有:
a.txt b.txt
这时候你执行:
mount /dev/sdb1 /data
挂载完成后,你再看 /data,看到的是 /dev/sdb1 里的内容,而不是原来的 a.txt 和 b.txt。
原来的文件没有被删,只是被挂载进来的文件系统 “遮住了”。
等你卸载:
umount /data
原来的文件又会重新出现。这也是为什么生产环境里挂载磁盘一定要小心,尤其不要随便把新磁盘挂载到已经有重要数据的目录上。
为什么服务器特别喜欢把数据盘挂载到 /data?🔖
很多云服务器新加一块数据盘后,常见操作是把它挂载到:
/data
或者:
/www /backup /mysql
为什么不直接放在系统盘里?
因为服务器通常会把系统和数据分开管理。
- 系统盘主要放操作系统、命令、配置文件
- 数据盘主要放业务数据。
这样做有几个好处。
- 第一,系统坏了,数据不一定丢。
- 如果系统盘出现问题,只要数据盘还在,就可以重新挂载到新的系统上。
- 第二,方便扩容。
- 当业务数据越来越大时,可以单独扩容数据盘,而不是动整个系统盘。
- 第三,方便迁移。
- 比如你要把 MySQL 数据迁移到更大的磁盘上,就可以把新磁盘挂载到数据库数据目录,或者先同步数据再切换挂载点。
- 第四,方便管理权限和备份。
- 不同类型的数据放在不同挂载点下面,运维管理起来更清楚。
如何查看当前系统挂载了哪些东西?🔖
在 Linux 里,可以用几个常见命令查看挂载情况。最常用的是:
df -h
它可以看到每个文件系统的容量、已用空间、剩余空间,以及挂载点。
另一个常用命令是:
mount
它会显示当前系统所有挂载信息,不过输出会比较多。
为什么重启后挂载没了?🔖
很多新手第一次手动挂载磁盘后,会遇到一个问题:
明明我执行了:
mount /dev/sdb1 /data
当时可以用了。
但是服务器一重启,挂载就没了。
这是因为 mount 命令默认只是临时挂载。
它只在当前系统运行期间生效,重启后系统不会自动记住你之前手动挂载过什么。
如果你想让它开机自动挂载,就需要配置:
/etc/fstab
这个文件可以理解成 Linux 的 “开机自动挂载清单”。
系统启动时,会读取 /etc/fstab,然后按照里面的配置,把指定设备挂载到指定目录。
比如:
UUID=xxxx-xxxx /data ext4 defaults 0 0
这表示把某个 UUID 对应的分区,开机自动挂载到 /data,文件系统类型是 ext4。
为什么更推荐用 UUID,而不是直接写 /dev/sdb1?
因为设备名可能会变化。今天你的数据盘可能是 /dev/sdb1,但如果以后机器上新增、删除、调整了磁盘顺序,它可能变成 /dev/sdc1。
而 UUID 是文件系统的唯一标识,更稳定。所以生产环境里,写 /etc/fstab 时通常建议用 UUID。
可以通过下面命令查看:
blkid
挂载和文件系统是什么关系?🔖
很多人还会混淆三个概念:
硬盘、分区、文件系统、挂载。
简单理一下:
- 硬盘是物理设备,比如一块 500G 的磁盘。
- 分区是在硬盘上划出来的区域,比如
/dev/sdb1。 - 文件系统是分区里的组织规则,比如
ext4、xfs、ntfs。 - 挂载是把这个文件系统接入 Linux 目录树。
所以一个新磁盘通常要经历这几步:
- 第一步,系统识别到硬盘:
/dev/sdb - 第二步,给硬盘分区:
/dev/sdb1 - 第三步,格式化成文件系统:
mkfs.ext4 /dev/sdb1 - 第四步,创建挂载点:
mkdir /data - 第五步,挂载:
mount /dev/sdb1 /data - 第六步,如果要开机自动挂载,写入
/etc/fstab。
这就是一块新磁盘从 “硬件设备” 变成 “可访问目录” 的完整过程。
很多人之所以觉得挂载难,是因为把这些概念混在了一起。
你只要记住一句话:
硬盘负责提供空间,文件系统负责组织数据,挂载负责提供入口。这三个角色就很清楚了。
Linux 为什么坚持这种设计?🔖
说到底,Linux 为什么要用挂载?
因为它想要的是一个统一、清晰、可扩展的文件系统。
在 Linux 里,不管数据来自哪里,都可以放到同一棵目录树下面。
- 本地硬盘可以挂载:
/data - U 盘可以挂载:
/mnt/usb - 光盘可以挂载:
/mnt/cdrom - 远程 NFS 可以挂载:
/nfs/share
甚至某些特殊的虚拟文件系统也可以挂载:
比如 /proc 并不是真实存在于磁盘上的目录,而是内核暴露系统运行信息的虚拟文件系统。
你看到的 CPU 信息、内存信息、进程信息,很多都来自 /proc。
这说明挂载不只是给硬盘用的。
它是 Linux 把各种资源接入统一目录树的一种机制。
这也是 Linux 强大的地方:不管底层资源是什么,最终都可以通过路径来访问。
- 对用户来说,是目录。
- 对程序来说,是路径。
- 对系统来说,是统一管理。
新手最容易误解的几个点🔖
最后总结几个常见误区。
第一个误区:挂载就是复制文件。
不是。挂载只是建立访问入口,不会把设备里的文件复制到挂载点。
第二个误区:挂载点必须是 /mnt。
不是。/mnt 只是传统上用来临时挂载的目录。你也可以挂载到 /data、/backup、/www,只要符合你的管理习惯。
第三个误区:设备识别到了就能直接用。
不一定。
系统识别到 /dev/sdb1,只表示设备存在。你还需要文件系统和挂载点,才能正常访问。
第四个误区:卸载就是删除文件。
不是。
umount 只是断开设备和目录之间的关系,不会删除设备里的数据。
第五个误区:/etc/fstab 可以随便改。
千万不要。
/etc/fstab 写错了,可能导致系统开机挂载失败,严重时甚至进不了系统。生产环境修改前一定要备份,并用下面命令测试:
mount -a
如果没有报错,再考虑重启。
最后🔖
Linux 的挂载机制,刚开始看确实不如 Windows盘符直观。
Windows 是:插一个设备,多一个盘符。
Linux 是:插一个设备,把它接到目录树的某个位置。
前者更适合普通用户快速理解,后者更适合服务器长期稳定管理。
当你理解了挂载,就会明白 Linux 为什么没有 C 盘、D 盘,也会明白为什么服务器经常把数据盘挂到 /data,为什么 /proc、/sys 这些目录不是普通目录,为什么 /etc/fstab 对系统启动这么重要。
挂载的本质,其实就是一句话:
Linux 把所有存储和资源,都统一接入从 / 开始的目录树中。
这不是复杂,而是一种高度工程化的设计。
当你从 “找盘符” 转变成 “看挂载点” 的时候,说明你已经开始真正理解 Linux 的文件系统了。