LINUXTALKS.CO

Не работает switch_root в busybox

 

L


0

1

Вчера потратил весь вечер и продолжаю сегодня утром попытки переключиться в систему через 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.

★★★★★★

но всё равно оно не работает когда я хочу сделать switch_root в любую другую ОС, элементарно беру gentoo stage3, распаковываю в tmpfs, делаю switch_root туда и хуй.

Spoofing    
★★★★★★
Linux / Firefox

короче блять

switch_root нихуя не работает в любую систему

switch_root работает только в тот же самый busybox

я сделал другим путём

после загрузки initramfs я помещаю всё окружение busybox в tmpfs

в него делаю успешно switch_root

потом монтирую что мне нужно, нужную фс, ещё одна tmpfs с уже будущей системой

потом я делаю pivot_root чтобы поменять местами будущую систему и initramfs в tmpfs где мы сейчас находимся

потом chroot

потом удаляю initramfs который в tmpfs которое мы сделали old_root

пиздец блять говно

Spoofing    
★★★★★★
Linux / Firefox

/init для busybox который реализует базовую ПОЛНОЦЕННУЮ загрузку busybox и переключение в систему /dev/sda1

/dev/sda1 ЭТО ПРОСТО ДЛЯ ПРИМЕРА, МОЖЕТЕ СДЕЛАТЬ ЛЮБОЙ chroot В ЛЮБОЕ tmpfs

если вам всё это нахой не нужно просто сделаете exec /linuxrc в конце и получаете чистый busybox.

схема работы такая:

  • СМОТРИМ НАЛИЧИЕ /init, ЕСЛИ /init ЕСТЬ, ЗНАЧИТ ЭТО initramfs, БЕЖИМ НАХОЙ ОТСЮДА В tmpfs

  • switch_root в tmpfs

  • ЕСЛИ ТАМ ДРУГОЙ /init, ТОГДА УЖЕ НОРМАЛЬНО ЗАГРУЖАЕМСЯ У НАС ТЕПЕРЬ НОРМАЛЬНЫЙ initramfs КОТОРЫЙ НА САМОМ ДЕЛЕ УЖЕ СТАЛ tmpfs

  • ИЗ tmpfs ДЕЛАЕМ ВСЯКОЕ, СТАВИМ СИСТЕМУ В tmpfs, МОНТИРУЕМ ДИСК ИЛИ ЕЩЁ ЧЁ

  • ЧЕРЕЗ pivot_root МЕНЯЕМ КОРНИ МЕСТАМИ И ДЕЛАЕМ chroot В ДРУГУЮ СИСТЕМУ

ТОЛЬКО ТАК БЛЯДЬ

switch_root НЕ РАБОТАЕТ НИХУЯ

#!/sbin/busybox sh

rc_busybox_init () {
	/sbin/busybox mkdir -p /proc /sys /dev
	/sbin/busybox mkdir -p /sbin /usr/sbin /bin /usr/bin
	/sbin/busybox mkdir -p /tmp /var /run /etc /root
	/sbin/busybox mkdir -p /mnt /media /memroot /newroot
	/sbin/busybox --install

	# move initramfs environment to real tmpfs
	if test -e /init; then

		echo " * initramfs boot. "
		mount -t tmpfs tmpfs /memroot
		install -D -m 0755 /init         /memroot/sbin/meminit
		install -D -m 0755 /sbin/busybox /memroot/sbin/busybox
		echo " * initramfs done. "

		exec switch_root /memroot /sbin/meminit

	fi

	if test -e /sbin/meminit; then

		echo " * tmpfs init. "
		rm /sbin/meminit # keep clean

		# allow autologin as root on tty1
		echo tty1::respawn:/bin/login -f root > /etc/inittab
		# echo tty1::respawn:/sbin/getty 0 tty1 >> /etc/inittab
		echo tty2::respawn:/sbin/getty 0 tty2 >> /etc/inittab
		echo tty3::respawn:/sbin/getty 0 tty3 >> /etc/inittab
		echo tty4::respawn:/sbin/getty 0 tty4 >> /etc/inittab
		echo tty5::respawn:/sbin/getty 0 tty5 >> /etc/inittab
		echo tty6::respawn:/sbin/getty 0 tty6 >> /etc/inittab
		echo ttyS0::respawn:/sbin/getty -L ttyS0 9600 vt100 >> /etc/inittab

		echo root::0:0:root:/root:/bin/sh > /etc/passwd

		echo "	NETBOOT (\n) (\l)	"	 > /etc/issue
		echo ""							 >> /etc/issue

		echo " * tmpfs done. "

	fi
}

rc_busybox_boot () {
	echo " * tmpfs boot. "

	mount -t proc none /proc
	mount -t sysfs none /sys

	echo 5 > /proc/sys/kernel/printk

	if test -e /proc/sys/kernel/hotplug; then
		echo /sbin/mdev > /proc/sys/kernel/hotplug
	fi
	mdev -s

	hostname host

	ip link set lo up
}

rc_busybox_halt () {
	ip link set lo down

	umount /sys
	umount /proc

	echo " * tmpfs halt. "
}

rc_busybox_next () {
	mkdir -p /newroot/initramfs

	mount -t tmpfs tmpfs /newroot/initramfs

	pivot_root /newroot /newroot/initramfs

	exec chroot / /sbin/init
}

rc_busybox_init

rc_busybox_boot

if mount /dev/sda1 /newroot; then
	rc_busybox_halt

	rc_busybox_next
fi

echo " * something was goin wrong"
echo " * continue to boot busybox"

exec /linuxrc
Spoofing    
★★★★★★
Linux / Firefox
Ответ на: комментарий от Spoofing

Еще раз напоминаю - есть Клуб где матеряться, а есть техразделы.

И как бы то что ты в этом разделе творишь - это совсем не круто. Вообще плохо.

JamesHolden    
★★★★★★
Linux / Chrome