Linux存储系统

📚 目录

  1. 基础概念

  2. 物理层:硬盘和分区

  3. 逻辑层:LVM卷管理

  4. 文件系统层

  5. 完整的扩容流程

  6. 常用命令速查

  7. 实战案例


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存储的所有概念!

现在你可以执行扩容命令了,有任何问题随时问我! 🚀