autosfs конфиг GRUB2

Скачать
Выполняет поиск файлов с расширением sfs в каталоге /bootsfs
При наличии файла /boot/loopsfs.cfg передает в него управление.
По сути это тот же autoiso.

Предыстория.
Как-то зацепился за мысль, что распространение сборок Linux в формате iso образов избыточно на данный момент и только добавляет проблем.
iso-хи были актуальны во времена оптических дисков и со временем адаптировались для работы на флешках.
Копируя образ на флешку (dd if of), мы получаем аналог CD/DVD, теряя всю информацию на носителе.
Позже появились костыли для загрузки iso из файловой системы. autoiso тому пример.

Идея.
Избавиться от лишнего слоя.
На всех iso с linux имеется файл с корневой файловой системой сжатой squashfs.
Почему бы не распространять сборки сразу в sfs, избавляясь от лишней работы с загрузчиком, перепаковки в iso и немного выигрывая в размере?

Все это можно было реализовать прямо в autoiso. Но решил разделить сущности.

Использование.
1. Рядом с вашим grub.cfg создаем каталог autosfs закидываем в него autosfs.cfg
2. Для запуска используем строку в ваше grub.cfg, исправляя путь до конфига на свой, если отличается.
submenu "autosfs" {
configfile /boot/grub/autosfs/autosfs.cfg
}
3. На любом разделе создаем каталог /bootsfs
4. Кладем в него squashfs образ с операционкой. Обязательно с расширением sfs
5. Пользуемся

Тестовый образ: rx-20-06-06-1 .sfs Логин/пароль: user/123 root/321
Сегодняшний Арч с крысой, лисой, софтом для работы с диском и всем что в голову пришло.

2020.06.07
loopsfs.cfg
Конфиг применяется в качестве метки того, что sfs контейнер является загрузочным.
При передаче управления в него передаются две переменные для корректного обнаружения системой sfs контейнера:
$sfs_dev - хранит номер диска,раздела в формате GRUB (hd1,gpt5)
$sfs_path - путь до контейнера (/bootsfs/rx-20-06-06-1.sfs)
Переменная $root настраивается на корень текущего контейнера.
Пример loopsfs.cfg из тестового образа.
menuentry "Arch sfs" {
probe -s root_uuid -u $sfs_dev                   #Определяем UUID раздела $sfs_dev
regexp -s sfs_name '^.*/(.*)$' "$sfs_path"       #Разбиваем переменную $sfs_path на имя образа
regexp -s sfs_dir '^/(.*)/.*$' "$sfs_path"       #и путь до него.

linux /boot/vmlinuz-linux \                      #Грузим ядро
root=live:/dev/disk/by-uuid/$root_uuid \         #из раздела $sfs_dev
rd.live.dir=$sfs_dir \                           #корректного каталога
rd.live.squashimg=$sfs_name \                    #и с правильным именем
rd.live.image                                    #Про параметры dracut отдельно.

initrd \
/boot/amd-ucode.img \                            #Переменная $root
/boot/intel-ucode.img \                          #установлена
/boot/initramfs-linux.img                        #в корне sfs
}

dracut
В тестовом образе решил отказаться от mkinitcio в пользу dracut.
Не буду сейчас углубляться в причины этого. Мне просто так проще было.

Dracut настроен в соответствии со статьей в Вики для автоматического обновления initram образа.
/usr/local/bin/dracut-install.sh приведен к следующему виду
#!/usr/bin/env bash

while read -r line; do
	if [[ "$line" == 'usr/lib/modules/'+([^/])'/pkgbase' ]]; then
		read -r pkgbase < "/${line}"
		kver="${line#'usr/lib/modules/'}"
		kver="${kver%'/pkgbase'}"

		install -Dm0644 "/${line%'/pkgbase'}/vmlinuz" "/boot/vmlinuz-${pkgbase}"
		dracut -N --no-compress --add "dmsquash-live dmsquash-live-ntfs" --kver "$kver" -f "/boot/initramfs-${pkgbase}.img" --no-early-microcode --nofscks --printsize -o "kernel-network-modules kernel-modules-extra i18n qemu qemu-net"
	fi
done
За загрузку из sfs образа отвечает модуль dmsquash-live.
Модуль dmsquash-live-ntfs добавляет поддержку загрузки из ntfs разделов. Но сам пока не тестировал.
Остальное - мелкие оптимизации.

Основные параметры ядра.
root - указывает не на корень в привычном смысле, а на раздел в котором необходимо искать файл.
rd.live.dir - каталог в котором находится файл-контейнер.
rd.live.squashimg - имя файла.
rd.live.image - указатель для происка корневой фс в файле.
rd.live.ram=1 - загрузка контейнера в оперативную память.

Не все идеально конечно в этом модуле. Но, если вдруг захочу перейти на использование sfs в качестве основной системы, все равно буду писать свой модуль для выполнения специфических задач.
Lupus pilum mutat, non mentem.
Установил во временный корень базовую систему, сжал в sfs. Далее по стартовому посту:
# ls /boot/grub/{grub.cfg,autosfs/}
/boot/grub/grub.cfg

/boot/grub/autosfs/:
autosfs.cfg
/boot/grub/grub.cfg
-----
submenu "autosfs" {
configfile "${config_directory}"/autosfs/autosfs.cfg
}
# lsblk /dev/sda2
NAME MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda2   8:2    0 272,1G  0 part /home
# ls /home/bootsfs/
arch_prob.sfs
Перезагружаюсь, выбраю autosfs. Меню граба на секунду пропадает, появляется вновь и всё.

Беру sfs из рабочего archiso:
# ls /home/bootsfs/
airootfs.sfs
Результат тот же.

Беру "пример образа":
# ls /home/bootsfs/
rx-20-04-26-1.sfs
Без изменений.

Переношу в корень с системой:
# lsblk /dev/sda1
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda1   8:1    0  10G  0 part /
# ls /bootsfs/
rx-20-04-26-1.sfs
Точно так же.
ЧЯДНТ?
Образ должен содержать внутри файл айл /boot/loopsfs.cfg
Аналог loopback.cfg
Вечером распишу подробности про него.
В моем образе он есть.
Так же инит должен уметь грузиться из sfs. Нужно либо использовать хуки archiso, либо я использую в пример dracut с его модулями. Тоже распишу подробно.

В данном случае возможно имеют место проблемы с переменной config_directory
Попробуй прописать полный путь для конфига.

Если нет,будем думать
Lupus pilum mutat, non mentem.
И граб пока не работает с zstd сжатием в sfs.
Пока использую xz
Lupus pilum mutat, non mentem.
Aivar
Установил во временный корень базовую систему, сжал в sfs. Далее по стартовому посту:

/boot/grub/grub.cfg
-----
submenu "autosfs" {
configfile "${config_directory}"/autosfs/autosfs.cfg
}

ЧЯДНТ?

Тоже самое .

Исправил на :
submenu "autosfs" {
configfile /boot/grub/autosfs/autosfs.cfg
Aivar
/boot/grub/grub.cfg
—–
submenu "autosfs" {
configfile "${config_directory}"/autosfs/autosfs.cfg
}
Если /autosfs/autosfs.cfg создавался /boot/grug то здесь ошибка.
submenu "autosfs" {
configfile "${config_directory}"/boot/grub/autosfs/autosfs.cfg
jim945
Попробуй прописать полный путь для конфига.
Так процесс пошел, даже крыса стартанула.
Пока думаю что делать дальше.

jim945
Копируя образ на флешку (dd if of), мы получаем аналог CD/DVD, теряя всю информацию на носителе.
Зачем так категорично? У мну флешка с грабом и двумя разделами: exfat и f2fs, на котором несколько исошек. И волки сыты и овцы целки.

jim945
Выполняет поиск файлов с расширением sfs в каталоге /bootsfs
Я так понял, если sfs-файлов несколько, то в меню отобразятся все. Правильно?
Aivar
Я так понял, если sfs-файлов несколько, то в меню отобразятся все. Правильно?
Да. При условии, что в них есть /boot/loopsfs.cfg
Aivar
Так процесс пошел, даже крыса стартанула.
Пока думаю что делать дальше.
Это просто тестовый образ с чистым арчем.
Из отличий: Dracut в качестве инита, плюс минимально подстроил оформление в крысе.

Работает до перезагрузки.
Но в образе есть набросок скрипта для пересборки.
Можете пользоваться системой. Обновлять, настраивать, удалять, устанавливать что-то. Короче как обычно.
Для пересборки образа запускаете команду.
repackrootsfs ИМЯ
Где ИМЯ - название нового файла образа без расширения (.sfs добавится автоматически).
Новый файл будет сохранен рядом с текущим запущенным в вашем /bootsfs.
Главное чтобы ИМЯ отличалось от существующих. Иначе они перезапишутся без вопросов.
Lupus pilum mutat, non mentem.
Slav164
Если /autosfs/autosfs.cfg создавался /boot/grug то здесь ошибка.
submenu "autosfs" {
configfile "${config_directory}"/boot/grub/autosfs/autosfs.cfg
Исправил.

Да. Проблема с переменной ${config_directory}. Она хранит путь до каталога из которого запущен конфиг.
Мне нравится ей пользоваться. Но блин. Не у всех и не всегда она корректно работает.
Lupus pilum mutat, non mentem.
Оформлю все тонкости в стартовом посте. Нужно только время выделить, а не на бегу.
Постараюсь хотя бы частями расписывать.
Lupus pilum mutat, non mentem.
 
Зарегистрироваться или войдите чтобы оставить сообщение.