Как известно, конфигурационный файл для меню загрузки 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
Комментарии
9 лет 18 недель назад
9 лет 19 недель назад
9 лет 19 недель назад
9 лет 20 недель назад
9 лет 21 неделя назад
9 лет 22 недели назад
9 лет 22 недели назад
9 лет 32 недели назад
9 лет 32 недели назад
9 лет 32 недели назад