计算机基础

为什么 Linux 要用 “挂载”?而不是直接显示 C 盘、D 盘?

转载:小红书 赵楠的成长日记

前言🔖


为什么 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.txtb.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
  • 文件系统是分区里的组织规则,比如 ext4xfsntfs
  • 挂载是把这个文件系统接入 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 的文件系统了。