Загрузочный UEFI + BIOS в реальном времени Debian растянуть amd64 с постоянством

20

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

Цели:

  • загрузочный USB-накопитель (поддерживается как UEFI, так и устаревший BIOS)
  • (на основе) живой Debian 9 (растянуть)
  • постоянство (по умолчанию и для UEFI, и для устаревшего BIOS)
  • Немецкая раскладка клавиатуры по умолчанию
  • подходит для устранения неполадок в других системах GNU / Linux

Причины:

  • необходимость настраивать раскладку клавиатуры при каждом использовании - настоящая головная боль
  • cryptsetup и efibootmgr отсутствуют в стандартных живых образах Debian
  • gnome-терминал имеет этот надоедливый белый фон по умолчанию

Нет решений:

  • (пере) создание собственного живого образа Debian (кажется утомительным, хотя я еще не пробовал)
  • unetbootin (запрашивает неизвестный пароль при запуске на Debian Stretch, и я думаю, что он в любом случае не поддерживает UEFI)
  • какой-то иностранный автоматизированный процесс, где я не вижу, что происходит

Живые и установочные образы Debian являются изогибридными и могут быть легко записаны для блокирования устройств dd. И они действительно работают с USB-накопителей, что очень приятно! Однако не будет никакой настойчивости и никакого способа начать с неанглоязычной раскладки клавиатуры по умолчанию без редактирования конфигурации grub и isolinux, которая включена в файловую систему ISO9660, доступную только для чтения, для живого ISO-образа. Таким образом, даже после записи действующего ISO на USB-накопитель эти параметры все равно не могут быть изменены.

schlimmchen
источник

Ответы:

30

Вот способ создания живого USB-накопителя Debian с постоянством. Это позволит установить недостающие пакеты, которые с этого момента будут доступны при каждой активной загрузке с использованием постоянства. Поскольку мы воссоздаем содержимое файловой системы живого ISO-образа в файловой системе с возможностью чтения и записи, мы можем изменить конфигурации загрузчика, чтобы включить сохранение и установить раскладку клавиатуры при загрузке.

Описанные здесь шаги были протестированы для работы с растяжкой и бустером Debian для создания живого образа растяжения Debian.

Есть много шагов, но кажется, что этот метод все еще довольно эффективен.

Отказ от ответственности: вы потеряете данные на целевом USB-накопителе, и если вы ошибетесь с приведенными ниже командами, вы, возможно, пожалеете. Я не несу ответственности за ваши действия.

Чувствую себя счастливчиком

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

TL; DR

Получите ISO-образ Debian live, затем сделайте следующее:

umount /dev/sdX*
parted /dev/sdX --script mktable gpt
parted /dev/sdX --script mkpart EFI fat16 1MiB 10MiB
parted /dev/sdX --script mkpart live fat16 10MiB 3GiB
parted /dev/sdX --script mkpart persistence ext4 3GiB 100%
parted /dev/sdX --script set 1 msftdata on
parted /dev/sdX --script set 2 legacy_boot on
parted /dev/sdX --script set 2 msftdata on

mkfs.vfat -n EFI /dev/sdX1
mkfs.vfat -n LIVE /dev/sdX2
mkfs.ext4 -F -L persistence /dev/sdX3

mkdir /tmp/usb-efi /tmp/usb-live /tmp/usb-persistence /tmp/live-iso
mount /dev/sdX1 /tmp/usb-efi
mount /dev/sdX2 /tmp/usb-live
mount /dev/sdX3 /tmp/usb-persistence
mount -oro live.iso /tmp/live-iso

cp -ar /tmp/live-iso/* /tmp/usb-live

echo "/ union" > /tmp/usb-persistence/persistence.conf

grub-install --no-uefi-secure-boot --removable --target=x86_64-efi --boot-directory=/tmp/usb-live/boot/ --efi-directory=/tmp/usb-efi /dev/sdX

dd bs=440 count=1 conv=notrunc if=/usr/lib/syslinux/mbr/gptmbr.bin of=/dev/sdX
syslinux --install /dev/sdX2

mv /tmp/usb-live/isolinux /tmp/usb-live/syslinux
mv /tmp/usb-live/syslinux/isolinux.bin /tmp/usb-live/syslinux/syslinux.bin
mv /tmp/usb-live/syslinux/isolinux.cfg /tmp/usb-live/syslinux/syslinux.cfg

sed --in-place 's#isolinux/splash#syslinux/splash#' /tmp/usb-live/boot/grub/grub.cfg

sed --in-place '0,/boot=live/{s/\(boot=live .*\)$/\1 persistence/}' /tmp/usb-live/boot/grub/grub.cfg /tmp/usb-live/syslinux/menu.cfg

sed --in-place '0,/boot=live/{s/\(boot=live .*\)$/\1 keyboard-layouts=de locales=en_US.UTF-8,de_DE.UTF-8/}' /tmp/usb-live/boot/grub/grub.cfg /tmp/usb-live/syslinux/menu.cfg

umount /tmp/usb-efi /tmp/usb-live /tmp/usb-persistence /tmp/live-iso
rmdir /tmp/usb-efi /tmp/usb-live /tmp/usb-persistence /tmp/live-iso

Подробно и с некоторыми пояснениями

Вам нужно будет выполнить большинство следующих команд с повышенными привилегиями, т. Е. Использовать их sudoв большинстве систем GNU / Linux.

Скачать

Загрузите ISO-образ Debian Live с помощью любого оконного менеджера:

https://cdimage.debian.org/debian-cd/current-live/amd64/iso-hybrid/

Мы будем ссылаться на загруженный образ ISO просто как «live.iso».

Определить целевой диск

Найдите устройство, которое используется вашим USB-накопителем lsblk. Мы назовем это /dev/sdX.

Отсоединение

Размонтируйте существующие разделы на вашем диске, используя umount /dev/sdX*

Создать разделы

Нам нужен загрузочный раздел EFI для компьютеров UEFI для загрузки с USB-накопителя. Затем нам нужен достаточно большой раздел для хранения оригинального содержимого образа файловой системы ISO. Этот раздел должен иметь установленный legacy_bootфлаг. Затем мы добавляем постоянный раздел, занимая все оставшееся пространство USB-накопителя. Вы можете сделать это с помощью любого инструмента разметки, поддерживающего GPT (обратите внимание на legacy_bootфлаг). Вот пример использования parted:

parted /dev/sdX --script mktable gpt
parted /dev/sdX --script mkpart EFI fat16 1MiB 10MiB
parted /dev/sdX --script mkpart live fat16 10MiB 3GiB
parted /dev/sdX --script mkpart persistence ext4 3GiB 100%
parted /dev/sdX --script set 1 msftdata on
parted /dev/sdX --script set 2 legacy_boot on
parted /dev/sdX --script set 2 msftdata on

Это создает таблицу разделов GPT и таблицу разделов защитного MBR.

Создать файловые системы

Мы хотим получить FAT для EFI и живого раздела, и мы хотим ext4для постоянного раздела, и нам нужна метка, persistenceчтобы работала постоянная функция.

mkfs.vfat -n EFI /dev/sdX1
mkfs.vfat -n LIVE /dev/sdX2
mkfs.ext4 -F -L persistence /dev/sdX3

Монтирование ресурсов

Нам нужно будет смонтировать исходный ISO и целевой раздел во временных точках монтирования.

mkdir /tmp/usb-efi /tmp/usb-live /tmp/usb-persistence /tmp/live-iso
mount /dev/sdX1 /tmp/usb-efi
mount /dev/sdX2 /tmp/usb-live
mount /dev/sdX3 /tmp/usb-persistence
mount -oro live.iso /tmp/live-iso

Установите живую систему

Скопируйте содержимое файловой системы ISO в LIVE-раздел.

cp -ar /tmp/live-iso/* /tmp/usb-live

persistence.conf

Подготовьте файловую систему постоянства с необходимым файлом конфигурации. Функция сохранения не будет работать без этого файла.

echo "/ union" > /tmp/usb-persistence/persistence.conf

Grub для поддержки UEFI

Установите grub2 для поддержки загрузки UEFI (для этого требуется grub-efi-amd64-binпакет в Debian). Мы заставляем , grub-installчтобы не использовать систему UEFI безопасных загрузок, который , видимо , не работает с --removableопцией.

grub-install --no-uefi-secure-boot --removable --target=x86_64-efi --boot-directory=/tmp/usb-live/boot/ --efi-directory=/tmp/usb-efi /dev/sdX

Syslinux для поддержки устаревших BIOS

Установите gptmbr.binзагрузчик syslinux на диск (загрузите syslinux или установите пакет syslinux-common). Затем установите syslinux в рабочий раздел.

dd bs=440 count=1 conv=notrunc if=/usr/lib/syslinux/mbr/gptmbr.bin of=/dev/sdX
syslinux --install /dev/sdX2

Isolinux исправление

Повторно используйте конфигурацию isolinux исходного живого ISO для работы с syslinux.

mv /tmp/usb-live/isolinux /tmp/usb-live/syslinux
mv /tmp/usb-live/syslinux/isolinux.bin /tmp/usb-live/syslinux/syslinux.bin
mv /tmp/usb-live/syslinux/isolinux.cfg /tmp/usb-live/syslinux/syslinux.cfg

Параметры ядра

Теперь, когда мы скопировали действующие системные файлы в реальную файловую систему для чтения и записи, мы можем манипулировать конфигурацией grub и syslinux.

Добавьте параметр ядра постоянства в menu.cfgи grub.cfg. В обоих файлах добавьте ключевое слово persistenceв конце соответствующей первой строки с boot=liveним.

sed --in-place '0,/boot=live/{s/\(boot=live .*\)$/\1 persistence/}' /tmp/usb-live/boot/grub/grub.cfg /tmp/usb-live/syslinux/menu.cfg

Установите параметр ядра раскладки клавиатуры. В обоих файлах добавьте ключевые слова в конце соответствующей первой строки с boot=liveним.

sed --in-place '0,/boot=live/{s/\(boot=live .*\)$/\1 keyboard-layouts=de locales=en_US.UTF-8,de_DE.UTF-8/}' /tmp/usb-live/boot/grub/grub.cfg /tmp/usb-live/syslinux/menu.cfg

Grub splash

Исправьте изображение заставки grub (необязательно; мы переместили его в другой каталог).

sed --in-place 's#isolinux/splash#syslinux/splash#' /tmp/usb-live/boot/grub/grub.cfg

Размонтирование и очистка

umount /tmp/usb-efi /tmp/usb-live /tmp/usb-persistence /tmp/live-iso
rmdir /tmp/usb-efi /tmp/usb-live /tmp/usb-persistence /tmp/live-iso

Почему это должно работать как для UEFI, так и для BIOS

При запуске в режиме UEFI ПК будет сканировать разделы FAT, которые мы определили в таблице разделов GPT. Первый раздел FAT содержит загрузчик загрузчика UEFI, который обнаружен потому, что он находится в пути, указанном UEFI для съемных дисков ( --removableпереключатель grub-installсделал это). Для этого не требуется загрузочная запись UEFI, нам нужно только заставить компьютер попытаться загрузиться с USB-накопителя. Этот grub сконфигурирован так, чтобы брать его оттуда (загрузить grub.cfg, показать меню и т. Д.).

При запуске в режиме BIOS и выборе загрузки с USB-накопителя ПК выполнит gptmbr.binкод загрузчика, который мы записали на защитную MBR USB-накопителя. Этот загрузчик ищет раздел GPT, помеченный legacy_bootфлагом и цепью syslinux из этого раздела. Syslinux затем вступает во владение (загрузить menu.cfg, показать меню и т. Д.).

Зашифрованная стойкость

Вместо использования обычного ext4 на постоянном разделе можно сначала зашифровать постоянный раздел с помощью LUKS (используя cryptsetup), а затем отформатировать его с помощью ext4 (используя соответствующую метку). Однако, как сказано в документации , действующая система должна включать cryptsetupпакет. В противном случае зашифрованный раздел не может быть дешифрован действующей системой. Это означает, что сначала нужно создать собственный живой ISO. Это, однако, выходит за рамки этого ответа.

история

--no-uefi-secure-bootВариант был ранее не частью вызова grub-install. Палка работала нормально для меня, но это прекратилось с Debian Buster, хотя безопасная загрузка все еще отключена на моей машине.

schlimmchen
источник
1
Я только что создал аккаунт, чтобы поблагодарить вас за это. Отличное руководство. Небольшое предложение - было бы неплохо зашифровать постоянный раздел.
Петр Гавличек
1
@PetrHavlicek Правда. Я думаю, что это достаточно легко сделать, но я потратил свое свободное время с момента создания этого Q & A с другими проблемами, поэтому мне все еще нужно вернуться к этой идее (и спасибо за вашу оценку :).
schlimmchen
Прекрасно работает! Хотя некоторые дополнительные объяснения были бы хорошими. (конечно, вы можете посмотреть все это на страницах руководства, но, например, mktable, хотя и то же самое, что и mklable, на самом деле не документирована как таковая и т. д.)
mikuszefski
Можно ли иметь на USB-накопителе с файловой системой FAT только файл с постоянным томом? Это должно быть возможно путем циклического монтирования файла. Но как сказать Debians, что initrd должен взять файл вместо раздела?
выступление
См. Debian-live.alioth.debian.org/live-manual/stable/manual/html/… для этого. Вкратце: создайте файл образа (разреженный) в корне любой файловой системы, назовите этот файл «постоянство» и отформатируйте его, например, с помощью ext4.
schlimmchen