QEMU - πόσο λειτουργικό είναι?

Raoul raoul at raoul.shacknet.nu
Thu Jun 8 06:53:46 EEST 2006


On Wed, 2006-06-07 at 11:20 +0300, Nick Demou wrote: 
> Είδα κάποιες αναφορές στην λίστα σχετικά με το QEMU και ήθελα να μάθω
> αν δουλευοντας το με guest windows 2000 ή XP βλέπετε να έχει κάποια
> σοβαρή έλειψη ή παραξενιά ή αν  από τι στιγμή που θα εγκατασταθεί και
> θα ρυθμιστεί σωστά είναι "easy going".

Ασχολήθηκα κι εγώ με το qemu πριν κάμποσο καιρό. Αφού μάθει κανείς
κάποια πράγματα για τα options και αφού οργανωθεί με μερικά scripts,
τότε όλα είναι κομπλέ. Πάντως, είναι απαραίτητη η χρήση του kqemu
accelerator kernel module για αυξημένη απόδοση, οπότε το compilation δεν
το γλυτώνει κανείς με κάθε αλλαγή πυρήνα.

Το σύστημά μου είναι πολύ αργό για τα σημερινά δεδομένα, οπότε τα
γραφικά περιβάλλοντα παίζουν χάλια και δεν έχω άποψη σχετικά. Για
win2000 δες και αυτό το λινκ:
http://fabrice.bellard.free.fr/qemu/qemu-doc.html#SEC35


Εκεί που θέλω να σταθώ είναι η δικτύωση, στην οποία αναφέρθηκες κάπου
στο μήνυμά σου, μεταξύ των virtual machines και του host ή του
πραγματικού LAN γενικότερα. Εξ'ορισμού το qemu, αν δεν οριστούν
παράμετροι δικτύου, χρησιμοποιεί τα:
-net nic -net user
Αυτά δημιουργούν μια virtual κάρτα δικτύου στο virtual machine, αλλά το
qemu σ'αυτή την περίπτωση χρησιμοποιεί δικό του dhcp server και γενικά
δικό του network configuration, το οποίο είναι τελείως ανεξάρτητο από το
πραγματικό LAN. Με άλλα λόγια, η πρόσβαση σε services του virtual
machine από το πραγματικό LAN είναι αδύνατη, ενώ η πρόσβαση στο ιντερνετ
από το VM γίνεται μέσω του host χωρίς καμία απολύτως ρύθμιση.

Ο βασικός σκοπός μου ήταν να έχω τα virtual machines ως μέρη του
πραγματικού LAN, κυρίως για να ασχοληθώ πιο σχολαστικά με το networking
σε linux (κάποια στιγμή στο μέλλον). Με μπέρδεψε κάπως η δημιουργία ενός
virtual NIC με δικό του MAC address στο host machine, στο οποίο θα
συνδεόταν η virtual NIC του virtual machine. Αλλά τελικά αυτό
δημιουργείται από το qemu όταν φορτώνεται το virtual machine.
Επίσης, η πραγματοποίηση του παραπάνω setup δεν φαίνεται να μπορεί να
γίνει χρησιμοποιώντας NIC aliases. 


Γράφω τα παρακάτω για δύο λόγους:
1) για να διορθώσει κανείς πιθανά λάθη ή ελλείψεις
2) για βοηθηθεί κάποιος που θέλει να δικτυώσει τα VM όπως θα δικτύωνε
πραγματικούς υπολογιστές στο δίκτυό του.



ΓΕΝΙΚΑ

1) Για την πραγματοποίηση του παραπάνω θα πρέπει το QEMU να φορτωθεί
τουλάχιστον με τα παρακάτω options:
-net nic -net tap
Αυτά δημιουργούν μια virtual NIC στο VM και μια άλλη virtual NIC στον
host και τις συνδέει μεταξύ τους.

2) Για τη δημιουργία της virtual NIC στον host χρειάζεται το kernel
module "tun". Αφού φορτωθεί αυτό, δημιουργείται το device
node /dev/net/tun. Θα πρέπει ο χρήστης που θα φορτώσει το qemu να έχει
read/write πρόσβαση σ'αυτό το device node.

3) Για τη ρύθμιση του δικτύου, το qemu, όταν φορτώνεται με "-net tap",
ψάχνει για το script /etc/qemu-ifup.

4) Οι εντολές που περιέχονται στο παραπάνω script αφορούν στην ρύθμιση
του δικτύου και πρέπει να εκτελούνται από χρήστη με root priviledges,
οπότε είναι απαραιτητη η προσθήκη του χρήστη που θα τρέξει το qemu στους
sudoers.


 
ΠΡΟΕΤΟΙΜΑΣΙΑ

Για τη σύνδεση του/των virtual machines στο υπάρχον LAN, θα πρέπει η
πραγματική NIC και όλες οι virtual NICs στον host να ανήκουν σε κάποιο
bridge, το οποίο συνδέεται στο πραγματικό LAN.
Το παρακάτω script, ας πούμε με όνομα qemu-host-network-setup,
προετοιμάζει τον host για να τρέξει το qemu, δημιουργεί το bridge br0
και προσαρτά την πραγματική NIC (eth0) στο bridge.

Το brctl ανήκει στο πακετο bridge-utils (σε fedora τουλάχιστον)

======== /etc/qemu-host-network-setup ===========
#!/bin/bash

mknod -m 0666 /dev/kqemu c 250 0
/sbin/modprobe -v kqemu

echo 1024 > /proc/sys/dev/rtc/max-user-freq

/sbin/modprobe -v tun
chmod 0666 /dev/net/tun

/sbin/ifdown eth0
/usr/sbin/brctl addbr br0
/usr/sbin/brctl addif br0 eth0
/sbin/ifconfig eth0 0.0.0.0 up

# Το 192.168.0.23 είναι παράδειγμα και είναι η IP του host
/sbin/ifconfig br0 192.168.0.23 up
# To 192.168.0.254 είναι το gateway του LAN (ΙΣΩΣ ΝΑ ΜΗΝ ΧΡΕΙΑΖΕΤΑΙ)
/sbin/route add default gw 192.168.0.254
============================================

Φτιάχνουμε και ένα script για επαναφορά του network configuration του
host στην αρχική κατάσταση:

============ /etc/qemu-host-network-revert ============
#!/bin/bash
/usr/sbin/brctl delif br0 eth0
/sbin/ifconfig eth0 down
/sbin/ifconfig br0 down
/usr/sbin/brctl delbr br0
/sbin/ifup eth0
==============================

Το παραπάνω αφαιρεί το eth0 από την bridge br0, απενεργοποιεί τα eth0
kai br0, σβήνει το bridge br0 και τέλος ενεργοποιεί το eth0 interface με
το κανονικό network-script του συστήματος.



ΕΚΚΙΝΗΣΗ ΤΟΥ VIRTUAL MACHINE 

Όπως αναφέρθηκε παραπάνω, για τη ρύθμιση του δικτύου, το qemu, όταν
φορτώνει, ψάχνει για το script /etc/qemu-ifup.
Το script /etc/qemu-host-network-setup έχει ήδη δημιουργήσει το bridge
br0 και έχει προσαρτήσει σ'αυτη την πραγματική NIC eth0 του host.
Το qemu, όταν ξεκινάει με τα options:
-net nic -net tap
δημιουργεί μια virtual NIC στον host (tap0) και τη συνδέει με την
virtual NIC του virtual machine. Οπότε το μόνο που χρειάζεται να κάνει
το script /etc/qmu-ifup είναι η προσθήκη της tap0 στο bridge br0.

========== /etc/qemu-ifup ===============
#!/bin/bash
sudo /sbin/ifconfig $1 0.0.0.0 promisc up
sudo /usr/sbin/brctl addif br0 $1
=========================================

Το $1 θα αντικατασταθεί από το tap0 (ή tap1, tap2 κτλ) όταν φορτώνεται
το qemu. Όταν κλείνει το virtual machine, τότε το tap0 αφαιρείται
αυτόματα από το bridge br0.

Η χρήση του $1 δεν αναφέρεται πουθενά, αλλά υπάρχει σε ένα sample
qemu-ifup script στο linux-test image στο site του QEMU.

Τέλος φορτώνουμε το virtual machine, πχ με το παρακάτω:

qemu -net nic -net tap debian.img



ΣΥΝΟΠΤΙΚΑ

Για την εκκίνηση του virtual machine, ώστε να είναι μέρος του
πραγματικού δικτύου χρειάζεται:

sudo /etc/qemu-host-network-setup
qemu -net nic -net tap debian.img

Αφού κλείσουμε το qemu, επαναφέρουμε το network configuration toy host
me το script:

sudo /etc/qemu-host-network-revert


Στο forum του QEMU υπάρχει αυτό το ποστ:
http://qemu.dad-answers.com/viewtopic.php?p=5072&
Κάνει ακριβώς τα ίδια, με τη διαφορά ότι η δημιουργία του bridge κτλ
είναι ενσωματωμένη στο /etc/qemu-ifup. Αυτό βολεύει για ένα virtual
machine, αλλά όταν πρόκειται να φορτώσει κανείς περισσότερα VM, τότε
είναι ανεπαρκές.

Το πρόβλημα που είχα ήταν η δημιουργία του virtual NIC tap0 στον host.
Προσπαθούσα να το δημιουργήσω από μόνος μου χωρίς επιτυχία. Τελικά
συνειδητοποίησα ότι το δημιουργεί το QEMU.

Δεν έκανα καμία αναφορά σε firewalls. Η αλήθεια είναι ότι δεν έχω
ασχοληθεί ποτέ σοβαρά με τα iptables και ειμαι ψιλοάσχετος. Νόμιζα ότι
τα παρακάτω θα ήταν αρκετά για το host μηχάνημα:

iptables -A INPUT -i tap0 -j ACCEPT
iptables -A INPUT -i br0 -j ACCEPT

Αλλά, δυστυχώς δεν είναι. Κάθε βοήθεια ευπρόσδεκτη.

Τα έγραψα όλα λίγο βιαστικά. Είχα αρχίσει να γράφω ένα post στο blog moy
σχετικά, αλλά βαρέθηκα να το τελειώσω. Πάντως θα ήθελα να μου πει
κάποιος αν υπάρχουν ελλείψεις στα παραπάνω και ιδιαίτερα ενδιαφέρομαι
για λίγη βοήθεια σχετικά με τα iptables.


-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: This is a digitally signed message part
URL: <http://lists.hellug.gr/pipermail/linux-greek-users/attachments/20060608/3cfaa81e/attachment.pgp>


More information about the Linux-greek-users mailing list