web-dev-qa-db-ja.com

UEFI + BIOS起動可能なライブDebianストレッチAMD64と永続性

私がこの問題について現在見つけているすべての情報は私の好みには不十分です。古くなっているか、誤解を招くか、さらには間違いであるか、過度に複雑であるか、この特定の質問をカバーしていないようです。

目標:

  • 起動可能なUSBドライブ(UEFIとレガシーBIOSの両方をサポート)
  • (ベース)ライブDebian 9(ストレッチ)
  • 永続性(デフォルトで、UEFIとレガシーBIOSの両方)
  • デフォルトのドイツ語キーボードレイアウト
  • 他のGNU/Linuxシステムのトラブルシューティングに適合

理由:

  • 使用するたびにキーボードレイアウトをセットアップする必要があるのは、本当に頭痛の種です
  • cryptsetupとefibootmgrがデフォルトのDebianライブイメージにない
  • gnome-terminalには、デフォルトでこの迷惑な白い背景があります

ソリューションなし:

  • カスタムのdebianライブイメージを(再)構築する(私はまだ試していませんが、退屈なようです)
  • unetbootin(debian Stretchで起動するときに不明なパスワードを要求しますが、いずれにしてもUEFIはサポートされていないと思います)
  • 何が起こっているのかわからない外国の自動プロセス

Debianのライブおよびインストールイメージはisohybridであり、ddを使用してデバイスをブロックするように簡単に作成できます。そして、それらはそのようなUSBドライブで動作します。ただし、永続性はなく、grubとisolinux configを編集せずに、デフォルトで英語以外のキーボードレイアウトから始める方法はありません。これは、ライブISOイメージの非常に読み取り専用のISO9660ファイルシステムに含まれています。したがって、ライブISOをUSBドライブに書き込んだ後でも、これらのパラメーターは変更できません。

20
schlimmchen

これは、永続性のあるDebianライブUSBドライブを作成する方法です。これにより、欠落しているパッケージをインストールできるようになります。これにより、永続性を使用してすべてのライブブートで使用できるようになります。読み書き可能なファイルシステムでライブISOイメージファイルシステムのコンテンツを再作成するため、ブートローダーの構成を変更して永続化を有効にし、ブート時にキーボードレイアウトを設定できます。

ここで説明する手順は、Debianストレッチとバスターで動作し、Debianストレッチライブイメージを作成するためにテストされました。

多くの手順が含まれていますが、この方法はまだ非常に効率的です。

免責事項:ターゲットUSBドライブのデータが失われます。以下のコマンドをめちゃくちゃにすると、後で非常に残念に思うかもしれません。私はあなたの行動について責任を負いません。

ラッキーな感じ

今日、特に幸運だと感じた場合は、 bashスクリプト でプロセスを自動化してみてください。最初のパラメーターとしてISOイメージパスを指定し、2番目のパラメーターとしてUSBドライブブロックデバイス名を指定します。このスクリプトはめちゃくちゃ危険であり、最初に読んで理解することなしに実行しないでください。

TL; DR

DebianライブISOイメージを取得して、次の手順を実行します。

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

詳細といくつかの説明付き

次のコマンドのほとんどは昇格された特権で実行する必要があります。つまり、ほとんどのGNU/LinuxシステムではSudoを使用します。

ダウンロード

選択したウィンドウマネージャーでDebianライブISOイメージをダウンロードします。

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

ダウンロードしたISOイメージを単に「live.iso」と呼びます。

ターゲットドライブを決定する

lsblkを使用して、USBドライブであるデバイスを見つけます。これを/dev/sdXと呼びます。

アンマウント

umount /dev/sdX*を使用して、ドライブ上の既存のパーティションをアンマウントします

パーティションを作成する

UEFI PCがUSBドライブから起動するには、EFI起動パーティションが必要です。次に、元のライブ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パーティションテーブルが作成されます。

ファイルシステムを作成する

EFIとライブパーティションにFATが必要であり、永続化パーティションに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

UEFIサポートのためのGrub

UEFIブートサポート用のgrub2をインストールします(Debianにはgrub-efi-AMD64-binパッケージが必要です)。 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

レガシーBIOSサポート用のSyslinux

ドライブにsyslinux gptmbr.binブートローダーをインストールします(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フィックスアップ

元のライブISOのisolinux構成を再利用して、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

Keyboard-layoutカーネルパラメータを設定します。両方のファイルで、それぞれの最初の行の末尾に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スプラッシュ画像を修正します(オプション、別のディレクトリに移動しました)。

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モードで起動すると、PCはGPTパーティションテーブルで定義したFATパーティションをスキャンします。最初のFATパーティションにはUEFIグラブブートローダーが含まれています。これは、リムーバブルドライブ用にUEFIによって指定されたパスにあるため、見つかります(--removableからgrub-installへの切り替えにより、これが行われます)。それが機能するためにUEFIブートエントリは必要ありません。PCにUSBドライブからのブートを試行させるだけです。そのgrubはそこから取得するように構成されています(grub.cfgのロード、メニューの表示など)。

BIOSモードで起動し、USBドライブからの起動を選択すると、PCはUSBドライブの保護MBRに書き込んだgptmbr.binブートローダーコードを実行します。そのブートローダーは、legacy_bootフラグでマークされたGPTパーティションを探し、そのパーティションからsyslinuxをチェーンロードします。その後、Syslinuxが引き継ぎます(menu.cfgのロード、メニューの表示など)。

暗号化された永続性

永続化パーティションでプレーンなext4を使用する代わりに、最初にLUKSで永続化パーティションを暗号化し(cryptsetupを使用)、次にext4でそれをフォーマットします(適切なラベルを使用)。ただし、 documentation が示すように、ライブシステムにはcryptsetupパッケージを含める必要があります。そうしないと、暗号化されたパーティションをライブシステムで復号化できません。つまり、最初にカスタムライブISOを作成する必要があります。ただし、これはこの回答の範囲外です。

歴史

--no-uefi-secure-bootオプションは、以前はgrub-installの呼び出しの一部ではありませんでした。スティックは私にとってはうまくいきましたが、私のマシンではセキュアブートがまだ無効になっているにもかかわらず、Debianバスターで停止しました。

30
schlimmchen