Linux Inside
83
και να την αφήσετε ως έχει (.unmigratable = 1), εκτός αν σας
ενδιαφέρει να φτιάχνετε συσκευές που συνεχίζουν να δου-
λεύουν ακόμα και σε περίπτωση live migration, δηλαδή όταν
ένας Virtual Guest αλλάζει φυσικό Host.
Μεταγλώττιση και δοκιμή
Μπορούμε πλέον να δοκιμάσουμε τη νέα μας συσκευή! Για
την ανάκτηση του κώδικα του qemu και τη μεταγλώττιση θα
χρειαστούμε το git, καθώς και τα build dependencies του
qemu. Υποθέτοντας ότι τρέχετε την τελευταία έκδοση της
διανομής σας, πιθανότατα μπορείτε απλά να κάνετε κάτι σαν
sudo apt-get build-dep / yum-builddep / zypper si -d / κ.λπ.
για αυτές (υποθέτω ότι κάποιος που διαβάζει αυτό το άρθρο
δεν χρειάζεται καθοδήγηση σχετικά με το πώς να εγκαθιστά
πακέτα στη διανομή του). Θα χρειαστούμε ακόμα κάτι, που εί-
ναι ένα disk image ή live CD ISO, το οποίο θα τρέξει μέσα
στην εικονική μηχανή που θα περιέχει τη συσκευή μας. Προ-
σωπική μου προτίμηση για αυτό το άρθρο είναι το GRML, ένα
Debian-based liveCD μόλις 150MB, που όμως περιέχει ssh,
σχετικά πρόσφατο kernel (3.0), το πραγματικό lsusb (όχι την
έκδοση του busybox, όπως άλλα αντίστοιχα liveCD) κ.λπ., και
άρα είναι παραπάνω από επαρκές για τις ανάγκες μας:
wget http://goo.gl/6gHBc -O grml32.iso
Έχοντας εγκαταστήσει τα προαπαιτούμενα, μπορούμε πλέ-
ον να κατεβάσουμε και να μεταγλωττίσουμε τον κώδικα του
QEMU:
git clone git://git.qemu.org/qemu.git
git checkout -b usbdemo 71ea2e016131a9fcd
./configure --target-list=x86_64-softmmu &&
make
Το 71ea2e016131a9fcd είναι απλά ένα commit που έχω δο-
κιμάσει ότι δουλεύει, μιας και με git master ποτέ δεν ξέρει κα-
νείς... Μπορείτε κάλλιστα να δοκιμάσετε και με το master
(απλά παραλείψτε το βήμα με το git checkout) και πιθανότατα
θα δουλέψει μια χαρά επίσης. Όσο για το x86_64-softmmu,
είναι απλά για εξοικονόμηση χρόνου, καθώς αλλιώς ο QEMU
θα μεταγλωττίσει όλα τα δυνατά targets. Αν δεν σας αρέσει το
x86-64 ως target, μπορείτε χωρίς πρόβλημα να το αντικατα-
στήσετε με i386-softmmu. Άπαξ και ο QEMU μεταγλωττίστηκε
χωρίς πρόβλημα, ήρθε η ώρα να δημιουργήσουμε το αρχείο
hw/usb/dev-dummy.c και να του προσθέσουμε τον κώδικα
της συσκευής, που παραθέσαμε προηγουμένως. Για να μετα-
γλωττιστεί το αρχείο, κάνουμε απλά:
echo 'common-obj-y += dev-dummy.o' \
>> hw/usb/Makefile.objs && make
Μπορούμε πλέον να δοκιμάσουμε τη συσκευή μας με:
./x86_64-softmmu/qemu-system-x86_64 \
-cdrom ../grml32.iso -usb \
-usbdevice dummy
Όπου, αντί για grml32.iso, μπορείτε να βάλετε το δικό σας
live CD ISO, αλλιώς, αν έχετε ένα disk image (π.χ., disk.img),
μπορείτε να βάλετε -hda disk.img αντί για το -CDROM.
Μέσα από το virtual machine πλέον μπορούμε να τρέξου-
με:
lsusb -v -d dead:beef
και με λίγη τύχη θα δούμε κάτι σαν την
εικόνα 2.
Αυτό ήταν! Η συσκευή μας αναγνωρίζεται κανονικά! Μπο-
ρείτε πλέον να «παίξετε», αλλάζοντας τις παραμέτρους στον
κώδικα και βλέποντας το πώς επηρεάζεται η έξοδος του
lsusb μέσα στο VM, όπως και να αρχίσετε να διαβάζετε τον
κώδικα των άλλων προσομοιωμένων συσκευών στο φάκελο
hw/usb και να εφαρμόσετε όποιες ιδέες θέλετε από αυτές.
Εντάξει, δούλεψε. Και τώρα τι;
Το προφανές επόμενο βήμα θα ήταν, π.χ., να φτιάξετε μία
USB HID συσκευή (κάτι απλό, π.χ., θερμόμετρο). Σε αυτό θα
βοηθήσει πολύ το να διαβάσετε τον κώδικα του αρχείου dev-
hid.c, το οποίο περιέχει τις ήδη υποστηριζόμενες HID συ-
σκευές (πληκτρολόγιο, ποντίκι, tablet). Όπως θα δείτε, οι HID
συσκευές έχουν ένα ακόμα είδος descriptor, τους «report
descriptors».
Ο χώρος του άρθρου και πάλι δεν επαρκεί για να μπούμε
σε λεπτομέρειες για τις HID συσκευές (δείτε τις πηγές που εί-
παμε), αλλά μπορούμε να δώσουμε ένα απλό hint: Οι report
descriptors των HID συσκευών περιγράφονται συνήθως με
μία τυποποιημένη γλώσσα και έτσι θα τους δείτε σε όλα τα
άρθρα. Π.χ., για ένα θερμόμετρο που έχει και ένα LED για έν-
δειξη ετοιμότητας, οι report descriptors θα είναι κάπως σαν το
κείμενο στην
εικόνα 3
.
Για να τους μετατρέψετε σε πίνακα με αριθμούς, όπως αυ-
τοί που υπάρχουν στο dev-hid.c, μπορείτε να χρησιμοποιήσε-
τε το εργαλείο που προσφέρει το ίδιο το USB.org για τη δου-
λειά αυτή. Δυστυχώς, είναι γραμμένο για Windows, αλλά δου-
λεύει μια χαρά στο Wine, οπότε μικρό το κακό. Από αυτό το
εργαλείο μπορείτε μετά απλά να αποθηκεύσετε σε μορφή .h
και θα έχετε τον πίνακα που χρειάζεστε. Καλή τύχη!
Από εκεί και πέρα, το μόνο όριο είναι πραγματικά η φαντα-
σία σας. Προσπαθήστε, για παράδειγμα, να δημιουργήσετε
τη δική σας συσκευή «Plug to Own», βρίσκοντας και αξιοποιώ-
ντας τυχόν security holes στο Plug and Play stack κάποιου
λειτουργικού (αν το όνομα του οποίου αρχίζει από W, μάλλον
θα το διασκεδάσετε περισσότερο – hint, hint). Ή προσπαθή-
στε να βοηθήσετε στην ανάπτυξη/αποσφαλμάτωση του USB
stack κάποιου από τα λειτουργικά που δεν έχουν μεγάλη
ομάδα ανάπτυξης (π.χ., Haiku, Plan9, ReactOS κ.λπ.). Ή
φτιάξτε κάτι εντελώς δικό σας, που κανένας από εμάς δεν εί-
χε φανταστεί καν ότι χρειαζόταν! Το πιο σημαντικό είναι να το
διασκεδάσετε!
Όσο προχωράτε βαθύτερα στην ανάπτυξη του QEMU και
εικονικού hardware, πιθανότατα θα χρειαστείτε περισσότερες
πληροφορίες για το πώς δουλεύει. Για αυτά, εκτός από τις
τυπικές πηγές (mailing lists, wikis, google κ.λπ.), πολύ χρήσι-
μα και κατατοπιστικά είναι τα άρθρα στο blog του Stefan
Hajnoczi (π.χ., http://goo.gl/1WS19 και http://goo.gl/nKB8h),
που θα σας δώσουν την απαραίτητη «high level» εικόνα, ώστε
να μπορείτε να διαβάσετε τον κώδικα εύκολα.
•
Linux Labs – QEMU
Σύνδεσμοι
[1] Linux Coffee HowTo: goo.gl/5c7a4
[2] Fabrice Bellard, USENIX 2005 QEMU άρθρο: goo.gl/YTKVP
[3] qdev: Μοντέλο συσκευών για τον QEMU: goo.gl/R1EPJ και
goo.gl/OR2sw
[4] Γράφοντας και δοκιμάζοντας drivers χωρίς το hardware:
goo.gl/7IiEn
[5] Διασκεδάζοντας με «Plug to Own» συσκευές: goo.gl/FSN9s
[6] «USB in a nutshell»: δωρεάν html βιβλίο: goo.gl/4emJY
[7] Το USB απλοποιημένο, σειρά άρθρων: goo.gl/O2fvn
[8] Το εργαλείο του USB.org για τους HID report descriptors:
goo.gl/0Gzog