The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]



Индекс форумов
Составление сообщения

Исходное сообщение
"Релиз минималистичного набора системных утилит BusyBox 1.36"
Отправлено Spoofing, 04-Янв-23 10:01 
для тех, кто решит написать свой 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 и подменять корни местами.

такие дела.

 

Ваше сообщение
Имя*:
EMail:
Для отправки ответов на email укажите знак ! перед адресом, например, [email protected] (!! - не показывать email).
Более тонкая настройка отправки ответов производится в профиле зарегистрированного участника форума.
Заголовок*:
Сообщение*:
 
При общении не допускается: неуважительное отношение к собеседнику, хамство, унизительное обращение, ненормативная лексика, переход на личности, агрессивное поведение, обесценивание собеседника, провоцирование флейма голословными и заведомо ложными заявлениями. Не отвечайте на сообщения, явно нарушающие правила - удаляются не только сами нарушения, но и все ответы на них. Лог модерирования.



Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру