Gentoo Linux Developer's gids voor systeemtests met UserMode Linux
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
# make linux
# 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
# 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
|
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.
The contents of this document are licensed under the Creative Commons -
Attribution / Share Alike license.
|