Вопрос или проблема
Я хочу создать 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 и убедитесь, что все необходимые сервисы и модули загружаются корректно. Если возникнут вопросы, не стесняйтесь искать дополнительные источники информации или задавать их сообществу.