暗色模式

Linux 磁盘挂载:从 fdisk 分区到 fstab 开机自动挂载

技术教程
2026-08-15
13
0
本文要点
  • lsblk 一眼看清整机磁盘与分区;losetup 能把一个普通文件伪装成块设备(loop 设备)
  • fdisk 交互式分区:g 建 GPT 分区表、n 新建分区、w 写入磁盘
  • mkfs.ext4 把分区格式化成文件系统,mount 挂载到目录后才能读写
  • /etc/fstabUUID 记录开机自动挂载,mount -a 可立即验证配置
  • 磁盘镜像 + loop 设备 可以在不碰真盘的前提下安全练习整条流程

磁盘在 Linux 里是怎么"用"起来的

在 Linux 中,"磁盘" 从底到顶要经过四层才能被用户使用:

例子说明
块设备/dev/vda整块磁盘,只能按 4K 等块单位读写
分区/dev/vda1/dev/vda2把一块磁盘切成几段,各自管理
文件系统ext4、xfs、btrfs在分区上建立目录/文件结构,提供文件名、权限等语义
挂载点//mnt/d1把文件系统"粘"到目录树上,用户从这个目录读写数据

块设备本身没有"文件夹"概念,所以必须走完「分区 → 格式化 → 挂载」三步。任何一个新磁盘/新分区到手,操作套路都是一样的:看清设备 → 分区 → 建文件系统 → 挂载 →(可选)写进 fstab 开机自动挂载。本文就沿着这条主线,在 Ubuntu 24.04 上一路实操。

第一步:用 lsblk 看清机器上的磁盘

动手之前先看清机器上有哪些磁盘、分好区没有、挂到哪了。lsblk(list block devices)从内核 sysfs 读信息,输出像一棵树,主从关系一目了然:

lsblk

在本文的演示机(Ubuntu 24.04)上,输出大致是:

NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
loop0    7:0    0  50.1M  1 loop /snap/snapd/27591
loop1    7:1    0  66.8M  1 loop /snap/core24/1643
...
loop12   7:12   0   256M  0 loop
zram0  251:0    0   512M  0 disk [SWAP]
vda    253:0    0    40G  0 disk
├─vda1 253:1    0     1M  0 part
└─vda2 253:2    0    40G  0 part /

各列含义:NAME 设备名(树形缩进表示父子关系,比如 vda1vda 的分区);SIZE 容量;TYPEdisk(整盘)、part(分区)、loop(loop 设备)、zram 等;MOUNTPOINTS 表示挂载到哪个目录,没有值就说明还没挂载。可以看到这台机器的系统盘是 40G 的 vda,被分成 vda1(1M,引导用)和 vda2(挂载在 /);zram0 是压缩内存当作 swap 用。

造一块"虚拟磁盘":dd 与 loop 设备

直接在真机上练习分区很危险——一个手滑就把系统盘抹了。好在 Linux 有 loop 设备:它把一个普通文件当作块设备来访问。/dev/loop0~loop11 正是 snap 用镜像文件虚拟出来的,原理完全一样。所以我们先造一个 256M 的磁盘镜像文件,再挂成 loop 设备,之后的 fdisk/mkfs/mount 全都在它身上演练,碰不到真盘:

dd if=/dev/zero of=/root/disk-demo.img bs=1M count=256 2>&1 && losetup -fP --show /root/disk-demo.img && lsblk

用 dd 创建磁盘镜像并用 losetup 关联 loop 设备

三个命令依次完成:

  • dd if=/dev/zero of=/root/disk-demo.img bs=1M count=256:从 /dev/zero 读出 256 个 1M 的零块,写成一个 256M 的空文件,这就是"磁盘"的原始镜像;
  • losetup -fP --show /root/disk-demo.img:把镜像文件关联到下一个空闲的 loop 设备-f 自动挑,-P 让内核立即扫描分区表,--show 打印实际选中的设备名),这里选中了 /dev/loop12
  • lsblk:刷新后能看到 loop12 出现在列表里,容量正是 256M。

/dev/loop12 现在和一块真实的 256M 磁盘没有任何区别,接下来的所有操作都对它进行。losetup -l 可以随时查看某个 loop 设备背后对应哪个文件。

fdisk 交互式分区

分区表有 MBR(老式)和 GPT(现代)两种,新磁盘一律用 GPT。fdisk 是经典的分区工具,交互式逐条输入命令,适合演示也适合人肉操作。下面用管道一次性喂给它完整的按键序列,然后 partprobe 让内核重读分区表,再用 lsblk 确认:

printf 'g\nn\n\n\n+64M\nn\n\n\n\nw\n' | fdisk /dev/loop12 && partprobe /dev/loop12 && lsblk /dev/loop12

fdisk 交互式分区并确认结果

printf 里的每一行就是一次键盘输入,对照截图逐条看:

输入含义
g创建新的 GPT 分区表(Device does not contain a recognized partition table 表示镜像还是空盘)
n新建分区,回车两次分别接受默认分区号 1 和默认起始扇区 2048
+64M该分区大小为 64 MiB
n再建第二个分区,三个回车都接受默认值,把剩余空间用完(190 MiB)
w写入分区表并退出

注意 fdisk 输出里的 The partition table has been altered 只代表内存中的改动已写入镜像,块设备还需 partprobe /dev/loop12 通知内核重新读取分区表,才会出现 loop12p1loop12p2 这两个分区节点——截图最后 lsblk 里 64M + 190M 两个分区就是成果。

如果你更想要完全非交互的脚本化分区,也可以用 parted /dev/loop12 mklabel gpt mkpart primary ext4 1MiB 100%,原理相同。

格式化:mkfs.ext4

分区建好只是"划好了格子",还要在里面建立文件系统才能存放文件。mkfs.ext4 把分区格式化为 ext4:

mkfs.ext4 /dev/loop12p1 && mkfs.ext4 /dev/loop12p2

mkfs 输出里的几行信息值得认识一下:

  • Creating filesystem with 16384 4k blocks:分区按 4K 块划分,共 16384 块,等于 64M;
  • Filesystem UUID: xxx:文件系统唯一的 128 位标识,后面 fstab 就靠它指认设备;
  • Superblock backups stored on blocks:ext4 的超级块(存文件系统元数据)在磁盘多处留备份,坏了可以拿备份恢复;
  • Creating journal (1024 blocks):ext4 的日志,崩溃后靠它回滚未写完的事务。

挂载到目录:mount 与验证

格式化完的文件系统还不能直接"进入",必须挂载(mount)到目录树上某个目录——这个目录就叫挂载点。挂载后,往挂载点写东西就是往这块"磁盘"里写。把两个分区分别挂到 /mnt/d1/mnt/d2,顺便写入一个文件测试,最后用 df -h 确认:

mkfs.ext4 /dev/loop12p1 2>&1 && mkfs.ext4 /dev/loop12p2 2>&1 && mkdir -p /mnt/d1 /mnt/d2 && mount /dev/loop12p1 /mnt/d1 && mount /dev/loop12p2 /mnt/d2 && echo 'hello mount' | tee /mnt/d1/test.txt && df -h /mnt/d1 /mnt/d2

格式化、挂载并验证写入

逐个拆解这条命令:

  • mkdir -p /mnt/d1 /mnt/d2:挂载点目录要先存在-p 连父目录一起建;
  • mount /dev/loop12p1 /mnt/d1:把分区挂到目录,成功后无输出;
  • echo 'hello mount' | tee /mnt/d1/test.txttee 把内容同时写进文件和屏幕,验证挂载点能正常写入;
  • df -h /mnt/d1 /mnt/d2:显示文件系统的容量和挂载位置——/dev/loop12p1 是 56M、loop12p2 是 162M(实际容量比分区标称小,因为文件系统元数据占了空间)。

此时去 /mnt/d1ls 就能看到 test.txtcat /mnt/d1/test.txt 会输出 hello mount

开机自动挂载:/etc/fstab

上面手动 mount 只是临时生效,重启后一切归零。要让系统开机自动挂载,把配置写进 /etc/fstab。为什么推荐用 UUID 而不是设备名?因为设备名不稳定——比如 U 盘插入顺序、loop 设备号都可能变,而 UUID 是格式化时写死在文件系统里的,永不变更。

先查出分区 UUID:

blkid /dev/loop12p1

输出为 UUID="ca3e296d-792f-4105-8b39-d1656823f97b" TYPE="ext4" 之类的信息。然后向 /etc/fstab 追加一行,注意这行分 6 个字段,用空白分隔:

UUID=ca3e296d-792f-4105-8b39-d1656823f97b /mnt/d1 ext4 defaults 0 2
字段含义
1 设备UUID=ca3e296d-...也可以写 /dev/loop12p1,但用 UUID 更稳
2 挂载点/mnt/d1必须已存在
3 文件系统类型ext4mkfs.ext4 对应
4 挂载选项defaults等价于 rw,suid,dev,exec,auto,nouser,async,日常够用
5 dump0是否用 dump 备份,现代发行版统一填 0
6 fsck 顺序20 不检查,1 是根分区,2 是其余分区(按顺序检查)

追加后不用等重启,mount -a 会按 /etc/fstab 把所有应挂未挂的条目自动挂载,正好用来验证配置有没有写错:

echo "UUID=ca3e296d-792f-4105-8b39-d1656823f97b /mnt/d1 ext4 defaults 0 2" >> /etc/fstab
umount /mnt/d1 && mount -a && findmnt /mnt/d1 && df -h /mnt/d1 && cat /mnt/d1/test.txt

findmnt /mnt/d1 显示 /mnt/d1/dev/loop12p1 挂载、类型 ext4;之前写入的 test.txt 里的 hello mount 原样还在——说明文件系统里的数据不随卸载丢失,重启后也会自动回来。

注意:fstab 写错会导致开机进不了系统,属于高危操作。用 mount -a 验证成功后,再确认一下 mount -a 返回 0 才能放心;真机上改 fstab 前建议先 cp /etc/fstab /etc/fstab.bak

卸载与清理

演示完毕,清理现场:卸载两个挂载点,解除 loop 关联,删掉镜像文件:

umount /mnt/d1 /mnt/d2
losetup -d /dev/loop12
rm -f /root/disk-demo.img

umount 会先同步磁盘缓存,此时若还有进程占用挂载点(比如 shell 的当前目录在 /mnt/d1 里)会报 target is busy,用 fuser -mv /mnt/d1 找出占用进程;losetup -d 解除关联,rm 删掉镜像,整块"虚拟磁盘"就此消失。真实磁盘换盘/拔盘前同样要先 umount,否则可能丢数据。

常用命令速查表

目标命令
查看磁盘与分区lsblk
查看某磁盘详细信息lsblk /dev/vda
创建 N 大小的空镜像dd if=/dev/zero of=img bs=1M count=N
把镜像挂成 loop 设备losetup -fP --show img
查看 loop 设备对应的文件losetup -l
解除 loop 关联losetup -d /dev/loop12
交互式分区fdisk /dev/loop12
重读分区表partprobe /dev/loop12
格式化 ext4mkfs.ext4 /dev/loop12p1
查看分区 UUIDblkid /dev/loop12p1
挂载 / 卸载mount /dev/loop12p1 /mnt/d1 / umount /mnt/d1
按 fstab 批量挂载mount -a
查看挂载关系findmnt
查看磁盘占用df -h

小结

「块设备 → 分区 → 文件系统 → 挂载点」这四层,是 Linux 管理存储的骨架。新磁盘上手三步走:fdisk 分区、mkfs 建文件系统、mount 挂载;要持久化就按 UUID 写进 /etc/fstab,并用 mount -a 验证。而 loop 设备给了我们一个零风险的练习场——把镜像文件当磁盘,反复分区、格式化、挂载、搞坏、重建,都不会伤到系统盘。理解了这套流程,云主机加数据盘、给服务器接新存储、做磁盘备份镜像,原理就全通了。

参考资料

发表评论

暂无评论,快来抢沙发吧!