Как создать rootfs для пользовательского режима Linux на Fedora 18?

Вопрос или проблема

Я хочу создать rootfs для использования с UML-ядром и иметь возможность использовать интернет. Я использовал febootstrap с пакетами: bash, coreutils, net-tools, iputils. После использования febootstrap-supermin-helper я получил свой rootfs, но при попытке загрузки с его помощью через UML я получаю следующие ошибки:

[    4.340000] systemd[1]: время ожидания службы systemd-logind.service истекло, планируется перезапуск.
[    4.340000] systemd[1]: запрос на запуск службы dbus.service повторяется слишком быстро, отказывается от запуска.
[    4.340000] systemd-logind[638]: Не удалось получить системное D-Bus соединение: не получен ответ. Возможные причины: удаленное приложение не отправило ответ, политика безопасности шины сообщений заблокировала ответ, истекло время ожидания ответа, или сетевое соединение было разорвано.
[    4.340000] systemd-logind[638]: Не удалось полностью запустить демон: соединение отклонено

Мне интересно, какие пакеты необходимы для rootfs, и есть ли какой-либо другой способ, кроме febootstrap.

Может быть, вы могли бы попробовать PRoot (http://proot.me) в качестве альтернативы UML. Оба основаны на ptrace(2), хотя PRoot не требует настройки для получения доступа в интернет из гостевой системы:

host$ proot -R ./fedora-18-x86_64/ bash
guest$ wget http://google.fr
...

где “./fedora-18-x86_64/” является содержимым rootfs, загруженного с http://download.openvz.org/template/precreated/

Buildroot

Конфигурация qemu_x86_64_defconfig почти сработала, за исключением того, что мне пришлось добавить ::sysinit:/sbin/mdev -s в inittab. Я думаю, что это потому, что Buildroot полагается на CONFIG_DEVTMPFS_MOUNT для создания /dev.

Rootfs:

git clone git://git.buildroot.net/buildroot
cd buildroot
git checkout 2017.02
make qemu_x86_64_defconfig

# Пользовательский inittab.
echo 'BR2_ROOTFS_OVERLAY="rootfs_overlay"' >>.config
make olddefconfig
mkdir -p rootfs_overlay/etc
printf '
::sysinit:/bin/mount -t proc proc /proc
::sysinit:/bin/mount -o remount,rw /
::sysinit:/bin/mkdir -p /dev/pts
::sysinit:/bin/mkdir -p /dev/shm
::sysinit:/bin/mount -a
::sysinit:/sbin/mdev -s
::sysinit:/bin/hostname -F /etc/hostname
::sysinit:/etc/init.d/rcS
console::respawn:/sbin/getty -n -L console 0 vt100
::ctrlaltdel:/sbin/reboot
::shutdown:/etc/init.d/rcK
::shutdown:/sbin/swapoff -a
::shutdown:/bin/umount -a -r
' > rootfs_overlay/etc/inittab

# Создание образа.
make BR2_JLEVEL=$(($(nproc)-2))
cp output/images/rootfs.ext2 /path/to/linux

Затем на исходном коде ядра:

cd /path/to/linux
git checkout v4.9
make mrproper
make defconfig ARCH=um
make ARCH=um
./linux eth0=tuntap,,,192.168.0.254

Теперь вы внутри виртуальной машины, и вы можете выйти, используя:

poweroff

Файловая система сохранена, попробуйте это с помощью:

date >f

и перезагрузите.

TODO: сделать работу сети. Текущий eth0= является просто заглушкой, чтобы предотвратить зависание инициализации Buildroot в ожидании сетевого устройства.

Вы также можете выполнять пошаговую отладку ядра, как показано здесь: https://stackoverflow.com/questions/4943857/linux-kernel-live-debugging-how-its-done-and-what-tools-are-used/44669413#44669413

TODO: я не знаю, как работать с модулями ядра, поскольку они должны быть скомпилированы для UML, а не для x86. Первой проблемой является то, что insmod завершится неудачей, потому что UML не имеет SMP, что влияет на vermagic, и если вы принудительно установите vermagic, происходят странные вещи, такие как printk не выводит ничего. Связано: https://stackoverflow.com/questions/2488625/user-mode-linux-installing-a-module-error

Вы также можете исследовать этот образ с помощью QEMU, если хотите:

qemu-system-x86_64 -M pc -kernel output/images/bzImage -drive file=output/images/rootfs.ext2,if=virtio,format=raw -append root=/dev/vda -net nic,model=virtio -net user

Тестировалось в Ubuntu 14.04, ядро 3.13.0 на хосте.

Ответ или решение

Создание rootfs для User Mode Linux (UML) в среде Fedora 18 представляет собой интересную задачу, особенно когда требуется обеспечить доступ к интернету. Если вы столкнулись с проблемами при использовании febootstrap, это может быть связано с неполнотой вашего файла rootfs или отсутствием необходимых пакетов.

Шаг 1: Установка необходимых инструментов

Первоначально вам понадобятся некоторые инструменты. Убедитесь, что у вас установлены следующие пакеты:

sudo yum install febootstrap febootstrap-supermin-helper

Шаг 2: Подготовка rootfs

Для создания rootfs с использованием febootstrap, выполните следующие команды. Это поможет вам создать базовую файловую систему с необходимыми утилитами, такими как bash, coreutils, net-tools и iputils.

mkdir ~/uml-rootfs
febootstrap --arch x86_64 --apt --include bash,coreutils,net-tools,iputils \
    fedora18 ~/uml-rootfs
febootstrap-supermin-helper --build-uml ~/uml-rootfs

Шаг 3: Редактирование inittab

Если вы получаете ошибки при загрузке, связанные с systemd, возможно, вам нужно внести изменения в файл inittab. Вам следует добавить в inittab строку для модуля mdev, что позволит создать /dev при инициализации. Создайте или отредактируйте файл inittab внутри вашего rootfs:

echo '::sysinit:/sbin/mdev -s' >> ~/uml-rootfs/etc/inittab

Шаг 4: Настройка сетевого интерфейса

Чтобы разрешить доступ к интернету, вам нужно правильно настроить сетевой интерфейс. Обычно для UML используется виртуальный интерфейс. Добавьте следующее в команду загрузки вашего ядра UML:

./linux eth0=tuntap,,,192.168.0.254

Эта команда создает виртуальное сетевое подключение, обеспечивая вашему UML доступ в интернет.

Шаг 5: Запуск User Mode Linux

Теперь вы можете запустить свою виртуальную машину (UML) с использованием следующей команды:

cd /path/to/linux
make ARCH=um
./linux eth0=tuntap,,,192.168.0.254

После выполнения этих шагов вы должны получить работающую среду UML с доступом в интернет.

Альтернативные подходы

Если использование febootstrap не приносит результата, возможно, стоит рассмотреть другие решения, такие как Buildroot или PRoot:

Использование Buildroot

Buildroot позволяет создавать минимальные файловые системы для различных платформ. Вот пример того, как это сделать:

git clone git://git.buildroot.net/buildroot
cd buildroot
make qemu_x86_64_defconfig
# Создайте и настройте inittab
# ...
make
cp output/images/rootfs.ext2 /path/to/linux

Использование PRoot

PRoot – это еще один способ выполнения окружения без необходимости использования прямой настройки сетевых интерфейсов:

proot -R ./fedora-18-x86_64/ bash
guest$ wget http://google.fr

Этот подход не требует дополнительных настроек для доступа в интернет.

Заключительные замечания

Надеюсь, эти советы помогут вам в создании корректного rootfs для User Mode Linux в системе Fedora 18. При возникновении проблем с инициализацией системы проверьте ваш inittab и убедитесь, что все необходимые сервисы и модули загружаются корректно. Если возникнут вопросы, не стесняйтесь искать дополнительные источники информации или задавать их сообществу.

Оцените материал
Добавить комментарий

Капча загружается...