从 btrfs 上的压缩原始数据恢复文件

从 btrfs 上的压缩原始数据恢复文件

我最近从联网仪器获取数据,将结果保存为文本文件。不幸的是,我在一次运行期间忘记更改文件名,并且成功覆盖了一个重要文件。

是否值得花费大量时间来恢复该文件?可悲的是,是的。这些数据是动物实验的重要组成部分,该实验需要花费数周的时间来准备。

我能够在原始磁盘上找到已删除的文件(使用 grep 方法)。但是,我的系统(btrfs)启用了 LZO 压缩,因此文件中只有少数部分以纯文本形式写入。如果我可以解压缩这些数据,我就可以恢复我的文件。

我面临的挑战是,btrfs 对其 LZO 压缩文件使用与 LZOP 等实用程序不同的页眉/页脚(据我所知)。因此,即使我有完整的文件并且知道它是如何压缩的,我也无法解码结果。

我正在研究的两个策略是:

1)将btrfs页眉/页脚修改为LZOP可以读取的页眉。

2)使用btrfs工具之一“重新发现”已删除的文件,该文件丢失但未从磁盘中删除。或者,如果我可以通过显式地向 btrfs 提供预期的原始数据来在 btrfs 中创建一个文件,那将会很有用。

我在使用这两种方法时面临的障碍是:btrfs 很复杂,而且 LZO 的文档很少。因此,研究此类非标准问题的解决方案一直具有挑战性。

我需要恢复的原始数据、压缩数据如下:

^Q^@^@
^@^@^@^@^@^@^@"^@nerve1_cuff2_run1_phase6_rampA.csvªu^D^@^@^@^@^@­^u^D^@^@^@^@^@=   ^@^@^@^@^@^@=   ^@^@^@^@^@^@^@^@^@^@^@^@^@^@^A^@^@^@è^C^@^@d^@^@^@<80><81>^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@<83>'½Z^@^@^@^@ÜÑ<9a>37(½Z^@^@^@^@>Þ?(7(½Z^@^@^@^@>Þ?(<83>'½Z^@^@^@^@ÜÑ<9a>3©u^D^@^@^@^@^@=   ^@^@^@^@^@^@^B^@^@^@^@E^E^@^@=^E^@^@^@
^C^A^ATime,Voltage,Current^M
0.0`^@
e+00    -3.62291°^A^K6.74129e-07^M
3,<98>^@^B27144¸^D^D2.86341¹^D6,<98>^@^B19476ø^D^B96474¹^D9*<98>^@^D5.42908¸^D^M1.03390e-06^M
1.2Ì^S^G1   -5.46949ø^D^B78325ù^D5+<98>^@^A2152ø^D^A8254'<99>^@8(<98>^@^D7.35047¸^D^C2.8822l^S^C6^M
2.1*<98>^@^A0896À"^D3.18038³^N2.4*<98>^@^A2904Ä^]^C3.5740`"<95> 7(<98>^@^D9.13875°^N^D5.47206´  (x^E^F1 -9.0993Ä^]^D5.53632ù^D3*4^A^A0773Ü&^C5.5675Ç^]3.6(<98>^@^B1.093<8c>:^F1 -7.3989'Ñ^A9*  <98>^@^A1280|&<8c>-^A6748Á"4*^T^F^C1.1296|&^F1   -6.2602Ã"4.5*4^A^A3289l^S<90>^N^B78413ª^X4.)^T^F^B1.293<98>+<98>^^^A2548Ý&5*^T^F^G1.26543e+0<98>^D^A6356xR^A6^M
5*^T^F^C1.4376È^X^C1.1896q^N5x^D)^T^F^C1.4511(<9b>^@924^?M5^M
1   -v  47h?<90>^A^A1925d^]<98>^D)^T^F^C1.6172'7^A399<98>+<98>^D+^T^F^A6008Ü&^C1.4441x+<98>^D+^W^F594(4^A   45857e-05^M    
7,^T^F^A7608`p<8c>^S^A7039'<98>^@+^T^F^B75760¼&^C1.7120É^X7,^T^F^A7577(7^A166Í^S8,^T^F^A9248p\<90>^N^A9370Ù+8,^T^Fx^DÐ5^B1.977<94>W^B5^M
8.+^W^F914<8c><88>µ 8h2<84>^](p^P^F1    -2.0489la<90>^A^A3495h?^B5^M
9.)^T^F^A2.02'¤^C^C2.3412hf<98>^D)^T^F^B2.060øR^C2.3101hf<98>^D)^T^F^B2.216ø+^C2.5738if5d<92>^A0200e*2l^S^A2133À"^C2.5826×  1.0{0e+0º^D02<94>~<8b>^X627<84>k´                                  paø^D^A3522'7^A902<88><8d><99>^D1h<92>*<98>^@l<88><94>   ^A9069×01.1h<92>'<9a>^@67<98> »^D325Ã"1.1x0û^D669èf^B2.751(l^B`^]'§^C651<9c><9b><97>                                                  746<80>p<8d>^S2x0'6^A45<80><97>Ú^D47'A^D2x0û^D814<8c>¯<98>^D^A9919t~´ x0ø^D^A7883Ä^]^B3.031çk1.3p^S'<9b>^@950Äkz^D94Ía1l¼(³^F767ì^S^B4.036÷~1.3*^T^F^A6608x^^^F1  -4.1916'é^G4*^W^F909ð5^C3.   3969'¥^C4(^T^F^C3.0201Äk^C3.6643Ë<8d>1.4(^T^Fu¿9(^H^C^B71043µ~1'Q^U2wó003<81>å1p^A^A7286Ûy1.5(^U^F3a¾7'^H^C|H(4^A(^W^F3.0Üé<84>^]^A0770×~1.5(^T^Fy^D6(Ü^D^A1408'!  6(^T^F^D3.15811¨<8d>^C4.    4145'¥^C6(,^L^B3.108à¾^C4.7772'm^B6(^T^F^C3.0823Ъ^C4.8710'M^G7(^T^F<85>^]2Ä^]^C5.6715'5^A7,^U^F4ôW^B5.728<90>Ñ<9d>M7+^U^F2'$^W
5.71477e-05^M
^Q^@^@  ^@^@^@^@^@^@^@"^@nerve1_cuff2_run1_phase4_rampA.csv¨u^D^@^@^@^@^@©u^D^@^@^@^@^@=    ^@^@^@^@^@^@= ^@^@^@^@^@^@^@^@^@^@^@^@^@^@^A^@^@^@è^C^@^@d^@^@^@<80><81>^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@I%½Z^@^@^@^@^Y^^þ7ý%½Z^@^@^@^@¾n­^8ý%½Z^@^@^@^@¾n­^8I%½Z^@^@^@^@^Y^^þ7¨u^D^@^@^@^@^@^@p^@^@^@^@^@^@^B^@^@^@^A^@<80>´ m^@^@^@^@@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@p^@^@^@^@^@^@^H^@^@^@^@^@^@^@#^@nerve1_cuff2_run1_phase3_pulseA.csv§u^D^@^@^@^@^@¨u^D^@^@^@^@^@Ém^@^@^@^@^@^@^@p^@^@^@^@^@^@^@^@^@^@^@^@^@^@^A^@^@^@è^C^@^@d^@^@^@<80><81>^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^A^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^W$½Z^@^@^@^@Ò<82>Å^LG%½Z^@^@^@^@í3ò&G%½Z^@^@^@^@í3ò&^W$½Z^@^@^@^@Ò<82>Å^L§u^D^@^@^@^@^@= ^@^@^@^@^@^@^B^@^@^@^@"^E^@^@^Z^E^@^@^@
--

我意识到如果没有二进制数据,这不是很有用,但它至少可以让您了解我正在查看的内容。我不太确定文件在磁盘上的开始和结束位置,因此我添加了一些额外的行。文件的第一行对应于:^C^A^ATime,Voltage,Current^M

纯文本文件看起来像这样:

^C^A^ATime,Voltage,Current                                                                     
0.00000e+00 7.05295e-01 -2.87974e-06
2.99999e+00 6.91690e-01 -2.88057e-06
6.00000e+00 6.89945e-01 -2.87807e-06
9.00000e+00 5.05297e-01 -8.11195e-06
1.20000e+01 4.78072e-01 -8.09407e-06
1.50000e+01 4.54195e-01 -8.11017e-06
1.80000e+01 3.06597e-01 -1.34169e-05
2.10000e+01 2.93734e-01 -1.34169e-05
2.40000e+01 2.76573e-01 -1.34177e-05
2.70000e+01 8.67963e-02 -1.88397e-05
3.00000e+01 6.46639e-02 -1.88236e-05
3.30000e+01 8.51750e-02 -1.87974e-05
... (61 lines in total)

我的磁盘安装时有以下选项:

UUID=XXXX   /home       btrfs       rw,nosuid,nodev,noatime,compress=lzo,ssd,space_cache,autodefrag,subvol=__active/home    0 0

任何帮助将不胜感激!

答案1

我能够通过从磁盘获取原始(压缩)数据并为其写入 LZOP 可以读取的新标头来解决我的问题。

尽管 LZOP 本身关于标头内容的文档很少,但我可以使用另一位需要此函数用于其他目的的作者的文档。如果其他人也遇到此问题,请参阅:https://github.com/MediaMath/go-lzop/blob/master/README.md

相关内容