まず、告白:いいえ、私は持っているべきであるバックアップをしませんでした。
第二に、状況:
私はソリッドステートディスクを実行しているFedora 25を搭載したDell XPS 9550を持っています。
ファイルに取り組んでいて、読み取り専用ファイルシステムに保存しようとしていると言われたときに保存しようとしました。私のファイルシステムは現在読み取り専用であることが判明しました、そして至る所にI/Oエラーがあります。
開いているWebブラウザを介して自分自身にそれらを電子メールで送信することによって、いくつかのファイルを保存することができましたが、それはクラッシュし、私はそれを再起動することができません。しかし、私はまだ興味のあるファイルをエディタで開いています。ファイルをどこにも保存できないようですが、その内容をコピーすることはできます。ファイルの内容を抽出する方法を見つけることができれば、数ヶ月の作業を省くことができます。
しかし、いくつかのひどい制限があります。 USBドライブを挿入しようとしましたが、それを表すデバイスが表示されず、mount
コマンドがsegfaultで終了します。私は別のコンピュータにSSH接続しようとすることができますが、私は「バスエラー」を受け取り、それは死にます。 ping
、dmesg
、ifconfig
、これらのどれも動作しません。しかし、私はvim
とless
とls
を持っていて、新しいbash
インスタンスを生成することができます。
いいえlynx
、いいえfirefox
、いいえgoogle-chrome
。 DVDドライブはありません。
基本的にそれは私のSSDが死んだようです。またはマザーボード全体かもしれません。私はまだメモリに大きな価値の文書を持っています、私はIPアドレスとネットワーク接続を持っています。
cat
とgcc
はうまくいくようです。/tmpのファイルに書き込めます。まだ動作しているようですが、実行中のipython
インスタンスがあります。
だから...私がこれまでに試したことは失敗しました。しかし、私はまだ千の可能性があるように感じます。私は何を考えていませんか?どうすれば私は死にかけているコンピュータからこれらのファイルを入手できますか?
方法があるはずです。
UPDATE:新しいもの:
cp
とcp -r
を置き換えるPythonスクリプトを書きました。/dev
エントリを作成する方法を見つけられない限り、データを出力するための私の最善の策は、画面とおそらくスピーカー/オーディオケーブルのようです。提案はまだ大歓迎です!
UPDATE 2:新しいもの:
tar
を使って目的のファイルを1つのアーカイブ(1.7 MB)にまとめることができます。残念ながら、gzip
、bzip2
、xz
、lzop
、そしてどんな圧縮ユーティリティも利用できません。しかし、Pythonのzlib
モジュールを使用すると、このファイルを820KBまで圧縮できます。そのサイズを考えると、私はおそらくこのことを2、3日で送ってもらうことができます。usb-serial-simple
、usb-debug
、safe-serial
)は入出力エラーを出します。/dev/ttyUSB *デバイスが存在しないため、カーネルに組み込まれているとも思いません。これまでのみんなの提案に感謝します---あなたがみんながどのプログラム/ファイルを読むことができるかどうかわからないのでこれは明確な質問でさえないことを私は知っています。まだこのビデオアプローチよりも良い提案にオープンです!
UPDATE 3:最新のもの
urxvt
ターミナルエミュレータが遅いことに感謝します(私は思う)。右半分はまだクロック信号で、新しいフレームの到着を示すために点滅します。しかし、左はグリッドになっていて、各セルは隅にある赤い四角でマークされています。そして、赤い四角から右下の緑のセルが点滅しています。赤い四角は、受信側のコンピュータにセルの位置を調整させるはずです。私はこの方法でデータをまだ持っていませんが、それが私が取り組んでいるものです。
alsa/asoundlib.h
など)にはアクセスできないことを知りました。ヘッダなしで共有ライブラリを利用する方法を誰かが知っている場合、またはオーディオ出力を生成するために正しいヘッダを書くことを手助けできる場合は、オーディオベースの方法でファイルを取り出すことができます。前進する!
UPDATE 4:オーディオ出力が生成されました。
ユーザーFrancesco Noferiは、前回のアップデートで述べたALSAライブラリを利用するのに役立つ素晴らしい作業をいくつか行っています。 Cコンパイラには問題がありましたが、Rustコンパイラを使用すると、FFIを使用してlibasound
を直接呼び出すことができました。私は今、オーディオでデータの束を演奏していて、それは私の耳には音楽のように聞こえます!それでも本物の通信チャネルを確立する必要がありますが、私は非常に期待しています。この時点で私の仕事は基本的にモデムを実装することなので、誰かがそのための良い方法について何かガイダンスを持っているのであれば私はすべて耳です。理想的には手動で実装するのが簡単な変調と私が使用できる既存のライブラリがあるための復調。これは電話ネットワークを通さずに直接オーディオケーブルを経由することができるので、理論的には56kbpsよりもはるかに良いことができます。手に入れます。
この記事に従ってください、そして at/r/techsupportmacgyver および at/r/Rust の非常に多くの優れた貢献に感謝します提案。この「モデム」を間もなく実装するつもりですが、それからエピローグでこれで終わります。将来的に他の絶望的な人々が利用するために自分のコードをどこかに置くかもしれないと思います - たぶん手作業で死にかけているマシンに入力するのが簡単な奇妙な抽出ツールのリポジトリでさえも?何が起こるか見ていきます。
UPDATE 5:ALSAと私の安価なStarTech USBオーディオキャプチャデバイスとの戦いには長い時間がかかりました(受信機に内蔵の行はありません)そして、多くの偽りが私自身の送信プロトコルを転がそうとし始めました、しかし私の友人の熱心な友人のアドバイスの下で私は RTTYラインプロトコル runningを実行しました150ボー、実際には1秒間に約10バイトです。それは超高速ではありませんが、かなり信頼できます。そして私はCRC32チェックサム(Pythonのzlib
モジュールのcrc32機能を使って、これにアクセスできます)を使って検証された私の820KBのファイルを転送し終えたところです。だから私は勝利を宣言し、もう一度感謝したいと思います!もう少し時間をかけて、読み取り可能で転送可能なファイルを見つけますが、基盤は整っています。皆さんと一緒に仕事をするのは楽しいことです。
最終更新:
死にかけているマシンで:
$ 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.
レスキューマシン上:
$ 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
:-)
これは、基本的な2チャンネルの44.1k wav出力をヘッダなしで出力するのに十分な定義を持つlibasoundプログラムの例です。
編集:wavのようにデータをまっすぐにダンプすることがうまくいくかどうか、実際にはわからない、録音時のノイズが容易にそれを損傷する可能性があるが、あなたはおそらくより信頼できる高周波のビットの正弦波のような何かをすることができる
EDIT2:もしaplayが存在しそしてうまく動作すればあなたはそれを使うことができそして生のオーディオを出力しそれをaplayあるいはオーディオを再生できる何かにパイプするプログラムを書くことができます
EDIT3:ヘッダを一切使わないように修正
-lasoundがコンパイルされない場合は、-L/path /を追加します。ここで、/ libasound /は/ locationsです。
/*
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;
}
あなたのHDMIまたは他のディスプレイ出力ポートは機能していますか?もしそうなら、あなたはビデオとしてそれを記録し、後で処理するためにスクリーンキャプチャデバイスを使用することができます。したがって、あなたのWebカメラのフレームレートによって制限されることはありません。
あなたのデータを16進エンコードして、ページごとに端末に出力するのはどうですか。
あなたは簡単にページを再生成することができるようにバイナリのオフセットで接頭辞を追加することができます(手動修正のために?)
その後、別のコンピュータでページをスキャンするためにOCRソフトウェアを使用します。
80 x 25端末では、1ページあたり1000バイトになります(プレフィックス用のスペースを差し引く)。それで、およそ1000ページであなたはあなたのデータを取り出すことができました。 1秒間に1ページであっても、20分以内です。
16進エンコーディングは書きやすく、生の形式のエラー訂正も提供します(有効なシンボルは16個だけです)。
あなたはネットワーク接続を設定できますか? sshは多すぎるかもしれませんが、2台のマシンでnetcatを使用できる場合は、データを転送できる可能性があります。 1つは送信モード、もう1つはリスニングモードです。あなたがする必要があるすべてがテキストを転送することであるならば、これは解決策であるかもしれません..
編集:決して気にしないで、ちょうどあなたもあなたのネットワーク接続を失ったことを読んで..
ロングショットですが、一部のディストリビューションにはハム無線プロトコルが組み込まれています。一般的なものの1つはfldigiです。どのfldigiを試してください。
あなたがこれや他のものを持っているならば、彼らは通常位相シフトキーイングのいくつかの変化を使用してテキストをオーディオに変換します。出力はあなたのスピーカー/ヘッドフォンに行き、そして同じ部屋の安定したコンピューターによって受け取られて、そのマイクの上にリストします。 (これにより、電波を介して音声を送受信するハムラジオが排除されます)。
QRコードのアプローチは良いかもしれません。あなたはスクリーン上にできるだけ多くを収めることができ、そしてあなたの端末があなたを許すとすぐにそれらをリフレッシュすることができます。次に、XPSの画面をカメラで記録し(Webカメラを使用するのではなく)、保存したビデオを解読するだけで済みます。でもスローモーションキャプチャを使用すると便利かもしれません。
素晴らしい番組:)私は1つの提案があります:あなたは他のコンピュータのサウンドカードに接続されたフォトダイオードを使って画面からデータを読むこともできます。
あなたはファイルを送ることを含めてコマンドラインから自分自身に電子メールを送ることができます。
何かのようなもの:
$ mail -s "Hello World" [email protected] < /tmp/urgentFileToSave.txt
うまくいくはずです。
その他の例: http://www.binarytides.com/linux-mail-command-examples/
あなたはあなたのマシンからSSDを取り除き、他の作業マシン上でdd
/photorec
/etcにすることができます。
これが9550用の Dellサービスマニュアルです - 「ソリッドステートドライブの取り外し」の項を参照してください。ドライブを取り外すと、外付けのM.2 USBエンクロージャを手に入れてディスクを別のマシンに接続してデータを回復できます。