Linux磁盘与文件系统管理实战指南
环境说明:本文所有命令均在华为云ECS服务器(Ubuntu 24.04.4 LTS, x86_64架构)上真实执行并捕获输出。使用loop设备模拟磁盘,完整演示分区、文件系统、LVM、swap、fsck和inode等操作。
服务器信息:ecs-c8cd-d105-0001 | 内核 6.8.0-136-generic | root用户 | 磁盘40G
一、磁盘分区与管理
1.1 查看磁盘信息
# lsblk - 列出块设备lsblk真实输出:
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS vda 253:0 0 40G 0 disk └─vda1 253:1 0 40G 0 part /# df -h - 查看磁盘使用情况df-h真实输出:
Filesystem Size Used Avail Use% Mounted on tmpfs 1.5G 1.1M 1.5G 1% /run /dev/vda1 40G 3.4G 35G 10% / tmpfs 7.4G 0 7.4G 0% /dev/shm tmpfs 5.0M 0 5.0M 0% /run/lock tmpfs 1.5G 12K 1.5G 1% /run/user/0# fdisk -l - 查看磁盘分区表fdisk-l真实输出:
Disk /dev/vda: 40 GiB, 42949672960 bytes, 83886080 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disklabel type: dos Disk identifier: 0xa7944314 Device Boot Start End Sectors Size Id Type /dev/vda1 * 2048 83886046 83883999 40G 83 Linux原理说明:
vda是云服务器的虚拟磁盘(Virtual Disk),相当于物理机的/dev/sdavda1是主分区,挂载在根目录/,占用整个磁盘- Sector size 512 bytes 是最小寻址单元,Block size 4096 bytes 是最小读写单元
1.2 使用fdisk创建分区
由于云服务器只有一块系统盘,我们使用loop设备模拟新磁盘进行分区操作:
# 创建500MB的镜像文件作为模拟磁盘ddif=/dev/zeroof=/tmp/disk1.imgbs=1Mcount=500# 关联到loop设备losetup /dev/loop10 /tmp/disk1.img# 使用fdisk创建分区echo-e'n\np\n1\n\n+200M\nn\np\n2\n\n\nw'|fdisk/dev/loop10# 查看分区结果fdisk-l/dev/loop10真实输出:
Disk /dev/loop10: 500 MiB, 524288000 bytes, 1024000 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disklabel type: dos Disk identifier: 0xdcdb1635 Device Boot Start End Sectors Size Id Type /dev/loop10p1 2048 411647 409600 200M 83 Linux /dev/loop10p2 411648 1023999 612352 299M 83 Linux# lsblk查看分区lsblk /dev/loop10真实输出:
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS loop10 7:10 0 500M 0 loop ├─loop10p1 259:0 0 200M 0 part └─loop10p2 259:1 0 299M 0 part1.3 parted工具
# parted查看分区信息parted/dev/loop10 print真实输出:
Model: Loopback device (loopback) Disk /dev/loop10: 524MB Sector size (logical/physical): 512B/512B Partition Table: msdos Disk Flags: Number Start End Size Type File system Flags 1 1049kB 211MB 210MB primary ext4 2 211MB 524MB 314MB primary ext2fdisk vs parted:
fdisk:交互式分区工具,支持MBR分区表,适合传统BIOS系统parted:支持MBR和GPT分区表,适合大于2TB的磁盘和UEFI系统- MBR最多支持4个主分区(或3主+1扩展),最大支持2TB磁盘
- GPT支持128个分区,最大支持18EB磁盘
二、文件系统创建与挂载
2.1 创建文件系统
# 在第一个分区创建ext4文件系统mke2fs-text4 /dev/loop10p1真实输出:
mke2fs 1.47.0 (5-Feb-2023) Creating filesystem with 51200 4k blocks and 51200 inodes Filesystem UUID: 0cd6b056-09a2-4a7a-8758-c582ae8fadf5 Superblock backups stored on blocks: 32768 Allocating group tables: 0/2 done Writing inode tables: 0/2 done Creating journal (4096 blocks): done Writing superblocks and filesystem accounting information: 0/2 done# 在第二个分区创建ext2文件系统mke2fs-text2 /dev/loop10p2真实输出:
mke2fs 1.47.0 (5-Feb-2023) Creating filesystem with 76544 4k blocks and 76560 inodes Filesystem UUID: 315d1286-ed41-417b-af4c-2e2be9cb4ec8 Superblock backups stored on blocks: 32768 Allocating group tables: 0/3 done Writing inode tables: 0/3 done Writing superblocks and filesystem accounting information: 0/3 done2.2 挂载与卸载
# 创建挂载点并挂载mkdir-p/mnt/disk1 /mnt/disk2mount/dev/loop10p1 /mnt/disk1mount/dev/loop10p2 /mnt/disk2# 查看挂载结果df-h/mnt/disk1 /mnt/disk2真实输出:
Filesystem Size Used Avail Use% Mounted on /dev/loop10p1 172M 24K 158M 1% /mnt/disk1 /dev/loop10p2 281M 24K 266M 1% /mnt/disk2# 写入测试数据echo'hello ext4'>/mnt/disk1/test.txtecho'hello ext2'>/mnt/disk2/test.txtcat/mnt/disk1/test.txtcat/mnt/disk2/test.txt真实输出:
hello ext4 hello ext2# 查看挂载信息mount|greploop10真实输出:
/dev/loop10p1 on /mnt/disk1 type ext4 (rw,relatime)2.3 /etc/fstab持久化挂载
# 查看当前fstab配置cat/etc/fstab真实输出:
# /etc/fstab: static file system information. # # Use 'blkid' to print the universally unique identifier for a # device; this may be used with UUID= as a more robust way to name devices # that works even if disks are added and removed. See fstab(5). # # <file system> <mount point> <type> <options> <dump> <pass> # / was on /dev/vda1 during curtin installation UUID=e3f4864e-6c99-4733-b3ad-c0622bfeed37 / ext4 defaults 0 1fstab字段说明:
- 设备标识(推荐用UUID,用
blkid获取)- 挂载点
- 文件系统类型(ext4/xfs/swap等)
- 挂载选项(defaults/rw/noexec等)
- dump频率(0=不dump)
- fsck检查顺序(0=不检查,1=根分区,2=其他分区)
踩坑经验:修改fstab后务必运行
mount -a验证配置正确性,否则重启后可能无法启动。使用UUID而非设备名,因为设备名可能因磁盘添加顺序变化而改变。
三、磁盘空间查看
3.1 df - 查看文件系统磁盘空间
# df -h - 人类可读格式显示df-h/真实输出:
Filesystem Size Used Avail Use% Mounted on /dev/vda1 40G 3.4G 35G 10% /3.2 du - 查看目录空间
# du -sh - 查看目录总大小du-sh/mnt/disk1/du-sh/mnt/lv1/真实输出:
28K /mnt/disk1/ 24K /mnt/lv1/df vs du:
df:查看文件系统整体使用情况(包含预留空间)du:查看目录/文件实际占用空间- df显示的Used可能大于du的结果,因为包含文件系统元数据和被删除但未释放的文件句柄
四、LVM逻辑卷管理
LVM(Logical Volume Manager)是Linux下最灵活的磁盘管理方案,支持动态扩容、快照和跨磁盘卷组。
4.1 创建PV/VG/LV
# 创建物理卷PVpvcreate /dev/loop11 pvdisplay /dev/loop11真实输出:
Physical volume "/dev/loop11" successfully created. "/dev/loop11" is a new physical volume of "500.00 MiB" --- NEW Physical volume --- PV Name /dev/loop11 VG Name PV Size 500.00 MiB Allocatable NO PV UUID UdqbyT-4G7O-OxoF-IEcQ-JBJ5-vANv-JlbWE8# 创建卷组VGvgcreate myvg /dev/loop11 vgdisplay myvg真实输出:
Volume group "myvg" successfully created --- Volume group --- VG Name myvg VG Size 496.00 MiB PE Size 4.00 MiB Total PE 124 Alloc PE / Size 0 / 0 Free PE / Size 124 / 496.00 MiB# 创建逻辑卷LVlvcreate-L200M-nmylv1 myvg lvcreate-L100M-nmylv2 myvg# 查看所有LV/VG/PVlvs&&vgs&&pvs真实输出:
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert mylv1 myvg -wi-a----- 200.00m mylv2 myvg -wi-a----- 100.00m VG #PV #LV #SN Attr VSize VFree myvg 1 2 0 wz--n- 496.00m 196.00m PV VG Fmt Attr PSize PFree /dev/loop11 myvg lvm2 a-- 496.00m 196.00m4.2 LV格式化与挂载
# 激活VGvgchange-aymyvg# 在LV上创建文件系统mke2fs-text4 /dev/myvg/mylv1# 挂载并写入数据mkdir-p/mnt/lv1mount/dev/myvg/mylv1 /mnt/lv1echo'lvm test'>/mnt/lv1/data.txtcat/mnt/lv1/data.txt真实输出:
2 logical volume(s) in volume group "myvg" now active mke2fs 1.47.0 (5-Feb-2023) Creating filesystem with 51200 4k blocks and 51200 inodes lvm test4.3 LV在线扩容
# 扩容LV(+50M)lvextend-L+50M /dev/myvg/mylv1 lvs真实输出:
Rounding size to boundary between physical extents: 52.00 MiB. Size of logical volume myvg/mylv1 changed from 200.00 MiB (50 extents) to 252.00 MiB (63 extents). Logical volume myvg/mylv1 successfully resized. LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert mylv1 myvg -wi-ao---- 252.00m mylv2 myvg -wi-a----- 100.00m# 在线扩容文件系统resize2fs /dev/myvg/mylv1df-h/mnt/lv1真实输出:
Filesystem at /dev/myvg/mylv1 is mounted on /mnt/lv1; on-line resizing required old_desc_blocks = 1, new_desc_blocks = 1 The filesystem on /dev/myvg/mylv1 is now 64512 (4k) blocks long. Filesystem Size Used Avail Use% Mounted on /dev/mapper/myvg-mylv1 224M 28K 210M 1% /mnt/lv1LVM三层结构:
- PV(Physical Volume):物理卷,由磁盘或分区转化而来
- VG(Volume Group):卷组,由一个或多个PV组成,类似存储池
- LV(Logical Volume):逻辑卷,从VG中分配空间,类似虚拟分区
LVM核心优势:
- 动态扩容:LV可以在线扩大,无需卸载文件系统
- 跨磁盘:VG可以包含多块磁盘,突破单盘容量限制
- 快照功能:
lvcreate -s创建快照用于备份踩坑经验:ext4文件系统用
resize2fs在线扩容,xfs用xfs_growfs。扩容时先扩LV再扩文件系统,顺序不能反。
五、Swap交换分区
Swap是Linux的虚拟内存,当物理内存不足时将不常用的数据交换到磁盘。
5.1 查看当前swap
swapon--showfree-h真实输出:
total used free shared buff/cache available Mem: 14Gi 584Mi 13Gi 2.7Mi 1.4Gi 14Gi Swap: 0B 0B 0B5.2 创建swap文件
# 创建128MB的swap文件ddif=/dev/zeroof=/tmp/swapfilebs=1Mcount=128chmod600/tmp/swapfile# 设置swap格式mkswap/tmp/swapfile真实输出:
Setting up swapspace version 1, size = 128 MiB (134213632 bytes) no label, UUID=b1bea2b1-00e9-40da-8c9e-a374eb56379c5.3 启用和关闭swap
# 启用swapswapon/tmp/swapfileswapon--showfree-h真实输出:
NAME TYPE SIZE USED PRIO /tmp/swapfile file 128M 0B -2 total used free shared buff/cache available Mem: 14Gi 596Mi 12Gi 2.6Mi 1.6Gi 14Gi Swap: 127Mi 0B 127Mi# 关闭swapswapoff /tmp/swapfilefree-h真实输出:
total used free shared buff/cache available Mem: 14Gi 597Mi 12Gi 2.6Mi 1.6Gi 14Gi Swap: 0B 0B 0BSwap配置建议:
- 物理内存 < 8GB:swap设为内存的1-2倍
- 物理内存 8-64GB:swap设为8GB
- 物理内存 > 64GB:swap设为4-8GB
- 云服务器通常swap较小或没有,因为I/O性能不如物理机
- 持久化:在
/etc/fstab中添加/tmp/swapfile none swap sw 0 0
六、文件系统检查与修复
6.1 fsck检查
# 卸载文件系统后才能检查umount/mnt/disk2# 强制检查并自动修复fsck.ext4-fy/dev/loop10p2真实输出:
e2fsck 1.47.0 (5-Feb-2023) Pass 1: Checking inodes, blocks, and sizes Pass 2: Checking directory structure Pass 3: Checking directory connectivity Pass 4: Checking reference counts Pass 5: Checking group summary information /dev/loop10p2: 12/76560 files (0.0% non-contiguous), 4838/76544 blocksfsck五个检查阶段:
- Pass 1:检查inode、block和大小
- Pass 2:检查目录结构
- Pass 3:检查目录连通性
- Pass 4:检查引用计数
- Pass 5:检查组摘要信息
fsck参数说明:
-f:强制检查,即使文件系统标记为clean-y:对所有问题自动回答yes-n:对所有问题自动回答no(只检查不修复)-p:自动修复安全的问题(不改变文件系统状态)踩坑经验:fsck必须在文件系统卸载状态下运行(根分区除外,需要在单用户模式下运行)。fsck可能删除损坏的文件来修复文件系统,运行前务必备份重要数据。
七、inode与block理解
7.1 inode基础概念
inode(Index Node)是Linux文件系统的核心数据结构。每个文件都有一个唯一的inode号,存储文件的元数据(权限、大小、时间戳、数据块位置等),但不包含文件名。
# 查看inode使用情况df-i/ /mnt/disk1真实输出:
Filesystem Inodes IUsed IFree IUse% Mounted on /dev/vda1 2621440 105896 2515544 5% / /dev/loop10p1 51200 12 51188 1% /mnt/disk17.2 查看文件系统详细信息
# dumpe2fs查看superblock信息dumpe2fs-h/dev/loop10p1|grep-E'Inode count|Block count|Inode size|Block size|Free inodes|Free blocks'真实输出:
Inode count: 51200 Block count: 51200 Free blocks: 43842 Free inodes: 51189 Block size: 4096 Inode size: 2567.3 inode消耗实验
# 创建100个小文件mkdir-p/mnt/disk1/inode_testforiin$(seq1100);dotouch/mnt/disk1/inode_test/file_$i;doneecho"Created 100 files"ls/mnt/disk1/inode_test/|wc-l真实输出:
Created 100 files 100# 查看inode使用变化df-i/mnt/disk1真实输出:
Filesystem Inodes IUsed IFree IUse% Mounted on /dev/loop10p1 51200 113 51087 1% /mnt/disk17.4 stat查看文件inode详情
# stat查看文件详细inode信息stat/mnt/disk1/test.txt真实输出:
File: /mnt/disk1/test.txt Size: 11 Blocks: 8 IO Block: 4096 regular file Device: 259,0 Inode: 12 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2026-10-12 15:57:51.103148068 +0800 Modify: 2026-10-12 15:57:51.103148068 +0800 Change: 2026-10-12 15:57:51.103148068 +0800 Birth: 2026-10-12 15:57:51.103148068 +0800inode与block核心概念:
概念 说明 inode 文件元数据结构(权限、大小、时间戳、数据块指针) block 文件数据存储的最小单元(通常4KB) inode number 文件的唯一标识号 inode table 存储所有inode的表,在文件系统创建时固定大小 关键理解:
- 文件名存储在目录中,不是inode中。目录是文件名到inode号的映射表
- 每个文件消耗1个inode。inode数量在文件系统创建时固定,用完将无法创建新文件(即使磁盘空间还有)
- 本例中创建100个文件后,IUsed从12增加到113(增加了101个:100个文件+1个目录)
- stat显示的Blocks=8表示占用了8个512字节的块(即4KB,一个4096字节的block)
踩坑经验:当磁盘报"No space left on device"但
df -h显示有空间时,很可能是inode耗尽。用df -i检查inode使用率。解决方法:删除大量小文件或重新格式化时指定更大的inode数量(mke2fs -N inode_count)。
八、总结
本文在华为云ECS服务器(Ubuntu 24.04.4 LTS)上完整实操了Linux磁盘与文件系统管理的全部核心内容,涵盖七大模块:
- 磁盘分区:
lsblk、fdisk、parted、losetup,使用loop设备模拟磁盘分区 - 文件系统:
mke2fs(ext4/ext2)、mount/umount、/etc/fstab持久化挂载 - 磁盘空间:
df -h(文件系统级别)、du -sh(目录级别) - LVM管理:
pvcreate/vgcreate/lvcreate、lvextend+resize2fs在线扩容 - Swap交换分区:
mkswap、swapon/swapoff、free -h - 文件系统检查:
fsck.ext4五阶段检查与修复 - inode与block:
df -i、dumpe2fs、stat,深入理解inode机制
核心要点回顾:
- MBR分区表最多4个主分区,GPT支持128个分区且支持大于2TB磁盘
- LVM的三层结构(PV→VG→LV)实现了磁盘的灵活管理,支持在线扩容
- ext4用
resize2fs扩容,xfs用xfs_growfs扩容,都不能缩容(xfs完全不能缩) - fsck必须在卸载状态下运行,根分区需要在单用户/救援模式下检查
- inode耗尽时磁盘有空间也无法创建文件,用
df -i诊断 /etc/fstab使用UUID标识设备,比设备名更可靠
实践环境:华为云ECS Ubuntu 24.04.4 LTS | 内核 6.8.0-136-generic | x86_64 | 磁盘40G
写作日期:2026-10-12