☰
Linux磁盘与文件系统管理实战指南
2026/10/14 9:35:38 网站建设 项目流程

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/sda
  • vda1是主分区,挂载在根目录/,占用整个磁盘
  • 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 part

1.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 ext2

fdisk 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 done

2.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 1

fstab字段说明:

  1. 设备标识(推荐用UUID,用blkid获取)
  2. 挂载点
  3. 文件系统类型(ext4/xfs/swap等)
  4. 挂载选项(defaults/rw/noexec等)
  5. dump频率(0=不dump)
  6. 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.00m

4.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 test

4.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/lv1

LVM三层结构:

  • 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 0B

5.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-a374eb56379c

5.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 0B

Swap配置建议:

  • 物理内存 < 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 blocks

fsck五个检查阶段:

  1. Pass 1:检查inode、block和大小
  2. Pass 2:检查目录结构
  3. Pass 3:检查目录连通性
  4. Pass 4:检查引用计数
  5. 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/disk1

7.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: 256

7.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/disk1

7.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 +0800

inode与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磁盘与文件系统管理的全部核心内容,涵盖七大模块:

  1. 磁盘分区:lsblk、fdisk、parted、losetup,使用loop设备模拟磁盘分区
  2. 文件系统:mke2fs(ext4/ext2)、mount/umount、/etc/fstab持久化挂载
  3. 磁盘空间:df -h(文件系统级别)、du -sh(目录级别)
  4. LVM管理:pvcreate/vgcreate/lvcreate、lvextend+resize2fs在线扩容
  5. Swap交换分区:mkswap、swapon/swapoff、free -h
  6. 文件系统检查:fsck.ext4五阶段检查与修复
  7. 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

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询