Gentoo Logo

Предупреждение : Этот документ находится в разработке, и его пока не следует считать официальным.


Руководство разработчика Gentoo Linux по тестированию системы в пользовательском режиме (User-Mode Linux).

Содержание:

1.  Установка User-Mode Linux

Web сайт, посвящённый user-mode (http://user-mode-linux.sourceforge.net/), даёт следующие определение: "user-mode linux позволяет пользователям запускать Linux внутри себя". Более конкретно, user-mode linux предоставляет виртуальные машины, в которых пользователь может запускать "глючное" ПО, экспериментировать с новыми ядрами Linux и дистрибутивами, а также копаться во внутренностях без риска для вашей основной системы. Изменение основных (core) пакетов, таких как sys-apps/baselayout или sys-libs/glibc, чревато крахом системы и невозможностью загрузки; с user-mode linux мы можем тестировать эти изменения, не беспокоясь о крахах "живой" системы.

Установка user-mode linux чрезвычайно похожа на нормальную установку ядра. Сначала установим исходники ядра (пропатченного для user-mode linux), а затем как обычно, настроим ядро с user-mode linux:

Листинг 1.1:

# emerge sys-kernel/usermode-sources
# cd /usr/src/uml/linux
# make menuconfig ARCH=um
# make linux ARCH=um
# cp linux /usr/local/bin/linux

Предупреждение: Фрагмент ARCH=um очень важен!

Важно: В ядре user-mode linux, для нормальной загрузки Gentoo системы, должна быть выключена функция автоматического монтирования /dev (devfs) по умолчанию. Также, вы должны убедиться, что tmpfs ("Virtual Memory Filesystem") скомпилирован, так как по умолчанию загрузочные скрипты Gentoo linux сохраняют свою информацию в небольшой tmpfs партиции. Скомпилированное ядро, доступное с сайта user-mode, автоматически монтирует /dev, и не скомпилировано с tmpfs; советую с ним даже не связываться.

Я настоятельно рекомендую прочесть документацию по user-mode linux, но основная идея, это запуск программ /usr/local/bin/linux разгрузка ядра user-mode и попытка сохранить системные данные в файле root_fs который расположен в текущем рабочем каталоге.

Не помешает также установить user-mode linux tools.

Листинг 1.2:

# emerge sys-apps/usermode-utilities

Эти инструменты позволяют организовать сетевую работу (и не только) между виртуальной системой user-mode linux и базовой системой.

2.  Создание root_fs

Делаем Gentoo chroot

Файл root_fs необходим user-mode linux, это файл, содержащий в себе файловую систему Gentoo Linux. Для его создания у вас должна быть включена поддержка Loopback устройств (Loopback device) в основном (не-user-mode) ядре.

Создание самого файла root_fs будет нашим последним шагом. Для начала же мы создадим файловую систему Gentoo обыкновенным chroot. Нам понадобятся stage tarball, которые могут быть загружены с сайта, взяты с liveCD, или с liveCD.iso.

Листинг 2.1: Монтирование a liveCD .iso

# mkdir /mnt/loop
# mount -o loop /path/to/build-<TAB>.iso /mnt/loop

Установка chroot аналогична обычной установке Gentoo Linux.

Листинг 2.2:

# mkdir /mnt/gentoo
# cd /mnt/gentoo
# tar xvjpf /path/to/build-<TAB>.tar.bz2

Выходим и размонтируем .iso образ. Больше он нам не понадобится.

Листинг 2.3:

# cp /etc/resolv.conf /mnt/gentoo/etc/
# mount -o bind /proc /mnt/gentoo/proc
# mkdir -p /mnt/gentoo/usr/portage/distfiles
# mkdir -p /mnt/gentoo/usr/portage/packages
# mount -o bind /usr/portage/distfiles /mnt/gentoo/usr/portage/distfiles
# mount -o bind /usr/portage/packages /mnt/gentoo/usr/portage/packages
# chroot /mnt/gentoo /bin/bash

# emerge sync
# env-update
# source /etc/profile

Благодаря связке (bind-mounting) /usr/portage/distfiles и /usr/portage/packages нет необходимости скачивать или компилировать уже установленные в основной системе пакеты.

Загружаемся (bootstrap) и устанавливаем систему в обычном порядке:

Листинг 2.4:


# cd /usr/portage
# nano -w /etc/make.conf
# nano -w /etc/make.profile/packages 
# nano -w /usr/portage/profiles/package.mask
# scripts/bootstrap.sh && emerge --usepkg system

Предупреждение: Отредактируйте файл /etc/make.profile/packages на предмет удаления virtual/bootloader ebuild из системы по умолчанию (просто удалите "*" из начала строки "*virtual/bootloader"). virtual/bootloader ebuild пытается монтировать партицию /boot, которая отсутствует в нашем chroot.

Примечание: Проверьте /etc/make.profile/packages и /usr/portage/profiles/package.mask что бы убедиться, что любой пакет для тестирования которые вы хотите установить попадают под маску. Теперь scripts/bootstrap.sh скомпилирует загрузочные пакеты из исходников. Для использования уже созданных пакетов, добавьте alias emerge="emerge --usepkg" вверх bootstrap скриптов.

Добавьте любые, необходимые вам дополнительные пакеты. Если хотите, выберете любое имя для своей виртуальной Gentoo системы. В /etc/fstab замените /dev/ROOT на /dev/ubd/0, со следующими типами fs ext2, ext3, или reiserfs. Установите /dev/SWAP в /dev/ubd/1, и закомментируйте /dev/BOOT.

Выйдите из chroot, размонтируйте все точки монтирования, разархивируйте новый дистрибутив Gentoo и проведите чистку:

Листинг 2.5:

# exit
# umount /mnt/gentoo/usr/portage/distfiles
# umount /mnt/gentoo/usr/portage/packages
# umount /mnt/gentoo/proc
# du -ks /mnt/gentoo


# cd /mnt/gentoo
# tar cvjpf ~/gentoo.tbz2 *
# cd
# rm -rf /mnt/gentoo

На этом шаге, не забудьте установить root пароль.

Листинг 2.6: Установка root пароля

# passwd

Возможно вы также захотите еще раз взглянуть на заключительные шаги по установке из настольной книги Gentoo.

Создание root_fs

Наш Gentoo chroot занимает 300 MB, значит, для root_fs понадобится минимум столько же. Мы выберем 0.5 GB как самый разумный размер.

Листинг 2.7:

# dd if=/dev/zero of=root_fs seek=500 count=1 bs=1M
# mke2fs -F root_fs
# mount -o loop root_fs /mnt/loop
# tar xvjpf gentoo.tbz2 -C /mnt/loop
# umount /mnt/loop

Неплохо было бы иметь 0.5 GB, swap раздел.

Листинг 2.8:

# dd if=/dev/zero of=swap_fs seek=500 count=1 bs=1M
# mkswap -f swap_fs

Теперь посмотрим работает ли всё это!

Листинг 2.9:

# linux ubd0=root_fs ubd1=swap_fs

Примечание: User-mode linux использует X терминалы (xterms) для виртуальных консолей которые запускаются при загрузке, убедитесь, что терминал с которого вы запускаете user-mode linux имеет корректно установленную переменную $DISPLAY (включая права xhost/xauth).

При некотором везении вы сможете зайти в вашу user-mode linux Gentoo систему. Единственное, что осталось сделать для получения полнофункционального user-mode linux, это настроить сетевое соединение с основной системой.

3.  Сеть

Благодаря Мартину Шлеммеру (Martin Schlemmer (Azarah)), я знаю, как поднять сеть из под user-mode системы. Идея состоит в том, что настраивается частная сеть (private network) состоящая из основной и user-mode системы. User-mode система направляет все свои пакеты основной системе, которая перенаправляет их в сеть. Убедитесь, что ядро основной системы имеет поддержку Networking --> IP: Netfilter Configuration --> IP tables support --> Full NAT --> MASQUERADE target support и Network Device Support --> Ethertap network tap скомпилированы как модули; затем проделываем следующее на основной машине:

Листинг 3.1:

# modprobe ethertap
# modprobe iptable_nat
# iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
# echo 1 > /proc/sys/net/ipv4/ip_forward

Строка iptables включает IP Masquerading между частной сетью в которую включена наша user-mode system и internet (в нашем случае, через eth0). Строка echo включает переадресацию пакетов между частной сетью и интерфейсом в который включен шлюз (eth0 для нас).

Теперь запустим user-mode system и посмотрим работает ли сеть.

Листинг 3.2:

# linux ubd0=root_fs ubd1=swap_fs eth0=ethertap,tap0,,192.168.0.254
(Заходим в user-mode систему)
# ifconfig eth0 192.168.0.1 up
# ping -c 2 192.168.0.254
PING 192.168.0.254 (192.168.0.254): 56 octets data
64 octets from 192.168.0.254: icmp_seq=0 ttl=255 time=0.8 ms
64 octets from 192.168.0.254: icmp_seq=1 ttl=255 time=0.6 ms

--- 192.168.0.254 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.6/0.7/0.8 ms
route add default gw 192.168.0.254
netstat -rn
Kernel IP routing table
Destination  Gateway        Genmask        Flags MSS Window irtt Iface
192.168.0.0  0.0.0.0        255.255.255.0  U      40 0         0 eth0
0.0.0.0      192.168.0.254  0.0.0.0        UG     40 0         0 eth0
scp user@192.168.0.254:/etc/resolv.conf /etc/resolv.conf (если нужно)
ping -c 2 www.gentoo.org
PING www.gentoo.org (207.170.82.202): 56 octets data
64 octets from 207.170.82.202: icmp_seq=0 ttl=240 time=119.6 ms
64 octets from 207.170.82.202: icmp_seq=1 ttl=240 time=92.0 ms

--- www.gentoo.org ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 92.0/105.8/119.6 ms

В системе user-mode мы выделили user-mode eth0 интерфейсу локальный IP адрес 192.168.0.1 и подняли интерфейс. Основная система имеет локальный IP адрес 192.168.0.254, и мы пингуем её, что бы убедиться, что сеть работает. Строка route добавляет шлюз, которым является основная система, мы используем scp для получения рабочего /etc/resolv.conf (если необходимо), и пингуем www.gentoo.org для проверки разрешения имён (и общей доступности internet) из нашей user-mode системы. Теперь user-mode система установлена!

4.  Тестирование .iso

Наверное, настоящим идеалом тестирования Gentoo Linux является загрузка .iso с user-mode linux и полная установка Gentoo внутри виртуальной системы user-mode linux.

Загрузка .iso, или в действительности initrd из .iso, очень проста.

Листинг 4.1:

# mount -o loop /path/to/build-<TAB>.iso /mnt/loop
# cp /mnt/loop/isolinux/rescue.gz .
# linux load_ramdisk=1 prompt_ramdisk=0 ramdisk_size=22000 \
> initrd=rescue.gz root=/dev/ram0 ubd0=root_fs ubd1=swap_fs \
> ubd2=/dev/cdroms/cdrom0 eth0=ethertap,tap0,,192.168.0.254

Теперь вы должны буквально следовать документации по установке Gentoo, помня, что файловая система root это /dev/ubd/0, раздел swap это /dev/ubd/1, CD-ROM это /dev/ubd/2.



Для печати

Обновлено 20 мая 2003

Исходный документ обновлен 1 марта 2008

Аннотация: Данное руководство покажет разработчикам Gentoo Linux, как установить и использовать user-mode linux для тестирования потенциально сбойных системных изменений.

Grant Goodyear
редактор

John Davis
редактор

Юрий Борисов
переводчик

Иван Зенков
редактор перевода

Donate to support our development efforts.

Copyright 2001-2012 Gentoo Foundation, Inc. Questions, Comments? Contact us.