1. 程式人生 > >KVM&QEMU學習筆記(二)

KVM&QEMU學習筆記(二)

使用快照

快照(Snapshot)是Copy-on-write的一種應用。QEMU支援兩種快照:

  1. 內部快照(internal snapshot):在qcow2映象的snapshot table中維護的快照,所有快照都存放在一個映象檔案中
  2. 外部快照(external snapshot):與Backing file很類似,在外部檔案中建立新的映象,原先的映象只讀
內部快照

內部快照的原理是:

  1. 建立一個Snapshot後,在Snapshot Table中新增一項,複製L1 Table
  2. 當L2 Table或者Data Cluster發生改變,則把改變前的資料複製一份(Copy-on-write),由新建立的Snapshot的L1 Table來管理
  3. L2 Table或者Data Cluster的變化,直接寫到原始位置
  4. 要刪除快照,很簡單,直接把Snapshot Table對應項、以及複製的L1-L2-DS刪除即可
  5. 要載入快照,則需要依據L1-L2-DS資訊,將其合併到映象的L1-L2-DS資訊中

可以使用Monitor來建立、載入、刪除內部快照:

# 儲存一個內部快照
(qemu) savevm snapshot-1
 
qemu-img info hda.img
# 輸出如下:
#Snapshot list:
#ID        TAG                 VM SIZE                DATE       VM CLOCK
#1         snapshot-1             112M 2016-09-07 18:05:48   00:00:21.536
#Format specific information:
#    compat: 1.1
#    lazy refcounts: false
 
# 載入內部快照
(qemu) loadvm snapshot-1
 
# 刪除內部快照
(qemu) delvm snapshot-1
外部快照

外部快照與內部快照相反:內部快照是原資料變化,外部快照則是新檔案變化。

可以使用Monitor來管理外部快照:

snapshot_blkdev ide0-hd0 snapshot.img qcow2
配置客戶機磁碟

有了磁碟映象檔案後,你需要為qemu-system-*指定引數,給客戶機增加磁碟。有幾種不同的配置方式:

# 最簡單的方式
-hda hda.img 
 
# 使用-drive配置塊裝置,可以指定if為virtio來提升效能
-drive file=hda.img,index=0,media=disk,if=virtio
 
# 使用-device配置通用裝置
-drive file=hda.img,if=none,id=virtio-disk0,format=qcow2,cache=none 
# 可以指定virtio-blk-pci來提升效能
-device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x4,drive=virtio-disk0,bootindex=1

配置網路

QEMU中的網路,包含兩部分的內容:

  1. 客戶機使用的虛擬網路裝置
  2. 和上述虛擬裝置通訊的網路後端,這些後端負責把虛擬裝置的資料包發到宿主機的網路中

要建立一個網路後端,可以指定如下選項:

# TYPE為後端型別:user、tap、bridge、socket、vde等
# id為一個識別符號,將虛擬網路裝置和網路後端關聯在一起
# 如果客戶機有多個虛擬網路裝置,則每一個都需要自己的網路後端
-netdev TYPE,id=NAME,...

QEME支援多種網路後端:

USER後端

如果沒有指定網路選項,QEMU預設會模擬單張Intel e1000 PCI網絡卡,該網絡卡基於user後端(SLIRP)連線到宿主機:

# 不指定網路
qemu 
# 等價配置。自0.12開始廢棄的配置方式 -net nic相當於-device DEVNAME;-net TYPE相當於-netdev TYPE
qemu -hda disk.img -net nic -net user
# 等價配置。-netdev指定網路後端,-device指定虛擬網路裝置,後者通過netdev欄位引用後端的ID
qemu -netdev user,id=network0 -device e1000,netdev=network0

在客戶機看來:

  1. 本身的IP地址被分配為 10.0.2.15+
  2. 分配IP的虛擬DHCP為 10.0.2.2
  3. 虛擬DNS伺服器為 10.0.2.3
  4. 虛擬Samba伺服器為 10.0.2.4,客戶機可以通過此伺服器訪問宿主機的檔案系統

使用者模式網路可以很方便的訪問網路資源。但是它有很多限制:

  1. 預設的,它運作方式類似於防火牆,且不允許任何入站流量。這個限制可以通過埠重定向解決
  2. 僅僅支援TCP、UDP協議,對於ICMP則不支援
  3. 效能比較差

為了支援入站請求,你可以使用埠重定向(Redirecting ports)——把針對宿主機某個埠的請求轉發給客戶機的某個埠。對映後,客戶機可以對外提供SSH、HTTP等服務:

# 把宿主機的7080埠重定向到客戶機的80埠;把宿主機的7022埠重定向到客戶機的22埠
qemu-system-x86_64 -redir tcp:7080::80 -redir tcp:7022::22 -hda ~/Vmware/KVM/centos7-base.img -m 512 
 
# 從宿主機SSH到客戶機
ssh [email protected] -p 7022

你可以不使用預設的10.0.2網段:

Shell
1
-netdev user,id=network0,net=192.168.5.0/24,dhcpstart=192.168.5.9 

客戶機OS配置

依據客戶機安裝的作業系統,可能需要進行一些配置,才能正常使用網路。以CentOS 7 Minimal + 使用者模式網路為例,需要修改以下配置檔案:

NETWORKING=yes
# 如果不使用IPV6
NETWORKING_IPV6=no
# 如果不使用IPV6 IPV6INIT=no # 開機啟動此網絡卡,預設不啟動 ONBOOT=yes 閘道器、DNS不需要設定。修改完這些配置檔案後,重啟客戶機網路: /etc/init.d/network restart  。然後執行yum update 測試一下能否正常聯網(不要使用ping測試)
TAP後端

QEMU的TAP後端利用宿主機的TAP裝置,為客戶機提供完整的橋接網路支援,如果外部需要使用標準埠連線到客戶機, 或者多個客戶機需要相互通訊,可以使用該方式。 TAP後端還具有以下優勢:

  1. 非常好的效能
  2. 可以配置以支援各種網路拓撲

但是,你需要在宿主機上進行網路拓撲的配置,而且各種系統的配置不同。

使用TAP後端前,你需要確認你的宿主機的核心支援TAP網路介面: /dev/net/tun 檔案存在則說明支援。如果沒有這樣的檔案,可以嘗試手工建立:
sudo mkdir /dev/net
sudo mknod /dev/net/tun c 10 200
sudo /sbin/modprobe tun


如果你想建立幾個客戶機之間的私有網路,可以使用該方式。未參與進來的客戶機、真實網路無法看到此網路。基於TAP的私有橋接網路 如果你不是root,則你需要 /dev/kvm 的讀寫許可權。

首先,新增一個乙太網橋裝置:

sudo ip link add br0 type bridge
# 也可以使用:sudo brctl addbr br0新增網橋
# 要刪除網橋,執行: ip link delete br0
# 注意:網橋會在重啟後消失
 
# 啟用此網橋
sudo ip link set br0 up
 
# 為網橋分配IP地址
sudo ip addr add 10.0.0.1 dev br0
 
# 在宿主機新增一條直接路由,便於它能和客戶機通訊
sudo ip route add 10.0.0.0/8 dev br0
建立一個建立TAP裝置並橋接到網橋的指令碼:
#!/bin/sh
 
switch=br0
 
if [ -n "$1" ];then
        # tunctl -u `whoami` -t $1
        # 新增一個tap裝置,在我的機器上不需要,原因見下面
        # ip tuntap add $1 mode tap user `whoami`
        # 不知道從什麼時候開始,QEMU會在執行此指令碼之前就建立好tap裝置,因此會報下面的錯誤
        # ioctl(TUNSETIFF): Device or resource busy
        # 啟動tap裝置
        ip link set $1 up
        # brctl addif $switch $1
        # 將網橋和tap裝置進行橋接
        ip link set $1 master $switch
        exit 0
else
        echo "Error: no interface specified"
        exit 1
fi
建立一個生成隨機MAC地址的指令碼:
#!/bin/bash
# generate a random mac address for the qemu nic
printf 'DE:AD:BE:EF:%02X:%02X\n' $((RANDOM%256)) $((RANDOM%256))
啟動客戶機的指令碼:
#!/bin/bash
# $1 base name of virtual disk
# $2 memory size
# $3 tap device id
 
mac=`/usr/bin/qemu-genmac`
src=/usr/bin/qemu-ifup
sudo qemu-system-x86_64 -enable-kvm -device e1000,netdev=$3,mac=$mac -netdev tap,id=$3,script=$src,downscript=no \
                        -hda ~/Vmware/KVM/$1.img -m $2

為上面的指令碼檔案新增可執行許可權:
sudo chmod +x /usr/bin/qemu-ifup-br0
sudo chmod +x /usr/bin/qemu-genmac
sudo chmod +x /usr/bin/qemu-start-br0

執行下面的命令,啟動一臺客戶機(或者更多虛擬機器,但是命令中的tap0要更換為不同的名字):
/usr/bin/qemu-start centos7-base 512 tap0

修改客戶機的IP地址,使用10.0.0.0/8網段:
TYPE=Ethernet
BOOTPROTO=static
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=no
NAME=ens3
UUID=d9f47102-b177-4a27-ae98-86f6939d6680
DEVICE=ens3
ONBOOT=yes
IPADDR=10.0.0.10
PREFIX=8
GATEWAY=10.0.0.1
現在可以互相ping客戶機和宿主機,應該可以正常連通了。 私有橋接下訪問網際網路

上一節介紹的這種基於TAP的私有橋接網路,可以讓客戶機、宿主機相互連通,但是客戶機無法訪問網際網路。

要解決此問題,你可以選擇以下方法之一:

  1. 讓客戶機通過宿主機暴露的HTTP/SOCKS代理上網
  2. 配置宿主機的路由規則,設定好源地址轉換即可:
sudo sysctl -w net.ipv4.ip_forward=1 
# 對客戶機網段進行源地址轉換
sudo iptables -t nat -A POSTROUTING  -s 10.0.0.0/255.0.0.0 ! -d 10.0.0.0/255.0.0.0 -j MASQUERADE 


公共橋接網路

此方式和私有橋接網路類似,主要區別是,除了TAP裝置橋接到網橋之外,乙太網卡(例如eth0)也橋接到網橋(例如br1)。

你可以通過發行版的配置檔案來配置網橋:

# 注意網路管理器元件的影響
# 去掉 auto eth0,改為:
auto br1
 
# 配置br1
iface br1 inet dhcp
    bridge_ports    eth0
    bridge_stp      off
    bridge_maxwait  0
    bridge_fd       0
    # 這裡附加上原來屬於eth0的配置
或者基於指令碼來配置: 
sudo ip link add br1 type bridge
sudo ip link set br1 up
sudo ip link set eth0 master br1 
 
# DHCP
sudo killall dhclient && sudo ip addr flush dev eth0
sudo dhclient br1


無論用哪種方式,都應該注意到eth0的IP地址需要轉移給br1,這樣才能確保網路正常運作——br1必須在鏈路層接收到相關ARP請求,並決定是否需要轉發給客戶機,eth0沒有這種轉發能力。

如果eth0所在網路是基於DHCP的,那麼客戶機配置為DHCP後,會自動獲取公共IP地址。否則,需要手工設定客戶機的IP地址。 

基於TAP的橋接的簡化配置

現在QEMU支援自動橋接TAP裝置到宿主機的一個網橋,因此你不再需要編寫指令碼,修改網路後端為bridge即可:

-netdev bridge,id=tap0,br=br0

注意,使用上述選項時,QEMU需要讀取配置檔案/etc/qemu/bridge.conf,你只需在此檔案中新增一行程式碼:
allow br0
你可以編寫如下指令碼自動建立網橋、配置iptables規則。示例:
# Create private bridge link
 for QEMU

/sbin/ip
link
add
br0
type
bridge

/sbin/ip
link
set
br0
up

/sbin/ip
addr
add
10.0.0.1
dev
br0

/sbin/ip
route
add
10.0.0.0/8
dev
br0

# NAT for 10.0.0.0/8

/sbin/iptables
-t
nat
-A
POSTROUTING  -s
10.0.0.0/255.0.0.0
!
-d
10.0.0.0/255.0.0.0  -j
MASQUERADE

 

 

# Create public bridge link
 for QEMU

/sbin/ip
link
add
br1
type
bridge

/sbin/ip
link
set
br1
up

/sbin/ip
link
set
eth0
master
br1

/usr/bin/killall
dhclient
&&
/sbin/ip
addr
flush
dev
eth0

/sbin/dhclient
br1

macvtap直連

關於MacVTap的相關知識,參考Linux知識集錦。建議和libvirt一起使用macvtap。 

基於libvirt的橋接

在使用libvirt時,客戶機(Domain)的網路介面配置可以簡化為:

<interface type='bridge'>
    <mac address='DE:AD:BE:EF:F1:00'/>
    <source bridge='br0'/>
    <target dev='tap0'/>
    <model type='virtio'/>
</interface>

基於libvirt VLAN的橋接

可以使用libvrit的虛擬區域網,這樣宿主機上不會為客戶機建立專門的tap裝置,那些手工編寫的指令碼也全都不需要了。虛擬網路配置示例:

<network>
  <name>default</name>
  <uuid>9bae4de8-ca58-48c5-ba58-109aebf8b954</uuid>
  <forward mode='nat'>
  </forward>
  <bridge name='virbr0' stp='on' delay='0'/>
  <ip address='10.0.0.1' netmask='255.0.0.0'>
    <dhcp>
      <range start='10.0.0.100' end='10.0.0.200'/>
    </dhcp>
  </ip>
</network>
客戶機(Domain)的網路介面配置示例:
<interface type='network'>
    <mac address='DE:AD:BE:EF:F1:00'/>
    <source network='default'/>
    <model type='virtio'/>
</interface>
另外,libvirt的虛擬網路提供了DHCP功能,因此客戶機的IP地址不需要靜態設定。





相關推薦

KVM&QEMU學習筆記

使用快照 快照(Snapshot)是Copy-on-write的一種應用。QEMU支援兩種快照: 內部快照(internal snapshot):在qcow2映象的snapshot table中維護的快照,所有快照都存放在一個映象檔案中 外部快照(external s

KVM&QEMU學習筆記

1.安裝和配置 使用隨系統自帶的KVM 大部分的Linux發行版已經內建了KVM核心模組以及使用者空間工具,使用這些內建元件是最容易、推薦的方式:KVM核心模組現在是Linux核心的一部分,除非你使用的是精簡過的核心使用者空間元件,軟體包名稱一般是qemu-kvm或者k

KVM學習筆記--虛擬機器克隆

一、KVM建立虛擬機器 建立磁碟檔案及虛擬機器映象 [[email protected] images]# ll /var/lib/libvirt/images/ #kvm存放虛擬機器的路徑 [[email protected] image

php laravel框架學習筆記 數據庫操作

true 數據 mar sql show top 一行 ati del 原博客鏈接:http://www.cnblogs.com/bitch1319453/p/6810492.html mysql基本配置 你可用通過配置環境變量,使用cmd進入mysql,當然還有一種東

java學習筆記圖形用戶接口

star strong per getwidth cep runnable graphics s2d gb2 這個學期主要放在ACM比賽上去了,比賽結束了。不知不覺就15周了,這周就要java考試了,復習一下java吧。java的學習的目的還是讓我們學以致用,讓我們可以

數據結構學習筆記 線性表的順序存儲和鏈式存儲

出錯 初始化 node != test span 輸入 des val 線性表:由同類型數據元素構成有序序列的線性結構  --》表中元素的個數稱為線性表的長度  --》沒有元素時,成為空表  --》表起始位置稱表頭,表結束位置稱表尾 順序存儲:    1 package

Memcache 學習筆記---- PHP 腳本操作 Memcache 服務器

ext status ram var_dump 介紹 修改 memcache local dbn    PHP 腳本操作 Memcache 服務器 一、PHP腳本操作Memcache方法     使用 PHP 腳本操作 Memcache,在 PHP 手冊中有詳細的介紹,我們

javascript學習筆記:定義函數、調用函數、參數、返回值、局部和全局變量

兩個 cnblogs bsp 結果 value ava ase com 調用 定義函數、調用函數、參數、返回值 關鍵字function定義函數,格式如下: function 函數名(){ 函數體 } 調用函數、參數、返回值的規則和c語言規則類似。 1 <!DOC

神箭手爬蟲學習筆記

暫存 自動 表達 eve doc 常用 學習 數據 .sh 一,可以使用神劍手已經做好的爬蟲市場直接跑,不需要自己定義爬取規則 二,爬蟲市場裏沒有的網站,需要自己去定義規則來爬數據。 三,爬取的數據可以先存放在神劍手,也可以放到七牛暫存。(提醒下,網站需要數據備份如果數量不

thinkphp5.0學習筆記API後臺處理與命名空間

mac code 輸入 -1 pub 基礎 select() color 第一個 命名空間 先來看命名空間吧; 命名空間是學習TP的基礎, <?php namespace app\lian\c1; class yi{ public $obj = "這是第一個

MongoDB學習筆記

.get 條件過濾 條件 $set system.in ins version tle 不存在 一、Mongodb命令 說明:Mongodb命令是區分大小寫的,使用的命名規則是駝峰命名法。 對於database和collection無需主動創建,在插入數據時,如果dat

設計模式學習筆記 設計基本原則之【單一職責原則】

code 分享 開發者 實際應用 需要 ret ext file類 tor 單一職責原則(SRP: Single Responsibility Principle) 名詞解釋: 1) 職責:是指類變化的原因。 2) 職責擴散:就是因為某種原因,職責P被分化為粒度更細的職責P

CSS學習筆記:特性

code 背景色 左移 line tex lin 安裝 其中 cas 一、顏色特性 1. 前景色:color 用種方式指定前景色,3種方式分別是rgb顏色,#16進制編碼,顏色名稱: color: rgb(100,100,100); color: #ee3e80; col

tensorflow學習筆記

example initial turn rate mnist pac rac test mode import tensorflow as tfimport numpy as npimport mathimport tensorflow.examples.tutorial

SSH學習筆記

via linu inf 一段時間 isp x-window window max tcl 1 # 1. 關於 SSH Server 的整體設定,包含使用的 port 啦,以及使用的密碼演算方式 2 Port 22          # SSH 預設使用 22 這

Git學習筆記

== 我們 ash 發出 效率 媳婦兒 src 每天 apply 一、分支管理 1、什麽是分支   分支就相當於我們看科幻片裏的平行宇宙,如果兩個平行宇宙互不幹擾,那鐵定是啥事兒沒有。不過,在某個時間點,兩個平行宇宙合並了呢?假如兩個宇宙中都有你的影子, 合並之後相當於你們

MySql學習筆記

ati 保存 ron setting mysql的安裝 use t-sql語句 cnblogs 完全卸載mysql MySql的安裝配置與卸載: 安裝:(1)將MySql的綠色版免安裝包放到D盤,命令行進入mysql綠色版解壓縮後的bin目錄:cd D:\mysql-5.

Unity3D之Mecanim動畫系統學習筆記:模型導入

leg character ... sdk ocs 物體 mat 版本 sset 我們要在Unity3D中使用上模型和動畫,需要經過下面幾個階段的制作,下面以一個人形的模型開發為準來介紹。 模型制作 模型建模(Modelling) 我們的美術在建模時一般會制作一個稱為

算法第四版學習筆記——初級排序算法

space 倒序 優勢 name 算法 turn 資料 eply n) 時間復雜度(Time Complexity): 總運算次數表達式中受n的變化影響最大的那一項(不含系數)(註:若算法中語句執行次數為一個常數,則時間復雜度為O(1)) 若T(n)/f(n)求極限可得

Java學習筆記-------String,StringBuffer,StringBuilder區別以及映射到的同步,異步相關知識

ringbuf 等待 java學習筆記 java學習 單線程 回復 改變 hashtable ble 1. String是不可變類,改變String變量中的值,相當於開辟了新的空間存放新的string變量 2. StringBuffer 可變的類,可以通過append方法改