一、安装
1、前期准备
- 确定机器有 VT 不知道芯片的生产厂商则输入:
egrep '(vmx|svm)' /proc/cpuinfo
如果flags: 里有 vmx 或者 svm 就说明支持 VT;如果没有任何的输出,说明你的 cpu 不支持,将无法成功安装 KVM 虚拟机。2. 确保BIOS里开启VT:
代码语言:javascript复制Intel(R) Virtualization Tech [Enabled]
如有必要,还需在 BIOS 中开启 VT
2、安装虚拟机软件
安装相关的软件包
代码语言:javascript复制yum search kvm #使用search查寻KVM的软件包
yum install #kvm的软件包
也可通过这两种方法来安装,在 ISO 镜像中的 rpm 包和 yum 来 安装 KVM 有两种方式:
- 通过 YUM 安装,在有 INTERNET 接入的地方可以使用,使用方法比较简单。安装 KVM 和 virtinst(一个创建虚拟机的工 具),我们运行
yum install kvm kmod-kvm qemu libvirt python-virtinst
然后重新启动系统:
代码语言:javascript复制Reboot
- 通过 CentOS 自带光盘中的 RPM 包进行安装 安装 KVM 需要以下一些包:
kmod-kvm x86_64 83-164.el5_5.15
kvm x86_64 83-164.el5_5.15
libvirt i386 0.6.3-33.el5_5.1
libvirt x86_64 0.6.3-33.el5_5.1
python-virtinst noarch 0.400.3-9.el5
qemu x86_64 0.9.0-4
所需的依存包为:
bridge-utils x86_64 1.1-2
celt051 x86_64 0.5.1.3-0.el5
e4fsprogs-libs i386 1.41.9-3.el5
e4fsprogs-libs x86_64 1.41.9-3.el5
etherboot-zroms-kvm x86_64 5.4.4-13.el5.centos
iscsi-initiator-utils x86_64 6.2.0.871-0.16.el5
libvirt-python x86_64 0.6.3-33.el5_5.1
log4cpp x86_64 1.0-9.el5
qcairo x86_64 1.8.7.1-3.el5
qffmpeg-libs x86_64 0.4.9-0.16.20080908.el5_5
qpixman x86_64 0.13.3-4.el5
qspice-libs x86_64 0.3.0-54.el5_5.1
xen-libs i386 3.0.3-105.el5_5.5
xen-libs x86_64 3.0.3-105.el5_5.5
xz-libs i386 4.999.9-0.3.beta.20091007git.el5
xz-libs x86_64 4.999.9-0.3.beta.20091007git.el5
将其放在一个文件夹内,使用 rpm –ivh *.rpm
命令来进行安装。或者使用 rpm -i (or --install) options file1.rpm file2.rpm... fileN.rpm
将每个 RPM 包列出进行安装。
验证 KVM 是否安装完成 使用下列命令检查 KVM 是否成功安装
代码语言:javascript复制virsh -c qemu:///system list
将会显示如下结果:
代码语言:javascript复制[root@server1 ~]# virsh -c qemu:///system list
Id Name State
软件包安装完毕后,加载 kvm 模块
代码语言:javascript复制modprobe kvm
检查模块是否加载成功,执行如下命令:
代码语言:javascript复制lsmod |grep kvm
如果显示两行,说明模块正确加载:
代码语言:javascript复制kvm_intel 47790 0
kvm 300762 1 kvm_intel
如果只显示一行,请检查
- cpu 是否支持 VT 技术
- bios 中是否将 cpu 的 VT 开启
接下来配置桥接网卡,网上有现成的脚本可以使用,这个是我在之前测试convirt时发现的,实际上是convirt的环境配置工具。
先将工具包下载下来下了(安装kvm系统可以上网)
代码语言:javascript复制wget --no-cache http://www.convirture.com/downloads/convirture-tools/2.0.1/convirture-tools-2.0.1.tar.gz
然后解压软件包:
代码语言:javascript复制tar zxvf convirture-tools-2.0.1.tar.gz #(这个一定要放到root目录里才行)
/root/convirture-tools/install/managed_server/scripts/convirt-tool --bridge setup
执行完上述命令后,会自动将桥接网卡配置好,跑桥接自动好。
启动服务
代码语言:javascript复制/etc/init.d/libvirt-guests start
/etc/init.d/libvirtd start
到此,kvm 虚拟化环境就全部配置完毕了
❝libvirt:使用最多的KVM虚拟化管理工具和应用程序接口,即通过 libvirt 调用 KVM 创建虚拟机,libvirt 是 KVM 通用的访问 API,其不但能管理 KVM,还能管理 VMware、Xen、Hyper-V、virtualBox 等虚拟化方案。 ❞
❝virsh:是一个常用的管理 KVM 虚拟化的命令行工具,常用语管理运行在单个宿主机上的虚拟机,virsh是一个使用C语言编写调用 libvirt API 的虚拟化管理命令行工具。 ❞
❝virt-manager:一个虚拟化管理图形软件,其底层也是调用 libvirt API 来完成对虚拟机的操作,包括虚拟机的创建、删除、启动、停止以及一些简单的监控功能等。 ❞
3、配置网络桥接
进入目录 /etc/sysconfig/network-scripts
,复制一份原有的 ifcfg-eth0
为 ifcfg-br0
cp ifcfg-eth0 ifcfg-br0
修改 ifcfg-br0,内容如下:
代码语言:javascript复制DEVICE="br0"
BOOTPROTO=static
ONBOOT="yes"
TYPE="Bridge"
IPADDR=192.168.31.60
GATEWAY=192.168.31.1
NETMASK=255.255.255.0
DEFROUTE=yes
IPADDR、GATEWAY、NETMASK 根据自己的实际情况修改。
修改 ifcfg-eth0, 内容如下:
代码语言:javascript复制DEVICE="eth0"
BOOTPROTO=none
NM_CONTROLLED="no"
ONBOOT="yes"
TYPE="Ethernet"
BRIDGE="br0"
HWADDR=F8:DB:88:FF:99:E3
DEFROUTE=yes
IPV4_FAILURE_FATAL=yes
NAME="System eth0"
重启网络服务即可。
代码语言:javascript复制/etc/init.d/network restart
如果出现问题,关闭 NetworkManager 后重试。
代码语言:javascript复制chkconfig NetworkManager off
service NetworkManager stop
4、使用 virt-install 工具安装 guest 系统
- 创建硬盘映像文件 使用 qemu-img 命令创建
qemu-img create -f raw /home/kvm_data/centos7.82C8G.img 100G
或使用 dd 命令创建
代码语言:javascript复制dd bs=1M count=8096 if=/dev/zero of=/var/lib/libvirt/images/test.img
qemu-img 是创建是文件格式是稀疏文件,优点是速度超快,由于是稀疏文件,性能可能会比第二种略差,通过如下命令查看详情
代码语言:javascript复制qemu-img info /var/lib/libvirt/images/test.img
输出为:注意其中 disk size 为 0
代码语言:javascript复制image: test.img
file format: raw
virtual size: 8.0G (8589934592 bytes)
disk size: 0
- 通过iso文件安装系统
界面安装:需要通过 vnc 连接上去。
代码语言:javascript复制virt-install --name=vserver1 --ram 4096 --vcpus=2 --disk path=/home/kvm_data/centos7.8.img,size=100 --accelerate --cdrom /home/software/CentOS-7-x86_64-DVD-2003.iso --graphics vnc,listen=0.0.0.0 --network bridge=br0 --force --autostart --connect qemu:///system
命令行安装:不需要 vnc 连接上去。
代码语言:javascript复制virt-install --name=vserver1 --memory=4096,maxmemory=6144 --vcpus=2,maxvcpus=4 --os-type=linux --os-variant=rhel7 --location=/home/software/CentOS-7-x86_64-DVD-2003.iso --disk path=/home/kvm_data/centos7.8.img,size=10 --bridge=virbr0 --graphics=none --console=pty,target_type=serial --extra-args="console=tty0 console=ttyS0"
二、虚拟机配置文件
1、libvirtd 配置文件
配置文件位置:
代码语言:javascript复制/etc/libvirt/libvirtd.conf
日志配置:
代码语言:javascript复制#将日志级别设置为 1(调试)
log_level = 1
#指定日志输出文件名称
log_outputs="1:file:/var/log/libvirt/libvirtd.log"
注意 :libvirtd. 日志文件可能会飞速增长。用户应配置 logrotate ,否则您的 /var 文件系统最后会装满内容。以上的日志的输出级别为 debug 级别.这个级别的日志是最多的,一般只在开发以及测试的时候使用。而在生产运行环境中,日志的级别为 info,warn,error,fatal. 以下前面的数字为他们的 level.
代码语言:javascript复制1 debug
2 info
3 warn
4 error
5 fatal
重启 libvirtd 。虚拟机 Guest 操作系统正在运行时可重启 libvirtd。
代码语言:javascript复制/etc/init.d/libvirtd restart
如果在目录下还是没发现日志文件,那么你可能需要使用一下命令来运行 libvirtd.
代码语言:javascript复制libvirtd --daemon --listen --config /etc/libvirt/libvirtd.conf
2、查看 virsh 管理 qemu 虚拟机的信息
在使用 virsh 管理 qemu 的虚拟机时候,也是有日志的输出的. 具体的 log 在目录 /var/log/livirt/qemu/
下面,具体的 log 文件名与虚拟机名字关联.
三、使用
1、查看所有虚拟机状态
代码语言:javascript复制[root@server1 ~]# virsh list --all
Id Name State
----------------------------------------------------
- centos7.0 shut off
- centos7.0-2 shut off
[root@server1 ~]#
2、查看指定虚拟机状态
代码语言:javascript复制[root@server1 ~]# virsh domstate centos7.0
shut off
[root@server1 ~]#
3、手动启动虚拟机
代码语言:javascript复制[root@server1 ~]# virsh start centos7.0
Domain centos7.0 started
[root@server1 ~]# virsh domstate centos7.0
running
[root@server1 ~]#
4、手动关闭虚拟机
代码语言:javascript复制[root@server1 ~]# virsh shutdown centos7.0
Domain centos7.0 is being shutdown
[root@server1 ~]# virsh domstate centos7.0
shut off
[root@server1 ~]#
5、直接通过主机配置文档启动主机
代码语言:javascript复制virsh create /etc/libvirt/qemu/node1.xml
6、关机虚拟机
代码语言:javascript复制virsh shutdown node1
7、重启虚拟机
代码语言:javascript复制virsh reboot node1
8、手动挂起/恢复虚拟机
代码语言:javascript复制[root@server1 ~]# virsh suspend centos7.0
Domain centos7.0 suspended
[root@server1 ~]# virsh resume centos7.0
Domain centos7.0 resumed
[root@server1 ~]# virsh domstate centos7.0
running
[root@server1 ~]#
9、断电关闭虚拟机
代码语言:javascript复制[root@server1 ~]#virsh destroy centos7.0
10、设置随宿主启动(开机启动)
代码语言:javascript复制[root@server1 ~]#virsh autostart centos7.0
11、取消开机启动
代码语言:javascript复制[root@server1 ~]#virsh autostart --disable centos7.0
12、删除虚拟机
代码语言:javascript复制[root@server1 ~]#virsh undefine centos7.0
13、导出(备份)虚拟机配置文件
代码语言:javascript复制[root@server1 ~]#virsh dumpxml centos6 > /home/vpsbak/centos6bak.xml
14、编辑虚拟机配置文件
配置文件位置是 /etc/libvirt/qemu 下,可以用 vim 进行编辑,但是建议使用 KVM 提供的命令进行编辑:
代码语言:javascript复制[root@server1 ~]#virsh edit centos7.0
15、查看虚拟机磁盘信息
代码语言:javascript复制[root@server1 ~]#qemu-img info vm01.img
image: vm01.img
file format: qcow2
virtual size: 10G (10737418240 bytes)
disk size: 3.3G
cluster_size: 65536
Format specific information:
compat: 0.10
16、查看指定虚拟机使用磁盘
代码语言:javascript复制[root@server1 ~]#virsh domblklist vm01
目标 源
------------------------------------------------
vda /home/vps/vm01.img
vdb /home/vps/data.img
hda
17、虚拟机迁移宿主物理服务器
- 备份虚拟机配置文件
[root@kvm6 vps] virsh dumpxml centos6 > /home/vpsbak/centos6.xml
- 关机,迁移配置文件和磁盘文件,配置文件路径是 /etc/libvirt/qemu
[root@kvm6 vps] scp /home/vpsbak/centos6.xml root@192.168.0.3:/etc/libvirt/qemu/
[root@kvm6 vps] scp /home/vpsdata/vps/centos6.qcow2 root@192.168.0.3:/data/vpsdata/vps
- 激活虚拟机配置文件
[root@server1 ~]#virsh define /etc/libvirt/qemu/centos6.xml
18、获取虚机网卡接口
domiflist(domain)显示网卡接口:
代码语言:javascript复制$ virsh domiflist vm1
Interface Type Source Model MAC
-------------------------------------------------------
vnet0 network default rtl8139 52:54:00:0e:cb:48
19、获取网卡实时信息
domifstat(demo vnet0) 显示网卡信息 :
代码语言:javascript复制$ virsh domifstat vm1 vnet0
vnet0 rx_bytes 51575
vnet0 rx_packets 863
vnet0 rx_errs 0
vnet0 rx_drop 0
vnet0 tx_bytes 4543
vnet0 tx_packets 44
vnet0 tx_errs 0
vnet0 tx_drop 0
20、显示虚拟机的信息
dominfo(demo)显示虚拟机的信息
代码语言:javascript复制$ virsh dominfo vm1
Id: 4
Name: vm1
UUID: b961bd90-6445-4f61-9f14-77dd8c407cfb
OS Type: hvm
State: running
CPU(s): 1
CPU time: 97.1s
Max memory: 524288 KiB
Used memory: 524288 KiB
Persistent: yes
Autostart: disable
Managed save: no
Security model: apparmor
Security DOI: 0
Security label: libvirt-b961bd90-6445-4f61-9f14-77dd8c407cfb (enforcing)
21、获取虚拟机的UUID
domuuid (demo)显示虚拟机的id
代码语言:javascript复制$ virsh domuuid vm1
b961bd90-6445-4f61-9f14-77dd8c407cfb
22、获取虚拟机的ID
domid(id or name ) 根据名字得到id或根据id得到名字
代码语言:javascript复制$ virsh domid vm1
4
$ virsh domname 4
generic
23、显示虚拟机的运行状态
domstate (demo) 显示虚拟机的状态
代码语言:javascript复制$ virsh domstate vm1
running
domcontrol(demo) 返回虚拟机的状态ok or error
代码语言:javascript复制$ virsh domcontrol vm1
ok
24、编辑虚拟机的配置文件
edit (demo) 编辑主机的配置文件,可调整内存、CPU等配置.
代码语言:javascript复制$ virsh edit generic
<domain type='kvm'>
<name>generic</name>
<uuid>b961bd90-6445-4f61-9f14-77dd8c407cfb</uuid>
<memory unit='KiB'>524288</memory>
<currentMemory unit='KiB'>524288</currentMemory>
<vcpu placement='static'>1</vcpu>
<os>
<type arch='x86_64' machine='pc-i440fx-xenial'>hvm</type>
<boot dev='hd'/>
</os>
……
25、virsh console连接虚机
代码语言:javascript复制# 连接命令
virsh console vm1
需要在虚机上做一下配置
- centos 7
grubby --update-kernel=ALL --args="console=ttyS0"
reboot
- centos 6
# 执行如下脚本
#/bin/sh
GRUB=/etc/grub.conf
BOOT_GRUB=/boot/grub/grub.conf
echo "ttyS0" >> /etc/securetty
sed -i '/tkernel/{s/$/ console=ttyS0/g}' ${GRUB}
sed -i '/tkernel/{s/$/ console=ttyS0/g}' ${BOOT_GRUB}
echo 'S0:12345:respawn:/sbin/agetty ttyS0 115200' >> /etc/inittab
- ubuntu
systemctl disable systemd-networkd-wait-online
systemctl enable serial-getty@ttyS0.service
systemctl start serial-getty@ttyS0.service
26、为虚拟机添加一块qcow2磁盘
- 查看磁盘大小与磁盘格式 查看磁盘格式和磁盘文件位置:
$ virsh edit generic
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2'/>
<source file='/var/lib/libvirt/images/generic.qcow2'/>
<target dev='hda' bus='ide'/>
<address type='drive' controller='0' bus='0' target='0' unit='0'/>
</disk>
- 查看硬盘格式信息
$ qemu-img info /var/lib/libvirt/images/generic.qcow2
file format: qcow2
virtual size: 20G (21474836480 bytes)
disk size: 2.3G
cluster_size: 65536
Format specific information:
compat: 1.1
lazy refcounts: true
refcount bits: 16
corrupt: false
- 添加一块qcow2磁盘
$ qemu-img create -f qcow2 test01_add.qcow2 2G
- 将新增的磁盘文件添加到虚拟机
$ virsh edit generic
添加如下内容:
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2'/>
<source file='/var/lib/libvirt/images/test01_add.qcow2'/>
<target dev='hdc' bus='ide'/>
</disk>
- 启动虚拟机,分区、格式化、挂载磁盘
27、修改虚拟机内存及CPU大小
代码语言:javascript复制$ virsh edit generic
<name>generic</name>
<uuid>b961bd90-6445-4f61-9f14-77dd8c407cfb</uuid>
<memory unit='KiB'>524288</memory>
<currentMemory unit='KiB'>524288</currentMemory>
<vcpu placement='static'>1</vcpu>
28、快照管理
- 创建快照
$ virsh snapshot-create-as generic snap1
- 查看快照
$ virsh snapshot-list generic
Name Creation Time State
------------------------------------------------------------
snap1 2018-05-23 14:17:40 0800 running
- 恢复快照
$ virsh snapshot-revert generic snap1
- 显示快照信息
$ virsh snapshot-info generic snap1
Name: snap1
Domain: generic
Current: yes
State: running
Location: internal
Parent: -
Children: 0
Descendants: 0
Metadata: yes
- 删除快照
$ virsh snapshot-delete generic snap1
29、虚拟机克隆
1、从本地虚拟机直接克隆
现有本地虚拟机需要先停止
- 查看本地虚拟机
$ virsh list –all
Id Name State
----------------------------------------------------
- generic shut off
- 从generic克隆一个虚拟机vm1
- 执行克隆操作,使用磁盘文件vm1.img
$ virt-clone -o generic -n vm1 -f /data/image/vm1.img
- 启动虚拟机
$ virsh start vm1
- 启动后修改主机名、IP等
2、通过复制配置文件和硬盘文件克隆
- 查看现有虚拟机
$ virsh list –all
Id Name State
----------------------------------------------------
8 vm1 running
- 这里将从vm1克隆另一个虚拟机vm2
- 导出vm1虚拟机配置文件
$ virsh dumpxml vm1 > vm2.xml
```bash
4. 查看vm1磁盘文件所在位置:
```bash
$ virsh edit vm1
<source file='/data/image/vm1.img'/>
- 复制vm1磁盘文件为vm2.img
$ cd /data/image
$ cp vm1.img vm2.img
- 修改vm2.xml
<domain type='kvm' id='10'>
<name>vm2</name>
<uuid>fe1f692d-34d5-4e0c-ab36-ba84eb024ee5</uuid>
……
<source file='/data/image/vm2.img'/>
……
- 定义vm2配置文件
$ virsh define vm2.xml
Domain vm2 defined from vm2.xml
- 此时会看到vm2虚拟机已经生成
$ virsh list –all
Id Name State
----------------------------------------------------
- vm2 shut off
- 启动vm3,重新更改主机名、IP等。