web-dev-qa-db-ja.com

これらの文書を忘却から死にかけているマイシンに保存できますか?

まず、告白:いいえ、私は持っているべきであるバックアップをしませんでした。

第二に、状況:

私はソリッドステートディスクを実行しているFedora 25を搭載したDell XPS 9550を持っています。

ファイルに取り組んでいて、読み取り専用ファイルシステムに保存しようとしていると言われたときに保存しようとしました。私のファイルシステムは現在読み取り専用であることが判明しました、そして至る所にI/Oエラーがあります。

開いているWebブラウザを介して自分自身にそれらを電子メールで送信することによって、いくつかのファイルを保存することができましたが、それはクラッシュし、私はそれを再起動することができません。しかし、私はまだ興味のあるファイルをエディタで開いています。ファイルをどこにも保存できないようですが、その内容をコピーすることはできます。ファイルの内容を抽出する方法を見つけることができれば、数ヶ月の作業を省くことができます。

しかし、いくつかのひどい制限があります。 USBドライブを挿入しようとしましたが、それを表すデバイスが表示されず、mountコマンドがsegfaultで終了します。私は別のコンピュータにSSH接続しようとすることができますが、私は「バスエラー」を受け取り、それは死にます。 pingdmesgifconfig、これらのどれも動作しません。しかし、私はvimlesslsを持っていて、新しいbashインスタンスを生成することができます。

いいえlynx、いいえfirefox、いいえgoogle-chrome。 DVDドライブはありません。

基本的にそれは私のSSDが死んだようです。またはマザーボード全体かもしれません。私はまだメモリに大きな価値の文書を持っています、私はIPアドレスとネットワーク接続を持っています。

catgccはうまくいくようです。/tmpのファイルに書き込めます。まだ動作しているようですが、実行中のipythonインスタンスがあります。

だから...私がこれまでに試したことは失敗しました。しかし、私はまだ千の可能性があるように感じます。私は何を考えていませんか?どうすれば私は死にかけているコンピュータからこれらのファイルを入手できますか?

方法があるはずです。

UPDATE:新しいもの:

  • 私は自分の愚かさのためにネットワーク接続を失いました。
  • cpcp -rを置き換えるPythonスクリプトを書きました。
  • SDカード用、またはUSBドライブ用の/devエントリを作成する方法を見つけられない限り、データを出力するための私の最善の策は、画面とおそらくスピーカー/オーディオケーブルのようです。
  • 私はファイルを読んで試してみることができるファイルを出力するためのスクリプトを書いています。

提案はまだ大歓迎です!

UPDATE 2:新しいもの:

  • 死にかけているコンピュータ上で、私は少しずつファイルを読み、スクリーンを1色または別の色に点滅させることによってそれらのビットを伝えることを試みるPythonスクリプトを書きました。現在、赤、緑、青、そして白がすべて2ビットのペアを表す2ビットのコードを作成しようとしています。しかし、これではうまくいきませんので、2色に切り替えて一度に1ビットずつ操作します。
  • 私の他のラップトップ(私がこの熱い新しいXPSのためにあきらめた信頼できる古いThinkpad)で、私はOpenCV Pythonライブラリを使ってウェブカメラから読むスクリプトを書きました。これは、他のコンピュータから送信されたコードを復号化することを目的としています。問題は、カメラからのフレームレートが毎秒15フレームのようなものであるということです。つまり、完璧でエラーのない転送があった場合、私の最大データレートは毎秒30ビット、つまり毎秒225バイトになります。それは一日324kです。
  • 死にかけているXPSでは、tarを使って目的のファイルを1つのアーカイブ(1.7 MB)にまとめることができます。残念ながら、gzipbzip2xzlzop、そしてどんな圧縮ユーティリティも利用できません。しかし、Pythonのzlibモジュールを使用すると、このファイルを820KBまで圧縮できます。そのサイズを考えると、私はおそらくこのことを2、3日で送ってもらうことができます。
  • この転送方法は非常にエラーが発生しやすいので、データを送信するときにエラー訂正を追加するためにXPSにハミングコードを実装します。
  • たぶんそれが起こるので複雑さがあるでしょう、しかし少なくともそれはどういうわけかこのデータを取り出すことは実行可能であるようです!
  • これはまだかなり厄介なデータ送信方法であるため、私はUSBシリアルドライバについて詳しく調べました。私がロードしようとしたモジュール(usb-serial-simpleusb-debugsafe-serial)は入出力エラーを出します。/dev/ttyUSB *デバイスが存在しないため、カーネルに組み込まれているとも思いません。

これまでのみんなの提案に感謝します---あなたがみんながどのプログラム/ファイルを読むことができるかどうかわからないのでこれは明確な質問でさえないことを私は知っています。まだこのビデオアプローチよりも良い提案にオープンです!

UPDATE 3:最新のもの

  • 私はPS3 Eyeウェブカメラを手に入れました、そしてその自動利得と露出を無効にした後に、1秒あたりのエラー1バイトであるにもかかわらず、XPSからデータを正常に読んでいます。これは大成功です---最初のデータが明らかにされました!しかし、速度が遅すぎて、なんらかの合理的な時間内に820KBを取り出すことができず、エラー率も高すぎます。

One bit transmission with clock

  • 問題は、端末への書き込みが遅すぎることです。私がアクセスできるurxvtターミナルエミュレータが遅いことに感謝します(私は思う)。
  • 私はXPS上のRustコンパイラにアクセスできることを発見しました。 Rustを使用して転送スクリプトを書き直して、端末のリフレッシュ速度が向上するかどうかを確認しましたが、役に立ちませんでした。
  • 私はフレームレートを上げることができそうにないので、私は私が1フレームあたりに得るデータ量を増やすようにしなければならないでしょう。私の現在のアプローチは次のようになります。

grid transmission

右半分はまだクロック信号で、新しいフレームの到着を示すために点滅します。しかし、左はグリッドになっていて、各セルは隅にある赤い四角でマークされています。そして、赤い四角から右下の緑のセルが点滅しています。赤い四角は、受信側のコンピュータにセルの位置を調整させるはずです。私はこの方法でデータをまだ持っていませんが、それが私が取り組んでいるものです。

  • 私はこれらのアドホックカラーパターンの代わりにQRコードを書くことを検討することを誰かが提案しました。私もそれを調べて、おそらくこのグリッドアプローチの代わりにそれを実装するつもりです。エラー訂正は、標準ライブラリを使用してデコードすることができることと同様に、素晴らしい勝利です。
  • 私はlibasound(ALSAサウンドライブラリ)にアクセスできるが、それに関連するヘッダファイル(alsa/asoundlib.hなど)にはアクセスできないことを知りました。ヘッダなしで共有ライブラリを利用する方法を誰かが知っている場合、またはオーディオ出力を生成するために正しいヘッダを書くことを手助けできる場合は、オーディオベースの方法でファイルを取り出すことができます。
  • 代わりに、誰かがlibusbにアクセスすることなくUSBデバイスを操作するのを手伝うことができるならば、多分私はそれで何かをすることができますか?

前進する!

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

:-)

49
Josh Hansen

これは、基本的な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;
}
15

あなたのHDMIまたは他のディスプレイ出力ポートは機能していますか?もしそうなら、あなたはビデオとしてそれを記録し、後で処理するためにスクリーンキャプチャデバイスを使用することができます。したがって、あなたのWebカメラのフレームレートによって制限されることはありません。

3
user169884

あなたのデータを16進エンコードして、ページごとに端末に出力するのはどうですか。

あなたは簡単にページを再生成することができるようにバイナリのオフセットで接頭辞を追加することができます(手動修正のために?)

その後、別のコンピュータでページをスキャンするためにOCRソフトウェアを使用します。

80 x 25端末では、1ページあたり1000バイトになります(プレフィックス用のスペースを差し引く)。それで、およそ1000ページであなたはあなたのデータを取り出すことができました。 1秒間に1ページであっても、20分以内です。

16進エンコーディングは書きやすく、生の形式のエラー訂正も提供します(有効なシンボルは16個だけです)。

2
Jan

あなたはネットワーク接続を設定できますか? sshは多すぎるかもしれませんが、2台のマシンでnetcatを使用できる場合は、データを転送できる可能性があります。 1つは送信モード、もう1つはリスニングモードです。あなたがする必要があるすべてがテキストを転送することであるならば、これは解決策であるかもしれません..

編集:決して気にしないで、ちょうどあなたもあなたのネットワーク接続を失ったことを読んで..

1
Xzenor

ロングショットですが、一部のディストリビューションにはハム無線プロトコルが組み込まれています。一般的なものの1つはfldigiです。どのfldigiを試してください。

あなたがこれや他のものを持っているならば、彼らは通常位相シフトキーイングのいくつかの変化を使用してテキストをオーディオに変換します。出力はあなたのスピーカー/ヘッドフォンに行き、そして同じ部屋の安定したコンピューターによって受け取られて、そのマイクの上にリストします。 (これにより、電波を介して音声を送受信するハムラジオが排除されます)。

0
JimR

QRコードのアプローチは良いかもしれません。あなたはスクリーン上にできるだけ多くを収めることができ、そしてあなたの端末があなたを許すとすぐにそれらをリフレッシュすることができます。次に、XPSの画面をカメラで記録し(Webカメラを使用するのではなく)、保存したビデオを解読するだけで済みます。でもスローモーションキャプチャを使用すると便利かもしれません。

0
Ezhik

素晴らしい番組:)私は1つの提案があります:あなたは他のコンピュータのサウンドカードに接続されたフォトダイオードを使って画面からデータを読むこともできます。

0
Milo O'h

あなたはファイルを送ることを含めてコマンドラインから自分自身に電子メールを送ることができます。

何かのようなもの:

$ mail -s "Hello World" [email protected] < /tmp/urgentFileToSave.txt

うまくいくはずです。

その他の例: http://www.binarytides.com/linux-mail-command-examples/

0
mcalex

Pythonはあなたのオーディオ出力ポートにアクセスできますか?あなたはそれを使ってデータを転送しようとするかもしれません - this または that を見てください。

0
lukeg

あなたはあなたのマシンからSSDを取り除き、他の作業マシン上でdd/photorec/etcにすることができます。

これが9550用の Dellサービスマニュアルです - 「ソリッドステートドライブの取り外し」の項を参照してください。ドライブを取り外すと、外付けのM.2 USBエンクロージャを手に入れてディスクを別のマシンに接続してデータを回復できます。

0
DankMemes