LINUX.ORG.RU

Как заставить Debian работать из RAM

 , , , ,


2

2

Итак, я продолжаю «искать свой святой Грааль» - метод загрузки полноценной custom-системы Debian целиком в RAM. Сперва пытался сделать это путем помещения всей системы в initramfs - все заработало, да только большая система (с GUI и кучей приложений) не грузится (после загрузки ядра начинает грузить initramfs и выдает Invalid argument - при этом такой же Дебиан но без GUI и программ весом до 1 ГБ грузит в RAM в составе initramfs без проблем: по всей видимости, где то ограничение на размер initramfs зашито в ядре, туда лезть у меня не хватит, боюсь, знаний).

Тогда я решил поместить в RAM систему другим путем, который в общих чертах описан здесь: https://habr.com/ru/post/253759/

Чтобы не заставлять Вас бродить по ссылкам, приведу основные точки способа:

1. Меняем конфигурацию initramfs, отключая проверку кФС (здесь и далее - обозначение корневой ФС) и стандартное монтирование кФС:

# checkfs ${ROOT} root
# mount ${roflag} -t ${FSTYPE} ${ROOTFLAGS} ${ROOT} ${rootmnt}
а затем создаем временную точку монтирования (еще работая в пределах initramfs!) для нашего CD:
mkdir /ramboottmp
монтируем нашу кФС с CD во временную точку монтирования:
mount ${roflag} -t ${FSTYPE} ${ROOTFLAGS} ${ROOT} /ramboottmp
Создаем ФС в RAM:
mount -t tmpfs -o size=100% none ${rootmnt}
Ну и распаковываем нашу кФС (файл ram.tar.gz) в эту tmpfs:
cd ${rootmnt}
tar -zxf /ramboottmp/ram.tar.gz
umount /ramboottmp

2. Геним новый initramfs:

/sbin/mkinitramfs -o /initrd-ram.img

3. В кФС (автор поста предлагал заходить туда из-под Live-CD, я предпочел напрямую вытащить кФС из виртуального диска .vdi - но это дело вкуса) отключаем прописанное там в /etc/fstab монтирование кФС и пишем свое:

none / tmpfs defaults 0 0

4. А затем архивируем всё из корня:

busybox tar -czf /путь-к-архиву/ram.tar.gz *

5. Создаем директорию, туда кидаем isolinux (в директории isolinux, разумеется), в эту же директорию isolinux кидаю ядро и initrd-ram.img, а ram.tar.gz кидаю в основную директорию. В isolinux.cfg прописываю:

DEFAULT MyLive
LABEL MyLive
linux /isolinux/ЯДРО
APPEND initrd=/isolinux/initrd-ram.img root=/dev/sr0 rw

6. Ну и генерирую .iso:

genisoimage -o disk.iso -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table -J -R /полный-путь-к-директории-из-пункта-5

Указанный .iso шикарно грузится, лишь немного затупливая при заливке 1.6 ГБ в RAM - но! Сам Линукс не загружается, выдавая в конце ошибку:

No init found. Try passing init= bootarg

При этом в директории root лежит моя кФС, то есть все, что я прописывал в initramfs РАБОТАЕТ! Но система то не запускается...

Что я пробовал:

1. По рекомендации самой системы выполнить run-init, указав в качестве NEW_ROOT точку монтирования моей кФС (/root), а в качестве NEW_INIT - Init моей кФС (/root/sbin/init):

run-init /root /root/sbin/init
Не происходит ровным счетом НИЧЕГО. Просто заново выдает консоль initramfs'а.

2. Просто запустить init initramfs'а:

/sbin/init
Выдает:
Not activating Mandatory Access Control as /sbin/tomoyo-init does not exist. Init must be run as PID 1

3. Кончилась фантазия и обращаюсь к Форуму...

Ответ на: комментарий от dima9kin

Какой из двух методов заливки (через tmpfs или через /dev/zram0, подробности в тексте) на Ваш взгляд лучше и почему?

Мой через zram0, потому что в отличии от архива ты можешь rootfs либо подмонтировать в локальную директорию либо просто накатить на раздел диска.

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

Ну, на наших компах вообще нет и не должно быть жестких дисков, в этом самая суть.

Хотел уточнить - как я понимаю, на новый ядрах zram включен в ядро и никаких дополнительных телодвижений не требует? То есть команда вида

cat fs.img > /dev/zram0
доступна с ходу, без каких либо подготовительных мероприятий, инициализаций и прочее?

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

Хотел уточнить - как я понимаю, на новый ядрах zram включен в ядро и никаких дополнительных телодвижений не требует?

Не знаю, но скорее всего требует, но то что было раньше было достаточно простым, для подробностей найди и прочитай howto

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

Ну, на наших компах вообще нет и не должно быть жёстких дисков, в этом самая суть.

Тебе это потребуется если ты захочешь обновить систему в rootfs.img, всё что тебе потребуется это подмонтировать его и после известных приготовлений обновить систему стандартными утилитами.
Для этой операции рекомендую инсталяционный диск Arch Linux с его хорошей утилитой arch_chroot.
(или arch-chroot??)

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

оригинальный how_to не у меня — искать в инете где-то надо. можно ещё man pivot_root посмотреть. по поводу заливки в память образа кФС: можно конечно грузиться с какого-нибудь сжатого образа — и так грузиться будет быстрее и весить меньше. НО для меня критично сохранить наличие выбора опции обычной загрузки системы и возможность делать chroot в режиме rw в эту фс на флешке, примонтировав её в другую сисстему

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

Да, я, кстати, удивился почему Вы юзаете несжатый tar. Теперь понял. Но у нас разные цели, по всей видимости, применения run-from-RAM, тут каждому свое))

dima9kin
() автор топика

Запаковать корневую файловую систему в squashfs и написать инит скрипт, ах, да, у вас же системд, тогда фиг знает как, могу порекомендовать девуан, там инит с человеческим лицом

Последней командой в инит скрипте должна быть pivot_root

Или exec, но pivot_root тоже нужен, не помню, это было аж в 12-м году

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

Так и systemd прекрасно работает, если есть ссылка на него с названием init))

Ну, по крайней мере у меня завелось)) Другой вопрос - чем squashfs лучше приведенной выше схемы с обычным tar.gz, распаковываемом в tmpfs?

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

чем squashfs лучше

Ну, вроде его не надо полностью распаковывать, потому меньше памяти занимает, я не уверен, если что, но наверно так, ещё поверх него я какую-то другую ФС делал, которая превращала сквашфс в rw, до перезагрузки конечно только изменения сохранялись

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

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

Спасибо большое за внимание в вопросу! Я, кстати, именно этим путем пошел - курочу «внутренний» init (тот, что от initramfs). Написал свой первый init - сейчас дает Error 13. Завтра буду разбираться

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

Там не сложно, загрузить модули ядра, смонтировать ФС, сделать пивотрут, и выполнить exec, вроде так

IvanR ★★★
()
16 января 2022 г.
Ответ на: комментарий от dima9kin

Если очень очень очень принципиально, могу проконсультировать по вопросу - систем-ин-рам!! (когда понимаешь пару моментов - сложного вообще ничего) - но одно ОГРОМЕННОЕ НО - я специализируюсь на убунту :))))

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