Часть вашей проблемы заключается в отсутствии кавычек в этой строке, из-за чего содержимое $t
и $pcr
помещается в одну строку, что делает psl
просто двумя длинными строками со многими слова в нем.
psl=$(sort <(echo $t) <(echo $pcr) | uniq)
Простым первым решением будет:
psl=$(sort <(echo "$t") <(echo "$pcr") | uniq)
Но тогда вы захотите повторить $psl
построчно (Я предполагаю, что вы обрабатываете его построчно, так как вы используете такие инструменты, как sort
, uniq
и comm
.)
while read -r e ; do
echo "$e"
done <<<"$psl"
На самом деле это становится намного проще, если вместо этого вы используете временные файлы:
echo "$t" | sort >t.sorted
echo "$nnpp" | sort >nnpp.sorted
comm -13 t.sorted nnpp.sorted >pcr
sort t.sorted pcr | uniq >psl
while read -r e ; do
echo "$e"
done <psl
Кстати, так как pcr
просто содержит строки, уникальные в nnpp
, а вы используете uniq
, который должен избавиться от дубликатов между t
и nnpp
, возможно, вы можете обойтись гораздо более простым:
echo "$t" >t
echo "$nnpp" >nnpp
sort -u -o psl t nnpp
Обратите внимание, что флаг sort
для -u
аналогичен конвейерной передаче через uniq
, и что вы можете передать sort
флаг -o
, чтобы указать имя файла, в который следует записать отсортированный вывод.
Как указано в комментариях @AB , решение представляет собой необработанный раздел, который содержит заголовок вместо файла заголовка внутри раздела (, что является проблемой из-за необходимости монтировать сначала файловая система)
Чтобы скопировать заголовок (размером около 16 МБ для LUKS2 )в раздел (/dev/sdb
, превышающий размер заголовка ), есть два варианта.
dd
. Во-первых, вам нужно найти смещение данных (, так как заголовок всегда начинается с 0). Для устройства LUKS /dev/sda4
используйте cryptsetup luksDump /dev/sda4
и найдите линию смещения в секции Сегменты данных . Затем найдите размер блока файловой системы с помощью stat -fc %s /dev/sda4
. И, наконец,dd if=/dev/sda4 of=/dev/sdb bs=<fs_block_size> count=<data_offset>
/dev/sdb
. Поскольку наличие файла резервной копии может привести к некоторым проблемам с безопасностью, даже если он сохранен на вашем зашифрованном диске, лучше создать виртуальный диск только для этого файла.
mkdir /tmp/header_backup
mount -t tmpfs -o size=512m tmpfs /tmp/header_backup
cryptsetup luksHeaderBackup /dev/sda4 --header-backup-file /tmp/header_backup/header.luks
dd if=/tmp/header_backup/header.luks of=/dev/sdb
umount /tmp/header_backup
Затем в /etc/crypttab
добавьте опцию header=/dev/sdb
в соответствующую строку (, напримерsda4_crypt [UUID] none luks,discard,header=/dev/sdb
)
Чтобы стереть старый заголовок LUKS:cryptsetup luksErase /dev/sda4
. Это только стирает слоты для ключей, но сохраняет все метаданные. Если вы хотите (, нет необходимости )полностью стирать заголовок, вам понадобится другой заголовок файловой системы, чтобы сохранить UUID в этом разделе. Но имейте в виду, что полная очистка заголовка LUKS может не привести к безопасному удалению в зависимости от вашего устройства хранения (SSD или HDD ). Для SSD возможно, что удаленный блок останется в очереди до тех пор, пока устройству не потребуется выделить больше места.
В противном случае, чтобы стереть заголовок :, получите размер блока файловой системы(<fs_block_size>
)с помощью stat -fc %s /dev/sda4
, смещение данных LUKS(<luks_data_offset>
)с помощью cryptsetup luksDump /dev/sdb
,UUID раздела /dev/sda4
(<uuid_sda4>
), а затем:
dd if=/dev/urandom of=/dev/sda4 bs=<fs_block_size> count=<luks_data_offset>
mkfs.ext4 fs.img
tune2fs -U <uuid_sda4> fs.img
dd if=fs.img of=/dev/sda4
Раздел /dev/sdb
будет иметь тот же UUID, что и LUKS, что может быть проблемой. Вы можете изменить его, не нарушая процесс LUKS с помощьюcryptsetup luksUUID /dev/sdb --uuid $(uuidgen)
И, наконец, обновите initramfs с помощьюupdate-initramfs -u -k all