"Только надо пользы для. Завлекать его не зля - Делать тонкие намёки. Невсурьёз и издаля."
Вижу, тема вызывает сумасшедший интерес.
Продолжаем разговор.
Вопрос действительно непростой. Поэтому, без "супер-мега-программ", все-равно никто пользоваться ими не умеет. Только монтирование, копирование, текстовый редактор.
Подготовка.
Диски:
ubuntu@ubuntu:~$ sudo fdisk -l
Disk /dev/sde: 477 GiB, 512110190592 bytes, 1000215216 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x066247b3
Device Boot Start End Sectors Size Id Type
/dev/sde1 2048 17956863 17954816 8.6G b W95 FAT32
/dev/sde2 17958912 67307519 49348608 23.5G 83 Linux
/dev/sde3 67307520 795418623 728111104 347.2G 83 Linux
/dev/sde4 795418624 1000214527 204795904 97.7G 5 Extended
/dev/sde5 795420672 1000214527 204793856 97.7G 83 Linux
Диск подключен всего один. Физически, это nvme, подключенный через усб-переходник. На данном компьютере сразу получает имя sde.
sde1 - файловая система FAT32, может выступать в роли ESP. На разделе sde1 установлены загрузчики: грубПС и грубЕФИ. Поэтому, можно грузиться на любом компьютере, в любом режиме. Загрузчики не привязаны ни к какой системе.
В файл grub.cfg добавляю код:
function avboot {
if [ "${msg}" = '0' ]; then msg=''; fi
if [ "${msg}" = '1' ]; then msg='Non EFI-mode!'; fi
if [ "${msg}" = '2' ]; then msg='Non CSM-mode!'; fi
if [ "${msg}" = '3' ]; then msg="Load $iso_path from $root"; fi
if [ "${root}" = 'x' ]; then if [ -z "${msg}" ]; then msg="$src not exist!"; fi; else if [ -z "${msg}" ]; then msg="Load $src from $root"; fi; fi
if [ -n "${1}" ]; then echo "$msg"; sleep -v ${1}; fi
if [ -n "${avload}" ]; then ${avload} ${src}; if [ -n "${avinit}" ]; then ${avinit}; fi; fi
}
color_normal=light-green/black; menu_color_normal=light-green/black; menu_color_highlight=light-green/blue
default='Search file|LABEL|UUID|DEV'; fallback='*buntu [so1202]'; timeout=2; timeout_style=menu
if [ -e '/boot/grub/x86_64-efi/tpm.mod' ]; then rmmod tpm; fi
if [ -e '/boot/grub/avnfont.pf2' ]
then if loadfont '/boot/grub/avnfont.pf2'
then set gfxmode=auto
insmod efi_gop; insmod efi_uga; insmod gfxterm
terminal_output gfxterm
fi
fi
submenu '*buntu live persistent' {
src='/opt'; key="showmounts boot=casper cdrom-detect/try-usb=true noprompt quiet --"
iso_path="${src}/ub.squashfs"
#iso_path="${src}/ubuntu-10.04.4-desktop-amd64.iso"
iso_path="${src}/lubuntu-18.04.5-desktop-amd64.iso"
#version='4'
#insmod regexp; insmod part_gpt
root='x'; search --no-floppy --set --file "${iso_path}"
if [ "${root}" = 'x' ]
then if regexp "u-18" "${iso_path}"; then src="${src}/ub18"; fi
if regexp "u-16" "${iso_path}"; then src="${src}/ub16"; fi
if regexp "u-10" "${iso_path}"; then src="${src}/ub10"; fi
search --no-floppy --set --file "${src}/casper/vmlinuz${version}"
if [ "${root}" = 'x' ]
then src='*buntu live'
else if regexp "buntu-2" "${iso_path}"
then if [ -e "${src}/writable" ]; then key="persistent persistent-path=${src} ${key}"; fi
else if [ -e "${src}/casper-rw" ]; then key="persistent persistent-path=${src} ${key}"; fi
fi
src="${src}/casper"; key="ignore_uuid live-media-path=${src} ${key}"
if regexp "u-2" "${iso_path}"; then key="--version=02pm1dc1 ${key}"; fi
if regexp "u-18" "${iso_path}"; then key="--version=02lx3pm1dc1 ${key}"; fi
if regexp "u-16" "${iso_path}"; then key="--version=02pm1dc1 ${key}"; fi
if regexp "u-10" "${iso_path}"; then key="--version=02gn1pm1gc1 i915.modeset=1 ${key}"; fi
if [ -e "${src}/initrd${version}" ]; then avinit="initrd ${src}/initrd${version}"; else avinit="initrd ${src}/initrd.lz"; fi
avload='linux'; src="${src}/vmlinuz${version} ${key}"
fi
else msg="Load $iso_path from $root"
export iso_path; loopback loop ${iso_path}
root=(loop)
if [ -e "/boot/grub/loopback.cfg" ]
then avload='configfile'; src='/boot/grub/loopback.cfg'
# loopback --delete loop
else if regexp ".iso" "${iso_path}"
then key="iso-scan/filename=${iso_path} ${key}"; src='/casper'
else key="ignore_uuid live-media-path=${src} ${key}"; src="${src}/casper"
fi
if regexp "u[bk-mx]" "${iso_path}"; then key="--version=02pm1 ${key}"; fi
if regexp "u-2" "${iso_path}"; then key="--version=02xf1pm1 ${key}"; fi
if regexp "u-10" "${iso_path}"; then key="i915.modeset=1 elevator=noop ${key}"; fi
if [ -e "${src}/initrd${version}" ]; then avinit="initrd ${src}/initrd${version}"; else avinit="initrd ${src}/initrd.lz"; fi
avload='linux'; src="${src}/vmlinuz${version} ${key}"
fi
fi
# if [ "${root}" = 'x' ]; then msg="$src not exist!"; else if [ -z "${msg}" ]; then msg="Load $src from $root"; fi; fi
# echo "$msg"; sleep -v 4
# if [ -n "${avload}" ]; then ${avload} ${src}; if [ -n "${avinit}" ]; then ${avinit}; fi; fi
avboot 2
}
Часть кода до строки "submenu..." только для удобства, можно без неё.
На раздел sde1 копирую исо-образ lubuntu-18.04.5-desktop-amd64.iso. Пробую загрузиться.

На скриншоте. Lubuntu, загруженная из исо-образа. В системе ещё ничего нет. Отсутствие русского языка мешает продолжению описания из неё.
Слева окно MC. Ещё один способ, использовать то, чего в системе нет. Он находится на разделе sde3, который смонтирован и из него запущен MC.
Описание.
iso_path="${src}/lubuntu-18.04.5-desktop-amd64.iso"
...
root='x'; search --no-floppy --set --file "${iso_path}"
Загрузчик ищет указанный образ. Образ может быть на любом диске-разделе. Если нашёл, то...
else msg="Load $iso_path from $root"
export iso_path; loopback loop ${iso_path}
root=(loop)
if [ -e "/boot/grub/loopback.cfg" ]
then avload='configfile'; src='/boot/grub/loopback.cfg'
...монтирует образ и проверяет наличие в нём файла "loopback.cfg". Если файл существует, то выводит меню, реализованное в этом файле (техника loopback-bootable, для упрощения загрузки из исо-образа).
Пользователь добавил сообщение 23 Августа 2024, 11:23:37:
Загрузка ubuntu 10.04.4 persistent.
Немного изменяю пункт меню:
...
iso_path="buntu-10.04.4-desktop-amd64.iso"
#iso_path="${src}/lubuntu-18.04.5-desktop-amd64.iso"
version='4'
root='x'; search --no-floppy --set --file "${iso_path}"
if [ "${root}" = 'x' ]
then if regexp "u-18" "${iso_path}"; then src="${src}/ub18"; fi
if regexp "u-10" "${iso_path}"; then src="${src}/ub11"; fi
...
Описание. Если не найдёт исо-образ (не найдёт, потому что такого в принципе не существует), то пробует загрузиться "из набора файлов".
Имя образа используется для указания, где искать "набор файлов". В данном случае, в "/opt/ub11", на любом диске-разделе.
Если больше нравится, то можно создать отдельный пункт меню.
На разделе sde1 создаю каталог /opt/ub11/casper, для "набора файлов ubuntu 10.04".
Из исо-образа 10.04 копирую в этот каталог ядро и инитрд. Я знаю, что на данной железке 10.04 не загрузится. Поэтому, из исо-образа 16.04.7 копирую сюда ядро и инитрд версии 4.15.*, под именами vmlinuz4, initrd4 соответственно. Из исо-образа 10.04, распаковываю куда-нибудь файл filesystem.squashfs (у меня он давно распакован на раздел sde3, в каталог /opt/ub10/casper/ub10.dir). Добавляю туда модули для ядра 4.15.112-generic из исо-образа 16.04.7.



Создаю файл *.squashfs, с изменениями (способ внести и сохранить изменения). Создаю файл casper-rw (в режиме persistent в нём сохраняются все изменения). Пункт "user menu" построен так, что если указатель стоит на "casper", то создаётся casper-rw, в остальных случаях создаётся swap-файл.

На скриншоте. В окне MC, только что созданный файл casper-rw, В нём будут сохраняться все изменения в "ubuntu 10.04 live persistent". Перезагружаюсь.
Описание задействованного кода конфига груба.
root='x'; search --no-floppy --set --file "${iso_path}"
if [ "${root}" = 'x' ]
then if regexp "u-18" "${iso_path}"; then src="${src}/ub18"; fi
if regexp "u-16" "${iso_path}"; then src="${src}/ub16"; fi
if regexp "u-10" "${iso_path}"; then src="${src}/ub10"; fi
Если не нашел образ, то переходит к поиску "набора файлов". Для некоторых версий, каталог поиска задаётся в зависимости от имени исо-образа.
search --no-floppy --set --file "${src}/casper/vmlinuz${version}"
if [ "${root}" = 'x' ]
Если находит заданное название ядра то...
else if regexp "buntu-2" "${iso_path}"
then if [ -e "${src}/writable" ]; then key="persistent persistent-path=${src} ${key}"; fi
else if [ -e "${src}/casper-rw" ]; then key="persistent persistent-path=${src} ${key}"; fi
fi
...проверяет наличие персистент-файла, если файл существует, то добавляет параметры ядра, для загрузки в режиме "persistent".

На скриншоте. Загружена ubuntu 10.04 (справа вверху, окно "System Monitor"). Скажу больше. Это система "франкенштейн". Сама система 32битная, ядро 64битное.
Слева вверху. Окно MC, в данном случае, это последняя 32битная версия MC, эта версия в принципе не может быть установлена на 10.04. Как и в предыдущем случае с 18.04, она "вне системы", находится на раздела sde3.
Окно справа внизу. Видно, что система запущена с параметрами "persistent persistent-path=...". По строке "/dev/loop0..." видно, что в каталог /cow смонтирована файловая система ext2, это и есть файл casper-rw.
Слева вверху. Правая панель MC. Каталог /cow/uper - это то самое место, куда записываются все изменения, видно, что уже записалось.
Как уже говорил, "persistent" действует со времён царя гороха. И для этого не нужны сверхмудрые программы. Файл и параметр ядра - это всё.
Ранее уже говорил, что система находит файл casper-rw только на разделе FAT32. Отсюда ограничение на максимальный размер файла. Поэтому всё поместил на раздел sde1 (польза от ESP размером 8гб).