GRUB2 а-ля консоль :)

Ковырял я тут на днях свой переносной арч на флешке, и подумал – зачем мне это громоздкое меню с кучей разных комбинаций на все случаи жизни, если гораздо проще задать каждый параметр отдельно?

Стал я искать способы задать отдельно, и упёрся в то, что не выходило никак сделать индикацию в меню уже добавленных опций. И тут меня осенило – зачем вообще меню, зачем мне вообще этот гуй, если у груба есть настоящая консоль? Сделаю конфиг с командами-функциями, буду всех пугать :)

В итоге получился вот такой конфиг (grub.cfg):
function RESET {
iLTS=''
iFALL=''
iNM=''
VESAFB=''
MLOAD=''
GFX=''
CUST=''
}
function LIST {
 echo "Options: LTS=$iLTS FALL=$iFALL NM=$iNM VESAFB=$VESAFB GFX=$GFX MLOAD=$MLOAD CUST=$CUST"
 echo "Commands: LIST RESET BOOT INTEL NM VESA FALL LTS NEXTDISK MENU"
 echo "VESA 8 =800x600x8  10 =1024x768x8  12 =1280x1024x8  n12 =1280x800x8  '' =auto"
}
function MENU {
    configfile /boot/grub/menu.cfg
}
function BOOT {
    set gfxpayload="$GFX"
    linux /boot/vmlinuz-linux$iLTS root=/dev/root loglevel=6 $iNM $VESAFB $MLOAD $CUST
    initrd /boot/initramfs-linux$iLTS$iFALL.img
    boot
}
function INTEL {
    MLOAD="modload.first=i915"
}
function NM {
    iNM=nomodeset
}
function VESA {
    if [ "$1" == "8" ] ; then
     GFX=800x600x8
    elif [ "$1" == "10" ] ; then
     GFX=1024x768x8
    elif [ "$1" == "12" ] ; then
     GFX=1280x1024x8
    elif [ "$1" == "n12" ] ; then
     GFX=1280x800x8
    elif [ -z "$1" ] ; then
     GFX=auto
    else
     GFX="$1"
    fi
    VESAFB="video=vesafb:mtrr:3"
    iNM=nomodeset
}
function FALL {
    iFALL="-fallback"
}
function LTS {
    iLTS="-lts"
}
function NEXTDISK {
    set root=(hd1)
    chainloader +1
}
set pager=1
RESET

Теперь у меня загрузка с флешки по дефолту выглядит так:
grub> BOOT
загрузка с VESA и ядром LTS:
grub> VESA
grub> LTS
grub> BOOT
загрузка с VESA в разрешении 1280x800 (на ноуте, к примеру):
grub> VESA n12
grub> BOOT
занятно, сразу понял, что поддержка скриптинга в конфиге дает полет фантизии. По сабжу мне понавилось, просто, а главное - сердито.
Лозунг у них был такой: "Познание бесконечности требует бесконечного времени". С этим я не спорил, но они делали из этого неожиданный вывод: "А потому работай не работай — все едино". И в интересах неувеличения энтропии Вселенной они не работали. (с)
Вот, новое издание конфига, доработанное.
1) Поменял все команды-функции на слова в нижнем регистре, так всё же набирать легче.
2) Добавил ручное сохранание параметров и автоматическое их восстановление при старте.
3) Подумав, добавил меню. Всё же оно бывает нужно, если ничего не надо менять, или если параметры уже сохранены в прошлый раз. Для всех остальных случаев – консоль удобнее :)
grub.cfg :
function reset {
LTS=
FALL=
NM=
VESAFB=
MLOAD=
GFX=
UTC=
CUST=
}
function save {
 save_env LTS FALL NM VESAFB MLOAD GFX UTC CUST
}
function load {
 load_env
}
function list {
 echo "Options: LTS=$LTS FALL=$FALL UTC=$UTC NM=$NM VESAFB=$VESAFB GFX=$GFX MLOAD=$MLOAD CUST=$CUST"
 echo "Commands: list reset load save utc intel nm vesa fall lts go (boot) nextdisk"
 echo "vesa 8 =800x600x8  10 =1024x768x8  12 =1280x1024x8  n12 =1280x800x8  '' =auto"
}
function go {
 set gfxpayload="$GFX"
 linux /boot/vmlinuz-linux$LTS root=/dev/root loglevel=6 $NM $VESAFB $MLOAD $UTC $CUST
 initrd /boot/initramfs-linux$LTS$FALL.img
 boot
}
function utc {
 UTC="clock=UTC"
}
function intel {
 MLOAD="modload.first=i915"
}
function nm {
 NM=nomodeset
}
function vesa {
 if [ "$1" == "8" ] ; then
  GFX=800x600x8
 elif [ "$1" == "10" ] ; then
  GFX=1024x768x8
 elif [ "$1" == "12" ] ; then
  GFX=1280x1024x8
 elif [ "$1" == "n12" ] ; then
  GFX=1280x800x8
 elif [ -z "$1" ] ; then
  GFX=auto
 else
  GFX="$1"
 fi
 VESAFB="video=vesafb:mtrr:3"
 nm
}
function fall {
 FALL="-fallback"
}
function lts {
 LTS="-lts"
}
function nextdisk {
 set root=(hd1)
 chainloader +1
}
set pager=1
reset
load
# Simple menu
set timeout=5
set default=0
set menu_color_normal=white/blue
set menu_color_highlight=white/black
menuentry "Boot Arch Linux" {
 go
}
menuentry "Boot next disk" {
 nextdisk
}
menuentry "'c' - configire, list - more info" {
 true
}

P.S.
Ну и задание HARDWARECLOCK в rc.conf из загрузчика – никогда заранее не знаешь, как стоят часы на другой машине. Мелочь, а приятно :)
 
Зарегистрироваться или войдите чтобы оставить сообщение.