書:The Definitive Guide to the Xen Hypervisor 的範例程式碼可以在這邊找到 http://www.informit.com/store/definitive-guide-to-the-xen-hypervisor-9780132349710
第二章的範例很簡單,就是一個 hello world,但是要改的地方也不少,有下列幾點。完整的 diff 檔將附在文章最後面。
1) 首先要讓這個範例程式可以編譯成功,必須把 xen 原始碼的 include 資料夾加入 gcc 的 -I 參數中。很剛好,我們重新編譯 xen 時就已經下載了 xen 的整包原始碼,我們可以將資料夾指過去就好,請注意看 diff 檔的第 10-11 行。請注意你的 xen 是放在哪個資料夾,無論是相對、或是絕對路徑都可以。
2) 在 x64 的環境編譯 x86 的程式時需要加上 -m32,link 時要加上 -m elf_i386,請參考第 12-14 行,以及第 23 行。
以上兩個都改好就可以編譯成功,執行的方式是透過 xm 這個 xen 的控制工具,範例也很貼心的提供了一個 config 檔叫作是 domain_config,使用他開啟就可以了。
$ sudo xm create domain_config |
不過第一次嘗試執行時,卻出現:
Error: Cannot find kernel "testkernel" |
Oops!! 明明就存在阿,可是他就是找不到=__= 後來我嘗試使用絕對路徑,他就找到了...可能必須再深究一下為什麼。雖然找到了,可是當 xen 載入核心時卻出現了這樣的錯誤訊息:
Error: (2, 'Invalid kernel', 'panic: xc_dom_boot.c:127: xc_dom_compat_check: guest type xen-3.0-x86_32 not supported by xen kernel, sorry') |
似乎是因為該 kernel 與 xen 提供的功能不相容的緣故,我們透過指令 xm info 可以看到:
<前略> virt_caps : hvm <後略> |
恩~因為我們 kernel 是 PV 的,對於 PV 的 kernel 來看只支援 x86_64 或是 x86_32p 這裡的p應該是指 PAE 。看來是必須讓我們的 kernel "回報"支援 PAE,雖然事實上我們根本沒有用到 PAE :p ,修改方法很簡單,只要將 bootstrap.x86-32.S 中的 pae="no" 改為 pae="yes" 即可,請參考 diff 的 39-40 行。到此為止就可以正確執行了。
從 xm list 可以看到我們的 test_kernel 執行中:
$ sudo xm list Name ID Mem VCPUs State Time(s) Domain-0 0 3915 4 r----- 250.7 Simplest_Kernel 2 32 1 r----- 12.9 |
至於 test_kernel 所印出來的 Hello World 則必須透過 xm dmesg 中看到:
<前略> (XEN) PCI add device 0000:02:00.0 |
如果想要結束的話,要透過 destroy 的指令,目標可以是 domain ID 或是 domain 名稱(如 Simplest_Kernel),domain ID 可以透過剛剛的 xm list 查詢到:
$ xm destroy <dom-ID|dom-Name> |
最後附上 diff 檔,或是可以直接從 github 下載整包 code: https://github.com/koukaipan/xen-examples
參考資料:http://www.blogjava.net/zellux/archive/2008/10/17/235056.html