Tout d'abord, une confession: non, je n'ai pas fait les sauvegardes que je devrais avoir.
Deuxièmement, la situation:
J'ai un Dell XPS 9550 avec un disque SSD exécutant Fedora 25 .
Je travaillais sur un fichier et j'ai essayé de l'enregistrer quand on m'a dit que j'essayais de l'enregistrer sur un système de fichiers en lecture seule . Il se trouve que mon système de fichiers est en lecture seule à présent et qu'il y a des erreurs d'E / S partout.
J'ai pu sauvegarder une partie des fichiers en les envoyant par courrier électronique via un navigateur Web ouvert, mais cela s'est bloqué et je suis incapable de le relancer. Mais j'ai encore des dossiers d'intérêt ouverts dans un éditeur. Je n'arrive pas à enregistrer les fichiers où que ce soit, mais je peux en copier le contenu. Si seulement je pouvais trouver un moyen d’exfiltrer le contenu du fichier, je pourrais économiser un mois de travail.
Mais il y a des limites horribles. J'ai essayé d'insérer un lecteur USB, mais aucun périphérique ne semble le représenter et la mount
commande meurt avec un segfault. Je peux essayer de ssh sur un autre ordinateur, mais je reçois une "erreur de bus" et il meurt. ping
, dmesg
, ifconfig
, Aucun de ces travaux. Mais j'ai vim
et less
et ls
et peut générer de nouvelles bash
instances.
Non lynx
, non firefox
, non google-chrome
. Il n'y a pas de lecteur de DVD.
Fondamentalement, il semble que mon disque SSD soit mort. Ou peut-être toute la carte mère. J'ai des documents de grande valeur encore en mémoire, j'ai une adresse IP et une connexion réseau, je peux exécuter quelques commandes aléatoires et 3500 autres sur le chemin que je pourrais essayer.
cat
et gcc
semblent fonctionner. Je peux écrire dans des fichiers dans / tmp. J'ai une ipython
instance en cours d'exécution qui semble toujours fonctionner.
Alors ... ce que j'ai essayé jusqu'à présent a échoué. Mais j'ai l'impression qu'il y a encore mille possibilités. Qu'est-ce que je n'envisage pas? Comment pourrais-je éventuellement récupérer ces fichiers de mon ordinateur en train de mourir?
Il doit y avoir un moyen.
MISE À JOUR : nouveautés:
- J'ai perdu ma connexion réseau à cause de ma propre stupidité.
- J'ai écrit un script Python pour remplacer
cp
etcp -r
- À moins que je ne trouve un moyen de créer une
/dev
entrée pour la carte SD ou pour les clés USB, mes meilleurs atouts pour extraire des données semblent être l'écran et éventuellement le câble haut-parleur / audio. - J'écris un script pour essayer de lire des fichiers et de sortir ceux qui sont lisibles.
Les suggestions sont toujours les bienvenues!
MISE À JOUR 2 : Nouveautés récentes:
- Sur l'ordinateur mourant, j'ai écrit un script Python qui lit un fichier à la fois et essaie de transmettre ces bits en faisant clignoter l'écran d'une couleur ou d'une autre. En ce moment, on essaie de créer un code à deux bits où rouge, vert, bleu et blanc représentent tous une paire de deux bits. Cela ne fonctionne pas très bien, cependant, je pourrais simplement passer à deux couleurs et faire un peu à la fois.
- Sur mon autre ordinateur portable (le vieux Thinkpad, que j'ai abandonné pour ce nouveau XPS), j'ai écrit un script qui lit à partir de la webcam à l'aide de la bibliothèque OpenCV Python. L'idée est de le décoder les codes envoyés par l'autre ordinateur. Le problème, c'est que le framerate de l'appareil photo est d'environ 15 images par seconde, ce qui signifie que si j'avais un transfert parfait et sans erreur, mon débit maximum serait de 30 bits par seconde, soit 225 octets par seconde. C'est 324k par jour.
- Sur le XPS en voie de disparition, je peux utiliser
tar
pour regrouper les fichiers souhaités dans une archive unique de 1,7 Mo. Malheureusement,gzip
,bzip2
,xz
,lzop
et quelles que soient les services publics de compression ne sont pas disponibles. MAIS en utilisant lezlib
module Python, je peux compresser ce fichier jusqu’à 820 Ko. Compte tenu de cette taille, je pourrais probablement recevoir cette chose dans quelques jours. - Étant donné que cette méthode de transfert sera probablement très sujette aux erreurs, je vais implémenter les codes de Hamming sur le système XPS afin d'ajouter une correction d'erreur lors de la transmission des données.
- Il y aura probablement des complications parce que c'est ce qui se produit, mais au moins, il semble en quelque sorte faisable d'obtenir ces données!
- Comme cela reste un moyen assez fastidieux d’envoyer des données, je me suis plus intéressé aux pilotes série USB. Les modules que j'ai essayé de charger (
usb-serial-simple
,usb-debug
,safe-serial
) donnent i / o des erreurs. Je ne pense pas non plus qu'il soit intégré au noyau, car il n'y a aucun périphérique / dev / ttyUSB * présent.
Merci pour les suggestions de chacun jusqu'à présent - je sais que ce n'est même pas une question bien définie car vous ne savez pas à l'avance quels programmes / fichiers peuvent être lus ou non. Toujours ouvert à de meilleures suggestions que cette approche vidéo!
UPDATE 3 : Nouveautés
- J'ai une webcam PS3 Eye et, après avoir désactivé son gain et son exposition automatiques, je lis avec succès les données du XPS, bien qu'un taux erroné de 1 octet par seconde. C’est un grand succès: les premières données ont été exfiltrées! Mais le taux est trop lent pour obtenir mes 820 Ko dans un délai raisonnable, et le taux d'erreur est trop élevé.
- Le problème est que l'écriture sur le terminal est trop lente. Les mises à jour d'écran ne sont pas instantanées, merci (je pense) à la lenteur de l'
urxvt
émulateur de terminal auquel j'ai accès. - J'ai découvert que j'ai accès à un compilateur Rust sur XPS. J'ai réécrit le script de transmission en utilisant Rust pour voir si cela améliorerait la vitesse d'actualisation du terminal, mais cela n'a pas aidé.
- Comme il est peu probable que je puisse augmenter le nombre d'images par seconde, je dois essayer d'augmenter la quantité de données que j'obtiens par image. Mon approche actuelle ressemble à ceci:
La moitié droite est toujours un signal d'horloge, clignotant pour marquer l'arrivée de nouvelles images. Mais la gauche est maintenant une grille où chaque cellule est marquée par un carré rouge dans le coin, puis la cellule verte à droite et en bas du carré rouge est clignotante pour indiquer un bit. Les carrés rouges doivent laisser l’ordinateur récepteur se calibrer à l’emplacement des cellules. Je n'ai pas encore de données, mais c'est ce sur quoi je travaille.
- Quelqu'un a suggéré que je cherche à écrire des codes QR au lieu de ces motifs de couleur ad hoc. Je vais aussi examiner cela, et peut-être mettre en place cette approche au lieu de cette approche par grille. La correction d'erreur serait une belle victoire, tout en permettant d'utiliser des bibliothèques standard pour décoder.
- J'ai appris que j'avais accès à libasound (la bibliothèque de sons ALSA), mais pas aux fichiers d'en-tête qui lui étaient associés (
alsa/asoundlib.h
ou quoi que ce soit d'autre). Si quelqu'un sait comment utiliser une bibliothèque partagée sans en-têtes, ou s'il peut m'aider à écrire le bon en-tête pour me permettre de produire une sortie audio, alors je pourrais avoir un moyen audio de sortir les fichiers. - Sinon, si quelqu'un pouvait m'aider à manipuler les périphériques USB sans accès à libusb, je pourrais peut-être faire quelque chose avec ça?
Avancer!
UPDATE 4 : sortie audio produite!
L’utilisateur Francesco Noferi a réalisé un travail remarquable en m'aidant à utiliser la bibliothèque ALSA mentionnée dans la mise à jour précédente. Le compilateur C avait un problème, mais en utilisant le compilateur Rust, je pouvais utiliser le FFI pour appeler directement libasound
. J'ai maintenant joué un tas de mes données sur audio et ça sonne comme de la musique à mes oreilles! Encore faut-il établir un véritable canal de communication, mais je me sens très optimiste. À ce stade, mon travail consiste essentiellement à mettre en place un modem. Si quelqu'un a des conseils sur la bonne façon de le faire, je suis tout ouïe. Idéalement, une modulation facile à mettre en œuvre manuellement et une démodulation pour laquelle il existe une bibliothèque que je peux utiliser. Comme cela peut aller directement sur un câble audio et non sur le réseau téléphonique, en théorie nous pouvons faire beaucoup mieux que 56 kbps ou peu importe la norme établie dans la journée, mais en pratique, qui sait ce que nous aurons.
Merci à tous ceux qui nous ont suivis ici et à / r / techsupportmacgyver et à / r / rouille pour leurs excellentes suggestions. Je vais bientôt faire installer ce "modem", puis je terminerai avec un épilogue. Je pense que je pourrais mettre mon code en place quelque part pour que d'autres personnes désespérées puissent l'utiliser à l'avenir --- peut-être même un référentiel d'outils étranges d'exfiltration faciles à taper manuellement dans une machine en train de mourir? Nous allons voir ce qui se passe.
MISE À JOUR 5 : Il m’a fallu beaucoup de temps pour lutter contre ALSA et mon périphérique de capture audio USB StarTech bon marché (aucune ligne intégrée sur le portable de réception), et de nombreux faux lancements tentent d’appliquer mon propre protocole de transmission, mais finalement sous les conseils de certains utilisateurs. Mes amis passionnés de radio Ham ont mis en œuvre le protocole de ligne RTTY fonctionnant à 150 bauds, ce qui en pratique me donne peut-être environ 10 octets par seconde. Ce n'est pas super rapide mais c'est assez fiable. Et j’ai presque fini de transférer mon fichier de 820 Ko, vérifié à l’aide des sommes de contrôle CRC32 (à l’aide de la fonctionnalité crc32 de Python).zlib
module auquel j'ai accès). Donc, je déclare la victoire et tiens à remercier encore une fois! Je vais passer un peu plus de temps à trouver d'autres fichiers lisibles et que je peux transférer, mais les bases sont en place. Ça fait plaisir de travailler avec vous tous!
MISE À JOUR FINALE :
Sur la machine à mourir:
$ 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.
Sur la machine de secours:
$ 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
. Vous partagez maintenant les fichiers via un serveur http sur le port 8000 . Ouvrez un navigateur sur un autre appareil du même réseau et tapez ce qui suit: http://<IP address>:8000
et commencez à télécharger tout ce que vous pouvez.