Как известно, конфигурационный файл для меню загрузки 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
Комментарии
10 лет 32 недели назад
10 лет 33 недели назад
10 лет 33 недели назад
10 лет 33 недели назад
10 лет 35 недель назад
10 лет 35 недель назад
10 лет 35 недель назад
10 лет 45 недель назад
10 лет 45 недель назад
10 лет 46 недель назад