見出し画像

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が更新された際もメインのブート設定をいじらなくても問題なく使用できます。

この記事が気に入ったらサポートをしてみませんか?