07 - 磁盘管理与 LVM
一、磁盘管理基础
1.1 磁盘识别
# 查看所有磁盘lsblk# 最直观fdisk-l# 详细信息ls-l/dev/sd*# 设备文件# 查看磁盘使用情况df-h# 文件系统使用情况df-Th# 显示文件系统类型df-i# 查看 inode 使用情况# 查看目录/文件占用空间du-sh/var/log# 查看目录总大小du-sh/*|sort-rh# 根目录下各目录大小排序du-h--max-depth=1/var# 查看一级子目录大小1.2 磁盘命名规则
| 设备名 | 说明 |
|---|---|
| /dev/sda | 第一块 SCSI/SATA/USB 磁盘 |
| /dev/sdb | 第二块磁盘 |
| /dev/nvme0n1 | 第一块 NVMe SSD |
| /dev/vda | 虚拟磁盘(KVM) |
| /dev/sda1 | 第一块磁盘的第一个分区 |
二、磁盘分区
2.1 分区表类型
| 类型 | 最大磁盘 | 最大分区数 | 说明 |
|---|---|---|---|
| MBR (msdos) | 2TB | 4 主分区(或 3 主 + 1 扩展) | 传统方案 |
| GPT | 18EB | 128 分区 | 现代推荐 |
2.2 fdisk 分区(MBR,< 2TB)
# 对 /dev/sdb 进行分区fdisk/dev/sdb# 交互操作:# n - 新建分区# p - 主分区 / e - 扩展分区# 分区号、起始扇区、大小# t - 修改分区类型(如 8e 为 LVM)# p - 打印分区表# w - 保存并退出# q - 不保存退出2.3 parted 分区(GPT,> 2TB 推荐)
# 交互模式parted/dev/sdb# 设置分区表类型为 GPT(parted)mklabel gpt# 创建分区(parted)mkpart primary0%100%# 使用全部空间(parted)mkpart primary ext4 0GB 500GB# 指定大小# 打印分区表(parted)print# 退出(parted)quit# 命令行一键操作parted/dev/sdb mklabel gptparted/dev/sdb mkpart primary0%100%2.4 分区对齐检查
# 查看分区对齐情况parted/dev/sdb align-check optimal1三、文件系统
3.1 创建文件系统(格式化)
# 格式化为 ext4mkfs.ext4 /dev/sdb1# 格式化为 xfsmkfs.xfs /dev/sdb1# 格式化时指定参数mkfs.ext4-b4096-Ldata_disk /dev/sdb1# -b 块大小 -L 卷标# 格式化为 swapmkswap/dev/sdb23.2 挂载与卸载
# 临时挂载mount/dev/sdb1 /data# 指定文件系统类型挂载mount-text4 /dev/sdb1 /data# 查看挂载情况mount|grepsdb1df-h/data# 卸载umount/dataumount/dev/sdb1# 强制卸载(设备忙时)umount-l/data# 懒卸载,等不忙时自动卸载fuser-km/data# 杀掉占用目录的进程后再卸载3.3 开机自动挂载 - /etc/fstab
# 编辑 /etc/fstab# 格式:设备 挂载点 文件系统类型 挂载选项 dump fsck顺序/dev/sdb1 /data ext4 defaults00# 推荐:使用 UUID 代替设备名# 获取 UUIDblkid /dev/sdb1# UUID="a1b2c3d4-..." /data ext4 defaults 0 0# 测试 fstab 配置是否正确(重要!重启前必须验证)mount-afstab 挂载选项
| 选项 | 说明 |
|---|---|
| defaults | rw, suid, dev, exec, auto, nouser, async |
| noexec | 不允许执行二进制文件 |
| nosuid | 不允许 setuid/setgid |
| noatime | 不更新访问时间(提升性能) |
| nodiratime | 不更新目录访问时间 |
| data=writeback | ext4 写回模式(性能优先,数据安全降低) |
3.4 swap 交换分区管理
# 查看 swap 使用情况free-hswapon-s# 创建 swap 分区mkswap/dev/sdb2swapon/dev/sdb2# 创建 swap 文件(不需要额外分区)ddif=/dev/zeroof=/swapfilebs=1Mcount=2048# 创建 2GB 文件chmod600/swapfilemkswap/swapfileswapon/swapfile# 永久生效echo"/swapfile swap swap defaults 0 0">>/etc/fstab# 调整 swappiness(0-100,值越低越倾向于使用物理内存)sysctlvm.swappiness=10# 临时echo"vm.swappiness=10">>/etc/sysctl.conf# 永久# 关闭 swapswapoff /swapfile四、LVM 逻辑卷管理
LVM(Logical Volume Manager)是 Linux 的高级磁盘管理方案,支持动态扩容、快照等功能。
4.1 LVM 架构
物理磁盘 (PV) └── 卷组 (VG) └── 逻辑卷 (LV) └── 文件系统PV (Physical Volume) 物理卷,磁盘或分区 VG (Volume Group) 卷组,PV 的集合 LV (Logical Volume) 逻辑卷,从 VG 中分配空间 PE (Physical Extent) 最小分配单元(默认 4MB)4.2 创建 LVM
# 1. 将分区/磁盘创建为 PV(物理卷)pvcreate /dev/sdb1 /dev/sdc1# 查看 PVpvdisplay pvs# 2. 创建 VG(卷组)vgcreate vg_data /dev/sdb1 /dev/sdc1# 指定 PE 大小vgcreate-s16M vg_data /dev/sdb1# 查看 VGvgdisplay vgs# 3. 创建 LV(逻辑卷)# 创建 50GB 的逻辑卷lvcreate-L50G-nlv_data vg_data# 使用全部剩余空间lvcreate-l100%FREE-nlv_data vg_data# 创建占 VG 50% 的逻辑卷lvcreate-l50%VG-nlv_data vg_data# 查看 LVlvdisplay lvs# 4. 格式化逻辑卷mkfs.xfs /dev/vg_data/lv_data# 5. 挂载mkdir/datamount/dev/vg_data/lv_data /data# 6. 开机自动挂载echo"/dev/vg_data/lv_data /data xfs defaults 0 0">>/etc/fstab4.3 LVM 扩容
场景一:VG 有剩余空间,直接扩容 LV
# 扩容 LV(+20G)lvextend-L+20G /dev/vg_data/lv_data# 扩容到指定大小lvextend-L100G /dev/vg_data/lv_data# 使用全部剩余空间lvextend-l+100%FREE /dev/vg_data/lv_data# 扩展文件系统(必须!否则操作系统看不到新空间)# xfs 文件系统xfs_growfs /data# ext4 文件系统resize2fs /dev/vg_data/lv_data场景二:VG 没有剩余空间,先扩容 VG
# 1. 新增磁盘,创建 PVpvcreate /dev/sdd# 2. 将 PV 加入 VGvgextend vg_data /dev/sdd# 3. 扩容 LVlvextend-L+50G /dev/vg_data/lv_data# 4. 扩展文件系统xfs_growfs /data# xfsresize2fs /dev/vg_data/lv_data# ext44.4 LVM 缩容
注意:xfs 文件系统不支持缩容,只有 ext4 支持。
# 1. 卸载文件系统umount/data# 2. 检查文件系统e2fsck-f/dev/vg_data/lv_data# 3. 缩小文件系统resize2fs /dev/vg_data/lv_data 30G# 4. 缩小 LVlvreduce-L30G /dev/vg_data/lv_data# 5. 重新挂载mount/dev/vg_data/lv_data /data4.5 LVM 快照
LVM 快照可以创建文件系统的一致性副本,常用于备份。
# 创建快照(大小一般为源 LV 的 10%~20%)lvcreate-L5G-s-nlv_data_snap /dev/vg_data/lv_data# 挂载快照mkdir/mnt/snapmount/dev/vg_data/lv_data_snap /mnt/snap# 从快照中备份数据tar-czf/backup/data_snapshot.tar.gz-C/mnt/snap.# 备份完成后删除快照umount/mnt/snap lvremove-f/dev/vg_data/lv_data_snap五、实战场景
场景一:新增加磁盘并挂载
#!/bin/bash# mount_new_disk.sh - 挂载新磁盘DISK="/dev/sdb"MOUNT_POINT="/data"# 1. 确认磁盘存在lsblk$DISK# 2. 分区parted$DISKmklabel gptparted$DISKmkpart primary xfs0%100%# 3. 格式化mkfs.xfs${DISK}1# 4. 创建挂载点mkdir-p$MOUNT_POINT# 5. 获取 UUIDUUID=$(blkid-sUUID-ovalue ${DISK}1)# 6. 写入 fstabecho"UUID=$UUID$MOUNT_POINTxfs defaults,noatime 0 0">>/etc/fstab# 7. 挂载并验证mount-adf-h$MOUNT_POINTecho"磁盘$DISK已挂载到$MOUNT_POINT"场景二:根分区满了,通过 LVM 扩容
# 1. 查看当前情况df-h/ lsblk lvs# 2. 云服务器通常可以直接添加磁盘或扩容现有磁盘# 假设新增了 /dev/sdb# 3. 创建 PV 并加入根分区所在的 VGpvcreate /dev/sdb vgextend centos /dev/sdb# 假设 VG 名为 centos# 4. 扩容根 LVlvextend-l+100%FREE /dev/centos/root# 5. 扩展文件系统xfs_growfs /# CentOS 默认 xfs# 6. 验证df-h/场景三:排查磁盘空间满
# 1. 查看哪个分区满了df-h# 2. 查看大文件find/-typef-size+1G2>/dev/nulldu-ah/|sort-rh|head-20# 3. 常见空间杀手:日志文件du-sh/var/log/* journalctl --disk-usage# 4. 清理 journal 日志journalctl --vacuum-time=7d journalctl --vacuum-size=500M# 5. 查找已删除但未释放空间的文件lsof|grepdeleted# 需要 kill 占用该文件的进程才能释放空间六、小结
本篇介绍了磁盘分区(fdisk/parted)、文件系统创建与挂载、swap 管理以及 LVM 逻辑卷管理。LVM 是生产环境磁盘管理的推荐方案,其动态扩容能力可以避免停机加盘的麻烦。
上一篇:06 - 网络配置与管理
下一篇:08 - Shell 脚本编程入门