LINUX.ORG.RU

Как правильно switch_root?

 


0

1

Делаю switch_root, и так, и сяк, а оно сыпется ошибками. Не критичными, всё работает, но хотелось бы от них избавиться. Не знаю, как правильно делать switch_root.

[    1.338833] Run /init as init process
switch_root: failed to mount moving /dev to /newroot/dev: Invalid argument
switch_root: forcing unmount of /dev
switch_root: failed to mount moving /proc to /newroot/proc: Invalid argument
switch_root: forcing unmount of /proc
switch_root: failed to mount moving /sys to /newroot/sys: Invalid argument
switch_root: forcing unmount of /sys
switch_root: failed to mount moving /run to /newroot/run: No such file or directory
switch_root: forcing unmount of /run
INIT: version 2.96 booting
The system is coming up.  Please wait.

/init скрипт имеет следующий вид:

# cat init
#!/bin/sh

error() {
  setsid sh -c 'exec sh </dev/tty1 >/dev/tty1 2>&1'
}

mount -t proc none /proc || error
mount -t sysfs none /sys || error
mount -t devtmpfs devtmpfs /dev || error
mount -t tmpfs tmpfs /overlay || error

mkdir -p /ro /overlay/rw /overlay/work
mount -t squashfs -o loop,noatime /filesystem.squashfs /ro || error
mount -t overlay -o lowerdir=/ro,upperdir=/overlay/rw,workdir=/overlay/work rootfs /newroot || error

umount /proc
umount /sys
umount /dev

exec switch_root /newroot /sbin/init
error

Ни umount, ни mount --move, ни mount --rbind, ничего не помогает, оно либо говорит что /proc /sys already mounted, либо ещё что похуже. Как правильно приготовить новую ФС перед switch_root?

★★★★★

Ответ на: комментарий от init_6

да, и спасибо анонам, я даже не подумал заглянуть в man — посчитал, не барское это дело.

теперь ясно как работает switch_root и чего оно хочет. анон ратующий за chroot тоже отчасти прав.

конкретно у вас работает без ошибок просто по причине наличия проверок if ! mountpoint -q /proc /sys ... или около того на стадии инициализации системы, в CRUX же предполагается что система грузится «с чистого листа» и таких проверок не выполняют. ладно. разберёмся.

в вашем скрипте всё делается правильно, по итогу, надо будет вычищать все лишние mountpoints.

ЗЫ. использую теперь chroot: mount --move /dev /newroot/dev, остальное umount. тыгыдык.

Spoofing ★★★★★ ()
Последнее исправление: Spoofing (всего исправлений: 1)