第 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%
常见分区方案
| 方案 | /boot | swap | / | /home | 适用场景 |
|---|---|---|---|---|---|
| 简单 | 512M | 2G | 剩余 | — | 一般服务器 |
| 分离 | 512M | 2G | 20G | 剩余 | 需要数据隔离 |
| 数据库 | 512M | 4G | 20G | 数据盘 LVM | 数据库服务器 |
| Docker | 512M | — | 20G | — (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
# 各文件系统对比
| 文件系统 | 最大文件 | 最大卷 | 快照 | 压缩 | 适用场景 |
|---|---|---|---|---|---|
| ext4 | 16 TB | 1 EB | 否 | 否 | 通用、根分区 |
| XFS | 8 EB | 8 EB | 否 | 否 | 大文件、数据库 |
| Btrfs | 16 EB | 16 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 0 | 2 | 100% | 高 | 高 | 无 |
| RAID 1 | 2 | 50% | 高 | 中 | 1 盘 |
| RAID 5 | 3 | (n-1)/n | 高 | 中 | 1 盘 |
| RAID 6 | 4 | (n-2)/n | 高 | 低 | 2 盘 |
| RAID 10 | 4 | 50% | 极高 | 高 | 每组 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 场景考虑使用
deadline或noop调度器- LVM 快照会影响性能,用完及时删除
扩展阅读
上一章:第 04 章:网络配置 下一章:第 06 章:服务管理