Gentoo Logo

Disclaimer : Dit document is niet juist en is niet meer onderhouden.


Gentoo Linux Developer's gids voor systeemtests met UserMode Linux

Inhoud:

1.  Verkrijgen van User-Mode Linux

Zoals de user-mode linux website (http://user-mode-linux.sourceforge.net) al vermeldt laat user-mode linux toe om "Linux in Linux" te draaien. Specifiek levert user-mode linux een virtuele machine waarin een gebruiker gevaarlijke software kan testen, experimenteren met nieuwe linux kernels of distributies, en rondneuzen in de interne zaken van linux, allemaal zonder je eigen Linux installatie naar de haaien te helpen. Aanpassingen aan Gentoo core packages, zoals sys-apps/baselayout of sys-libs/glibc hebben het gevaar dat ze het systeem onbruikbaar maken; met user-mode linux kunnen we deze aanpassingen testen zonder ons zorgen te maken over het verminken van het huidige systeem.

Het installeren van user-mode linux is essentieel identiek aan die van een gewone kernel. Allereerst moet je de kernel broncode downloaden (uiteraard met de nodige patches voor user-mode linux) en daarna moet je deze configureren zoals je gewend bent voor gewone kernels:

Codevoorbeeld 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

Waarschuwing: De ARCH=um argument is extreem belangrijk!

Belangrijk: Opdat de user-mode linux kernel correct een Gentoo systeem boot moet de kernel geconfigureerd zijn om niet automatisch /dev (devfs) te mounten. Je moet tevens tmpfs activeren (de "Virtual Memory Filesystem") en in de kernel compileren, aangezien de Gentoo linux bootscripts default in een kleine tmpfs-partitie hun informatie opslaan. De binaire kernels op de user-mode website mounten /dev wel automatisch en hebben geen tmpfs in hen zitten; ze zijn dus uitgesloten voor gebruik.

Ik raad ten zeerste aan om de user-mode linux documentatie te lezen, maar het basis-idee is om /usr/local/bin/linux uit te voeren, wat de kernel opstart en dat het systeem in root_fs probeert te booten; dit laatste bestand moet in de huidige directorie staan.

Het zal tevens geen zeer doen als je de user-mode linux tools installeert.

Codevoorbeeld 1.2:

# emerge sys-apps/usermode-utilities

Deze tools vereenvoudigen het netwerk-aspect (samen met andere zaken) tussen de user-mode linux virtuele systemen en het host Linux systeem.

2.  Aanmaken van root_fs

De Gentoo chroot aanmaken

Het root_fs bestand dat nodig is voor user-mode linux is een bestand dat het volledige Gentoo Linux bestandssysteem bevat. Om dit bestand aan te maken moet je de Loopback device support in je gewone kernel gecompileerd hebben.

Het creëren van root_fs zelf is onze laatste stap. Eerst zullen we een Gentoo Linux filesystem aanmaken in een ordinaire chroot. We hebben dus een stage-tarball nodig, die we ofwel zelf downloaden, of van een liveCD kopieren.

Codevoorbeeld 2.1: Een liveCD .iso mounten

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

Het opstellen van de chroot is essentieel identiek aan het installeren van een Gentoo Linux systeem.

Codevoorbeeld 2.2:

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

Unmount nu de .iso. We hebben die niet meer nodig.

Codevoorbeeld 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

Door /usr/portage/distfiles te bind-mounten, alsook /usr/portage/packages, laten we toe om zeer snel ons systeem klaar te maken indien de packages al beschikbaar waren op het host systeem.

Bootstrap en compileer het systeem zoals je gewend bent:

Codevoorbeeld 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

Waarschuwing: In het /etc/make.profile/packages moet virtual/bootloader verwijderd worden zodat deze niet meer vereist is voor het systeem (verwijder gewoon de "*" aan het begin van de "*virtual/bootloader" regel). De virtual/bootloader ebuild zal nl proberen om de /boot partitie te mounten, wat in onze chroot zal mislukken.

Nota: Zorg ervoor dat /etc/make.profile/packages en /usr/portage/profiles/package.mask alle packages die je wil testen niet als gemaskeerd aanduiden. Op dit moment is scripts/bootstrap.sh gemaakt om de bootstrap packages van broncode te compileren. Om al bestaande binaire packages te gebruiken, voeg je alias emege="emerge --usepkg" toe ergens bovenaan het bootstrap script.

Voeg packages toe naar je eigen smaak. Je mag tevens het virtuele Gentoo systeem een hostname geven als je dat wil. In /etc/fstab moet /dev/ROOT vervangen worden met /dev/ubd/0 met als fs-type ext2, ext3 of reiserfs. Vervang /dev/SWAP met /dev/ubd/1 en commentarieer /dev/BOOT.

Vergeet niet je root-paswoord in te stellen!

Codevoorbeeld 2.5: Het root wachtwoord instellen

# passwd

Ga uit de chroot-omgeving, unmount alle bind-mounts, maak een tar van de Gentoo installatie en ruim de boel op:

Codevoorbeeld 2.6:

# 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

Aanmaken van root_fs

Onze Gentoo chroot is bijna 300 MiB groot, dus root_fs moet minstens even groot zijn. We kiezen 0,5 GiB wat voldoende ruimte laat voor experimenten.

Codevoorbeeld 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

Het is tevens leuk om een 0,5 GiB swap-partitie te creëren.

Codevoorbeeld 2.8:

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

Kijk nu of dit werkt

Codevoorbeeld 2.9:

# linux ubd0=root_fs ubd1=swap_fs

Nota: User-mode linux gebruikt xterms als virtuele consoles die tijdens het booten aangemaakt worden, dus zorg ervoor dat de terminal van waaruit je user-mode linux draait een correcte $DISPLAY heeft (samen met de correcte xhost/xauth permissies).

Met wat geluk kan je nu inloggen op je user-mode linux Gentoo systeem. Het enige verschil tussen dit systeem en je werkelijk systeem wat betreft functionaliteit is het netwerk-aspect.

3.  Netwerk

Met dank aan Martin Schlemmer (Azarah) weet ik nu hoe je het netwerk werkende krijgt vanuit een user-mode linux systeem. Het idee is dat we een privaat netwerk opstellen bestaande uit de user-mode linux systemen en het host systeem, waarna het user-mode linux systeem alle pakketten naar het host-systeem stuurt, die ze op zich naar het internet doorstuurt. Zorg ervoor dat de host kernel "Networking --> IP: Netfilter Configuration --> IP tables suppoer --> Full NAT --> MASQUERADE target support en Network Device Support --> Ethertap network tap" in zich heeft. Voer nu de volgende commando's uit (de eerste 2 enkel indien je met modules werkt):

Codevoorbeeld 3.1:

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

De iptables regel stelt IP Masquerading in tussen het private netwerk waarop ons user-mode linux-systeem zal draaien en het internet (via eth0 in ons voorbeeld). De echo-regel activeert dan packet forwarding tussen het private netwerk en de interface dat als default gateway zal fungeren (eth0 hier).

We starten nu het user-mode linux systeem en kijken of het netwerk functioneert.

Codevoorbeeld 3.2:

# linux ubd0=root_fs ubd1=swap_fs eth0=ethertap,tap0,,192.168.0.254
(login to user-mode system)
# 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 (indien nodig)
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

Op het user-mode systeem geven we de eth0-interface het IP 192.168.0.1 en starten de interface op. De host heeft als privaat IP 192.168.0.254, en we pingen deze om te zien of het lokale netwerk werkt - wat hier het geval is. De route-regel stelt dan de default gateway in (namelijk het host-systeem), en we gebruiken scp om een werkende /etc/resolv.conf (indien nodig) binnen te halen. Hierna pingen we www.gentoo.org om te zien of DNS werkt in ons user-mode linux systeem - wat ook hier het geval is. Het user-mode linux systeem zal dus nu perfect gebruik kunnen maken van het emerge commando.

4.  De .iso testen

Het summum van het testen van Gentoo Linux is waarschijnlijk het bootan van de .iso met user-mode linux om zo een volledige Gentoo installatie te doen vanuit een user-mode linux virtueel systeem.

Het booten van de .iso, of meer specifiek de initrd van de .iso, is zeer eenvoudig:

Codevoorbeeld 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

Je kan nu de Gentoo Installatie Handleiding tot in de puntjes volgen, alhoewel je wel moet weten dat de root bestandssysteem nu /dev/ubd/0 is, de swappartitie /dev/ubd/1 en de CD-ROM /dev/ubd/2.



Print

Upgedate op 30 September 2003

De originele versie van dit document wordt niet meer onderhouden

Korte inhoud: Deze gids toont aan Gentoo Linux ontwikkelaars hoe ze eenvoudig een user-mode linux kunnen aanmaken voor het testen van potentieel systeembrekende aanpassingen.

Grant Goodyear
Editor

John Davis
Editor

Sven Vermeulen
Translator

Tiemo Kieft
Translator

Donate to support our development efforts.

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