Ghidul Dezvoltatorului Gentoo Linux pentru Testarea Sistemului cu User-Mode Linux
1.
Obţinerea User-Mode Linux
După cum scrie pe pagina user-mode linux
(http://user-mode-linux.sourceforge.net) , user-mode linux permite
unui utilizator să "ruleze Linux în interiorul lui". În special, user-mode
linux oferă o maşină virtuală în care un utilizator poate "[r]ula
programe instabile, experimenta noi versiuni de kernel Linux sau distribuţii,
şi poate afla funcţionarea internă a sistemului Linux, toate acestea
fără a risca avarierea sitemului principal Linux." Modificări experimentale ale
pachetelor principale Gentoo cum ar fi sys-apps/baselayout sau
sys-libs/glibc au un potenţial de a distruge sistemul şi al aduce
într-o stare în care nu mai poate fi pornit; cu ajutorul user-mode linux
putem testa modificările fără a ne îngrijora de integritatea sistemului
principal.
Majoritatea versiunilor de kernel 2.6 au suport pentru UML. Deşi puteţi
utiliza sursele dvs. curente de kernel, ar fi mai înţelept să vă
păstraţi ramurile de kernel UML într-o locaţie separată. La urma urmei,
veţi compila un kernel cu o configuraţie diferită şi veţi vrea să
aveţi sisteme eterogene în sistemul dvs. principal de Linux (mai multe
kerne-uri UML diferite).
Deci, descărcaţi o serie de surse de kernel (ca cea vanilla de la kernel.org) şi extrageţi-o într-o
locaţie utilizată pentru dezvoltare.
Urmează configurarea acestui kernel UML aşa cum aţi face-o pentru orice
alt sistem, dar adăugaţi ARCH=um pentru ca aplicaţia de compilare a
kernel-ului să interpreteze faptul că acest kernel trebuie să ruleze ca
un proces de sine stătător în sistemul părinte.
Cod 1.1: Compilarea kernel-ului UML |
# cd /srv/aegis/src/uml-linux
# make menuconfig
# make linux
# cp linux /usr/local/bin/linux
|
Atenţie:
Partea ARCH=um este extrem de importantă!
|
Asiguraţi-vă că /usr/local/bin există. Modificaţi
/etc/env.d/00basic în aşa fel încăt variabila PATH să
conţină /usr/local/bin şi rulaţi din nou env-update:
Cod 1.2: Modificarea 00basic |
# nano -w /etc/env.d/00basic
# env-update
# source /etc/profile
|
Pentru ca kernelul user-mode linux să încarce corespunzător un sistem
Gentoo kernelul trebuie să fie configurat să nu monteze implicit
automat /dev (devfs). De asemenea, foarte probabil veţi dori ca
suportul pentru tmpfs ("Virtual Memory Filesystem") să fie compilat
în kernel, întrucât script-ul de pornire al Gentoo linux stochează
informaţiile lui intr-o mică partiţie tmpfs. (Imaginea de kernel binară
disponibilă pe pagina oficiala user-mode linux mount-ează automat
/dev, şi nu conţine tmpfs compilat; nu vă deranjaţi
utilizându-l).
Recomand imperios citirea documentaţiei user-mode linux, dar idea de bază
este că, rulând programul /usr/local/bin/linux, el porneşte
kernel-ul user-mode linux şi încearcă să iniţializeze sistemul stocat
în fişierul root_fs care ar trebui să se afle în directorul
de lucru curent.
Nu strică să intalaţi, de asemenea, utilitarele user-mode linux.
Cod 1.3: Instalarea utilitarelor UML |
# emerge sys-apps/usermode-utilities
|
Aceste utilitare uşurează protocolul de reţea (printre alte) dintre
sistemul virtual user-mode linux şi sistemul gazdă Linux.
2.
Creearea root_fs
Creearea Gentoo chroot
Fişierul root_fs necesar pentru user-mode linux este un singur
fişier care conţine un întreg sistem de fişiere Gentoo Linux. Pentru a
genera acest fişier aveţi nevoie ca dispozitivul Loopback să fie
disponibil în kernelul sistemul gazdă (cel non-user-mode).
Crearea fişierului root_fs va fi ultimul pas pe care îl vom
efectua. Mai întâi vom genera un sistem de fişiere Gentoo într-un mediu
chroot normal. Avem nevoie de arhivele tar stage, care pot fi descărcate
separat sau extrase pe de mediu Installation CD, sau extrase dintr-un fişier
.iso al mediului Installation CD.
Cod 2.1: Mount-area unui fişier .iso Installation CD |
# mkdir /mnt/loop
# mount -o loop /calea/catre/install-<TAB>.iso /mnt/loop
|
Setarea mediului chroot este aproape identică cu cea din instalarea unui
Gentoo Linux obişnuit.
Cod 2.2: Crearea unui mediu chroot Gentoo pentru a putea fi mount-at |
# mkdir /mnt/gentoo
# cd /mnt/gentoo
# tar xvjpf /cale/catre/stage<TAB>.tar.bz2
|
Demount-aţi fişierul .iso. De acum nu mai aveţi nevoie de el.
Porniţi procesul de bootstrap şi instalare a sistemului în mod normal:
efectuaţi chroot în directorul /mnt/gentoo şi urmaţi
instrucţiunile de instalare Gentoo :)
Adăugaţi orice alt pachet de care aveţi nevoie. Puteţi chiar să-i daţi
un nume sistemului dumneavoastră vitual Gentoo. În /etc/fstab
cel mai probabil va trebui ca /dev/ROOT sa fie
/dev/ubda, cu un tip fs ext2, ext3, sau reiserfs. Modificaţi ca
/dev/SWAP să fie /dev/ubdb, şi comentaţi
/dev/BOOT.
În acest moment nu uitaţi să definiţi parola de root.
Cod 2.3: Definirea parole de root |
# passwd
|
Acum, trebuie să efectuăm unele modificări script-urilor de boot.
Ştergeţi consolefont şi keymaps din nivelul de execuţie boot:
Cod 2.4: Ştergerea script-urilor de iniţializare care nu sunt necesare |
# rc-update del consolefont boot
# rc-update del keymaps boot
|
Ieşiţi din mediul chroot, demount-aţi tot ce aţi mount-at anterior,
arhivaţi noua distribuţie Gentoo, iar apoi ştergeţi fişierele.
Cod 2.5: Finalizarea instalării |
# cd /mnt/gentoo
# tar cvjpf ~/gentoo.tbz2 *
# cd
# rm -rf /mnt/gentoo
|
Crearea root_fs
Mediul chroot Gentoo pe care îl avem noi are aproape 300 MB, de aceea
root_fs trebuie să aibă cel puţin acea dimensiune. Vom alege
0.5 GOcteţi ca fiind o dimensiune rezonabilă.
Cod 2.6: Crearea fişierelor 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
|
Ar fi de asemenea frumos să aveţi o partiţie swap de 0.5 GOcteţi.
Cod 2.7: Crearea partiţie swap |
# dd if=/dev/zero of=swap_fs seek=500 count=1 bs=1M
# mkswap -f swap_fs
|
Acum vedeţi dacă merge!
Cod 2.8: Pornirea kernelului UML |
# linux ubd0=root_fs ubd1=swap_fs
|
Notă:
User-mode linux foloseşte terminale xterm pentru consolele virtuale care sunt
rulate în momentul pornirii sistemului, deci trebuie să vă asiguraţi că
terminalul din care rulaţi user-mode linux are variabila $DISPLAY definită
(împreună cu permisiunile xhost/xauth adecvate).
|
Cu puţin noroc ar trebui să vă puteţi inregistra în noul sistem Gentoo
user-mode linux. Singurul lucru care impiedică acestă vesiune de user-mode
linux să fie funcţională este legătură de reţea dintre maşina
virtuală şi maşina gazda.
3.
Reţeaua
Utilizarea unei Reţele deja Existentă
Asiguraţi-vă că imaginea de kernel a sistemului gazdă are următoarele
setări compilate ca module:
Cod 3.1: Configurarea imaginii de kernel pentru sistemul gazdă |
Networking -->
IP: Netfilter Configuration -->
IP tables support -->
Full NAT -->
<M> MASQUERADE target support
Network Device Support -->
<M> TUN/TAP Support
|
Rulaţi următoarele comenzi pe maşina gazdă:
Cod 3.2: Setarea reţelei |
# modprobe tun
# modprobe iptable_nat
# iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
# echo 1 > /proc/sys/net/ipv4/ip_forward
|
Linia iptables defineşte mascarada IP dintre reţeaua privată în care se
va afla sistemul user-mode şi internetul (accesat via eth0 în cazul
nostru). Linia cu echo activează înaintarea pachetelor între reţeau
privată şi interfaţa la care este conectată poarta de acces (eth0 pentru
noi).
Acum pornim sistemul user-mode linux şi vedem daca reţeaua este funcţională.
Cod 3.3: Porniţi 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
|
Pe sistemul user-mode am alocat interfeţei user-mode eth0 o adresă IP
privată 192.168.0.1 şi am pornit interfaţa. Gazda are IP adresa privată
IP 192.168.0.254, şi trimitem un mesaj echo (ping) să ne asiguram că
interfaţa este funcţională. Liniile route adaugă adresa gateway
implicită, adică sistemul gazdă, folosim scp pentru a obţine un
/etc/resolv.conf funţional (dacă este necesar), şi trimitem
un mesaj echo (ping) către www.gentoo.org pentru a ne asigura că
rezolvarea numelor funcţionează (şi în general accesul la internet) în
sistemul nostru user-mode. Acum sistemul user-mode poate folosi emerge
după bunul plac!
Utilizarea unei Reţele Virtuale
Înainte de a deveni prea încântat, aceasta nu este o reţea virtuală
privată. Este o reţea care este accesibilă doar din instanţele UML.
Pachetul usermode-utilities oferă un utilitar denumit
uml_switch ce defineşte punctele terminale ale comutării.
Cod 3.4: Activarea punctelor terminale ale unei comutări UML |
$ uml_switch -unix ~/tmp/switch.sock
$ uml_switch -unix ~/tmp/switch.sock &> ~/tmp/switch.log &
|
Pentru a porni instanţele UML pe acest comutator, rulaţi următoarea
comandă. Interfaţa dvs. (virtuală) de reţea va fi conectată la procesul
uml_switch şi va utiliza adresa MAC specificată.
Cod 3.5: Rularea primei instanţe UML |
$ linux ubd0=first_rootfs ubd1=first_swapfs eth0=daemon,10:00:01:02:00:00,,~/tmp/switch.sock
|
Încă vă mai puteţi conecta sistemul la reţeaua existentă, sau să
aveţi un al doilea proces ataşat atât la interfaţa virtuală cât şi la
cea existentă:
Cod 3.6: Rularea celei de-a doua instanţe 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
|
Mai multe informaţii despre setarea tuntap pot fi regăsite în secţiunea
anterioară.
4.
Testarea fişierului .iso
Poate, ceea ce este cel mai folositor pentru testarea sistemului Gentoo Linux
este pornirea fişierului .iso cu user-mode linux şi să finalizaţi
instalarea sistemului Gentoo din interiorul sistemului virtual user-mode linux.
Pornirea fişierului .iso, sai mai precis a imaginii initrd de pe fişierul
.iso, este destul de facilă:
Cod 4.1: Pornirea cu fişierul 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
|
Acum puteţi urma paşii din documentul de instalare a sistemului Gentoo,
exact cum sunt specificaţi, şi va mai trebui să ştiti că sistemul de
fişiere "root" va fi /dev/ubd/0, "partiţia" swap va fi
/dev/ubd/1, iar dispozitivul cdrom va fi/dev/ubd/2.
5.
Resurse
Conţinutul acestui document este publicat sub licenţa Creative Commons -
Attribution / Share Alike.
|