LINUX.ORG.RU

Правильное использование pivot_root

 , ,


0

3

Пишу скрипт для смены rootfs. Начальная система находится на первом(mmcblk0p2) разделе, основная на следующем(mmcblk0p3). По сути хочу сделать то же самое, что и initramfs. Обе системы собраны через buildroot (busybox)

В итоге получилcя такой init:

#!/bin/sh
export PATH=/bin:/sbin:/usr/bin:/usr/sbin
mount -t proc none /proc
mount -t sysfs none /sys
ln -sf /proc/mounts /etc/mtab
/sbin/mdev -s
mount -t ext4 -o rw /dev/mmcblk0p3 /mnt/root
pivot_root /mnt/root /mnt/root/mnt/oldroot
mount -t devtmpfs none /dev
exec /usr/sbin/chroot / /bin/busybox init

В целом работает, но непонятны следующие моменты:

1) С какой целью рекомендуют делать это перед chroot

mount -n -o move /sys /mnt/root/sys
mount -n -o move /proc /mnt/root/proc
если они всё равно есть в fstab нового root и будут смонтирвоаны?

2) Если не монтировать devtmpfs для нового root, то /dev вроде как и есть - mmcblk*, tty* и т.д. в наличии, но например /dev/null - отсутствует. Если же явно монтировать, то всё работает как надо. Но в /proc/mounts почему-то не добавляется ещё один /dev, по-прежнему есть только тот, что смонтирован на oldroot. Почему так происходит?

3) Могу ли я как-то размонтировать /mnt/oldroot ? Сейчас не получается, пишет что устройство занято.

4) Кто создаёт /dev/root? Могу ли я его сменить с mmcblk0p2 на mmcblk0p3 из init скрипта?

5) Для чего мне менять / через pivot_root, нельзя ли получить тот же эффект используя только chroot?

1. Чтобы по новому пути были нужые псевдо-ФС, а по старому пути не было.

2. «вроде как и есть - mmcblk*, tty*» — в какой момент есть, сразу после pivot_root?

3. Нужно чтобы там не было отрытых файлов и смонтированых ФС.

4. Не знаю

5. Без pivot_root будет смена корневой ФС процесса, а не системы. Старую корневую ФС при chroot не отмонтировать.

mky ★★★★★
()

По сути хочу сделать то же самое, что и initramfs.

initramfs делает switch_root, это initrd делает pivot_root. Но так как у тебя два реальных устройства, тебе тоже нужен именно pivot_root.

если они всё равно есть в fstab нового root и будут смонтирвоаны?

Если только у тебя busybox, который их смонтирует (а также mount, если он отдельно), сможет без них нормально отработать. Но тебе же их всё равно придётся отмонтировать тогда потом.

3) Могу ли я как-то размонтировать /mnt/oldroot ? Сейчас не получается, пишет что устройство занято.

Ты отмонтировал /mnt/oldroot/{dev,sys,proc,и т.д.}? Или

5) Для чего мне менять / через pivot_root, нельзя ли получить тот же эффект используя только chroot?

https://lists.debian.org/debian-handheld/2004/12/msg00029.html

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

2. Да. При этом /dev монтируется только один раз автоматически, поэтому как мне кажется его вообще быть не должно после pivot_root, но он есть.

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