Комментарии

Галерея

Опрос

Из каких стран идет больше всего спама, попыток взлома на ваши серверы?:

Написание конфигурации для Grub2 с автоматическим расширением меню загрузки

     

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