虛擬化技術之kvm虛擬機建立工具qemu-kvm

  在前邊的博客中咱們介紹瞭如何建立kvm虛擬機,以及一些經常使用的工具的介紹和使用,今天咱們來了解下kvm原始工具qemu-kvm;爲何說qemu-kvm是一個原始的工具呢,若是你用kvm虛擬機,心細的你必定會發現咱們無論用什麼工具建立kvm虛擬機,在宿主機上表現的都是一個以/usr/libexec/qemu-kvm的進程;這意味着咱們以前用的工具它們都調用了qemu-kvm這個工具來建立虛擬機,從而咱們在宿主機上看到的都是qemu-kvm進程;以下所示:html

  提示:以上centos7這個虛擬機是咱們以前使用virt-install這個工具在命令行中直接建立的;node

  qemu-kvm這個工具是使用kvm虛擬機時核心工具,從上面的進程信息能夠看到,它能夠完整的實現一個虛擬機實例,模擬出各類IO設備;其實咱們在使用內核kvm功能時,咱們只安裝qemu-kvm就可使用qemu-kvm這個用戶空間工具來使用內核kvm功能了;centos

  好了,接下來咱們來看看這個神奇的工具qemu-kvm吧!!qemu-kvm這個工具默認安裝之後,它會把二進制文件放到/usr/libexec/這個目錄下,它這樣作的主要目的是不讓用戶直接在命令行執行它,爲了咱們不用每次都寫絕對路徑,咱們能夠把這個工具連接到咱們的PATH環境變量的目錄下。緩存

  一、連接qemu-kvm到/usr/bin/目錄下bash

[root@node1 ~]# ll /usr/libexec/qemu-kvm 
-rwxr-xr-x 1 root root 5259704 5月  12 23:44 /usr/libexec/qemu-kvm
[root@node1 ~]# ln -sv /usr/libexec/qemu-kvm /usr/bin/
"/usr/bin/qemu-kvm" -> "/usr/libexec/qemu-kvm"
[root@node1 ~]# ll /usr/bin/qemu-kvm 
lrwxrwxrwx 1 root root 21 8月  21 18:20 /usr/bin/qemu-kvm -> /usr/libexec/qemu-kvm
[root@node1 ~]# 

  二、查看qemu-kvm的幫助網絡

  提示:從上面的過濾信息可瞭解到,qemu-kvm這個工具備標準選項,塊設備相關選項,usb相關選項,顯示相關選項,網絡相關選項,字符設備相關選項,引導相關選項等等;架構

  三、qemu-kvm工具使用語法格式socket

[root@node1 ~]# qemu-kvm -h
QEMU emulator version 1.5.3 (qemu-kvm-1.5.3-173.el7_8.3), Copyright (c) 2003-2008 Fabrice Bellard

WARNING: Direct use of qemu-kvm from the command line is not supported by Red Hat.
WARNING: Use libvirt as the stable management interface.
WARNING: Some command line options listed here may not be available in future releases.

usage: qemu-kvm [options] [disk_image]

'disk_image' is a raw hard disk image for IDE hard disk 0

  提示:從上面的幫助信息能夠看到,qemu-kvm這個工具使用很簡單,就是qemu-kvm +一堆選項來建立虛擬機;ide

  四、qemu-kvm標準選項工具

    -machine [type=]name:-machine help是用來獲取支持的主機類型列表,該選項用來指定虛擬主機的類型;支持的類型有kvm, xen, tcg,默認不指定是tcg類型;

    -cpu cpu:-cpu help來獲取支持的cpu類型列表;用於指定要模擬的CPU型號;-cpu hsot表示模擬和宿主機同樣信號的cpu

    -smp n[,maxcpus=cpus][,cores=cores][,threads=threads][,sockets=sockets]:用於指定cpu架構,其中socket表示有幾顆CPU;cores表示每顆cup有幾核心;threads表示每一個CPU核心有機線程;maxcpus=socket*cores*threads;n等於小於maxcpus便可;

    -boot [order=drives][,once=drives][,menu=on|off] [,splash=sp_name][,splash-time=sp_time][,reboot-timeout=rb_time][,strict=on|off]:該選項用於指定啓動設備順序的;order:各設備的引導次序:c表示第一塊硬盤,d表示第一個光驅設備;-boot order=dc,once=d;once表示第一次啓動使用什麼設備引導,once=d表示第一次啓動使用光驅設備引導;

    -m megs:以M爲單位指定虛擬機的內存大小;

    -name NAME:指定當前虛擬機的名稱,要唯一;

  五、塊設備相關的選項

    -hda/-hdb file:指明IDE總線類型的磁盤映射文件路徑;第0和第1個;依次類推-hdc/-hdd file就表示第2和第3個IDE類型的磁盤;一般這種方式使用的不多,比較經常使用的方式是直接用-drive 來指定設備總線的類型;

    -cdrom file:指定要使用光盤映像文件;

    -drive [file=file][,if=type][,media=d][,index=i] [,cache=writethrough|writeback|none|directsync|unsafe][,format=f]:用來指定虛擬設備的相關屬性;其中file表示映像文件;if=TYPE:塊設備總線類型,經常使用的總線類型有ide, scsi, sd, floppy, virtio等等;media=TYPE:介質類型,經常使用的介質類型有cdrom和disk;index=i:設定同一類型設備多個設備的編號;cache=writethrough|writeback|none|directsync|unsafe:緩存方式;none表示不使用cache;format=f:磁盤映像文件的格式;

  六、顯示相關選項

    -display type:顯示的類型,sdl, curses, none和vnc;

    -nographic:不使用圖形接口; 不使用圖形接口就表示沒有顯卡,沒有顯卡就只能使用串口來串行顯示;

    -vga [std|cirrus|vmware|qxl|xenfb|none]:模擬出的顯卡的型號;

    -vnc display[,option[,option[,...]]]]:啓動一個vnc server來顯示虛擬機接口; 讓qemu進程監聽一個vnc接口;在前邊的博客中咱們也介紹過vnc,vnc會與窗口號進行關聯,第0號窗口就對應宿主機的5900端口;咱們能夠這樣理解,第n號窗口,它對應宿主機上的端口就是5900+n;這裏的n是從0開始;一般咱們這裏指定的都是窗口號;固然也是能夠值指定監聽的地址和端口,也能夠指定密碼;

    -monitor stdio:在標準輸出上顯示monitor界面;Ctrl-a, c:在console和monitor之間切換;

  七、網絡相關選項

    -net nic[,vlan=n][,macaddr=mac][,model=type][,name=str][,addr=str][,vectors=v]:用於指定建立虛擬機時在虛擬機上對應的接口相關屬性;model=type:指明模擬出的網卡的型號,經常使用的網卡型號有ne2k_pci,i82551,i82557b,i82559er,rtl8139,e1000,pcnet,virtio;可使用qemu-kvm -net nic,model=?來查看支持虛擬的網卡型號;macaddr=mac:指明mac地址;默認是52:54:00:開頭;

    -net tap[,vlan=n][,name=str][,fd=h][,fds=x:y:...:z][,ifname=name][,script=file][,downscript=dfile]:用於指定建立虛擬機時在宿主機上對應的接口相關屬性;script=file:啓動虛擬機時要執行的腳本,默認爲/etc/qemu-ifup(通常須要手動編寫);downscript=dfile:關閉虛擬機時要執行的腳本,/etc/qemu-ifdown(不須要手動編寫,它自身就能夠不依賴腳本從而卸載掉相關接口);ifname=NAME:自定義接口名稱;

  八、其餘選項

    -daemonize:以守護進程運行;

  好了,簡單的瞭解了上述的選項之後咱們就能夠來使用qemu-kvm建立一個虛擬機了;

  示例:用qemu-kvm來建立虛擬機

  準備工做

  建立磁盤,這個步驟若是還不熟悉,請參考個人博客《虛擬化技術之kvm磁盤管理工具qemu-img》;

[root@node1 ~]# ll /kvm/images/
總用量 1560712
-rw-r--r-- 1 qemu qemu 1598226432 8月  21 19:08 centos7.qcow2
[root@node1 ~]# qemu-img create -f qcow2 /kvm/images/test.img 5G
Formatting '/kvm/images/test.img', fmt=qcow2 size=5368709120 encryption=off cluster_size=65536 lazy_refcounts=off 
[root@node1 ~]# ll /kvm/images/
總用量 1560908
-rw-r--r-- 1 qemu qemu 1598226432 8月  21 19:08 centos7.qcow2
-rw-r--r-- 1 root root     197120 8月  21 19:18 test.img
[root@node1 ~]#

  準備/etc/qemu-ifup腳本

#!/bin/bash

bridge=br0

if [ -n "$1" ];then
        ip link set $1 up
        sleep 1
        brctl addif $bridge $1
        [ $? -eq 0 ]&& exit 0 || exit 1
else
        echo "Error:no interface specified."
        exit 1
fi
View Code

  提示:以上腳本就作了一件事,判斷傳過來的網卡是否存在,若是存在就把它關聯到$bridge指定的橋上,並啓動起來;若是傳過來的網卡名稱不存在,則報錯沒有指定的網卡,而後退出;最後別忘記給這個腳本加上可執行權限;

  查看宿主機上是否有br0,沒有就建立一個br0,並把宿主機網卡ens33橋接到br0上;

[root@node1 ~]# ifconfig -a
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.0.41  netmask 255.255.255.0  broadcast 192.168.0.255
        inet6 fe80::20c:29ff:fe9a:dbd6  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:9a:db:d6  txqueuelen 1000  (Ethernet)
        RX packets 3943  bytes 356924 (348.5 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 2719  bytes 545299 (532.5 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 40  bytes 3112 (3.0 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 40  bytes 3112 (3.0 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

virbr0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.122.1  netmask 255.255.255.0  broadcast 192.168.122.255
        ether 52:54:00:45:06:15  txqueuelen 1000  (Ethernet)
        RX packets 285  bytes 18774 (18.3 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 246  bytes 19814 (19.3 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

virbr0-nic: flags=4098<BROADCAST,MULTICAST>  mtu 1500
        ether 52:54:00:45:06:15  txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

vnet0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet6 fe80::fc54:ff:feff:51f1  prefixlen 64  scopeid 0x20<link>
        ether fe:54:00:ff:51:f1  txqueuelen 1000  (Ethernet)
        RX packets 285  bytes 22764 (22.2 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 4051  bytes 217914 (212.8 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

[root@node1 ~]# 

  提示:從上面的輸出信息能夠看到br0並不存在;

  手動建立br0配置文件,並修改ens33的配置文件

[root@node1 network-scripts]# cat ifcfg-br0 
TYPE=Bridge
NAME=br0
DEVICE=br0
ONBOOT=yes
IPADDR=192.168.0.41
PREFIX=24
GATEWAY=192.168.0.1
DNS1=192.168.0.1
[root@node1 network-scripts]# cat ifcfg-ens33
TYPE=Ethernet
NAME=ens33
DEVICE=ens33
ONBOOT=yes
BRIDGE=br0
[root@node1 network-scripts]# 

  重啓網絡

[root@node1 network-scripts]# systemctl restart network
[root@node1 network-scripts]# 
[root@node1 network-scripts]# ifconfig
br0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.0.41  netmask 255.255.255.0  broadcast 192.168.0.255
        inet6 fe80::cc1c:b2ff:fe49:1138  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:9a:db:d6  txqueuelen 1000  (Ethernet)
        RX packets 20  bytes 2000 (1.9 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 36  bytes 4708 (4.5 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        ether 00:0c:29:9a:db:d6  txqueuelen 1000  (Ethernet)
        RX packets 4544  bytes 411254 (401.6 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 3108  bytes 608414 (594.1 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 40  bytes 3112 (3.0 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 40  bytes 3112 (3.0 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

virbr0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.122.1  netmask 255.255.255.0  broadcast 192.168.122.255
        ether 52:54:00:45:06:15  txqueuelen 1000  (Ethernet)
        RX packets 287  bytes 18878 (18.4 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 248  bytes 19946 (19.4 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

vnet0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet6 fe80::fc54:ff:feff:51f1  prefixlen 64  scopeid 0x20<link>
        ether fe:54:00:ff:51:f1  txqueuelen 1000  (Ethernet)
        RX packets 287  bytes 22896 (22.3 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 4312  bytes 231514 (226.0 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

[root@node1 network-scripts]#

  提示:若是重啓網絡後,crt沒有斷開,說明咱們配置的網絡沒有問題;從上面的信息能夠看到br0已經建立,而且擁有一個地址咱們在配置文件中指定的ip地址,而ens33它直接橋接到br0上了;

  準備好以腳本,磁盤文件,網絡環境後,咱們就能夠來建立一個橋接到br0的虛擬機

[root@node1 network-scripts]# virsh list --all
 Id    名稱                         狀態
----------------------------------------------------
 1     centos7                        running

[root@node1 network-scripts]# qemu-kvm -name test \
> -smp 2,maxcpus=4,sockets=2,cores=2 \
> -m 1024 \
> -cpu host \
> -drive file=/kvm/images/test.img,media=disk,if=virtio,cache=writeback,format=qcow2, \
> -drive file=/kvm/iso/CentOS-7-x86_64-Minimal-1708.iso,media=cdrom \
> -boot order=dc,once=d \
> -vnc :1 \
> -net nic,macaddr=52:54:00:00:00:01,model=virtio \
> -net tap,script=/etc/qemu-ifup \
> -daemonize
[root@node1 network-scripts]# virsh list --all
 Id    名稱                         狀態
----------------------------------------------------
 1     centos7                        running

[root@node1 network-scripts]#

  提示:默認直接手動使用qemu-kvm建立的虛擬機,在virsh list 中是看不到的;

  提示:從上面的截圖來看,咱們建立的虛擬機應該正常跑起來了,咱們指定的1號窗口對應的端口已經處於監聽狀態,在進程列表中也能看到咱們手動執行的命令也運行成進程;

  驗證:用vnc鏈接宿主機的1號窗口,看看是否有虛擬機運行?

  提示:經過vnc鏈接1號窗口,能夠看到咱們指定的虛擬機已經建立好,正等着咱們去裝系統;

  提示:裝好系統之後,咱們須要關閉虛擬機(直接kill掉宿主機對應的進程便可),啓動虛擬機時咱們須要把光驅給卸載掉(不指定光驅設備),或者修改啓動次序,否則它會一直以光驅作系統引導;

  關閉虛擬機

  修改啓動次序,再次啓動虛擬機

  提示:這裏咱們在原有的命令上,把once=d修改爲once=c,其餘選項都不要變;意思本次建立虛擬機,第一引導設備上是第一塊硬盤;

  如今用vnc鏈接宿主機的1號窗口,看看虛擬機裏裝的系統是否啓動起來了呢?

  提示:能夠看到虛擬機裏的系統已經正常啓動了;從上面的過程來看,qemu-kvm本質上沒有像virt-manager那樣用圖形界面建立虛擬機,裝系統簡單,咱們須要手動的去指定各類設備,以及解決啓動順序,網絡等等問題;因此一般qemu-kvm是經過一個磁盤鏡像模板(就是裝有系統的磁盤文件),而後配合網絡環境來啓動虛擬機;

  從上面vnc鏈接虛擬機控制檯看,eth0處於關閉狀態,接下來咱們把eth0啓動起來,看看它是否獲取同宿主機br0橋上同網段的ip地址呢?

  提示:臨時啓動eth0之後,能夠看到eth0上就獲取到了一個192.168.0.0網段地址,和宿主機br0在同一網段,說明虛擬機的網絡是橋接到宿主機上的物理網卡上;以上是臨時啓動eth0,若是要開機自動啓動,須要修改其配置文件便可;

相關文章
相關標籤/搜索