Linux KVM 安装使用手册

安装

前期准备

  1. 确定机器有 VT
    不知道芯片的生产厂商则输入:
egrep '(vmx|svm)' /proc/cpuinfo

如果flags: 里有 vmx 或者 svm 就说明支持 VT;如果没有任何的输出,说明你的 cpu 不支持,将无法成功安装 KVM 虚拟机。
2. 确保BIOS里开启VT:

Intel(R) Virtualization Tech [Enabled]

如有必要,还需在 BIOS 中开启 VT

安装虚拟机软件

安装相关的软件包

yum search kvm #使用search查寻KVM的软件包
yum install    #kvm的软件包

也可通过这两种方法来安装,在 ISO 镜像中的 rpm 包和 yum 来
安装 KVM 有两种方式:

  1. 通过 YUM 安装,在有 INTERNET 接入的地方可以使用,使用方法比较简单。
    安装 KVM 和 virtinst(一个创建虚拟机的工 具),我们运行
yum install kvm kmod-kvm qemu libvirt python-virtinst

然后重新启动系统:

Reboot
  1. 通过 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 是否成功安装

virsh -c qemu:///system list

将会显示如下结果:

[root@server1 ~]# virsh -c qemu:///system list
Id Name                 State

软件包安装完毕后,加载 kvm 模块

modprobe kvm

检查模块是否加载成功,执行如下命令:

lsmod |grep kvm

如果显示两行,说明模块正确加载:

kvm_intel 47790 0
kvm 300762 1 kvm_intel

如果只显示一行,请检查

  • cpu 是否支持 VT 技术
  • bios 中是否将 cpu 的 VT 开启

接下来配置桥接网卡,网上有现成的脚本可以使用,这个是我在之前测试convirt时发现的,实际上是convirt的环境配置工具。

先将工具包下载下来下了(安装kvm系统可以上网)

wget --no-cache http://www.convirture.com/downloads/convirture-tools/2.0.1/convirture-tools-2.0.1.tar.gz

然后解压软件包:

tar zxvf convirture-tools-2.0.1.tar.gz  #(这个一定要放到root目录里才行)
/root/convirture-tools/install/managed_server/scripts/convirt-tool --bridge setup

执行完上述命令后,会自动将桥接网卡配置好,跑桥接自动好。

启动服务

/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 来完成对虚拟机的操作,包括虚拟机的创建、删除、启动、停止以及一些简单的监控功能等。

配置网络桥接

进入目录 /etc/sysconfig/network-scripts,复制一份原有的 ifcfg-eth0ifcfg-br0

cp ifcfg-eth0 ifcfg-br0

修改 ifcfg-br0,内容如下:

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, 内容如下:

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"

重启网络服务即可。

/etc/init.d/network restart

如果出现问题,关闭 NetworkManager 后重试。

chkconfig NetworkManager off
service NetworkManager stop

使用 virt-install 工具安装 guest 系统

  1. 创建硬盘映像文件
    使用 qemu-img 命令创建
qemu-img create -f raw /home/kvm_data/centos7.82C8G.img 100G

或使用 dd 命令创建

dd bs=1M count=8096 if=/dev/zero of=/var/lib/libvirt/images/test.img

qemu-img 是创建是文件格式是稀疏文件,优点是速度超快,由于是稀疏文件,性能可能会比第二种略差,通过如下命令查看详情

qemu-img info /var/lib/libvirt/images/test.img

输出为:注意其中 disk size 为 0

image: test.img
file format: raw
virtual size: 8.0G (8589934592 bytes)
disk size: 0
  1. 通过iso文件安装系统

界面安装:需要通过 vnc 连接上去。

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 连接上去。

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"

虚拟机配置文件

libvirtd 配置文件

配置文件位置:

/etc/libvirt/libvirtd.conf

日志配置:

#将日志级别设置为 1(调试)
log_level = 1
#指定日志输出文件名称
log_outputs="1:file:/var/log/libvirt/libvirtd.log"

注意 :libvirtd. 日志文件可能会飞速增长。 用户应配置 logrotate ,否则您的 /var 文件系统最后会装满内容。
以上的日志的输出级别为 debug 级别.这个级别的日志是最多的,一般只在开发以及测试的时候使用。而在生产运行环境中,日志的级别为 info,warn,error,fatal. 以下前面的数字为他们的 level.

1 debug
2 info
3 warn
4 error
5 fatal

重启 libvirtd 。虚拟机 Guest 操作系统正在运行时可重启 libvirtd。

/etc/init.d/libvirtd restart

如果在目录下还是没发现日志文件,那么你可能需要使用一下命令来运行 libvirtd.

libvirtd --daemon --listen --config /etc/libvirt/libvirtd.conf

查看 virsh 管理 qemu 虚拟机的信息

在使用 virsh 管理 qemu 的虚拟机时候,也是有日志的输出的.
具体的 log 在目录 /var/log/livirt/qemu/ 下面,具体的 log 文件名与虚拟机名字关联.

使用

查看所有虚拟机状态

[root@server1 ~]# virsh list --all
 Id    Name                           State
----------------------------------------------------
 -     centos7.0                      shut off
 -     centos7.0-2                    shut off

[root@server1 ~]#

查看指定虚拟机状态

[root@server1 ~]# virsh domstate centos7.0
shut off

[root@server1 ~]#

手动启动虚拟机

[root@server1 ~]# virsh start centos7.0
Domain centos7.0 started

[root@server1 ~]# virsh domstate centos7.0
running

[root@server1 ~]#

手动关闭虚拟机

[root@server1 ~]# virsh shutdown centos7.0
Domain centos7.0 is being shutdown

[root@server1 ~]# virsh domstate centos7.0
shut off

[root@server1 ~]#

直接通过主机配置文档启动主机

virsh create /etc/libvirt/qemu/node1.xml 

关机虚拟机

virsh shutdown node1   

重启虚拟机

virsh reboot node1

手动挂起/恢复虚拟机

[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 ~]#

断电关闭虚拟机

[root@server1 ~]#virsh destroy centos7.0

设置随宿主启动(开机启动)

[root@server1 ~]#virsh autostart centos7.0

取消开机启动

[root@server1 ~]#virsh autostart --disable  centos7.0

删除虚拟机

[root@server1 ~]#virsh undefine centos7.0

导出(备份)虚拟机配置文件

[root@server1 ~]#virsh dumpxml centos6 > /home/vpsbak/centos6bak.xml

编辑虚拟机配置文件

配置文件位置是 /etc/libvirt/qemu 下,可以用 vim 进行编辑,但是建议使用 KVM 提供的命令进行编辑:

[root@server1 ~]#virsh edit centos7.0

查看虚拟机磁盘信息

[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

查看指定虚拟机使用磁盘

[root@server1 ~]#virsh domblklist vm01
目标     源
------------------------------------------------
vda        /home/vps/vm01.img
vdb        /home/vps/data.img
hda      

虚拟机迁移宿主物理服务器

  1. 备份虚拟机配置文件
[root@kvm6 vps] virsh dumpxml centos6 > /home/vpsbak/centos6.xml
  1. 关机,迁移配置文件和磁盘文件,配置文件路径是 /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
  1. 激活虚拟机配置文件
[root@server1 ~]#virsh define /etc/libvirt/qemu/centos6.xml

获取虚机网卡接口

domiflist(domain)显示网卡接口:

$ virsh domiflist vm1

Interface  Type       Source     Model       MAC
-------------------------------------------------------
vnet0      network    default    rtl8139     52:54:00:0e:cb:48

获取网卡实时信息

domifstat(demo vnet0) 显示网卡信息 :

$ 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

显示虚拟机的信息

dominfo(demo)显示虚拟机的信息

$ 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)

获取虚拟机的UUID

domuuid (demo)显示虚拟机的id

$ virsh domuuid vm1
b961bd90-6445-4f61-9f14-77dd8c407cfb

获取虚拟机的ID

domid(id or name ) 根据名字得到id或根据id得到名字

$ virsh domid vm1
4
$ virsh domname 4
generic

23、显示虚拟机的运行状态

domstate (demo) 显示虚拟机的状态

$ virsh domstate vm1
running

domcontrol(demo) 返回虚拟机的状态ok or error

$ virsh domcontrol vm1
ok

编辑虚拟机的配置文件

edit (demo) 编辑主机的配置文件,可调整内存、CPU等配置.

$ 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>
……

virsh console连接虚机

# 连接命令
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

为虚拟机添加一块qcow2磁盘

  1. 查看磁盘大小与磁盘格式
    查看磁盘格式和磁盘文件位置:
$ 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>
  1. 查看硬盘格式信息
$ 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
  1. 添加一块qcow2磁盘
$ qemu-img create -f qcow2 test01_add.qcow2 2G
  1. 将新增的磁盘文件添加到虚拟机
$ 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>
  1. 启动虚拟机,分区、格式化、挂载磁盘

修改虚拟机内存及CPU大小

$ 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>

快照管理

  1. 创建快照
$ virsh snapshot-create-as generic snap1
  1. 查看快照
$ virsh snapshot-list generic
Name                 Creation Time             State
------------------------------------------------------------
 snap1                2018-05-23 14:17:40 +0800 running
  1. 恢复快照
$ virsh snapshot-revert generic snap1
  1. 显示快照信息
$ virsh snapshot-info generic snap1
Name:           snap1
Domain:         generic
Current:        yes
State:          running
Location:       internal
Parent:         -
Children:       0
Descendants:    0
Metadata:       yes
  1. 删除快照
$ virsh snapshot-delete generic snap1

虚拟机克隆

从本地虚拟机直接克隆

现有本地虚拟机需要先停止

  1. 查看本地虚拟机
$ virsh list –all
Id    Name                           State
----------------------------------------------------
 -     generic                        shut off
  1. 从generic克隆一个虚拟机vm1
  2. 执行克隆操作,使用磁盘文件vm1.img
$ virt-clone -o generic -n vm1 -f /data/image/vm1.img
  1. 启动虚拟机
$ virsh start vm1
  1. 启动后修改主机名、IP等

通过复制配置文件和硬盘文件克隆

  1. 查看现有虚拟机
$ virsh list –all
Id    Name                           State
----------------------------------------------------
 8     vm1                            running
  1. 这里将从vm1克隆另一个虚拟机vm2
  2. 导出vm1虚拟机配置文件
$ virsh dumpxml vm1 > vm2.xml
```bash
4.	查看vm1磁盘文件所在位置:

$ virsh edit vm1

<source file='/data/image/vm1.img'/> ``` 5. 复制vm1磁盘文件为vm2.img ```bash $ cd /data/image $ cp vm1.img vm2.img ``` 6. 修改vm2.xml

<domain type='kvm' id='10'>
<name>vm2</name>
  <uuid>fe1f692d-34d5-4e0c-ab36-ba84eb024ee5</uuid>
……
<source file='/data/image/vm2.img'/>
……
  1. 定义vm2配置文件
$ virsh define vm2.xml
Domain vm2 defined from vm2.xml
  1. 此时会看到vm2虚拟机已经生成
$ virsh list –all
Id    Name                           State
----------------------------------------------------
-     vm2                            shut off
  1. 启动vm3,重新更改主机名、IP等。
(完)