由於公司需要不得不要搭建Linux環境,自己做的課題是ELK日志分析相關。因此要大干一場,一下子計划采用近10台機器來做試驗,但由於我這里只有三台物理機,所以我就搞起了虛擬化kvm。在Linux里面要安裝三台Linux系統。滿足實驗的要求來。本次我們講解的環境全部都是在文本界面下安裝,沒有使用圖形桌面和VNC工具圖形展示。
1、首先是准備一台物理機,安裝上去Linux操作系統,這里使用centos7.5版本。在安裝kvm之前需要檢測系統CPU是否支持虛擬化
[root@chaofeng ~]# grep -Ei 'vmx|svm' /proc/cpuinfo flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts mmx fxsr sse sse2 ss syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts nopl xtopology tsc_reliable nonstop_tsc aperfmperf eagerfpu pni pclmulqdq vmx ssse3 cx16 pcid sse4_1 sse4_2 x2apic popcnt aes xsave avx hypervisor lahf_lm epb tpr_shadow vnmi ept vpid xsaveopt dtherm ida arat pln pts
如果有過濾出vmx或svm關鍵字就代表支持虛擬化,vmx是Intel的CPU,svm是AMD的CPU
2、開始安裝kvm環境,此處需要epel的yum源,如果系統沒有安裝,可使用yum install -y epel-release來一鍵安裝或者安裝阿里雲的epel源(點擊)也可以。
yum install -y kvm qemu-kvm python-virtinst libvirt libvirt-python virt-manager libguestfs-tools bridge-utils virt-install
此處稍微花費點時間。
3、安裝好之后,我們設置為開機啟動項
#systemctl enable libvirtd
#reboot
重啟過后檢測是否加載kvm模塊
[root@chaofeng boot]# lsmod | grep kvm kvm_intel 183705 9 kvm 615914 1 kvm_intel irqbypass 13503 7 kvm
查看kvm程序有沒有真正啟動。
[root@chaofeng network-scripts]# ps aux | grep libvirtd root 6242 0.0 0.7 1346152 11424 ? Ssl 06:46 0:01 /usr/sbin/libvirtd root 7910 0.0 0.0 112712 976 pts/4 S+ 07:53 0:00 grep --color=auto libvirtd
如果沒有的話,我們就使用systemctl start libvirtd來啟動程序。
4、配置網卡
我自己選擇的是橋接模式組件網絡,因為我需要連同各個不同物理機上的虛擬機才行。關於橋接模式與NAT模式的區別,大家可以自行百度查看。我這里僅僅列出實現的方法。
在橋接模式中,三台虛擬機使用的是同一個橋接網卡。
3.1、首先是復制一份物理網卡ens33的配置文件並命名為ens33
cd /etc/sysconfig/network-scripts/
cp ifcfg-ens33 ifcfg-br0
3.2、修改ens33網卡配置文件
[root@chaofeng network-scripts]# cat ifcfg-ens33 TYPE=Ethernet PROXY_METHOD=none BROWSER_ONLY=no BOOTPROTO=static DEFROUTE=yes IPV4_FAILURE_FATAL=no IPV6INIT=yes IPV6_AUTOCONF=yes IPV6_DEFROUTE=yes IPV6_FAILURE_FATAL=no IPV6_ADDR_GEN_MODE=stable-privacy NAME=ens33 UUID=ccecf4a6-b71e-43ec-bd26-78af2a3f6ba5 DEVICE=ens33 ONBOOT=yes IPADDR=192.168.15.10 NETMASK=255.255.255.0 GATEWAY=192.168.15.2 DNS1=192.168.1.1 BRIDGE=br0
主要是增加最后一行內容
3.3、修改br0配置文件
[root@chaofeng network-scripts]# cat ifcfg-br0 TYPE=Bridge PROXY_METHOD=none BROWSER_ONLY=no BOOTPROTO=static DEFROUTE=yes IPV4_FAILURE_FATAL=no IPV6INIT=yes IPV6_AUTOCONF=yes IPV6_DEFROUTE=yes IPV6_FAILURE_FATAL=no IPV6_ADDR_GEN_MODE=stable-privacy NAME=br0 #UUID=ccecf4a6-b71e-43ec-bd26-78af2a3f6ba5 DEVICE=br0 ONBOOT=yes IPADDR=192.168.15.11 NETMASK=255.255.255.0 GATEWAY=192.168.15.2 DNS1=192.168.1.1
主要是修改上面的三處。我這里是配置為靜態的IP,也可以配置為dhcp自動獲取ip地址。
然后重啟網卡。
systemctl restat network
3.4、然后查看一下網卡信息
[root@chaofeng network-scripts]# ip addr 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master br0 state UP group default qlen 1000 link/ether 00:0c:29:ed:39:ac brd ff:ff:ff:ff:ff:ff 3: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000 link/ether 00:0c:29:ed:39:ac brd ff:ff:ff:ff:ff:ff inet 192.168.15.11/24 brd 192.168.15.255 scope global noprefixroute br0 valid_lft forever preferred_lft forever inet6 fe80::adfd:e8a9:917c:55/64 scope link noprefixroute valid_lft forever preferred_lft forever 4: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000 link/ether 52:54:00:77:f5:af brd ff:ff:ff:ff:ff:ff inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0 valid_lft forever preferred_lft forever 5: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast master virbr0 state DOWN group default qlen 1000 link/ether 52:54:00:77:f5:af brd ff:ff:ff:ff:ff:ff 6: vnet0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master br0 state UNKNOWN group default qlen 1000 link/ether fe:54:00:30:5f:1b brd ff:ff:ff:ff:ff:ff inet6 fe80::fc54:ff:fe30:5f1b/64 scope link valid_lft forever preferred_lft forever 7: vnet1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master br0 state UNKNOWN group default qlen 1000 link/ether fe:54:00:92:a1:d8 brd ff:ff:ff:ff:ff:ff inet6 fe80::fc54:ff:fe92:a1d8/64 scope link valid_lft forever preferred_lft forever 8: vnet2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master br0 state UNKNOWN group default qlen 1000 link/ether fe:54:00:14:45:85 brd ff:ff:ff:ff:ff:ff inet6 fe80::fc54:ff:fe14:4585/64 scope link valid_lft forever preferred_lft forever
我們主要關注的是ens33網卡和br0橋接網卡。你會發現ens33原來的ip是不顯示的,這是因為br0網卡占用了,並且此時物理機上的Linux系統的ip是被br0覆蓋掉的,原先的ip地址不能再使用了。此時我們看到br0的ip地址就是這台物理機ip地址,這不是虛擬機的地址,這點大家要明白。況且我還沒有開始創建虛擬機。
剩下的比如virbr0以及virbr0-nic則表示nat的地址,我們這次不使用這種NAT轉換的網絡模式,因此不做解釋。
但是下面的vnet0、vnet1、vnet2確實很重要的東西,從上面我們知道br0代表是網橋,那么為什么把他叫做 “網橋” 呢?因為它在我們的物理機和虛擬機之間的網絡通訊起着一個橋梁的作用,沒有它,在橋接模式下我們的虛擬機將無法與物理機在同一個網絡中。從我的機子來說,ens33是物理機的網卡,而br0則是網橋,那么vnet0、vnet1則是一個個的虛擬網卡,並且vnet0對應第一台物理機的網卡eth0,vnet1則是對應第二胎物理機的網卡eth0。雖然我們的虛擬機和物理機在同一個網絡並且都擁有獨立的IP,但是他們之間的通信卻不是兩台物理機之間的通信那么簡單,大題是這樣的:
而我們的橋接模式中的網絡架構大概是這樣的:
所以說br0與vnet0、vnet1發揮着巨大的作用,我們一定要搞清楚他。
3.5、查看網橋接口
請注意:你的此時可能還沒有vnet0、vnet1、vnet2、vnet3這幾個虛擬接口interface名稱,這幾個是當我們已經創建好虛擬機的時候才會有的。
4、開始安裝虛擬機。
virt-install --name=elk01 --memory=2048,maxmemory=3072 --vcpus=2,maxvcpus=2 --os-type=linux --os-variant=rhel7 --location=/data/CentOS-7-x86_64-DVD-1708.iso --disk path=/data/elk01.img,size=30 --bridge=br0 --graphics=none --console=pty,target_type=serial --extra-args="console=tty0 console=ttyS0"
解釋說明一下:
--name 指定虛擬機的名稱 --memory 指定分配給虛擬機的內存資源大小 maxmemory 指定可調節的最大內存資源大小,因為KVM支持熱調整虛擬機的資源 --vcpus 指定分配給虛擬機的CPU核心數量 maxvcpus 指定可調節的最大CPU核心數量 --os-type 指定虛擬機安裝的操作系統類型 --os-variant 指定系統的發行版本 --location 指定ISO鏡像文件所在的路徑,支持使用網絡資源路徑,也就是說可以使用URL --disk path 指定虛擬硬盤所存放的路徑及名稱,size 則是指定該硬盤的可用大小,單位是G --bridge 指定使用哪一個橋接網卡,也就是說使用橋接的網絡模式 --graphics 指定是否開啟圖形 --console 定義終端的屬性,target_type 則是定義終端的類型 --extra-args 定義終端額外的參數
如果你的物理機系統是centos6,則上面的命令需要改正,如下所示:
virt-install --name=elk01 --ram=2048 --vcpus=2,maxvcpus=2 --os-type=linux --os-variant=rhel7 --location=/data/CentOS-7-x86_64-DVD-1708.iso --disk path=/data/elk01.img,size=30 --bridge=br0 --graphics=none --console=pty,target_type=serial --extra-args="console=tty0 console=ttyS0"
如果你安裝過程中出現錯誤:
[root@centos6-chaofeng2 ~]# virt-install --name=elk04 --ram=2600 --vcpus=2,maxvcpus=2 --os-type=linux --os-variant=rhel7 --location=/usr/local/src/CentOS-7-x86_64-DVD-1708.iso --disk path=/data/elk04.img,size=28 --bridge=br0 --graphics=none --console=pty,target_type=serial --extra-args="console=tty0 console=ttyS0" ERROR Guest name 'elk04' is already in use.
這說明你的虛擬機的名字沖突了,可以換個名字,如果執意要使用這個名字,需要把曾經安裝過的虛擬機elk04卸載掉。方法是
[root@centos6-chaofeng2 ~]# virsh undefine elk04
Domain elk04 has been undefined
4.1、接下來要開始安裝了。
只要我們看到的中括號里面的“!”號,都表示要進行設置。這些參數與我們在vmwear虛擬機里面安裝都是一模一樣的,只不過這里沒有圖形化,全部都是文本而已。當你選擇好一個之后,中括號里面會變成“x”號,說明我們已經設置好這一項了。我一般都設置上圖中的1、2、3、5、8這五項內容。
依次選擇好之后,我們就可以按下“b”鍵開始安裝了。當看到下圖界面的時候,表示安裝成功了,
此時按下回車鍵,重啟虛擬機就可以使用了。
在虛擬機里面,我們按下 ctrl+] 組合按鍵表示退出當前虛擬機,但這並不是關機虛擬機。不過僅僅只有這一些命令是不夠我們操作kvm虛擬機的,還需要學習其他的命令。
5、管理虛擬機的常用命令。
# virsh console study01 # 進入指定的虛擬機,進入的時候還需要按一下回車 # virsh start study01 # 啟動虛擬機 # virsh shutdown study01 # 關閉虛擬機 # virsh destroy study01 # 強制停止虛擬機 # virsh undefine study01 # 徹底銷毀虛擬機,會刪除虛擬機配置文件,但不會刪除虛擬磁盤 # virsh autostart study01 # 設置宿主機開機時該虛擬機也開機 # virsh autostart --disable study01 # 解除開機啟動 # virsh suspend study01 # 掛起虛擬機 # virsh resume study01 # 恢復掛起的虛擬機
6、設置虛擬機聯網。
進入到/etc/sysconfig/network-scripts目錄下,找到ifcfg-eth0這個網卡配置文件,然后編輯這一行ONBOOT=yes,將no改為yes,然后重啟網卡systemctl restart network即可。
此時我們就已經安裝好了這樣的一台虛擬機。但是如果是安裝多個虛擬機的話,我們可以使用克隆來解決就行。如果還是自己手動安裝的話,有一個需要注意的就是虛擬網卡的問題。就是在virt-install安裝的時候,參數:--bridge仍然還是br0,即"--bridge=br0",為什么呢?因為橋接模式下,多個虛擬機使用的是同一塊網卡,因此需要我們設置為br0。因為我在這里跳坑啦,所以給大家說明白。
其次,在安裝第二台虛擬機的時候,主要修改的參數主要是:--name="elk02" 、--disk path="/data/elk02.img"這兩個參數。這兩個是必須修改項,其他的可酌情修改。
7、克隆虛擬機
[root@centos6-chaofeng2 ~]# virt-clone -o elk04 -n elk05 -f /data/elk05.img Cloning elk04.img 78% [=========================================- ] 2.8 MB/s | 22 GB 36:33 ETA
-o:后跟舊的系統的名稱
-n:后跟克隆后的新系統的名稱
-f:后跟克隆后的系統存放的位置