Mașina virtuală

Desfășurarea laboratorului și testarea temelor pentru Sisteme de Operare 2 se realizează cu ajutorul unei mașini virtuale. Recomandăm descărcarea acesteia și folosirea sa pentru pregătirea și aprofundarea laboratorului și pentru implementarea și verificarea temelor.

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ă ș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:

  • flex
  • bison
  • build-essential
  • gcc-multilib
  • libncurses5-dev
  • qemu-system-x86
  • qemu-system-arm
  • qemu-kvm
  • python3
  • minicom

Pentru instalarea pachetelor pe un sistem Debian/Ubuntu, veți rula comanda:

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

Mașina virtuală este integrată într-un repo ce conține și sursele kernel-ului Linux: https://github.com/linux-kernel-labs/linux:

git clone https://github.com/linux-kernel-labs/linux.git

Puteți accelera clonarea repository-ului folosind argumentul --depth=1 pentru comanda git. 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.

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/.

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.

Următoarele imagini de sistem de fișiere sunt disponibile (cea folosită se specifică în qemu/Makefile):

  • core-image-minimal-qemu
  • core-image-minimal-dev-qemu
  • core-image-sato-dev-qemu
  • core-image-sato-qemu
  • core-image-sato-sdk-qemu

Rularea mașinii

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.

~/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)

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:

QEMU_DISPLAY=sdl make boot

La prompt-ul de login, folosiți utilizatorul root, fără parolă.

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.

Interacțiunea cu mașina virtuală

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:

char device redirected to /dev/pts/20 (label virtiocon0)

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:

$ minicom -D serial.pts 

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.

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).

$ 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:~#

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

  • 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.
  • Q: De ce apare urmatorul mesaj cand ma conectez prin ssh la masina virtuala?
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.
  • 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.txt · Last modified: 2019/03/16 09: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