LINUX.ORG.RU

LiveCD, initramfs


0

0

Вот пытаюсь создать LiveCD, под рукой crux-2.4.iso, gentoo minimal и slamd64 12.0. Вот смотрю у всех есть initramfs(initrd) и еще какой-то файл *.squashfs. Может кто-то объяснить, зачем настоящую fs не запихивают в initramfs, а упаковывают отдельно в squashfs?

И если уж выделять отдельно rootfs, то что в ней должно быть? Или чем squashfs просмотреть? =)

anonymous

Экономия места. С LZMA-патчами squashfs-образы занимают ещё меньше.

Посмотреть:

mount -t squashfs image.squashfs /mnt/squashfs -o loop

(Ванильное ядро ещё не держит LZMA-squashfs-образы).

Алсо, squashfs-tools: `mksquashfs(1)`, `unsquashfs(1)`.

Sphinx ★★☆☆
()

initramfs загружается в _память_ загрузчиком(grub/lilo) средствами BIOS,а потом еще и распаковывает тудаже. Ждать окончания этого действия при загрузке с USB flash даже для 5 мегов kernel+initramfs немного запаривает. Если корень - маленький, можно его держать на initramfs,
но обычная практика - вынос корня на отдельный loop (образ FS в чём угодно можно хранить), а в initramfs хранить только код поиска и
переключения на новый корень (pivot_root(2)). Если всё делать правильно
старый корень (образ initramfs) полностью освобождается и не валяется в памяти. Кроме того squashfs позволяет распаковывать только то, что надо.
Довольно удобно для DVD :].

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

Просто судя по сообщениям разработчиков Linux, initramfs задумывался именно как root fs, по этой причине там теперь init, а не linuxrc.

Ядро патчить не хочется. А быстрее ли будет грузиться по сравнению с корнем в initramfs, если я корень вынесу в виде fs, сжатой gzipом? Скорость загрузки увеличивается из-за того, что грузится ядром, а не BIOSом?

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

> если я корень вынесу в виде fs, сжатой gzipом?

В смысле? И в squashfs и в cramfs по умолчанию и так gzip-сжатие.

А если ты хочешь сделать образ корневой фс и затем целиком пожать его гзипом, то будет скорее всего намного медленней, так как придется образ полностью распаковывать в память. Жопа будет, короче.

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

То есть gzipом обычный диск, сделанный на loop жать смысла нет? А можно чем-то squashfs заменить, только чтобы ядро не патчить? Какие-то стандартные решения ведь должны в официальном ядре быть?

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

А можно вообще не жать, а просто примонтировать? Тогда ведь распаковывать не придется?

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

Ну и вот из init с crux-2.4.iso:
echo "Mounting squashfs filesystem... "
mkdir /.tmpfs/.squashfs
mount -r -t squashfs -o loop /.tmpfs/.cdrom/crux.squashfs /.tmpfs/.squashfs
echo "Populating root filesystem..."
mkdir -p /newroot
echo "Mounting new root filesystem... "
mount -t tmpfs tmpfs /newroot
echo "Copying files from squashfs... "
cp -af /.tmpfs/.squashfs/* /newroot/

То же самое ведь -- все файлы копируются в память. Так не лучше ли всю rootfs поместить в образ initramfs?

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

Туплю, нашел в линуксе cramfs, буду его вместо squashfs юзать.

LiveCD у которых все в initramfs на самом деле почему-то не грузятся на qemu. Поэтому запихну-ка я все в cramfs.

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

Не все а только директории в которые не нужно производить запись.

Я вот например сделал так:
Есть старый комп на котором несоразмерно "новая" видеокарта там 64 мега памяти.
Я сделал так что система грузится в видеопамять но пример приводимый далее для рамдиска.

На initrd в /static расположен busybox статически слинкованый с uclib.

Вот кусок /linuxrc

#!/static/ash 

/static/mount -t proc proc /proc
/static/mount -t tmpfs tmpfs /dev/shm
/static/mount -t iso9660 /dev/hdc /cdrom

/static/mkdir /var /var/run /var/run/sshd /var/tmp /var/log /var/lock /var/lib /var/cache

/static/dd if=/cdrom/root.cfs of=/dev/ram1 2>/dev/null
/static/mount -t cramfs -o ro /dev/ram1 /uLin

А вот структура каталога

# в /dev находятся все файлы устройств из загружаемой системы
# в /home находятся все файлы пользователя из загружаемой системы

/static
/cdrom
/dev
/sys
/tmp
/home
/bin -> uLin/bin
/etc -> uLin/etc
/lib -> uLin/lib
/root -> uLin/root
/sbin -> uLin/sbin
/usr -> uLin/usr

При этом в /static находится файл init из кнопа.
# init from CD to ramdisk, after finishing the autoconfiguration.
/linuxrc
# Call the real init now
exec /sbin/init "$@" </dev/console >/dev/console 2>&1


PS. Я выбрал cramfs по причине скорости на старом железе.

В строке груба пишем init=/static/init

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

Я уже cramfs выбрал по причине наличия в vanilla linux. =)

Вместо
/static/dd if=/cdrom/root.cfs of=/dev/ram1 2>/dev/null
/static/mount -t cramfs -o ro /dev/ram1 /uLin

У меня
mount -t cramfs -o ro,loop /cdrom/rootfs.img /mnt

Потом из /mnt буду все копировать в каталог /newroot и делать switch_root в него(switch_root входит в состав busybox).

Ну и вместо linuxrc у меня init(и initramfs вместо initrd). Вообщем все работает, только glibc я вытащил из gentoo(когда сам собираю почему-то пишет что не может найти libc.6, хотя в initramfs он есть). А busybox слинкованный с uclibc ты сам собирал? Описание сборки на сайте довольно странное и незавершенное, а у меня все собирает Makefile, так что всякие chrootы в нем делать не удобно. =(

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

И еще странная проблема: при вызове switch_root /newroot /sbin/init пишет "switch_root: bad newroot /newroot". Что бы это могло быть? В гугле находятся даже сырцы switch_root, но решения нет.

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

Проблема была в том, что я /newroot не смонтировал как tmpfs. Теперь все грузится. До полностью своего LiveCD осталось собрать glibc(или busybox с uclibc) и rootfs(сейчас просто скопировал из RIPLinux и немного почистил).

Было бы замечательно если бы кто-то объяснил, как собрать busybox с uclibc.

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

а как ты линковал busybox с uClibc? Можно про этот процесс поподробнее?

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