LINUX.ORG.RU

squashfs из iso loop

 


0

2

Собственно хочу понять как подхватывать вторичную фс при загрузке из iso, в качестве примера взят mageia2:

grub.cfg такой:

menuentry "MageiaLive-2 x86_64-DVD.iso" {
## https://forum.mxlinux.org/viewtopic.php?p=343499&sid=8ead07b227700eb06d6b8eaae592b58d#p343499
	probe -s ruuid -u $root
	search --no-floppy --fs-uuid $ruuid --set=root
	set isofile='/isoimage/Mageia-2-LiveCD-GNOME-x86_64-CD.iso'
	loopback loop0 $isofile
	probe -s isolabel -l loop0
	probe -s isouuid -u loop0
	linux (loop0)/boot/vmlinuz root=mgalive:LABEL=ISOIMAGE ro isofrom=$ruuid:$isofile looptype=squashfs loop=/loopbacks/distrib-lzma.sqfs lang=ru rd.luks=0 rd.lvm=0 rd.md=0 rd.dm=0          
	initrd (loop0)/boot/cdrom/initrd.gz 

Где ISOIMAGE это метка тома ISO по умолчанию от grub2-mkrescue -o ../grub.iso .

Собственно, загрузчик этой конфигурацией подхватывается, но вылетает при попытке загрузиться с loopbacks/distrib-lzma.sqfs:

SQUASHFS error: squashfs_read_data failed to read block 0x0
SQUASHFS error: unable to read squashfs_super_block
mount /dev/loop0: can't read superblock
dracut Warning: /sysroot has no proper rootfs layout, ignoring and removing offending mount hook

dracut Warning: Can't mount root filesystem
losetup: failed to setup loop device: No such file or directory
mount /dev/loop0: can't read superblock
dracut Warning: /sysroot has no proper rootfs layout, ignoring and removing offending mount hook

Что тут можно сделать ? Очень желательны и другие примеры :)

Многие пробовал, но Магейа не приходилось. Почему в качестве примера взял столь древнюю версию.

Очень желательны и другие примеры

Тут есть пара примеров. Только не вникал, рабочие или нет.

Попробую прокомментировать твой пример.

Первые две строки вообще не понятно зачем.

set isofile='/isoimage/Mageia-2-LiveCD-GNOME-x86_64-CD.iso'

Откуда взялась переменная isofile. Обычно использую iso_path. Уже точно не помню, но кажется это внутренняя переменная груб. Если изменить имя, то возникают ошибки.

Следующая строка должна быть:

export iso_path

loopback loop0 $isofile

После этой строки:

root=(loop)

Чтобы доалее уже не писать loop. Все имена начинаются с «/», например, «linux /boot/vmlinuz». Далее, две строки с «probe» тоже непонятно что делают.

Хотя, судя по приведенной ошибке, он вроде как находит скваш, но не может его использовать, якобы из-за ошибок. Проверить, исо-образ случайно не битый.

andytux ()
Ответ на: комментарий от andytux

Почему в качестве примера взял столь древнюю версию.

Чтобы тупо не копировать чужие находки, но и, с другой стороны, совсем уж не остаться с совсем уж неизвестной материей.

Первые две строки вообще не понятно зачем.

Да, без search можно было в данном контексте обойтись, но и навредить, насколько я понимаю, не может

export iso_path

Теперь я уже не понял назначение этой команды...

Проверить, исо-образ случайно не битый.

Нет, файл исправный: md5 в порядке, в qemu работает нормально... Да если бы дело было только в этой древности... Я решительно не понимаю механику того как подхватывать образ внутри loop... И, в частности, непонятно где брать опции загрузки ядра различающиеся от дистрибутива к дистрибутиву, и я не имею всякие там lang, vga, splash и.т.п, я имею ввиду именно опции на продолжение загрузки дистрибутива из файловых систем типа squashfs, спрятанных внутри iso-образа.

P.S: Спасибо за отзыв, хорошего вам вечера

dymdin ()
Последнее исправление: dymdin (всего исправлений: 1)
Ответ на: комментарий от dymdin

не понимаю механику того как подхватывать образ внутри loop

Сам дистрибутив должен уметь загружаться из исо-образа. Собственно груб загружает только ядро и инитрд. Дальше уже скрипты из инитрд должны искать исо-образ. В разных дистрибутивах они действуют по разному. Для облегчения этого процесса придумали технологию loopback-bootable. Суть ее в том, что в файле loopback.cfg находится конфиг, для загрузки именно из исо-образа. Собственно груб запускается с конфигом loopback.cfg Иногда это просто символическая ссылка на grub.cfg. Посмотрел образ версии 7 - до loopback-bootable Mageia еще не доросла. А умеет-ли она вообще грузиться из исо-образа. Пока нигде не попадался ответ на этот вопрос.

где брать опции загрузки ядра различающиеся от дистрибутива к дистрибутиву

Поискать в интернете. Недавно разбирался с antiX. Быстро все нашлось и заработало. На магею пока не находится. Второй вариант. Распотрошить инитрд и поискать в нем.

Это принципиально, загрузка из исо-образа. А например, загрузка «из набора файлов» получилась?

andytux ()
Последнее исправление: andytux (всего исправлений: 1)
Ответ на: комментарий от dymdin

В общем, ничего эта Mageia не могет.

Вот что нашлось. Пока получилось только загрузить версию 7 из «набора файлов», находящихся на разделе с файловой системой ext4. Реально файлы находятся в каталоге /opt/mageia. Для имитиации, что они находятся в корне, в корне были созданы симлинки boot, isolinux, loopbacks, указывающие на соответствующие каталоги. Первое впечатление от системы - отвратительно. Грузилась минут десять. Обычно загрузка сервисов проскакивает, что не успеваешь прочитать. Здесь неспеша выползают строчки, успеваю прочитать раза три. Версия 6 не запстилась, с той же ошибкой, что у тебя.

andytux ()
Ответ на: комментарий от dymdin

Что нашлось в инитрд 5 версии:

getargbool 0 UEFI && liveuefi="yes"
if [ -n "$liveuefi" ]; then
    mount -n -t vfat -o ro $livedev /live/media
else
    mount -n -t iso9660 -o ro $realdev /live/media
fi

LOOPDEV=$( losetup -f )
losetup -r $LOOPDEV /live/media/loopbacks/distrib-lzma.sqfs
mount -n -t squashfs -o ro $LOOPDEV /live/distrib
mount -n -t squashfs -o ro $LOOPDEV /run/mgalive/ovlsize```
andytux ()
Ответ на: комментарий от dymdin

непонятно где брать опции загрузки ядра различающиеся от дистрибутива к дистрибутиву

Базово — нигде. Это не опции ядра, это опции для программ (в основном загрузочных скриптов), передающиеся через командную строку ядра и доступные через /proc/cmdline. Ядро игнорирует неизвестные опции, поэтому там может быть что угодно. Разработчики системы инициализации (initrd/initramfs скриптов) далеко не всегда документируют все возможности. Как уже написали, если очень хочется, изучайте что внутри initrd. Причём, может оказаться что в initrd использует какой-нибудь бинарник, для которого нет или не полная man-страница и нужно смотреть исходник...

mky ★★★★★ ()
Ответ на: комментарий от dymdin

Распаковал и просмотрел инитрд всех версий mageia.

О первой версии можно сказать только что она есть. Во второй появляется код «поиска живой сисстемы», но только на файловой системе iso9660. С третьей версии Магея может найти свою «живую систему» на файловой системе ФАТ. Но все имена файлов и каталогов жестко зашиты в скрипте. В практически неизменном состоянии доходит до шестой версии. Только в седьмой появляется возможность менять каталог. Но вроде бы нет никаких намеков на возможность загрузки из исо-файла.

andytux ()
Ответ на: комментарий от dymdin

Пример конфига груб2 для загрузки Mageia live.

  submenu 'Mageia live (login/pass: live/<empty>)' {
	iso_path='/opt/Mageia-7-Live-Xfce-i586.iso'
	src='/opt/mageia'; key="root=mgalive:LABEL=Mageia-7-Live rd.luks=0 rd.lvm=0 rd.md=0 rd.dm=0 vga=788 quiet --"
	#version=''
	#insmod regexp; insmod part_gpt
	root='x'; search -n -s -f "${iso_path}"
	if [ "${root}" = 'x' ]
	  then	search -n -s -f "${src}/boot/vmlinuz${version}"
		if [ "${root}" = 'x' ]
		  then	src='Mageia live'
		  else	if [ -z "${src}" ]
			  then	if [ -e "/boot/grub2/grub.cfg" ]; then avload='configfile'; src='/boot/grub2/grub.cfg'; else src='/isolinux'; avinit="syslinux_configfile ${src}/isolinux.cfg"; avload="syslinux_source ${src}/isolinux.bin"; fi
			  else	if regexp "Mageia-7" "${iso_path}"; then key="mgalive.basedir=${src} xdriver=free noiswmd audit=0 ${key}"; fi
				if regexp "Mageia-6" "${iso_path}"; then key="liveuefi=yes xdriver=free noiswmd audit=0 ${key}"; fi
				src="${src}/boot"
				if [ -e "${src}/initrd.img${version}" ]; then avinit="initrd ${src}/initrd.img${version}"; else avinit="initrd ${src}/cdrom/initrd.gz"; fi
				avload='linux'; src="${src}/vmlinuz${version} ${key}"
			fi
		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'
		  else	key="xdriver=free noiswmd audit=0 ${key}"; src='/boot'
			if [ -e "${src}/initrd.img${version}" ]; then avinit="initrd ${src}/initrd.img${version}"; else avinit="initrd ${src}/cdrom/initrd.gz"; 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
  }

Сначала ищет исо-образ. Если находит, то пытается загрузиться из него, но делать этого Магея не умеет. Если исо-образ не найден, то переходит на загруку «из набора файлов», расположение этого набора указывается в переменной src. Если файлы находятся в корне раздела, то переменную оставить пустой. В этом случае проверяется наличие grub.cfg (для версии 7), если не найден, то isolinux.cfg (для остальных версий), и выводится меню из этого конфига. Если src не пустая, то файлы ищутся в указанном в переменной каталоге и если найдены, то начнется загрузка (только версия 7). Параметры ядра будут взяты из переменной key.

andytux ()