Как известно, конфигурационный файл для меню загрузки Grub2 представляет собой обычный shell (довольно сильно урезанный по функционалу). Одной из самых интересных и нужных мне функций Grub2 является загрузка livecd-образов с флешки, подключая их как блочные устройства. На сегодняшний день существует множество мануалов как это сделать. Недостаток их всех заключается в том, что необходимо ручками изменять/дописывать конфигурацию при добавлении нового livecd. Далее я расскажу, как сделать чтобы Grub2 сам добавлял пункты загрузки для каждого найденного iso-образа на примере SystemRescueCd.
Сложность заключается в том, что в сети достаточно скудно рассказывается о тонкостях написания на Grub2 shell и информацию приходится находить по крупицам. Основанием для написания скрипта послужил пример одного конфига, на который я недавно наткнулся у слакварщиков. Самой большой головной болью написания конфига, оказалась невозможность задания глобальных переменных. Все переменные должны быть переданы функциям, иначе их не будет в области видимости.
Далее привожу готовый скрипт.
insmod part_msdos
insmod regexp
insmod fat
search -u 9D31-04B1 -s
function sysrcd_menuentry {
set ver="$1"
set kname="$2"
set rname="$3"
menuentry "SystemRescueCd ${ver} (${kname})" ${ver} ${kname} ${rname} {
set ver="$2"
set kname="$3"
set rname="$4"
set isodir="/.boot/iso"
set isofile="${isodir}/systemrescuecd-x86-${ver}.iso"
loopback loop "${isofile}"
linux "(loop)/isolinux/${kname}" \
usbstick setkmap=ru docache isoloop="${isofile}"
initrd "(loop)/isolinux/${rname}"
}
}
function sysrcd_submenu {
set v1="$1"
set v2="$2"
set v3="$3"
set ver="${v1}.${v2}.${v3}"
submenu "SystemRescueCd ${ver}" $1 $2 $3 {
set v1="$2"
set v2="$3"
set v3="$4"
set ver="${v1}.${v2}.${v3}"
sysrcd_menuentry ${ver} altker32 initram.igz
sysrcd_menuentry ${ver} altker64 initram.igz
regexp '[1-2]' ${v1}
if [ $? == 0 ]
then
sysrcd_menuentry ${ver} rescuecd initram.igz
else
sysrcd_menuentry ${ver} rescue32 initram.igz
fi
sysrcd_menuentry ${ver} rescue64 initram.igz
}
}
function sysrcd_search {
set isodir="/.boot/iso"
for file in ${isodir}/systemrescuecd-x86-*.iso
do
regexp -s 1:v1 -s 2:v2 -s 3:v3 \
'\-([1-9])\.([0-9])\.([0-9])\.iso$' "${file}"
if [ $? != 0 ]
then
continue
fi
sysrcd_submenu ${v1} ${v2} ${v3}
done
}
submenu "SystemRescueCd" {
sysrcd_search
}Чтобы потестить его в работе можете ознакомиться с предыдущей моей записью про создание убер-флешки и подпихните на флешку новый конфиг. Скрипт подгружает SystemRescueCD-образа c номерами версий от 1.0.0 до 9.9.9. мной были проверены следующие образа:
systemrescuecd-x86-1.6.4.iso
systemrescuecd-x86-2.8.1.iso
systemrescuecd-x86-3.8.1.iso
systemrescuecd-x86-4.0.0.iso

Удачи!
Полезные ссылки:
http://www.gnu.org/software/grub/manual/grub.html