【Linux运维极简教程】07-磁盘管理与LVM

07 - 磁盘管理与 LVM

一、磁盘管理基础

1.1 磁盘识别

bash 复制代码
# 查看所有磁盘
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)

bash 复制代码
# 对 /dev/sdb 进行分区
fdisk /dev/sdb

# 交互操作:
# n - 新建分区
# p - 主分区 / e - 扩展分区
# 分区号、起始扇区、大小
# t - 修改分区类型(如 8e 为 LVM)
# p - 打印分区表
# w - 保存并退出
# q - 不保存退出

2.3 parted 分区(GPT,> 2TB 推荐)

bash 复制代码
# 交互模式
parted /dev/sdb

# 设置分区表类型为 GPT
(parted) mklabel gpt

# 创建分区
(parted) mkpart primary 0% 100%              # 使用全部空间
(parted) mkpart primary ext4 0GB 500GB       # 指定大小

# 打印分区表
(parted) print

# 退出
(parted) quit

# 命令行一键操作
parted /dev/sdb mklabel gpt
parted /dev/sdb mkpart primary 0% 100%

2.4 分区对齐检查

bash 复制代码
# 查看分区对齐情况
parted /dev/sdb align-check optimal 1

三、文件系统

3.1 创建文件系统(格式化)

bash 复制代码
# 格式化为 ext4
mkfs.ext4 /dev/sdb1

# 格式化为 xfs
mkfs.xfs /dev/sdb1

# 格式化时指定参数
mkfs.ext4 -b 4096 -L data_disk /dev/sdb1
# -b 块大小  -L 卷标

# 格式化为 swap
mkswap /dev/sdb2

3.2 挂载与卸载

bash 复制代码
# 临时挂载
mount /dev/sdb1 /data

# 指定文件系统类型挂载
mount -t ext4 /dev/sdb1 /data

# 查看挂载情况
mount | grep sdb1
df -h /data

# 卸载
umount /data
umount /dev/sdb1

# 强制卸载(设备忙时)
umount -l /data               # 懒卸载,等不忙时自动卸载
fuser -km /data               # 杀掉占用目录的进程后再卸载

3.3 开机自动挂载 - /etc/fstab

bash 复制代码
# 编辑 /etc/fstab
# 格式:设备  挂载点  文件系统类型  挂载选项  dump  fsck顺序
/dev/sdb1    /data    ext4    defaults    0    0

# 推荐:使用 UUID 代替设备名
# 获取 UUID
blkid /dev/sdb1
# UUID="a1b2c3d4-..." /data ext4 defaults 0 0

# 测试 fstab 配置是否正确(重要!重启前必须验证)
mount -a

fstab 挂载选项

选项 说明
defaults rw, suid, dev, exec, auto, nouser, async
noexec 不允许执行二进制文件
nosuid 不允许 setuid/setgid
noatime 不更新访问时间(提升性能)
nodiratime 不更新目录访问时间
data=writeback ext4 写回模式(性能优先,数据安全降低)

3.4 swap 交换分区管理

bash 复制代码
# 查看 swap 使用情况
free -h
swapon -s

# 创建 swap 分区
mkswap /dev/sdb2
swapon /dev/sdb2

# 创建 swap 文件(不需要额外分区)
dd if=/dev/zero of=/swapfile bs=1M count=2048    # 创建 2GB 文件
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile

# 永久生效
echo "/swapfile swap swap defaults 0 0" >> /etc/fstab

# 调整 swappiness(0-100,值越低越倾向于使用物理内存)
sysctl vm.swappiness=10                         # 临时
echo "vm.swappiness=10" >> /etc/sysctl.conf     # 永久

# 关闭 swap
swapoff /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

bash 复制代码
# 1. 将分区/磁盘创建为 PV(物理卷)
pvcreate /dev/sdb1 /dev/sdc1

# 查看 PV
pvdisplay
pvs

# 2. 创建 VG(卷组)
vgcreate vg_data /dev/sdb1 /dev/sdc1

# 指定 PE 大小
vgcreate -s 16M vg_data /dev/sdb1

# 查看 VG
vgdisplay
vgs

# 3. 创建 LV(逻辑卷)
# 创建 50GB 的逻辑卷
lvcreate -L 50G -n lv_data vg_data

# 使用全部剩余空间
lvcreate -l 100%FREE -n lv_data vg_data

# 创建占 VG 50% 的逻辑卷
lvcreate -l 50%VG -n lv_data vg_data

# 查看 LV
lvdisplay
lvs

# 4. 格式化逻辑卷
mkfs.xfs /dev/vg_data/lv_data

# 5. 挂载
mkdir /data
mount /dev/vg_data/lv_data /data

# 6. 开机自动挂载
echo "/dev/vg_data/lv_data /data xfs defaults 0 0" >> /etc/fstab

4.3 LVM 扩容

场景一:VG 有剩余空间,直接扩容 LV
bash 复制代码
# 扩容 LV(+20G)
lvextend -L +20G /dev/vg_data/lv_data

# 扩容到指定大小
lvextend -L 100G /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
bash 复制代码
# 1. 新增磁盘,创建 PV
pvcreate /dev/sdd

# 2. 将 PV 加入 VG
vgextend vg_data /dev/sdd

# 3. 扩容 LV
lvextend -L +50G /dev/vg_data/lv_data

# 4. 扩展文件系统
xfs_growfs /data          # xfs
resize2fs /dev/vg_data/lv_data   # ext4

4.4 LVM 缩容

注意:xfs 文件系统不支持缩容,只有 ext4 支持。

bash 复制代码
# 1. 卸载文件系统
umount /data

# 2. 检查文件系统
e2fsck -f /dev/vg_data/lv_data

# 3. 缩小文件系统
resize2fs /dev/vg_data/lv_data 30G

# 4. 缩小 LV
lvreduce -L 30G /dev/vg_data/lv_data

# 5. 重新挂载
mount /dev/vg_data/lv_data /data

4.5 LVM 快照

LVM 快照可以创建文件系统的一致性副本,常用于备份。

bash 复制代码
# 创建快照(大小一般为源 LV 的 10%~20%)
lvcreate -L 5G -s -n lv_data_snap /dev/vg_data/lv_data

# 挂载快照
mkdir /mnt/snap
mount /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

五、实战场景

场景一:新增加磁盘并挂载

bash 复制代码
#!/bin/bash
# mount_new_disk.sh - 挂载新磁盘
DISK="/dev/sdb"
MOUNT_POINT="/data"

# 1. 确认磁盘存在
lsblk $DISK

# 2. 分区
parted $DISK mklabel gpt
parted $DISK mkpart primary xfs 0% 100%

# 3. 格式化
mkfs.xfs ${DISK}1

# 4. 创建挂载点
mkdir -p $MOUNT_POINT

# 5. 获取 UUID
UUID=$(blkid -s UUID -o value ${DISK}1)

# 6. 写入 fstab
echo "UUID=$UUID $MOUNT_POINT xfs defaults,noatime 0 0" >> /etc/fstab

# 7. 挂载并验证
mount -a
df -h $MOUNT_POINT
echo "磁盘 $DISK 已挂载到 $MOUNT_POINT"

场景二:根分区满了,通过 LVM 扩容

bash 复制代码
# 1. 查看当前情况
df -h /
lsblk
lvs

# 2. 云服务器通常可以直接添加磁盘或扩容现有磁盘
# 假设新增了 /dev/sdb

# 3. 创建 PV 并加入根分区所在的 VG
pvcreate /dev/sdb
vgextend centos /dev/sdb      # 假设 VG 名为 centos

# 4. 扩容根 LV
lvextend -l +100%FREE /dev/centos/root

# 5. 扩展文件系统
xfs_growfs /                  # CentOS 默认 xfs

# 6. 验证
df -h /

场景三:排查磁盘空间满

bash 复制代码
# 1. 查看哪个分区满了
df -h

# 2. 查看大文件
find / -type f -size +1G 2>/dev/null
du -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 | grep deleted
# 需要 kill 占用该文件的进程才能释放空间

六、小结

本篇介绍了磁盘分区(fdisk/parted)、文件系统创建与挂载、swap 管理以及 LVM 逻辑卷管理。LVM 是生产环境磁盘管理的推荐方案,其动态扩容能力可以避免停机加盘的麻烦。


上一篇06 - 网络配置与管理

下一篇08 - Shell 脚本编程入门

相关推荐
乖巧的妹子1 小时前
刷题总结知识
linux·服务器·windows
拳里剑气2 小时前
Linux:基础IO
linux·运维·服务器·io
峥嵘life2 小时前
Andorid 打开热点,关闭有线网,ifconfig卡死分析解决
java·服务器·网络
小小龙学IT2 小时前
Day 2-3:Linux 文件与目录操作
linux
ruxshui2 小时前
数据运维生产故障案例笔记
大数据·运维
三8443 小时前
基本Linux命令总结
linux·运维·服务器
隔壁阿布都3 小时前
ClickHouse完整指南
服务器·数据库·clickhouse
她叫我大水龙3 小时前
nginx 编译指南:静态编译 + 动态编译
运维·nginx
元岳数字人小元3 小时前
数字人系统源码:决定一体机长期运维稳定性的核心因素
运维·开源·人机交互·交互·源代码管理