Так как это bash, вы можете:
< <(shopt -s extdebug; declare -F my_bash_func) IFS=' ' read -d '' _ _ fn
echo "$fn"
Это сбросит значение extdebug при выходе из подоболочки.
Это будет работать с файлами с пробелами и новой строки.
В Linux при использовании зашифрованного диска (luks )он разблокируется во время загрузки с помощью пароля. Идея заключается в том, чтобы зашифровать диск с помощью cryptsetup поверх системы google. (шифрование по умолчанию )и получить более ранний доступ к экземпляру, чтобы иметь возможность разблокировать диск во время загрузки. Это можно реализовать с помощью функции удаленной последовательной консоли (. Обратите внимание, что для этого руководства использовалась виртуальная машина opensuse, разные шаги не должны отличаться для других дистрибутивов ).
Кон:
Про:
Краткое описание реализации:
Условие:
Temporary VM Config:
/dev/sda : main disk, copy of the original source disk
/dev/sdb : new empty disk larger than /dev/sda
Последовательная консоль:
serial-port-enable
со значениемTRUE
(и включите последовательный порт в параметрах экземпляра)ssh
/ gcloud
;пример gcloud :gcloud compute --project=prj-name connect-to-serial-port vm-name --zone=us-central2-b
Обновить конфигурацию grub:
/etc/default/grub
#...Enabling serial console...
GRUB_TIMEOUT=15
GRUB_TERMINAL="serial"
GRUB_SERIAL_COMMAND="serial --unit=0 --speed=115200 --word=8 --parity=no --stop=1"
#...End
grub2-mkconfig -o /boot/grub2/grub.cfg
Форматирование целевого диска:
/boot
(un -зашифрованный )и другой для системы/
(зашифрованный ), не имеет значения если у вас уже был отдельный раздел для /boot
или нет в вашей старой системе, в новой нам потребуется, чтобы система загружала grub и запрашивала пароль для разблокировки зашифрованного раздела. /boot
), а другой — с оставшимся пространством; Для этого используйте fdisk /dev/sdb
, создайте первый раздел размером 256 МБ или более в качестве основного раздела и включите загрузочный флаг ; затем создайте второй основной раздел размером с оставшимся пространством (обратите внимание, что если вы использовали раздел для свопа в старой системе, вам также необходимо создать этот раздел )/dev/sda :
/dev/sdb :
|- sdb1 : 256 MB primary and bootable (empty)
|- sdb2 : xx GB primary (empty)
mkfs.ext4 /dev/sdb1
dd if=/dev/urandom of=/dev/sdb2 bs=4096 status=progress
sdb2
с cryptsetup -y -v --cipher aes-xts-plain64 --key-size 256 --pbkdf-force-iterations=100200 --hash sha256 --type luks1 --label=linux --use-random luksFormat /dev/sdb2
Измените шифр, размер ключа, тип шифрования и т. д.чтобы соответствовать вашим потребностям cryptsetup luksDump /dev/sdb2
cryptsetup luksOpen /dev/sdb2 crypteddisk
mkfs.ext4 /dev/mapper/crypteddisk
cryptsetup close /dev/mapper/crypteddisk
Клонировать исходный диск:
/
в новый зашифрованный раздел/dev/mapper/crypteddisk
(sdb2 )для этого шага вы можете использовать различные инструменты, в этом руководстве мы будем использовать dd
, важное примечание здесь, чтобы dd
скопировать диск без ошибок, необходимо размонтировать исходный раздел. Если вы хотите избежать потери данных , вы можете создать другую временную виртуальную машину и подключить к ней исходный и целевой диски в качестве дополнительных дисков для выполнения этого шага... В противном случае, чтобы избежать слишком долгого процесса миграции, я закрыл большая часть запущенного процесса и используется dd
без разблокировки -монтирование исходного раздела (не рекомендуется ), затем используется fsck
для исправления любой ошибки из-за того, что исходный код не был разблокирован -установлен. cryptsetup luksOpen /dev/sdb2 crypteddisk
/
равен/dev/sda1
)dd if=/dev/sda1 of=/dev/mapper/crypteddisk bs=4096 status=progress
fsck /dev/mapper/crypteddisk
fdisk -l
(не обращайте внимания на размер зашифрованного диска, мы исправим это позже)UUID разделов:
blkid /dev/sda
blkid /dev/sda1
blkid /dev/sdb
blkid /dev/sdb1
blkid /dev/sdb2
blkid /dev/mapper/crypteddisk
Изменение размера диска:
cryptsetup resize crypteddisk -v
e2fsck -f /dev/mapper/crypteddisk
resize2fs /dev/mapper/crypteddisk
Резервное копирование MBR:
dd if=/dev/sdb of=/backup/location/sdb.mbr count=1
dd if=/dev/sda of=/backup/location/sda.mbr count=1
Настройка загрузочного раздела:
/boot
. mkdir /tmp/boot
mount /dev/sdb1 /tmp/boot
cp -a /boot/* /tmp/boot/
ls -l /tmp/boot/*
umount /tmp/boot
rmdir /tmp/boot
/boot
и оставьте его в качестве места для подключения. mkdir /tmp/system
mount /dev/mapper/crypteddisk /tmp/system
rm -rf /tmp/system/boot/*
ls -l /tmp/system/boot/*
umount /tmp/system
rmdir /tmp/system
Chroot и установка новой системы:
Загрузите новый зашифрованный диск как текущий (chroot )и настройте его для применения новой конфигурации системы, шифрования и т. д. (также убедитесь, что /mnt
пуст, прежде чем продолжить ).
mount /dev/mapper/crypteddisk /mnt/
mount /dev/sdb1 /mnt/boot
for i in sys dev proc; do mount --bind /$i /mnt/$i; done
chroot /mnt
С этого момента мы работаем в новой системе (имейте в виду, что sdb должен считаться sda в файлах конфигурации)
Обновление /etc/fstab
конфигурации (убедитесь, что вы используете uuid sdb1, а не sda1 ), вот cat /etc/fstab
вывод:
# Main Partition ----------------------
# Entry for /dev/mapper/crypteddisk (sda2) :
UUID=CHANGE-THIS-WITH-CRYPTEDDISK-UUID / ext4 noatime,acl 0 0
# Boot Partition ----------------------
# Entry for /dev/sda1 :
#/dev/sda1 /boot ext4 defaults 1 2
UUID=CHANGE-THIS-WITH-THE-CURRENT-SDB1-UUID /boot ext4 noatime,acl 1 2
# Swap Partition/File -----------------
/swap/swapfile swap swap defaults 0 0
#
Обновите /etc/crypttab
конфигурацию (, если файл crypttab
не существует, создайте его с разрешениями -rw-r--r--
), также убедитесь, что используете uuid sdb2, а не sda1 и не crypteddisk, вот cat /etc/crypttab
вывод:
crypteddisk UUID=CHANGE-THIS-WITH-CURRENT-SDB2-UUID
Обновите конфигурацию grub на /etc/default/grub
, вам нужно только изменить GRUB_ENABLE_CRYPTODISK
, GRUB_CMDLINE_LINUX
и GRUB_DISABLE_OS_PROBER
вот cat /etc/default/grub
вывод:
GRUB_DISTRIBUTOR=My-Custom-Server...
#.................................... Command line
#GRUB_CMDLINE_LINUX=" root=/dev/sda1 disk=/dev/sda resume=swap console=ttyS0,38400n8 quiet"
GRUB_CMDLINE_LINUX=" root=/dev/mapper/crypteddisk luks_root=/dev/sda2 luks="root" disk=/dev/sda resume=swap console=ttyS0,38400n8 quiet"
#.................................... Options
GRUB_DEFAULT=0
GRUB_HIDDEN_TIMEOUT=0
GRUB_HIDDEN_TIMEOUT_QUIET=true
GRUB_GFXMODE=800x600
GRUB_GFXPAYLOAD_LINUX=keep
GRUB_THEME=/boot/grub2/theme/theme.txt
GRUB_BACKGROUND=
#.................................... Enabling serial console...
GRUB_TIMEOUT=30
GRUB_TERMINAL="serial"
GRUB_SERIAL_COMMAND="serial --unit=0 --speed=115200 --word=8 --parity=no --stop=1"
#.................................... Enabling cryptsetup
GRUB_ENABLE_CRYPTODISK="y"
#.................................... Ignore other os
GRUB_DISABLE_OS_PROBER="true"
#....................................
Примените изменения grub с помощью:
grub2-mkconfig -o /boot/grub2/grub.cfg
Обновите начальный электронный диск и принудительно включите модули шифрования:
mkinitrd -d /dev/mapper/crypteddisk -f "dm luks"
Обновите MBR и переустановите grub на новый диск, чтобы сделать его загрузочным
grub2-install /dev/sdb
Выйдите из chroot и не -смонтируйте все
exit
cd /
for i in sys dev proc; do umount /mnt/$i; done
unmount /mnt/boot
unmount /mnt
Если у вас возникли проблемы с -монтированием раздела, используйте параметр -l
, напримерumount -l /mnt/sys
Применить магию: