Testowanie środowiska z jądrem w trybie użytkownika (UML)
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
# make linux
# 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
# 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
# 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
|
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 |
$ uml_switch -unix ~/tmp/switch.sock
$ 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
Materiał udostępniany na podstawie licencji Creative Commons -
Attribution / Share Alike.
|