Пишу скрипт для смены 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
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?