1. 程式人生 > >Windows下Libvirt Java API使用教程

Windows下Libvirt Java API使用教程

Libvirt是一個優秀的虛擬化環境管理的工具包。核心用c實現,不過提供了不同語言的呼叫API。官網的簡介如下:

libvirt is:

  • A toolkit to interact with the virtualization capabilities of recent versions of Linux (and other OSes), see our project goals for details.
  • A long term stable C API
  • A set of bindings for common languages
  • A
    CIM provider
    for the DMTF virtualization schema
  • A QMF agent for the AMQP/QPid messaging system

libvirt supports:

  • The KVM/QEMU Linux hypervisor
  • The Xen hypervisor on Linux and Solaris hosts.
  • The LXC Linux container system
  • The OpenVZ Linux container system
  • The User Mode Linux
    paravirtualized kernel
  • Virtual networks using bridging, NAT, VEPA and VN-LINK.
  • Storage on IDE/SCSI/USB disks, FibreChannel, LVM, iSCSI, NFS and filesystems

libvirt provides:

  • Remote management using TLS encryption and x509 certificates
  • Remote management authenticating with Kerberos and SASL
  • Local access control using PolicyKit
  • Zero-conf discovery using Avahi multicast-DNS
  • Management of virtual machines, virtual networks and storage
  • Portable client API for Linux, Solaris and Windows

由於我只是一個簡單而純粹的Java程式設計師,所以自然只能依賴於libvirt的Java binding api。

作為一個原始碼控,我選擇下載原始碼的方式驗證使用,git倉庫:

  • git clone git://libvirt.org/libvirt-java.git

筆者下載原始碼後,直接構建了Eclipse的工程,當然你也可以用原始碼編譯(ant)出一份jar來依賴:

cd libvirt-java
ant build

這麼多途徑,相信你總可以搞到一份libvirt的原始碼或者Jar了吧。

由於libvirt的核心都是c寫的,Java API只是幫助你封裝了對動態連結庫(dll)檔案的本地呼叫,所以現在應該做的是安裝dll檔案。libvirt官網提供了自行編譯dll檔案的指令碼:

The easiest way is to use the msys_setup script, developed by Matthias Bolte. This is actively developed and kept current with libvirt releases, https://github.com/photron/msys_setup

不過筆者並沒有嘗試該種方式,因為libvirt官網也提供了windows下的安裝包:

A windows installation package is in development. An experimental version is available here: http://libvirt.org/sources/win32_experimental/Libvirt-0.8.8-0.exe It is not production ready.(注:其並不是已經發布的產品)

該安裝包中不僅包含了需要的dll檔案,還提供了一個方便好用的virsh-shell 命令列工具,通過命令可以呼叫libvirt的所有介面(檢視,管理虛擬機器等。),對於我們的開發除錯是非常有幫助的。

安裝完成後,想讓Java API找到dll檔案,還需要指定jna路徑,有兩種方式,一種是直接設定系統環境變數:

另一種是可在程式中動態指定,筆者選擇了後者,比較靈活簡單,編寫測試程式碼如下

public void testGetXenVMs() {
		try {
- System.setProperty("jna.library.path", "D:/Git-Repo/git/libvirt-java/libvirt-java/src/test/java/kubi/coder/");
- Connect conn = new Connect("xen+tcp://10.4.55.203/");
- System.out.println(conn.nodeInfo().cores);
- for (String name : conn.listDefinedDomains()) {
- 	System.out.println(name);
- 	if (name != null) {
- 		Domain domain = conn.domainLookupByName(name);
- 		System.out.println(domain.getMaxMemory());
- 		System.out.println(domain.getUUIDString());
- 		System.out.println(domain.getInfo().maxMem);
- 		System.out.println(domain.getInfo().state);
- 		System.out.println(conn.listDomains().length);
- 	}
- }
		} catch (LibvirtException e) {
- e.printStackTrace();
		}
	}

是不是還是找不到dll?報異常

Exception in thread “main” java.lang.UnsatisfiedLinkError: Unable to load library ‘virt’

原來他是搜尋叫virtdll檔案。

檢視原始碼

Libvirt INSTANCE = (Libvirt) Native.loadLibrary("virt", Libvirt.class);

原來如此,將libvirt-0.dll改名為virt.dll。結果終於出來了。

注:libvirt的Java API封裝的比較直觀,上手很容易,其入口就是Connect 這個連線類,獲取連線後,即可對虛擬機器環境進行檢視和管理操作。筆者後續會奉上Java API詳細使用介紹。