для тех, кто решит написать свой initrd/initramfs (init скрипт) взяв за основу окружение busybox, держку в курсе: поведение switch_root в busybox и switch_root в util-linux отличаются на корню.если вы, создавая свой initrd, в качестве основы возьмёте свою собственную систему, сложите в initrd все утилиты из своей системы, проверив через ldd все связанные библиотеки, и затем загружившись в такой initrd сделаете switch_root для переключения, то всё будет работать как вы того ожидали.
в busybox switch_root не работает, когда вы захотите переключиться из окружения initrd с busybox в другую полноценную систему, выполнив switch_root /newroot /sbin/init вы получите крах системы и кернел паник.
как вы не пляшите, заставить работать switch_root в busybox таким образом вы не сможете. switch_root работает, только если вы захотите переключиться в другой такой же busybox. из busybox в busybox прыгать -- пожалуйста. из busybox прыгнуть в "нормальную" систему -- кернел паник.
для того, чтобы из busybox переключиться в "нормальную" систему вы должны использовать pivot_root. pivot_root подменяет другую папку на текущий корень, и ещё нюанс такой, что пока вы находитесь в стадии initrd у вас pivot_root тоже не будет работать. то есть, только-только загрузившись в initrd, вы должны отсюда выйти в нормальный tmpfs маунт.
теперь объясняю на пальцах, как правильно использовать busybox для загрузки из inird/initramfs в нормальное окружение. берём busybox, складываем в /sbin/busybox, создаём /init скрипт, это и будет будущий initrd/initramfs. в /init пишем
#!/sbin/busybox sh
# устанавливаем busybox окружение
/sbin/busybox --install
# /memroot это "нормальный" initramfs как tmpfs маунт
# /newroot это "нормальная" система
mkdir -p /memroot /newroot
# простой проверкой файла /init определим где мы находимся
# значит сейчас мы в initrd/initramfs
if test -e /init; then
# создаём "нормальный" initramfs в tmpfs и переключаемся туда
mount -t tmpfs tmpfs /memroot
install -D -m 0755 /init /memroot/sbin/meminit
install -D -m 0755 /sbin/busybox /memroot/sbin/busybox
exec switch_root /memroot /sbin/meminit
fi
# этот /init уже в другом месте, значит мы в "нормальном" tmpfs
if test -e /sbin/meminit; then
# отсюда уходим дальше в нормальную систему.
if mount /dev/sda1 /newroot; then
cd /newroot
mkdir -p ./initramfs
pivot_root . ./initramfs
exec chroot . /sbin/init
fi
fi
и успешно загрузившись в "нормальную" систему, прошлое initramfs осталось висеть в /initramfs, его можно отмонтировать и удалить, если нужно.
для нормальной работы busybox -> gnu/linux, необходимо комбинировать switch_root/pivot_root, уходить в tmpfs и подменять корни местами.
такие дела.