磁盘管理的重要性
磁盘满了是服务器宕机的常见原因之一。我见过不少人的服务器因为日志文件把磁盘撑爆,数据库直接挂掉。学会磁盘管理,能帮你提前预防和快速处理这类问题。
查看磁盘状态
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
|
| 文件系统 | 特点 | 适用场景 |
|---|
| ext4 | Linux默认,稳定 | 通用 |
| 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服务器性能优化。