《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划分市场层次
| 类型 |
扇区大小 |
说明 |
| 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 |
| 查看 |
pvdisplay、vgdisplay、lvdisplay |
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/sdb → g 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默认)或ext4;ZFS适合数据盘(校验和+快照),但需评估内存开销。Btrfs的RAID 5/6尚未生产就绪。
- 对齐检查:使用
fdisk -l或parted确认分区从1MiB边界开始(2048扇区),确保512e硬盘性能最优。
- LVM快照用于备份:数据库备份前可用LVM快照创建崩溃一致的磁盘镜像,避免备份过程中数据变更。但快照空间需提前规划(≥源卷大小)。
- TRIM支持:SSD上的数据库需确保文件系统启用
discard或定期fstrim,防止SSD性能随时间下降。
- 备份策略:数据库备份应结合物理备份(快照/
pg_basebackup/xtrabackup)和逻辑备份(mysqldump/pg_dump)。云快照是高效的物理备份方式,但需验证恢复流程。
- 监控:SMART参数中的重分配计数和待处理扇区非零即预警;ZFS/Btrfs的
scrub命令可定期扫描校验和错误,提前发现磁盘问题。