Как известно, конфигурационный файл для меню загрузки 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
Комментарии
11 лет 23 недели назад
11 лет 24 недели назад
11 лет 24 недели назад
11 лет 24 недели назад
11 лет 26 недель назад
11 лет 26 недель назад
11 лет 26 недель назад
11 лет 36 недель назад
11 лет 36 недель назад
11 лет 37 недель назад