Linux 硬盘挂载:RAID1、LVM 与 Btrfs

这次排查的目标不是“把一块盘临时挂上去”,而是理解一条完整的存储链路:

/dev/sda1
  ↓
RAID1:/dev/md0
  ↓
LVM:VG trm_1b0a400a_35cb_4ac7_8f8c_308e45fc90b6
  ↓
LV:0(/dev/dm-0)
  ↓
Btrfs:UUID c3f7f7f3-6ae4-4e31-8652-842965898ea5
  ↓
/mnt/4tb

1. 先补齐工具:很多命令不是系统默认安装

这次排查不能只从 mount 开始。Ubuntu 的最小系统经常缺少 RAID、LVM、Btrfs 或 ACL 工具;如果命令提示 command not found,先判断缺的是工具,不要把它误判成硬盘损坏。

1.1 先检查命令是否存在

for c in mdadm pvs vgs lvs btrfs setfacl lsblk findmnt mount update-initramfs; do
  if command -v "$c" >/dev/null 2>&1; then
    echo "[ok]   $c -> $(command -v "$c")"
  else
    echo "[缺少] $c"
  fi
done

1.2 一次安装本次链路需要的包

sudo apt update
sudo apt install -y mdadm lvm2 btrfs-progs acl util-linux initramfs-tools
命令 所属包 用途
mdadm mdadm 组装、查看和切换软件 RAID
pvs、vgs、lvs、vgchange lvm2 查看和激活 LVM
btrfs、mkfs.btrfs btrfs-progs 识别、检查和查看 Btrfs 子卷
setfacl、getfacl acl 给用户增加目录 ACL,不破坏原所有者
lsblk、findmnt、mount util-linux 查看块设备、挂载关系和挂载文件系统
update-initramfs initramfs-tools 把 mdadm 配置更新到早期启动镜像

安装过程中如果 mdadm 弹出是否更新启动配置的提示,应允许它把数组信息写入启动环境;安装结束后仍要手动执行 update-initramfs -u 并重启验证。

1.3 常见缺包报错与对应修复

报错或现象 原因 修复
mdadm: command not found 没安装 RAID 工具 sudo apt install mdadm
pvs/lvs: command not found 没安装 LVM 工具 sudo apt install lvm2
unknown filesystem type 'btrfs' 或 btrfs: command not found 没安装 Btrfs 工具 sudo apt install btrfs-progs
setfacl: command not found 没安装 ACL 工具 sudo apt install acl
findmnt/lsblk: command not found 缺少设备检查工具 sudo apt install util-linux
update-initramfs: command not found 缺少启动镜像工具 sudo apt install initramfs-tools

如果连 sudo 都不存在,需要先用 root 账户执行安装,或在已有 root 权限的前提下安装 sudo;不要为了绕过权限问题把整块盘改成 777。

2. 四层分别做什么

层 例子 作用
物理分区 /dev/sda1 操作系统看到的分区设备
RAID /dev/md0 RAID1 镜像,提供冗余;不是备份
LVM VG、LV、/dev/dm-0 在 RAID 之上灵活划分逻辑卷
文件系统 Btrfs 管理目录、文件、权限、子卷和元数据

mount 挂载的是文件系统,不是“直接挂载某个目录”。排查时应从底层一路向上确认,不能只看到 /mnt/4tb 目录存在就认为硬盘正常。

3. 先确认当前状态

cat /proc/mdstat
sudo pvs
sudo vgs
sudo lvs
lsblk -f
findmnt /mnt/4tb

理想的 RAID 状态类似:

md0 : active raid1 ...

挂载状态应该能看到 Btrfs 和 rw(可写)选项。目录存在不代表设备已挂载,要以 findmnt 或 lsblk -f 为准。

4. 从只读挂载到可写挂载

第一次确认旧 NAS 数据时,先保持保守:

sudo ls -lah /mnt/4tb
sudo btrfs subvolume list /mnt/4tb
findmnt -o SOURCE,FSTYPE,OPTIONS /mnt/4tb

如果确认设备当前是只读,并且确实需要继续写入:

sudo umount /mnt/4tb
sudo mdadm --readwrite /dev/md0
sudo mount -t btrfs /dev/dm-0 /mnt/4tb
findmnt -o SOURCE,FSTYPE,OPTIONS /mnt/4tb

关键是确认每一层的状态:RAID 已组装、LVM 逻辑卷已出现、Btrfs 能被识别,最终挂载选项包含 rw。

5. 权限问题:挂载成功不等于普通用户能访问

遇到“权限不够”,通常表示挂载成功了,但 /mnt/4tb 根目录沿用了 NAS 的原权限,当前用户(例如 lab304)没有通过该目录的权限。

不要直接对整块盘执行:

sudo chmod -R 777 /mnt/4tb
sudo chown -R lab304:lab304 /mnt/4tb

这样会破坏旧 NAS 数据原有的权限结构。

只允许穿过根目录

sudo setfacl -m u:lab304:--x /mnt/4tb

--x 表示可以穿过目录,但不能列出根目录内容。

允许查看根目录并进入子目录

sudo setfacl -m u:lab304:r-x /mnt/4tb
ls -lah /mnt/4tb

如果系统没有 setfacl:

sudo apt install acl

给自己单独准备可写目录

保留旧数据权限,只创建一个自己的工作区:

sudo mkdir -p /mnt/4tb/ubuntu_data
sudo chown lab304:lab304 /mnt/4tb/ubuntu_data

以后把新文件写入 /mnt/4tb/ubuntu_data。验证读写:

echo "4TB write test" > /mnt/4tb/ubuntu_data/test.txt
cat /mnt/4tb/ubuntu_data/test.txt
rm /mnt/4tb/ubuntu_data/test.txt

6. 配置 RAID 开机自动组装

先检查 RAID UUID 是否已经写入 mdadm 配置:

grep -n "9f6897b2:7473:846a:9869:acbdc857f98c" /etc/mdadm/mdadm.conf

如果没有输出,再追加数组记录:

echo 'ARRAY /dev/md0 metadata=1.2 UUID=9f6897b2:7473:846a:9869:acbdc857f98c' \
  | sudo tee -a /etc/mdadm/mdadm.conf

更新 initramfs,让早期启动阶段也能识别 RAID:

sudo update-initramfs -u

Ubuntu 通常会通过 udev、systemd 和 LVM 组件自动激活卷组。如果系统策略要求显式启用,可以检查:

sudo systemctl enable lvm2-monitor.service

这条命令不能代替检查 pvs、vgs、lvs,真正的验收仍要看逻辑卷是否在重启后出现。

7. 配置 Btrfs 自动挂载

先备份 fstab:

sudo cp /etc/fstab /etc/fstab.backup

在 /etc/fstab 中加入:

UUID=c3f7f7f3-6ae4-4e31-8652-842965898ea5 /mnt/4tb btrfs defaults,nofail,x-systemd.device-timeout=30 0 0

字段含义:

  • UUID:用文件系统 UUID 识别设备,不依赖可能变化的设备名;
  • /mnt/4tb:挂载点;
  • btrfs:文件系统类型;
  • nofail:设备暂时不可用时不要阻塞系统启动;
  • x-systemd.device-timeout=30:等待设备最长约 30 秒。

写完后先测试,不要直接重启:

sudo systemctl daemon-reload
sudo mount -a
findmnt /mnt/4tb

mount -a 没有报错且 findmnt 显示正确的 Btrfs 挂载后,才进入重启验证。

8. 重启后的最终验收

sudo reboot

回来后检查:

cat /proc/mdstat
sudo lvs
findmnt /mnt/4tb

完整链路应该仍然是:

md0 active raid1
  ↓
LVM LV active
  ↓
Btrfs mounted rw at /mnt/4tb

如果 RAID、LVM 都存在,但 findmnt /mnt/4tb 没有结果,说明自动挂载没有完成;如果挂载存在但没有 rw,说明文件系统仍是只读,需要继续判断是挂载选项、RAID 状态还是 Btrfs 错误导致。

9. 这次排查的结论

已经确认的部分:

  • 4TB 设备曾经成功挂载到 /mnt/4tb;
  • 文件系统是 Btrfs,原有数据约 825 GB,剩余空间约 2.9 TB;
  • ubuntu_data 可以作为当前 Ubuntu 用户的独立可写目录;
  • 权限问题与“是否挂载成功”是两个不同问题。

仍然必须用实际输出确认的部分:

  • /etc/fstab 是否包含正确的 Btrfs UUID;
  • /etc/mdadm/mdadm.conf 是否包含正确的 RAID UUID;
  • 重启后是否自动组 RAID、激活 LVM 并挂载到 /mnt/4tb。

所以,在看到下面两条 grep 和一次重启后的检查结果之前,不能把“自动挂载已经完成”当作最终结论:

grep -n 'c3f7f7f3-6ae4-4e31-8652-842965898ea5' /etc/fstab
grep -n '9f6897b2:7473:846a:9869:acbdc857f98c' /etc/mdadm/mdadm.conf

10. 速记

物理分区 → RAID1 → LVM → Btrfs → 挂载点
设备存在 ≠ 文件系统已挂载
挂载成功 ≠ 当前用户有权限访问
RAID1 是冗余,不是备份
先 mount -a 测试,再 reboot 验证
旧数据保留原权限,新数据写入 ubuntu_data