LINUX.ORG.RU

Пара вопросов про смену / => tmpfs

 


2

0

В продолжении темы про помещение системы в RAM

Есть скрипт:

# Script to copy / to tmpfs and continue boot from there
# Do not run this from a child shell. Use ". ramify" or exec.
# The shell running this script must be the only process on the system.


# Ensure this runs in /
cd /


# Create and mount tmpfs file system for /
mount -t tmpfs tmpfs mnt


# Copy everything from / filesystem to tmpfs
# Tar will restore proper owners and permissions when run as root
# FIXME: This is very slow because it reads / in many small pieces
# TODO: Add --exclude to prevent copying unneeded stuff
tar --one-file-system -c . | tar -C /mnt -x


# Move other mounts
mount --move dev mnt/dev
mount --move proc mnt/proc
mount --move run mnt/run
mount --move sys mnt/sys


# Create fstab with just new root file system
sed -i '/^[^#]/d;' mnt/etc/fstab
echo 'tmpfs / tmpfs defaults 0 0' >> mnt/etc/fstab


# Pivot root using instructions from pivot_root(8) man page
cd mnt
mkdir old_root
pivot_root . old_root


# Old root can only be unmounted once sh running from old root
# finishes. Continue startup normally using init.
exec chroot . bin/sh -c "umount old_root ; exec sbin/init"

Пара вопросов:

Действительно ли два tar'а через pipe будут быстрее, чем cp?

Обязательно ли в конце делать через chroot? Почему нельзя просто exec sbin/init? Уже ведь сделано pivot_root, в его мане написано, что оно меняет корень уже запущенных процессов, или я чего-то не понимаю?

★★★★★

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

Действительно ли два tar'а через pipe будут быстрее, чем cp?

Нет, они ведь через pipe данные качают, зато у tar'а есть опции по сохраннению/восстановлению расширенных атрибутов файла (SeLinux, capabilties).

pivot_root, в его мане написано, что оно меняет корень

В моём man'е всё написано подробнее и советуется именно такой способ запуска (с chroot'ом). На быстродействие это влиять не должно, с одной стороны, у всех процессов в ядре есть свой корень, с другой стороны, все системы с initrd такие (pivot + chroot) и нет никаких сообщений, что это кому-то что-то замедлило.

mky ★★★★★
()

Брутфорс мозга.

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

В моём man'е всё написано подробнее и советуется именно такой способ запуска (с chroot'ом)

а что будет, если не делать чрут перед запуском инита? Сделать просто chdir.

Никак не могу понять, что конкретно делает pivot_root.
Написано:

pivot_root перемещает корневую систему текущего процесса в каталог put_old и устанавливает каталог new_root новой корневой файловой системы текущего процесса.

Для чего создаётся этот put_old и что в него перемещается?

pivot_root изменяет корневой и рабочий каталоги каждого процесса или подпроцесса на new_root, если они указывают на старый корневой каталог

что значит 'если они указывают на старый корневой каталог.'?

Заметьте, что все это относится и к текущему процессу pivot_root , который может изменить (а может и не изменить) его рабочий каталог.

Что значит 'а может и не изменить'?

new_root и put_old не могут быть в одной файловой системе с текущим корневым каталогом.

непонятно

К put_old не должны быть подключены файловые системы.

тоже не понятно, к какому put_old, который был создан pivot_root, или который станет pu_old, т.е текущий корень?

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

у tar'а есть опции по сохраннению/восстановлению расширенных атрибутов файла (SeLinux, capabilties).

какие опции? просмотрел ман, не нашёл. есть только опция -p, но у cp есть такая же опция -a, сохраняющая владельца, права и extattr.

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

А в man'ах их ещё нет. Так эти опции были RHEL и клонах, но 6 октября сего года вышел tar 1.27, там, если смотреть исходники, есть --selinux, --xattrs, --acls, но в документации их ещё нет.

а что будет, если не делать чрут перед запуском инита? Сделать просто chdir.

Ничего, а потом выпустят новое ядро и скрипт сломается.

Для чего создаётся этот put_old и что в него перемещается?

В него перемещается та файловая система, которая была корневой на момент вызова pivot_root. Чтобы не потерялась :-) Это просто каталог, он не создаётся в ходе вызова pivot_root(), он должен существовать.

что значит 'если они указывают на старый корневой каталог.'?

В ядре, в структуре процесса, есть поля, указывающие на текущий корневой и рабочий каталоги. Видимо, эта фраза относится к случаю, когда процесс сделал chroot до вызова pivot_root.

Что значит 'а может и не изменить'?

Когда-нибудь, в далёком ядре:

At the time of writing, pivot_root() changes root and current working directory of each process or thread to new_root if they point to the old root directory. This is necessary in order to prevent kernel threads from keeping the old root directory busy with their root and current working directory, even if they never access the file system in any way. In the future, there may be a mechanism for kernel threads to explicitly relinquish any access to the file system, such that this fairly intrusive mechanism can be removed from pivot_root().

непонятно

Чего непонятного. Какой смысл в pivot_root, если new_root на той же файловой системе, что и корневой каталог? Попробуйте нарисовать, что должно произойти, если new_root и old_root будут просто каталогами на существующей корневой ФС.

тоже не понятно, к какому put_old

Чем/кем создан? put_old это просто каталог и он не должен на момент вызова pivot_root() являться точкой монтирования какой-либо ФС. В иделе просто пустой каталог.

P.S. Вы оба man'а читаете и pivot_root(2) и pivot_root(8) ?

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

Ё-моё, нас всех замедлило! Чё делать то?

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

спасибо, более-менее разъяснилось.

В него перемещается та файловая система, которая была корневой на момент вызова pivot_root.

перемещается условно, как mount --bind/симлинк, или в прямом смысле, как mv?

Вы оба man'а читаете и pivot_root(2) и pivot_root(8) ?

да. pivot_root (8) на русском правда не нашёл в интернете.

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

Перемещена как mount. То есть текущая корневая система как бы отмонтируется, а её место монтируется новая корневая система, а старая корневая система становится подмонтированной в old_root.

При этом, ЕМНИМ, если есть процессы, держащие открытые файлы на корневой ФС, то после pivot_root у них эти файлы останутся открытыми, только /proc/PID/fd уже будет отсылать на old_root.

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