libvirt Languages Bindings Python Perl CPAN Sys-Virt OCaml Ruby Java org.libvirt SharpLibVirt Toolbox
(Link zu dieser Seite als [[QEMU-KVM-Buch/ Managementtools/ libvirt-Tools/ Languages Bindings]])
Inhaltsverzeichnis |
[bearbeiten] Languages Bindings
URL: http://libvirt.org/bindings.html
Downloads: http://libvirt.org/sources/
Die C-Bibliothek libvirt bietet neben der Schnittstelle für die Programmiersprache C auch Schnittstellen für die Sprachen C++, Python, Perl, OCaml, Ruby und Java. Voraussetzungen sind neben der jeweiligen Programmiersprache die entsprechende Binding-Bibliothek und ein gestarteter libvirtd.
[bearbeiten] C
C ist eine prozedurale Programmiersprache. C ist weit verbreitet und steht für fast alle Computersysteme zur Verfügung. C wurde mehrfach standardisiert (C89, C95, C99, ISO-C). Die meisten PC-/Server-Implementierungen halten sich eng an den Standard. Eine vollständige Implementierung aktueller Standards ist aber selten. C-Programme, die keine hardware-nahe Programmierung enthalten, können auf andere Zielsysteme portiert werden. C wurde in den frühen 1970er Jahren für das Betriebssystem Unix entwickelt. Viele andere Sprachen, wie C++, Objective-C, C#, Java, PHP und Perl orientieren sich an der Syntax und anderen Eigenschaften von C. Ein Wikibook über C steht unter der URL http://de.wikibooks.org/wiki/C-Programmierung zur Verfügung. Es sind folgende Pakete zu installieren.
Host ~$ sudo apt-get install gcc build-essential make
Man testet die Verfügbarkeit des C-Compilers.
Host ~$ gcc --version gcc (Ubuntu 4.4.1-4ubuntu9) 4.4.1
Die Dokumentation zur libvirt-Binding findet man unter der URL http://libvirt.org/html/libvirt-libvirt.html. Das dazugehörige Paket ist libvirt-dev.
Host ~$ sudo apt-get install libvirt-dev
Das folgende Beispielprogramm zeigt die gestarteten virtuellen Maschinen an. Dazu ist die Datei show-domains.c mit folgenden Inhalt anzulegen.
#include <stdio.h>
#include <stdlib.h>
#include <libvirt/libvirt.h>
static void showDomain(virConnect *conn, int id)
{
virDomain *domain;
domain = virDomainLookupByID(conn, id);
printf("%s: %d\n", virDomainGetName(domain), virDomainGetID(domain) );
}
static void showDomains(virConnect *conn)
{
int number_of_domains, id, *ids;
number_of_domains = virConnectNumOfDomains(conn);
ids = malloc(number_of_domains * sizeof(int));
if (!ids)
return;
virConnectListDomains(conn, ids, number_of_domains);
for (id = 0; id < number_of_domains; id++)
showDomain(conn, ids[id]);
free(ids);
}
int main()
{
virConnect *conn;
conn = virConnectOpen("test:///default");
if (!conn)
return -1;
showDomains(conn);
virConnectClose(conn);
return 0;
}
Der Quelltext ist zu kompilieren und das Programm zu starten.
Host ~$ gcc -lvirt -o show-domains show-domains.c Host ~$ ./show-domains test: 1
[bearbeiten] C#
Die objektorientierte Sprache C# (C-Sharp) wurde von Microsoft für die .NET-Strategie entwickelt. C# basiert auf Konzepten von Java, C++, SQL, C und Delphi und unterstützt sowohl die Entwicklung von sprachunabhängigen .NET-Komponenten als auch COM-Komponenten für den Gebrauch mit Win32-Applikationen. Ein Wikibook über C# steht unter der URL http://de.wikibooks.org/wiki/Programmierkurs_C-Sharp zur Verfügung. Es werden folgende Pakete benötigt.
Host ~$ sudo apt-get install mono-complete mono-gmcs Host ~$ sudo apt-get install mono-devel monodevelop
Man testet die Verfügbarkeit des Compilers.
Host ~$ gmcs --version Mono C# compiler version 2.4.2.3
Die Entwicklungsumgebung MonoDevelop wird wie folgt aufgerufen.
Host ~$ monodevelop &
Unter der URL http://svn.i-tux.cz/listing.php?repname=SharpLibVirt findet man die libvirt-Binding.
[bearbeiten] Python
Website: http://www.python.org
Python ist eine höhere Programmiersprache. Ihre Merkmale sind hohe Leistung und klare Syntax. Die standardmäßig enthaltene Bibliothek ist umfangreich. Ungewöhnlich ist die Verwendung von Einrückungen zur Begrenzung von Blöcken. Ein Wikibook steht unter der URL http://de.wikibooks.org/wiki/Python-Programmierung zur Verfügung. Python ist auf den meisten Linux-Distributionen bereits als Paket python installiert. Mit folgenden Befehl testet man die Verfügbarkeit.
Host ~$ python --version Python 2.6.4
Die Dokumentation der libvirt-Binding befindet sich unter der URL http://libvirt.org/python.html. Benötigt wird das Paket python-libvirt.
Host ~$ sudo apt-get install python-libvirt
Das Beispiel show-domains.py zeigt laufende Domains an.
import libvirt
conn = libvirt.open('test:///default')
for id in conn.listDomainsID():
domain = conn.lookupByID(id)
print "%s: %s" % ( domain.name(), domain.info()[0] )
Das Skript wird wie folgt aufgerufen.
Host ~$ python show-domains.py test: 1
[bearbeiten] Perl
Website: http://www.perl.org
Perl ist eine freie, plattformunabhängige und interpretierte Skript-Sprache. Ursprünglich wurde Perl zur Manipulation von Textdateien entwickelt. Die Stärken von Perl sind die Verarbeitung von Datenströmen verschiedenartiger Nachrichtenquellen und die Bearbeitung von Texten mit Hilfe regulärer Ausdrücke. Es gibt viele frei verfügbare Module, die an einem zentralen Ort (CPAN) zur Verfügung gestellt werden. CPAN (Comprehensive Perl Archive Network) ist ein Online-Repository (http://www.cpan.org) für Perl-Module. Ein Wikibook über Perl steht unter der URL http://de.wikibooks.org/wiki/Perl-Programmierung zur Verfügung. Perl ist auf den meisten unix-artigen Systemen (*BSD, Solaris, Mac OS X, Linux) bereits vorinstalliert. Mit folgenden Befehl testet man die Verfügbarkeit.
Host ~$ perl --version This is perl, v5.10.0 built for x86_64-linux-gnu-thread-multi
Viele Perl-Module werden als Software-Pakete angeboten (lib*-perl). Steht ein Perl-Modul nicht als Paket zur Verfügung, installiert man es mit CPAN. Dazu wird das Paket perl-modules benötigt.
Host~$ sudo apt-get install perl-modules
Als Benutzer root ruft man cpan auf.
Host~$ su - Host~# cpan
Beim ersten Aufruf von cpan werden einige Fragen zur Konfiguration gestellt. Die Default-Antworten können übernommen werden. Bei der Frage nach dem Mirror-Server ist ein Server in der Nähe auszuwählen. Die Konfiguration wird bei Debian/Ubuntu in der Datei /etc/perl/CPAN/Config.pm gespeichert. Nach erfolgreicher Konfiguration wartet der CPAN-Prompt auf Befehle.
cpan> quit
Das Perl-Modul Sys::Virt liefert die Perl-Bindings für libvirt. Die Dokumentation steht unter der URL http://search.cpan.org/dist/Sys-Virt/lib/Sys/Virt.pm zur Verfügung. Gibt es kein entsprechendes Paket, installiert man dieses Modul per CPAN. Mit folgenden Befehl sucht man das Perl-Modul Sys::Virt.
cpan> i /Sys::Virt/
Die Installation eines Perl-Moduls erfolgt mit install.
cpan> install Sys::Virt cpan> quit
Mit folgendem Befehl testet man die erfolgreiche Installation des Perl-Moduls. Wenn keine Ausgabe erscheint, ist alles richtig.
Host ~$ perl -MSys::Virt -e exit
Für das Beispiel legt man die Datei show-domains.perl mit folgendem Inhalt an.
#!/usr/bin/perl -w
use Sys::Virt;
my $con = Sys::Virt->new( uri => "test:///default" );
my @domains = $con->list_domains;
for my $domain ( @domains ){
printf "%s: %s\n",
$domain->get_name, $domain->get_info->{state};
}
Die Datei wird ausführbar gemacht und aufgerufen.
Host ~$ chmod +x show-domains.perl Host ~$ ./show-domains.perl test: 1
[bearbeiten] OCaml
Website: http://caml.inria.fr
OCaml (Objective CAML) ist eine auf der ML-Sprachfamilie (Meta Language) basierende Programmiersprache. Neben den funktionalen und imperativen Merkmalen von ML unterstützt OCaml objektorientierte Konzepte. OCaml verfügt über einen Compiler für die Erzeugung von Bytecode und Maschinencode. OCaml ist für zahlreiche Plattformen, inklusive Unix und Windows verfügbar. Anleitungen für OCaml findet man der URL http://www.ocaml-tutorial.org/de. Es werden folgende Pakete benötigt:
Host~$ sudo apt-get install ocaml ocaml-interp
Man testet die Verfügbarkeit.
Host ~$ ocaml -version The Objective Caml toplevel, version 3.11.1 Host ~$ ocamlopt -config version: 3.11.1
Die libvirt-Binding findet man unter der URL http://libvirt.org/ocaml/. Es werden folgende Pakete benötigt:
Host~$ sudo apt-get install libvirt-ocaml libvirt-ocaml-dev
Für das Beispiel legt man die Datei list_domains.ml mit folgenden Inhalt an.
module C = Libvirt.Connect module D = Libvirt.Domain let name = "test:///default" let conn = C.connect_readonly ~name () open Printf let doms = let n = C.num_of_domains conn in let ids = C.list_domains conn n in let domains = Array.map (D.lookup_by_id conn) ids in Array.iter ( fun dom -> printf "%s %8d \n%!" (D.get_name dom) (D.get_id dom) ) domains;
Der Quelltext ist zu kompilieren und das Programm zu starten.
Host ~$ ocamlopt -I +libvirt mllibvirt.cmxa list_domains.ml \
-o list_domains
Host ~$ ./list_domains
test 1
[bearbeiten] Ruby
Website: http://ruby-lang.org
Ruby ist eine vielseitige, objektorientierte Sprache. Alle Datentypen, auch Zahlen oder Zeichenketten, sind Objekte. Ruby wurde als Multiparadigmen-Sprache entworfen. Das heißt, es steht dem Entwickler offen weitere Programmierparadigmen zur Erstellung seiner Programme zu nutzen. Ein Quickstart befindet sich unter der URL http://www.ruby-lang.org/de/documentation/quickstart/. Ein Wikibook über Ruby steht unter der URL http://de.wikibooks.org/wiki/Ruby-Programmierung zur Verfügung. Es sind folgende Pakete zu installieren.
Host ~$ sudo apt-get install ruby-full rake rubygems irb
Man testet die Verfügbarkeit.
Host ~$ ruby --version ruby 1.8.7 (2008-08-11 patchlevel 72) [x86_64-linux] Host ~$ irb irb(main):001:0> quit
Die libvirt-Binding findet man unter der URL http://libvirt.org/ruby/. Die dazugehörige Dokumentation ist unter http://www.libvirt.org/ruby/api/ veröffentlicht. Es ist das Paket libvirt-ruby zu installieren.
Host~$ sudo apt-get install libvirt-ruby
Für die ersten Schritte bietet sich die Shell interactive ruby an. Mit require gibt man die zu verwendende Bibliothek an. Anschließend wird das Objekt connect definiert. puts dient zur Ausgabe von Informationen auf den Bildschirm. In diesem Fall wird ein XML-Dokument ausgegeben, welches die Eigenschaften des aktuell verbundenen Hypervisors beschreibt (siehe virsh capabilities).
Host ~$ irb
irb(main):001:0> require 'libvirt'
=> true
irb(main):002:0> connect = Libvirt::open("test:///default")
=> #<Libvirt::Connect:0xb77c4554>
irb(main):003:0> puts connect.capabilities
...
irb(main):004:0> quit
Für ein Beispiel-Skript legt man die Datei show-domains.rb mit folgendem Inhalt an.
#!/usr/bin/env ruby
require 'libvirt'
connect = Libvirt::open("test:///default")
@domains = connect.list_domains()
@domains.each do |id|
domain = connect.lookup_domain_by_id(id)
puts "#{domain.name}: #{domain.id}"
end
Die Datei wird ausführbar gemacht und aufgerufen.
Host ~$ chmod +x show-domains.rb Host ~$ ./show-domains.rb test: 1
[bearbeiten] Java
Website: http://java.sun.com
Java ist eine objektorientierte, plattformunabhängige Programmiersprache. Java-Programme werden in Bytecode übersetzt und dann in der Java-Laufzeitumgebung ausgeführt. Deren wichtigster Bestandteil ist die Java Virtual Machine. Java ist ein eingetragenes Warenzeichen der Firma Sun Microsystems. Sun bietet Java-VMs für Linux, Solaris und Windows an. Weitere Hersteller lassen ihre Java-VM für ihre Plattform zertifizieren, zum Beispiel die Firma Apple für Mac OS X. Ein Wikibook über Java steht unter der URL http://de.wikibooks.org/wiki/Java_Standard zur Verfügung. Neben dem Paket sun-java6-jdk sind die Pakete ant, libjna-java und junit notwendig.
Host~$ sudo apt-get install sun-java6-jdk libjna-java junit ant Host~$ sudo update-alternatives --config java
Man testet die Verfügbarkeit.
Host~$ javac -version javac 1.6.0_16 Host~$ ant -version Apache Ant version 1.7.1 compiled on October 19 2009
Die Dokumentation der libvirt-Binding findet man unter der URL http://libvirt.org/sources/java/javadoc/. Die Dateien der libvirt-Binding lädt man sich von der URL http://libvirt.org/sources/java/ herunter und startet den Build-Prozess mit ant. Anschließend ist das gebaute jar-Archiv in das Verzeichnis mit den Java-Bibliotheken zu kopieren. Der CLASSPATH muss auf das aktuelle Verzeichnis und auf das Verzeichnis mit den Dateien libvirt.jar und jna.jar zeigen. Die Variable LD_LIBRARY_PATH verweist auf den Pfad der Datei libjnidispatch.so.
Host ~$ mkdir -p ~/source Host ~$ cd ~/source Host ~$ wget \ http://libvirt.org/sources/java/libvirt-java-0.4.2.tar.gz Host ~$ tar xzvf libvirt-java-0.4.2.tar.gz Host ~$ cd libvirt-java-0.4.2 Host ~$ ant build Host ~$ sudo cp target/libvirt-0.4.2.jar /usr/share/java/ Host ~$ sudo ln -s /usr/share/java/libvirt-0.4.2.jar \ /usr/share/java/libvirt.jar Host ~$ export CLASSPATH=.:/usr/share/java/* Host ~$ export LD_LIBRARY_PATH=/usr/lib/jni/
Für das Beispiel ist die Datei ShowDomains.java mit folgendem Inhalt anzulegen.
import org.libvirt.*;
public class ShowDomains {
public static void main(String[] args) {
Connect conn=null;
try{
conn = new Connect("test:///default", true);
} catch (LibvirtException e){
System.out.println("exception caught:"+e);
System.out.println(e.getError());
}
try{
int[] Domains=conn.listDomains();
for (int i = 0; i < Domains.length; i++)
{
Domain dom=conn.domainLookupByID(Domains[i]);
System.out.println(dom.getName() + ": " + dom.getID());
}
} catch (LibvirtException e){
System.out.println("exception caught:"+e);
System.out.println(e.getError());
}
}
}
Diese Datei wird kompiliert und aufgerufen.
Host ~$ javac ShowDomains.java && java ShowDomains test: 1
[bearbeiten] Links
- http://www.picht.org/xenkochbuch/
- Xen-Kochbuch
- libvirt-presentation
- http://libvirt.org/html/libvirt-libvirt.html
- http://de.wikibooks.org/wiki/Regal:Programmierung
- http://people.redhat.com/~rjones/win32-porting/
- http://www.mono-project.com/Assemblies_and_the_GAC
- http://www.howtogeek.com/howto/linux/installing-monodevelop-from-source-on-ubuntu/
- https://www.redhat.com/archives/libvir-list/2008-September/msg00283.html