Τετάρτη 20 Απριλίου 2011

Kernel-debugging a Qemu windows VM from a Linux host using wine


The "normal" way to debug a Qemu/KVM windows virtual machine at kernel-level (e.g., for writing a windows driver) is to use 2 windows VMs. One (called server) in which to run the kernel you are going to debug and one (called client or host) in which to run the debug tools.
(If you want to try this way, the instructions here have worked for me at least).

Several people have wondered if it is possible to save (at least some of) the memory overhead of the host/client VM by using wine instead to run the debug tools (from the Linux host). Unfortunately this seems to be harder than it seems.

MSBL: All your bugs are belong to me :)

Όπως έγραψα και στα σχετικά mail στις λίστες open-source-el και linux-greek-users, θα ήθελα να ξεκινήσω μια προσπάθεια συγκέντρωσης των (πιο σημαντικών) bugs που εμποδίζουν ή δυσκολεύουν τη διάδοση του ΕΛ/ΛΑΚ στην Ελλάδα.

Με ενδιαφέρουν upstream bugs τα οποία έχουν υποβληθεί ήδη στα αντίστοιχα bugtrackers, τα οποία αφορούν mainstream λογισμικό όπως π.χ., Firefox, Libreoffice κλπ (όχι προγράμματα που έχουν κάτω από 20 έλληνες χρήστες).

Επίσης, η προσπάθεια αυτή επικεντρώνεται σε bugs τα οποία "αν δεν τα διορθώσει κάποιος Έλληνας πιθανότατα δε θα τα διορθώσει κανείς", δηλαδή π.χ., σε προβλήματα υποστήριξης της ελληνικής γλώσσας ή σε προβλήματα χρήσης υπηρεσιών στην Ελλάδα (π.χ., τραπεζών ή του δημοσίου, δηλ. για παράδειγμα αν κάποιο bug στο firefox εμποδίζει πολύ κόσμο να υποβάλλει τη φορολογική του δήλωση ή κάτι τέτοιο).

Τέλος τα bugs πρέπει να απευθύνονται σε προγραμματιστές και όχι μεταφραστές ή συγγραφείς περιεχομένου μια και γι αυτές τις κατηγορίες συνεισφοράς στην κοινότητα υπάρχει ήδη πιστεύω ικανοποιητική υποστήριξη.

Με βάση αυτά που θα συλλέξω η δική μου δουλειά θα είναι η ιεράρχηση και η πιο λεπτομερής "ματιά" ώστε να δημοσιεύεται κάθε μήνα μια λίστα με τα "10 πιο σημαντικά" και μία με τα "10 σημαντικά και εύκολα στην επίλυση" bugs, τόσο μέσω αυτού του blog (και άρα των πλανητών hellug και ellak), όσο και μέσω email στις ελληνικές λίστες ΕΛ/ΛΑΚ.

Αν λοιπόν γνωρίζετε κάποιο bug που πληρεί αυτά τα κριτήρια, παρακαλώ στείλτε το σχετικό link στο upstream bugtracker report καθώς και αν γίνεται μια μικρή περιγραφή για το γιατί αυτό το bug είναι σημαντικό στη διεύθυνση pktoss at g mail τελεία com, με θέμα που να ξεκινά από MSBL: (για να διευκολυνθεί η ταξινόμηση).

Παντελής

Υ.Γ., αν έχετε σχόλια σχετικά με το εγχείρημα, θα χαρώ να τα δω μέσω comments ή μέσω email.

Τρίτη 19 Απριλίου 2011

frelink: restoring deleted open or loop-mounted files in Linux

Has it ever happened to you that an important file has been deleted (by yours or someone else's mistake) but this file is still open by a process or loop-mounted somewhere?

In the "still open by a process" case, if the file is relatively small, as well as static or append only, you can use the well-known tricks of
cp /proc/<pid>/fd/<fd> /new/file/path
or
tail -c +0 -f /proc/<pid>/fd/<fd> > /new/file/path
to bring it back from the land of the "unlinked" by copying to someplace safe.

But what happens if the file is too big to copy or changes in a random fashion so that "tail -f" can not ensure that the copy will have the latest updates? Even worse, what happens if the file is loop-mounted in which case there is not even an fd to copy it from?

Κυριακή 17 Απριλίου 2011

Το LibreOffice 3.4 θα έχει υποστήριξη για ελληνική αρίθμηση σε λίστες και κεφάλαια

Όπως ίσως διαβάσατε και σε προηγούμενο post, το LibreOffice 3.4 θα έχει πλέον υποστήριξη για ελληνική αρίθμηση σε λίστες και κεφάλαια, ένα patch που εκκρεμούσε 2 χρόνια πάνω-κάτω στο OpenOffice.

Μπορείτε να δοκιμάσετε αυτή τη δυνατότητα κατεβάζοντας κάποιο από τα prerelease του LibreOffice εδώ.

Τετάρτη 13 Απριλίου 2011

I have no computer but I can code :P

Δυστυχώς δεν έχω σχεδόν καθόλου ελεύθερο χρόνο αυτό τον καιρό για να γράψω κάτι σοβαρό, αλλά θα ήθελα να μοιραστώ το παρακάτω που είδα σε ένα forum post:

Ερώτηση:
Hello,

I posted this on another forum, and I figure I would try here as well.

I have a rather straightforward challenge and I need a little help. Let me preface that I am not a very experienced kernel module developer, but I have read through some of the basic tutorials and examples. I also have a fair amount of C/C++ experience, so I am not a complete novice in those regards.

The challenge is to count the contents of each /proc/[pid]/fd directory from a kernel module. Basically, counting the number of open file descriptors for each process.


Απάντηση:
Because of my poor english,this may out of some misunderstanding....

I am not a programmer either linux user,further have no computer...this is my smartphone;;;

include/linux/file.h
Per-Process file table ->fdtable
Open file table -> files_struct

So,The 'fdtable' struct may have key possiblity to solve this problem

This is my first posting to LQ which requires at least one posting to access full user account...
This policy force to use english all over the world...may not a quite wide open concepts


-Παντελής

Πέμπτη 7 Απριλίου 2011

Μικραίνοντας εικονικούς δίσκους μέσω qemu-img

Ας πούμε ότι φτιάχνετε ένα virtual machine για να το παραδώσετε σε κάποιον ως appliance (π.χ., ένα service appliance ή ένα appliance για εξάσκηση σε κάποια τεχνική administration). Ξεκινάτε στα γρήγορα από ένα minimal image (π.χ., ubuntu JeOS ή debian minimal) κάνετε install τα απαραίτητα, σβήνετε ότι υπάρχει περιττό και ετοιμάζεστε να το παραδώσετε. Υπάρχει όμως ένα μικρό πρόβλημα, το μέγεθος του image / virtual disk.

Μετά από αρκετό setup και install/deinstall (ειδικά αν θέλετε να κάνετε compile ένα πακέτο εντός του VM ή κάτι παρόμοιο), δεν είναι παράξενο το df εντός του VM να μας λέει π.χ., 500ΜΒ αλλά το ίδιο το αρχείο του image να είναι 1-2GB, λόγω του ότι τα filesystems προσπαθούν να μην πειράζουν τα σβησμένα αρχεία όταν δεν είναι αναγκασμένα να το κάνουν (ώστε να έχει ελπίδες το undelete).

Πώς μπορούμε λοιπόν να ξαναμικρύνουμε ένα π.χ., qemu qcow2 image ώστε το μέγεθός του να ανταποκρίνεται στο μέγεθος των περιεχομένων του; Η λύση είναι ένας συνδυασμός προγραμμάτων που τρέχουμε εντός του VM και του qemu-img.

Τετάρτη 6 Απριλίου 2011

N-queens σε C με bitmasks και αναδρομή

Όσο προσπαθώ να βρω μια ικανοποιητική λύση για posting κώδικα στο blogspot, θα ήθελα με αυτό το post να μοιραστώ μια πολύ όμορφη λύση στο πρόβλημα των N-Βασιλισσών σε C, η οποία συνδυάζει μικρό και "συμπαγή" κώδικα με αρκετά καλή αποδοτικότητα σε χώρο/χρόνο, χάρη στο συνδυασμό bitmasks και αναδρομής.

Κυριακή 3 Απριλίου 2011

A collection of links with useful information about Qemu/kVM

I would like to share a collection of links that contain useful information about Qemu/KVM internals. They are useful for people interested in hacking on Qemu/KVM either to fix bugs or improve the existing functionality / academic projects, GSoC etc

Reading (open source) code

I read lots and lots of code, practically on a daily basis. Only a tiny fraction of that code has been written by me, or people I know, so I wanted to share my techniques on effective reading of large modern free software projects and if possible to hear yours as well :)

Σάββατο 2 Απριλίου 2011

Wake On LAN σε Ubuntu

Το "wake on LAN" είναι ένα πολύ χρήσιμο χαρακτηριστικό στα σύγχρονα desktop.

Ιδιαίτερα στην περίπτωση ενός "server" υπολογιστή που βρίσκεται σε άλλο δωμάτιο ή όροφο (ή ακόμα περισσότερο σε μη προσβάσιμο από εμάς χώρο) και θέλουμε ένα εύκολο τρόπο να τον "ανοίγουμε" χωρίς να σηκωθούμε από τη θέση μας.

Παρασκευή 1 Απριλίου 2011

Περί αναδρομής και αποτίμησης αριθμητικών παραστάσεων

Προς όφελος όσων μελετούν εισαγωγικά θέματα στη C/C++ και διαδικασιακό προγραμματισμό αυτό τον καιρό και για δικό μου reference όταν γεράσω και ξεκουτιάνω ( :P ), ας δούμε λίγο κώδικα για αποτίμηση αριθμητικών παραστάσεων.

Για λόγους ευκολίας (= τεμπελιάς) θα θεωρήσω ότι το σύστημά μας δέχεται ως αριθμούς μόνο ακέραια ψηφία από το 0 ως το 9. Η γενίκευση για πραγματικούς αριθμούς είναι τετριμμένη και αφήνεται ως άσκηση για το χρήστη ( :P ).

Αυτό που θέλουμε λοιπόν είναι καταρχήν να αναγνωρίζουμε αριθμητικές παραστάσεις του στυλ:
5*2+7/2+4-8

Τι πρέπει να προσέξουμε:
  • Οι τελεστές είναι "left associative" δηλαδή το 5*3/2 π.χ., αποτιμάται ως (5*3)/2 και όχι ως 5*(2/3).
  • Υπάρχει προτεραιότητα στους τελεστές, δηλαδή το '*' και το '/' έχουν μεγαλύτερη προτεραιότητα από το '+' και '-', δηλ. το 5+3*8 αποτιμάται σαν 5+(3*8) και όχι (5+3)*8.
Τα παραπάνω μας οδηγούν στην εξής στρατηγική σύμφωνα με την πρακτική του "διαίρει και βασίλευε": Ξεκίνα να διαβάζεις από τα αριστερά, όταν βλέπεις σταθερά θυμίσου την, όταν βλέπεις "*" ή "/" και έχεις στη μνήμη σου και τους 2 τελεστέους κάνε την πράξη, όταν βλέπεις "+" ή "-" και έχεις κάνει όλους τους πολ/σμους και διαιρέσεις στους τελεστέους (για σεβασμό της προτεραιότητας) κάνε την πράξη, στο τέλος η τιμή της παράστασης είναι το σύνολο των επιμέρους πράξεων.

Αν αναθέσουμε σε κάθε κομμάτι του προγράμματος μια συνάρτηση, το παραπάνω μπορεί να εκφραστεί σε κώδικα ως εξής:

 double prim(bool get)  
{
if (get) cursor ++;
char c = expression[cursor++];
//Primaries can only be single digit integers
return c - '0';
}
double term(bool get)
{
double left = prim(get);
for (;;) {
switch (expression[cursor]) {
case '*':
left *= prim(true);
break;
case '/':
left /= prim(true);
break;
default:
return left;
}
}
}
double expr(bool get)
{
double left = term(get);
for (;;) {
switch (expression[cursor]) {
case '+':
left += term(true);
break;
case '-':
left -= term(true);
break;
default:
return left;
}
}
}

Η δυαδική μεταβλητή get καθορίζει αν θέλουμε να καταναλώσουμε το επόμενο σύμβολο ή όχι. Η κλήση π.χ., του παραπάνω κώδικα θα ήταν ως expr(false). Ακόμα και στην περίπτωση της αμοιβαίας αναδρομής, η υλοποίηση αυτή στη C είναι αρκετά αποδοτική καθώς η κλήση συνάρτησης στη C είναι σχετικά "φτηνή".

Υπάρχουν σίγουρα πιο "σοφιστικέ" τρόποι να δουλέψει κανείς με operators (π.χ., Operator precedence parsing) αλλά όταν χρειάζεται να γράψει κάποιος τον κώδικα "με το χέρι" (χωρίς τη βοήθεια γραμματικών και parser generators) όσο πιο απλός και προφανής είναι ο κώδικας τόσο λιγότερο το debugging και αυτό είναι που μετρά στο τέλος της ημέρας ...

Παντελής