我正在将数据从一个磁盘转移到一个新磁盘。但是,新的 Seagate IronWolf 12Tb 有问题(可能对输出电压太敏感)。尽管如此,更换操作还是停止了,并显示一条消息,我没有花时间注意。
所以我不得不重新启动才能移除 Seagate 磁盘。我对原始磁盘执行 btrfs 检查,结果没有错误,停止服务器,移除 12Tb 磁盘并重新启动...
由于我的 btrfs 设备无法挂载,导致启动失败:
mount: wrong fs type, bad option, bad superblock on /dev/sdd1,
missing codepage or helper program, or other error
In some cases useful info is found in syslog - try
dmesg | tail or so.
因此我执行(正如你应该做的那样):dmesg | tail 并得到:
[ 2833.182505] BTRFS info (device sdd1): disk space caching is enabled
[ 2833.182515] BTRFS info (device sdd1): has skinny extents
[ 2833.321953] BTRFS warning (device sdd1): cannot mount because device replace operation is ongoing and
[ 2833.321962] BTRFS warning (device sdd1): tgtdev (devid 0) is missing, need to run 'btrfs dev scan'?
[ 2833.321969] BTRFS error (device sdd1): failed to init dev_replace: -5
[ 2833.339466] BTRFS: open_ctree failed
好吧,我同意这种情况,但是“btrfs 替换取消”需要一个挂载点。系统拒绝挂载……狗在寻找尾巴。
usage: btrfs replace cancel <mount_point>
我搜索了很多次,但没找到任何可行的解决方案。我搜索了“替换操作正在进行”,并希望找到包含以下源代码的页面:开发-replace.c如果发现以下代码块:
/*
* allow 'btrfs dev replace_cancel' if src/tgt device is
* missing
*/
if (!dev_replace->srcdev &&
!btrfs_test_opt(dev_root, DEGRADED)) {
ret = -EIO;
pr_warn("btrfs: cannot mount because device replace operation is ongoing and\n" "srcdev (devid %llu) is missing, need to run 'btrfs dev scan'?\n",
(unsigned long long)src_devid);
}
if (!dev_replace->tgtdev &&
!btrfs_test_opt(dev_root, DEGRADED)) {
ret = -EIO;
pr_warn("btrfs: cannot mount because device replace operation is ongoing and\n" "tgtdev (devid %llu) is missing, need to run btrfs dev scan?\n",
(unsigned long long)BTRFS_DEV_REPLACE_DEVID);
}
这不是一个小建议,错误的“官方”原因是 btrfs 卷是退化。希望我当时也在读这个页面:在多个设备上使用 Btrfs我当时正在阅读的地方:
更换故障设备
使用 btrfs replace
当您的设备正在发生故障或 RAID 阵列中发生故障时,您应该使用 btrfs replace 命令,而不是添加新设备并移除发生故障的设备。这是一种较新的技术,在添加和删除设备时对我有用,但在尝试恢复之前查阅 irc 频道的邮件列表可能会有所帮助。
首先列出文件系统中的设备,在此示例中,我们有一个缺失的设备,我们将用相同大小的新驱动器替换它。在以下输出中,我们看到最终的设备编号(缺失)是设备 6:
enter code here
user@host:~$ sudo btrfs filesystem show
Label: none uuid: 67b4821f-16e0-436d-b521-e4ab2c7d3ab7
Total devices 6 FS bytes used 5.47TiB
devid 1 size 1.81TiB used 1.71TiB path /dev/sda3
devid 2 size 1.81TiB used 1.71TiB path /dev/sdb3
devid 3 size 1.82TiB used 1.72TiB path /dev/sdc1
devid 4 size 1.82TiB used 1.72TiB path /dev/sdd1
devid 5 size 2.73TiB used 2.62TiB path /dev/sde1
*** Some devices missing
这不是我的真实情况,因为我没有“*** 缺少某些设备”,但情况非常接近。我读到以下内容:
如果该设备存在,那么就更容易确定所需的数字设备 ID。
在更换设备之前,您需要安装阵列,如果有丢失的设备,则需要使用以下命令:
sudo mount -o degraded /dev/sda1 /mnt
这是安装降级的 btrfs 以取消中断的替换操作的方法。
答案1
以下是他的完整解决方案:
[root@home disk]# mount /dev/sdd1 /store/backup_big_btrfs/
mount: wrong fs type, bad option, bad superblock on /dev/sdd1,
missing codepage or helper program, or other error
In some cases useful info is found in syslog - try
dmesg | tail or so.
[root@home disk]# dmesg | tail
[ 2833.182505] BTRFS info (device sdd1): disk space caching is enabled
[ 2833.182515] BTRFS info (device sdd1): has skinny extents
[ 2833.321953] BTRFS warning (device sdd1): cannot mount because device replace operation is ongoing and
[ 2833.321962] BTRFS warning (device sdd1): tgtdev (devid 0) is missing, need to run 'btrfs dev scan'?
[ 2833.321969] BTRFS error (device sdd1): failed to init dev_replace: -5
[ 2833.339466] BTRFS: open_ctree failed
[root@home disk]# btrfs replace cancel
btrfs replace cancel: too few arguments
usage: btrfs replace cancel <mount_point>
Cancel a running device replace operation.
[root@home disk]# btrfs replace cancel /store/backup_big_btrfs
ERROR: not a btrfs filesystem: /store/backup_big_btrfs
[root@home disk]# mount -o degraded /dev/sdd1 /store/backup_big_btrfs/
[root@home disk]# btrfs replace cancel /store/backup_big_btrfs/
[root@home disk]# umount /store/backup_big_btrfs/
[root@home disk]# mount /dev/sdd1 /store/backup_big_btrfs/
当您由于替换操作失败而无法挂载 btrfs 时:
- 检查你的 btrfs 卷
- 使用选项安装-o 降级
- 取消替换操作
- 卸载 btrfs 卷
- 无需任何选项即可安装