1. 程式人生 > >在CentOS7上執行KVM虛擬機器

在CentOS7上執行KVM虛擬機器

準備工作

檢查CPU特性

CPU應該支援vmx特性以更好地執行KVM虛擬機器:lscpu | grep vmx

安裝必要的軟體包

sudo yum install -y epel-release net-tools vim unzip zip wget ftp

安裝KVM及其依賴

sudo yum install -y qemu-kvm libvirt virt-install bridge-utils

驗證安裝結果

$ lsmod | grep ^kvm
kvm_intel             174250  0 
kvm                   570658  1 kvm_intel

啟動服務並設定為開機自動執行

systemctl start libvirtd
systemctl enable libvirtd

檢查服務狀態:

systemctl status libvirtd
systemctl is-enabled libvirtd

建立網路環境

建立網橋kvmbr0

[[email protected] ~]$ sudo su -
[[email protected] ~]# cd /etc/sysconfig/network-scripts/
[[email protected] network-scripts]# vi ifcfg-kvmbr0
......
[
[email protected]
network-scripts]# cat ifcfg-kvmbr0 DEVICE=kvmbr0 NAME=kvmbr0 ONBOOT=yes TYPE=Bridge BOOTPROTO=dhcp NM_CONTROLLED=no DELAY=0

修改當前網絡卡配置,更新如下幾行為:

BOOTPROTO=none
BRIDGE=kvmbr0
NM_CONTROLLED=no

重啟網路:

[[email protected] network-scripts]# service network restart
Restarting network (via systemctl):                        [  OK  ]

檢查網路設定:

[[email protected] network-scripts]# ifconfig kvmbr0
kvmbr0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.66.15.173  netmask 255.255.254.0  broadcast 10.66.15.255
        inet6 fe80::4ecc:6aff:fec5:ad0d  prefixlen 64  scopeid 0x20<link>
        ether 4c:cc:6a:c5:ad:0d  txqueuelen 1000  (Ethernet)
        RX packets 1613  bytes 118768 (115.9 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 74  bytes 10467 (10.2 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

[[email protected] network-scripts]# ifconfig eno1
eno1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet6 fe80::4ecc:6aff:fec5:ad0d  prefixlen 64  scopeid 0x20<link>
        ether 4c:cc:6a:c5:ad:0d  txqueuelen 1000  (Ethernet)
        RX packets 50352153  bytes 7052127783 (6.5 GiB)
        RX errors 0  dropped 111  overruns 0  frame 0
        TX packets 2944305  bytes 2436350686 (2.2 GiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
        device interrupt 16  memory 0xdf000000-df020000  

使用KVM虛擬機器

方案一:使用KVM建立一臺不帶作業系統的虛擬機器,然後使用安裝映象或網路服務為其安裝作業系統; 方案二:直接下載作業系統的“guest image”並由其直接執行虛擬機器。

第二種方法可以省去作業系統的安裝過程,因此效率比較高,也比較省事,這裡著重介紹這種方法。

下載作業系統的guest image

CentOS官方的下載頁面中,找到供Cloud使用的映象檔案,使用wget等命令將其下載到物理機中。

wget http://cloud.centos.org/centos/7/images/CentOS-7-x86_64-GenericCloud.qcow2.xz

準備磁碟映象

準備虛擬機器的系統盤:

[[email protected] kvm_workspace]$ mkdir vm1
[[email protected] kvm_workspace]$ cd vm1
[[email protected] vm1]$ cp ../CentOS-7-x86_64-GenericCloud.qcow2.xz .
[[email protected] vm1]$ xz -d CentOS-7-x86_64-GenericCloud.qcow2.xz 
[[email protected] vm1]$ mv CentOS-7-x86_64-GenericCloud.qcow2 vm1.qcow2

接下來需要對映象做一些修改,步驟中用到的virt-editguestfish命令來源於libguestfs專案,如果找不到這兩個工具,可以通過命令sudo yum install libguestfs*來安裝。

出於安全原因,我們無法登入root使用者,因此我們需要清空映象中的root密碼:

sudo virt-edit -a ./vm1.qcow2 /etc/shadow -e 's/^root:[^:]*:/root::/'

在沒有配置cloud-init的情況下,這個服務將耗費將近5分鐘的啟動時間,因此最好把它禁用掉:

sudo guestfish -a ./vm1.qcow2 -i rm '/etc/systemd/system/multi-user.target.wants/cloud-config.service'
sudo guestfish -a ./vm1.qcow2 -i rm '/etc/systemd/system/multi-user.target.wants/cloud-final.service'
sudo guestfish -a ./vm1.qcow2 -i rm '/etc/systemd/system/multi-user.target.wants/cloud-init-local.service'
sudo guestfish -a ./vm1.qcow2 -i rm '/etc/systemd/system/multi-user.target.wants/cloud-init.service'

建立和管理虛擬機器

建立一個xml檔案,並更改其資訊為:

[[email protected] vm1]$ vi vm1.xml 
[[email protected] vm1]$ cat vm1.xml 
<domain type='kvm'>
  <name>vm1</name>
  <memory unit='KiB'>1048576</memory>
  <vcpu placement='static'>2</vcpu>
  <os>
    <type arch='x86_64' machine='pc-i440fx-rhel7.0.0'>hvm</type>
    <boot dev='hd'/>
  </os>
  <features>
    <acpi/>
    <apic/>
  </features>
  <on_poweroff>destroy</on_poweroff>
  <on_reboot>restart</on_reboot>
  <on_crash>restart</on_crash>
  <devices>
    <emulator>/usr/libexec/qemu-kvm</emulator>
    <disk type='file' device='disk'>
      <driver name='qemu' type='qcow2'/>
      <source file='/home/cheshi/kvm_workspace/vm1/vm1.qcow2'/>
      <target dev='vda' bus='virtio'/>
    </disk>
    <interface type='bridge'>
      <mac address='52:54:00:da:ac:e5'/>
      <source bridge='kvmbr0'/>
      <model type='virtio'/>
    </interface>
    <console type='pty'>
      <target type='serial' port='0'/>
    </console>
  </devices>
</domain>

建立一臺虛擬機器:

[[email protected] vm1]$ sudo virsh define ./vm1.xml 
Domain vm1 defined from ./vm1.xml

啟動虛擬機器:

[[email protected] vm1]$ sudo virsh start vm1
Domain vm1 started

連線虛擬機器console(使用Ctrl+]退出):

[[email protected] vm1]$ sudo virsh console vm1
Connected to domain vm1
Escape character is ^]

CentOS Linux 7 (Core)
Kernel 3.10.0-862.14.4.el7.x86_64 on an x86_64

dhcp-15-92 login: root
Last login: Mon Oct 29 07:16:27 on ttyS0
[[email protected] ~]# ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=34 time=46.5 ms

--- 8.8.8.8 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 46.574/46.574/46.574/0.000 ms
[[email protected] ~]# exit
logout

CentOS Linux 7 (Core)
Kernel 3.10.0-862.14.4.el7.x86_64 on an x86_64

dhcp-15-92 login: 

關閉虛擬機器:

[[email protected] vm1]$ sudo virsh shutdown vm1
Domain vm1 is being shutdown

檢視虛擬機器狀態:

[[email protected] vm1]$ sudo virsh list --all
 Id    Name                           State
----------------------------------------------------
 -     centos-minion1                 shut off
 -     vm1                            shut off

銷燬虛擬機器:

[[email protected] vm1]$ sudo virsh undefine vm1
Domain vm1 has been undefined
[[email protected] vm1]$ sudo virsh list --all
 Id    Name                           State
----------------------------------------------------
 -     centos-minion1                 shut off

[[email protected] vm1]$ 

virsh命令參考:

命令 說明
autostart 自動開始一個域
create 從一個 XML 檔案建立一個域
define 從一個 XML 檔案定義(但不開始)一個域
edit 編輯某個域的 XML 配置
shutdown 關閉一個域
start 開始一個(以前定義的)非活躍的域
reboot 重新啟動一個域
suspend 掛起一個域
resume 重新恢復一個域
vncdisplay vnc 顯示
undefine 刪除虛擬機器,只是刪除VM的配置檔案,並不刪除虛擬磁碟檔案
console 連線虛擬機器控制檯

使用圖形介面管理虛擬機器

執行virt-manager:

sudo virt-manager

建立虛擬機器:

  1. “File” > “New Virtual Machine”;
  2. 在"Choose how you would like to install the OS"處,選擇"Import existing disk image";
  3. 在"Provide the existing storage path"處,選擇"Browse…";
  4. 彈出對話方塊中選擇"Browse Local"並載入"/home/cheshi/kvm_workspace/vm1/vm1.qcow2"檔案並選擇"Choose Volume";
  5. 在"Choose an operating system type and version"處,選擇"Linux"和"CentOS 7.0",點選"Forward";
  6. 設定"Memory"和"CPUs",點選"Forward";
  7. 在"Name"處填上虛擬機器的名字,在"Network selection"處選擇"Bridge kvmbr0",最後點選"Finish"。

使用圖形介面管理虛擬機器比較直觀,這裡不再過多介紹。

參考資料