Отменить wipefs --все --заставить /dev/sda? /dev/sda

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

Как запустить сценарий оболочки при событии устройства ввода

Просто создайте сценарий для каждого из ваших устройств и запустите его в фоновом режиме. Вы также можете опросить поток событий на выбранном вами языке программирования. Идея того, как обрабатывать входной поток, содержится в связанной статье.

Если вам нужно указать устройство по тому, к какому порту оно подключено, попробуйте использовать путь /dev/by -или /dev/by -id, и если вы хотите сделать его настраиваемым, вы можете перебрать все входные данные и вывести имя:cat /proc/bus/input/devices

Я копирую и вставляю для потомков:

#!/bin/bash

device='/dev/input/by-id/usb-Targus_Laser_Presentation_Remote-if02-event-kbd'
event_blank='*code 48 (KEY_B), value 1*'
event_esc='*code 1 (KEY_ESC), value 1*'
event_f5='*code 63 (KEY_F5), value 1*'
event_prev='*code 104 (KEY_PAGEUP), value 1*'
event_next='*code 109 (KEY_PAGEDOWN), value 1*'

evtest "$device" | while read line; do
  case $line in
    ($event_blank) echo "BLANK SCREEN" ;;
    ($event_f5)    echo "F5" ;;
    ($event_esc)   echo "ESCAPE" ;;
    ($event_prev)  echo "PREVIOUS" ;;
    ($event_next)  echo "NEXT" ;;
  esac
done

С помощью evtestмне удалось узнать номер события /dev/input/event18для устройства, но этот номер может различаться в зависимости от устройств в вашей системе и порядка их подключения

Из-за этого я использовал udevadm info /dev/input/event18, чтобы узнать уникальный идентификатор устройства

S: input/by-id/usb-Targus_Laser_Presentation_Remote-if02-event-kbd

Наконец, снова используя evtest, я смог перехватить все события с устройства, чтобы использовать их в операторе case.

7
11.04.2021, 19:46
3 ответа

Вам повезло, что wipefsна самом деле распечатывает стираемые части.

Эти,

wipefs -a /dev/sda
/dev/sda: 8 bytes were erased at offset 0x00000200 (gpt): 45 46 49 20 50 41 52 54
/dev/sda: 8 bytes were erased at offset 0x3b9e655e00 (gpt): 45 46 49 20 50 41 52 54
/dev/sda: 2 bytes were erased at offset 0x000001fe (PMBR): 55 aa

echo -en '\x45\x46\x49\x20\x50\x41\x52\x54' | dd of=/dev/sda bs=1 conv=notrunc seek=$((0x00000200))
echo -en '\x45\x46\x49\x20\x50\x41\x52\x54' | dd of=/dev/sda bs=1 conv=notrunc seek=$((0x3b9e655e00))
echo -en '\x55\xaa' | dd of=/dev/sda bs=1 conv=notrunc seek=$((0x000001fe))

в целом мне кажется разумным.

Но обратите внимание, что смещения там отличаются от смещений в вашем случае! Вам нужно будет использовать значения, полученные из wipefs.

Основываясь на значениях смещения (0x3b9e655e00 и 0x37e4895e00 ), у них был немного больший диск, чем у вас (~256 ГБ против ~240 ГБ ). Использование их значений будет означать, что резервная копия GPT в конце диска будет повреждена. Это не должно иметь большого значения, поскольку любой инструмент для создания разделов должен иметь возможность переписать его, если первая копия не повреждена.

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

Кроме того, магические числа для файловых систем, конечно, должны быть в правильных местах.


Я проверил стирание и отмену с помощью образа VFAT,и написал это навскидку, прежде чем слишком внимательно прочитать вашу версию:

printf "$(printf '\\x%s' 46 41 54 31 36 20 20 20)" |
  dd bs=1 conv=notrunc seek=$(printf "%d" 0x00000036) of=test.vfat

это для одной wipefsвыходной линии (повторить для других):

test.vfat: 8 bytes were erased at offset 0x00000036 (vfat): 46 41 54 31 36 20 20 20

Вложенный printf в начале позволяет скопировать вывод из wipefsбез необходимости вручную изменять 46 41 54 31...на \x46\x41\x54\x31....

Опять же, вам нужно позаботиться о том, чтобы ввести правильные значения в правильные смещения!

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

Если можете, сделайте копию содержимого диска, прежде чем возиться с ним.

15
28.04.2021, 22:53

Can I / Should I just hit Write (Write partition structure to disk)?

Только и только если перечислены все разделы.

Восстановление таблицы разделов

If all partitions are listed and only in this case, confirm at Write with Enter, y and OK.

Now, the partitions are registered in the partition table.

3
28.04.2021, 22:53

В моем вопросе с заголовком Отменаwipefsя решил повторно -создать разделы с помощью testdisk. Вероятно, вам лучше избегать этого, так как это заняло значительное количество времени (не просто нажав Запись ), прежде чем я это сделал, я, должно быть, тщательно проверил оба раздела,-testdiskпозволил мне прочитать их структуру, я пошел дальше и прочитал несколько каталогов -вроде все в порядке.


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

Из живого Linux Mint я сделал снимок GParted:

Unknown File Systems - GParted


Повторюсь, полный вывод команды wipefsбыл:

/dev/sda1: 8 bytes were erased at offset 0x00000052 (vfat): 46 41 54 33 32 20 20 20
/dev/sda1: 1 byte was erased at offset 0x00000000 (vfat): eb
/dev/sda1: 2 bytes were erased at offset 0x000001fe (vfat): 55 aa
/dev/sda2: 2 bytes were erased at offset 0x00000438 (ext4): 53 ef
/dev/sda: 8 bytes were erased at offset 0x00000200 (gpt): 45 46 49 20 50 41 52 54
/dev/sda: 8 bytes were erased at offset 0x37e4895e00 (gpt): 45 46 49 20 50 41 52 54
/dev/sda: 2 bytes were erased at offset 0x000001fe (PMBR): 55 aa

Чтобы отменить то, что было стерто, я сделал:

Во-первых, мой раздел Ext4:

echo -en '\x53\xef' | dd of=/dev/sda2 bs=1 conv=notrunc seek=$((0x00000438))
partprobe /dev/sda2

Теперь можно монтировать и читать все файлы.

Во-вторых, мой раздел EFI:

echo -en '\x46\x41\x54\x33\x32\x20\x20\x20' | dd of=/dev/sda1 bs=1 conv=notrunc seek=$((0x00000052))
echo -en '\xeb' | dd of=/dev/sda1 bs=1 conv=notrunc seek=$((0x00000000))
echo -en '\x55\xaa' | dd of=/dev/sda1 bs=1 conv=notrunc seek=$((0x000001fe))
partprobe /dev/sda1

Я перезагрузился и подключился к серверу по SSH без каких-либо проблем.

7
28.04.2021, 22:53

Теги

Похожие вопросы