kvm

需要使用支援 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

執行時間: 0.0268 秒, 瀏覽次數: 7903