Linux存储系统
📚 目录
1. 基础概念
1.1 存储的层次结构
想象存储系统像一栋楼:
┌─────────────────────────────────────┐
│ 5层: 文件和目录 (/home, /var...) │ ← 你日常操作的地方
├─────────────────────────────────────┤
│ 4层: 文件系统 (ext4, xfs...) │ ← 管理文件的规则
├─────────────────────────────────────┤
│ 3层: 逻辑卷 (LV) │ ← 可以动态调整大小
├─────────────────────────────────────┤
│ 2层: 卷组 (VG) 和 物理卷 (PV) │ ← LVM的核心
├─────────────────────────────────────┤
│ 1层: 分区 (sda1, sda2...) │ ← 硬盘的划分
├─────────────────────────────────────┤
│ 0层: 物理硬盘 (sda, sdb...) │ ← 真实的硬件
└─────────────────────────────────────┘
扩容时必须从下往上,逐层扩展!
2. 物理层:硬盘和分区
2.1 什么是硬盘?
硬盘是存储数据的物理设备,在Linux中显示为:
bash
/dev/sda # 第一块SATA/SCSI硬盘
/dev/sdb # 第二块SATA/SCSI硬盘
/dev/nvme0n1 # NVMe固态硬盘
/dev/vda # 虚拟化环境的虚拟硬盘
类比: 硬盘就像一块空地
2.2 什么是分区?
分区是把硬盘划分成多个独立区域:
硬盘 /dev/sda (500G)
├─ /dev/sda1 (1G) - BIOS引导分区
├─ /dev/sda2 (2G) - /boot 分区
└─ /dev/sda3 (497G) - 主分区(用于LVM)
类比: 分区就像把空地划分成不同的地块
查看硬盘和分区
bash
# 查看所有硬盘
lsblk
# 输出示例:
NAME SIZE TYPE MOUNTPOINT
sda 500G disk
├─sda1 1G part
├─sda2 2G part /boot
└─sda3 497G part
# 详细信息
fdisk -l /dev/sda
2.3 分区表类型
MBR (传统)
最多4个主分区
最大支持2TB硬盘
用
fdisk管理
GPT (现代)
支持128个分区
支持大于2TB的硬盘
用
gdisk或parted管理
你的系统用的是GPT
2.4 扩展分区的命令
bash
# 方法1: 使用 growpart (最简单)
growpart /dev/sda 3 # 扩展第3个分区
# 方法2: 使用 parted
parted /dev/sda resizepart 3 100%
# 方法3: 使用 fdisk (手动)
fdisk /dev/sda
# 然后交互式操作
3. 逻辑层:LVM卷管理
3.1 什么是LVM?
LVM = Logical Volume Manager (逻辑卷管理器)
传统方式的问题:
分区 → 文件系统 → 挂载点
/dev/sda3 → ext4 → /
问题: 分区大小固定,扩容很麻烦!
LVM的解决方案:
分区 → 物理卷(PV) → 卷组(VG) → 逻辑卷(LV) → 文件系统 → 挂载点
/dev/sda3 → PV → ubuntu-vg → ubuntu-lv → ext4 → /
优势: 可以动态调整大小!
3.2 LVM的三个核心概念
物理卷 (PV - Physical Volume)
是什么: 把分区或整个硬盘转换成LVM可以使用的格式
bash
# 创建物理卷
pvcreate /dev/sda3
# 查看物理卷
pvdisplay
pvs # 简洁版
# 输出示例:
PV Name VG Name PV Size Free
/dev/sda3 ubuntu-vg 326.00 GiB 0
类比: 把地块标记为"可用于建设"
卷组 (VG - Volume Group)
是什么: 把一个或多个物理卷组合成一个存储池
bash
# 创建卷组
vgcreate ubuntu-vg /dev/sda3
# 扩展卷组(添加新硬盘)
vgextend ubuntu-vg /dev/sdb
# 查看卷组
vgdisplay
vgs # 简洁版
# 输出示例:
VG Name VG Size Free
ubuntu-vg 326.00 GiB 0
类比: 把多块地合并成一个大地块
重要: 一个卷组可以包含多个物理卷!
卷组 ubuntu-vg (500G)
├─ PV: /dev/sda3 (300G)
└─ PV: /dev/sdb (200G)
逻辑卷 (LV - Logical Volume)
是什么: 从卷组中划分出来的虚拟分区
bash
# 创建逻辑卷
lvcreate -L 100G -n ubuntu-lv ubuntu-vg
# 扩展逻辑卷
lvextend -L +50G /dev/ubuntu-vg/ubuntu-lv
lvextend -l +100%FREE /dev/ubuntu-vg/ubuntu-lv # 使用所有剩余空间
# 查看逻辑卷
lvdisplay
lvs # 简洁版
# 输出示例:
LV Name VG Name LV Size
ubuntu-lv ubuntu-vg 326.00 GiB
类比: 在大地块上建房子
3.3 LVM的完整流程图
物理硬盘
↓
分区 /dev/sda3 (326G)
↓
[pvcreate] 创建物理卷
↓
物理卷 PV (326G)
↓
[vgcreate] 创建卷组
↓
卷组 VG: ubuntu-vg (326G)
↓
[lvcreate] 创建逻辑卷
↓
逻辑卷 LV: ubuntu-lv (326G)
↓
[mkfs.ext4] 创建文件系统
↓
文件系统 ext4
↓
[mount] 挂载
↓
挂载点 /
3.4 为什么要用LVM?
传统分区的问题
bash
# 传统方式
/dev/sda1 50G → /home
# 如果 /home 满了,想扩容:
# ❌ 必须删除分区重建
# ❌ 需要备份数据
# ❌ 可能需要重启
LVM的优势
bash
# LVM方式
/dev/sda3 → PV → VG → LV → /home
# 如果 /home 满了:
# ✅ 直接扩展逻辑卷
# ✅ 不需要备份数据
# ✅ 在线操作,不需要重启
lvextend -L +50G /dev/ubuntu-vg/home-lv
resize2fs /dev/ubuntu-vg/home-lv
# 完成!
LVM的灵活性
bash
# 场景1: 添加新硬盘
# 买了一块新硬盘 /dev/sdb (200G)
pvcreate /dev/sdb
vgextend ubuntu-vg /dev/sdb
# 现在卷组有 526G 了!
# 场景2: 创建多个逻辑卷
lvcreate -L 100G -n root-lv ubuntu-vg # 根分区
lvcreate -L 200G -n home-lv ubuntu-vg # 家目录
lvcreate -L 50G -n var-lv ubuntu-vg # /var
# 场景3: 动态调整
# /home 太大,/var 不够用
lvreduce -L -50G /dev/ubuntu-vg/home-lv
lvextend -L +50G /dev/ubuntu-vg/var-lv
4. 文件系统层
4.1 什么是文件系统?
文件系统定义了数据在硬盘上的组织方式
类比: 文件系统就像图书馆的分类系统
4.2 常见文件系统
bash
ext4 # Linux最常用,稳定可靠
xfs # 适合大文件,RHEL默认
btrfs # 现代文件系统,支持快照
ntfs # Windows文件系统
fat32 # U盘常用
4.3 文件系统操作
创建文件系统
bash
# 在逻辑卷上创建ext4文件系统
mkfs.ext4 /dev/ubuntu-vg/ubuntu-lv
# 创建xfs文件系统
mkfs.xfs /dev/ubuntu-vg/data-lv
挂载文件系统
bash
# 临时挂载
mount /dev/ubuntu-vg/ubuntu-lv /mnt
# 永久挂载(写入/etc/fstab)
echo "/dev/ubuntu-vg/ubuntu-lv / ext4 defaults 0 1" >> /etc/fstab
扩展文件系统
bash
# ext4文件系统
resize2fs /dev/ubuntu-vg/ubuntu-lv
# xfs文件系统
xfs_growfs /mount/point
4.4 查看文件系统
bash
# 查看挂载的文件系统
df -h
# 输出:
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/ubuntu--vg-ubuntu--lv 321G 276G 31G 91% /
# 查看文件系统类型
lsblk -f
# 查看磁盘使用情况
du -sh /var/log
du -sh /home/*
5. 完整的扩容流程
5.1 扩容的完整步骤
第0步: 在虚拟化平台扩展物理硬盘
↓
第1步: 重新扫描硬盘
↓
第2步: 扩展分区
↓
第3步: 扩展物理卷 (PV)
↓
第4步: 扩展逻辑卷 (LV)
↓
第5步: 扩展文件系统
↓
第6步: 验证
5.2 详细命令流程
第0步: 虚拟化平台操作
Proxmox: Hardware → Hard Disk → Disk Action → Resize → +200G
VMware: 编辑设置 → 硬盘 → 扩展 → 500G
云平台: 控制台 → 云盘扩容 → 500G
第1步: 重新扫描硬盘
bash
# 让系统识别新的硬盘大小
echo 1 > /sys/class/block/sda/device/rescan
# 或者重新扫描所有SCSI设备
for host in /sys/class/scsi_host/host*/scan; do
echo "- - -" > $host
done
# 验证
lsblk
fdisk -l /dev/sda
第2步: 扩展分区
bash
# 方法1: growpart (推荐)
apt-get install -y cloud-guest-utils
growpart /dev/sda 3
# 方法2: parted
parted /dev/sda resizepart 3 100%
# 方法3: fdisk (手动)
fdisk /dev/sda
# d → 3 → n → 3 → [起始扇区] → [回车] → N → w
# 验证分区是否扩展
lsblk | grep sda3
第3步: 扩展物理卷
bash
# 扩展物理卷以使用新的分区空间
pvresize /dev/sda3
# 验证
pvdisplay /dev/sda3
pvs
第4步: 扩展逻辑卷
bash
# 方法1: 使用所有剩余空间
lvextend -l +100%FREE /dev/ubuntu-vg/ubuntu-lv
# 方法2: 指定增加的大小
lvextend -L +50G /dev/ubuntu-vg/ubuntu-lv
# 方法3: 指定最终大小
lvextend -L 500G /dev/ubuntu-vg/ubuntu-lv
# 验证
lvdisplay /dev/ubuntu-vg/ubuntu-lv
lvs
第5步: 扩展文件系统
bash
# ext4文件系统
resize2fs /dev/ubuntu-vg/ubuntu-lv
# xfs文件系统
xfs_growfs /
# 验证
df -h /
第6步: 全面验证
bash
# 查看整体情况
lsblk
df -h
vgs
lvs
5.3 你的具体情况
当前状态:
- 硬盘 /dev/sda: 358G ✅ (已在Proxmox扩展)
- 分区 /dev/sda3: 326G ❌ (需要扩展)
- 物理卷: 326G ❌
- 卷组: 326G ❌
- 逻辑卷: 321G ❌
- 文件系统: 321G ❌
需要做的:
1. 修复GPT分区表
2. 扩展 sda3 分区到 358G
3. 扩展物理卷
4. 扩展逻辑卷
5. 扩展文件系统
5.4 你的扩容命令
bash
# 一键完成
parted /dev/sda print <<< "Fix" && \\
growpart /dev/sda 3 && \\
pvresize /dev/sda3 && \\
lvextend -l +100%FREE /dev/ubuntu-vg/ubuntu-lv && \\
resize2fs /dev/ubuntu-vg/ubuntu-lv && \\
df -h /
6. 常用命令速查
6.1 查看命令
bash
# 硬盘和分区
lsblk # 树状显示所有块设备
lsblk -f # 显示文件系统类型
fdisk -l # 显示所有硬盘和分区
parted -l # 显示分区表
# 物理卷
pvs # 简洁显示
pvdisplay # 详细显示
pvdisplay /dev/sda3 # 显示特定PV
# 卷组
vgs # 简洁显示
vgdisplay # 详细显示
vgdisplay ubuntu-vg # 显示特定VG
# 逻辑卷
lvs # 简洁显示
lvdisplay # 详细显示
lvdisplay /dev/ubuntu-vg/ubuntu-lv # 显示特定LV
# 文件系统
df -h # 显示挂载的文件系统
df -h / # 显示根分区
du -sh /var/* # 查看目录大小
mount # 显示所有挂载点
6.2 操作命令
bash
# 分区操作
growpart /dev/sda 3 # 扩展分区
parted /dev/sda resizepart 3 100% # 扩展到100%
fdisk /dev/sda # 交互式分区工具
# 物理卷操作
pvcreate /dev/sdb # 创建PV
pvresize /dev/sda3 # 扩展PV
pvremove /dev/sdb # 删除PV
# 卷组操作
vgcreate myvg /dev/sdb # 创建VG
vgextend ubuntu-vg /dev/sdb # 扩展VG(添加PV)
vgreduce ubuntu-vg /dev/sdb # 缩小VG(移除PV)
# 逻辑卷操作
lvcreate -L 100G -n mylv myvg # 创建LV
lvextend -L +50G /dev/myvg/mylv # 扩展LV(增加50G)
lvextend -l +100%FREE /dev/myvg/mylv # 扩展LV(使用全部空间)
lvreduce -L -50G /dev/myvg/mylv # 缩小LV
# 文件系统操作
mkfs.ext4 /dev/myvg/mylv # 创建ext4文件系统
resize2fs /dev/myvg/mylv # 扩展ext4文件系统
xfs_growfs /mount/point # 扩展xfs文件系统
6.3 诊断命令
bash
# 一键诊断脚本
cat > /tmp/diagnose.sh << 'EOF'
#!/bin/bash
echo "=== 硬盘信息 ==="
lsblk
echo -e "\\n=== 分区详情 ==="
fdisk -l 2>/dev/null | grep -E "Disk /dev|Device"
echo -e "\\n=== 物理卷 ==="
pvs
echo -e "\\n=== 卷组 ==="
vgs
echo -e "\\n=== 逻辑卷 ==="
lvs
echo -e "\\n=== 文件系统 ==="
df -h
EOF
chmod +x /tmp/diagnose.sh
/tmp/diagnose.sh
7. 实战案例
案例1: 扩展现有硬盘
场景: 虚拟机硬盘从300G扩展到500G
bash
# 1. 在Proxmox/VMware扩展硬盘到500G
# 2. 在Linux内操作
echo 1 > /sys/class/block/sda/device/rescan
growpart /dev/sda 3
pvresize /dev/sda3
lvextend -l +100%FREE /dev/ubuntu-vg/ubuntu-lv
resize2fs /dev/ubuntu-vg/ubuntu-lv
df -h /
案例2: 添加新硬盘
场景: 添加一块200G的新硬盘
bash
# 1. 在虚拟化平台添加新硬盘
# 2. 查看新硬盘
lsblk
# 假设是 /dev/sdb
# 3. 创建物理卷
pvcreate /dev/sdb
# 4. 扩展卷组
vgextend ubuntu-vg /dev/sdb
# 5. 扩展逻辑卷
lvextend -l +100%FREE /dev/ubuntu-vg/ubuntu-lv
# 6. 扩展文件系统
resize2fs /dev/ubuntu-vg/ubuntu-lv
# 7. 验证
df -h /
vgs ubuntu-vg
案例3: 创建新的逻辑卷
场景: 为/data创建独立的逻辑卷
bash
# 1. 查看卷组可用空间
vgs ubuntu-vg
# 2. 创建新逻辑卷
lvcreate -L 100G -n data-lv ubuntu-vg
# 3. 创建文件系统
mkfs.ext4 /dev/ubuntu-vg/data-lv
# 4. 创建挂载点
mkdir -p /data
# 5. 挂载
mount /dev/ubuntu-vg/data-lv /data
# 6. 永久挂载
echo "/dev/ubuntu-vg/data-lv /data ext4 defaults 0 2" >> /etc/fstab
# 7. 验证
df -h /data
案例4: 多硬盘组合
场景: 3块硬盘组成一个大的存储池
bash
# 硬盘情况:
# /dev/sda 500G (已有系统)
# /dev/sdb 1TB (新增)
# /dev/sdc 1TB (新增)
# 1. 创建物理卷
pvcreate /dev/sdb
pvcreate /dev/sdc
# 2. 创建新卷组
vgcreate data-vg /dev/sdb /dev/sdc
# 3. 创建逻辑卷(使用全部空间)
lvcreate -l 100%FREE -n data-lv data-vg
# 4. 创建文件系统
mkfs.xfs /dev/data-vg/data-lv
# 5. 挂载
mkdir -p /data
mount /dev/data-vg/data-lv /data
# 6. 验证
df -h /data
# 应该显示约2TB
案例5: 修复GPT分区表
场景: 扩展硬盘后出现GPT错误
bash
# 错误信息:
# GPT PMBR size mismatch
# The backup GPT table is not on the end of the device
# 解决方法1: parted
parted /dev/sda
# 提示Fix时输入: Fix
# 然后输入: quit
# 解决方法2: gdisk
gdisk /dev/sda
# 输入: x (专家模式)
# 输入: e (重新定位备份GPT)
# 输入: w (写入)
# 输入: Y (确认)
# 解决方法3: 自动修复
echo -e "Fix\\nquit" | parted /dev/sda ---pretend-input-tty
8. 常见问题和解决方案
问题1: 为什么df显示的大小没变?
原因: 可能某一层没有扩展
bash
# 逐层检查
lsblk | grep sda3 # 检查分区
pvs | grep sda3 # 检查物理卷
vgs # 检查卷组
lvs # 检查逻辑卷
df -h / # 检查文件系统
# 找到哪一层小,就扩展哪一层
问题2: growpart命令不存在
bash
# Ubuntu/Debian
apt-get install -y cloud-guest-utils
# CentOS/RHEL
yum install -y cloud-utils-growpart
问题3: 逻辑卷扩展后文件系统没变
原因: 忘记扩展文件系统
bash
# ext4
resize2fs /dev/ubuntu-vg/ubuntu-lv
# xfs
xfs_growfs /
问题4: 没有可用空间
bash
# 检查卷组
vgdisplay ubuntu-vg | grep Free
# 如果Free为0:
# 方案1: 扩展现有硬盘
# 方案2: 添加新硬盘
问题5: 分区起始扇区错误
现象: 使用fdisk删除重建分区后无法启动
原因: 起始扇区改变了
解决: 使用growpart,不要手动删除分区
9. 最佳实践
9.1 规划建议
bash
# 推荐的分区方案
/boot 2G # 独立分区,不用LVM
/ 50G # 根分区
/home 100G # 用户目录
/var 50G # 日志和缓存
剩余空间 不分配 # 留作将来扩展
9.2 监控建议
bash
# 定期检查磁盘使用
df -h
# 设置告警(使用率超过80%)
df -h | awk '$5+0 > 80 {print $0}'
# 查找大文件
find / -type f -size +1G -ls 2>/dev/null
9.3 安全建议
bash
# 扩容前做快照(Proxmox)
# 或者备份重要数据
# 测试环境先验证
# 生产环境在业务低峰期操作
10. 总结
核心概念回顾
物理硬盘 (/dev/sda)
↓
分区 (/dev/sda3)
↓
物理卷 (PV)
↓
卷组 (VG)
↓
逻辑卷 (LV)
↓
文件系统 (ext4)
↓
挂载点 (/)
扩容记忆口诀
硬盘扩展在平台
分区扩展用growpart
物理卷用pvresize
逻辑卷用lvextend
文件系统resize2fs
最后df验证成功
你现在需要做的
bash
# 1. 修复GPT
parted /dev/sda print <<< "Fix"
# 2. 扩展分区
growpart /dev/sda 3
# 3. 扩展物理卷
pvresize /dev/sda3
# 4. 扩展逻辑卷
lvextend -l +100%FREE /dev/ubuntu-vg/ubuntu-lv
# 5. 扩展文件系统
resize2fs /dev/ubuntu-vg/ubuntu-lv
# 6. 验证
df -h /
11. 学习路径
初级 (你现在的水平)
✅ 理解硬盘、分区、文件系统的概念
✅ 会使用 lsblk, df, fdisk 查看信息
✅ 能完成基本的扩容操作
中级
学习创建和管理LVM
理解不同文件系统的特点
掌握磁盘性能优化
高级
RAID配置
存储快照和备份
分布式存储系统
希望这份文档帮你理清了Linux存储的所有概念!
现在你可以执行扩容命令了,有任何问题随时问我! 🚀