49

Во-первых, признание: нет, я не делал резервных копий, которые должен был иметь.

Во-вторых, ситуация:

У меня Dell XPS 9550 с твердотельным диском под управлением Fedora 25.

Я работал над файлом и попытался сохранить его, когда мне сказали, что я пытаюсь сохранить его в файловой системе только для чтения. Оказывается, моя файловая система теперь доступна только для чтения, и повсюду происходят ошибки ввода-вывода.

Я смог сохранить некоторые файлы, отправив их по электронной почте через открытый веб-браузер, но это не помогло, и я не могу перезапустить его. Но у меня все еще есть интересующие файлы, открытые в редакторе. Кажется, я не могу нигде сохранить файлы, но могу скопировать их содержимое. Если бы я только мог найти способ отфильтровать содержимое файла, я мог бы сэкономить месяцы работы.

Но есть некоторые ужасные ограничения. Я попытался вставить USB-накопитель, но, похоже, ни одно устройство не представляет его, и команда mount умирает с ошибкой сегмента. Я могу попробовать ssh к другому компьютеру, но я получаю "ошибку шины", и она умирает. ping , dmesg , ifconfig , ничего из этого не работает. Но у меня есть vim less и ls и я могу создавать новые экземпляры bash .

Нет lynx , нет firefox , нет google-chrome . Там нет DVD-привода.

Похоже, мой SSD умер. Или, может быть, вся материнская плата. У меня в архиве есть ценные документы, у меня есть IP-адрес и сетевое соединение, я могу выполнить несколько случайных команд и еще 3500 на пути, который я могу попробовать.

cat и gcc вроде бы работают. Я могу писать в файлы в /tmp. У меня есть работающий экземпляр ipython который все еще работает.

Итак ... то, что я пробовал до сих пор, провалилось. Но я чувствую, что есть еще тысяча возможностей. Что я не рассматриваю? Как я мог получить эти файлы с моего умирающего компьютера?

Должен быть способ.

ОБНОВЛЕНИЕ: Новые вещи:

  • Я потерял соединение с сетью из-за собственной глупости.
  • Я написал скрипт на Python для замены cp и cp -r
  • Если я не найду какой-либо способ создания записи /dev для SD-карты или USB-накопителей, мои лучшие ставки для вывода данных - это экран и, возможно, динамики / аудиокабель.
  • Я пишу сценарий, чтобы попробовать читать файлы и выводить, какие из них доступны для чтения.

Предложения по-прежнему очень приветствуются!

ОБНОВЛЕНИЕ 2: более новые вещи:

  • На умирающем компьютере я написал скрипт на Python, который будет поочередно читать файл и пытаться передать эти биты, мигая экраном одного цвета или другого. Сейчас он пытается создать двухбитный код, где красный, зеленый, синий и белый представляют двухбитную пару. Однако это не очень хорошо работает, поэтому я мог бы просто переключиться на два цвета и делать по одному.
  • На другом моем ноутбуке (старый надежный Thinkpad, который я отказался от этой новой XPS) я написал сценарий, который читает с веб-камеры с помощью библиотеки OpenCV Python. Идея состоит в том, чтобы он декодировал коды, отправленные другим компьютером. Проблема в том, что частота кадров с камеры составляет примерно 15 кадров в секунду, что означает, что если бы у меня была идеальная, безошибочная передача, моя максимальная скорость передачи данных была бы 30 бит в секунду, то есть 225 байтов в секунду. Это 324 КБ в день.
  • На умирающем XPS я могу использовать tar чтобы упаковать нужные файлы в один архив, который составляет 1,7 МБ. К сожалению, gzip , bzip2 , xz , lzop и любые другие утилиты сжатия недоступны. НО, используя zlib модуль Python, я могу сжать этот файл до 820 КБ. Учитывая этот размер, я мог бы, вероятно, отправить эту вещь через пару дней.
  • Поскольку этот метод передачи, вероятно, будет очень подвержен ошибкам, я собираюсь реализовать коды Хемминга на XPS, чтобы добавить некоторую коррекцию ошибок при передаче данных.
  • Скорее всего, будут осложнения, потому что это то, что происходит, но, по крайней мере, кажется возможным выполнимо получить эти данные!
  • Так как это все еще довольно неудачный способ отправки данных, я больше посмотрел на USB-драйверы для последовательного порта. Модули, которые я пытался загрузить (usb-serial-simple , usb-debug , safe-serial), выдают ошибки ввода -вывода . Я не думаю, что он встроен в ядро, потому что нет устройств /dev /ttyUSB *.

Спасибо за все предложения до сих пор - я знаю, что это даже не вполне определенный вопрос, так как вы, ребята, заранее не знаете, какие программы / файлы можно читать или нет. Все еще открыты для лучших предложений, чем этот видео подход!

ОБНОВЛЕНИЕ 3: Новые вещи

  • У меня есть веб-камера PS3 Eye, и после отключения ее автоматического усиления и экспонирования я успешно считываю данные с XPS, хотя и с ошибкой в 1 байт в секунду. Это большой успех - первые данные отфильтрованы! Но скорость слишком медленная, чтобы вывести мои 820 КБ в любое разумное время, и уровень ошибок слишком высок.

Один бит передачи с часами

  • Проблема в том, что запись в терминал происходит слишком медленно. Обновления экрана не похожи на мгновенные, спасибо (я думаю) медлительности эмулятора терминала urxvt которому у меня есть доступ.
  • Я обнаружил, что у меня есть доступ к компилятору Rust на XPS. Я переписал скрипт передачи, используя Rust, чтобы посмотреть, улучшит ли это скорость обновления терминала, но это не помогло.
  • Поскольку я вряд ли смогу увеличить частоту кадров, мне придется постараться увеличить объем данных, получаемых за кадр. Мой текущий подход выглядит примерно так:

сетка передачи

Правая половина по-прежнему является тактовым сигналом, который мигает, чтобы отметить появление новых кадров. Но теперь слева - это сетка, где каждая ячейка помечена красным квадратом в углу, а затем зеленая ячейка справа и вниз от красного квадрата мигает и выключается, чтобы указать немного. Красные квадраты должны позволить принимающему компьютеру откалибровать расположение ячеек. У меня пока нет данных, но я над этим работаю.

  • Кто-то предложил мне заняться написанием QR-кодов вместо этих специальных цветовых схем. Я тоже собираюсь разобраться в этом и, возможно, реализовать это вместо этого сеточного подхода. Исправление ошибок было бы хорошим преимуществом, а также возможность использовать стандартные библиотеки для декодирования.
  • Я узнал, что у меня есть доступ к libasound (звуковая библиотека ALSA), но не к заголовочным файлам, связанным с ним (alsa/asoundlib.h или что-то еще). Если кто-то знает, как использовать разделяемую библиотеку без заголовков, или может помочь мне написать только правильный заголовок, позволяющий мне выводить аудио, тогда у меня может быть аудио-способ вывода файлов.
  • С другой стороны, если кто-то может помочь мне манипулировать USB-устройствами без доступа к libusb, то, возможно, я мог бы что-то сделать с этим?

Движение вперед!

ОБНОВЛЕНИЕ 4: аудио выход произведен!

Пользователь Francesco Noferi проделал большую работу, помогая мне использовать библиотеку ALSA, упомянутую в предыдущем обновлении. У компилятора C была проблема, но с помощью компилятора Rust я смог использовать FFI для прямого вызова libasound . Я сейчас воспроизвел кучу своих данных через аудио, и это звучит как музыка для моих ушей! Все еще нужно установить реальный канал связи, но я чувствую себя очень обнадеживающим. На данный момент моя работа в основном заключается в реализации модема, так что, если у кого-то есть какие-либо рекомендации относительно хороших способов сделать это, я весь слух. В идеале модуляция, которую легко реализовать вручную, и демодуляция, для которой есть существующая библиотека, которую я могу использовать. Поскольку это может происходить напрямую через аудиокабель, а не через телефонную сеть, теоретически мы можем сделать намного лучше, чем 56 кбит / с или что-то еще, когда был стандарт, но на практике кто знает, что мы получим.

Спасибо всем, кто следит за этим здесь и на /r /techsupportmacgyver, а также на /r /rust, которые внесли много отличных предложений. Собираюсь внедрить этот "модем" в ближайшее время, а затем я закончу это эпилогом. Я думаю, что я мог бы разместить свой код где-нибудь, чтобы другие отчаянные люди могли использовать его в будущем - может быть, даже хранилище странных инструментов эксфильтрации, которые легко набрать в умирающую машину вручную? Посмотрим что получится.

ОБНОВЛЕНИЕ 5: Мне потребовалось много времени на борьбу с ALSA и моим дешевым USB-устройством захвата звука StarTech (без встроенной линии на принимающем ноутбуке), и многие фальстарты пытались свернуть мой собственный протокол передачи, но, наконец, по совету некоторых Мои друзья-радиолюбители Ham Я реализовал линейный протокол RTTY со скоростью 150 бод, что на практике дает примерно 10 байт в секунду. Это не супер быстро, но это довольно надежно. И я почти закончил передачу своего файла 820 КБ, проверенного с помощью контрольных сумм CRC32 (используя функциональность crc32 из модуля Python zlib , к которому у меня есть доступ). Поэтому я объявляю победу и хочу еще раз поблагодарить! Я потрачу еще немного времени на поиск дополнительных файлов, которые можно будет прочитать и которые я могу передать, но основа на месте. Было весело работать со всеми вами!

ЗАКЛЮЧИТЕЛЬНОЕ ОБНОВЛЕНИЕ:

На умирающей машине:

$ 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

:-)

10 ответов10

15

Вот пример программы libasound с достаточным количеством определений, чтобы получить основной 2-канальный вывод wav 44.1k без заголовков.

РЕДАКТИРОВАТЬ: Я на самом деле не уверен, будет ли прямой дамп данных, как WAV будет работать, так как шум при записи может легко повредить его, но вы, вероятно, можете сделать что-то вроде синусоиды бит на высокой частоте, что является более надежным

РЕДАКТИРОВАТЬ 2: если aplay присутствует и работает, вы также можете использовать это и просто написать программу, которая выводит необработанный звук и транслирует его в aplay или все, что может воспроизводить аудио

EDIT3: изменил его, чтобы вообще не использовать заголовки

если -lasound не компилируется, добавьте -L/ путь / где / libasound / находится / расположен

/*
    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;
}
3

Работает ли ваш HDMI или другой порт вывода изображения? Если это так, вы можете использовать устройство захвата экрана, чтобы записать его как видео и обрабатывать позже. Таким образом, не ограничиваясь частотой кадров вашей веб-камеры.

2

Как насчет того, чтобы вы закодировали свои данные в шестнадцатеричном формате и выводили их на страницу за страницей в терминал?

Вы можете добавить префикс со смещением в двоичном файле, чтобы вы могли легко восстановить страницу (для ручной коррекции?)

Затем на другом компьютере используйте программное обеспечение OCR для сканирования страниц.

Терминал 80x25 будет выдавать 1000 байт на страницу (минус пространство для префикса). Таким образом, примерно на 1000 страницах вы можете получить свои данные. Даже на одной странице в секунду это меньше 20 минут.

Шестнадцатеричное кодирование легко написать, а также предоставляет необработанную форму исправления ошибок (всего 16 допустимых символов).

1

Вы можете настроить сетевое соединение? ssh может быть слишком много, но если вы можете использовать netcat на 2 компьютерах, вы сможете передавать данные. один в режиме отправки, другой в режиме прослушивания. Если все, что вам нужно сделать, это перенести текст, то это может быть решением.

редактировать: не важно, просто прочитайте, что вы потеряли сетевое соединение, а также ..

0

Длинный выстрел, но в некоторых дистрибутивах встроены радиопротоколы. Одним из распространенных является Fldigi. Попробуй какой флдиги.

Если у вас есть то или другое, они преобразуют текст в аудио, как правило, используя некоторые варианты фазовой манипуляции. Выходной сигнал поступает на ваши динамики / наушники, и его получает стабильный компьютер в той же комнате, который отображается на его микрофоне. (Это устраняет радиолюбители, которые передают и принимают аудио по радиоволнам).

0

Подход QR-кодов может быть хорошим. Вы можете разместить как можно больше на экране и обновить их, как только ваш терминал позволит вам. Затем запишите экран XPS с помощью камеры (в отличие от веб-камеры) и просто расшифруйте сохраненное видео. Может быть полезно использовать даже замедленную съемку.

0

Отличное шоу :) У меня есть 1 предложение: вы также можете читать данные с экрана, используя фотодиод, подключенный к звуковой карте другого компьютера.

0

Вы можете отправлять сообщения по электронной почте из командной строки, включая отправку файлов.

Что-то вроде:

$ mail -s "Hello World" user@yourmaildomain.com < /tmp/urgentFileToSave.txt

должно сработать.

Некоторые дополнительные примеры: http://www.binarytides.com/linux-mail-command-examples/

0

Может ли Python получить доступ к вашему порту аудиовыхода? Вы можете попытаться передать данные, используя это - посмотрите то или это.

0

Вы можете удалить SSD из вашей машины и dd/photorec/etc на другой работающей машине.

Вот руководство по обслуживанию Dell для 9550 - см. Раздел «Извлечение твердотельного накопителя». После извлечения диска вы можете получить внешний USB-корпус M.2 и подключить диск к другому компьютеру, чтобы восстановить ваши данные.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .