存储操作手册
LVM、文件系统、挂载、swap 等存储层操作。磁盘查看/SMART 见 disk-ops.md。
LVM (逻辑卷管理)
LVM 三层: PV (物理卷, 磁盘/分区) → VG (卷组, PV 池) → LV (逻辑卷, 可格式化的块设备)。
pvdisplay pvs pvcreate /dev/sdb1 pvremove /dev/sdb1 pvresize /dev/sdb1
vgdisplay vgs vgcreate vg0 /dev/sdb1 vgextend vg0 /dev/sdc1 vgreduce vg0 /dev/sdc1 vgremove vg0
lvdisplay lvs lvcreate -L 50G -n data vg0 lvcreate -l 100%FREE -n data vg0 lvcreate -L 50G -n data vg0 --type raid1 lvremove vg0/data lvextend -L +10G vg0/data lvextend -l +100%FREE vg0/data lvreduce -L -10G vg0/data
resize2fs /dev/vg0/data xfs_growfs /mnt/data
lvrename vg0 oldname newname
lvcreate -L 5G -s -n snap_data vg0/data lvcreate -L 5G -s -n snap_data vg0/data --permission r lvconvert --merge vg0/snap_data lvs -a
vgscan --mknodes vgchange -ay vg0 vgchange -an vg0
文件系统
mkfs.ext4 -L mylabel /dev/sdb1 mkfs.ext4 -L mylabel -m 0 /dev/sdb1 mkfs.xfs -L mylabel /dev/vg0/data mkfs.btrfs -L mylabel /dev/sdb1 mkfs.vfat -F32 /dev/sdb1 mkfs.exfat /dev/sdb1 mkswap -L swap /dev/vg0/swap
e2label /dev/sdb1 mylabel xfs_admin -L mylabel /dev/vg0/data btrfs filesystem label /dev/sdb1 mylabel
blkid findfs UUID=abc123 dumpe2fs /dev/sdb1 | head -40 xfs_info /mnt/data btrfs filesystem show btrfs filesystem df /mnt
fsck /dev/sdb1 fsck -y /dev/sdb1 fsck -n /dev/sdb1 xfs_repair /dev/vg0/data xfs_repair -n /dev/vg0/data btrfs check /dev/sdb1 btrfs check --repair /dev/sdb1
tune2fs -c 1 /dev/sdb1 touch /forcefsck
挂载 (mount / fstab)
mount /dev/sdb1 /mnt/data
mount -t ext4 /dev/sdb1 /mnt/data mount -o ro,noexec /dev/sdb1 /mnt/data mount -o remount,rw / mount -o remount,ro / umount /mnt/data umount -l /mnt/data umount -f /mnt/data fuser -mv /mnt/data
mount -a findmnt --verify
findmnt findmnt -t ext4,xfs findmnt /home
swap
swapon --show free -h cat /proc/swaps
swapon /dev/vg0/swap swapoff /dev/vg0/swap mkswap -L swap /dev/vg0/swap swapon -a
dd if=/dev/zero of=/swapfile bs=1M count=4096 chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
sysctl vm.swappiness
btrfs 常用
btrfs subvolume list / btrfs subvolume create /mnt/@data btrfs subvolume delete /mnt/@data btrfs subvolume snapshot /mnt/@data /mnt/@data-snap
btrfs scrub start /mnt
btrfs scrub status /mnt
btrfs scrub cancel /mnt
btrfs device add /dev/sdc1 /mnt btrfs device delete /dev/sdc1 /mnt btrfs balance start /mnt
分区操作
fdisk -l gdisk -l parted -l
gdisk /dev/sdb
parted /dev/sdb mklabel gpt parted /dev/sdb mkpart primary ext4 0% 100% parted /dev/sdb mkpart primary ext4 1MiB 51201MiB
growpart /dev/sdb 1
sgdisk --backup=table.bak /dev/sdb sgdisk --load-backup=table.bak /dev/sdb
ZFS (Zettabyte File System)
Pool: tank
| 属性 | 值 |
| 类型 | Mirror (2-way) |
| 盘 | WDC WD40EFZZ 4TB ×2 (D4-320 USB3) |
| ashift | 12 (4K) |
| ARC 上限 | 32GB (/etc/modprobe.d/zfs.conf) |
| 挂载点 | /tank |
| 创建 | 2026-07-02 |
/dev/disk/by-id/ata-WDC_WD40EFZZ-68CPAN0_WD-WX12DA5H2PCN → sda
/dev/disk/by-id/ata-WDC_WD40EFZZ-68CPAN0_WD-WX12DA5H234S → sdb
Dataset 布局
| Dataset | recordsize | compression | 用途 | 共享 |
| tank | 128K | lz4 | 根 | - |
| tank/media | 1M | lz4 | 家庭电影库 | SMB + NFS |
| tank/photos | 128K | lz4 | 家庭相册 | SMB + NFS |
| tank/data | 128K | lz4 | 额外存储 | SMB + NFS |
| tank/backup | 128K | lz4 | 备份容器 | 不共享 |
| tank/backup/system | 1M | lz4 | 系统盘备份 (restic) | 不共享 |
常用操作
zpool status tank zpool list -v tank zfs list -r tank zpool events tank -v
zpool scrub tank zpool scrub -s tank zpool status tank | grep scan
zfs snapshot tank/documents@before-reorg zfs list -t snapshot zfs rollback tank/documents@before-reorg zfs destroy tank/documents@old-snap
zpool offline tank <故障盘ID>
zpool replace tank <旧盘ID> <新盘ID>
zpool status -v tank
zpool export tank zpool import -d /dev/disk/by-id/ tank
arc_summary zpool iostat -v 1
服务清单
| 服务 | systemd unit | 说明 |
| Samba | smb.service | guest 共享 /tank/{media,photos,data} |
| NFS | nfs-server.service | 导出到 192.168.31.0/24 |
| ZFS 挂载 | zfs-mount.service | 开机自动挂载 dataset |
| ZFS 事件 | zfs-zed.service | 磁盘故障邮件通知 (root) |
| ZFS 指标 | zfs-prometheus.timer | 每 5 分钟采集 → Prometheus |
| 月 scrub | zfs-scrub-monthly@tank.timer | 数据完整性月检 |
Grafana 监控
- Dashboard: 主机状态 / li-home-0 · ZFS Pool (uid: host-li-home-0-zfs)
- 告警规则:
/etc/grafana/provisioning/alerting/zfs-storage.yaml
- pool DEGRADED/FAULTED → critical
- 容量 >80% → warning, >90% → critical
- 单 VDEV 故障 → critical
- ARC 命中率 <50% → warning
恢复流程
单盘故障 (mirror 存活)
zpool status tank 确认故障盘 ID
- 物理更换故障盘
zpool replace tank <旧> <新>
zpool status -v tank 监控 resilver 完成
池无法导入
ls /dev/disk/by-id/ata-* 确认盘可见
zpool import -f -d /dev/disk/by-id/ tank 强制导入
- 若已 export:
zpool import -d /dev/disk/by-id/ -a
Samba 不可用
systemctl status smb
zfs mount 确认 /tank 挂载
testparm && systemctl restart smb
NFS 不可用
systemctl status nfs-server
showmount -e localhost
exportfs -ra
USB 盘掉线 (D4-320)
- 检查 USB 线缆是否松动
dmesg | tail -30 查看是否有 USB disconnect
echo "0224" | sudo -S modprobe -r usb-storage uas && echo "0224" | sudo -S modprobe uas usb-storage
zpool online tank <盘> (如果自动 offline 了)