LINUX.ORG.RU

Поместить систему полностью в RAM

 , system in ram,


0

0

Скрипт:

#!/bin/sh
A="$@"
echo -e "\n\n\n\tinit options: $A\n\n\t\tMoving / to RAM...\n"
bin/mount -t tmpfs tmpfs =
bin/tar -cp --acls --same-owner --no-seek --selinux --xattrs --exclude={=/*,run/*,tmp/*} .|bin/tar --acls --same-owner --selinux --xattrs -pSxC =
cd =
bin/sed -i -r 's/^\S+\s+\/\s/tmpfs \/ tmpfs defaults 0 0/' etc/fstab
bin/sed -i -r 's/^\/dev\/root\/s+\/\s+ext4/d' etc/mtab
sbin/pivot_root . =
cd /
exec bin/chroot . bin/sh -c "bin/umount =;exec sbin/init \"$A\""
Создал в корне каталог = для монтирования tmpfs. В строке параметров запуска ядра конфига загрузчика — init=/i.


Мой корень размером 2G с ноутбучного SATA копируется ровно две минуты.
Пробовал rsync'ом с ключами -ADEgHhIloprSstWX — 4 м. 50 с.
Может кто-то подскажет что-то по ускорению процесса загрузки.

UPD:

Похоже моя проблема решилась. Просто убрал /dev, /sys, /proc, /run из exclude= tar'а.
Как проверить правильность примонтирования этих директорий к новому / в tmpfs?
Почему вообще это убирание их из exclude'а изменило ситуацию? Раньше не показывался ход загрузки OpenRC.

★★★★★

Последнее исправление: teod0r (всего исправлений: 21)

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

как система будет грузиться с харда, на котором всё сжато?
что ты имееь в виду? Можно конечно сжать всё кроме необходимого для работы этого скрипта, но тогда синхронизация замедлится

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

Может кто-то подскажет что-то по ускорению процесса загрузки.

А пробовал через cp это делать?

rezedent12 ☆☆☆
()
Ответ на: комментарий от teod0r

Есть тогда идея, но она довольно костыльна. командой dd делаешь образ диска и записываешь в /tmp и уже оттуда перемонтируешь.

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

как быть с exclude'ами? образ всего диска не нужен.
как потом ты в образ чрутится будешь?

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

как быть с exclude'ами? образ всего диска не нужен.

как потом ты в образ чрутится будешь?

Очевидно же что это надо делать в самом начале загрузки после запуска ядра.

rezedent12 ☆☆☆
()

Что только не сделают, чтобы не покупать ssd.

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

объясни последовательность действий как ты собрался это делать

Но ведь когда ядро загружается, оно загружается с ОЗУ-диска, а потом перемонтирует корень. Так же есть другой вариант когда загружается ядро сразу с драйвером нужного диска и монтирует корень без привлечения ОЗУ-диска. Собственно надо изменить скрипт инициализации и загружать GRUB сразу образ корневой системы в память. Ну или перемонтировать корневую файловую систему.

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

загружать GRUB сразу образ корневой системы в память

как? всё равно мне нужны будут exclude

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

всё равно мне нужны будут exclude

Знать бы что это такое.

rezedent12 ☆☆☆
()

задолбали с XY проблемой

просто распакуй tar-архив с /dev/

А если не лень, то читай man 1 mknod

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

Но ведь когда ядро загружается, оно загружается с ОЗУ-диска, а потом перемонтирует корень.

ага. http://en.wikipedia.org/wiki/Initrd

Так же есть другой вариант когда загружается ядро сразу с драйвером нужного диска и монтирует корень без привлечения ОЗУ-диска.

а это без initrd

emulek
()
Ответ на: задолбали с XY проблемой от emulek

я примонтировал старый корень в /mnt.
заглянул в /mnt/dev и увидел там кучу файов.
я их все удалил
теперь опять не показывается ход загрузки init.
плюс почему-то не подгрузился .bashrc рута. после перезагрузки подгрузился.

Что произошло? /dev ведь на диске не находится, это ведь часть ядра.
и кстати время загрузки ядра сократилось на полсекунды.
что я сделал?

просто распакуй tar-архив с /dev/

поясни

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

и кстати время загрузки ядра сократилось на полсекунды.

сейчас опять как прежде.

teod0r ★★★★★
() автор топика

Не нужно: для этого дисковые кеши в оперативке существуют

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

Что произошло? /dev ведь на диске не находится, это ведь часть ядра.

/dev это каталог, который определённо находится на диске.

В этом каталоге в большинстве дистрибутивов есть определённые специальные файлы - stdout, zero, full и тд. В процессе загрузки initrd монтирует в /dev специальную devfs, которая уже действительно контролируется ядром и скрывает те файлы, но они никуда не деваются и пока не подмотирован devfs - выполняют нужные функции.

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

заглянул в /mnt/dev и увидел там кучу файов. я их все удалил

ССЗБ. В слаке есть специальный пакет с /dev/, а у вас — без понятия.

Что произошло? /dev ведь на диске не находится, это ведь часть ядра.

ошибаешься. Это файлы. Их делают командой mknod (кстати, ЕМНИП в генте есть скрипт для этого), а уж потом mount монтирует к файлу девайс.

поясни

файлы надо создать, которые ты удалил.

emulek
()

Посмотри, как сделано в archboot. Там всё запихнуто в initrd и, соответственно, хранится на диске в сжатом состоянии. У такого подхода есть недостаток — с диска читается сразу всё, что, соответственно, занимает достаточно много времени.

А можно и в squashfs (см. archiso).

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

/sys, /proc, /run — это всё виртуальные файловые системы, они находятся в памяти и монтируются init'ом в начале загрузки. Первые две — это особые ФС (sysfs и procfs), последняя — обыкновенная tmpfs. Кстати, не забудь ещё примонтировать devtmpfs на /dev, tmpfs на /tmp и devpts на /dev/pts.

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

А sys proc run не существуют на диске?

/proc существует только в виде пустого каталога. Его нужно смонтировать командой mount -t proc /proc /mnt/rootfs/proc из другой системы (например если ты хочешь сделать chroot)

/sys монтировать не нужно, оно к ядру гвоздями прибито

/run это обычный каталог, его монтируют в память для того, что-бы можно было сделать read only корневой ФС (раньше это не получалось из-за всяких /etc/mtab, т.е. получалось, но криво)

PS: это без systemd, что там Леннарт придумал — яхз.

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

Там всё запихнуто в initrd и, соответственно, хранится на диске в сжатом состоянии. У такого подхода есть недостаток — с диска читается сразу всё, что, соответственно, занимает достаточно много времени.

никто не заставляет пихать в initrd всё. Достаточно ядра, основных каталогов, и ещё кастрированного шелла ash(шелл полезен при ремонте например). Тогда грузится мгновенно(в смысле до перемонтирования корня из памяти на основной носитель).

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

если ты хочешь сделать chroot

а если до этого сделал pivot_root?
в разных how_to по помещению системы в RAM говорится что надо делать
mount -M /dev /new_root/dev
mount -M /proc /new_root/proc
mount -M /sys /new_root/sys


я когда пробовал так делать в своём скрипте:
mount: wrong fs type, bad option, bad superblock on /dev,
missing codepage or helper program, or other error

In some cases useful info is found in syslog - try
dmesg | tail or so.

и тоже самое с /sys и /proc (но в запущенной системе получалось)


в других how-to — отмонтирование этих каталогов с последующим примонтированием в новый корень.
/dev у меня не получилось отмонтировать.

Как правильно сделать? или не надо ничего перемонтировать?

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

Так речь у ТС о том, как запихнуть в память всю систему. О том, что initrd — минимальный образ с модулями и скриптами для монтирования rootfs, я знаю.

intelfx ★★★★★
()

всё разобрался. /dev, /sys, /proc не надо ни перемонтировать, ни отмонтировать, ни перемещать.
нужно только /dev скопировать

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

devtmpfs на /dev

для чего это нужно? почему OpenRC это не делает?

tmpfs на /tmp

если корень в tmpfs, зачем это делать?

devpts на /dev/pts

OpenRC делает

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

/dev скопировать

При всяких чрутах обычно делают mount --rbind /dev /mnt/dev/

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

если корень в tmpfs, зачем это делать?

Если портаж, например, случайно забъет свою временную директорию, с отдельным /var/tmp последствий для системы не будет.

А про /tmp не знаю.

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

для чего это нужно? почему OpenRC это не делает?

Так вот почему Леннарт ругался на Gentoo. :)

http://unix.stackexchange.com/a/77936/21885. Это почти tmpfs, только с тем отличием, что внутри неё автоматически создаются файлы устройств (а udev уже расставляет права доступа и симлинки).

если корень в tmpfs, зачем это делать?

Для красоты. Если серьёзно — ну, вдруг ты захочешь ограничить размер /tmp, чтобы кто-нибудь не смог создать там файл размером в пару (десятков) гигабайт (world-writable — любой может захотеть).

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

Копировать нельзя. Нужно bind-смонтировать все эти директории (mount --bind /dev /newroot/dev и по аналогии), ну или смонтировать заново. Глянь arch-chroot: https://github.com/falconindy/arch-install-scripts/blob/master/common (api_fs_mount()).

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

Так вот почему Леннарт ругался на Gentoo. :)

оказалось делает. плохо посмотрел

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

Копировать нельзя.

это почему?

Нужно bind-смонтировать

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

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

это почему?

Потому что devtmpfs управляется ядром. Если ты скопируешь, то в новом /dev не будут появляться файлы устройств, например, для воткнутых дисков (а также будет невозможно создать новые pty, без чего не заработают как минимум screen/tmux), и ещё много чего весёлого.

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

Все названные файловые системы (/dev, /proc, /sys, /dev/pts, /dev/shm, /run и так далее) являются виртуальными и находятся целиком в памяти.

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

Потому что devtmpfs управляется ядром

Поместить систему полностью в RAM (комментарий)

Все названные файловые системы (/dev, /proc, /sys, /dev/pts, /dev/shm, /run и так далее) являются виртуальными и находятся целиком в памяти.

на стадии моего скрипта они ещё не примонтированы

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

и тоже самое с /sys и /proc (но в запущенной системе получалось)

дык это для запущенной системы только. AFAIK ядро само разворачивает proc/sys/dev при запуске, когда rootfs монтирует.

в других how-to — отмонтирование этих каталогов с последующим примонтированием в новый корень. /dev у меня не получилось отмонтировать.

а proc/sys ты даже не пытался? Ну и правильно. Очевидно ты неправильно понял мануал. Отмонтирование этих каталогов — /0.

Как правильно сделать? или не надо ничего перемонтировать?

AFAIK не нужно. За тебя всё делает ядро или initrd.

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

Так речь у ТС о том, как запихнуть в память всю систему.

ну можно всё запихать в initrd

но можно и по другому сделать(теоретически) — в initrd распаковать всё что нужно в память.

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

если корень в tmpfs, зачем это делать?

лучше если /tmp лежит в своей персональной fs.

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

в initrd распаковать всё что нужно в память.

Тогда проще взять squashfs, сжать им всё что нужно, потом считать с диска в отдельный tmpfs, оттуда смонтировать и pivot_root. В общем, взять archiso.

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

Странно, но окей.

точнее umount на них говорит не примонтированы.
вывод mount говорит что примонтированы
ls говорит что там пусто
а раз пусто, то какой смысл от bind?

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

Тогда проще взять squashfs, сжать им всё что нужно, потом считать с диска в отдельный tmpfs, оттуда смонтировать и pivot_root. В общем, взять archiso.

можно и так.

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