封面来源:https://i-blog.csdnimg.cn/blog_migrate/de332fd24eeab330cfbc616dc8c2ab98.png
在前一节里面我们讲了什么是磁盘,以及如何为一块磁盘创建分区表并将其格式化为特定文件系统。在 Windows 下,到这一步可能就直接结束了,直接打开文件管理器就能使用新的磁盘,但是在 Linux 上却不是这样的,系统会提示你需要密码以挂载该磁盘。出现这种差异的原因是,Linux 挂载磁盘的操作只有 root 和拥有 sudo 权限的管理员才能进行,而 Windows 却是系统自动进行的。现在的问题显而易见:如何在 Linux 上挂载硬盘。
关于挂载
在 Linux 中,文件系统(如硬盘分区、U盘、光盘、网络存储等)需要关联到目录树的某个空目录(例如/data, /mnt)上,才能通过这个目录访问其中的数据。这个关联的过程就叫做挂载。这个目录称为挂载点。
挂载分为 2 种:临时挂载和永久挂载。
临时挂载是指使用 mount 命令手动进行的挂载,其效果仅持续到当前系统运行期间。重启后,挂载就会消失,适合 U 盘和移动硬盘等便携性强的存储设备。
而永久挂载则通过修改系统配置文件(/etc/fstab)或自启动文件,告诉操作系统在每次启动时自动进行挂载。重启后,挂载不会消失,适合插在主板上的机械硬盘和固态硬盘。
临时挂载
前面一部分已经说过了,临时挂载需要用到 mount 命令。
我们以前面一节里的 /dev/nvme0n1 为例(但愿你别把它给删了!)详细说明。
mount 可以自动识别挂载分区的文件系统,因此一般来说我们只需要提供要挂载的设备分区,以及需要挂载到的路径:
mount /dev/nvme0n1p1 /mnt
# Mounting on sub-directories in /mnt is allowed and strongly recommended结果如下:

其中,df 命令可以用于查看分区的挂载信息,-h 表示数值以可读形式显示,使用 -T 选项时将显示文件系统类型。具体可以参考这里:
挂载完成后,直接访问 /mnt,就可以查找或者修改磁盘分区内的文件了。
但是,对于某些文件系统,例如 btrfs,我们也可以在挂载时详细设置一些参数,例如启用透明压缩(某些作为主文件系统的还会标明子卷)、开启写保护(使用 -o ro 选项)等:

当你使用完该设备时,需要使用 umount 将该分区卸载(当前目录不允许是分区的挂载目录):
sudo umount /dev/nvme0n2p1卸载所有分区后,磁盘可以安全移除。
永久挂载
Linux 系统内有 2 种方式可以永久挂载一个分区:
编辑
/etc/fstab写入自启动文件
先说第一种,生产环境里面最常用的 /etc/fstab:
/etc/fstab 是 Linux 内一个非常重要的配置文件,用于定义系统启动时需要自动挂载的文件系统,包括系统所在的硬盘分区。
警告:修改时请不要随便乱改已有的分区,除非你很清楚这么做的后果!
以上面的 /dev/nvme0n1p1 为例,如果想要开机就挂载该分区,则应该在 /etc/fstab 中新增一条记录。具体写法如下:
[Device/Partition | UUID | IPAddress] [Mount-point] [Filesystem] [Options] [IsDump] [fsck]
# Separated by \t or space
# [IsDump] can be 0 or 1, if 0, then the system will NOT backup the partition
# [fsck] can be {0, 1, 2}, 0 = do not check, 1 = check root partition first, 2 = check other partitions first例如(最常见的写法):
/dev/nvme0n1p1 /mnt/anime-girls ext4 defaults 0 0
/dev/sdb1 /mnt/documents btrfs compress=zstd 0 0
/dev/sdc1 /mnt/top-secret ext4 ro 0 1挂载分区时,优先使用分区的 UUID 填写到第一列。要查看分区的 UUID,可以使用下面的命令:
udevadm info -q property -n /dev/{YOUR_PARTITION} | grep UUID
ls -l /dev/disk/by-uuid/
lsblk -o NAME,UUID,MOUNTPOINT,FSTYPE
# blkid may not work for some partitions修改完成后,重启系统或者使用 mount -a 全部挂载磁盘分区。
另一种相较于上面“做手术”更为安全的方式是写入系统的自启动文件。它的原理是使用终端的配置文件(例如 .bashrc 或 .zshrc),通过启动时读取其中的配置信息并执行其中的命令,从而达到“永久”挂载的目的。
一般来说,这种方法对于单用户是没有任何效果的,因为多数用户没有挂载硬盘的权限,但是如果我们需要使之对所有用户生效呢?我们就需要利用 root 的特点,将挂载信息写入 root 用户的 .bashrc 配置。就像这样:

这样重启或者全部挂载后就能看到新加的磁盘了。
交换分区
交换分区(又叫虚拟内存或 swap 空间)是磁盘上的一种很特殊的分区,是 Linux 系统在 RAM 可用空间不足时,用于存放 RAM 中不常用的内存数据以腾出 RAM 空间的地方。一般来说,由于交换分区(或文件)位于磁盘上,读写性能相比 RAM 是大打折扣的(即使是截止发稿时最新的 PCIe 5.0 固态硬盘),如果频繁发生大量的内存交换,则系统会出现无响应、死机等情况,这说明需要增加系统 RAM 的大小。
交换分区的大小视内存的大小而定:
例如,一台服务器的配置是 2 核 4 GB,那么推荐的 swap 空间的大小为 4 GB(因为服务器是全年无休的,除非手动关机维护);一台安装了 Linux Mint 22.2 Zara 的迷你主机,配置是 Intel N150 + 16 GB LPDDR5 内存,那么推荐的 swap 空间的大小在 [4, 8] GB 之间。
更多关于交换分区的信息可以参考红帽官方的这篇文章。
查看交换分区
我们可以使用 free -h 命令查看交换分区的大小。例如:

它会一并展示内存和交换分区可用的容量。其中-h 的作用是将结果以可读的形式呈现。
另一种查看交换分区可用容量的方式是使用 fastfetch 软件包。
这个软件包比较新,但是在其 GitHub 页面有已经打包好的软件包可供下载。在下载之前,请务必看清楚服务器的架构和操作系统所基于的发行版,如果是基于 Debian 的,则应该选择 .deb 格式;如果是基于 Fedora/RHEL 的,则应该选择 .rpm 格式。
安装好后,输入 fastfetch ,效果应该是这样的:
其中 Memory 是系统的内存使用情况,而 Swap 很明显就是交换分区了。
设置交换分区
这一次我们用 /dev/nvme0n2,某台 Fedora 系统内的硬盘,假装它插在虚拟机的“主板”上。
老规矩,要设置交换分区,首先需要有至少 1 个分区(如果整个都是交换分区)。这个在前面已经讲过了,必须使用 fdisk.
使用 GPT 分区表的新建分区可以直接探测到,而 MBR 还需要运行 partprobe /dev/sda(一般不建议对 NVMe 硬盘使用 MBR 分区表,因此这里用的是 sda 作为占位符)以刷新分区情况。
由于 fdisk 和 resize2fs 等命令不支持在非 LVM 的分区内缩减分区,因此我们暂时先创建 2 个分区,但如有必要,请使用 gparted 进行分区缩减工作:

/dev/nvme0n2p2 就是我们等会要创建的交换分区。
我们使用 mkswap 命令将这个分区格式化为 linuxswap 文件系统:

再使用 swapon /dev/nvme0n2p2 开启交换分区。
但是这种方法只会临时启用它。为了永久启用这个交换分区,我们必须修改 /etc/fstab 内的配置或者写入 root 的 .bashrc 文件作为开机自启动文件。
如果采用前者,则参考命令如下:
/dev/nvme0n2p2 none swap sw 0 0值得注意的是,交换分区不需要指定挂载点,但是文件系统必须是 swap,模式必须是 sw(也就是 swapon).
这样一来,重启或使用 mount -a 后,我们就能得到一个新的交换分区:

删除交换分区
删除交换分区的过程需要先关闭交换分区再删除。如果像上面一样设置了开机自动挂载,则需要同时将对应的配置项删除或注释。
首先,关闭交换分区(必须以 root 身份或 sudo 权限执行):
swapoff /dev/nvme0n2p2接下来,如果设置了开机自动挂载,则请注释或删除对应的配置项。
然后,使用 fdisk 删除交换分区,这里需要使用 d 命令,再输入你想要删除的分区:

确认无误后,输入 w 将操作写入磁盘并退出。
使用 lsblk 检查分区情况:

发现之前设置的交换分区已经被删除。
下一节的内容
下一节会涉及到 LVM(逻辑卷管理),也是整个 Linux 磁盘管理里面最难的一部分。
它于我们而言可能非常陌生,因为一般带有桌面且对用户友好的 Linux 发行版几乎都是默认将系统安装在一整块硬盘上,按照“EFI - 根目录 - 交换分区”的顺序排布。不过,理解 LVM 对于部署云应用时是有很大帮助的,尤其当操作系统为 AlmaLinux, Rocky Linux 或者 CentOS 的时候(不会还有人在用 CentOS 7 吧?),LVM 相较于传统的布局,也有着很大的优势。这些内容,我们将会在下一节中揭晓。