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-Festplatte , auf der Fedora 25 ausgeführt wird .
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 es überall E / A-Fehler gibt .
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 mount
anzuschließen , aber es wird kein Gerät angezeigt, das es darstellt, und der Befehl wird mit einem Segfault abgebrochen. Ich kann versuchen, auf einen anderen Computer zu ssh, aber ich erhalte "Busfehler" und es stirbt. ping
, dmesg
, ifconfig
, Keines dieser Arbeit. Aber ich habe vim
und less
und ls
und kann neue bash
Instanzen erzeugen .
Nein lynx
, nein firefox
, nein 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 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:
- Ich habe meine Netzwerkverbindung wegen meiner eigenen Dummheit verloren.
- Ich habe ein Python-Skript geschrieben, um
cp
und zu ersetzencp -r
- Wenn ich keine Möglichkeit finde, einen
/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. - Ich schreibe ein Skript, um zu versuchen, Dateien zu lesen und auszugeben, welche lesbar sind.
Vorschläge noch sehr willkommen!
UPDATE 2 : Neuere Sachen:
- Auf dem sterbenden Computer habe ich ein Python-Skript geschrieben, das nach und nach eine Datei liest und versucht, diese Bits zu übermitteln, indem der Bildschirm in der einen oder anderen Farbe blinkt. Derzeit wird versucht, einen Zwei-Bit-Code zu erstellen, bei dem Rot, Grün, Blau und Weiß jeweils ein Zwei-Bit-Paar darstellen. Das funktioniert allerdings nicht so gut, deshalb wechsle ich möglicherweise zu zwei Farben und mache jeweils ein Bit.
- Auf meinem anderen Laptop (dem vertrauenswürdigen alten Thinkpad, das ich für dieses heiße neue XPS aufgegeben habe) habe ich ein Skript geschrieben, das mithilfe der OpenCV-Python-Bibliothek von der Webcam liest. Die Idee ist, die vom anderen Computer gesendeten Codes dekodieren zu lassen. Das Problem ist, dass die Bildrate von der Kamera etwa 15 Bilder pro Sekunde beträgt. Wenn ich also eine perfekte, fehlerfreie Übertragung hätte, wäre meine maximale Datenrate 30 Bit pro Sekunde, dh 225 Byte pro Sekunde. Das sind 324.000 pro Tag.
- Auf dem sterbenden XPS kann ich
tar
die gewünschten Dateien in ein einziges Archiv packen, das 1,7 MB groß ist. Leidergzip
,bzip2
,xz
,lzop
und was auch immer Komprimierungsprogramme sind nicht verfügbar. ABER mit Pythonszlib
Modul kann ich diese Datei auf 820 KB komprimieren. Angesichts dieser Größe könnte ich das Ding wahrscheinlich in ein paar Tagen verschicken lassen. - Da diese Übertragungsmethode wahrscheinlich sehr fehleranfällig ist, implementiere ich Hamming-Codes auf dem XPS, um beim Übertragen der Daten eine gewisse Fehlerkorrektur hinzuzufügen.
- Wahrscheinlich wird es Komplikationen geben, weil das passiert, aber zumindest scheint es irgendwie machbar, diese Daten herauszubekommen!
- Da dies immer noch eine ziemlich bescheuerte Methode zum Senden von Daten ist, habe ich mich mehr mit seriellen USB-Treibern befasst. Die Module I Last versucht haben (
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 bis jetzt --- 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 : Neuestes Zeug
- Ich habe eine PS3 Eye-Webcam und lese nach Deaktivierung der automatischen Verstärkung und Belichtung erfolgreich Daten vom XPS, wenn auch mit einer fehlerhaften Geschwindigkeit von 1 Byte pro Sekunde. Dies ist ein großer Erfolg - die ersten Daten werden ausgefiltert! Aber die Rate ist zu langsam, um meine 820 KB in einer angemessenen Zeit herauszubekommen, und die Fehlerrate ist zu hoch.
- Das Problem ist, dass das Schreiben in das Terminal zu langsam ist. Die Bildschirmaktualisierungen sind nicht so unmittelbar, dank der Langsamkeit des
urxvt
Terminal-Emulators, auf den ich Zugriff habe. - Ich habe festgestellt, dass ich auf dem XPS Zugriff auf einen Rust-Compiler habe. Ich habe das Übertragungsskript mit Rust umgeschrieben, um zu sehen, ob dies die Aktualisierungsgeschwindigkeit des Terminals verbessern würde, aber es hat nicht geholfen.
- Da es unwahrscheinlich ist, dass ich die Framerate erhöhen kann, muss ich versuchen, die Datenmenge zu erhöhen, die ich pro Frame erhalte. Mein aktueller Ansatz sieht ungefähr so aus:
Die rechte Hälfte ist immer noch ein Taktsignal, das an und aus blinkt, um das Eintreffen neuer Frames zu markieren. Aber die linke Seite ist jetzt ein Raster, in dem jede Zelle durch ein rotes Quadrat in der Ecke markiert ist. Dann blinkt die grüne Zelle rechts und unten vom roten Quadrat 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.
- Jemand schlug vor, ich solle QR-Codes anstelle dieser Ad-hoc-Farbmuster schreiben. Ich werde mich auch damit befassen und das vielleicht anstelle dieses Gitteransatzes implementieren. Die Fehlerkorrektur wäre ein schöner Gewinn, ebenso wie die Möglichkeit, Standardbibliotheken zum Dekodieren zu verwenden.
- Ich habe erfahren, dass ich Zugriff auf libasound (die ALSA-Soundbibliothek) habe, aber nicht auf die damit verbundenen Header-Dateien (
alsa/asoundlib.h
oder was auch immer). Wenn jemand weiß, wie man eine gemeinsam genutzte Bibliothek ohne die Header verwendet, oder mir helfen kann, genau den richtigen Header zu schreiben, damit ich eine Audioausgabe erzeuge, kann ich die Dateien auf Audiobasis rausholen. - Wenn mir jemand helfen könnte, die USB-Geräte zu manipulieren, ohne auf libusb zuzugreifen, könnte ich dann vielleicht etwas damit anfangen?
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 den FFI direkt aufrufen libasound
. 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 theoretisch direkt über ein Audiokabel und nicht über das Telefonnetz gehen kann Wir können viel besser als 56 kbit / s oder was auch immer der Standard damals war, aber in der Praxis, wer weiß, was wir bekommen werden.
Vielen Dank an alle, die hier mitgemacht haben und an / r / techsupportmacgyver und an / r / rust, die so viele exzellente Vorschläge beigesteuert 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-Audio-Capture-Gerät (keine eingebaute Leitung auf dem empfangenden Laptop) gerungen bin, und viele fingen falsch an, mein eigenes Übertragungsprotokoll zu erstellen, aber schließlich unter dem Rat einiger Freunde von Amateurfunkfreunden Ich habe das RTTY-Leitungsprotokoll mit 150 Baudimplementiert, was 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 mit der Übertragung meiner 820 KB großen Datei, die mit CRC32-Prüfsummen überprüft wurde (mit der crc32-Funktionalität von Python)zlib
Modul, 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
:-)
python -m SimpleHTTPServer
. Jetzt teilen Sie die Dateien über einen http-Server in Port 8000 . Öffnen Sie einen Browser auf einem anderen Gerät im selben Netzwerk und geben Sie Folgendes ein: http://<IP address>:8000
und beginnen Sie mit dem Herunterladen aller verfügbaren Informationen.