This shows you the differences between two versions of the page.
so2:resurse:masini-virtuale [2017/03/03 12:19] octavian.purdila [Probleme frecvente] |
so2:resurse:masini-virtuale [2019/03/16 09:46] (current) razvan.deaconescu [Rularea mașinii] |
||
---|---|---|---|
Line 5: | Line 5: | ||
Mașina virtuală este un setup bazat pe qemu. Ea nu include facilități pentru a edita, compila și depana module, deci va trebui să faceți acest lucru pe mașina fizică. Mașina virtuală doar rulează un kernel minimal, modulele voastre și eventuale programe de test. | Mașina virtuală este un setup bazat pe qemu. Ea nu include facilități pentru a edita, compila și depana module, deci va trebui să faceți acest lucru pe mașina fizică. Mașina virtuală doar rulează un kernel minimal, modulele voastre și eventuale programe de test. | ||
- | Pentru a rula mașina virtuală veți avea nevoie de o mașină Linux cu următoarele pachete: | + | Pentru a rula mașina virtuală și pentru a putea compila și folosi module de kernel veți avea nevoie de o mașină Linux la care să aveți un utilizator cu permisiuni de ''root''/''sudo'' și pe care să instalați următoarele pachete: |
- | * build-essential | + | * ''flex'' |
- | * qemu | + | * ''bison'' |
- | * kvm | + | * ''build-essential'' |
- | + | * ''gcc-multilib'' | |
- | Descărcați mașina virtuală de la: [[https://github.com/tavip/qemu-so2]]: | + | * ''libncurses5-dev'' |
+ | * ''qemu-system-x86'' | ||
+ | * ''qemu-system-arm'' | ||
+ | * ''qemu-kvm'' | ||
+ | * ''python3'' | ||
+ | * ''minicom'' | ||
+ | Pentru instalarea pachetelor pe un sistem Debian/Ubuntu, veți rula comanda: | ||
<code> | <code> | ||
- | git clone https://github.com/tavip/qemu-so2.git | + | sudo apt update |
+ | sudo apt install -y flex bison build-essential gcc-multilib libncurses5-dev qemu-system-x86 qemu-system-arm qemu-kvm python3 minicom | ||
</code> | </code> | ||
- | Directorul numit ''qemu-so2'' conține: | + | Mașina virtuală este integrată într-un repo ce conține și sursele kernel-ului Linux: [[https://github.com/linux-kernel-labs/linux]]: |
- | * un ''Makefile''; rulați ''make'' pentru a construi imaginea mașinii virtuale; | + | |
- | * ''busybox'', pentru utilitare de bază în mașina virtuală; | + | |
- | * server ssh (dropbear) compilat static | + | |
- | * alte fișiere necesare rulării mașinii virtuale vor fi create la prima rulare a ''make''; nu este nevoie să le modificați. | + | |
- | + | ||
- | Înainte de a folosi mașina virtuală este necesar sa descărcați, compilați și creați link-uri simbolice către imaginea de kernel ce va fi folosită de către mașina virtuală: | + | |
<code> | <code> | ||
- | $ make setup-bzImage | + | git clone https://github.com/linux-kernel-labs/linux.git |
+ | </code> | ||
- | ~/src/qemu-so2$ make setup-bzImage | + | <note> |
- | ./setup-bzImage.sh | + | Puteți accelera clonarea repository-ului folosind argumentul ''%%--%%depth=1'' pentru comanda ''git''. |
- | --2017-02-19 14:36:40-- https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.9.11.tar.xz | + | Cu acest argument, git va clona doar ultima versiune a surselor, nu tot istoricul din repository, deci nu veți avea acces la commit-urile precedente. |
- | Resolving cdn.kernel.org (cdn.kernel.org)... 151.101.64.69, 151.101.128.69, 151.101.192.69, ... | + | </note> |
- | Connecting to cdn.kernel.org (cdn.kernel.org)|151.101.64.69|:443... connected. | + | |
- | HTTP request sent, awaiting response... 200 OK | + | |
- | Length: 93211324 (89M) [application/x-xz] | + | |
- | Saving to: ‘linux-4.9.11.tar.xz’ | + | |
- | linux-4.9.11.tar.xz 100%[========================================================================================>] 88,89M 10,9MB/s in 8,3s | + | Pe lângă sursele kernel-ului, această mașină virtuală conține fișierele necesare pentru desfășurarea laboratorului (schelete de cod) și configurația mașinii virtuale de qemu, în directorul ''tools/labs/''. |
- | 2017-02-19 14:36:48 (10,7 MB/s) - ‘linux-4.9.11.tar.xz’ saved [93211324/93211324] | + | Directorul ''tools/labs/'' conține: |
+ | * un ''Makefile'', pe care il vom folosi pentru a porni mașina virtuală și pentru a genera scheletele de cod pentru laborator. | ||
+ | * un director ''qemu/'', ce conține script-uri necesare pentru mașina virtuală și un fișier de configurare folosit pentru compilarea kernel-ului din surse (''qemu/kernel_config.x86''). | ||
+ | * un director ''templates/'', care conține fișierele din care se generează scheletele de laborator. | ||
+ | * dupa prima pornire a mașinii virtuale, o imagine a unui sistem de fișiere, generată folosind ''Yocto''. | ||
- | make[1]: Entering directory '/home/tavi/src/linux-4.9.11' | + | Următoarele imagini de sistem de fișiere sunt disponibile (cea folosită se specifică în ''qemu/Makefile''): |
- | HOSTCC scripts/basic/fixdep | + | * ''core-image-minimal-qemu'' |
- | HOSTCC scripts/kconfig/conf.o | + | * ''core-image-minimal-dev-qemu'' |
- | SHIPPED scripts/kconfig/zconf.tab.c | + | * ''core-image-sato-dev-qemu'' |
- | SHIPPED scripts/kconfig/zconf.lex.c | + | * ''core-image-sato-qemu'' |
- | SHIPPED scripts/kconfig/zconf.hash.c | + | * ''core-image-sato-sdk-qemu'' |
- | HOSTCC scripts/kconfig/zconf.tab.o | + | |
- | HOSTLD scripts/kconfig/conf | + | ===== Rularea mașinii ===== |
- | scripts/kconfig/conf --olddefconfig Kconfig | + | |
- | # | + | |
- | # configuration written to .config | + | |
- | # | + | |
- | make[1]: Leaving directory '/home/tavi/src/linux-4.9.11' | + | |
- | make[1]: Entering directory '/home/tavi/src/linux-4.9.11' | + | |
- | scripts/kconfig/conf --silentoldconfig Kconfig | + | |
- | SYSTBL arch/x86/entry/syscalls/../../include/generated/asm/syscalls_32.h | + | |
- | ... | + | |
- | </code> | + | |
- | Pentru rularea mașinii virtuale folosiți: | + | Mașina virtuală se pornește rulând comanda ''make boot'' în directorul ''tools/labs/''. Prima rulare a acestei comenzi va dura mai mult, deoarece se va compila kernel-ul (din sursele existente în același repo, folosind config-ul din ''tools/labs/qemu/kernel_config.x86'') și se va descărca imaginea sistemului de fișiere specificată in ''tools/labs/qemu/Makefile''. |
<code> | <code> | ||
- | make | + | ~/src/linux/tools/labs$ make boot |
+ | ARCH=x86 qemu/qemu.sh -kernel zImage.x86 -device virtio-serial \ | ||
+ | -chardev pty,id=virtiocon0 -device virtconsole,chardev=virtiocon0 \ | ||
+ | -net nic,model=virtio,vlan=0 -net tap,ifname=tap0,vlan=0,script=no,downscript=no\ | ||
+ | -drive file=rootfs.img,if=virtio,format=raw --append "root=/dev/vda console=hvc0" \ | ||
+ | --display none -s | ||
+ | char device redirected to /dev/pts/19 (label virtiocon0) | ||
</code> | </code> | ||
- | Pentru rularea mașinii virtuale fără mode "grafic" folosiți: | + | <note important> |
+ | Implicit, ''qemu'' pornește mașina virtuală fără suport grafic, deci nu veți avea un prompt. Pentru suport grafic, trebuie să setați variabila de mediu ''QEMU_DISPLAY'': | ||
<code> | <code> | ||
- | QEMU_DISPLAY=none make | + | QEMU_DISPLAY=sdl make boot |
</code> | </code> | ||
+ | </note> | ||
- | Fișierele pe care vreți să le puneți în mașina virtuală vor trebui puse în directorul ''fsimg/root''. Ele vor fi accesibile în mașina virtuală din directorul ''/root''. Pentru a automatiza copierea în ''fsimg/root'' puteți adăuga un target în makefile-ul modulului, sau puteți crea symlink-uri. | + | <note tip> |
- | + | La prompt-ul de login, folosiți utilizatorul ''root'', fără parolă. | |
- | <note> | + | |
- | GNU Make nu se pricepe prea bine la dependency tracking pe symlink-uri. Dacă alegeți să faceți symlink-uri în ''fsimg/root'' către fișierele voastre, asigurați-vă că imaginea este reconstruită de fiecare dată. Cel mai simplu este să faceți target-ul ''initrd.cpio'' phony. Generarea imaginii durează doar câteva secunde. | + | |
</note> | </note> | ||
- | Veți compila modulele de kernel și programele de test pe mașina fizică. Dacă aveți un sistem pe 64 de biți, folosiți flag-ul ''-m32'' pentru gcc, pentru a genera binare pe 32 de biți. De asemenea, folosiți opțiunea ''-static'' pentru programele de test. | + | Veți compila modulele de kernel și programele de test pe mașina fizică. Dacă aveți un sistem pe 64 de biți, folosiți flag-ul ''-m32'' pentru gcc, pentru a genera binare (module, executabile de rulat în user mode) pe 32 de biți. De asemenea, folosiți opțiunea ''-static'' pentru programele de test care vor rula în user mode. |
- | ===== Inspectare informații din mașina virtuală ===== | + | ===== Interacțiunea cu mașina virtuală ===== |
- | Dacă aveți multe mesaje afișate în mașina virtuală puteți folosi combinațiile de taste ''Shift+PgUp'', respectiv ''Shift+PgDn'' pentru a parcurge output-ul (//scrolling//) din consolă. | + | Dacă aveți multe mesaje afișate în mașina virtuală (în modul grafic) puteți folosi combinațiile de taste ''Shift+PgUp'', respectiv ''Shift+PgDn'' pentru a parcurge output-ul (//scrolling//) din consolă. |
În afară de consola din modul grafic, setup-ul mașinii virtuale oferă o consolă adițională prin intermediul unui "pty - pseudoterminal interface". Atunci când mașina virtuală este pornită căutați un mesaj de genul: | În afară de consola din modul grafic, setup-ul mașinii virtuale oferă o consolă adițională prin intermediul unui "pty - pseudoterminal interface". Atunci când mașina virtuală este pornită căutați un mesaj de genul: | ||
Line 89: | Line 87: | ||
</code> | </code> | ||
+ | De asemenea, un link simbolic este creat cu numele ''serial.pts'' către acest fișiere, așa că îl puteți folosi pe oricare. | ||
Vă puteți conecta la această consolă folosind minicom sau screen: | Vă puteți conecta la această consolă folosind minicom sau screen: | ||
<code> | <code> | ||
- | $ minicom -D /dev/pts/20 | + | $ minicom -D serial.pts |
</code> | </code> | ||
+ | |||
+ | <note> | ||
+ | Folosind consola adițională, puteți folosi consola mașinii virtule direct dintr-un terminal de pe mașina fizică, fără a avea nevoie de suportul grafic al ''qemu''. | ||
+ | </note> | ||
+ | |||
+ | Mașina virtuală are și suport de networking, așa că puteți folosi ''ssh'' pentru a vă conecta la ea după ce ați aflat adresa IP. | ||
+ | Imaginea de sistem de fișiere de bază (minimal) nu are suport de networking, va trebui sa folosiți, de exemplu, ''core-image-sato-dev-qemu'' (modificați variabila ''YOCTO_IMAGE'' în ''qemu/Makefile''). | ||
+ | |||
+ | <code> | ||
+ | $ minicom -D serial.pts | ||
+ | |||
+ | Poky (Yocto Project Reference Distro) 2.3 qemux86 /dev/hvc0 | ||
+ | |||
+ | qemux86 login: root | ||
+ | root@qemux86:~# ifconfig | ||
+ | eth0 Link encap:Ethernet HWaddr 52:54:00:12:34:56 | ||
+ | inet addr:172.20.0.6 Bcast:172.20.0.255 Mask:255.255.255.0 | ||
+ | UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 | ||
+ | RX packets:41 errors:0 dropped:0 overruns:0 frame:0 | ||
+ | TX packets:6 errors:0 dropped:0 overruns:0 carrier:0 | ||
+ | collisions:0 txqueuelen:1000 | ||
+ | RX bytes:7578 (7.4 KiB) TX bytes:1296 (1.2 KiB) | ||
+ | |||
+ | lo Link encap:Local Loopback | ||
+ | inet addr:127.0.0.1 Mask:255.0.0.0 | ||
+ | inet6 addr: ::1%134535719/128 Scope:Host | ||
+ | UP LOOPBACK RUNNING MTU:65536 Metric:1 | ||
+ | RX packets:0 errors:0 dropped:0 overruns:0 frame:0 | ||
+ | TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 | ||
+ | collisions:0 txqueuelen:1000 | ||
+ | RX bytes:0 (0.0 B) TX bytes:0 (0.0 B) | ||
+ | |||
+ | $ ssh root@172.20.0.6 | ||
+ | The authenticity of host '172.20.0.6 (172.20.0.6)' can't be established. | ||
+ | RSA key fingerprint is SHA256:CW1opJUHi4LDt1lnKjBVv12kXZ4s+8rreMBm5Jsdm00. | ||
+ | Are you sure you want to continue connecting (yes/no)? yes | ||
+ | Warning: Permanently added '172.20.0.6' (RSA) to the list of known hosts. | ||
+ | root@qemux86:~# | ||
+ | </code> | ||
+ | |||
+ | ===== Recompilarea imaginii de kernel ===== | ||
+ | |||
+ | Imaginea kernel-ului Linux este compilată automat la prima pornire a mașinii virtuale. Pentru a recompila această imagine, este necesar să ștergeți fișierul ''zImage'' și să rulați target-ul de ''make'' ''zImage'' (sau să porniți mașina virtuală din nou). | ||
===== Probleme frecvente ===== | ===== Probleme frecvente ===== |