Gentoo Logo

Testowanie środowiska z jądrem w trybie użytkownika (UML)

Spis treści:

1.  Skąd można pobrać uml?

Ważne: Przed możliwością skorzystania z wirtualnego systemu, konieczne jest używanie profilu non-NPTL oraz wersji <glibc-2.4. Aby dowiedzieć się jak zmieniać profile należy przeczytać odpowiednie instrukcje na ten temat. Po przełączeniu się na profil non-NPTL konieczne będzie wydanie polecenia emerge -e world.

Źródła można pobrać ze strony internetowej projektu (http://user-mode-linux.sourceforge.net). Wirtualny system umożliwia użytkownikowi uruchomienie drugiego systemu operacyjnego na systemie gospodarza. Ponadto może służyć do testowania nowych wersji jądra, innych dystrybucji oraz oprogramowania w wersjach rozwojowych. Eksperymentowanie z pakietami Gentoo takimi jak sys-apps/baselayout albo sys-libs/glibc może wiązać się z możliwością uszkodzenia systemu i uczynienia go niemożliwym do uruchomienia. Wirtualny system zapewnia środowisko testowe odizolowane od systemu gospodarza przez co użytkownik ma pewność, że eksperymenty nie wprowadzą żadnych szkodliwych zmian.

Większość jąder serii 2.6 posiada obsługę UML. Można użyć obecnych źródeł jądra, ale znacznie lepiej jest zbudować osobne drzewo jąder dla UML i zamiast dodawać kolejne funkcje do poprzedniego jądra, stworzyć jednorodne jądro dla każdego zainstalowanego systemu UML.

Należy zacząć od pobrania źródeł jądra (np. jądro vanilla ze strony kernel.org i rozpakowania ich do dowolnego lokalnego katalogu.

Następnie należy skonfigurować pobrane źródła, tak jak robi się to dla każdego innego systemu, ale trzeba dodać do nich ARCH=um, co sprawi, że jądro będzie traktowane jako takie, które jest uruchamiane jako dodatkowy proces na już działającym systemie.

Listing 1.1: Budowanie kernela dla UML

# cd /srv/aegis/src/uml-linux
# make menuconfig ARCH=um
# make linux ARCH=um
# cp linux /usr/local/bin/linux

Ostrzeżenie: Fragment ARCH=um jest niezmiernie ważny!

Domyślnie katalog /usr/local/bin jest wymieniony w zmiennej $PATH. Jeśli jednak się tam nie znajduje z jakichś powodów, należy odszukać definicję tej zmiennej w pliku /etc/profile i naprawić ten błąd:

Listing 1.2: Sprawdzanie poprawności $PATH

$ echo $PATH | grep /usr/local/bin

Listing 1.3: Przykładowa definicja $PATH w pliku /etc/profile

PATH="/usr/local/bin:/usr/bin:/bin:${PATH}"

Po dokonaniu zmian w tym pliku należy wykonać polecenie source /etc/profile.

Aby wirtualny system uruchomił się musi być tak skonfigurowany, aby nie montował automatycznie /dev (devfs). Drugą istotną rzeczą jest tmpfs. Wirtualny system plików powinien być wkompilowany w system aby skrypty startowe Gentoo miały możliwość przechowywania tam swoich danych. Wersja binarna jądra jest dostępna ze strony www podanej wyżej. Jądro automatycznie montuje /dev o ile nie posiada wkompilowanej obsługi tmpfs.

Przed rozpoczęciem zaleca się przeczytanie dokumentacji dostępnej do omawianego tematu. Podstawowym założeniem jest uruchomienie /usr/local/bin/linux. Program uruchamiając się próbuje uruchomić system zawarty w pliku root_fs, który powinien znajdować się w katalogu domowym.

Warto również zainstalować kilka dodatkowych narzędzi dla UML.

Listing 1.4: Instalowanie narzędzi UML

# emerge sys-apps/usermode-utilities

Narzędzia te umożliwiają komunikację pomiędzy wirtualnym systemem, a systemem gospodarza oraz ustawiają kilka innych rzeczy.

2.  Tworzenie root_fs

Tworzenie chrootowalnego Gentoo

Plik root_fs zawiera w sobie cały system plików Gentoo. Aby go utworzyć będzie potrzebna jest obsługa urządzeń "loopback" wkompilowana w jądro systemu gospodarza (nie w jądro systemu wirtualnego).

Pierwszym krokiem będzie stworzenie drzewa katalogów Gentoo poprzez standardowe chrootowanie. Najprościej będzie użyć odpowiedniego pliku stage z płyty instalacyjnej bądź to z jej obrazu. Innym rozwiązaniem będzie pobranie go z Internetu.

Listing 2.1: Montowanie obrazu iso płyty instalacyjnej

# mkdir /mnt/loop
# mount -o loop /ścieżka/do/instalacji-<TAB>.iso /mnt/loop

Ustawienia środowiska chrootowalengo są identyczne jak standardowej kompilacji Gentoo.

Listing 2.2: Tworzenie środowiska chrootowalnego

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

Na tym etapie można odmontować obraz .iso - nie będzie już używany.

Kompilacja systemu przebiega w krokach opisanych w Podręczniku instalacji Gentoo. Należy po prostu wchrootować się do /mnt/gentoo i postępować zgodnie z instrukcjami z Podręcznika.

Użytkownik ma wolną rękę jeżeli chodzi o dobór instalowanych na wirtualnym serwerze pakietów. Wirtualny system można również nazwać dowolnie, według własnego uznania. Kolejnym krokiem będzie poprawne ustawienie pliku /etc/fstab /dev/ROOT zmienia sie na /dev/ubda, obsługiwane typy systemów plików to: ext2, ext3 i reiserfs. /dev/SWAP zmienia się na /dev/ubdb, należy również odkomentować ścieżkę /dev/BOOT jeżeli istnieje osobna partycję rozruchową.

Na tym etapie instalacji ustawia się hasło roota. Służy do tego polecenie:

Listing 2.3: Ustawianie hasła roota

# passwd

Po ustawieniu hasła roota możemy przystąpić do zmian w skryptach startowych. Należy usunąć consolefont i keymaps z poziomu uruchomieniowego "boot":

Listing 2.4: Usuwanie niepotrzebnych skryptów startowych

# rc-update del consolefont boot
# rc-update del keymaps boot

Teraz można wyjść ze środowiska chrootowalengo, odmontować wszystkie dublujące się napędy i oczyścić cały system.

Listing 2.5: Finalizowanie instalacji

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

Tworzenie root_fs

Stworzone środowisko zajmuje prawie 300 MB, dlatego warto zarezerwować co najmniej 500 MB dla root_fs.

Listing 2.6: Tworzenie plików UML

# 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

Bardzo przydatny jest również plik wymiany - także w rozmiarze 500 MB. Tworzy się go poprzez wydanie następujących poleceń:

Listing 2.7: Tworzenie partycji wymiany

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

Teraz należy przetestować ustawienia i sprawdzić czy nie został popełniony błąd.

Listing 2.8: Uruchamianie wątka jądra UML

# linux ubd0=root_fs ubd1=swap_fs

Jeżeli nie pojawi się żaden komunikat świadczący o błędzie należy przejść do ustawienia wirtualnej konsoli. Wirtualny system używa xterma jako konsoli, która będzie uruchamiana w trakcie startu systemu, dlatego należy się upewnić czy zmienna $DISPLAY jest odpowiednio ustawiona oraz czy użytkownik posiada odpowiednie prawa do xhost/xauth.

Przy odrobinie szczęścia będzie możliwe zalogowanie się do systemu. Jedyną niedogodnością w systemie wirtualnym jest nie w pełni sprawna sieć.

Uwaga: W przypadku otrzymania błędu "No space left on device", konieczne będzie zaalokowanie więcej pamięci dla systemu-gościa poprzez dodanie mem=xxxMB na końcu pliku jądra. Dla przykładu: linux ubd0=root_fs ubd1=swap_fs mem=128MB.

3.  Sieć

Korzystanie z już działającej sieci

Należy się upewnić czy system gospodarza ma odpowiednie pozycje wkompilowane w jądro jako moduły:

Listing 3.1: Konfiguracja jądra systemu gospodarza

Networking -->
  IP: Netfilter Configuration -->
    IP tables support -->
      Full NAT -->
        <M> MASQUERADE target support

    Network Device Support -->
      <M> TUN/TAP Support

Po sprawdzeniu odpowiednich modułów ładujemy je poprzez wydanie następujących poleceń:

Listing 3.2: Konfigurowanie sieci

# modprobe tun
(W przypadku otrzymania krytycznego błędu zawsze będzie można skasować /dev/net/tun i spróbować jeszcze raz)
# modprobe iptable_nat
# iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
# echo 1 > /proc/sys/net/ipv4/ip_forward

Polecenie iptables wprowadza regułę filtrowania pakietów, a w tym konkretnym przypadku maskowanie IP pomiędzy prywatną siecią, na której będzie działał wirtualny system, a internetem (osiąganym przez interfejs eth0). W tym procesie będzie brała udział brama sieciowa.

Tak skonfigurowany system powinien działać poprawnie.

Listing 3.3: Uruchamianie UML

# linux ubd0=root_fs ubd1=swap_fs eth0=tuntap,,,192.168.0.254
(logowanie do systemu wirtualnego)
# 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 (if needed)
# 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

Wirtualny system reprezentowany jest przez urządzenie eth0 o adresie IP 192.168.0.1. System gospodarza posiada adres 192.168.0.254. Należy wysłać żądanie ping, aby upewnić się czy sieć pomiędzy systemami funkcjonuje poprawnie. Po dodaniu domyślnej bramy można użyć "scp" w celu pobrania działającego /etc/resolv.conf. Po skopiowaniu go do /etc należy wysłać żądanie ping na www.gentoo.org, aby upewnić się czy jest dostęp do Internetu. Na tym etapie system wirtualny można instalować w dowolnym momencie!

Korzystanie z wirtualnej sieci

Nie będzie to prywatna wirtualna sieć. Będzie to połączenie sieciowe dostępne jedynie dla poszczególnych instancji UML. Pakiet usermode-utilities zawiera program uml_switch pozwalający na określenie końcowych punktów przełącznika.

Listing 3.4: Aktywowanie końcowych punktów dla przełącznika

(Jeśli ma pozostawać pierwszym planie)
$ uml_switch -unix ~/tmp/switch.sock

(Jeśli ma zostać na drugim planie)
$ uml_switch -unix ~/tmp/switch.sock &> ~/tmp/switch.log &

Kolejne polecenie uruchomi instancje UML na przełączniku. Wirtualny interfejs sieciowy będzie podłączony do procesu uml_switch i będzie korzystał z podanego adresu MAC.

Listing 3.5: Uruchamianie pierwszej instancji UML

$ linux ubd0=first_rootfs ubd1=first_swapfs eth0=daemon,10:00:01:02:00:00,,~/tmp/switch.sock

Wciąż można podłączyć wirtualną sieć do prawdziwej lub połączyć je kolejnym procesem.

Listing 3.6: Uruchamianie drugiej instancji UML

$ linux ubd0=second_rootfs ubd1=second_swapfs eth0=daemon,10:00:01:02:00:01,,~/tmp/switch.sock \
eth1=tuntap,,,192.168.1.43

Więcej informacji o konfiguracji tuntap znajduje się w poprzednim rozdziale.

4.  Testowanie .iso

Być może ideałem testowania Gentoo Linux byłoby uruchamianie .iso w trybie użytkownika oraz kompletna instalacja Gentoo wewnątrz wirtualnego systemu.

Uruchomienie .iso albo initrd z obrazu .iso jest całkiem proste.

Listing 4.1: Uruchamianie ISO

# mount -o loop /path/to/install-<TAB>.iso /mnt/loop
# cp /mnt/loop/isolinux/gentoo.igz .
# 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=tuntap,,,192.168.0.254

Od tej pory wszystkie czynności wykonuje się tak jak opisano to w Podręczniku Instalacji Gentoo. Warto przy tym pamiętać, które urządzenia odpowiadają którym systemom plików: główny system to /dev/ubd/0, plik wymiany /dev/ubd/1, a napęd CDROM to /dev/ubd/2.

5.  Źródło



Drukuj

Zaktualizowano 1 marca 2008

Podsumowanie: Poradnik przedstawia problematykę wirtualnego systemu oraz prezentuje sposób instalacji i wykrywania potencjalnie niebezpiecznych dla systemu błędów.

Grant Goodyear
Redaktor

John Davis
Redaktor

Sven Vermeulen
Redaktor

Benny Chuang
Redaktor

Paweł Drobek
Tłumacz

Donate to support our development efforts.

Support OSL
Gentoo Centric Hosting: vr.org
Tek Alchemy
SevenL.net
Global Netoptex Inc.
Bytemark
Online Kredit Index
Copyright 2001-2009 Gentoo Foundation, Inc. Questions, Comments? Contact us.