Zuerst ein Geständnis: Nein, ich habe nicht die Backups gemacht, die ich haben sollte.
Zweitens ist die Situation:
Ich habe ein Dell XPS 9550 mit einer Solid State Disk running Fedora 25.
Ich habe an einer Datei gearbeitet und versucht, sie zu speichern, als mir mitgeteilt wurde, dass ich auf einem schreibgeschützten Dateisystem speichern möchte. Es stellte sich heraus, dass mein Dateisystem jetzt schreibgeschützt ist und überall I/O-Fehler auftreten.
Ich konnte einige der Dateien speichern, indem ich sie über einen offenen Webbrowser per E-Mail an mich selbst schickte. Das ist jedoch abgestürzt und ich kann sie nicht erneut starten. Ich habe jedoch noch interessante Dateien in einem Editor geöffnet. Ich kann die Dateien anscheinend nirgendwo speichern, aber ich kann deren Inhalt kopieren. Wenn ich nur einen Weg finden könnte, den Dateiinhalt zu filtern, könnte ich mir monatelange Arbeit sparen.
Aber es gibt einige schreckliche Einschränkungen. Ich habe versucht, ein USB-Laufwerk anzuschließen, aber es wird kein Gerät angezeigt, das es darstellt, und der Befehl mount
stirbt mit einem Segfault. Ich kann versuchen, auf einen anderen Computer zu ssh, aber ich erhalte "Busfehler" und es stirbt. ping
, dmesg
, ifconfig
, keine dieser Arbeiten. Aber ich habe vim
und less
und ls
und kann neue bash
-Instanzen erzeugen.
Keine lynx
, keine firefox
, kein google-chrome
. Es gibt kein DVD-Laufwerk.
Grundsätzlich scheint meine SSD gestorben zu sein. Oder vielleicht das ganze Motherboard. Ich habe noch Dokumente von großem Wert im Speicher, ich habe eine IP-Adresse und eine Netzwerkverbindung, ich kann ein paar zufällige Befehle ausführen und weitere 3500 auf dem Pfad, den ich versuchen könnte.
cat
und gcc
scheinen zu funktionieren. Ich kann in Dateien in/tmp schreiben. Ich habe eine laufende ipython
-Instanz, die immer noch zu funktionieren scheint.
Also ... was ich bisher ausprobiert habe, ist gescheitert. Aber ich habe das Gefühl, dass es immer noch tausend Möglichkeiten gibt. Woran denke ich nicht? Wie könnte ich möglicherweise diese Dateien von meinem sterbenden Computer bekommen?
Es muss einen Weg geben.
UPDATE: Neues:
cp
und cp -r
zu ersetzen./dev
-Eintrag für die SD-Karte oder für USB-Laufwerke zu erstellen, sind der Bildschirm und möglicherweise die Lautsprecher/das Audiokabel meine besten Tipps zum Abrufen von Daten.Vorschläge noch sehr willkommen!
UPDATE 2: Neuere Sachen:
tar
die gewünschten Dateien in ein einziges Archiv packen, das 1,7 MB groß ist. Leider sind gzip
, bzip2
, xz
, lzop
und alle anderen Komprimierungsprogramme nicht verfügbar. ABER mit Pythons Modul zlib
kann ich diese Datei auf 820 KB komprimieren. Angesichts dieser Größe könnte ich das Ding wahrscheinlich in ein paar Tagen verschicken lassen.usb-serial-simple
, usb-debug
, safe-serial
), geben I/O-Fehler. Ich glaube auch nicht, dass es in den Kernel integriert ist, da keine/dev/ttyUSB * -Geräte vorhanden sind.Vielen Dank für alle Vorschläge bisher --- Ich weiß, dass dies nicht einmal eine genau definierte Frage ist, da ihr im Voraus nicht wisst, welche Programme/Dateien gelesen werden können oder nicht. Noch offen für bessere Vorschläge als dieser Video-Ansatz!
UPDATE 3: Neueste Sachen
urxvt
, auf den ich Zugriff habe.Die rechte Hälfte ist immer noch ein Taktsignal, das an und aus blinkt, um das Eintreffen neuer Frames zu kennzeichnen. Aber die linke Seite ist jetzt ein Raster, in dem jede Zelle durch ein rotes Quadrat in der Ecke markiert ist, und die grüne Zelle rechts und unten vom roten Quadrat blinkt auf und ab, um ein Bit anzuzeigen. Die roten Quadrate sollten den empfangenden Computer an der Stelle kalibrieren lassen, an der sich die Zellen befinden. Ich habe noch keine Daten auf diesem Weg, aber daran arbeite ich.
alsa/asoundlib.h
oder was auch immer). Wenn jemand weiß, wie man eine gemeinsam genutzte Bibliothek ohne die Header verwendet, oder wenn er mir helfen kann, genau den richtigen Header zu schreiben, damit ich eine Audioausgabe erzeuge, kann ich die Dateien auf Audiobasis rausholen.Vorwärts!
UPDATE 4: Audioausgabe erzeugt!
Benutzer Francesco Noferi hat großartige Arbeit geleistet und mir dabei geholfen, die im vorherigen Update erwähnte ALSA-Bibliothek zu nutzen. Der C-Compiler hatte ein Problem, aber mit dem Rust-Compiler konnte ich mit dem FFI direkt libasound
aufrufen. Ich habe jetzt eine Menge meiner Daten über Audio abgespielt und es klingt wie Musik in meinen Ohren! Ich muss noch einen echten Kommunikationskanal aufbauen, aber ich bin sehr hoffnungsvoll. Zu diesem Zeitpunkt besteht meine Aufgabe im Wesentlichen darin, ein Modem zu implementieren. Wenn also jemand eine Anleitung zu guten Methoden hat, bin ich ganz Ohr. Idealerweise ist die Modulation einfach per Hand zu implementieren und es gibt eine Demodulation, für die ich eine vorhandene Bibliothek verwenden kann. Da dies direkt über ein Audiokabel und nicht über das Telefonnetz erfolgen kann, können wir theoretisch viel besser als 56 kbit/s oder was auch immer der Standard früher war, aber in der Praxis weiß wer was wir bekommen.
Vielen Dank an alle, die hier mitgemacht haben und bei/r/techsupportmacgyver und bei/r/Rust , die so viele hervorragende Vorschläge gemacht haben. Wir werden dieses "Modem" bald implementieren und dann werde ich es mit einem Epilog abschließen. Ich denke, ich könnte meinen Code irgendwo für andere verzweifelte Leute aufstellen, um ihn in Zukunft zu nutzen - vielleicht sogar für ein Repository mit seltsamen Exfiltrationswerkzeugen, die sich einfach von Hand in eine Sterbe-Maschine eingeben lassen? Mal sehen was passiert.
UPDATE 5: Es hat lange gedauert, bis ich mit ALSA und meinem billigen StarTech-USB-Audioerfassungsgerät (keine eingebaute Leitung auf dem empfangenden Laptop) gerungen bin, und viele haben versucht, meine eigenen zu rollen Übertragungsprotokoll, aber schließlich habe ich auf Anraten einiger Amateurfunkfreunde das RTTY-Leitungsprotokoll mit 150 Baud implementiert, was mir in der Praxis etwa 10 Bytes pro Sekunde ergibt. Es ist nicht super schnell, aber es ist ziemlich zuverlässig. Und ich bin fast fertig damit, meine 820-KB-Datei zu übertragen, die mithilfe von CRC32-Prüfsummen überprüft wurde (mithilfe der crc32-Funktionalität aus Pythons Modul zlib
, auf das ich Zugriff habe). Also erkläre ich den Sieg und möchte mich noch einmal bedanken! Ich werde etwas mehr Zeit damit verbringen, weitere Dateien zu finden, die lesbar sind und die ich übertragen kann, aber die Grundlage ist vorhanden. Es hat Spaß gemacht, mit euch allen zu arbeiten!
FINAL UPDATE:
Auf der Sterbemaschine:
$ 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.
Auf der Rettungsmaschine:
$ 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
:-)
hier ist ein Beispiel für ein libasound-Programm mit gerade genug Definitionen, um eine grundlegende 2-Kanal-44.1k-WAV-Ausgabe ohne Header zu erhalten.
EDIT: Ich bin mir eigentlich nicht sicher, ob ein direktes Hochladen der Daten als WAV funktionieren würde, da Rauschen beim Aufnehmen diese leicht beschädigen könnte, aber Sie können wahrscheinlich so etwas wie eine Sinuswelle von Bits mit hoher Frequenz machen, was zuverlässiger ist
EDIT2: Wenn ein Play vorhanden ist und funktioniert, können Sie das auch verwenden und einfach ein Programm schreiben, das Roh-Audio ausgibt und in ein Play oder etwas anderes leitet, das Audio abspielen kann
EDIT3: Es wurde so geändert, dass keine Header mehr verwendet werden
wenn -lasound nicht kompiliert, fügen Sie -L/path/where/libasound/is/located hinzu
/*
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;
}
Funktioniert Ihr HDMI- oder ein anderer Bildschirmausgang? In diesem Fall können Sie ein Bildschirmaufzeichnungsgerät verwenden, um es als Video aufzuzeichnen und später zu verarbeiten. Dadurch wird die Framerate Ihrer Webcam nicht eingeschränkt.
Wie wäre es, wenn Sie Ihre Daten verhexen und Seite für Seite an das Terminal ausgeben?
Sie können ein Präfix mit dem Versatz in der Binärdatei hinzufügen, um eine Seite einfach neu zu generieren (zur manuellen Korrektur?)
Verwenden Sie dann auf einem anderen Computer eine OCR-Software, um die Seiten zu scannen.
80x25-Terminal würde 1000 Bytes pro Seite ergeben (abzüglich etwas Platz für das Präfix). Auf rund 1000 Seiten könnten Sie also Ihre Daten rausholen. Selbst bei einer Seite pro Sekunde sind das weniger als 20 Minuten.
Hex-Codierung ist einfach zu schreiben und bietet auch eine unformatierte Form der Fehlerkorrektur (es gibt nur 16 gültige Symbole).
kannst du eine Netzwerkverbindung aufbauen? ssh ist vielleicht ein bisschen zu viel, aber wenn Sie netcat auf 2 Computern verwenden können, können Sie möglicherweise Daten übertragen. eine im Sendemodus, eine im Hörmodus. Wenn Sie nur Text übertragen müssen, könnte dies eine Lösung sein.
edit: vergiss nicht, lies einfach, dass du auch deine Netzwerkverbindung verloren hast ..
Long Shot, aber in einigen Distributionen sind Amateurfunk-Protokolle eingebaut. Eines davon ist fldigi. Probier welchen fldigi.
Wenn Sie dies oder jenes haben, konvertieren sie Text in Audio, normalerweise unter Verwendung einer Variation der Phasenumtastung. Die Ausgabe erfolgt über Ihre Lautsprecher/Kopfhörer und wird von einem stabilen Computer im selben Raum empfangen, der auf dem Mikrofon aufgelistet ist. (Dies eliminiert die Amateurfunkgeräte, die das Audio über die Funkwellen senden und empfangen).
Der QR-Code-Ansatz könnte gut sein. Sie können so viele wie möglich auf den Bildschirm bringen und sie aktualisieren, sobald Ihr Terminal dies zulässt. Nehmen Sie dann den Bildschirm des XPS mit einer Kamera auf (im Gegensatz zur Verwendung einer Webcam) und entziffern Sie einfach das gespeicherte Video. Könnte hilfreich sein, um sogar Zeitlupenaufnahmen zu machen.
Tolle Show :) Ich habe einen Vorschlag: Sie können Daten auch mit einer Fotodiode vom Bildschirm lesen, die an die Soundkarte des anderen Computers angeschlossen ist
Sie können sich selbst über die Befehlszeile eine E-Mail senden, einschließlich des Versendens von Dateien.
So etwas wie:
$ mail -s "Hello World" [email protected] < /tmp/urgentFileToSave.txt
sollte arbeiten.
Einige weitere Beispiele: http://www.binarytides.com/linux-mail-command-examples/
Sie können die SSD von Ihrem Computer entfernen und dd
/photorec
/etc auf einem anderen funktionierenden Computer.
Hier ist das Dell-Servicehandbuch für den 9550 - siehe Abschnitt "Entfernen des Solid-State-Laufwerks". Sobald Sie das Laufwerk entfernt haben, können Sie ein externes M.2-USB-Gehäuse erwerben und die Festplatte an einen anderen Computer anschließen, um Ihre Daten wiederherzustellen.