《UNIX/Linux系统管理技术手册-读书笔记-第二十章

存储

1. 存储硬件

1.1 机械硬盘 vs 固态盘(SSD)

对比维度 机械硬盘(HDD) 固态盘(SSD)
典型容量 <16TB <2TB
随机访问时间 ~8ms ~0.25ms(快30倍+
顺序读取 ~200MB/s ~450MB/s
随机读取 ~2MB/s ~450MB/s(快200倍+
IOPS ~150 ops/s ~100,000 ops/s
价格(2017) ~$0.03/GB ~$0.26/GB
写入寿命 无限制 有限(~10万次/页)
故障模式 渐进式(坏块→机械故障) 突发性(不可纠正读取错误常见)

核心结论

  • SSD优势在随机I/O(数据库、Web应用),顺序读写提升有限
  • SSD故障更隐蔽——不可纠正读取错误常见(最差型号63%设备经历过),需系统化监控
  • TRIM对SSD性能维护至关重要,确保文件系统启用TRIM支持

1.2 硬盘可靠性数据

数据来源 关键发现
Google研究(2007) 2年以上硬盘年故障率(AFR)>6%,5年存活率<75%
Backblaze数据 早期故障→2~3年蜜月期→AFR急剧攀升
制造商MTBF ~120万小时(年AFR 0.7%),这是稳定期上限,实际应除以7.5估算5年故障率
SMART预测参数 扫描错误计数、重分配计数、离线重分配计数、试用扇区数非零 → 60天内故障概率提高14~39倍

1.3 存储接口

接口 速度 特点 适用场景
SATA 6Gbit/s 主流,支持热插拔(理论),便宜 通用存储
SAS 12Gbit/s 企业级,队列深度数千,支持大量设备 服务器、企业存储
PCIe(NVMe) 8GT/s起(×16可达15GB/s+) 极高速,SSD原生接口 高性能SSD
M.2 SATA/PCIe/USB 小型化,便携式计算机 笔记本SSD
USB 3.1 10Gbit/s 外置存储 便携、备份

关键选型

  • 1Gbit/s以上以太网环境,必须启用自动协商(IEEE标准强制)
  • SAS vs SATA:SAS更贵但队列深度更大,SATA已基本追平性能差距。企业级仍用SAS划分市场层次

1.4 高级格式化(Advanced Format)与对齐

类型 扇区大小 说明
512n 512字节 旧设备,已停产
512e 内部4KiB,模拟512字节 当前主流,需4KiB对齐
4Kn 4KiB 未来趋势,需软硬件全面支持

对齐至关重要:4KiB物理扇区与文件系统簇不对齐 → 读写放大 → 性能下降。现代分区工具(parted、gpart)默认自动对齐到1MiB边界。

2. 存储软件栈架构

应用程序
    ↓
文件系统(ext4/XFS/UFS/ZFS/Btrfs)
    ↓
逻辑卷管理器(LVM / GVinum)
    ↓
RAID(软件 md / 硬件 RAID / ZFS RAID-Z)
    ↓
分区(MBR / GPT)
    ↓
存储设备(HDD / SSD / 云卷)

关键趋势

  • 传统做法:各层独立(分区→RAID→LVM→FS)
  • 现代趋势:一体化文件系统(ZFS、Btrfs)整合了卷管理、RAID、文件系统功能

3. 硬盘分区(MBR vs GPT)

对比 MBR GPT(GUID分区表)
最大容量 2TB 无实际限制(理论18EB)
最大分区数 4个主分区(扩展分区可更多) 128+个
兼容性 老旧PC硬件 现代EFI/UEFI
数据冗余 分区表有备份
建议 仅在老旧系统被迫使用 新部署一律使用GPT

3.1 Linux分区(parted / gparted)

1
2
3
4
5
6
# 创建GPT分区表 + 一个全盘分区
sudo fdisk /dev/sdb
# → g (创建GPT) → n (新建分区) → 回车确认 → w (写入)

# 图形化版本(推荐)
sudo gparted

3.2 FreeBSD分区(gpart)

1
2
3
sudo gpart create -s GPT ada1              # 创建GPT分区表
sudo gpart add -l spare -t freebsd-ufs -a 1M ada1  # 创建分区(自动1MiB对齐)
# 分区通过 /dev/gpt/spare 访问

4. RAID(廉价磁盘冗余阵列)

4.1 RAID级别速查

级别 最少磁盘 冗余 空间利用率 读性能 写性能 适用场景
RAID 0(条带) 2 100% ⬆️⬆️ ⬆️⬆️ 性能优先,可丢数据
RAID 1(镜像) 2 50% ⬆️ ⬇️ 高可靠性,读加速
RAID 10(1+0) 4 50% ⬆️⬆️ ⬆️ 性能+冗余最佳
RAID 5(奇偶校验) 3 ✅(1盘) (N-1)/N ⬆️ ⬇️⬇️ 容量效率高,但写性能差
RAID 6(双奇偶校验) 4 ✅(2盘) (N-2)/N ⬆️ ⬇️⬇️ 可容忍2盘故障

RAID 5/6的写漏洞

  • 随机写入需4次操作(读旧数据+读旧校验→写新数据+写新校验)
  • 电源故障可能导致数据块与奇偶校验块不同步 → 重建时产生错误数据
  • 缓解:定期“刷洗”(scrubbing),使用ZFS RAID-Z(可变条带避免该问题)

4.2 Linux软件RAID(mdadm)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# 创建RAID 5(3块1TB硬盘)
sudo mdadm --create /dev/md/extra --level=5 --raid-devices=3 /dev/sdf1 /dev/sdg1 /dev/sdh1

# 查看状态
cat /proc/mdstat
sudo mdadm --detail /dev/md/extra

# 模拟故障
sudo mdadm /dev/md/extra -f /dev/sdg1
sudo mdadm /dev/md/extra -r /dev/sdg1   # 移除
sudo mdadm /dev/md/extra -a /dev/sdg1   # 重新添加(重建)

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

监控mdadm --monitor 守护进程 + MAILADDR 配置 → 故障时邮件报警

5. 逻辑卷管理(LVM)

5.1 LVM核心概念

概念 说明
物理卷(PV) 硬盘、分区或RAID卷
卷组(VG) 物理卷的存储池
逻辑卷(LV) 从卷组中划分的逻辑块设备

5.2 LVM优势

能力 说明
在线扩展/收缩 动态调整逻辑卷大小(无需停机)
快照 写时复制(CoW)快照,用于备份
跨设备 多块硬盘聚合成一个大池
条带化/镜像 可在LVM层面实现RAID 0/1
热迁移 在线移动逻辑卷到不同物理设备

5.3 LVM常用命令(Linux)

操作 命令
创建PV pvcreate /dev/sdb1
创建VG vgcreate DEMO /dev/sdb1
创建LV lvcreate -L 100G -n web1 DEMO
扩展LV lvresize -L +100G DEMO/web1
扩展FS resize2fs /dev/DEMO/web1(ext4)
xfs_growfs /mountpoint(XFS,需挂载)
快照 lvcreate -L 100G -s -n web1-snap DEMO/web1
查看 pvdisplayvgdisplaylvdisplay

5.4 LVM快照的关键限制

LVM快照空间固定,写操作会消耗快照空间,空间耗尽则快照损坏失效。快照要么短期存在,要么分配与源卷一样大

5.5 FreeBSD逻辑卷(GVinum)

  • FreeBSD原生的逻辑卷管理器,支持RAID 0/1/5
  • 但官方推荐:新部署直接使用ZFS(GVinum已不再活跃开发)

6. 传统文件系统

6.1 主流对比

文件系统 默认系统 特点
UFS FreeBSD 伯克利快速文件系统后代,稳定可靠
ext4 Debian/Ubuntu Linux主流,日志化,向前兼容ext2/3
XFS RHEL/CentOS SGI开发,基于extent,适合大文件,只能扩展不能收缩

6.2 常用操作

创建文件系统

1
2
3
4
5
# Linux ext4
mkfs.ext4 -L spare /dev/sdb1

# FreeBSD UFS
newfs -L spare /dev/ada1p1

检查与修复

1
2
fsck /dev/sdb1          # 手动检查(通常自动在引导时运行)
tune2fs -c 50 /dev/sda3 # ext4:设置挂载50次后强制检查

挂载与自动挂载/etc/fstab):

# Linux - 使用UUID(推荐)
UUID=a8e3-8f8a / ext4 defaults 0 0

# Linux - 使用标签
LABEL=spare /spare ext4 defaults 0 0

# FreeBSD - 使用GPT标签
/dev/gpt/spare /spare ufs rw 0 0

6.3 交换空间

1
2
3
4
5
6
7
# Linux
mkswap /dev/sdb1
swapon /dev/sdb1
swapon -s          # 查看当前交换

# FreeBSD
swapctl -l         # 查看当前交换

交换空间大小建议:物理内存的50%,但至少2GB。休眠系统需大于RAM总量

💡 云实例建议:小内存实例需保留交换空间;能稳定运行的实例可考虑禁用交换(避免性能抖动)。

7. 下一代文件系统:ZFS

7.1 ZFS核心特性

特性 说明
一体化 文件系统 + 卷管理 + RAID + 快照 + 压缩 + 去重
写时复制(CoW) 从不原地覆盖数据 → 始终一致,无fsck
数据完整性 每块数据有校验和,静默损坏自动检测+修复
快照与克隆 即时、轻量、可写快照
RAID-Z 解决RAID 5写漏洞的可变条带奇偶校验
SSD缓存 可添加SSD作为读缓存(L2ARC)和写日志(ZIL
每用户文件系统 每个用户主目录可独立快照/配额

7.2 ZFS核心命令

命令 功能
zpool create poolname raidz1 ada1 ada2 ada3 创建RAID-Z存储池
zpool status 查看存储池状态
zpool add poolname mirror ada4 ada5 添加虚拟设备
zfs create poolname/newfs 创建文件系统(瞬间完成
zfs snapshot poolname/fs@snap1 创建快照
zfs rollback poolname/fs@snap1 回滚到快照
zfs clone poolname/fs@snap1 poolname/clone 从快照克隆可写副本
zfs set quota=1G poolname/fs 设置配额
zfs set compression=lz4 poolname/fs 启用压缩

7.3 ZFS示例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
# 创建存储池(RAID-Z,3盘)
sudo zpool create monster raidz1 ada1 ada2 ada3

# 创建文件系统
sudo zfs create monster/data

# 创建快照
sudo zfs snapshot monster/data@2017-01-01

# 文件系统属性继承示例
sudo zfs set mountpoint=/mnt/data monster
# 所有子文件系统自动继承挂载点

# 配额与预留(模拟传统固定大小)
sudo zfs set reservation=1G monster/data
sudo zfs set quota=1G monster/data

7.4 ZFS系统要求

要求 说明
内存 最少2GB(推荐更多),去重需要大量内存
Linux支持 Ubuntu 16.04+以DKMS模块形式支持;RHEL/CentOS需从EPEL安装或手动编译
可引导池限制 根存储池仅支持镜像或单盘,不支持RAID-Z

7.5 RAID-Z vs RAID 5

对比 RAID 5 RAID-Z
写漏洞 存在 (可变条带,全条带写入)
重建 需读取所有盘数据+校验 更高效
碎片 可能 (可变条带避免)

8. 下一代文件系统:Btrfs

8.1 Btrfs vs ZFS

对比 ZFS Btrfs
硬件重配置 添加/删除磁盘困难 在线添加/删除/转换RAID级别
RAID 5/6 ✅ 成熟 ⚠️ 尚不可用于生产(官方警告)
SSD缓存 ✅ L2ARC ❌ 无
内存要求 高(≥2GB)
Linux集成 需额外安装(许可证问题) ✅ 内核原生
快照 只读快照→克隆可写 快照默认可写

8.2 Btrfs常用命令

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
# 创建RAID 1文件系统(2盘)
sudo mkfs.btrfs -L demo -d raid1 /dev/sdb /dev/sdc
sudo mount LABEL=demo /mnt/demo

# 添加磁盘
sudo btrfs device add /dev/sdd /mnt/demo

# 在线转换为RAID 5
sudo btrfs balance start -dconvert=raid5 -mconvert=raid5 /mnt/demo

# 创建子卷
sudo btrfs subvolume create /mnt/demo/subvol

# 创建快照(默认可写)
sudo btrfs subvolume snapshot /mnt/demo/subvol /mnt/demo/snap

# 浅复制文件(写时复制)
cp --reflink=auto largefile copyfile

8.3 Btrfs子卷与快照特点

特点 说明
子卷 类似目录,但可独立挂载/快照/配额
快照 默认可写(ZFS快照只读,需clone才可写)
回滚 无内置回滚命令 → 手动mv替换
浅复制 cp --reflink 可对任意文件创建CoW副本

9. 备份策略核心问题清单

9.1 必须回答的7个问题

类别 问题
总体战略 ①哪些数据要备份?②用什么技术?③存到哪里?④是否加密?密钥存哪里?⑤存储成本?
时间线 ⑥备份频率?⑦验证和恢复测试频率?⑧保留多久?
人员 ⑨谁能访问备份数据/密钥?⑩谁负责核实备份/测试恢复?
使用与保护 ⑪紧急情况如何恢复?⑫如何防止黑客破坏/删除备份(不可变性)?⑬如何防止供应商/政府挟持?

9.2 现代备份实践

实践 说明
云快照 AWS EBS快照、GCP持久盘快照 → 按需付费,自动保留策略
3-2-1原则 3份副本,2种介质,1份异地
不可变备份 使用WORM存储或云对象锁,防止勒索软件加密备份
恢复演练 定期测试恢复,而非仅验证备份成功
RAID ≠ 备份 RAID仅防硬盘故障,不防误删、勒索软件、火灾、黑客

📖 本章观点:磁带已基本退出主流,云快照是当前最便捷的备份方式。

10. 本章核心命令速查表

命令 功能 平台
lsblk -o +MODEL,SERIAL 列出磁盘+型号序列号 Linux
geom disk list 列出磁盘 FreeBSD
sudo fdisk /dev/sdbg n w 创建GPT分区 Linux
sudo gpart create -s GPT ada1 创建GPT分区 FreeBSD
mkfs.ext4 -L label /dev/sdb1 创建ext4文件系统 Linux
newfs -L label /dev/ada1p1 创建UFS文件系统 FreeBSD
mount LABEL=label /mountpoint 按标签挂载 Linux/FreeBSD
sudo mdadm --create /dev/md/extra --level=5 --raid-devices=3 /dev/sd[fgh]1 创建RAID 5 Linux
sudo mdadm --monitor RAID监控守护进程 Linux
sudo pvcreate /dev/sdb1 创建LVM物理卷 Linux
sudo vgcreate DEMO /dev/sdb1 创建LVM卷组 Linux
sudo lvcreate -L 100G -n web1 DEMO 创建LVM逻辑卷 Linux
sudo lvresize -L +100G DEMO/web1 扩展逻辑卷 Linux
sudo zpool create pool raidz1 ada1 ada2 ada3 创建ZFS池 FreeBSD/Linux
sudo zfs create pool/dataset 创建ZFS文件系统 FreeBSD/Linux
sudo btrfs filesystem usage /mnt 查看Btrfs存储使用 Linux
sudo btrfs balance start -dconvert=raid5 /mnt 在线转换RAID级别 Linux
watch -n 5 cat /proc/mdstat 监控RAID重建进度 Linux

DBA视角补充

  • 数据库存储选型:OLTP数据库(高随机I/O)→ SSD优先;OLAP/归档(大容量顺序读写)→ HDD可接受。
  • RAID选择:生产数据库推荐RAID 10(性能+冗余最佳)或ZFS RAID-Z2。避免RAID 5(写性能差+写漏洞风险)。
  • 文件系统选择:Linux生产数据库可选XFS(RHEL默认)或ext4ZFS适合数据盘(校验和+快照),但需评估内存开销。Btrfs的RAID 5/6尚未生产就绪。
  • 对齐检查:使用fdisk -lparted确认分区从1MiB边界开始(2048扇区),确保512e硬盘性能最优。
  • LVM快照用于备份:数据库备份前可用LVM快照创建崩溃一致的磁盘镜像,避免备份过程中数据变更。但快照空间需提前规划(≥源卷大小)。
  • TRIM支持:SSD上的数据库需确保文件系统启用discard或定期fstrim,防止SSD性能随时间下降。
  • 备份策略:数据库备份应结合物理备份(快照/pg_basebackup/xtrabackup)和逻辑备份mysqldump/pg_dump)。云快照是高效的物理备份方式,但需验证恢复流程。
  • 监控:SMART参数中的重分配计数待处理扇区非零即预警;ZFS/Btrfs的scrub命令可定期扫描校验和错误,提前发现磁盘问题。