本文要点
lsblk一眼看清整机磁盘与分区;losetup能把一个普通文件伪装成块设备(loop 设备)fdisk交互式分区:g建 GPT 分区表、n新建分区、w写入磁盘mkfs.ext4把分区格式化成文件系统,mount挂载到目录后才能读写/etc/fstab用 UUID 记录开机自动挂载,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 设备名(树形缩进表示父子关系,比如 vda1 是 vda 的分区);SIZE 容量;TYPE 是 disk(整盘)、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 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
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 通知内核重新读取分区表,才会出现 loop12p1、loop12p2 这两个分区节点——截图最后 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/loop12p2mkfs 输出里的几行信息值得认识一下:
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.txt:tee把内容同时写进文件和屏幕,验证挂载点能正常写入;df -h /mnt/d1 /mnt/d2:显示文件系统的容量和挂载位置——/dev/loop12p1是 56M、loop12p2是 162M(实际容量比分区标称小,因为文件系统元数据占了空间)。
此时去 /mnt/d1 下 ls 就能看到 test.txt,cat /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 文件系统类型 | ext4 | 与 mkfs.ext4 对应 |
| 4 挂载选项 | defaults | 等价于 rw,suid,dev,exec,auto,nouser,async,日常够用 |
| 5 dump | 0 | 是否用 dump 备份,现代发行版统一填 0 |
| 6 fsck 顺序 | 2 | 0 不检查,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.txtfindmnt /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.imgumount 会先同步磁盘缓存,此时若还有进程占用挂载点(比如 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 |
| 格式化 ext4 | mkfs.ext4 /dev/loop12p1 |
| 查看分区 UUID | blkid /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 设备给了我们一个零风险的练习场——把镜像文件当磁盘,反复分区、格式化、挂载、搞坏、重建,都不会伤到系统盘。理解了这套流程,云主机加数据盘、给服务器接新存储、做磁盘备份镜像,原理就全通了。
评论 (0)
暂无评论,快来抢沙发吧!