USBメモリからブート(Stretch) ~パーティション~

2019/4/15


準備

用意するもの syslinux,/usr/lib/syslinux/mbr/gptmbr.binが必要になので、インストールする。
apt install -y syslinux syslinux-efi

EFIからブートには

EFIからブートするにはvfat領域が必要らしい。
「オレオレDebian...」はLinux(ext4)だけだったので起動できない。
「vfat領域を作りさえすればいいのか?」等疑問はある。先を急ぐのでこの疑問は後日検証することにしよう。

パーティションをつくる

fdiskとかgdiskとかpartedとかいろいろツールがあるが、 UEFI + BIOS bootable live Debian stretch amd64 with persistenceではpartedを使い、スクリプト的に記述している。
パーティション番号がDebian-Liveとちがうが問題ないらしい。
mkdir /tmp/usb-efi /tmp/usb-live /tmp/usb-persistence /tmp/live-iso
mount -oro debian-live-9.8.0-amd64-xfce.iso /tmp/live-iso

#/dev/sdxはfdisk -lなどで確認
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 2GiB
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

#パーティションをフォーマットしたのちマウント
#sdx3はフォーマットに時間がかかる場合がある
#Debian-Liveからsdx2へファイルをコピーする しばらく待つ
mkfs.vfat -n EFI /dev/sdx1; mount /dev/sdx1 /tmp/usb-efi
mkfs.vfat -n LIVE /dev/sdx2; mount /dev/sdx2 /tmp/usb-live; cp -ar /tmp/live-iso/* /tmp/usb-live
mkfs.ext4 -F -L persistence /dev/sdx3; mount /dev/sdx3 /tmp/usb-persistence; echo "/ union" > /tmp/usb-persistence/persistence.conf

#grub-installに時間がかかる場合がある
grub-install --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

#ディレクトリ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/grub.cfg,syslinux/meng.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=jp locales=ja_JP.UTF-8 keyboard-model=jp106 timezone=Asia\/Tokyo/}' /tmp/usb-live/boot/grub/grub.cfg /tmp/usb-live/syslinux/menu.cfg

#書き込みが完了したのちアンマウント
sync;sync;sync;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 bootable live Debian stretch amd64 with persistence