UEFI, GRUB2 та USB flash


Хочу поставити систему на флешку. Намагаюся пригадати, як це робити.

Проблема в тому, що мої смаки досить специфічні:

  • мені потрібна звичайна система, а не так звана «live»;
  • звісно, кореневий розділ має бути зашифрований;
  • система має завантажуватися через UEFI.

Буду робити нотатки по ходу.

Створення розділів

Тут і далі моя флешка зветься /dev/sda, для інших систем ймовірно має бути інше ім’я. Якщо хтось скопіює собі мій код, виконає в консолі з правами root і цим випадково відформатує основний жорсткий диск, то це сам собі дятел.

Так. Я створюю три розділи:

  • один дуже маленький (10 Мб, FAT32) розділ для UEFI;
  • середній (тут 540 Мб) для розділу /boot;
  • решту використаю на криптоконтейнер.
sgdisk --zap-all /dev/sda
sgdisk --new=1:0:10M --typecode=1:ef00 /dev/sda
sgdisk --new=2:0:540M --typecode=2:8300 /dev/sda
sgdisk --new=3:0:0 --typecode=3:8300 /dev/sda

Я раніше робив щось схоже, тільки без розділу для UEFI.

Криптоконтейнер

cryptsetup luksFormat /dev/sda3

cryptsetup open /dev/sda3 flash_root
ls -l /dev/mapper

Я недостатньо крут, щоб робити це щоразу, але це треба робити:

dd if=/dev/zero of=/dev/mapper/flash_root

Форматування та монтування

mkfs.vfat -F32 -n EFI /dev/sda1
mke2fs -t ext2 -L boot /dev/sda2
mke2fs -t ext4 -L root /dev/mapper/flash_root

mkdir /mnt/flash
mount /dev/mapper/flash_root /mnt/flash

mkdir /mnt/flash/boot
mount /dev/sda2 /mnt/flash/boot

mkdir /mnt/flash/boot/efi
mount /dev/sda1 /mnt/flash/boot/efi

Встановлення системи

Ояїбу. Буду пригадувати, як воно робиться. Треба вгатити базову систему.

debootstrap stable /mnt/flash

Git

Є таке збочення, я відслідковую зміни в /etc за допомогою Git. Редагую /mnt/flash/etc/.gitignore:

*~
*-old
*.cache
*.dpkg-dist
*.dpkg-bak
/*-
/*.org
/adjtime
/.pwd.lock
/mtab
/nologin
/cups/subscriptions.conf*
/apt/*.save
/apt/*.distUpgrade
/apt/apt.conf.d/01autoremove-kernels
/apt/sources.list.d/*.save
/apt/sources.list.d/*.distUpgrade
/init.d/.depend.*
/apparmor.d/cache
/aliases.db
/rc?.d

Роблю перший комміт:

cd /mnt/flash/etc
git init .
chmod 0700 .git
git add -A
git ci -m "Base system after debootstrap"

crypttab та fstab

Треба перевірити, які у нас UUID створених дисків.

ls -l /dev/disk/by-uuid

Редагую /mnt/flash/etc/crypttab:

flash_root UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx none luks,discard

Редагую /mnt/flash/etc/fstab:

/dev/mapper/flash_root                    /         ext4 errors=remount-ro 0 1
UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx /boot     ext2 defaults 0 2
UUID=xxxx-xxxx                            /boot/efi vfat umask=0077 0 1

tmpfs                                     /tmp      tmpfs defaults 0 0
tmpfs                                     /var/lock tmpfs defaults 0 0
tmpfs                                     /var/log  tmpfs defaults 0 0
tmpfs                                     /var/run  tmpfs defaults 0 0
tmpfs                                     /var/tmp  tmpfs defaults 0 0

chroot

Так. Заходжу в свою нову систему.

mount -o bind /dev /mnt/flash/dev
mount -o bind /proc /mnt/flash/proc
mount -o bind /sys /mnt/flash/sys

chroot /mnt/flash /bin/bash
apt update

Трясця. Все забув.

apt install grub-efi-amd64
grub-install --force --removable --no-floppy \
  --boot-directory=/boot --efi-directory=/boot/efi /dev/sda

apt install linux-image-amd64
update-grub2

Налаштування нової системи

Далі все звичайно: роблю в новій системі adduser, встановлюю все необхідне і так далі.

Ну наче все

umount /mnt/flash/dev
umount /mnt/flash/proc
umount /mnt/flash/sys

umount /mnt/flash/boot/efi
umount /mnt/flash/boot
umount /mnt/flash

cryptsetup luksClose flash_root

Перевіряю. Завантаження через UEFI не працює. Ну і, звісно, не працює legacy boot.

Блядь. Що пішло не так?

cryptsetup open /dev/sda3 flash_root

mount /dev/mapper/flash_root /mnt/flash
mount /dev/sda2 /mnt/flash/boot
mount /dev/sda1 /mnt/flash/boot/efi

mount -o bind /dev /mnt/flash/dev
mount -o bind /proc /mnt/flash/proc
mount -o bind /sys /mnt/flash/sys

chroot /mnt/flash /bin/bash

# So what? So what? So fucking what?

Відчуваю себе дуже тупим.