GRUBの設定をカスケード式に読み込む
GRUBと言うと、update-grubコマンドやgrub customiserで設定を作ることで、Linuxのブートを支えるブートプログラムになります。
普通であれば、os-proberでWindows他のOSのブート設定も作れるんですが、LVMやbtrfsなど、os-proberが読み込めないものもあります。
そんな物を読み込めるようにするカスタム設定というものがgrubにはあります。
そのカスタム設定を使って他のLinuxを読み込む設定を紹介していきます。
まずは、それぞれのLinuxでupdate-grubを使ってgrubの設定を作っておきます。
sudo update-grub
そうすると/boot/grub/brub.cfgとして以下のようなデータができます。
# DO NOT EDIT THIS FILE
#
# It is automatically generated by grub-mkconfig using templates
# from /etc/grub.d and settings from /etc/default/grub
#
(略)
### BEGIN /etc/grub.d/10_linux ###
function gfxmode {
set gfxpayload="${1}"
if [ "${1}" = "keep" ]; then
set vt_handoff=vt.handoff=7
else
set vt_handoff=
fi
}
if [ "${recordfail}" != 1 ]; then
if [ -e ${prefix}/gfxblacklist.txt ]; then
if [ ${grub_platform} != pc ]; then
set linux_gfx_mode=keep
elif hwmatch ${prefix}/gfxblacklist.txt 3; then
if [ ${match} = 0 ]; then
set linux_gfx_mode=keep
else
set linux_gfx_mode=text
fi
else
set linux_gfx_mode=text
fi
else
set linux_gfx_mode=keep
fi
else
set linux_gfx_mode=text
fi
export linux_gfx_mode
menuentry 'Pop GNU/Linux' --class pop --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-f644b103-24fb-4c25-a13f-ed0441a73faa' {
recordfail
load_video
gfxmode $linux_gfx_mode
insmod gzio
if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi
insmod part_msdos
insmod part_msdos
insmod lvm
insmod btrfs
set root='lvmid/xflDL2-sfOX-YAVe-gsZU-ouXf-ImrJ-YXtJd7/W21XSI-5aD0-bUiN-pMQs-yCsX-6Pu1-MJV7PN'
if [ x$feature_platform_search_hint = xy ]; then
search --no-floppy --fs-uuid --set=root --hint='lvmid/xflDL2-sfOX-YAVe-gsZU-ouXf-ImrJ-YXtJd7/W21XSI-5aD0-bUiN-pMQs-yCsX-6Pu1-MJV7PN' f644b103-24fb-4c25-a13f-ed0441a73faa
else
search --no-floppy --fs-uuid --set=root f644b103-24fb-4c25-a13f-ed0441a73faa
fi
linux /@/boot/vmlinuz-6.6.10-76060610-generic root=/dev/mapper/main-pop ro rootflags=subvol=@ quiet splash $vt_handoff
initrd /@/boot/initrd.img-6.6.10-76060610-generic
}
(略)
### BEGIN /etc/grub.d/41_custom ###
if [ -f ${config_directory}/custom.cfg ]; then
source ${config_directory}/custom.cfg
elif [ -z "${config_directory}" -a -f $prefix/custom.cfg ]; then
source $prefix/custom.cfg
fi
### END /etc/grub.d/41_custom ##
このように、Linux OSのブート設定ファイルができます。
grubには、/etc/grub.d/41.customという、/boot/grub/custom.cfgを読み込むという機能があります。
これを使って他パーティーションの/boot/grub/grub.cfgを読み込むことができます。
他のパーティーションから、/boot/grub/grub.cfgのメインエントリー情報をコピーして/boot/grub/custom.cfgファイルに書き込みます。
そして、linux行とinitrd行を消して、代わりにconfigfile行を作ります。
menuentry 'Linux Mint 21.2 Xfce' --class linuxmint --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-b3434a38-dbea-4214-a333-c252546b9193' {
recordfail
load_video
gfxmode $linux_gfx_mode
insmod gzio
if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi
insmod part_msdos
insmod part_gpt
insmod part_msdos
insmod lvm
insmod btrfs
set root='lvmid/xflDL2-sfOX-YAVe-gsZU-ouXf-ImrJ-YXtJd7/edmMdX-2Gwr-Fire-sgj5-fUXo-QkQD-HW2ntz'
if [ x$feature_platform_search_hint = xy ]; then
search --no-floppy --fs-uuid --set=root --hint='lvmid/xflDL2-sfOX-YAVe-gsZU-ouXf-ImrJ-YXtJd7/edmMdX-2Gwr-Fire-sgj5-fUXo-QkQD-HW2ntz' b3434a38-dbea-4214-a333-c252546b9193
else
search --no-floppy --fs-uuid --set=root b3434a38-dbea-4214-a333-c252546b9193
fi
configfile /@/boot/grub/grub.cfg
}
configfile行には、grub.cfgのパスを設定します。
こうすることで、例で言えばブート画面のLinux Mint 21.2 Xfceエントリーを選択するとLinux Mint 21.2 Xfceのブート情報が読み込まれ、画面に表示されます。
これなら、他のLinuxが更新された際もメインのブート設定をいじらなくても問題なく使用できます。