以前から何度もLinuxのインストール先をUSB接続の外付けディスクで試してたけどカーネルパニックで起動できたことがなかったけどまたAIに聞いてSlackwareでできたのでメモ。
まず、USBメモリでインストーラを起動はできるのにインストール先が見えない場合は
modprobe xhci-pci
modprobe usb-storage
modprobe uas
認識できたらgdiskでパーティションを作成。(今回は/dev/sda)
/dev/sda1 1MB ef02(MBR)
/dev/sda2 512MB ef00(UEFI)
/dev/sda3 8GB 8200(スワップ)
/dev/sda4 残り 8399(Linuxシステム)
今時のUEFIとMBRの古いPCどちらでも起動できるようにするためsda1とsda2が必須。
インストール後の設定でliloやeliloはskip、ネット接続はとりあえずdhcpを選んで最後は再起動ではなくshellに抜けて手動で設定する。
sdaはまだマウントされたままなので
mount --bind /dev /mnt/dev
mount --bind /proc /mnt/proc
mount --bind /sys /mnt/sys
chroot /mnt
usbのドライブやraid1を認識できるinitrdを作る
mkinitrd -c -k 5.15.19 \<-- (/lib/module/以下で確認できるバージョン)
-m xhci-pci:xhci-hcd:usb-storage:uas:raid1:ext4 \
-f ext4 \
-r "UUID=1234-abcd-5678" \ <-- (blkidコマンドで確認した/パーティションのUUID)
-w 10 <-- (10秒ウェイト)
eliloconfigコマンドで一度デフォルトの環境を作る。
(raid1環境の時も-r /dev/md0とか指定が必要らしい)
/boot/efi/EFI/Slackware/elilo.confを修正
image=vmlinuz
label=Slackware
initrd=initrd.gz <-- 追加(mkinitrdで作ったファイル名)
read-only
append="root=UUID=ルートパーティションのUUID rootdelay=10" <-- 待ち時間を追加
mkinitrd で作成した /boot/initrd.gz を、eliloが読み取れる場所にコピー
cp /boot/initrd.gz /boot/efi/EFI/Slackware/
マザーボードが変わった時でも起動できるようフェイルセーフの位置にコピー
cp -pR /boot/efi/EFI/BOOT
mv /boot/efi/EFI/BOOT/elilo.efi /boot/efi/EFI/BOOT/BOOTX64.EFI
/etc/fstabの"/dev/sdaX"となっている部分を
UUID=各パーティションのUUID
に変更する。(PCが変わってディスクの名前が変わってもいいようにする。)
boot = /dev/sda # USBメモリのデバイス名(番号は不要)
vga = normal
prompt
timeout = 50
image = /boot/vmlinuz
root = "UUID=ルートパーティションのUUID"
label = Slackware
initrd = /boot/initrd.gz
read-only
append = "rootdelay=10"
liloコマンドを実行
AIいはくliloコマンドがエラになる場合はgrub2を使うとのこと
grub-install --target=i386-pc /dev/sda
grub-mkconfig -o /boot/grub/grub.cfg
exitでchrootを抜け
umount -R /mntでマウントを解除して
rebootで再起動。
起動後に/etc/rc.d/rc.dhcp restartをやり直せばつながったのでタイミングの問題。
/etc/rc.d/rc.inet1.conf
DHCP_TIMEOUT="20" <-- 少し待つようにする
DHCP_IP_ADDR="yes"
これで起動時に線がつながっていればIPアドレスが割り当てられるようになった。
違うPCで起動するとまた繋がらず、restartしてもダメだったけど、これは既に
認識していたNICの情報が残っていることが原因。
/etc/udev/rules.d/70-persistent-net.rules
のNICについての行を消すか、ファイル自体を削除して再起動すればその機材の
NICで登録し直して繋がるようになる。
slackwareのアップデート手順 - bananagunsoの日記
とかアップデートでカーネルのバージョンが新しくなったときはインストール時と同様に
mkinitrdでinitrd.gzを作り直し
vmlinuzを
/boot/efi/EFI/Slackware/vmlinuz
にコピーして
initrd.gzも
/boot/efi/EFI/Slackware/initrd.gz
にコピー
書き込みが遅れることがあるようなので一応syncコマンド
liloコマンド
で手動で更新する必要がある。
関係するファイルは以下のものでvmlinuzとinitrd.gzは
/boot、/boot/efi/EFI/Slackware/、/boot/efi/EFI/BOOT/ですべて同じもの。
違うのはelilo.efiがBOOT/BOOTX64.EFIって名前になるところだけ。
# ls -l /boot/vmlinuz /boot/vmlinuz-6.12.63 /boot/initrd.gz
-rw-r--r-- 1 root root 11918000 Jan 5 21:58 /boot/initrd.gz
lrwxrwxrwx 1 root root 15 Jan 5 20:31 /boot/vmlinuz -> vmlinuz-6.12.63
-rw-r--r-- 1 root root 13881856 Dec 19 09:37 /boot/vmlinuz-6.12.63
# find /boot/efi/EFI/ -ls
4 4 drwxr-xr-x 4 root root 4096 Jan 4 22:43 /boot/efi/EFI/
7 4 drwxr-xr-x 2 root root 4096 Jan 5 15:50 /boot/efi/EFI/Slackware
21 4 -rwxr-xr-x 1 root root 186 Jan 4 22:47 /boot/efi/EFI/Slackware/elilo.conf
22 236 -rwxr-xr-x 1 root root 239734 Aug 5 2022 /boot/efi/EFI/Slackware/elilo.efi
23 13560 -rwxr-xr-x 1 root root 13881856 Jan 4 22:48 /boot/efi/EFI/Slackware/vmlinuz
24 11640 -rwxr-xr-x 1 root root 11918000 Jan 4 22:48 /boot/efi/EFI/Slackware/initrd.gz
12 4 drwxr-xr-x 2 root root 4096 Jan 4 22:43 /boot/efi/EFI/BOOT
29 4 -rwxr-xr-x 1 root root 186 Jan 4 22:51 /boot/efi/EFI/BOOT/elilo.conf
30 13560 -rwxr-xr-x 1 root root 13881856 Jan 4 22:48 /boot/efi/EFI/BOOT/vmlinuz
31 11640 -rwxr-xr-x 1 root root 11918000 Jan 4 22:48 /boot/efi/EFI/BOOT/initrd.gz
32 236 -rwxr-xr-x 1 root root 239734 Aug 5 2022 /boot/efi/EFI/BOOT/BOOTX64.EFI
アップグレード後カーネルパニックで起動できなくなって、古いPCに繋いでMBR環境だと起動できるって状態に。
ファイル名を間違えてコピーしたことが原因だったのでインストールメディアでUFEI起動してeliloconfigで初期状態に戻し、vmlinuzとinitrd.gzのコピーとelilo.confを修正して復旧できた。