最初の告白:いや、やるべきバックアップをしていませんでした
第二に、状況
私は、Dell XPS 9550とソリッドステートディスクでFedora 25を実行しています
あるファイルで作業をしていて、そのファイルを保存しようとしたら、読み取り専用のファイルシステムに保存しようとしていると言われました。結局、私のファイルシステムは読み取り専用になっていて、あちこちで i/o エラーが発生していることがわかりました
開いているWebブラウザで自分にメールを送って保存できたものもあったのですが、それがクラッシュしてしまい、再起動できません。それでもエディタで開いているファイルは残っています。ファイルをどこかに保存することはできないようだが、内容をコピーすることはできる。ファイルの中身を脱出させる方法さえ見つかれば、何ヶ月もの手間を省くことができるのに
しかし、恐ろしいほどの制限がある。USB ドライブを挿入しようとしましたが、それを表すデバイスが表示されず、mount
コマンドがセグメンテーションフォルトで死んでしまいます。別のコンピュータにsshしようとすると、「バスエラー」が出て死にます。ping
, dmesg
, ifconfig
, どれも動作しません。しかし、vim
, less
, ls
があり、新しい bash
インスタンスを生成することができます
lynx
もfirefox
もgoogle-chrome
もない。DVDドライブがない
基本的にSSDが死んだようです。マザーボード全体かもしれないまだメモリに価値のある文書が残っているし、IPアドレスとネットワーク接続もあるし、いくつかのランダムなコマンドを実行できるし、試すことができるパスには3500以上のものがある
cat
とgcc
は動作するようです。tmp にあるファイルに書き込むことができます。実行中の ipython
インスタンスはまだ動作しているようです
だから…今までやってみたことは失敗した。でも まだ千載一遇の可能性があるような気がするの私は何も考えていないのか?どうやって死にかけのパソコンから ファイルを取り出せばいいの?
何か方法があるはずです
UPDATE:新しいもの
- 自分のバカさ加減でネットワーク接続ができなくなった
- Pythonスクリプトを書いて
cp
とcp -r
を入れ替えてみました - SDカードやUSBドライブ用の
/dev
エントリを作成する方法が見つからない限り、データを取り出すための最善の策は、画面とスピーカー/オーディオケーブルのようです - ファイルを読み込んでみて、どのファイルが読めるかを出力するスクリプトを書いています
ご提案は大歓迎です
UPDATE 2: 新しいもの
- 瀕死のコンピュータで、私はPythonスクリプトを書きました。これはファイルをビットごとに読み込んで、画面を一色または別の色で点滅させることでビットを伝えようとします。今のところ、赤、緑、青、白はすべて2ビットのペアを表す2ビットのコードを実行しようとしています。しかし、これはそれほどうまくいっていないので、2色に切り替えて1ビットずつにしようかなと思っています
- もう一つのラップトップ(この新しいXPSのために手放した信頼できる古いThinkpad)で、OpenCVのPythonライブラリを使ってウェブカメラから読み取るスクリプトを書きました。アイデアは、それが他のコンピュータによって送信されたコードをデコードすることです。問題は、カメラからのフレームレートが毎秒15フレームのようなものであることです。つまり、完璧でエラーのない転送をした場合、最大データレートは毎秒30ビット、つまり毎秒225バイトになります。つまり、1日あたり324kです
- 瀕死のXPSでは、
tar
を使って目的のファイルを1.7MBの1つのアーカイブに圧縮することができますが、残念ながらgzip
、bzip2
、xz
、lzop
は利用できません。残念ながら、gzip
,bzip2
,xz
,lzop
, その他の圧縮ユーティリティは利用できません。しかし、Pythonのzlib
モジュールを使って、このファイルを820KBに圧縮することができます。このサイズを考えると、おそらく数日でこのファイルを送ることができるでしょう - この転送方法だとかなりエラーが出やすいので、XPSにハミングコードを実装して、データを転送しながらエラー修正を加えていこうと思っています
- それが起こるので、おそらく複雑になるでしょうが、少なくともこのデータを取り出すことは何らかの形で実現可能だと思われます
- これでもかなりヘタクソなデータの送り方なので、USBシリアルドライバをもっと調べてみました。ロードしようとしたモジュール(
usb-serial-simple
,usb-debug
,safe-serial
)はi/oエラーを出します。カーネルに組み込まれているとは思えないし、/dev/ttyUSB* デバイスが存在しないからだ
みんなの提案に感謝しています–どのプログラム/ファイルが読めるか読めないかを事前に知らないので、これは明確に定義された質問ですらないことを知っています。このビデオのアプローチよりも良い提案があれば、まだオープンです!
UPDATE 3: 最新のもの
- 私はPS3のアイウェブカメラを手に入れ、その自動ゲインと露出を無効にした後、正常にXPSからデータを読み取っています, 1秒あたり1バイトのエラーではあるが.これは大成功です – 最初のデータが流出した!しかし、私の820KBを取得するには、速度が遅すぎます。しかし、レートが遅すぎて、合理的な時間の任意の並べ替えで私の820KBを取得するには、エラー率が高すぎる
- 問題は、ターミナルへの書き込みが遅すぎることです。私がアクセスしている
urxvt
ターミナルエミュレータの遅さのおかげで、画面の更新が瞬間的なものではありません (だと思います) - XPSでRustコンパイラにアクセスできることを発見しました。Rust を使って送信スクリプトを書き換えて、ターミナルの更新速度が改善されるかどうか確認してみましたが、何の役にも立ちませんでした
- フレームレートを上げることができそうにないので、1フレームあたりのデータをどれだけ上げられるか試してみることにします。現在の私のアプローチは以下のような感じです
右半分はまだ時計信号で、新しいフレームの到着を示すために点滅しています。左側はグリッドになっていて、各セルは隅に赤い四角でマークされ、赤い四角の右と下にある緑のセルが点滅してビットを示します。赤い四角は、受信側のコンピュータがセルの位置を較正できるようにしてくれます。この方法ではまだデータが渡っていませんが、これが私が取り組んでいることです
- 誰かが提案してくれたのですが、その場しのぎのカラーパターンではなく、QRコードを書くことを検討してみてはどうでしょうか。私もそれを調べて、おそらくこのグリッドアプローチの代わりにそれを実装するつもりです。誤り訂正は、標準ライブラリを使ってデコードできるだけでなく、良い勝利になるでしょう
- libasound (ALSAサウンドライブラリ)にはアクセスできますが、それに関連するヘッダファイル(
alsa/asoundlib.h
か何か)にはアクセスできないことを知りました。もし誰か、ヘッダなしで共有ライブラリを利用する方法を知っている人がいたら、あるいは、オーディオ出力を生成するための適切なヘッダを書くのを手伝ってくれる人がいたら、オーディオベースの方法でファイルを取り出すことができるかもしれません - 代わりに、誰かがlibusbにアクセスせずにUSBデバイスを操作するのを手伝ってくれれば、それで何かできるかもしれませんね?
Moving forward!
UPDATE 4: 音声出力を行いました
ユーザーのFrancesco Noferi氏は、前回の更新で述べたALSAライブラリの利用を手伝ってくれました。Cコンパイラには問題がありましたが、Rustコンパイラを使ってFFIを使って直接libasound
に呼び出すことができました。今、私のデータの束をオーディオで再生してみましたが、私の耳には音楽のように聞こえました。まだ実際の通信チャネルを確立する必要がありますが、私は非常に希望を感じています。この時点では、私の仕事は基本的にモデムを実装することなので、もし誰か良い方法を知っている人がいれば、ぜひ聞きたいです。手作業で簡単に実装できる変調と、既存のライブラリが使える復調が理想です。これは電話網ではなくオーディオケーブルを介して直接通信できるので、理論的には56kbpsや当時の標準規格であったものよりもはるかに良いことができますが、実際には何が得られるかは誰にもわかりません
ここでフォローしてくれた皆さん、そして at /r/techsupportmacgyver と at /r/rust が多くの素晴らしい提案を提供してくれたことに感謝します。近いうちにこの「モデム」を実装して、エピローグでこれを終わらせるつもりです。将来、他の絶望的な人々が利用するために、どこかに私のコードを置くかもしれないと思います–もしかしたら、瀕死のマシンに手で入力するのが簡単な奇妙な脱出ツールのリポジトリかもしれませんね?何が起こるか見てみましょう
UPDATE 5.それは私がALSAと私の安いStarTech USBオーディオキャプチャデバイス(受信ラップトップ上の組み込みラインがない)と格闘し、私自身の伝送プロトコルをロールバックしようとする多くの偽の開始と長い時間がかかりましたが、最終的に私のいくつかのハム無線愛好家の友人のアドバイスの下で私はRTTYラインプロトコルを実装しました150ボーで実行されている、実際には私に毎秒多分約10バイトを与えることができます。超高速ではありませんが、かなり信頼性が高いです。そして、CRC32チェックサムを使って検証した820KBのファイルの転送がほぼ完了しました(Pythonのzlib
モジュールのcrc32機能を使っています。というわけで、私は勝利を宣言し、もう一度感謝の気持ちを伝えたいと思います。私はもう少し時間をかけて、読めるファイルを見つけて転送できるようにしますが、基礎は整っています。皆さんと一緒に仕事ができて楽しかったです
FINAL UPDATE:
死にそうな機械の上で
$ 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
🙂
50 None 2017-11-16
ここには、基本的な2チャンネル44.1kのwav出力をヘッダなしで出力するための十分な定義を持つlibasoundプログラムの例があります
EDIT: 録音時のノイズが簡単にそれを損傷する可能性があるので、私は実際には、ストレートアップ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;
}
15 Francesco Noferi 2017-11-30
あなたのHDMIまたは他のディスプレイの出力ポートは動作していますか?もしそうなら、スクリーンキャプチャデバイスを使用してビデオとして記録し、後で処理することができます。したがって、あなたのウェブカメラのフレームレートによって制限されていません
5 user169884 2017-11-30
データを16進数化して1ページごとに端末に出力してみてはどうでしょうか?
バイナリにオフセットのある接頭辞をつけることで、簡単にページを再生できるようになります(手動で修正するため?
その後、別のコンピュータでいくつかのOCRソフトウェアを使用してページをスキャンします
80×25のターミナルは、1ページあたり1000バイト(プレフィックスのためのスペースをいくつか差し引いたもの)を生成します。つまり、だいたい1000ページでデータを取り出すことができます。1秒に1ページだとしても、20分もかからない
16進エンコーディングは書きやすく、エラー訂正の生の形式も提供します(有効なシンボルは16個しかありません)
3 Jan 2017-11-30
ネットワーク接続を設定できますか? sshはちょっとやりすぎかもしれませんが、2台のマシンでnetcatを使用できれば、データを転送できるかもしれません。テキストを転送するだけなら、これが解決策になるかもしれません
編集:忘れた、ちょうどあなたもネットワーク接続を失ったことを読んだ
2 Xzenor 2017-11-30
ファイルの送信など、コマンドラインから自分でメールをすることができるようになるかもしれません
Something like:
$ mail -s "Hello World" user@yourmaildomain.com < /tmp/urgentFileToSave.txt
should work.
さらにいくつかの例をご紹介します。http://www.binarytides.com/linux-mail-command-examples/
0 mcalex 2017-11-16
お使いのマシンからSSDを取り外して、dd
/photorec
/etc.を別の作業用マシンで使用することができます
ここに9550用のデルのサービスマニュアル – 「ソリッドステートドライブの取り外し」の項を参照してください。ドライブを取り外したら、外付けのM.2 USBエンクロージャを入手し、ディスクを別のマシンに取り付けてデータを復元することができます
0 DankMemes 2017-12-01
望みは薄いですが、いくつかのディストロにはハム無線プロトコルが組み込まれています。一般的なものとしては fldigi があります。どのfldigiか試してみてください
あなたがこれまたは別のものを持っている場合、彼らは通常、位相シフトキーイングのいくつかのバリエーションを使用して、オーディオにテキストを変換します。出力は、あなたのスピーカー/ヘッドフォンに行き、そのマイクにリスト、同じ部屋で安定したコンピュータによって受信されます。これは、電波を介してオーディオを送受信するハムラジオを排除します)
0 JimR 2017-12-02
QRコードのアプローチは良いかもしれません。画面上にできるだけ多く表示して、端末が許可するとすぐに更新することができます。その後、カメラでXPSの画面を録画する (ウェブカメラを使用するのではなく) と、単にあなたが保存したビデオを解読する作業を行います。スローモーションキャプチャを使うのも便利かもしれません
0 Ezhik 2017-12-02
素晴らしいショー :)私は1つの提案があります:あなたはまた、他のコンピュータのサウンドカードに接続されたフォトダイオードを使用して画面からデータを読み取ることができます
0 Milo O’h 2017-12-02