Не много о самописном grub.cfg

Открыть данный топик сподвигла в одном из топиков проосьба Holden осветить написание самописного grub.cfg.
Вообщем то, думаю, тема полезная, тем более, что наличие своего самописного grub.cfg упрощает жизнь и делает не нужной кучу не понятных файлов, имеющих отношение к загрузке с помощью grub.
Кроме того, можно делиться опытом и выкладывать свои образцы grub.cfg и др.

Самописный grub.cfg можно использовать как при загрузке разных операционных систем, так и при загрузке с разных образов этих систем, расположенных как не переносном носителе, так и в самой системе, что очень удобно и не требуется наличие переносного носителя.
Расмотрим в кратце все эти варианты. Что почитать? - конечно, в 1-ую очередь русскую версию Wiki, а по загрузке с образов статью в блогах, в которой процесс автоматизирован.

1. Загрузка Arch Linux - самый простой grub.cfg - в принципе все понятно и просто.
Мой пример загрузки Arch Linux для ядра linux и ядра linux-lts, windows7.
# по-умолчанию выбран пункт меню 0
set default=0

# при бездействии пользователя загрузка через 5 секунд
set timeout=5

# пункт меню номер 0
menuentry "ArchLinux" {
 linux /boot/vmlinuz-linux root=/dev/sda3 rw audit=0
 initrd /boot/initramfs-linux.img
}

# пункт меню номер 1
menuentry "ArchLinux-lts" {
 linux /boot/vmlinuz-linux-lts root=/dev/sda3 rw
 initrd /boot/initramfs-linux-lts.img
}

# пункт меню номер 2
menuentry "Windows 7" {
 set root=(hd0,1)
 chainloader (hd0,1)+1
}
Строчки выбора меню и времени бездействия понятны и нет смысла описывать.
Строчки загрузки ArchLinux тоже понятны, например:
/boot/vmlinuz-linux --- указываем расположение и название ядра
root=/dev/sda3 rw --- указываем расположение корневого раздела (/)
(после rw указываем, при необходимости, параметрыи ядра, например, audit=0 - чтобы не захламлять логи journal строками audit)
В части загрузки windows - способов несколько, но описывать вроде бы не совсем этично - мы же линуксоиды - а потому кому интересно, гуглите.

Если имеется еще, например, и Ubuntu, то форма записи будет немного другая, например, раньше использовал такую запись - сейчас этого нет и проверить не могу
# пункт меню номер 3
submenu "Ubuntu" {
 set root=(hd0,2)
 linux /boot/vmlinuz-3.2.0-39-generic-pae  root=/dev/sda2 rw quiet
 initrd /boot/initrd.img-3.2.0-39-generic-pae
}

2. Загрузка с образов - здесь все сложнее и описывать нет смысла - примите как догму, а для понимания написанного отсылаю к DOC … но кто не желает иметь полностью ручное написание для загрузки образов, может воспользоваться указанным выше блогом.
Привожу свой пример загрузки с образов, расположенных в директории /ISO, если нужно изменить путь, то меняем только set isofile=/путь/образ
# пункт меню номер 3
menuentry "archlinux-2020.08.01-x86_64.iso" {
 set isofile=/ISO/archlinux-2020.08.01-x86_64.iso
 loopback loop (hd0,3)$isofile
 probe -s root_uuid -u $root
 linux (loop)/arch/boot/x86_64/vmlinuz-linux img_dev=/dev/disk/by-uuid/$root_uuid img_loop=$isofile earlymodules=loop
 initrd (loop)/arch/boot/x86_64/archiso.img
 boot
}

# пункт меню номер 4
menuentry "systemrescuecd-amd64-6.1.5.iso" {
 insmod gzio
 set isofile=/ISO/systemrescuecd-amd64-6.1.5.iso
 loopback loop (hd0,3)$isofile
 probe -s root_uuid -u $root
 linux (loop)/sysresccd/boot/x86_64/vmlinuz img_dev=/dev/disk/by-uuid/$root_uuid img_loop=$isofile archisobasedir=sysresccd
 initrd (loop)/sysresccd/boot/x86_64/sysresccd.img
 boot
}

EDIT 1 - забыл отметить два момента:
1 - желательно защитить файл grub.cfg от любых изменений chattr +i /boot/grub/grub.cfg (разблокировка -i ) и плюс к этому, чтобы избежать конфликта с файлом из пакета, добавить имя grub.cfg в строку NoUpgrade в /etc/pacman.conf (типа NoUpgrade = boot/grub/grub.cfg)
2. Можно защитить grub паролем, чтобы никто не смог править grub при загрузке (в меню grub можно будет попасть только после ввода пароля)
Ошибки не исчезают с опытом - они просто умнеют
vasek
Благодарю за ответ. Я не так давно (около 3 лет) перешел на арч с дебиана, хотя пытался это сделать еще лет 8 назад, но не заладилось. Сейчас работаю в plasma, второй системой (кстати, по Вашему примеру), установил ледяной в сервисных целях, т. к. люблю icewm, правда с pcmanfm, а не с rox. Ваше пост мне вполне понятен, не думаю, что возникнут какие-либо вопросы.
Еще раз спасибо.
vasek
1 - желательно защитить файл grub.cfg от любых изменений chattr …
Защитить - это хорошо, могу предложить ещё один способ. (Я специально с защитой не заморачивался, само получлось в процессе попыток полюбить efi и последующего развода :) )
Grub и всё его хозяйство у меня находятся на отдельном разделе, и этот раздел в системе не монтируется. Если надо там что-то поковырять - в корне есть отдельный каталог для его монтирования (не /boot!) и запись в fstab с noauto. Смонтировал, поковырял, отмонтировал.
а в преамбуле конфига что-то типа? -


load_video
        set gfxpayload=keep
        insmod gzio
        insmod part_gpt
        insmod btrfs

проверил опытным путем = это (эта вставка) все от лукавого, лишнее.
wau
а в преамбуле конфига что-то типа?
Уже отмечал, что grub содержит кучу файлов, в том числе и скрипты (/etc/grub.d/), которые используются для генерации grub.cfg, который сам в общем виде также является довольно сложным и при запуске много чего проверяет, в том числе и наличие параметров видеорежима, заставок, текста и прочее … в частности
- load_video - это функция, связанная с видеорежимом/графикой - смотри ее описание в grub.cfg (также имеется и в файлах /etc/grub.d/)
- gfxpayload - описывать не буду, приведу ее определение из мануала
gfxpayload - If this variable is set, it controls the video mode in which the Linux kernel starts up, replacing the ‘vga=’ boot option (see linux). It may be set to ‘text’ to force the Linux kernel to boot in normal text mode, ‘keep’ to preserve the graphics mode set using ‘gfxmode’, or any of the permitted values for ‘gfxmode’ to set a particular graphics mode (see gfxmode).
В части модулей - нет смысла грузить кучу разных модулей - только необходимые.
Все хорошо и подробно описано в мануале Grub и даже с примерами

Выше приведенные конифиги, в 1-ом посте, - это простые конфиги, без всяких наворотов, но, при желании, можно дописывать свои хотелки.
Ошибки не исчезают с опытом - они просто умнеют

# пункт меню номер 4
menuentry "ArchLinux ISO" {
 set isofile=/boot/arch.iso
 loopback loop (hd0,3)$isofile
 probe -s root_uuid -u $root
 linux (loop)/arch/boot/x86_64/vmlinuz-linux img_dev=/dev/disk/by-uuid/$root_uuid img_loop=arch.iso earlymodules=loop
 initrd (loop)/arch/boot/x86_64/archiso.img
 boot
}
Не работает. При загрузке груб пишет - не найден файл /arch/boot/x86_64/archiso.img. ЧЯДНТ?
Получилось. С ISO пока не разбирался, по сути нужна только поддержка Parted Magic. Субъективно, самописный GRUB загружает систему быстрее.
vasek, благодарю.
grub.cfg


# Menu item 0 selected by default
set default=0

# When the user is idle, loading after 5 sec
set timeout=5

# Menu item number 0
menuentry "ArchLinux" {
 linux /boot/vmlinuz-linux root=/dev/sda2 rw audit=0
 initrd /boot/initramfs-linux.img
}

# Menu item number 1
menuentry "ArchLinux-lts" {
 linux /boot/vmlinuz-linux-lts root=/dev/sda2 rw
 initrd /boot/initramfs-linux-lts.img
}

# Menu item number 2
menuentry "ArchLinux" {
 linux /boot/vmlinuz-linux root=/dev/sda1 rw audit=0
 initrd /boot/initramfs-linux.img
}

# Custom colors
set menu_color_normal=light-cyan/black
set menu_color_highlight=light-green/black
set color_normal=light-green/black

Один небольшой вопрос имеется. У меня пунктом 2 загружается IceArch. Можно-ли каким-то образом его идентифицировать в меню GRUB, не, как "ArchLinux", а по его истинному названию?
wau
ЧЯДНТ?
пробелы после loop
wau
set isofile=/boot/arch.iso
loopback loop (hd0,3)$isofile
не найден файл /arch/boot/x86_64/archiso.img.

проверить что не ошиблись с диском hd0,3 и что исошка на нем в /boot и с названием arch.iso

проверить что загрузили модуль для файловой системы и разметки диска на котором исошка

проверить что в исошке есть /arch/boot/x86_64/archiso.img

ну и вики пример
https://wiki.archlinux.org/index.php/GRUB_(Русский)#Arch_Linux_ISO
Holden
У меня пунктом 2 загружается IceArch. Можно-ли каким-то образом его идентифицировать в меню GRUB, не, как "ArchLinux", а по его истинному названию?

Ну так пишите вместо "ArchLinux" нужное название
"другой линукс"

Holden
/dev/sda1
Лучше так не делать , это не постоянное название диска и оно может измениться, используйте uuid или label
К чему может подобное привести
https://archlinux.org.ru/forum/topic/20368/
 
Зарегистрироваться или войдите чтобы оставить сообщение.