需要使用支援 INTEL-VT 或 AMD-V 的 CPU。
編核心
[*] Virtualization --->
--- Virtualization
<M> Kernel-based Virtual Machine (KVM) support
< > KVM for Intel processors support
< > KVM for AMD processors support
Device Drivers --->
[*] Network device support --->
<M> Universal TUN/TAP device driver support
Networking support --->
Networking options --->
<*> 802.1d Ethernet Bridging
<*> 802.1Q VLAN Support
Processor type and features --->
[*] Paravirtualized guest support --->
[*] KVM paravirtualized clock
[*] KVM Guest support
-*- Enable paravirtualization code
[*] Paravirtualization layer for spinlocks
Processor type and features --->
[*] Enable KSM for page merging
After booting your previously built kernel be sure to check
# cat /sys/kernel/mm/ksm/run ksm為記憶體優化分配功能
to return 1. Otherwise ksm won't be working.
# echo 1 > /sys/kernel/mm/ksm/run 手動啟動ksm
vi /etc/portage/make.conf 非64位元才要 加上QEMU_SOFTMMU_TARGETS="x86_64"
emerge qemu
gpasswd -a <your_user_name> kvm
把其他使用者加入KVM group 才可使用
qemu-img create -f qcow2 -o preallocation=metadata gentoo-x86.img 3G
創建虛擬磁碟
方法1. 直接橋接網路卡(等同一張網卡在Host裡)
emerge bridge-utils
emerge usermode-utilities
vi /etc/conf.d/net
bridge_br0="tap0 tap1"
brctl_br0="setfd 0 sethello 30 stp off"
config_br0="xxx.xxx.xxx.xxx/24"
config_tap0="null"
routes_br0="default via xx.xx.xx.xx"
tuntap_tap0="tap"
tunctl_tap0="-u root"
mac_tap0="00:00:00:00:00:00"
carrier_timeout_tap0="0"
ln br0 並啟動 net.br0
# modprobe kvm_intel
# modprobe tun
# tunctl -u 你的使用者名稱 (-t tap0) 為用戶創建虛擬網卡 預設為tap0
# brctl addbr br0 加入橋接器
# brctl addif br0 tap0 將tap0與br0橋接起來
# ifconfig tap0 promisc up 啟用tap0並設置promisc模式
方法2.
利用NAT Server
eth0 與br0 兩張網卡 一張連外 一張連內 而連內的就照橋接的方法設定
將虛擬機的ip設跟連內的網卡同區段 利用IPtables 架設NAT Server即可
在init.d底下創建bridge_forward 讓kvm封包可以轉送
#!/sbin/runscript depend() {
need net.br0
}
start() {
ebegin "Turning on forwarding for bridge interface"
/sbin/sysctl net.ipv4.conf.br0.forwarding=1 >/dev/null 2>&1
eend $?
}
stop() {
ebegin "Turning off forwarding for bridge interface"
/sbin/sysctl net.ipv4.conf.br0.forwarding=0 >/dev/null 2>&1
eend $?
}
virtio系列虛擬硬體(較好)
編核心
CONFIG_VIRTIO_PCI=y (Device Drivers -> Virtio Drivers -> PCI driver for virtio devices)
CONFIG_VIRTIO_BALLOON=y (Device Drivers -> Virtio Drivers -> Virtio balloon driver)
CONFIG_VIRTIO_BLK=y (Device Drivers -> Block drivers -> Virtio block driver)
CONFIG_VIRTIO_NET=y (Device Drivers -> Network device support -> Network core device support -> Virtio network driver)
CONFIG_SCSI_VIRTIO=y (Device Drivers -> SCSI device support -> SCSI low-level drivers -> virtio-scsi support )
CONFIG_VIRTIO=y (automatically selected)
-drive file= 你的映像檔,if=virtio 虛擬硬碟 /dev/vda -hda就不用了 -net nic,model=virtio 虛擬網卡
安裝grub的時候 用手動 並先定義hd0為vda device (hd0) /dev/vda
OS安裝範例
qemu-kvm -m 1024 -localtime -smp 4 -net nic -net tap,ifname=tap0,script=no,downscript=no -hda gentoo-x86.img -cdrom install-x86-minimal-20121213.iso -boot d -vnc :0
預設 -vnc 不加會使用IPV6 -m 記憶體 -localtime 採用主機時間 -smp核心 -nat 網路 -boot 由軟盤(a),硬盤(c)或是CD-ROM(d).在默認的情況下由硬盤啟動 使用usb但要先安裝 emerge usbutils lsusb 列出 usb裝置ID邊號與詳細內容 -usb -usbdevice host:ID編號
啟動範例
qemu-kvm -m 1024 -localtime -smp 4 -net nic -net tap,ifname=tap0,script=no,downscript=no -hda gentoo-x86.img -vnc :0
執行
利用ssh通道讓vnc更安全 先把VNC的IP改成 localhost
ssh -L 要連的IP:要開放的PORT:localhost:VNC的PORT root@要連的IP 如果加上 -N -f 代表持續開通道 只要SSH通道開著都可以用VNC連你開的PORT
開啟橋接網路間封包轉遞
vi /etc/sysctl.conf
加上 net.ipv4.conf.br0.forwarding= 1
皮皮的script 說明 script 在 /etc/init.d/kvm.xxx
xxx會對應 xxx.pid other 是用來增加其他參數 但如果沒設定會顯示錯誤
conf 在/etc/conf.d/kvm
config_pid_dir 用來放置pid記錄檔案 lun_www 是-drive file=之後指定映像檔 但boot=on新版已經無此語法 後面多一個-drive file= 是增加硬碟 vda
主要參考資料 : http://en.gentoo-wiki.com/wiki/KVM 附加參考資料:http://blog.csdn.net/cenziboy/article/details/7058797