UEFI + BIOS live bootable Debian stretch amd64 dengan ketekunan

20

Semua informasi yang saya temukan saat ini tentang hal ini tidak cukup untuk selera saya. Entah itu sudah ketinggalan zaman, menyesatkan atau bahkan salah, tampaknya terlalu rumit atau tidak mencakup pertanyaan spesifik ini.

Tujuan:

  • USB drive yang dapat di-boot (didukung UEFI dan BIOS lama)
  • (berdasarkan) live Debian 9 (stretch)
  • kegigihan (secara default dan untuk UEFI dan BIOS lama)
  • Tata letak keyboard Jerman per default
  • cocok untuk pemecahan masalah sistem GNU / Linux lainnya

Alasan:

  • harus mengatur tata letak keyboard pada setiap penggunaan adalah sakit kepala nyata
  • cryptsetup dan efibootmgr tidak ada dalam gambar live Debian default
  • gnome-terminal memiliki latar belakang putih yang mengganggu ini per default

Tidak ada solusi:

  • (kembali) membangun gambar live debian khusus (sepertinya membosankan, meskipun saya belum mencobanya)
  • unetbootin (meminta kata sandi yang tidak dikenal saat memulai debian stretch dan saya pikir itu tidak mendukung UEFI)
  • beberapa proses otomatis asing di mana saya tidak melihat apa yang terjadi

Debian tinggal dan menginstal gambar isohybrid dan dapat dengan mudah ditulis untuk memblokir perangkat yang menggunakan dd. Dan mereka bekerja dari drive USB seperti itu, yang sangat bagus! Namun, tidak akan ada kegigihan dan tidak ada cara untuk memulai dengan tata letak keyboard non-Inggris per default tanpa mengedit konfigurasi grub dan isolinux, yang termasuk dalam sistem file ISO9660 yang sangat mudah dibaca dari image ISO langsung. Jadi, bahkan setelah menulis ISO langsung ke drive USB, parameter ini masih tidak dapat diubah.

schlimmchen
sumber

Jawaban:

30

Berikut adalah cara untuk membuat drive USB live Debian dengan ketekunan. Ini akan memungkinkan untuk menginstal paket-paket yang hilang yang sejak saat itu akan tersedia pada setiap boot langsung menggunakan ketekunan. Karena kita membuat ulang isi sistem file ISO live image pada sistem file yang dapat membaca-menulis, kita dapat mengubah konfigurasi bootloader untuk mengaktifkan kegigihan dan mengatur tata letak keyboard saat boot.

Langkah-langkah yang dijelaskan di sini diuji untuk bekerja pada Debian stretch dan buster untuk membuat image live Debian stretch.

Ada banyak langkah yang terlibat, tetapi tampaknya metode ini masih cukup efisien.

Penafian: Anda akan kehilangan data pada drive USB target dan jika Anda mengacaukan perintah di bawah ini, Anda mungkin akan merasa sangat menyesal setelahnya. Saya tidak bertanggung jawab atas tindakan Anda.

Merasa beruntung

Jika Anda merasa sangat beruntung hari ini, Anda dapat mencoba skrip bash yang mengotomatiskan prosesnya untuk Anda. Berikan jalur gambar ISO Anda sebagai parameter pertama dan drive USB memblokir nama perangkat sebagai parameter kedua. Perhatikan bahwa skrip ini sangat berbahaya dan Anda tidak boleh menjalankannya tanpa membaca dan memahaminya terlebih dahulu.

TL; DR

Dapatkan image ISO live Debian, lalu lakukan hal berikut:

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

Secara rinci dan dengan beberapa penjelasan

Anda perlu menjalankan sebagian besar perintah berikut dengan hak istimewa yang ditinggikan, yaitu menggunakan sudopada kebanyakan sistem GNU / Linux.

Unduh

Unduh image ISO live Debian dengan window manager pilihan Anda:

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

Kami akan merujuk ke gambar ISO yang diunduh hanya sebagai "live.iso".

Tentukan drive target

Temukan perangkat yang menggunakan USB drive Anda lsblk. Kami akan memanggil itu /dev/sdX.

Lepas

Lepas partisi yang ada di drive Anda menggunakan umount /dev/sdX*

Buat partisi

Kami membutuhkan partisi boot EFI untuk UEFI PC untuk boot dari drive USB. Maka kita membutuhkan partisi yang cukup besar untuk menampung konten gambar sistem file ISO asli yang asli. Partisi itu harus memiliki legacy_bootset bendera. Kemudian kami menambahkan partisi kegigihan, menggunakan semua sisa ruang drive USB. Anda dapat melakukannya dengan alat pemartisian yang mampu GPT (ingat legacy_bootbendera). Berikut ini contoh menggunakan 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

Ini menciptakan tabel partisi GPT dan tabel partisi MBR pelindung.

Buat Filesystem

Kami ingin FAT pada EFI dan partisi langsung dan kami ingin ext4parisi kegigihan dan kami membutuhkan label persistenceagar fitur kegigihan berfungsi.

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

Memasang sumber daya

Kita perlu me-mount ISO sumber dan menargetkan partisi pada titik pemasangan sementara.

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

Instal sistem hidup

Salin konten sistem file ISO langsung ke partisi LIVE.

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

persistence.conf

Persiapkan sistem file persistensi dengan file konfigurasi yang diperlukan. Fitur kegigihan tidak akan berfungsi tanpa file ini.

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

Grub untuk dukungan UEFI

Instal grub2 untuk dukungan booting UEFI (ini membutuhkan grub-efi-amd64-binpaket di Debian). Kami memaksa grub-installuntuk tidak menggunakan boot aman UEFI, yang tampaknya tidak berfungsi dengan --removableopsi.

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 untuk dukungan BIOS lawas

Instal syslinux gptmbr.binbootloader ke drive (unduh syslinux atau instal paket syslinux-common). Kemudian instal syslinux ke partisi langsung.

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

Perbaikan Isolinux

Gunakan kembali konfigurasi isolinux dari live ISO asli untuk bekerja dengan 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

Parameter kernel

Sekarang kita menyalin file sistem langsung ke sistem file read-write yang sebenarnya, kita dapat memanipulasi konfigurasi grub dan syslinux.

Tambahkan parameter kernel kegigihan ke menu.cfgdan grub.cfg. Di kedua file, tambahkan kata kunci persistencedi akhir baris pertama masing-masing dengan boot=livedi dalamnya.

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

Setel parameter kernel tata letak keyboard. Di kedua file, tambahkan kata kunci di akhir baris pertama masing-masing dengan boot=livedi dalamnya.

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

Perbaiki grub splash image (opsional; kami memindahkannya ke direktori lain).

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

Lepas dan Bersihkan

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

Mengapa ini harus bekerja untuk UEFI dan BIOS

Saat memulai dalam mode UEFI, PC akan memindai partisi FAT yang kami tentukan dalam tabel partisi GPT. Partisi FAT pertama membawa bootloader grub UEFI, yang ditemukan karena terletak di jalur yang ditentukan oleh UEFI untuk drive yang dapat dilepas ( --removablesakelar untuk grub-installmelakukan ini). Tidak diperlukan entri boot UEFI agar dapat berfungsi, kita hanya perlu membuat PC mencoba melakukan booting dari drive USB. Grub itu dikonfigurasi untuk mengambilnya dari sana (muat grub.cfg, tunjukkan menu, dll.).

Saat memulai dalam mode BIOS dan memilih untuk boot dari drive USB, PC akan mengeksekusi gptmbr.binkode bootloader yang telah kami tulis ke MBR pelindung drive USB. Bootloader itu mencari partisi GPT yang ditandai dengan legacy_bootflag dan chainload syslinux dari partisi itu. Syslinux kemudian mengambil alih (memuat menu.cfg, tampilkan menu, dll.).

Ketekunan Terenkripsi

Alih-alih menggunakan plain ext4 pada partisi persistence, seseorang dapat pertama-tama mengenkripsi partisi persistence dengan LUKS (menggunakan cryptsetup), kemudian memformatnya dengan ext4 (menggunakan label yang tepat). Namun, seperti yang dikatakan dalam dokumentasi , sistem live harus menyertakan cryptsetuppaket. Jika tidak, partisi terenkripsi tidak dapat didekripsi oleh sistem live. Ini berarti kita harus membangun ISO live kustom terlebih dahulu. Namun, itu di luar cakupan jawaban ini.

Sejarah

The --no-uefi-secure-bootpilihan sebelumnya bukan bagian dari panggilan untuk grub-install. Tongkat itu berfungsi dengan baik untuk saya, tetapi berhenti dengan buster Debian, meskipun boot yang aman masih dinonaktifkan pada mesin saya.

schlimmchen
sumber
1
Saya baru saja membuat akun di sini untuk mengucapkan terima kasih atas hal ini. Manual yang sangat baik. Saran kecil - alangkah baiknya jika partisi persisten dienkripsi.
Petr Havlicek
1
@PetrHavlicek Benar. Saya pikir itu cukup mudah untuk dilakukan, tetapi saya menghabiskan waktu luang saya sejak membuat T&J ini dengan masalah lain, jadi saya masih harus meninjau kembali ide ini (dan terima kasih atas penghargaannya :).
schlimmchen
Bagus sekali! Namun, beberapa penjelasan tambahan akan menyenangkan. (yakin Anda dapat melihat semuanya di halaman manual, tetapi mis. mktable, sementara sama dengan mklable, tidak benar-benar didokumentasikan seperti itu, dll.)
mikuszefski
Apakah mungkin untuk hanya memiliki file pada USB stick yang diformat FAT, yang berisi volume kegigihan? Seharusnya dimungkinkan dengan pemasangan loop file. Tetapi bagaimana cara memberitahu Debian initrd untuk mengambil file dan bukannya partisi?
ceving
Lihat debian-live.alioth.debian.org/live-manual/stable/manual/html/… untuk itu. Singkatnya: Buat file gambar (jarang) di root dari setiap sistem file, beri nama file itu 'kegigihan' dan format itu, misalnya, dengan ext4.
schlimmchen