Najpierw spowiedź: nie, nie zrobiłem kopii zapasowych, które powinienem mieć.
Po drugie, sytuacja:
Mam Dell XPS 9550 z dyskiem SSD z Fedorą 25 .
Pracowałem nad plikiem i próbowałem go zapisać, gdy powiedziano mi, że próbuję zapisać w systemie plików tylko do odczytu . Okazuje się, że mój system plików jest teraz tylko do odczytu i wszędzie są błędy we / wy .
Udało mi się zapisać niektóre pliki, wysyłając je e-mailem do siebie przez otwartą przeglądarkę internetową, ale to się zawiesiło i nie mogę go ponownie uruchomić. Ale nadal mam pliki zainteresowania otwarte w edytorze. Nie mogę nigdzie zapisać plików, ale mogę skopiować ich zawartość. Gdybym tylko znalazł sposób na eksfiltrację zawartości pliku, mógłbym zaoszczędzić miesiące pracy.
Ale istnieją pewne okropne ograniczenia. Próbowałem włożyć dysk USB, ale żadne urządzenie go nie reprezentuje, a mount
polecenie umiera z powodu awarii. Mogę spróbować ssh do innego komputera, ale dostaję „błąd magistrali” i umiera. ping
, dmesg
, ifconfig
Żadna z tych prac. Ale mam vim
i less
i ls
i może pojawiać nowe bash
instancje.
Nie lynx
, nie firefox
, nie google-chrome
. Nie ma napędu DVD.
Zasadniczo wygląda na to, że mój dysk SSD zmarł. A może cała płyta główna. Wciąż mam w pamięci dokumenty o dużej wartości, mam adres IP i połączenie sieciowe, mogę uruchomić kilka losowych poleceń i mieć 3500 więcej na ścieżce, którą mógłbym wypróbować.
cat
i gcc
wydaje się, że działa. Mogę pisać do plików w / tmp. Mam działającą ipython
instancję, która nadal działa.
Więc ... to, co próbowałem do tej pory, zawiodło. Ale czuję, że wciąż istnieje tysiąc możliwości. Czego nie rozważam? Jak mogę usunąć te pliki z mojego umierającego komputera?
Musi być jakiś sposób.
AKTUALIZACJA : Nowe rzeczy:
- Utraciłem połączenie sieciowe z powodu mojej własnej głupoty.
- Napisałem skrypt Pythona do zastąpienia
cp
icp -r
- O ile nie znajdę jakiegoś sposobu na utworzenie
/dev
wpisu dla karty SD lub napędów USB, moim najlepszym sposobem na uzyskanie danych wydaje się być ekran i ewentualnie głośniki / kabel audio. - Piszę skrypt, aby spróbować odczytać pliki i wyświetlić, które z nich są czytelne.
Sugestie wciąż bardzo mile widziane!
AKTUALIZACJA 2 : Nowsze rzeczy:
- Na umierającym komputerze napisałem skrypt w języku Python, który odczyta plik po kawałku i spróbuje przekazać te fragmenty poprzez flashowanie ekranu jednym lub drugim kolorem. Obecnie próbuje stworzyć dwubitowy kod, w którym czerwony, zielony, niebieski i biały reprezentują dwubitową parę. Jednak to nie działa tak dobrze, więc mogę po prostu przełączyć się na dwa kolory i zrobić po jednym.
- Na moim drugim laptopie (zaufanym starym Thinkpadzie, który zrezygnowałem z tego nowego XPSa) napisałem skrypt, który czyta z kamery internetowej przy użyciu biblioteki OpenCV Python. Chodzi o to, aby dekodować kody wysyłane przez inny komputer. Problem polega na tym, że liczba klatek na sekundę z kamery wynosi około 15 klatek na sekundę, co oznacza, że gdybym miał doskonały, bezbłędny transfer, moja maksymalna szybkość przesyłania danych wynosiłaby 30 bitów na sekundę, tj. 225 bajtów na sekundę. To 324 tys. Dziennie.
- Na konającym XPSie mogę
tar
spakować pożądane pliki do jednego archiwum, które ma 1,7 MB. Niestetygzip
,bzip2
,xz
,lzop
i cokolwiek kompresji narzędzia są niedostępne. ALE za pomocązlib
modułu Pythona mogę skompresować ten plik do 820 KB. Biorąc pod uwagę ten rozmiar, prawdopodobnie mógłbym wysłać tę rzecz w ciągu kilku dni. - Ponieważ ta metoda przesyłania prawdopodobnie będzie bardzo podatna na błędy, zamierzam zaimplementować kody Hamminga na XPS, aby dodać pewną korektę błędu podczas przesyłania danych.
- Prawdopodobnie pojawią się komplikacje, ponieważ tak się dzieje, ale przynajmniej wydaje się, że w jakiś sposób jest możliwe uzyskanie tych danych!
- Ponieważ nadal jest to dość podły sposób przesyłania danych, przyjrzałem się bardziej sterownikom szeregowym USB. Moduły Próbowałem załadować (
usb-serial-simple
,usb-debug
,safe-serial
) daje błąd wejścia / wyjścia. Nie sądzę, żeby był wbudowany w jądro, ponieważ nie ma żadnych urządzeń / dev / ttyUSB *.
Dzięki za dotychczasowe sugestie - wiem, że to nie jest nawet dobrze zdefiniowane pytanie, ponieważ nie wiecie z góry, które programy / pliki można odczytać, czy nie. Nadal otwarte na lepsze sugestie niż to podejście wideo!
AKTUALIZACJA 3 : Najnowsze rzeczy
- Mam kamerę internetową PS3 Eye i po wyłączeniu automatycznego wzmocnienia i ekspozycji z powodzeniem odczytuję dane z XPS, choć z błędem 1 bajta na sekundę. To wielki sukces --- pierwsze dane zostały wyekstrahowane! Ale tempo jest zbyt wolne, aby uzyskać 820 KB w rozsądnym czasie, a poziom błędu jest zbyt wysoki.
- Problem polega na tym, że pisanie do terminala jest zbyt wolne. Aktualizacje ekranu nie są niczym natychmiastowym, dzięki (myślę) powolności
urxvt
emulatora terminala, do którego mam dostęp. - Odkryłem, że mam dostęp do kompilatora Rust na XPS. Przepisałem skrypt transmisji za pomocą Rust, aby sprawdzić, czy poprawi to szybkość odświeżania terminala, ale to nie pomogło.
- Ponieważ raczej nie będę w stanie zwiększyć liczby klatek na sekundę, będę musiał zwiększyć ilość danych na ramkę. Moje obecne podejście wygląda mniej więcej tak:
Prawa połowa wciąż jest sygnałem zegarowym, miga i gaśnie, aby zaznaczyć nadejście nowych klatek. Ale lewa strona jest teraz siatką, w której każda komórka jest oznaczona czerwonym kwadratem w rogu, a następnie zielona komórka po prawej i w dół od czerwonego kwadratu jest włączana i wyłączana, aby wskazać nieco. Czerwone kwadraty powinny pozwolić komputerowi odbierającemu skalibrować lokalizację komórek. Nie mam jeszcze żadnych danych w ten sposób, ale nad tym pracuję.
- Ktoś zasugerował, żebym zajął się pisaniem kodów QR zamiast tych ad hoc wzorców kolorów. Ja też przyjrzę się temu i być może zastosuję to zamiast tego podejścia gridowego. Korekta błędów byłaby dobrą wygraną, podobnie jak możliwość korzystania ze standardowych bibliotek do dekodowania.
- Dowiedziałem się, że mam dostęp do libasound (biblioteki dźwięków ALSA), ale nie do plików nagłówkowych z nim powiązanych (
alsa/asoundlib.h
lub cokolwiek innego). Jeśli ktoś wie, jak korzystać z biblioteki współużytkowanej bez nagłówków, lub może pomóc mi napisać odpowiedni nagłówek, aby umożliwić mi generowanie wyjścia audio, to mógłbym uzyskać dźwiękowy sposób na wydobycie plików. - Alternatywnie, jeśli ktoś mógłby mi pomóc w manipulowaniu urządzeniami USB bez dostępu do libusb, to może mógłbym coś z tym zrobić?
Idąc naprzód!
AKTUALIZACJA 4 : wyprodukowano wyjście audio!
Użytkownik Francesco Noferi wykonał świetną robotę, pomagając mi korzystać z biblioteki ALSA wspomnianej w poprzedniej aktualizacji. Kompilator C miał problem, ale używając kompilatora Rust mogłem użyć FFI do bezpośredniego połączenia libasound
. Odgrałem teraz sporo moich danych przez dźwięk i to brzmi jak muzyka dla moich uszu! Nadal muszę ustanowić prawdziwy kanał komunikacji, ale mam nadzieję. W tym momencie moim zadaniem jest w zasadzie wdrożenie modemu, więc jeśli ktoś ma jakieś wskazówki na temat dobrych sposobów na zrobienie tego, jestem cały uszu. Idealna modulacja, którą łatwo wdrożyć ręcznie i demodulacja, do której istnieje istniejąca biblioteka, której mogę użyć. Ponieważ teoretycznie może to przebiegać bezpośrednio przez kabel audio, a nie przez sieć telefoniczną możemy zrobić znacznie lepiej niż 56 kb / s lub cokolwiek, co było w normie, ale w praktyce kto wie, co otrzymamy.
Dziękuję wszystkim, którzy śledzą tutaj i at / r / techsupportmacgyver i at / r / rust, którzy wnoszą tak wiele doskonałych sugestii. Wkrótce zaimplementuję ten „modem”, a potem skończę z epilogiem. Myślę, że mógłbym gdzieś umieścić swój kod, aby inni zdesperowani ludzie mogli z niego skorzystać w przyszłości - może nawet repozytorium dziwnych narzędzi do filtrowania, które można łatwo wpisać ręcznie w umierającą maszynę? Zobaczymy co się stanie.
AKTUALIZACJA 5 : Dużo czasu zajęło mi zmaganie się z ALSA i moim tanim urządzeniem przechwytującym audio StarTech USB (brak wbudowanej linii w odbierającym laptopie) i wielu fałszywych zaczyna próbować zrolować własny protokół transmisji, ale w końcu pod radą niektórych Moi entuzjaści krótkofalarstwa, moi przyjaciele, wdrożyłem protokół linii RTTY działający z prędkością 150 bodów, co w praktyce daje mi około 10 bajtów na sekundę. Nie jest super szybki, ale jest dość niezawodny. I prawie gotowe jest przesyłanie mojego pliku 820 KB, zweryfikowanego przy użyciu sum kontrolnych CRC32 (przy użyciu funkcji crc32 z Pythonazlib
moduł, do którego mam dostęp). Więc ogłaszam zwycięstwo i chcę jeszcze raz podziękować! Spędzę trochę więcej czasu na znajdowaniu kolejnych plików, które można odczytać i które mogę przenieść, ale podstawa jest już gotowa. Praca ze wami wszystkimi była fajna!
AKTUALIZACJA KOŃCOWA :
Na maszynie do umierania:
$ 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.
Na maszynie ratunkowej:
$ 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
. Teraz udostępniasz pliki za pośrednictwem serwera HTTP na porcie 8000 . Otwórz przeglądarkę na innym urządzeniu w tej samej sieci i wpisz następujące polecenie: http://<IP address>:8000
i zacznij pobierać wszystko, co możesz.