UEFI + BIOS có thể khởi động Debian trực tiếp kéo dài amd64 với sự bền bỉ


20

Tất cả thông tin tôi tìm thấy về vấn đề này là không đủ cho sở thích của tôi. Nó là lỗi thời, sai lệch hoặc thậm chí sai, có vẻ quá phức tạp hoặc không bao gồm câu hỏi cụ thể này.

Những mục tiêu:

  • ổ USB có thể khởi động (hỗ trợ cả UEFI và BIOS kế thừa)
  • (dựa trên) Debian 9 (kéo dài)
  • kiên trì (theo mặc định và cho cả UEFI và BIOS kế thừa)
  • Bố trí bàn phím tiếng Đức theo mặc định
  • phù hợp để khắc phục sự cố các hệ thống GNU / Linux khác

Lý do:

  • phải thiết lập bố trí bàn phím cho mỗi lần sử dụng là một vấn đề đau đầu
  • cryptsetup và efibootmgr bị thiếu trong các hình ảnh sống mặc định của Debian
  • gnome-terminal có nền trắng khó chịu này theo mặc định

Không có giải pháp:

  • (tái) xây dựng hình ảnh trực tiếp debian tùy chỉnh (có vẻ tẻ nhạt, mặc dù tôi chưa thử)
  • unetbootin (yêu cầu mật khẩu không xác định khi bắt đầu mở rộng debian và tôi nghĩ rằng nó không hỗ trợ UEFI anyways)
  • một số quy trình tự động nước ngoài nơi tôi không thấy những gì đang xảy ra

Debian sống và cài đặt hình ảnh là isohy điều chỉnh và có thể được viết thuận tiện để chặn các thiết bị sử dụng dd. Và họ làm việc từ các ổ USB như thế, rất tuyệt! Tuy nhiên, sẽ không có sự kiên trì và không có cách nào để bắt đầu với bố cục bàn phím không phải tiếng Anh theo mặc định mà không chỉnh sửa cấu hình grub và isolinux, được bao gồm trong hệ thống tệp ISO9660 chỉ đọc của hình ảnh ISO trực tiếp. Vì vậy, ngay cả sau khi ghi ISO trực tiếp vào ổ USB, các thông số này vẫn không thể thay đổi.

Câu trả lời:


30

Đây là một cách để tạo một ổ USB sống Debian với sự bền bỉ. Nó sẽ cho phép cài đặt các gói còn thiếu từ đó sẽ có sẵn trên mỗi lần khởi động trực tiếp bằng cách sử dụng kiên trì. Vì chúng tôi tạo lại nội dung hệ thống tệp hình ảnh ISO trực tiếp trên hệ thống tệp có khả năng đọc ghi, chúng tôi có thể thay đổi cấu hình bộ nạp khởi động để cho phép kiên trì và đặt bố cục bàn phím khi khởi động.

Các bước được mô tả ở đây đã được thử nghiệm để hoạt động trên Debian Stretch và buster để tạo ra một hình ảnh trực tiếp kéo dài Debian.

Có rất nhiều bước liên quan, nhưng dường như phương pháp này vẫn khá hiệu quả.

Tuyên bố miễn trừ trách nhiệm: Bạn sẽ mất dữ liệu trên ổ USB đích và nếu bạn làm hỏng các lệnh bên dưới, bạn có thể cảm thấy rất tiếc sau đó. Tôi không chịu trách nhiệm cho hành động của bạn.

Cảm thấy may mắn

Nếu bạn cảm thấy đặc biệt may mắn ngày hôm nay, bạn có thể thử một tập lệnh bash tự động hóa quy trình cho bạn. Đặt cho nó đường dẫn hình ảnh ISO của bạn làm tham số đầu tiên và tên thiết bị khối ổ đĩa USB là tên thứ hai. Lưu ý rằng tập lệnh này cực kỳ nguy hiểm và bạn không nên thực hiện nó mà không đọc và hiểu nó trước.

TL; DR

Nhận hình ảnh ISO trực tiếp của Debian, sau đó thực hiện các bước sau:

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

Chi tiết và với một số giải thích

Bạn sẽ cần phải thực thi hầu hết các lệnh sau với các đặc quyền nâng cao, nghĩa là sử dụng sudotrên hầu hết các hệ thống GNU / Linux.

Tải về

Tải xuống hình ảnh ISO trực tiếp của Debian với trình quản lý cửa sổ bạn chọn:

https://cdimage.debian.org/debian-cd/civerse-live/amd64/iso-hy điều /

Chúng tôi sẽ đề cập đến hình ảnh ISO được tải xuống đơn giản là "live.iso".

Xác định ổ đĩa đích

Tìm thiết bị sử dụng ổ USB của bạn lsblk. Chúng tôi sẽ gọi nó /dev/sdX.

Vô song

Ngắt kết nối các phân vùng hiện có trên ổ đĩa của bạn bằng cách sử dụng umount /dev/sdX*

Tạo phân vùng

Chúng tôi cần một phân vùng khởi động EFI cho các PC UEFI để khởi động từ ổ USB. Sau đó, chúng ta cần một phân vùng đủ lớn để chứa nội dung hình ảnh hệ thống tập tin ISO gốc. Phân vùng đó phải có legacy_bootcờ đặt. Sau đó, chúng tôi thêm phân vùng kiên trì, sử dụng hết dung lượng còn lại của ổ USB. Bạn có thể làm điều đó với bất kỳ công cụ phân vùng có khả năng GPT nào (chú ý đến legacy_bootcờ). Dưới đây là một ví dụ sử dụng 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

Điều này tạo ra một bảng phân vùng GPT và một bảng phân vùng MBR bảo vệ.

Tạo hệ thống tập tin

Chúng tôi muốn FAT trên EFI và phân vùng trực tiếp và chúng tôi muốn ext4liên kết bền vững và chúng tôi yêu cầu nhãn persistencecho tính năng kiên trì hoạt động.

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

Gắn kết tài nguyên

Chúng ta sẽ cần gắn ISO nguồn và phân vùng đích tại các điểm gắn kết tạm thời.

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

Cài đặt hệ thống trực tiếp

Sao chép nội dung hệ thống tập tin ISO trực tiếp vào phân vùng LIVE.

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

kiên trì

Chuẩn bị hệ thống tập tin kiên trì với tập tin cấu hình cần thiết. Tính năng kiên trì sẽ không hoạt động nếu không có tệp này.

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

Grub cho hỗ trợ UEFI

Cài đặt grub2 để hỗ trợ khởi động UEFI (yêu cầu grub-efi-amd64-bingói này trên Debian). Chúng tôi buộc grub-installđể không sử dụng UEFI khởi động an toàn, mà dường như không làm việc với các --removabletùy chọn.

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 hỗ trợ BIOS kế thừa

Cài đặt gptmbr.binbộ tải khởi động syslinux vào ổ đĩa (tải xuống syslinux hoặc cài đặt gói syslinux-common). Sau đó cài đặt syslinux vào phân vùng trực tiếp.

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

Sửa chữa Isolinux

Sử dụng lại cấu hình isolinux của ISO gốc trực tiếp để hoạt động với 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

Thông số hạt nhân

Bây giờ chúng tôi đã sao chép các tệp hệ thống trực tiếp vào một hệ thống tệp đọc-ghi thực tế, chúng tôi có thể thao tác cấu hình grub và syslinux.

Thêm tham số kernel kiên trì vào menu.cfggrub.cfg. Trong cả hai tệp, thêm từ khóa persistenceở cuối dòng đầu tiên tương ứng với boot=livenó.

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

Đặt tham số kernel bố trí bàn phím. Trong cả hai tệp, thêm các từ khóa ở cuối dòng đầu tiên tương ứng với boot=livenó.

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 giật gân

Sửa hình ảnh giật gân grub (tùy chọn; chúng tôi đã chuyển nó vào một thư mục khác).

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

Tháo gỡ và dọn dẹp

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

Tại sao điều này nên hoạt động cho cả UEFI và BIOS

Khi bắt đầu ở chế độ UEFI, PC sẽ quét các phân vùng FAT mà chúng ta đã xác định trong bảng phân vùng GPT. Phân vùng FAT đầu tiên mang bộ tải khởi động UEFI grub, được tìm thấy bởi vì nó nằm trong đường dẫn được chỉ định bởi UEFI cho các ổ đĩa di động (công --removabletắc để grub-installthực hiện việc này). Không có mục khởi động UEFI nào cần thiết để hoạt động, chúng ta chỉ cần làm cho PC cố gắng khởi động từ ổ USB. Grub đó được cấu hình để lấy nó từ đó (tải grub.cfg, hiển thị menu, v.v.).

Khi bắt đầu ở chế độ BIOS và chọn khởi động từ ổ USB, PC sẽ thực thi gptmbr.binmã bộ tải khởi động mà chúng tôi đã ghi vào MBR bảo vệ của ổ USB. Bộ tải khởi động đó tìm phân vùng GPT được đánh dấu bằng legacy_bootcờ và chuỗi tải syslinux từ phân vùng đó. Syslinux sau đó tiếp quản (tải menu.cfg, hiển thị menu, v.v.).

Kiên trì mã hóa

Thay vì sử dụng ext4 đơn giản trên phân vùng lưu trữ lâu dài, trước tiên người ta có thể mã hóa phân vùng lưu trữ lâu bền bằng LUKS (sử dụng cryptsetup), sau đó định dạng với ext4 (sử dụng nhãn phù hợp). Tuy nhiên, như tài liệu nói, hệ thống trực tiếp phải bao gồm cryptsetupgói. Mặt khác, phân vùng được mã hóa không thể được giải mã bởi hệ thống trực tiếp. Điều này có nghĩa là người ta phải xây dựng một ISO trực tiếp tùy chỉnh trước tiên. Đó là, tuy nhiên, ra khỏi phạm vi của câu trả lời này.

Lịch sử

Các --no-uefi-secure-boottùy chọn trước đây không nằm trong cuộc gọi đến grub-install. Chiếc gậy hoạt động tốt với tôi, nhưng nó đã dừng với Debian buster, mặc dù khởi động an toàn vẫn bị vô hiệu hóa trên máy của tôi.


1
Tôi vừa tạo một tài khoản ở đây để cảm ơn bạn vì điều này. Hướng dẫn tuyệt vời. Gợi ý nhỏ - thật tuyệt khi được mã hóa phân vùng kiên trì.
Petr Havlicek

1
@PetrHavlicek Đúng. Tôi nghĩ rằng điều đó là đủ dễ để làm, nhưng tôi đã dành thời gian rảnh rỗi của mình kể từ khi tạo Q & A này với các vấn đề khác, vì vậy tôi vẫn phải xem lại ý tưởng này (và cảm ơn sự đánh giá cao của bạn :).
schlimmchen

Hoạt động tuyệt vời! Một số giải thích thêm sẽ là tốt đẹp, mặc dù. (chắc chắn bạn có thể nhìn tất cả lên trên các trang người đàn ông, nhưng ví dụ mktable, trong khi giống như mklable, là không thực sự ghi nhận như vậy, vv)
mikuszefski

Có thể chỉ có một tệp trên thanh USB được định dạng FAT, có chứa âm lượng không đổi? Nó có thể được thực hiện bằng cách gắn vòng lặp tập tin. Nhưng làm thế nào để nói với Debians initrd lấy một tệp thay vì phân vùng?
ceving

Xem debian-live.alioth.debian.org/live-manual/urdy/manual/html/iêu để biết điều đó. Tóm lại: Tạo một tệp hình ảnh (thưa thớt) trong thư mục gốc của bất kỳ hệ thống tệp nào, đặt tên tệp đó là 'kiên trì' và định dạng tệp, ví dụ: với ext4.
schlimmchen
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.