Lab 1: Virtual Technelogy: Kernel-based Virtual Machine (KVM)

實驗描述

本實驗示範如何運用 Kernel-based Virtual Machine (KVM) 建立虛擬叢集環境.

實驗環境

理學大樓 1002 教室
Cloud-A01 ~ Cloud-D12
CPU AMD Phenom™ II X6 1065T Processor
Memory 8G
Disk spaces 500G、500G
O.S. Debian Wheezy

虛擬機環境
Virtual Machine
Location 821 機房伺服器
CPU vcpu*2
Memory 4G
Disk spaces 80G (QCOW2 Format)
O.S. Debian Jessie
理學大樓 821 機房
CSIE-Cloud01 ~ CSIE-Cloud06
CPU AMD Opteron™ Processor 6128 * 2
(total 16 cpu cores)
Memory 32G
Disk spaces 500G、500G、1T
O.S. Debian wheezy
CSIE-Cloud07、CSIE-Cloud08
CPU AMD Opteron™ Processor 6234 * 2
(total 24 cpu cores)
Memory 32G
Disk spaces 500G、500G、1T
O.S. Debian wheezy

實習簡介

本實作內容以 step-by-step 方式寫作,盡可能地讓同學們以複製貼上方式完成指令輸入。

上機實習時使用教室電腦,另外讓同學練習用的機器是機房所提供的虛擬機器。

練習完本實作之後,同學們應可以學會基本建立與操作虛擬機器。

環境參數

為了避免輸入錯誤以及方便區分 IP 使用環境,我們使用下列幾個按鈕來快速取代各個不同 IP。

您的機器參數:

Username : [USERNAME]

Code number : [code-num]

Host IP : [Host-IP]

VM IP : [VM-IP]

VM MAC address : [Random MAC address]

Gateway : [Gateway-IP]


實習內容

Login Server

若您使用 MS Windows, 請參閱說明 Login Server From Windows.

Open a terminal emulator and then type the following commands.

ssh [USERNAME]@cloud.cs.nchu.edu.tw -X -p [PortNUM]

安裝 KVM

確認機器是否支援硬體虛擬化技術 VMX/SVM

必須支援 vmx 或是 svm 指令集才有辦法使用硬體虛擬化加速, Intel 提供的指令集為 vmx 而 AMD 則是 svm.

egrep '(vmx|svm)' --color=always /proc/cpuinfo
flags		: fpu de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat
pse36 clflush mmx fxsr sse sse2 ht syscall nx lm nopl pni cx16 popcnt hypervisor
lahf_lm cmp_legacy svm abm sse4a

安裝 KVM 主程式及相關套件

sudo aptitude update
sudo aptitude install qemu-kvm uml-utilities socat screen

檢查 kvm 使用之 kernel module 是否載入

lsmod | grep kvm
kvm_amd                47218  0
kvm                   287662  1 kvm_amd

若沒有自動載入可以下列指令手動載入 (svm 對應到 kvm_amd, vmx 則是 kvm_intel)

sudo modprobe kvm_amd

將使用者帳號加入 kvm 群組中

sudo adduser [USERNAME] kvm
Adding user `[USERNAME]' to group `kvm' ...
Adding user [USERNAME] to group kvm
Done.

重新登入系統或重新開機

exit
ssh [USERNAME]@cloud.cs.nchu.edu.tw -X -p [PortNUM]

建立存放 KVM 相關檔案目錄

mkdir ~/KVM
cd ~/KVM

第一部虛擬機器

kvm

雖然這樣就能開啟一部虛擬機器, 但是太陽春了沒有辦法使用, 接下來我們幫他加入硬碟並且安裝作業系統.

建立虛擬硬碟,大小為 5G。

mkdir img
cd img
qemu-img create vm001.img 5G
Formatting 'vm001.img', fmt=raw size=5368709120

下載安裝光碟,上課實習我們從 Server 複製光碟以免浪費頻寬。

在此我們安裝最新的測試版本, 虛擬機器的好處就是拿來測試不穩定的軟體, 縱使壞了我們很快又能產生新的. (穩定版為 debian-7.6.0-amd64-netinst.iso)

wget http://mirror.cs.nchu.edu.tw/debian-testing-amd64-netinst.iso

若在校外我們可以從 Debian 官方網站下載

wget http://cdimage.debian.org/cdimage/weekly-builds/amd64/iso-cd/debian-testing-amd64-netinst.iso

安裝作業系統

由於遠端使用若傳回圖形環境會變得緩慢, 在此我們借助 vnc 來幫我們加速.

kvm -m 1024M -cdrom debian-testing-amd64-netinst.iso -hda vm001.img -vnc :1

打開遠端連線網頁 cloudwebui 並且以 [USERNAME][codeNUM] 帳號登入, 選擇 VM-編號

安裝過程請參考以下各圖 (圖文不相同時, 以文字為主, 切勿安裝桌面環境!)

先以 [USERNAME] 帳號登入確認可以正常使用, 接著關閉虛擬機器.
: 接下來指令是下在虛擬機器當中!

su
init 0

至此已經完成 VM 作業系統安裝, 接下來我們要進一步加強虛擬網路環境.


建置虛擬網路環境

安裝 Open vSwitch

更改 sources.list 增加 deb-src 來源, 以便抓取原始碼編譯.

sudo nano /etc/apt/sources.list
deb http://mirror.cs.nchu.edu.tw/debian/ jessie main contrib non-free
deb http://mirror.cs.nchu.edu.tw/debian/ jessie-updates main contrib non-free
deb http://mirror.cs.nchu.edu.tw/debian/ jessie-proposed-updates main contrib non-free
deb-src http://mirror.cs.nchu.edu.tw/debian/ jessie main
sudo aptitude update
sudo aptitude install build-essential module-assistant
sudo apt-get build-dep openvswitch
sudo aptitude safe-upgrade
sudo init 6&&exit
ssh [USERNAME]@cloud.cs.nchu.edu.tw -X -p [PortNUM]

下載原始碼.

cd ~/KVM
wget http://mirror.cs.nchu.edu.tw/openvswitch-latest.tar.gz

將 Open vSwitch 原始碼編譯成為 Debian 安裝檔格式 (*.deb).

tar zxvf openvswitch-*.tar.gz
rm openvswitch-*.tar.gz
cd openvswitch-*
fakeroot debian/rules binary
echo $?
0

安裝 Open vSwitch 及相依套件 (除了 debug 套件都安裝).

sudo aptitude update
sudo aptitude install dkms ipsec-tools racoon uuid-runtime python-twisted-web
cd ..
sudo dpkg -i  openvswitch-ipsec_*_amd64.deb openvswitch-pki_*_all.deb \
      openvswitch-common_*_amd64.deb openvswitch-switch_*_amd64.deb \
      openvswitch-datapath-dkms_*_all.deb openvswitch-test_*_all.deb \
      openvswitch-datapath-source_*_all.deb openvswitch-vtep_*_amd64.deb \
      python-openvswitch_*_all.deb

檢查 module 是否正常載入, 若沒有正常載入重新檢查前面步驟或重開機試試.

lsmod | grep openvswitch
openvswitch            69167  0 
gre                    12777  1 openvswitch
vxlan                  35023  1 openvswitch
libcrc32c              12426  1 openvswitch

啟動 Open vSwitch 並設定 IP address

sudo ovs-vsctl show
ovs-vsctl: unix:/var/run/openvswitch/db.sock: database connection failed (No such file or directory)

若出現此訊息表示 Open vSwitch 尚未正常初始化, 重新開機讓它重整一次

sudo init 6&&exit
ssh [USERNAME]@cloud.cs.nchu.edu.tw -X -p [PortNUM]
sudo ovs-vsctl show
7d8cb536-a3b7-4d3a-b5b7-e41f0c87f654
    ovs_version: "2.3.0"

先檢視一下目前網路狀態, 稍後建立完虛擬網路之後可以比對.

/sbin/ifconfig
eth0      Link encap:Ethernet  HWaddr 1c:c1:de:a7:fd:46  
          inet addr:[Host-IP]  Bcast:172.31.255.255  Mask:255.240.0.0
          inet6 addr: fe80::1ec1:deff:fea7:fd46/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:77 errors:0 dropped:0 overruns:0 frame:0
          TX packets:73 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:9650 (9.4 KiB)  TX bytes:11057 (10.7 KiB)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
/sbin/route -n
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         172.31.255.254  0.0.0.0         UG    0      0        0 eth0
172.16.0.0      0.0.0.0         255.240.0.0     U     0      0        0 eth0

建立 bridge 供串接實體網卡與虛擬網卡使用.

sudo ovs-vsctl add-br br0
sudo ovs-vsctl add-port br0 eth0; sudo ifconfig eth0 0.0.0.0; sudo ifconfig br0 [Host-IP]/12; sudo route add default gw [Gateway-IP]
sudo ovs-vsctl show
cc1170c9-0f10-45db-87af-44cf82b714b2
    Bridge "br0"
        Port "br0"
            Interface "br0"
                type: internal
        Port "eth0"
            Interface "eth0"
    ovs_version: "2.0.90"
/sbin/ifconfig
br0       Link encap:Ethernet  HWaddr 1c:c1:de:a7:fd:46  
          inet addr:[Host-IP]  Bcast:172.31.255.255  Mask:255.240.0.0
          inet6 addr: fe80::1ec1:deff:fea7:fd46/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:23 errors:0 dropped:0 overruns:0 frame:0
          TX packets:27 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:1764 (1.7 KiB)  TX bytes:3214 (3.1 KiB)

eth0      Link encap:Ethernet  HWaddr 1c:c1:de:a7:fd:46  
          inet6 addr: fe80::1ec1:deff:fea7:fd46/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:266 errors:0 dropped:0 overruns:0 frame:0
          TX packets:251 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:26278 (25.6 KiB)  TX bytes:31109 (30.3 KiB)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
/sbin/route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         172.31.255.254  0.0.0.0         UG    0      0        0 br0
172.16.0.0      0.0.0.0         255.240.0.0     U     0      0        0 br0

萬一參數設定錯誤網路掛掉了怎麼辦!! 這個時候請打開遠端連線網頁 cloudwebui 並且以 [USERNAME][codeNUM] 帳號登入, 選擇 Host-編號. 使用網頁界面登入 console 端進行修復.

若系統中已無其他 VM 存在時,關閉 Open vSwitch 歸還系統資源。

sudo ovs-vsctl del-port br0 eth0; sudo ifconfig br0 down; sudo ifconfig eth0 [Host-IP]/12; sudo route add default gw [Gateway-IP]
sudo ovs-vsctl del-br br0
sudo ovs-vsctl show
7d8cb536-a3b7-4d3a-b5b7-e41f0c87f654
    ovs_version: "2.3.0"

由於每次開關機都要做此設定, 相當麻煩而且手動輸入容易發生錯誤, 因此我們將指令寫成 shell script 方便將來使用.

mkdir ~/KVM/bin
cd ~/KVM/bin
nano ovs-start
#! /bin/bash

sudo ovs-vsctl add-br br0
sudo ovs-vsctl add-port br0 eth0
sudo ifconfig eth0 0.0.0.0
sudo ifconfig br0 [Host-IP]/12
sudo route add default gw [Gateway-IP]
sudo ovs-vsctl show
nano ovs-stop
#! /bin/bash

sudo ovs-vsctl del-port br0 eth0
sudo ifconfig br0 down
sudo ifconfig eth0 [Host-IP]/12
sudo route add default gw [Gateway-IP]
sudo ovs-vsctl del-br br0
sudo ovs-vsctl show
chmod +x ovs-st*
ls -l
total 8
-rwxr-xr-x 1 [USERNAME] [USERNAME] 195 Sep 22 04:53 ovs-start
-rwxr-xr-x 1 [USERNAME] [USERNAME] 189 Sep 22 04:53 ovs-stop

使用剛剛建立的 script 來建立 Open vSwitch bridge

~/KVM/bin/ovs-start
64ab3ed8-5b10-442d-8f94-983d8b6dff6d
    Bridge "br0"
        Port "eth0"
            Interface "eth0"
        Port "br0"
            Interface "br0"
                type: internal
    ovs_version: "2.3.0"

建立虛擬網卡供虛擬機器使用並將其與實體網卡串接

在此我們需要使用 /dev/net/tun 裝置來建立虛擬網卡, tun/tap 為 uml-utilities 套件所提供. 首先檢查權限使否足夠使用 (666, crw-rw-rw-).

ls -l /dev/net/tun
crw-rw-rw- 1 root root 10, 200 Sep 22 03:31 /dev/net/tun

若權限不足則用以下指令來修改權限.

sudo chmod 666 /dev/net/tun

建立 tap0 虛擬網路卡

sudo tunctl -u [USERNAME] -t tap0
sudo ifconfig tap0 up
sudo ovs-vsctl add-port br0 tap0

修改 KVM 開機參數,令其使用 Open vSwitch 連接網路

cd ~/KVM/img
kvm -m 1024M \
    -net nic,vlan=0,netdev=tap0,macaddr=[MAC-address],model=virtio \
    -netdev tap,id=tap0,ifname=tap0,script=no \
    -vnc :1 \
    -hda vm001.img &

打開遠端連線網頁 cloudwebui 並且使用 [USERNAME][codeNUM]登入網頁, 選擇 VM-編號. 使用 [USERNAME] 帳號登入虛擬機器, 接著設定虛擬機器 IP address, DNS server.

su
nano /etc/network/interfaces
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
auto eth0         
iface eth0 inet static
  address [VM-IP]
  netmask 255.240.0.0
  gateway [Gateway-IP]
nano /etc/resolv.conf
nameserver 140.120.13.1
nameserver 140.120.1.2
nameserver 8.8.8.8
init 6

再次在網頁界面使用 [USERNAME] 帳號登入虛擬機器, 測試網路是否有通.

ping -c 3 www.google.com
PING www.google.com (74.125.23.104) 56(84) bytes of data.
64 bytes from tg-in-f104.1e100.net (74.125.23.104): icmp_seq=1 ttl=43 time=13.7 ms
64 bytes from tg-in-f104.1e100.net (74.125.23.104): icmp_seq=2 ttl=43 time=16.6 ms
64 bytes from tg-in-f104.1e100.net (74.125.23.104): icmp_seq=3 ttl=43 time=12.9 ms

--- www.google.com ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2003ms
rtt min/avg/max/mdev = 12.951/14.452/16.647/1.592 ms

最後讓我們試試看使用 ssh 來遠端登入虛擬機器.

首先試試看從 Host-[code-num] 登入 VM-[code-num].

ssh [VM-IP]
exit

接下來試試看直接進入, 不透過 Host-[code-num]. 我們開啟另一個 terminal 來登入

ssh [USERNAME]@cloud.cs.nchu.edu.tw -X -p [VMPortNUM]

關閉虛擬機器並且, 恢復網路環境.

關閉虛擬機器

su
init 0

在 Host-[code-num] 觀察 VM 是否有關閉

ps aux |grep kvm
root       182  0.0  0.0      0     0 ?        S<   Sep30   0:00 [kvm-irqfd-clean]
cloud     1496  0.0  0.0  12668  1972 pts/0    S+   00:20   0:00 grep kvm

若出現剛才開機所下的指令, 則代表虛擬機器仍在執行, 使用網頁介面登入檢查.

關閉虛擬網卡

sudo ovs-vsctl del-port tap0
sudo ifconfig tap0 down
sudo tunctl -d tap0
Set 'tap0' nonpersistent

同樣地使用先前建立的 script 來還原網路.

~/KVM/bin/ovs-stop
7d8cb536-a3b7-4d3a-b5b7-e41f0c87f654
    ovs_version: "2.3.0"

Bonus

使用 Shell Script 來管理虛擬機器

做到這裡大家應該發現到, 開關虛擬機器所需指令以及參數眾多, 徒手下達指令開關機不僅沒有效率, 也容易出錯. 因此, 通常我們會使用 Shell Script 來管理虛擬機器. : 接下來的步驟必須完成先前內容才可正常執行!

首先下載 Scripts 並且解壓縮到我們的目錄裡.

cd ~/KVM
wget http://mirror.cs.nchu.edu.tw/KVM-tool-lite-latest.tgz
tar zxvf KVM-tool-lite-latest.tgz
rm KVM-tool-lite-latest.tgz
sudo mkdir /mnt/tmp
cd ~/KVM/bin

執行一次 script, 在 Unix like 系統中如果必須使用參數才能使用的指令, 不加參數或者是參數數量不對時會顯示說明文字.

./Config-Kvm
./Config-Kvm OS.img hostname VM-IP Bridge TAP-No

由於是 Bonus 內容, 請同學發揮您的智慧, 自行取代參數, 以下僅說明各項參數意義, 如遇到問題可參考 FAQ. 建議同學先了解 script 內容再進行. 盲目嘗試可能會弄壞你的環境.

  1. OS.img: 虛擬硬碟路徑
  2. hostname: 虛擬機器名稱
  3. VM-IP: 虛擬機器 IP 位址
  4. Bridge: 虛擬機器欲橋接的橋接器名稱
  5. TAP-NO: 虛擬網路卡編號

I got ../img/vm001.img format is: raw I got current IP: [Host-IP], FakeMac: 44:1e:a1:84:f8:24
ls -l
total 52
-rwxr-xr-x 1 cloud cloud 8584 Sep 25 21:24 Config-Kvm
-rwxr-xr-x 1 cloud cloud 8607 Sep 25 21:14 Config-Kvm-vhoston
-rwxr-xr-x 1 cloud cloud  527 Aug 28 03:39 FakeMac.sh
-rwxr-xr-x 1 cloud cloud  194 Sep 30 23:46 ovs-start
-rwxr-xr-x 1 cloud cloud  191 Sep 30 23:46 ovs-stop
-rwxr-xr-x 1 cloud cloud  884 Oct  1 00:33 start-VM-[code-num]-1
-rwxr-xr-x 1 cloud cloud  914 Oct  1 00:33 start-VM-[code-num]-1-AsDaemon
-rwxr-xr-x 1 cloud cloud  897 Oct  1 00:33 stop-VM-[code-num]-restore-lan-1
-rwxr-xr-x 1 cloud cloud  245 Aug 28 18:50 vhostOn.sh

執行 start-VM-[code-num]-1-AsDaemon 開啟 VM (screen mode)

執行 stop-VM-[code-num]-restore-lan-1 關閉 VM

此 script 並無使用 vnc, 您可以自行修改, 或是使用 screen 來 debug, 最後以 ssh 登入使用.


Assignment#1

  1. 完成所有課程內容.
  2. 虛擬機器網路正常運作. (可連外)
  3. 將虛擬機器建置成為網頁伺服器. (網頁內容包含姓名學號即可)
  4. 以 Bonus 中之 scripts 來建置虛擬機器. (請在網頁上附註操作 Bonus 內容, 記得關閉其他沒用到的虛擬機器.)

作業繳交期限 10/29

作業檢查 / 測試頁


FAQ (2013)