磁盘与文件系统

共 31 题
📑 题目列表 31 题
#
★★★

1. HDD 顺序与随机 IO 的差异

机械硬盘(HDD)在顺序 IO 与随机 IO 场景下性能差异巨大,请解释造成这种差异的物理机制,以及在实际存储规划中如何避免随机 IO 拖垮性能?

  • 机械硬盘的寻道与旋转延迟是随机 IO 的主要瓶颈
  • 顺序 IO 几乎规避寻道开销,可发挥最大带宽
  • 如何通过存储分层、缓存、SSD 提升随机 IO 性能

HDD 由盘片、磁头和马达组成,写入/读取数据时磁头需要移动到目标磁道(寻道),并等待盘片旋转到目标扇区(旋转延迟)。顺序 IO 时磁头沿同一方向连续移动,几乎无寻道与旋转等待,数据吞吐接近盘片最大带宽(现代盘 150-250MB/s)。随机 IO 每次都要寻道(平均 4-9ms)并等待旋转(平均 4-5ms),单次 IO 延迟可达 10ms 以上,IOPS 通常只有 100-200 左右,与顺序 IO 的吞吐相差两个数量级。因此数据库、日志等随机访问密集的应用不应直接放在单块 HDD 上,而应通过 RAID 条带化、SSD 缓存层、内存/Page Cache 等手段缓解。

关键在理解"位置无关的连续 vs 位置跳变的随机"对机械寻道的影响。规划时优先把随机 IO 交给 SSD/NVMe,把顺序 IO(如归档、备份流)留给 HDD。

# 用 fio 分别测顺序读与随机读,直观对比差异
fio --name=seq --filename=/dev/sdb --rw=read --bs=1M --size=1G --numjobs=1 --direct=1
fio --name=rand --filename=/dev/sdb --rw=randread --bs=4k --size=1G --numjobs=1 --direct=1
#
★★★

2. RAID 0/1/5/6/10 在冗余与性能的取舍

请对比 RAID 0、1、5、6、10 在冗余能力、可用容量、读写性能与故障容忍方面的取舍,并说明各自适用的场景?

  • 各 RAID 级别的可用容量与冗余计算
  • 写性能与读性能的差异,特别是校验计算开销
  • 不同级别对整块磁盘故障数与故障窗口的容忍

RAID 0 无冗余,将数据条带化到所有盘,可用容量为全部,性能最好但任一块盘故障即全部丢失,仅适合缓存/临时数据。RAID 1 镜像,2 块盘可用 50%,可坏 1 块,读性能翻倍、写性能与单盘相当,适合系统盘、数据库日志。RAID 5 采用分布式校验,N 块盘可用 N-1,可坏 1 块,写有校验计算与读-改-写开销,适合读多写少的应用。RAID 6 双校验,可用 N-2,可坏 2 块,写开销更大,适合大容量数据盘。RAID 10 是镜像+条带,可用 50%,至少需 4 块盘,可坏每镜像组各 1 块,写性能好且重建快,适合数据库等写密集场景。

性能取舍的核心是"冗余代数"与"校验(读-改-写)"带来的额外 IO。RAID 5/6 在写密集时因校验读改写性能下降,而 RAID 10 无校验计算,写性能稳定,故生产数据库多用 RAID 10。

#
★★★

3. SSD TRIM 与 fstrim 定期执行中 discard 挂载选项与批量 trim 的取舍以及误用对性能的影响

请解释 SSD 的 TRIM 机制、discard 挂载选项与 fstrim 批量回收的区别,以及误用 discard 对性能的影响?

  • TRIM 的作用是让 SSD 了解哪些块已无用,以便 GC 提前回收
  • discard 挂载选项(实时 trim)与 fstrim(定期批量 trim)的取舍
  • 持续 discard 会带来额外 IO 负担,生产环境多采用定期 fstrim

SSD 因写前必须擦除(erase),若文件系统删除文件后没有通知 SSD,SSD 仍认为这些块有数据,GC 时白白搬运,导致写放大。TRIM 让文件系统向 SSD 通报已删除的块。discard 挂载选项在每次删除时实时发送 TRIM,开销小但频繁,某些场景(如数据库频繁删除)会带来性能抖动与写放大;fstrim 定期批量对全盘执行 TRIM,适合对空闲块统一回收。常见做法是挂载时不用 discard,而用 cron/systemd-timer 定期执行 fstrim,兼顾 GC 效率与性能稳定。

误用 discard 的典型风险:数据库频繁 DELETE 时每次产生的 TRIM 命令增加 IO 路径开销,且与 SSD 内部 GC 竞争。fstrim 更可控,还能用 --fstab 自动处理已挂载文件系统。

# 定期批量 trim(推荐,写入 systemd timer)
systemctl enable --now fstrim.timer
fstrim -av   # 手动对整个 fstab 中已挂载的 fs 执行 trim
#
★★★

4. inode 耗尽但磁盘空间充足的排查与预防

磁盘明明还有大量空间,但创建文件报"设备上没有空间",请排查并给出预防方案?

  • inode 耗尽与磁盘块耗尽是两个独立维度
  • 用 df -i 查看 inode 使用率,定位小文件过多的目录
  • 预防策略:合理规划 inode 数量、清理临时小文件、使用大 inode 计数文件系统

"No space left on device" 可能因磁盘块满或 inode 满。用 df -hdf -i 分别查看容量与 inode。inode 耗尽常见于大量小文件(缓存目录、日志、邮件、临时文件)。定位可用 find / -xdev -type f | wc -l 或配合 du --inodes,找出文件数最多的目录。修复:删除无用小文件;若数据仍需保留,可临时挂载新文件系统扩容。预防:创建文件系统时按文件大小预期合理设置 inode 数量(mkfs 的 -i bytes-per-inode),或使用 xfs 的动态 inode 分配(xfs 按需分配 inode,不易耗尽)。

ext4 的 inode 数量在 mkfs 时固定,小文件多时易耗尽;xfs 的 inode 按需动态分配,耗尽风险低。监控上应同时告警 inode 使用率而非仅磁盘空间。

df -h /data && df -i /data
# 找出 /data 下文件数最多的目录
find /data -xdev -type f -printf '%h\n' | sort | uniq -c | sort -rn | head
#
★★★

5. 文件系统只读(remount-ro)后的应急处置

系统在磁盘异常后自动将文件系统重新挂载为只读(remount-ro),请给出应急处置流程?

  • 只读挂载的原因:内核 I/O 错误、文件系统检测到损坏、硬件故障
  • 处置流程:先定位根因、备份数据、再修复、最后恢复读写
  • 分清是硬件故障还是文件系统损坏,避免盲目 fsck 造成二次损坏

当文件系统或硬件出现 I/O 错误时,内核或系统会将其 remount-ro 以保护数据。应急处置:1) 立即确认哪些挂载点变只读(mount | grep ro),标记风险;2) 尽早备份可读数据(只读状态下可安全 dd/rsync 拷贝);3) 排查根因:dmesg 看 I/O 错误、smartctl 查磁盘健康、iostat 看设备状态,区分硬件故障与文件系统损坏;4) 若硬件故障,先更换/隔离坏盘再处理文件系统;5) 卸载后运行相应 fsck(如 fsck.ext4/xfs_repair)修复;6) 修复后重新挂载读写并验证数据完整性。全程避免在只读状态下强制读写,以免加剧损坏。

关键原则是"先保数据、再修根因、最后恢复"。只读挂载本身是保护机制,不应强行解除。fsck 前必须确认不是硬件故障,否则可能读到坏块加剧损坏。

mount | grep '\bro\b'          # 找出只读挂载点
dmesg | grep -i 'error'        # 查看 I/O 错误原因
smartctl -a /dev/sda           # 检查磁盘健康
# 卸载并修复(先确认无进程占用)
umount /data && fsck.ext4 -f /dev/sda1 && mount /data
#
★★

6. LVM RAID 如何创建并管理软件 RAID 卷?

请说明 LVM 如何创建 RAID 逻辑卷,以及如何查看状态、扩展与故障处理?

  • lvcreate --type raidN 创建 RAID 卷
  • lvs/lvdisplay 查看 RAID 状态与同步
  • 磁盘故障时的替换与重建

LVM 支持将逻辑卷创建为 RAID(如 raid1/raid5/raid10),底层用 md 驱动,但由 LVM 管理。创建:lvcreate --type raid1 -L 100G -n lvraid vgname /dev/sda /dev/sdb。查看:lvs -a 显示镜像 leg 与同步进度,lvdisplay --maps 看每块物理卷映射。扩容:lvextend 会自动维护 RAID 布局。故障:某盘损坏时 lvconvert --repair 用热备或新盘重建,lvs --segments 可定位损坏 leg。LVM RAID 兼具 LVM 的灵活性与 md 的冗余,但需注意系统盘不要用 LVM RAID 以免影响引导。

LVM RAID 将冗余管理纳入 LVM 资源池,便于在线扩展与迁移,但要理解其底层基于 md,故障恢复依赖 LVM 的 repair 流程。

pvcreate /dev/sda /dev/sdb
vgcreate vgdata /dev/sda /dev/sdb
lvcreate --type raid1 -L 100G -n lvraid vgdata
lvs -a vgdata                 # 查看镜像与同步状态
lvconvert --repair vgdata/lvraid   # 故障后重建
#
★★

7. LVM thin pool 元数据满导致写失败的诊断与修复

LVM thin pool 的数据空间未满但写入失败,请诊断并修复?

  • thin pool 由数据卷与元数据卷组成,元数据满同样导致写失败
  • 用 lvs -o+lv_metadata_percent 查看元数据使用率
  • 修复与预防:扩容元数据卷、调整 units 与 min 预留

thin pool 通过 metadata 卷记录块的分配状态,若元数据区接近耗尽,即便数据空间充足也会拒绝写入。诊断:lvs -o+lv_metadata_percent,pool_lv 查看元数据使用率是否接近 100%,dmesg 可见 "thin pool ... metadata" 相关报错。修复:用 lvextend --poolmetadatasize 为元数据卷扩容,或 lvconvert --repair 重建元数据;若因 thin 卷过多导致元数据碎片,可适当调整。预防:thin 卷数量受 metadata 空间限制,metadata 默认按数据池约 1/1000 比例预留(有最小下限),预留余量并监控元数据使用率。

关键点:thin pool 是"两块"——metadata 与 data,两者都可能成为瓶颈。元数据满常因 thin 卷数量或块映射过多,不只是数据量大。

lvs -o +lv_metadata_percent,pool_lv /dev/vgthin/pool
lvextend --poolmetadatasize +8G vgthin/pool   # 扩容元数据
#
★★

8. NVMe 多队列与队列深度如何影响并发 IO 性能?

请解释 NVMe 的多队列机制与队列深度(queue depth)如何影响并发 IO 性能?

  • NVMe 支持多硬件队列,每个 CPU 核可对应一条队列,减少锁竞争
  • 队列深度决定在途请求数,影响吞吐与延迟
  • 与单队列 SATA SSD 的对比,以及 NUMA 亲和

NVMe 采用多队列设计,每个队列可独立提交/完成,多核 CPU 可并行操作不同队列,避免共享一条队列时的锁竞争与队头阻塞,极大提升并发处理能力。队列深度(每队列在途命令数)越大,越能同时让 SSD 的多个闪存通道并行工作,提高吞吐;但队列深度过高可能导致延迟与排队增加。Linux 下通过 NVMe 驱动为每个 CPU 分配队列,配合 irqbalance 与 NUMA 亲和可进一步提升性能。相比之下,SATA SSD 单队列、低队列深度,多核并发优势小。

多队列是 NVMe 相对 SATA 的核心优势之一,配合 per-CPU 提交队列消除了核间竞争;队列深度是吞吐与延迟的权衡参数。

# 查看 NVMe 设备与队列数量
lspci | grep -i nvme
dmesg | grep -i 'nvme.*queues'   # 如 "nvme0: 32/0/0 default/read/poll queues"
#
★★

9. btrfs balance 如何实现平衡数据?

请解释 btrfs balance 的作用、原理与使用场景?

  • balance 重新分配块组(block group)中的数据以均衡利用率
  • 在 RAID 扩容/收缩后必须 balance 才能重新分布
  • 触发条件与按块组过滤

btrfs balance 会重新读取并重写块组中的数据,使其按新的块组布局重新分布,从而在增加/移除设备后实现数据均衡,并可在 RAID 级别变化时重排。命令 btrfs balance start /mnt 默认平衡所有数据;btrfs balance start -dconvert=raid1 /mnt 可转换数据 RAID 级别。balance 有较高 IO 开销,可用 -dusage 过滤低利用率块组,或 -dlimit 限制每个块组的处理量,避免长时间占用。查看状态用 btrfs balance status,取消用 btrfs balance cancel

balance 是 btrfs 特有的在线再平衡机制,与"扩容后自动均衡"不同,它必须显式执行才能把数据搬到新设备。生产上要错峰执行并限流。

btrfs balance start /mnt
btrfs balance status /mnt
btrfs balance cancel /mnt
btrfs balance start -dconvert=raid1 /mnt   # 转换数据冗余级别
#
★★

10. btrfs device add/remove 如何实现设备增减?

请说明 btrfs 如何在线添加与移除设备,及注意事项?

  • btrfs device add 在线扩容并触发数据重新分布
  • btrfs device remove 在数据迁移完成后移除设备
  • 设备删除失败的原因与处理

btrfs device add /dev/sdb /mnt 将新设备加入文件系统,但新数据不会自动移过去,需配合 btrfs balance 才会把数据分布到新盘。btrfs device remove /dev/sda /mnt 会把该设备上的数据迁移到其他设备后移除,若剩余空间不足会失败,需先有足够空闲或先加新盘。查看分布用 btrfs device usage /mnt。特点:在线增减、无需停机,但移除时要保证剩余容量足够容纳迁移数据。

device add/remove 是 btrfs 相对传统文件系统的优势,但移除成功依赖足够的可用空间,且需 balance 才能真正重新分布。

btrfs device add /dev/sdb /mnt
btrfs device usage /mnt
btrfs balance start /mnt          # 触发数据重新分布
btrfs device remove /dev/sda /mnt
#
★★

11. btrfs quota 如何为子卷配置并查看配额?

请说明 btrfs 如何为子卷启用配额并查看配额使用情况?

  • btrfs quota enable 启用配额支持
  • btrfs qgroup show 查看配额与用量
  • 基于 qgroup 区分子卷与快照的共享空间

btrfs 配额基于 qgroup(quota group)实现,需先 btrfs quota enable /mnt 启用。为子卷设置限额用 btrfs qgroup limit,如 btrfs qgroup limit -e 10G /mnt/subvol。查看用量 btrfs qgroup show /mnt 会显示每个 qgroup 的 exclusive 与 referenced 空间,exclusive 表示独占空间,referenced 含共享(快照)空间。限制可针对 exclusive 或 referenced。注意 qgroup 需在配额启用后生效,且快照共享会降低 exclusive 用量。

btrfs 配额的核心是 qgroup 与 exclusive/referenced 概念,能区分快照共享空间,比传统目录配额更精细。

btrfs quota enable /mnt
btrfs qgroup limit -e 10G /mnt/subvol
btrfs qgroup show -r /mnt
#
★★

12. btrfs send/receive 如何实现增量复制?

请说明 btrfs send/receive 如何实现只读子卷的增量复制?

  • send 需要只读子卷或快照作为源
  • 基于父快照的增量发送 -p 参数
  • 用于异地备份与增量同步

btrfs send 将只读子卷/快照导出为流,可配合 -p 指定父快照实现增量发送,接收端用 btrfs receive 重建。典型流程:先创建只读快照 btrfs subvolume snapshot -rbtrfs send -p /mnt/prev /mnt/new 生成增量流,btrfs receive /dest 接收。由于只发送自父快照以来的变化,极大节省带宽与存储,常用于异地备份与增量同步。注意 send 源必须是只读,且父快照需在目标端存在。

send/receive 利用 btrfs 的 COW 与快照机制实现高效增量复制,是 btrfs 备份的核心能力,但要求源为只读。

btrfs subvolume snapshot -r /mnt/data /mnt/snap1
btrfs send -p /mnt/snap0 /mnt/snap1 | btrfs receive /mnt/backup
#
★★

13. btrfs 如何创建、回滚与删除快照?

请说明 btrfs 快照的创建、回滚与删除操作?

  • btrfs subvolume snapshot 创建快照(COW 特性)
  • 回滚通过恢复快照数据或切换挂载子卷
  • 删除快照与回收空间

创建快照:btrfs subvolume snapshot /mnt/data /mnt/snap,利用 COW(写时复制)只记录变化,几乎瞬时且几乎不占空间。回滚:可将现子卷删除后改名快照,或用快照作为新的工作子卷,btrfs subvolume set-default 切换默认。删除:btrfs subvolume delete /mnt/snap,删除后原快照独占的块被回收。快照是 btrfs 在线备份与回滚的基础,但需注意快照不是独立备份,源损坏快照也受影响。

COW 使快照轻量、几乎零成本,但快照依赖源文件系统可用性,需配合独立备份。

btrfs subvolume snapshot -r /mnt/data /mnt/snap-readonly
btrfs subvolume delete /mnt/snap
btrfs subvolume set-default <id> /mnt   # 切回默认子卷
#
★★

14. fio --latency_percentile 如何实现延迟分布?

请说明 fio 如何通过 --latency_percentile 输出延迟分布?

  • 延迟百分位(p50/p95/p99)比平均值更能反映尾部性能
  • --latency_percentile 与 --latency_unit 参数
  • 输出中如何解读

fio 通过 --latency_percentile=99 等参数启用延迟百分位统计,配合 --latency_unit 指定单位,测试结束后会输出如 p50、p95、p99 的延迟值。也可用 --latency_mean--latency_max 输出均值与最大值。百分位延迟能反映 IO 尾部延迟(tail latency),比平均值更真实,对数据库等对延迟敏感的应用关键。fio 还会输出直方图(histogram)用于分析延迟分布。

百分位延迟(尤其 p99)是衡量存储延迟抖动的重要指标,平均值会被长尾掩盖。fio 的 --latency_percentile 直接输出多分位延迟。

fio --name=lat --rw=randread --bs=4k --size=1G --runtime=30 \
    --latency_percentile=99 --latency_unit=usec /dev/sdb
#
★★

15. fio --rate 如何限制测试的 IO 速率?

请说明 fio 的 --rate 参数如何限制 IO 速率?

  • --rate 限制 IOPS 或带宽
  • --rate_process 与限速的运维场景
  • 用于模拟有上限的负载

fio 的 --rate=10k 可限制每秒 IOPS,--rate=100m 限制带宽,也可用 --rate=10k,100m 组合限速。--rate_iops--rate_bw 更明确。限速场景常用于模拟真实业务带宽上限、评估存储在多负载下的表现,或在不影响生产的前提下做基准测试。--rate_process 控制限速的粒度(如对每个 job 或整个 job 组)。

--rate 让 fio 测出在特定速率上限下的表现,而非压到极限,适合容量规划与生产降级测试。

fio --name=lim --rw=read --bs=1M --size=1G --rate=100m --rate_process=1 /dev/sdb
#
★★

16. fio --time_based 如何实现持续测试?

请说明 fio 的 --time_based 参数的作用?

  • --time_based 让测试按时间而非数据量运行
  • 配合 --runtime 与 --ramp_time 使用
  • 用于长时间稳定测试

fio 默认在写完 --size 指定数据量后结束。--time_based 配合 --runtime=60 让测试运行固定时长(即便数据量已完成也继续循环),从而观察一段时间的稳定性能。--ramp_time 可设置预热期,不计入统计。长时间持续测试能发现性能衰减、热降频、缓存耗尽等问题,比一次性跑完更真实。

--time_based 是 fio 做长时间稳定性测试的关键,配合 runtime 与 ramp_time 可排除预热干扰。

fio --name=stab --rw=randwrite --bs=4k --size=1G --runtime=60 \
    --time_based --ramp_time=10 /dev/sdb
#
★★

17. mdadm --grow 如何实现 RAID 级别变更?

请说明 mdadm 如何在线变更 RAID 级别(如 RAID 5 转 RAID 6)?

  • mdadm --grow 支持级别/容量/条带大小变更
  • 变更前提:磁盘数量需满足新级别要求
  • 变更过程是后台重建,负载高

mdadm --grow /dev/md0 --level=6 可将 RAID 从 5 升级到 6(需先有足够磁盘形成双校验),--raid-devices 调整盘数,--chunk 调整条带大小。级别变更是在线后台重建,会持续读写所有数据盘,期间性能下降、故障风险增大,建议在低峰执行并监控。前提是物理盘数量满足新级别(如 RAID5→6 至少 3 盘,RAID10 需偶数盘)。变更后需更新配置文件。

--grow 是 mdadm 在线调整能力,但它是全量重排过程,风险与耗时需评估,变更前应备份。

mdadm --grow /dev/md0 --level=6 --raid-devices=4
mdadm --detail /dev/md0 | grep -E 'State|Rebuild'
#
★★

18. smartctl 磁盘健康监测与 SMART 属性(Reallocated_Sector_Ct/Pending_Sector)解读,预测性更换流程如何设计

请说明如何用 smartctl 监测磁盘健康,解读关键 SMART 属性并设计预测性更换流程?

  • smartctl -a 查看 SMART 属性
  • Reallocated_Sector_Ct 与 Pending_Sector 的含义
  • 基于 SMART 的预测性更换流程

smartctl -a /dev/sda 显示 SMART 健康状态(PASSED/FAILED)与属性。Reallocated_Sector_Ct(重映射扇区数)表示已被备用扇区替换的坏扇区,持续增长说明盘在劣化;Pending_Sector(待重映射扇区)表示在读写时出错、等待重映射的扇区,越高越危险。smartctl -t 可做离线/短时自检。预测性更换:定期采集 SMART 属性入监控,当 Reallocated 超过阈值或 Pending 增长时触发预警,提前申请备件、在业务低峰更换,避免突发故障。smartd 可定时巡检并告警。

SMART 属性是主动发现磁盘劣化的关键,重点看重映射与待重映射扇区数及增长趋势,而非只看 PASSED/FAILED。

smartctl -a /dev/sda
smartctl -t short /dev/sda && smartctl -l selftest /dev/sda
# 启用 smartd 自动巡检
systemctl enable --now smartd
#
★★

19. xfs 与 ext4 在大文件的差异

请对比 xfs 与 ext4 在处理大文件时的差异?

  • xfs 的 B+tree 结构适合大文件与大量文件
  • ext4 的 extent 支持与文件大小上限
  • 大文件场景的性能与扩展性

xfs 采用 B+tree 管理 inode 与 extent,对大文件、大量文件、高并发写更友好,支持超大文件(8EB 以上)与在线 growfs,且 inode 动态分配,适合大型数据目录与海量小文件。ext4 采用 extent 树,单文件上限 16TB(默认块大小),元数据管理在文件数极多时可能受限,但成熟稳定、兼容性好。就大文件(如视频、数据库文件)而言,xfs 的连续空间分配与可扩展性更优,故很多大文件/大数据存储采用 xfs。

差异来自目录与 inode 的数据结构:xfs 的 B+tree 在规模和扩展性上优于 ext4,尤其适合大文件与海量文件。

#
★★

20. xfs_growfs 如何实现在线扩容 XFS 文件系统?

请说明 xfs_growfs 如何在线扩容 XFS 文件系统?

  • xfs 只支持在线扩容(growfs)不支持收缩
  • 需先扩容底层块设备/LVM/分区
  • xfs_growfs 挂载点参数

XFS 只能在线扩容,不能收缩。流程:先扩容底层设备(LVM lvextend 或分区),再 xfs_growfs <挂载点> 让文件系统利用新增空间。可在挂载状态下直接执行,无需卸载。xfs_growfs -d 扩展数据区到设备上限。扩容后可用 df -h 验证。注意 XFS 不支持 shrink,规划容量时需谨慎。

xfs_growfs 是 XFS 在线扩容的关键,但前提是底层块设备已扩容,且 XFS 不支持收缩,故容量规划重要。

lvextend -L +50G /dev/vg/lvdata
xfs_growfs /data
df -h /data
#
★★

21. xfs_info、xfs_db、xfs_metadump 分别能查看 XFS 的哪些信息?

请说明 xfs_info、xfs_db、xfs_metadump 三个工具各自的作用?

  • xfs_info 查看文件系统总体信息(块大小、inode 数等)
  • xfs_db 低层调试/修复 XFS 元数据
  • xfs_metadump 导出元数据用于离线分析

xfs_info 从挂载的文件系统读取超级块与配置,显示块大小、文件系统大小、inode 数、AG 数等常规信息。xfs_db 是 XFS 底层调试工具,可脱机查看/修改元数据、检查 AG、定位损坏,是高级诊断工具。xfs_metadump 将整个文件系统的元数据导出为镜像文件,用于离线分析或安全审计(可加 -o 脱敏),不包含用户数据,常用于技术支持诊断。

三个工具分工:xfs_info 常规信息、xfs_db 底层调试、xfs_metadump 元数据导出,用于诊断与迁移分析。

xfs_info /data
xfs_db -c 'sb 0' -c 'p' /dev/sda1
xfs_metadump -o /dev/sda1 /tmp/meta.dump
#
★★

22. xfs_repair 与 fsck.ext4 在文件系统损坏时的修复边界、离线维护窗口与数据丢失风险如何控制

请说明 xfs_repair 与 fsck.ext4 在文件系统损坏时的修复边界、离线维护窗口与数据丢失风险控制?

  • 两者都需在离线(卸载)状态下执行
  • xfs_repair 是唯一修复手段,fsck.ext4 修复更深
  • 修复前备份、修复期间数据丢失风险控制

xfs_repair 与 fsck.ext4 都必须在文件系统卸载(离线)状态下运行,否则会损坏文件系统。xfs_repair 是 XFS 的唯一修复工具,只能修复元数据一致性,无法修复用户数据;fsck.ext4 支持交互式/自动修复,修复深度更大。两者修复前都应先备份(只读 dd 或 .dump),修复过程可能因元数据损坏而无法恢复全部数据,需设置修复窗口并接受一定数据丢失风险。修复前先拍照/记录,必要时用只读模式分析(xfs_repair -n)。

修复边界:工具只保证元数据一致,不保证用户数据完整;离线窗口与备份是控制数据丢失的关键。

umount /data
xfs_repair -n /dev/sda1   # 先只读检查
xfs_repair /dev/sda1      # 真正修复
fsck.ext4 -f /dev/sda1
#
★★

23. 文件系统碎片对数据库性能的影响与整理策略

请说明文件系统碎片对数据库性能的影响及整理策略?

  • 碎片导致顺序读变成随机读,增加 IO 开销
  • 数据库文件与日志文件对碎片敏感性
  • 整理策略:预分配、定期检查、避免在线整理

文件系统碎片使本应连续的数据分散到多个不连续块,导致顺序读退化为随机读,显著增加 IO 延迟与磁头寻道,对数据库数据文件与 WAL 日志影响明显。整理策略:1) 预分配文件大小(如 XFS 的大块、数据库预分配 tablespace),减少运行期反复分配产生的碎片;2) 定期用碎片工具检查(如 ext4 的 e4defrag、xfs 的 xfs_db 检查);3) 对高碎片文件做离线重排或迁移到新文件系统;4) 避免频繁增删导致的碎片。存储为 SSD 时碎片影响相对较小,但写入放大仍存在。

碎片核心影响是破坏顺序连续性,对 HDD 影响大、对 SSD 影响小;整理策略偏重在预防(预分配)而非事后整理。

# ext4 碎片检查
e4defrag -c /data/db.bin
# 在线整理(低峰)
e4defrag /data/db.bin
#
★★

24. 机械硬盘、SSD、NVMe 在 IO 模型的差异

请对比机械硬盘、SATA SSD、NVMe SSD 在 IO 模型上的差异?

  • HDD 的机械寻道与单队列
  • SSD 的闪存并行与多通道
  • NVMe 的多队列与低延迟

机械硬盘以机械寻道与旋转延迟为主,IOPS 低、无并行优势,顺序性能靠连续带宽。SATA SSD 采用 NAND 闪存,多通道并行,无寻道延迟,随机 IOPS 大幅提升,但接口为单队列(AHCI),多核并发受限。NVMe 通过 PCIe 直连与多队列(每核一队列)协议,消除 SATA 的队列瓶颈,延迟低至微秒级、IOPS 极高,且支持更深的队列深度与多核并行。三者差异本质是"机械寻道 + 单接口队列" vs "闪存并行 + 多队列协议"。

从 HDD 到 SATA SSD 到 NVMe,是"去除机械寻道"与"接口队列从单到多"两个维度的演进,决定了 IOPS 与延迟的量级差异。

#
★★

25. 磁盘 IO 延迟突增定位到具体进程的方法链(iostat/iotop/bcc)

请给出磁盘 IO 延迟突增时的定位方法链(iostat、iotop、bcc)?

  • iostat 看设备级 IO 指标(利用率、await、svctm)
  • iotop 看进程级 IO
  • bcc 工具(如 biolatency、biosnoop)做深层次定位

定位 IO 延迟突增:1) 用 iostat -x 1 看每块盘的使用率、await、svctm、队列长度,判断是设备繁忙还是 IO 调度堆积;2) 用 iotop -o 找出具体进行大量读写/高延迟等待的进程;3) 用 bcc 工具深入:biolatency 看 IO 延迟分布,biosnoop 追踪每个 IO 的进程与扇区,biotop 看进程级 IO 速率。若设备级正常但应用延迟高,则需查 Page Cache、锁或调度。

方法链是"设备级 → 进程级 → 内核级"层层深入,iostat 先看宏观,iotop 看进程,bcc 看微观延迟与请求归属。

iostat -x 1
iotop -o -b -n 3
biosnoop -t 2        # bcc 追踪 IO 归属进程
biolatency /dev/sdb  # 看延迟分布
#

26. LVM tags 如何标记卷组或逻辑卷并用于自动化管理?

请说明 LVM tags 如何标记卷组或逻辑卷并用于自动化管理?

  • lvchange/vgchange 的 --addtag/--deltag 与 --setautoactivation
  • tag 用于自动化激活与资源选择
  • 配合 udev 与脚本

LVM 支持给卷组、逻辑卷、物理卷打标签(tag),用 lvchange --addtag mytag vg/lvvgchange --addtag 添加,--deltag 删除。Tag 可用于自动化:vgchange --setautoactivation 结合 tag 控制自动激活范围,避免所有卷组在启动时被激活;脚本可通过 lvs --o tags 按 tag 选择资源。例如用 tag 区分生产/测试卷,实现按需激活与批量管理。

tags 是 LVM 的轻量元数据标记,核心价值在于自动化脚本按标签选择资源、控制激活范围。

lvchange --addtag prod /dev/vgdata/lvapp
vgchange --setautoactivation n --addtag prod /dev/vgdata
lvs -o lv_name,tags --select 'tags=prod'
#

27. ZFS encryption 如何实现原生加密?

请说明 ZFS 如何实现原生加密?

  • zfs load-key / mount -o encryption
  • 加密属主与密钥加载
  • 加解密对性能的影响

ZFS 支持原生加密,在创建数据集时设置 -o encryption=aes-256-gcm -o keyformat=passphrase(或 raw/hex),之后数据在写入时加密、读取时解密。密钥通过 zfs load-key 加载、zfs unload-key 卸载,密钥可存于文件或 kms。加密是端到端磁盘级加密,密文不可直接读取,需加载密钥后才能 mount。加密有少量 CPU 开销,现代 CPU 的 AES-NI 可显著降低影响。注意:原生加密需配合密钥管理,密钥丢失则数据不可恢复。

ZFS 原生加密在数据层加密,密钥与数据分离,需 load-key 才能访问,是静态磁盘加密的常用方案。

zfs create -o encryption=aes-256-gcm -o keyformat=passphrase pool/enc
zfs load-key pool/enc
zfs mount pool/enc
zfs unload-key pool/enc
#

28. dm-multipath 多路径配置与路径故障切换(ALUA)在 SAN 存储环境的作用,单路径故障如何不影响业务

请说明 dm-multipath 多路径配置与 ALUA 路径故障切换在 SAN 存储中的作用?

  • 多路径聚合多个 HBA 端口,提升带宽与冗余
  • ALUA 区分主动/被动路径,故障时切换
  • 单路径故障不影响业务

dm-multipath 将主机上通向同一 LUN 的多条物理路径(多个 HBA 端口/多个存储控制器)聚合为一个逻辑设备,既提升带宽,又提供路径冗余。ALUA(Asymmetric Logical Unit Access)让存储控制器的路径有主动/被动之分,multipath 优先使用主动路径,被动路径仅作备用,故障时自动切换。配置在 /etc/multipath.conf,multipath -l 查看路径状态。某条路径故障时,multipath 自动把 IO 切换到其他路径,业务无感知;若所有路径都失效,则 LUN 不可用。

多路径的核心价值是路径级冗余与故障切换,ALUA 让路径选择更智能,实现"单路径故障不影响业务"。

multipath -ll
multipath -t   # 查看当前配置
# /etc/multipath.conf 配置 policy 与 path_grouping_policy
#

29. mdadm --incremental 如何实现组装 RAID?

请说明 mdadm --incremental 如何组装 RAID 阵列?

  • --incremental 按 udev 事件逐个加入磁盘组装
  • 与完整 assemble 的区别
  • 自动组装的场景

mdadm --incremental 用于按磁盘热插拔事件逐个把盘加入 RAID 组装过程,常在 udev 规则中调用,实现磁盘插入时自动识别并加入阵列。它根据磁盘上的元数据判断所属阵列,逐步把设备组装成 /dev/mdX。与 mdadm --assemble 一次性组装所有盘不同,incremental 是增量式、逐盘触发,适合热插拔与自动装配场景。若某盘缺失,阵列进入 degraded 状态待补盘。

--incremental 是自动化的核心,配合 udev 在盘插入时自动恢复阵列,适合机房热插拔运维。

mdadm --incremental /dev/sdb
# udev 规则示例
# ACTION=="add", KERNEL=="sd*", RUN+="/sbin/mdadm --incremental $devnode"
#

30. sshfs 如何实现远程挂载?

请说明 sshfs 如何实现远程目录挂载?

  • sshfs 基于 FUSE 与 SFTP 协议
  • 挂载命令与选项
  • 安全性、性能限制与适用场景

sshfs 基于 FUSE 和 SFTP 协议,把远程 SSH 服务器上的目录挂载到本地,无需在远程安装特殊服务。命令:sshfs user@host:/remote /mnt/sshfs,卸载用 fusermount -u /mnt/sshfs。可加 -o ServerAliveInterval 保持连接、-o allow_other 允许其他用户访问。它适合临时挂载、跨机器同步、免密密钥认证,但性能受 SFTP 与网络延迟限制,不适合高并发生产;且基于 SSH 权限,需管理密钥。已在 /etc/fstab 中可用 _netdev 实现开机挂载。

sshfs 是轻量 FUSE 远程挂载方案,便捷但性能有限,适合开发/运维场景而非生产高并发。

sshfs user@host:/srv /mnt/remote -o ServerAliveInterval=30
fusermount -u /mnt/remote
#

31. 对象存储 FUSE 挂载(s3fs/gcsfuse/blobfuse/cosfs)的适用场景、缓存与并发限制,以及高并发生产为何不建议依赖 FUSE 挂载

请说明对象存储 FUSE 挂载(s3fs、gcsfuse、cosfs、blobfuse)的适用场景、缓存与并发限制?

  • FUSE 挂载把对象存储当作本地目录的便利与局限
  • 对象存储的最终一致性、无随机写、无 inode 语义
  • 高并发生产不建议依赖 FUSE 挂载的原因

s3fs/gcsfuse/blobfuse/cosfs 等通过 FUSE 把对象存储挂载为本地路径,方便临时读写与迁移。但对象存储本质是分布式键值存储,无块设备语义、无随机写、无 POSIX 重命名/锁的完全保证,且存在最终一致性。FUSE 挂载会引入本地缓存(metadata 与数据缓存),缓存与对象存储间可能不一致,多节点并发写易冲突。高并发生产不建议依赖 FUSE 挂载:性能受对象存储 API 延迟与 FUSE 开销叠加影响,且无强一致与锁,不适合数据库/频繁更新场景。适用场景是数据备份、归档、低频读写、数据入湖,而非生产热数据。

FUSE 挂载只是"把对象当文件"的适配层,掩盖了对象存储与 POSIX 的语义差异,性能与一致性受限,生产热路径应使用对象存储原生 API。