如何恢复无法挂载的BTRFS分区?


13

12.04的安装一直失败,解决方案是让安装程序忽略我以前用于/ home的btrfs分区。

现在已经安装好了,我一直在尝试使其挂载btrfs分区,以便可以访问70GB的文件。它不会挂载,并且btrfsck出现以下三行错误:

parent transid verify failed on 31302336512 wanted 62455 found 62456
parent transid verify failed on 31302336512 wanted 62455 found 62456
parent transid verify failed on 31302336512 wanted 62455 found 62456

有人可以告诉我如何使该分区工作吗?我已经在线阅读了我可能可以使用btrfs-restore恢复数据的信息,但是在任何地方都找不到该程序。

Answers:


10

最简单的方法

btrfs-zero-log /dev/sda5

由于事务(写入或删除)卡在日志日志中并且磁盘与之不匹配,因此您遇到了这个问题。

怎么运行的:

因此,当数据第一次写入时会先写入日志,然后再写入磁盘(或同时写入磁盘,但是日志只会保存有关即将进行的写入的元数据-不确定...需要对该部分进行更多研究)...

无论如何,如果您在此写入/删除过程中关闭系统电源或执行某些操作以使系统正常运行(卸下用于保存btrfs挂载点的USB),则当该挂载返回时,该挂载将不起作用,它将失败(dmesgbtrfsck将向您显示错误的详细信息)...

查看dmesg,您将看到那些相同的无效消息。

您将看到如下内容:

parent transid verify failed on 109973766144 wanted 1823 found 1821

这意味着btrfs需要Transif 1826(在日志上),但是在磁盘上却看到1821。因此磁盘与日志不同步只有2个事务。我个人会在这里冒brtfs-zero-log的风险,仅因为它只有2笔交易。但是,如果这是您唯一的数据,请确保100%安全(顺便说一句,如果您有关键数据,则永远不要只有1个副本,而要始终在安全的其他位置进行副本/备份-指责btrfs的创建者不会证明没有备份的人自己没有责任的理由-btrfs不是备份解决方案,它是文件系统-除了在其他地方有副本以外,没有什么是真正的备份解决方案-甚至没有奇偶校验或镜像驱动器,真正的备份是坐在阿尔卑斯山的地下某个地方,而其有效副本在德克萨斯州的您的办公室中)

parent transid verify failed on 31302336512 wanted 62455 found 62456

在这里,日志需要62455,但磁盘在62456处领先一个,因此在您的情况下,我将清除日志。日记这次没有更新。再次,我告诉您,如果它只是您的唯一数据和非常重要的信息(对您来说很可耻),请确保它是安全的,为了安全起见,我将首先执行以下操作。

运行btrfsck / dev / sda5(顺便说一下,它只是执行只读检查,因此它是完全安全的,它是您唯一需要担心的btrfsck选项)也将向您显示这些消息。

但是请注意,如果这些数据很关键,我会首先这样做(正如其他绅士所说)

mount -t btrfs -o rootflags=recovery,nospace_cache /dev/sda3 /mnt/sda3

mount -t btrfs -o rootflags=recovery,nospace_cache,clear_cache /dev/sda3 /mnt/sda3

mount -t btrfs -o recovery,nospace_cache,nospace_cache /dev/sda3 /mnt/sda3

然后使用cp或rsync将所有文件同步到安全位置,然后在安全时执行btrfs-zero-log,如果操作成功,则只是浪费了很多时间来备份系统(但是,如果操作不成功,则只是保存了您的系统)屁股)

然后,如果挂载失败,请执行btrfs恢复(系统转储,据我所知是可恢复的操作,但是它会不时地询问Y或y,因此请观察输出)

btrfs restore /dev/sda5 /USB

然后在安全时(btrfs还原完成时)执行btrfs-zero-log,如果操作成功,则只是浪费了很多时间来备份系统(但如果不成功,则只是保存了备份)

您可以先运行屏幕

screen /bin/bash

btrfs restore /dev/sda5 /USB

屏幕侧注

要分离(命令仍将运行):CONTROL-a,然后输入不带引号的“:detach”,然后按Enter。

分离的另一种方法:然后关闭腻子或您的终端,它将分离(命令/ restore仍将运行)。

要对其进行检查,只需将其退回到屏幕即可:

screen -x

屏幕-x将附加到会话(即使已分离),并且与-h不同,即使它已经附加,它也将附加)

如果您有多个屏幕,则屏幕-x将告诉您需要更具体地附加到会话:

screen -ls

ls列出所有会话,很容易记住。

要查看PID,您还可以执行以下操作:

ps aux | grep screen

一旦找到您的PID,就可以像这样运行屏幕:

screen -x PID

这将附加到特定的会话。您可以在同一屏幕上附加多个会话/腻子(它们将输出相同的文本,您可以在其中键入命令,然后将它们镜像到另一个腻子上)


7

使用root fs挂载选项在引导上挂载:

rootflags=recovery,nospace_cache

要么

rootflags=recovery,nospace_cache,clear_cache

btrfs挂载选项的完整列表应在此处https://btrfs.wiki.kernel.org/index.php/Mount_options,其他内容也可能有用,例如noatime,nodatacow(已修复了内核错误,这给了我一个麻烦。有机会复制我的文件)。

将其添加到您的grub.cfg / menu.lst,或在引导时键入它。

nospace_cache的东西会使事情变得非常缓慢。只需启动,等待(长时间),关闭并正常启动即可。

几天前我有同样的事情,上面的解决了。但之后也出现了一些空间问题...报告的空间不是100%,但仍然可以说空间不足。

==

我认为您也可以在fstab中添加相同的选项,例如:

UUID=0237alksfadg-lhdfkj3624-4fdfjb-9dsfe2d-dfddaf /home btrfs defaults,recovery,nospace_cache,clear_cache,subvol=@home 0  
 2

如果您尝试恢复通过挂载在分区上的/ home目录UUID=0237alksfadg-lhdfkj3624-4fdfjb-9dsfe2d-dfddaf


为什么要两个nospace_cache
CVn 2012年

这是一个错字,应该是clear_cache
Peter

:)您刚刚通过备份保存了!
derflocki 2015年

1

Peter的回答为我解决了这个问题,尽管不是在Ubuntu上。我有一个/home分区btrfs,当然损坏了。由于系统已打开,因此无法启动fstab。我进入了维护模式,对该分区进行了哈希处理,然后正常启动(我有一个备用ext4分区,可以用作/home)。

我使用以下命令手动安装了分区:

mount -t btrfs -o recovery,nospace_cache,nospace_cache /dev/sda3 /mnt/sda3并且实际上能够保存我的数据。尽管安装它并不需要很长时间。谢谢彼得。


3
您可能只想在彼得的答案上发表评论,说“这可行”,然后将其标记为真实答案。否则,彼得将不会获得任何“真实”信用(代表点)
托马斯·沃德

1
mount -t btrfs -o ro,nospace_cache,nospace_cache /dev/sda3 /mnt/sda3

ro =只读

这对我有用


1
您是否已阅读@The Lord of Time的评论与添加为答案的类似评论?如果您不这样做,这里又是一个问题-“您可能只想在彼得的答案上发表评论,说“这可行”,然后将其标记为真实答案。否则,彼得将不会获得任何“真实”积分(rep points)“
geezanansa

1

我有同样的问题。重新启动后,我不再能够挂载我的btrfs分区。但是,这里提到的解决方案都无法解决它。

对我来说解决的是将内核从3.10升级到3.12。重新引导后,可以再次挂载btrfs分区。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.