Differences

This shows you the differences between two versions of the page.

Link to this comparison view

so2:resurse:masini-virtuale [2017/02/21 14:46]
razvan.deaconescu [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ă+
-  * 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 argumentgit va clona doar ultima versiune a surselornu tot istoricul din repositorydeci nu veți avea acces la commit-urile precedente
-Resolving cdn.kernel.org (cdn.kernel.org)... 151.101.64.69151.101.128.69151.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-uluiaceastă 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 voastreasiguraț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 88: 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 =====
Line 98: Line 141:
   * **Q**: Cum închid aplicația ''​minicom''?​   * **Q**: Cum închid aplicația ''​minicom''?​
   * **A**: Folosind combinația de taste ''​Ctrl+a''​ și apoi, separat, ''​x''​. Apoi vă apare promptul de închidere a aplicației ''​minicom''​.   * **A**: Folosind combinația de taste ''​Ctrl+a''​ și apoi, separat, ''​x''​. Apoi vă apare promptul de închidere a aplicației ''​minicom''​.
 +
 +  * **Q**: De ce apare urmatorul mesaj cand ma conectez prin ssh la masina virtuala?
 +<​code>​
 +ssh root@172.20.0.2
 +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 +@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! ​    @
 +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 +IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
 +Someone could be eavesdropping on you right now (man-in-the-middle attack)!
 +It is also possible that a host key has just been changed.
 +The fingerprint for the ECDSA key sent by the remote host is
 +SHA256:​DijYADI/​vj9Q5FAZPaPxqxh7BjpwQECvhuQGBcW433w.
 +Please contact your system administrator.
 +Add correct host key in /​home/​tavi/​.ssh/​known_hosts to get rid of this message.
 +Offending ECDSA key in /​home/​tavi/​.ssh/​known_hosts:​50
 +  remove with:
 +  ssh-keygen -f "/​home/​tavi/​.ssh/​known_hosts"​ -R 172.20.0.2
 +ECDSA host key for 172.20.0.2 has changed and you have requested strict checking.
 +Host key verification failed.
 +</​code>​
 +  * **A**: Datorită faptului ca nu se folosește storage persistent, cheia mașinii se regenerează la fiecare boot. Clientul de ssh salveaza cheia când se conectează prima dată, iar la următorul reboot, cheia se va schimba și va cauza clientul de ssh să genereze eroarea de mai sus. Folosiți următoarea comandă pentru a evita această problemă:
 +''​ssh root@172.20.0.2 -o UserKnownHostsFile=/​dev/​null -o StrictHostKeyChecking=no''​
so2/resurse/masini-virtuale.1487681218.txt.gz · Last modified: 2017/02/21 14:46 by razvan.deaconescu
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0