# exec switch_root /mnt/root /sbin/init выкидывает в хелп

## xxxtype

Привет

Стыдно признаваться но уже 4-й месяц не могу победить switch_root

Собран initramfs внутри busybox

find . | cpio -H newc -o | gzip -9 > ../initramfs.igz

Реальный корень debootstra-ом

Необходимо переключится в реальный корень

Чтобы я ни делал результат один выкидывает в хелп

Изначально пытался realroot затолкать в tmpfs

Но после безуспешных попыток попробовал тупо mount /dev/sda5 /newroot

Результат тот же --> хелп

Гуру ХелпМи

В гугл не отправлять он меня уже боится, бубен в клочья истрепал

Что я делаю не так, где я облажался, какуюнить степ бай степ инструкцию, 

хотя я их уже об читался аж в глазах рябит

----------

## TigerJr

 *xxxtype wrote:*   

> Привет
> 
> Стыдно признаваться но уже 4-й месяц не могу победить switch_root
> 
> Собран initramfs внутри busybox
> ...

 

```
man switch_root
```

switch_root will fail to function if newroot is not the root of a mount. If you want to switch root into a directory that does not meet this requirement then you can first use a bind-mounting trick to turn any directory into a mount point:

не понимаю чем chroot неугодил? Хотя правильнее вопрос задавать по-другому: switch_root vs pivot_root vs chroot?

А для этого хотелось бы понять подробности извращения...

----------

## xxxtype

Подробности извращения...

Необходимо корень затолкать в tmpfs --> зачем ооочень долго объяснять

Собрал корень debootstrap-ом

Корень упаковывал в squashfs --> rootfs.sfs

squashfs был выбран из-за быстрого извлечения содержимого в tmpfs, tar и cp работают медленнее 

init (из initramfs) монтирует раздел с образом rootfs.sfs

Извлекает rootfs.sfs например в /mnt/root отмонтирует раздел с образом rootfs.sfs

Далее mkdir -p /newroot && mount -t tmpfs tmpfs /newroot

Затем mount -o bind /mnt/root /newroot

Все корень в tmpfs

Осталось выполнить exec switch_root /newroot /sbin/init

Вот тут и начинаются чудеса busybox-кий switch_root выкидывает в хелп (strace не помог)

Debian-кий говорит, что-то вроде --> Too many levels of symbolic links

Распаковал дефолтный Debian-ский initramfs, там утилиты switch_root вообще нет, зато присутствует run-init 

Попробовал так --> 

Скопировал корень на реальный раздел

Примонтировал данный раздел в /root 

Выполнил exec run-init /root /sbin/init 3 </root/dev/console >/root/dev/console

Команда отработала - все загрузилось как нада

Затем попробовал извлек rootfs.sfs в /mnt/root

Далее mkdir -p /newroot && mount -t tmpfs tmpfs /newroot

Затем mount -o bind /mnt/root /newroot

Выполняю exec run-init /newroot /sbin/init 3 </newroot/dev/console >/newroot/dev/console

Говорит --> run-init current directory on the same filesystem as the root error 0

Не придумаю как обойти эту засаду

А хотелось бы именно tmpfs

Есть идеи???

----------

## xxxtype

Так же пробовал exec run-init /mnt/root /sbin/init 3 </mnt/root/dev/console >/mnt/root/dev/console 

Результат тот-же --> run-init current directory on the same filesystem as the root error 0

Подозреваю обижается на то, что /dev/root отсутствует

Как обмануть-та???

----------

## TigerJr

 *Quote:*   

> Говорит --> run-init current directory on the same filesystem as the root error 0

 

Не смогу проверить Debianовский run-init, к сожалению его нет в portage, switch_root является частью util-linux и по мануалу RETURN VALUE 0 on success и 1 on failure

 *Quote:*   

> Подозреваю обижается на то, что /dev/root отсутствует

 

/dev/root можно попробовать симлинком создать в /dev на твой корень.

P.S.

А распаковываешь в /mnt/root только из-за bind-mount трюка? Не получается что-ли скопировать rootfs.sfs на маунетнный tmpfs и туда switch_root?

----------

## xxxtype

Я понимаю, что код возврата 0 эт хорошо а 1 эт плохо

но ругачка --> run-init current directory on the same filesystem as the root error 0

появляется в момент kernel panic

А на что мне создать симлинк /dev/root если корень в tmpfs

пробовал на /dev/sdb5 безрезультатно

rootfs.sfs на маунетнный tmpfs не могу извлечь, говорит что because file exists поскольку данная директория уже существует

Поэтому и использую данный кастыль извлекаю в /mnt/root а затем биндю /mnt/root в /newroot кот уже примаунтен в tmpfs

Посути /mnt/root и так уже в tmpfs поскольку все это происходит в initramfs

Ща попробую вот так https://habrahabr.ru/post/253759/

по сути таже логика только там корень извлекается tar-ом

----------

## TigerJr

попробуй 

```
strace exec switch_root /newroot /sbin/init 
```

Может что-то ясно будет...

----------

