Проблема суперблока на криптографическом диске _LUKS

У меня есть основания полагать, что рабочей awkкомандой является

awk -v count=3 '/DS:/ {$NF=((c++ % count) + 1)} 1' input

где input— входной файл. Также я думаю, что во входном файле должно быть 9 строк вместо 7, чтобы сгенерировать вывод, указанный в вопросе.

Вот как это работает.

Во-первых, опция -v count=3назначает 3переменнойawkcount. Если бы это было написано так, как написано в вопросе(count=3в конце команды ), 3было бы присвоено переменной оболочки и не было бы доступно для awk. ] и приведет к ошибке деления на ноль, поскольку countбудет неявно инициализирован как 0.

В

/DS:/ {$NF=((c++ % count) + 1)}

Часть /DS:/является условием для блока в фигурных скобках. Это регулярное выражение DS:, которое может соответствовать только строке DS:. Этому условию соответствуют все строки, содержащие DS:.

Для всех этих строк переменная cувеличивается, а затем берется модуль count. Поскольку у нас нет явного определения переменной c, она неявно инициализируется значением 0при первом выполнении этого блока кода.

Затем результат добавляется с помощью 1и присваивается $NF. Здесь NF— количество полей в строке, разделенных разделителями полей. Разделителем полей по умолчанию(FS)является пробел. Обратите внимание, что пробел как FSявляется особым случаем в awk, и несколько последовательных пробелов будут рассматриваться только как один разделитель полей.

Поскольку NF— это количество полей, $NFотносится к последнему полю. В этом случае присваивание $NFприводит к замене 1значением, полученным путем вычисления ((c++ % count) + 1).

Конечная 1обозначает истинное условие, а кодовый блок после него опускается. Эффект этого является неявным print, когда условие истинно. Поскольку 1всегда истинно, действие всегда выполняется и печатается текущая строка,возможно после трансформации последнего блока.

Чтобы лучше понять процесс, мы можем отслеживать выполнение awk. awkимеет неявный цикл, который перебирает строки ввода.

  • 1-я строка:cнеявно назначается 0. c++все еще 0, но это изменяет cна 1, (c++ % count)равно 0по модулю 3, так что 0, ((c++ % count)+1)это 1, назначение изменяет последнее поле (, который также является последним символом в этом случае от )до 1, и окончательный 1печатает эту строку, так что мы получаем DS: 1.

  • 2-я строка:cтеперь 1. ((c++ % count)+1)это 2и меняется cк 2. Последнее поле изменяется на 2и печатается, поэтому мы получаем DS: 2.

  • 3-я строка :Аналогично ((c++ % count)+1)заменяет cна 3и оценивается как 3. Получаем DS: 3.

  • 4-я строка :Вот когда %действительно вступает в силу. (c++ %count)равно 3по модулю 3, что равно 0, и ((c++%count)+1)снова оценивается как 1. Получаем DS: 1.

И так далее. Вот как это работает. Обратите внимание, что если есть строки без DS:, они печатаются дословно.

0
24.04.2021, 21:52
2 ответа

Повреждена файловая система корневого логического тома, а не само устройство LUKS. /dev/sda5— это раздел, содержащий устройство шифрования LUKS/dm -с шифрованием (, а также LVM, который вы также используете ), хранилище работает слоями, вы не можете запустить fsckна Уровень шифрования LUKS (), в вашем случае вы должны запустить его на уровне логического тома LVM --/dev/mapper/trisquel--vg-root.

Если вы запускаете это из initramfs, где устройство LUKS уже разблокировано (вы указали парольную фразу ранее ), вам нужно запустить fsck /dev/mapper/trisquel--vg-root. Если вы запускаете это с LiveCD, вам нужно сначала вручную разблокировать зашифрованный диск (, вы можете сделать это просто из графического интерфейса, дважды щелкнув зашифрованный диск, или вручную с помощью cryptsetup ), а затем запустить ту же команду fsck /dev/mapper/trisquel--vg-root.

1
28.04.2021, 22:51

Вы пытаетесь ошибиться.Fsck считает, что раздел зашифрован LUKS. Судя по фото, вы тоже используете LVM.

Итак, я предполагаю, что у вас есть физический том LVM, зашифрованный с помощью LUKS.

На фото видно, что вы попали в аварийный корпус. Я подозреваю, что когда это происходит, зашифрованный диск был разблокирован, а группа томов (и логический том )уже сопоставлены...

... поэтому вы должны иметь возможность fsck логического тома из аварийной оболочки:

fsck /dev/mapper/trisquel--vg-root
1
28.04.2021, 22:51

Теги

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