> Linux磁盘管理:分区、挂载与扩容实操

磁盘管理的重要性

磁盘满了是服务器宕机的常见原因之一。我见过不少人的服务器因为日志文件把磁盘撑爆,数据库直接挂掉。学会磁盘管理,能帮你提前预防和快速处理这类问题。

查看磁盘状态

df:查看磁盘使用情况

1
2
3
4
5
6
7
8
$ df -h
Filesystem      Size  Used Avail Use% Mounted on
udev            1.9G     0  1.9G   0% /dev
tmpfs           394M  1.1M  393M   1% /run
/dev/vda1        40G   12G   26G  32% /
tmpfs           2.0G     0  2.0G   0% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
/dev/vdb1       100G   45G   51G  47% /data
参数作用
-h人性化显示(GB/MB)
-T显示文件系统类型
-i显示inode使用情况

du:查看目录大小

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
# 查看当前目录下各子目录大小
$ du -sh /var/*
4.0K    /var/backups
128M    /var/cache
2.3G    /var/lib
850M    /var/log
4.0K    /var/mail
12G     /var/www

# 找出占用空间最大的10个目录
$ du -h /var/ --max-depth=2 | sort -rh | head -10
12G     /var/www
8.5G    /var/www/mysite
2.3G    /var/lib
1.8G    /var/lib/mysql
850M    /var/log
600M    /var/log/nginx

lsblk:查看块设备

1
2
3
4
5
6
$ lsblk
NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
vda    252:0    0    40G  0 disk
└─vda1 252:1    0    40G  0 part /
vdb    252:16   0   100G  0 disk
└─vdb1 252:17   0   100G  0 part /data

fdisk:查看分区详情

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
$ sudo 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

Device     Boot Start      End  Sectors Size Id Type
/dev/vda1  *     2048 83886046 83883999  40G 83 Linux

Disk /dev/vdb: 100 GiB, 107374182400 bytes, 209715200 sectors
Device     Boot Start       End   Sectors  Size Id Type
/dev/vdb1        2048 209715199 209713152  100G 83 Linux

新磁盘分区与挂载

当你给VPS添加了新硬盘(比如数据盘),需要手动分区和挂载。

第一步:确认新磁盘

1
2
3
4
5
$ lsblk
NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
vda    252:0    0    40G  0 disk
└─vda1 252:1    0    40G  0 part /
vdb    252:16   0   100G  0 disk     ← 这个是新磁盘,还没分区

第二步:创建分区

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
$ sudo fdisk /dev/vdb

Command (m for help): n        # 新建分区
Partition type
   p   primary
Select (default p): p
Partition number (1-4, default 1): 1
First sector (2048-209715199, default 2048):    # 直接回车
Last sector (2048-209715199, default 209715199): # 直接回车

Created a new partition 1 of type 'Linux' and of size 100 GiB.

Command (m for help): w        # 写入并退出
The partition table has been altered.

第三步:格式化

1
2
3
4
5
6
7
8
$ sudo mkfs.ext4 /dev/vdb1
mke2fs 1.46.5 (30-Dec-2021)
Creating filesystem with 26214144 4k blocks and 6553600 inodes
Filesystem UUID: a1b2c3d4-e5f6-7890-abcd-ef1234567890
Allocating group tables: done
Writing inode tables: done
Creating journal (131072 blocks): done
Writing superblocks and filesystem accounting information: done
文件系统特点适用场景
ext4Linux默认,稳定通用
xfs大文件性能好数据库、大文件存储
btrfs支持快照、压缩需要高级特性

第四步:挂载

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# 创建挂载点
$ sudo mkdir -p /data

# 临时挂载
$ sudo mount /dev/vdb1 /data

# 验证
$ df -h /data
Filesystem      Size  Used Avail Use% Mounted on
/dev/vdb1        98G   24K   93G   1% /data

第五步:开机自动挂载

编辑 /etc/fstab

1
2
3
4
5
6
7
# 先获取UUID
$ sudo blkid /dev/vdb1
/dev/vdb1: UUID="a1b2c3d4-e5f6-7890-abcd-ef1234567890" TYPE="ext4"

$ sudo vim /etc/fstab
# 添加这一行:
UUID=a1b2c3d4-e5f6-7890-abcd-ef1234567890 /data ext4 defaults 0 2
1
2
3
4
5
# 测试fstab配置是否正确(很重要!)
$ sudo mount -a
# 没有报错就说明配置正确

# 如果fstab配错了,服务器可能无法启动!

磁盘空间不足处理

快速排查

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
# 步骤1:查看整体使用情况
$ df -h
/dev/vda1        40G   38G  0.5G  99% /    ← 快满了!

# 步骤2:找出大目录
$ sudo du -h / --max-depth=1 | sort -rh | head -10
25G     /var
8G      /home
3G      /usr
1G      /opt

# 步骤3:深入排查
$ sudo du -h /var --max-depth=1 | sort -rh | head -5
18G     /var/log
5G      /var/lib
1.5G    /var/cache

# 找到了!日志文件占了18G

清理方法

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# 清理系统日志
$ sudo journalctl --vacuum-size=500M
Vacuuming done, freed 1.2G of archived journals

# 清理旧内核
$ sudo apt autoremove --purge
After this operation, 456 MB disk space will be freed.

# 清理apt缓存
$ sudo apt clean

LVM:灵活的磁盘管理

LVM(Logical Volume Manager)允许你动态调整分区大小,不用重新格式化。

LVM概念

概念缩写说明
物理卷PV实际的磁盘或分区
卷组VG多个PV组成的"大池子"
逻辑卷LV从VG中划分出来的"虚拟分区"
1
磁盘 → PV → VG → LV → 文件系统

LVM操作

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
# 创建物理卷
$ sudo pvcreate /dev/vdb
Physical volume "/dev/vdb" successfully created.

# 创建卷组
$ sudo vgcreate data_vg /dev/vdb
Volume group "data_vg" successfully created.

# 创建逻辑卷(使用80%的空间)
$ sudo lvcreate -l 80%FREE -n data_lv data_vg
Logical volume "data_lv" created.

# 格式化
$ sudo mkfs.ext4 /dev/data_vg/data_lv

# 挂载
$ sudo mount /dev/data_vg/data_lv /data

LVM扩容

这是LVM最爽的地方——在线扩容,不用停服务:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# 假设你添加了新磁盘 /dev/vdc
$ sudo pvcreate /dev/vdc
$ sudo vgextend data_vg /dev/vdc    # 扩展卷组
$ sudo lvextend -l +100%FREE /dev/data_vg/data_lv  # 扩展逻辑卷
$ sudo resize2fs /dev/data_vg/data_lv  # 扩展文件系统

$ df -h /data
Filesystem                   Size  Used Avail Use% Mounted on
/dev/mapper/data_vg-data_lv  196G   45G  142G  24% /data
# 容量从100G扩到了200G,全程在线不停机

常见问题

inode用完了

1
2
3
4
5
6
7
$ df -i
Filesystem      Inodes  IUsed   IFree IUse% Mounted on
/dev/vda1      2621440 2621440      0  100% /

# inode用完了但磁盘还有空间,通常是海量小文件导致
$ find / -xdev -type d | while read dir; do echo "$(ls -a "$dir" 2>/dev/null | wc -l) $dir"; done | sort -rn | head -5
# 找出文件最多的目录然后清理

总结

磁盘管理的核心操作就是:查看(df/du)、分区(fdisk)、格式化(mkfs)、挂载(mount/fstab)。如果条件允许,建议使用LVM,方便后续扩容。

关于日志清理的更多技巧,推荐阅读Linux日志管理与分析。服务器性能优化方面,可以看Linux服务器性能优化

磁盘管理 分区 挂载 LVM
cd ..