字数 1332,阅读大约需 7 分钟
真实生产环境的存储栈往往不是单一技术,而是 RAID + LVM + LUKS + 文件系统 的多层组合。本篇给出一个可直接用于生产的完整方案。实际生产中还是需要根据自己的情况选择合适的方案!!!
一、为什么需要多层?
每层解决不同问题,组合起来既能安全、又能灵活、还能高性能。
二、典型架构图
┌──────────────────────────────────────────────────┐
│ 文件系统(ext4 / xfs) │ 用户的文件
├──────────────────────────────────────────────────┤
│ LVM LV(lv_data, lv_db, lv_log ...) │ 灵活划分
├──────────────────────────────────────────────────┤
│ LVM VG(vg_data) │ 存储池
├──────────────────────────────────────────────────┤
│ LUKS(crypt_data) │ 加密层
├──────────────────────────────────────────────────┤
│ RAID(/dev/md0 = RAID5) │ 冗余
├──────────────────────────────────────────────────┤
│ 物理盘(/dev/sdb /dev/sdc /dev/sdd /dev/sde) │
└──────────────────────────────────────────────────┘
三、完整搭建流程
3.1 硬件准备
4 块相同大小的硬盘(每块至少 1TB):
- •
/dev/sdb、/dev/sdc、/dev/sdd、/dev/sde
3.2 创建 RAID5
# 1. 创建 RAID5(3 块数据 + 1 块校验)
$ mdadm --create /dev/md0 --level=5 --raid-devices=3 --spare-devices=1 \
/dev/sdb /dev/sdc /dev/sdd /dev/sde
mdadm: array /dev/md0 started.
# 2. 查 RAID 状态
$ cat /proc/mdstat
Personalities : [raid1] [raid6] [raid5] [raid4]
md0 : active raid5 sde[4](S) sdd[2] sdc[1] sdb[0]
2096128 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/3] [UUU]
# 3. 保存 RAID 配置
$ mdadm --detail --scan >> /etc/mdadm.conf
$ update-initramfs -u # Debian/Ubuntu
$ dracut -H # RHEL 系
3.3 在 RAID 上建 LUKS
# 1. 创建加密卷(会要求输入密码)
$ cryptsetup luksFormat /dev/md0
WARNING!
========
This will overwrite data on /dev/md0 irrevocably.
Are you sure? (Type 'yes' in capital letters): YES
Enter passphrase for /dev/md0: ********
Verify passphrase: ********
# 2. 打开加密卷
$ cryptsetup open /dev/md0 crypt_data
Enter passphrase for /dev/md0: ********
# 映射后的设备是 /dev/mapper/crypt_data
# 3. 查看加密状态
$ cryptsetup status crypt_data
type: LUKS2
cipher: aes-xts-plain64
...
3.4 在 LUKS 上建 LVM
# 1. 把加密卷做成 PV
$ pvcreate /dev/mapper/crypt_data
# 2. 创建 VG
$ vgcreate vg_data /dev/mapper/crypt_data
# 3. 创建多个 LV(按业务划分)
$ lvcreate -L 100G -n lv_db vg_data
$ lvcreate -L 200G -n lv_app vg_data
$ lvcreate -L 50G -n lv_log vg_data
$ lvcreate -l 100%FREE -n lv_backup vg_data
3.5 文件系统与挂载
$ mkfs.xfs /dev/vg_data/lv_db
$ mkfs.xfs /dev/vg_data/lv_app
$ mkfs.ext4 /dev/vg_data/lv_log
$ mkfs.ext4 /dev/vg_data/lv_backup
$ mkdir -p /data/{db,app,log,backup}
$ mount /dev/vg_data/lv_db /data/db
$ mount /dev/vg_data/lv_app /data/app
$ mount /dev/vg_data/lv_log /data/log
$ mount /dev/vg_data/lv_backup /data/backup
3.6 持久化配置
# /etc/crypttab
crypt_data /dev/md0 none luks
# /etc/fstab
/dev/vg_data/lv_db /data/db xfs defaults 0 0
/dev/vg_data/lv_app /data/app xfs defaults 0 0
/dev/vg_data/lv_log /data/log ext4 defaults 0 0
/dev/vg_data/lv_backup /data/backup ext4 defaults 0 0
关键:/etc/crypttab 必须先于 /etc/fstab 生效。
四、密码与密钥管理
4.1 自动解锁(生产环境)
每次重启手动输入密码不现实。使用密钥文件:
# 1. 生成随机密钥
$ dd if=/dev/urandom of=/etc/keys/crypt_data.key bs=512 count=4
$ chmod 0400 /etc/keys/crypt_data.key
# 2. 把密钥加入 LUKS slot
$ cryptsetup luksAddKey /dev/md0 /etc/keys/crypt_data.key
Enter any existing passphrase: ********
# 3. 配置 crypttab 使用密钥
# /etc/crypttab
crypt_data /dev/md0 /etc/keys/crypt_data.key luks
4.2 TPM 解锁(更高安全)
# 用 TPM2 解锁
$ systemd-cryptenroll --tpm2-device=auto --tpm2-pcrs=0,7 /dev/md0
或 Clevis + Tang(网络绑定)。
4.3 多用户密码(多人管理)
# 加第二个用户的密码
$ cryptsetup luksAddKey /dev/md0
Enter any existing passphrase: ********
Enter new passphrase for new slot: ********
# 看 LUKS 槽位
$ cryptsetup luksDump /dev/md0 | grep "Key Slot"
Key Slot 0: ENABLED
Key Slot 1: ENABLED
Key Slot 2: DISABLED
...
五、RAID 故障处理
5.1 单盘故障
# 1. dmesg 看故障盘
$ dmesg | tail
sd 0:0:1:0: [sdc] Unhandled sense code
sd 0:0:1:0: [sdc] Result: hostbyte=DID_OK driverbyte=DRIVER_SENSE
...
# 2. 标记故障
$ mdadm --manage /dev/md0 --fail /dev/sdc
# 3. 移除
$ mdadm --manage /dev/md0 --remove /dev/sdc
# 4. 物理换新盘
# 5. 加入 RAID
$ mdadm --manage /dev/md0 --add /dev/sdc
# 6. 自动重建
$ cat /proc/mdstat
md0 : active raid5 sdc[4] sdd[2] sdb[0]
2096128 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/2] [UU_]
[>....................] recovery = 12.3% (12345/1048064)
5.2 多盘故障
# RAID5 只能容忍 1 盘故障
# RAID6 可以容忍 2 盘
# 多盘故障会丢数据,需要从备份恢复
六、性能与监控
6.1 性能预期
6.2 监控项
# RAID 状态
$ mdadm --detail /dev/md0
# I/O 监控
$ iostat -x 1
# LVM 监控
$ lvs -o data_percent,metadata_percent
# LUKS 状态
$ cryptsetup status crypt_data
6.3 SMART 健康
$ yum install -y smartmontools # 或 apt
$ smartctl -a /dev/sdb
$ smartctl -t short /dev/sdb # 短测试
$ smartctl -t long /dev/sdb # 长测试
七、容量规划案例
场景:1TB × 4 盘,部署数据库 + 应用
RAID5(4 盘,1 备):可用 3TB
LUKS:基本无开销(< 1%)
LVM VG:约 2.99TB
业务划分:
lv_db 500G 主库
lv_log 100G redo log / binlog
lv_app 1T 应用
lv_backup 1.4T 备份空间
八、常见误区
- 1. "LVM RAID 比 mdadm RAID 好":不一定。LVM RAID 配置灵活,但性能调优和监控生态不如 mdadm 成熟
- 2. "LUKS 没性能损失":加密层有 5~15% 的 CPU 消耗。需要 AES-NI 硬件加速
- 3. "RAID 1 比 RAID 5 安全":RAID5 重建慢,大盘(>2T)重建出错概率反而高
- 4. "加密就不需要备份":加密保护数据机密性,不防数据丢失
九、本篇小结
生产环境标准存储栈:
物理盘 → mdadm RAID → LUKS 加密 → LVM 分层 → 文件系统
关键命令:
- • RAID:
mdadm --create / --manage - • LUKS:
cryptsetup luksFormat / open / luksAddKey - • 监控:
cat /proc/mdstat + iostat + lvs + smartctl
最佳实践:
- • 用
crypttab + 密钥文件实现自动解锁 - • RAID 容量利用率:RAID5/6 适合读多写少,RAID10 适合写密集