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