Jos*_*sen 52 linux fedora crash bash ssd
首先,坦白:不,我没有做我应该做的备份。
二、情况:
我有一台带有运行Fedora 25的固态磁盘的戴尔 XPS 9550 。
我正在处理一个文件,并在被告知我试图保存到只读文件系统时尝试保存它。原来我的文件系统现在是只读的,而且到处都是i/o 错误。
我可以通过打开的网络浏览器通过电子邮件将它们发送给我自己来保存一些文件,但是它崩溃了,我无法重新启动它。但是我仍然在编辑器中打开了感兴趣的文件。我似乎无法将文件保存在任何地方,但我可以复制它们的内容。如果我能找到一种方法来窃取文件内容,我就可以节省数月的工作。
但是有一些可怕的限制。我试图插入一个 USB 驱动器,但似乎没有设备代表它,并且该mount命令因段错误而终止。我可以尝试通过 ssh 连接到另一台计算机,但是我收到“总线错误”并且它死了。ping, dmesg, ifconfig, 这些都不起作用。但我有vim和less和ls,可以产生新的bash实例。
不lynx,不firefox,不google-chrome。没有 DVD 驱动器。
基本上看来我的SSD已经死了。或者整个主板。我的内存中仍有非常有价值的文档,我有一个 IP 地址和网络连接,我可以运行一些随机命令,并且在我可以尝试的路径上还有 3500 个。
cat并且gcc似乎有效。我可以写入 /tmp 中的文件。我有一个ipython似乎仍在运行的正在运行的实例。
所以......到目前为止我所尝试的都失败了。但我觉得还有一千种可能。我没有考虑什么?我怎么可能从我垂死的计算机上获取这些文件?
一定有办法。
更新:新东西:
cp和cp -r/dev为 SD 卡或 USB 驱动器创建条目,否则我最好的方法是获取数据,似乎是屏幕,可能还有扬声器/音频线。建议仍然非常欢迎!
更新2:更新的东西:
tar用来将所需的文件打包到一个 1.7 MB 的存档中。不幸的是,gzip,bzip2,xz,lzop和任何压缩实用程序不可用。但是使用 Python 的zlib模块我可以将这个文件压缩到 820KB。考虑到这个尺寸,我可能会在几天内把这东西寄出去。usb-serial-simple, usb-debug, safe-serial) 出现 i/o 错误。我也不认为它内置在内核中,因为没有 /dev/ttyUSB* 设备存在。到目前为止,感谢大家的建议——我知道这甚至不是一个明确定义的问题,因为你们事先不知道可以读取哪些程序/文件。仍然愿意接受比此视频方法更好的建议!
更新 3:最新的东西
urxvt我可以访问的终端模拟器的缓慢。右半部分仍然是时钟信号,闪烁以标记新帧的到来。但是左边现在是一个网格,每个单元格在角落里用红色方块标记,然后红色方块右侧和下方的绿色单元格闪烁以指示位。红色方块应该让接收计算机校准细胞所在的位置。我还没有通过这种方式获得任何数据,但这就是我正在研究的。
alsa/asoundlib.h或其他)。如果有人知道如何在没有标题的情况下使用共享库,或者可以帮助我编写正确的标题来让我生成音频输出,那么我可以有一种基于音频的方式来获取文件。向前进!
更新 4:产生音频输出!
用户 Francesco Noferi 做了一些很棒的工作,帮助我利用了之前更新中提到的 ALSA 库。C 编译器有问题,但使用 Rust 编译器我可以使用 FFI 直接调用libasound. 我现在已经通过音频播放了一堆我的数据,这听起来像我耳朵里的音乐!仍然需要建立一个真正的沟通渠道,但我感到非常有希望。在这一点上,我的工作基本上是实现一个调制解调器,所以如果有人有任何关于好的方法的指导,我会全神贯注。理想情况下,易于手动实现的调制和我可以使用的现有库的解调。由于这可以直接通过音频电缆而不是通过电话网络,理论上 我们可以做得比 56kbps 或当时的任何标准好得多,但实际上谁知道我们会得到什么。
感谢在这里和/r/techsupportmacgyver和/r/rust提供这么多优秀建议的每个人。很快就会实现这个“调制解调器”,然后我会用一个结语来结束它。我想我可能会把我的代码放在某个地方供其他绝望的人在未来使用——甚至可能是一个奇怪的渗透工具的存储库,这些工具很容易手动输入到垂死的机器中?我们会看看会发生什么。
更新 5:我花了很长时间与 ALSA 和我的廉价 StarTech USB 音频捕获设备(接收笔记本电脑上没有内置线路)搏斗,许多错误的开始试图推出我自己的传输协议,但最终在一些人的建议下我的业余无线电爱好者朋友我实现了以 150 波特运行的RTTY 线路协议,这实际上给了我大约每秒 10 个字节。它不是超快,但相当可靠。我几乎完成了传输我的 820KB 文件,使用 CRC32 校验和验证(使用 Python 的 crc32 功能zlib模块,我可以访问)。所以我要宣布胜利了,我要再次感谢!我会花更多的时间来寻找更多可读且可以传输的文件,但基础已经到位。和你们一起工作很有趣!
最后更新:
在垂死的机器上:
$ tar cf ./files
$ ./checksum.py ./files.tar 9999999
Part 1 checksum: -1459633665
$ ./zlib_compress.py ./files.tar
$ ./checksum.py ./files.tar.z 9999999
Part 1 checksum: -378365928
$ ./transmit_rust/target/debug/transmit ./files.tar.z
Transmitting files.tar.gz over audio using RTTY
Period size: 2048
Sample rate: 44100
Samples per bit: 294
Sending start signal.
Transmitting data.
nread: 2048
nread: 2048
...
nread: 2048
nread: 208
Transmission complete. Sending hold signal.
Run Code Online (Sandbox Code Playgroud)
在救援机器上:
$ minimodem --rx -8 --rx-one -R 44100 -S 915 -M 1085 --startbits 3
--stopbits 2 --alsa=1 150 -q > ./files.tar.z
$ ./checksum.py ./files.tar.z
Part 1 checksum: -378365928
$ ./zlib_decompress.py ./files.tar.z
$ ./checksum.py ./files.tar
Part 1 checksum: -1459633665
Run Code Online (Sandbox Code Playgroud)
:-)
Fra*_*eri 15
这是一个示例 libasound 程序,它的定义刚好足以获得基本的 2 声道 44.1k wav 输出,而无需头文件。
编辑:我实际上不确定直接将数据转储为 wav 是否可行,因为录制时的噪音很容易损坏它,但是您可能可以在高频下执行诸如正弦波之类的操作,这样更可靠
EDIT2:如果 aplay 存在并且可以工作,您也可以使用它,只需编写一个输出原始音频的程序并将其通过管道传输到 aplay 或任何可以播放音频的东西
EDIT3:将其修改为根本不使用任何标题
如果 -lasound 无法编译,请添加 -L/path/where/libasound/is/located
/*
gcc alsa_noheader.c -lasound
cat stuff.wav | ./a.out
*/
typedef unsigned int uint;
typedef unsigned long ulon;
int printf(char*, ...);
void* malloc(long);
long read(int fd, void* buf, ulon count);
int snd_pcm_open(void**, char*, int, int);
ulon snd_pcm_hw_params_sizeof();
int snd_pcm_hw_params_any(void*, void*);
int snd_pcm_hw_params_set_access(void*, void*, int);
int snd_pcm_hw_params_set_format(void*, void*, int);
int snd_pcm_hw_params_set_channels(void*, void*, uint);
int snd_pcm_hw_params_set_rate_near(void*, void*, uint*, int*);
int snd_pcm_hw_params(void*, void*);
int snd_pcm_hw_params_get_period_size(void*, ulon*, int*);
long snd_pcm_writei(void*, void*, uint);
int snd_pcm_prepare(void*);
int snd_pcm_drain(void*);
int snd_pcm_close(void*);
int main(int argc, char* argv[])
{
void* pcm;
void* params;
int rate;
int nchannels;
ulon frames;
void* buf;
int bufsize;
long nread;
snd_pcm_open(&pcm, "default", 0, 0);
params = malloc(snd_pcm_hw_params_sizeof());
snd_pcm_hw_params_any(pcm, params);
/* 3 = rw_interleaved */
snd_pcm_hw_params_set_access(pcm, params, 3);
/* 2 = 16-bit signed little endian */
snd_pcm_hw_params_set_format(pcm, params, 2);
/* 2 channels */
nchannels = 2;
snd_pcm_hw_params_set_channels(pcm, params, nchannels);
/* sample rate */
rate = 44100;
snd_pcm_hw_params_set_rate_near(pcm, params, &rate, 0);
snd_pcm_hw_params(pcm, params);
snd_pcm_hw_params_get_period_size(params, &frames, 0);
bufsize = frames * nchannels * 2;
buf = malloc(bufsize);
/* read file from stdin */
while (nread = read(0, buf, bufsize) > 0)
{
if (snd_pcm_writei(pcm, buf, frames) == -29)
{
printf("W: underrun\n");
snd_pcm_prepare(pcm);
}
}
snd_pcm_drain(pcm);
snd_pcm_close(pcm);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
12913 次 |
| 最近记录: |