Вчера потратил весь вечер и продолжаю сегодня утром попытки переключиться в систему через switch_root из busybox.
Оно просто не работает.
Ядро Linux собрано с настройками make defconfig, busybox собран с make defconfig.
Скрипт /init выглядит так:
#!/sbin/busybox sh
# Загрузившись в initramfs устанавливаем busybox в штатном режиме.
/sbin/busybox --install
# Создаём корень в tmpfs
mkdir /memroot
mount -t tmpfs tmpfs /memroot
# Копируем туда busybox
mkdir /memroot/sbin
cp /sbin/busybox /memroot/sbin/busybox
# Новый /init
cat > /memroot/init << "EOF"
#!/sbin/busybox sh
/sbin/busybox sh
EOF
chmod +x /memroot/init
# Переключаемся в tmpfs
exec switch_root /memroot /init
В качестве теста я пробую элементарно из initramfs переключиться в tmpfs с тем же самым busybox.
Если выполнить exec chroot, тогда всё работает, а когда делаешь exec switch_root, процесс init завершается и кернел паника.
Даже если брать нормальную систему на линуксе: на диске установлен линукс, я этот диск монтирую, делаю туда switch_root и снова кернел паника.
Тут явно что-то не то со switch_root.