强曰为道

与天地相似,故不违。知周乎万物,而道济天下,故不过。旁行而不流,乐天知命,故不忧.
文档目录

第 05 章:存储管理

第 05 章:存储管理

管理磁盘分区、逻辑卷、文件系统和数据加密。

5.1 磁盘分区

常用磁盘工具

# 查看磁盘信息
lsblk                      # 列出所有块设备
fdisk -l                   # 查看分区表
blkid                      # 查看块设备 UUID 和类型
cat /proc/partitions       # 内核识别的分区

# 查看磁盘健康状态
apk add smartmontools
smartctl -a /dev/sda       # 查看 SMART 信息
smartctl -t short /dev/sda # 运行短测试

fdisk 分区

# 交互式分区
fdisk /dev/sdb

# 常用 fdisk 命令:
# n - 新建分区
# d - 删除分区
# p - 打印分区表
# t - 更改分区类型
# w - 写入并退出
# q - 不保存退出

# 创建 GPT 分区表
fdisk /dev/sdb
# g    (创建 GPT 分区表)
# n    (新建分区)
# 1    (分区号)
#      (起始扇区,默认)
# +10G (大小)
# n    (第二个分区)
# 2
#      (起始)
#      (使用剩余空间)
# w    (写入)

# 使用 sgdisk(GPT 专用工具,支持脚本)
apk add gptfdisk
sgdisk -n 1:0:+512M -t 1:ef00 -n 2:0:0 -t 2:8300 /dev/sdb
# -n 1:0:+512M  分区1,从默认位置开始,512MB
# -t 1:ef00     类型为 EFI System Partition
# -n 2:0:0      分区2,使用剩余空间
# -t 2:8300     类型为 Linux filesystem

parted 分区

# 使用 parted 进行高级分区
apk add parted

# 创建分区方案
parted /dev/sdb
# mklabel gpt
# mkpart primary ext4 1MiB 512MiB
# mkpart primary ext4 512MiB 100%
# set 1 boot on
# quit

# 单行命令方式
parted -s /dev/sdb mklabel gpt \
  mkpart primary ext4 1MiB 512MiB \
  mkpart primary ext4 512MiB 100%

常见分区方案

方案/bootswap//home适用场景
简单512M2G剩余一般服务器
分离512M2G20G剩余需要数据隔离
数据库512M4G20G数据盘 LVM数据库服务器
Docker512M20G— (Docker 用剩余)容器主机

5.2 文件系统

创建文件系统

# ext4(最常用)
mkfs.ext4 /dev/sdb1
mkfs.ext4 -L "data" /dev/sdb1       # 设置标签
mkfs.ext4 -b 4096 -i 8192 /dev/sdb1 # 指定块大小和 inode 比例

# XFS(适合大文件)
apk add xfsprogs
mkfs.xfs /dev/sdb2
mkfs.xfs -L "bigdata" /dev/sdb2

# Btrfs(支持快照和压缩)
apk add btrfs-progs
mkfs.btrfs /dev/sdb2
mkfs.btrfs -L "snaps" -d single /dev/sdb2

# swap
mkswap /dev/sdb3
swapon /dev/sdb3

# 各文件系统对比
文件系统最大文件最大卷快照压缩适用场景
ext416 TB1 EB通用、根分区
XFS8 EB8 EB大文件、数据库
Btrfs16 EB16 EB备份、快照
tmpfs内存内存临时文件

挂载文件系统

# 临时挂载
mount /dev/sdb1 /mnt/data
mount -t xfs /dev/sdb2 /mnt/xfs
mount -o ro /dev/sdb3 /mnt/readonly   # 只读挂载

# 查看挂载
mount | grep sdb
findmnt
df -h

# 卸载
umount /mnt/data
umount -l /mnt/data  # 延迟卸载(忙时)

# 持久化挂载 (/etc/fstab)
cat >> /etc/fstab << 'EOF'
# <设备>              <挂载点>  <类型>  <选项>                          <dump> <fsck>
UUID=xxxx-xxxx        /         ext4    defaults,noatime                0      1
UUID=yyyy-yyyy        /boot     ext4    defaults                        0      2
UUID=zzzz-zzzz        /home     ext4    defaults,noatime,nosuid,nodev   0      2
UUID=aaaa-aaaa        /data     xfs     defaults,noatime                0      0
/dev/sdb3             none      swap    sw                              0      0
tmpfs                 /tmp      tmpfs   defaults,noexec,nosuid,size=2G  0      0
EOF

# 使用 UUID 获取
blkid /dev/sdb1

# 测试 fstab
mount -a

tmpfs 内存文件系统

# /tmp 使用 tmpfs(减少磁盘 I/O)
echo "tmpfs /tmp tmpfs defaults,noexec,nosuid,size=2G 0 0" >> /etc/fstab
mount /tmp

# /run 使用 tmpfs(Alpine 默认)
# /dev/shm 使用 tmpfs(共享内存)

5.3 LVM 逻辑卷管理

LVM(Logical Volume Manager)提供灵活的存储管理。

LVM 架构

┌──────────┐   ┌──────────┐   ┌──────────┐
│ 物理磁盘  │   │ 物理磁盘  │   │ 物理磁盘  │
│ /dev/sdb │   │ /dev/sdc │   │ /dev/sdd │
└────┬─────┘   └────┬─────┘   └────┬─────┘
     │              │              │
     ▼              ▼              ▼
┌──────────────────────────────────────┐
│       卷组 (VG): data-vg            │
└──────┬──────────┬──────────┬─────────┘
       │          │          │
       ▼          ▼          ▼
┌──────────┐ ┌──────────┐ ┌──────────┐
│ 逻辑卷   │ │ 逻辑卷   │ │ 逻辑卷   │
│ app-lv   │ │ db-lv    │ │ log-lv   │
│ 20G      │ │ 50G      │ │ 10G      │
└──────────┘ └──────────┘ └──────────┘

LVM 操作

# 安装 LVM
apk add lvm2

# 创建物理卷 (Physical Volume)
pvcreate /dev/sdb
pvcreate /dev/sdc
pvcreate /dev/sdd

# 查看物理卷
pvs
pvdisplay

# 创建卷组 (Volume Group)
vgcreate data-vg /dev/sdb /dev/sdc

# 扩展卷组
vgextend data-vg /dev/sdd

# 查看卷组
vgs
vgdisplay

# 创建逻辑卷 (Logical Volume)
lvcreate -L 20G -n app-lv data-vg
lvcreate -l 50%FREE -n db-lv data-vg    # 使用 50% 剩余空间
lvcreate -l 100%FREE -n log-lv data-vg  # 使用所有剩余空间

# 查看逻辑卷
lvs
lvdisplay

# 格式化并挂载
mkfs.ext4 /dev/data-vg/app-lv
mkdir -p /opt/app
mount /dev/data-vg/app-lv /opt/app

LVM 扩容

# 扩展逻辑卷
lvextend -L +10G /dev/data-vg/app-lv    # 增加 10G
lvextend -l +100%FREE /dev/data-vg/app-lv  # 使用所有剩余空间

# 扩展文件系统
resize2fs /dev/data-vg/app-lv       # ext4
xfs_growfs /opt/app                  # XFS

# 一步完成扩展+文件系统调整
lvextend -r -L +10G /dev/data-vg/app-lv  # -r 自动调整文件系统

LVM 快照

# 创建快照(用于备份)
lvcreate -L 5G -s -n app-snap /dev/data-vg/app-lv

# 挂载快照
mkdir /mnt/snap
mount /dev/data-vg/app-snap /mnt/snap

# 备份快照
tar czf /backup/app-$(date +%Y%m%d).tar.gz -C /mnt/snap .

# 恢复快照
umount /mnt/snap
lvconvert --merge /dev/data-vg/app-snap

# 删除快照
lvremove /dev/data-vg/app-snap

自动扩展(Thin Provisioning)

# 创建精简池
lvcreate -L 100G --thinpool thin-pool data-vg

# 创建精简卷(可以超额分配)
lvcreate -V 200G --thin -n thin-vol1 data-vg/thin-pool
lvcreate -V 200G --thin -n thin-vol2 data-vg/thin-pool

# 查看使用率
lvs -o+data_percent,metadata_percent data-vg/thin-pool

5.4 磁盘加密(LUKS)

# 安装加密工具
apk add cryptsetup

# 加密分区
cryptsetup luksFormat /dev/sdb1
# 输入 YES 确认
# 设置密码

# 打开加密分区
cryptsetup luksOpen /dev/sdb1 encrypted-data

# 格式化
mkfs.ext4 /dev/mapper/encrypted-data

# 挂载
mkdir -p /mnt/encrypted
mount /dev/mapper/encrypted-data /mnt/encrypted

# 关闭加密分区
umount /mnt/encrypted
cryptsetup luksClose encrypted-data

自动解锁(密钥文件)

# 生成密钥文件
dd if=/dev/urandom of=/root/.luks-key bs=1024 count=4
chmod 400 /root/.luks-key

# 添加密钥到 LUKS 分区
cryptsetup luksAddKey /dev/sdb1 /root/.luks-key

# /etc/crypttab 配置自动解锁
cat > /etc/crypttab << 'EOF'
# <name>       <device>     <key>              <options>
encrypted-data /dev/sdb1    /root/.luks-key    luks
EOF

# /etc/fstab
echo "/dev/mapper/encrypted-data /mnt/encrypted ext4 defaults 0 2" >> /etc/fstab

# LUKS 备份头(重要!用于恢复)
cryptsetup luksHeaderBackup /dev/sdb1 --header-backup-file /root/sdb1-luks-header.img

LUKS 加密 + LVM 组合

# 这是生产环境推荐方案
# 1. 创建加密分区
cryptsetup luksFormat /dev/sdb1
cryptsetup luksOpen /dev/sdb1 crypt-lvm

# 2. 在加密分区内创建 LVM
pvcreate /dev/mapper/crypt-lvm
vgcreate secure-vg /dev/mapper/crypt-lvm
lvcreate -L 20G -n root-lv secure-vg
lvcreate -L 4G -n swap-lv secure-vg
lvcreate -l 100%FREE -n data-lv secure-vg

# 3. 格式化
mkfs.ext4 /dev/secure-vg/root-lv
mkfs.ext4 /dev/secure-vg/data-lv
mkswap /dev/secure-vg/swap-lv

5.5 RAID 配置

# 安装 mdadm
apk add mdadm

# 创建 RAID 1(镜像)
mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sdb /dev/sdc

# 创建 RAID 5(带奇偶校验)
mdadm --create /dev/md0 --level=5 --raid-devices=3 /dev/sdb /dev/sdc /dev/sdd

# 查看 RAID 状态
cat /proc/mdstat
mdadm --detail /dev/md0

# 保存配置
mdadm --detail --scan >> /etc/mdadm.conf

# 开机自动组装
rc-update add mdadm boot
RAID 级别最少磁盘可用空间读性能写性能容错
RAID 02100%
RAID 1250%1 盘
RAID 53(n-1)/n1 盘
RAID 64(n-2)/n2 盘
RAID 10450%极高每组 1 盘

5.6 磁盘配额

# 安装配额工具
apk add quota

# 在 /etc/fstab 中启用配额
# 修改挂载选项: defaults,usrquota,grpquota

# 重新挂载
mount -o remount /home

# 初始化配额
quotacheck -cum /home
quotaon /home

# 设置用户配额
edquota -u myuser
# 设置 soft/hard 限制(单位 KB)

# 查看配额
repquota -a
quota -u myuser

5.7 存储监控脚本

cat > /usr/local/bin/storage-monitor << 'SCRIPT'
#!/bin/sh
echo "=== 磁盘使用 ==="
df -h | grep -E '^/dev|Filesystem'
echo ""

echo "=== inode 使用 ==="
df -i | grep -E '^/dev|Filesystem'
echo ""

echo "=== LVM 状态 ==="
echo "Physical Volumes:"; pvs 2>/dev/null
echo "Volume Groups:"; vgs 2>/dev/null
echo "Logical Volumes:"; lvs 2>/dev/null
echo ""

echo "=== 大文件 TOP 10 ==="
find / -xdev -type f -size +10M -exec ls -lh {} \; 2>/dev/null | sort -k5 -h | tail -10
echo ""

echo "=== 磁盘 IO 统计 ==="
cat /proc/diskstats | head -5
SCRIPT
chmod +x /usr/local/bin/storage-monitor

5.8 注意事项

⚠️ 数据安全

  • LUKS 密钥文件必须离线备份
  • LVM 快照不是备份的替代品
  • RAID 不等于备份
  • 操作分区前务必备份重要数据

💡 性能建议

  • SSD 使用 noatime 挂载选项减少写入
  • 数据库使用 XFS 或专用分区
  • 高 I/O 场景考虑使用 deadlinenoop 调度器
  • LVM 快照会影响性能,用完及时删除

扩展阅读


上一章第 04 章:网络配置 下一章第 06 章:服务管理