LINUX.ORG.RU

Мултизагрузочная флешка с Damn Small Linux

 ,


0

1

Хочу сделать мультизагрузочноную флешку с Damn Small Linux,

grub.cfg такой

## Damn Small Linux Live ISO config & config KNOPPIX
menuentry "Damn Small Linux 4.11rc1 Live ISO" {
    insmod part_msdos
    insmod ntfs
    set iso="/iso/dsl-4.4.10.iso"
    loopback loop $iso
    probe -s isolabel -l loop
    linux (loop)/boot/isolinux/linux24 isofrom=$iso root=live:LABEL="KNOPPIX" ramdisk_size=100000 init=/etc/init lang=us apm=power-off vga=791 nomce noapic quiet BOOT_IMAGE=knoppix
    initrd (loop)/boot/isolinux/minirt24.gz
}

В итоге: на экране «два пингвина», и «Cannot find KNOPPIX filesystem». В порыве отчаяния решил скачать другой образ: dsl-4.11.rc2-syslinux.iso и скормить такую ересь:

menuentry "DSL chainloader" {
    insmod part_msdos
    insmod ntfs
    set iso="/iso/dsl-4.11.rc2-syslinux.iso"
    loopback loop $iso
    chainloader (loop)+1
}
Загрузка даже не начинается. :( Что делать ?

В итоге: на экране «два пингвина», и «Cannot find KNOPPIX filesystem».

логично, ядро не видит ntfs (флешка в ntfs, что ли). а вообще, его инитрд умеет из iso-файла корень искать

Загрузка даже не начинается. :(

логично

Что делать ?

положить cloop-файл в корень на ext2

buratino ★★★★★ ()

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

Как готовил флешку? // (обычно iso «прошивается» на флешку или распаковывается на неё)

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

Крупные дистрибутивы, как минимум, fedora, ubuntu, archlinux проблем не вызвают, вызывают проблемы «маленькие» типа TinyCore или Puppy и с isolinux.

Сейчас пытаюсь chainloader образа с syslinux. Гугл нашёл вот этот пост на linuxquestions.org. Автор предлагает скопировать syslinux.boot во внешний файл, но, как всегда, опытные линуксятники умалчивают о подробностях: как загрузить syslinux.boot с файла, и загрузить данные из loop ? Попросту говоря, видимо, не рабочий конфиг, но логика понятна:

loopback loop $isofile
set root=(loop)
chainloader=(cd)/boot/syslinux.boot

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

Периодически вспоминаю о DSL. Вот сейчас твоя тема напомнила. Из образа грузиться пока не получилось. Только из «набора файлов».

menuentry 'Damn Small Linux 4.11 live' {
	src='/opt/dsl411'
	key="root=hda1 knoppix_dir=$src/KNOPPIX init=/etc/init ramdisk_size=100000 dma lang=us apm=power-off nodhcp nomce noapic nopcmci noagp noswap quiet --"
	insmod	fat
	insmod	linux16
	insmod	gzio
	search	-f ${src}/boot/isolinux/linux24 -n -s
	linux16	${src}/boot/isolinux/linux24 ${key}
	initrd16 ${src}/boot/isolinux/minirt24.gz
  }

Содержимое образа копирую в каталог, указанный в переменной src. «Двух пингвинов» нет, но грузится с флешки, отформатированной в FAT32. С раздела ext4 не получилось.

andytux ()

вообще, его инитрд умеет из iso-файла корень искать

Хороший вопрос. В интернете нашел, что помогает пареметр ядра «bootfrom=/dev/sda1/opt/dsl-4.11.rc2.iso». Попробовал - неудачно. В minirt24.gz нашел код:

boot_from()
{
...
  SOURCE_DEV=$(echo $CMDLINE | /usr/bin/tr ' ' '\n' | /bin/sed -n '/bootfrom=/s/.*=//p' | /usr/bin/tail -1)
  
  LOOP_DEV=$(echo $SOURCE_DEV | /usr/bin/gawk -F/ '{ print $1 "/" $2 "/" $3 }')
  ISO_PATH=$(echo $SOURCE_DEV | /bin/sed "s|$LOOP_DEV||g" )
  case "$ISO_PATH" in /*.[iI][sS][oO]) ;; *) ISO_PATH="" ;; esac
...

Честно говоря, первый раз вижу, чтобы оператор case писали в одну строку. Код для груб сейчас выглядит так:

  submenu 'Damn small linux  live' {
	iso_path='/opt/dsl-4.11.rc2.iso'
	iso_path='/opt/dsl-n-01RC4.iso'
	src='/opt/dsl'
	key="bootfrom=/dev/sda1${iso_path} init=/etc/init ramdisk_size=100000 dma lang=us apm=power-off nodhcp nomce noapic nopcmci noagp noswap quiet --"
	#insmod regexp; insmod part_gpt
	insmod	fat
	insmod	linux16
	insmod	gzio
	root='x'; search -n -s -f "${iso_path}"
	if [ "${root}" = 'x' ]
	  then	search -n -s -f "${src}/KNOPPIX/KNOPPIX"
		if [ "${root}" = 'x' ]
		  then	src='DSL'
		  else	if regexp "dsl-n" "${iso_path}"; then key="knoppix_dir=${src}/KNOPPIX ${key}"; src="${src}/isolinux"; fi
			if regexp "dsl-4" "${iso_path}"; then key="knoppix_dir=${src}/KNOPPIX ${key}"; src="${src}/boot/isolinux"; fi
			if [ -e "${src}/isolinux.cfg" ]
			  then	avinit="syslinux_configfile ${src}/isolinux.cfg"
				avload="syslinux_source ${src}/isolinux.bin"
			  else	if [ -e "${src}/minirt.gz" ]; then avinit="initrd16 ${src}/minirt.gz"; else avinit="initrd16 ${src}/minirt24.gz"; fi
				if [ -e "${src}/linux" ]; then src="${src}/linux ${key}"; else src="${src}/linux24 ${key}"; fi
				avload='linux16'
			fi
		fi
	  else	msg="Load $iso_path from $root"
		if [ -e "/boot/syslinux/memdiskk" ]
		  then	key='memdisk'
			if regexp "dsl-n" "${iso_path}"; then key="${key} vmalloc=98M"; fi
			avload='linux16'; avinit="initrd16 ${iso_path}"; src="/boot/syslinux/${key} iso raw"
		  else	export iso_path; loopback loop ${iso_path}
			root=(loop)
			if [ -e "/boot/grub/loopback.cfg" ]
			  then	avload='configfile'; src='/boot/grub/loopback.cfg'
			  else	if regexp "dsl-n" "${iso_path}"; then key="${key}"; src='/isolinux'; fi
				if regexp "dsl-4" "${iso_path}"; then key="${key}"; src='/boot/isolinux'; fi
				if [ -e "${src}/isolinux.cf" ]
				  then	avinit="syslinux_configfile ${src}/isolinux.cfg"
					avload="syslinux_source ${src}/isolinux.bin"
				  else	if [ -e "${src}/minirt.gz" ]; then avinit="initrd16 ${src}/minirt.gz"; else avinit="initrd16 ${src}/minirt24.gz"; fi
					if [ -e "${src}/linux" ]; then src="${src}/linux ${key}"; else src="${src}/linux24 ${key}"; fi
					avload='linux16'
				fi
			fi
		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
  }

В таком виде, начнется загрузка из образа /opt/dsl-n-01RC4.iso. Образ на флешке. Флешка определятся как sda1, поэтому: "key=«bootfrom=/dev/sda1${iso_path}» Пробовал и другие устройства - неудачно. Честно говоря, «правильное место» для этого параметра:

  else	if regexp "dsl-n" "${iso_path}"; then key="bootfrom=/dev/sda1${iso_path} ${key}"; src='/isolinux'; fi
	if regexp "dsl-4" "${iso_path}"; then key="bootfrom=/dev/sda1${iso_path} ${key}"; src='/boot/isolinux'; fi

В начале он временно, для упрощения отладки. Ошибка в следующей строке тоже для отладки. Если написать:

if [ -e "${src}/isolinux.cfg" ]
  then	avinit="syslinux_configfile ${src}/isolinux.cfg"

то для загрузки будет использован конфиг загрузчика isolinux. Этот вариант тоже не работает. Ошибка или несовместимость в файле isolinux.cfg. После первой строки «DEFAULT linux24», нужно вставить строку «LABAL linux». Появится еще один пункт меню, хоть и не рабочий. Зато начнет работать остальное меню. Еще одна «отладочная ошибка». Если приавильно указать путь к загрузчику memdisk:

if [ -e "/boot/syslinux/memdisk" ]
  then	key='memdisk'

то начтется загрузка с использование загрузчика memdisk. Появятся «два пингвина», но образ KNOPPIX не будет найден. Можно сделать видимость загрузки из исо-образа. В корень раздела FAT32 скопировать из исо-образа каталог KNOPPIX. DSL запустится. Если исо-образ не найден, то DSL будет грузиться из «набора файлов». В переменной src указывается катаолг, в который нужно скопировать содержимое исо-образа. В данном случае тоже есть вариант с использованием isolinux. Для его работы нужно скопировать содержимое исо-образа в корень раздела и исправить ошибку в файле isolinux.cfg

andytux ()

grub2 очень плохо поддерживает загрузку из iso, зачем идти этим путем. если уж хочется из iso, то grub4dos стартовать и его использовать

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

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

если уж хочется из iso, то grub4dos стартовать и его использовать

Приведи рабочий вариант запуска DSL из исо-образа с помошью grub2dos.

Распаковывайте на флешку в каталог и грузитесь.

По этому варианту нет вопросов, работает.

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

Беда в том, что grub4dos не ставится ни на usb ни на dvd средствами линукса, нужен оффтопный софт. Если кто-то знает как ставить grub4dos исключительно линуксовскими средствами, большая просьба сообщить как это сделать…

А что насчёт syslinux ? Как можно сделать флешку/dvd мультизагрузочными с помощью syslinux ?

UPD: В общем, с сабжевой темой ничего не удалось понять, вот пытаюсь запустить с iso другую ос - endlessos, с тем же резульатом: на образе стоит grub2 но chainloader тоже не срабатывает: GRUB Floppy Error на такой конфиг:

menuentry "endless 3.7 amd64" {
    insmod part_msdos
    insmod ntfs
    set isofile="/isoimage/eos-eos3.7-amd64-amd64.200310-013107.base.iso"
    loopback loop $isofile
    chainloader (loop)+1  }

И нафига они (разработчики груба) сделали chainloader если все равно никуда ничего не передаёт управление ?

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

сабжевой темой ничего не удалось понять

С DSL более-менее понятно. Груб делает свое дело, запускает ядро. Дальше уже все зависит только от способностей ядра. А ядро DSL, например, не понимает ext4. NTFS вроде тоже как-то частично. Следовательно на этих разделах он впринципе ничего не найдет. Остается только FAT. С устойствами сложности. Что-то он обзывает как hda, что-то sda. Сведения взяты из скриптов инитрд. Пытался разобраться, но пока безуспешно.

andytux ()
Ответ на: комментарий от irton
grub2 очень плохо поддерживает загрузку из iso, зачем идти этим путем. если уж хочется из iso, то grub4dos стартовать и его использовать

Даже если и в grub4dos, то как ? Посмотрел на grub4dos вблизи, даже понравилось. grub4dos имеет кучу очень специальных возможностей, подразумеващих глубокие знания об устройстве образа диска (и где только их исследуют ?) но на моём ламерском уровне loopback второго груба не сильно отличается от маппинга в grub4dos.

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

Проблема в том, что распаковывая dsl.iso на флешке образуются три важных для загрузки файла $isofile/KNOPPIX/{KNOPPIX,boot.img,boot.cat} , и если с двумя последними всё понятно, то на KNOPPIX тот же grub4dos ругается (уже не в маппе):

Error 13:(http://grub4dos.chenall.net/e/13)
         Invalid or unsupported executable format

Примонтировать в loop этот файлик тоже не получается

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

файл knoppix для загрузчика не требуется, он нужен для initrd. knoppix это наверное уже сама система запакованная в squashfs

сотни человеков на greenflash.su делают всякие извраты с grub4dos, но для вас там примера не нашлось. мистика.

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

распаковывая dsl.iso на флешке образуются три важных для загрузки файла $isofile/KNOPPIX/{KNOPPIX,boot.img,boot.cat}

Ни один из этих файлов загрузчику не нужен. Загрузчику нужны только /boot/isolinux/{linux24,minirt24.gz}. С этим никаких проблем. Груб их находит и запускает, хоть из образа, хоть из каталога. Найти все остальное это уже задача ядра, конкретнее, скриптов запуска, расположенных в инитрд. Единственно, чем можно помочь, передать параметры ядра, облегчающие поиск других компонентов системы. И с этим DSL справляется, но в рамках тех технологий, что были известны на момент создания этого дистрибутива. Не забывай, там ядро еще только 2.4. Файловой системы ext4 в то время не существовало, поэтому DSL в принципе не умеет с ней работать.

knoppix это наверное уже сама система запакованная в squashfs

Да. Но не squashfs. Это какой-то свой формат (cloop). Если заглянуть в него, то в самом начале видно команду монтирования как для файловой системы iso9660.

PS. Куда более «крутая и современная» Mageia до сих пор не умеет грузиться из исо-образа.

andytux ()