Предупреждение :
Этот документ находится в разработке, и его пока не следует считать официальным.
|
Руководство разработчика 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
# make linux
# 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
# 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.
|