LINUX.ORG.RU
ФорумAdmin

Запуск системы из squashfs-образа


0

0

Добрый день!

Встала передо мной такая задача - запустить систему из squashfs-образа, расположенного на монтируемом по сети ресурсе. Squashfs-образ взят от LiveCD Fedora 9, образ большой, и загружать по PXE целиком в память не годится.

Подскажите, как правильно это сделать?


именно через PXE. Только не сразу образ, а сначала загрузчик, потом уже ядро+образ.

P.S. pxe-загрузчик находится в пакете syslinux

Slavaz ★★★★★
()

>>"на монтируемом по сети ресурсе"

Как монтируемом?

Зачем нужно делать именно так?

Не проще корень на nfs?

Если этот вариант критичен, делать ядро, к нему рамдиск, с них грузиться и монтировать образ, запуская после этого всё остальное.

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

Не, NFS не годится. Нужно добиться, чтобы образ подгружался по FTP или по HTTP.

Всё это нужно для того, чтобы загружать произвольный большой LiveCD/LiveDVD по сети при условии того, что полностью образ LiveCD/LiveDVD в память не помещаются.

Я посмотрел, как это делается при загрузке с LiveCD. Делается это так: загружается initrd, который находится на компакт-диске, далее этот initrd монтирует squashfs-образ в rw-режиме при помощи devmapper, после чего в нужные места монтруется proc, dev и sys. Далее делается chroot в примонтрованную squashfs и оттуда запускается /sbin/init.

Пораскинув мозгами, я решил, что для того, чтобы squashfs-образ загружать по сети вместо загрузки с диска, нужно иметь в initrd средства для инициализации сети и для монтирования сетевого ресурса. После этого всю загрузку можно производить в том же режиме, что и при загрузке с LiveCD. Для того, чтобы инициализировать сеть, в initrd нужно напихать модули ядра и обеспечить загрузку правильного модуля, что пока для меня неясно - стоит ли так делать и как вообще это правильно делать. Поэтому я попробовал, загрузившись в нормальную Fedora 9, "переключиться" в систему, расположенную внутри squashfs-образа. Т.е. другой вариант, который я рассматриваю, это не наворачивание обычного initrd дополнительными модулями для определения сети, а создание небольшой, но полноценной системы, которая будет подгружаться полностью по PXE и "переключаться" в примонтируемый по сети образ "большого" LiveCD/LiveDVD.

Сделал вот такой скрипт:

[code]
#! /bin/sh

MOUNTDIR=/mnt
SQUASHFSDIR=squash
LIVERWDIR=live-rw
SQUASHFS_IMAGE="/root/fcbig/LiveOS/squashfs.img"
OVERLAY_IMAGE="/root/overlay"

if [ "x$1" == "xclean" ] ; then
dmsetup remove live-rw
losetup -d /dev/loop2
losetup -d /dev/loop1
umount /dev/loop0
losetup -d /dev/loop0
exit 1
fi

BASE_IMAGE="${MOUNTDIR}/${SQUASHFSDIR}/LiveOS/ext3fs.img"
mkdir -p "${MOUNTDIR}/${SQUASHFSDIR}"
SQUASHFS_DEV=$(losetup -f)

losetup -r "${SQUASHFS_DEV}" "${SQUASHFS_IMAGE}"
BASE_DEV=$(losetup -f)
mount -t squashfs -o ro "${SQUASHFS_DEV}" "${MOUNTDIR}/${SQUASHFSDIR}"
losetup -r "${BASE_DEV}" "${BASE_IMAGE}"
OVERLAY_DEV=$(losetup -f)
losetup "${OVERLAY_DEV}" "${OVERLAY_IMAGE}"

echo "0 $(blockdev --getsize ${BASE_DEV}) snapshot ${BASE_DEV} ${OVERLAY_DEV} p 8" | dmsetup create
[/code]

Это для монтирования squashfs в rw-режиме, и вот такой:
[code]
#! /bin/sh

mount /dev/mapper/live-rw /mnt/dmlive
mount -t proc proc /mnt/dmlive/proc
mount -t sysfs sysfs /mnt/dmlive/sys
mount --bind /dev /mnt/dmlive/dev
chroot /mnt/dmlive /bin/bash
[/code]
для переключения в подмонтированную систему.

Всё это добро монтирует, чрутится.
Я пробовал запустить оттуда X - запускается, но ни один терминал не работает, все пишут "cannot find tty" (неточно, если надо, отпишу точное сообщение об ошибке).
Остается неясным вот что: как после chroot правильно продолжить запуск системы, находящейся внутри squashfs-образа? Очевидно, нужно поотключать ненужные службы, чтобы они не мешали тем, которые будут запускаться из находящихся внутри образа файлов. Хотелось бы точнее узнать, как поотключать лишнее, при этом не сломав сетевое подключение, посредством которого будет монтроваться образ.

Ну и вообще, всякие толковые советы по теме приветствуются.

ccoder
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.