在CentOS7上运行KVM虚拟机

版权声明:本文为博主原创文章,转载请注明出处,谢谢合作! https://blog.csdn.net/sch0120/article/details/83508879

准备工作

检查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

[cheshi@cheshi-desktop1 ~]$ sudo su -
[root@cheshi-desktop1 ~]# cd /etc/sysconfig/network-scripts/
[root@cheshi-desktop1 network-scripts]# vi ifcfg-kvmbr0
......
[root@cheshi-desktop1 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

重启网络:

[root@cheshi-desktop1 network-scripts]# service network restart
Restarting network (via systemctl):                        [  OK  ]

检查网络设置:

[root@cheshi-desktop1 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

[root@cheshi-desktop1 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

准备磁盘镜像

准备虚拟机的系统盘:

[cheshi@cheshi-desktop1 kvm_workspace]$ mkdir vm1
[cheshi@cheshi-desktop1 kvm_workspace]$ cd vm1
[cheshi@cheshi-desktop1 vm1]$ cp ../CentOS-7-x86_64-GenericCloud.qcow2.xz .
[cheshi@cheshi-desktop1 vm1]$ xz -d CentOS-7-x86_64-GenericCloud.qcow2.xz 
[cheshi@cheshi-desktop1 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文件,并更改其信息为:

[cheshi@cheshi-desktop1 vm1]$ vi vm1.xml 
[cheshi@cheshi-desktop1 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>

创建一台虚拟机:

[cheshi@cheshi-desktop1 vm1]$ sudo virsh define ./vm1.xml 
Domain vm1 defined from ./vm1.xml

启动虚拟机:

[cheshi@cheshi-desktop1 vm1]$ sudo virsh start vm1
Domain vm1 started

连接虚拟机console(使用Ctrl+]退出):

[cheshi@cheshi-desktop1 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
[root@dhcp-15-92 ~]# 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
[root@dhcp-15-92 ~]# exit
logout

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

dhcp-15-92 login: 

关闭虚拟机:

[cheshi@cheshi-desktop1 vm1]$ sudo virsh shutdown vm1
Domain vm1 is being shutdown

查看虚拟机状态:

[cheshi@cheshi-desktop1 vm1]$ sudo virsh list --all
 Id    Name                           State
----------------------------------------------------
 -     centos-minion1                 shut off
 -     vm1                            shut off

销毁虚拟机:

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

[cheshi@cheshi-desktop1 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"。

使用图形界面管理虚拟机比较直观,这里不再过多介绍。

参考资料

  1. CentOS7.2部署KVM虚拟机
  2. KVM 操作虚拟机常用命令
  3. CentOS 7 下配置KVM
  4. 三种方式在CentOS 7搭建KVM虚拟化平台
  5. 使用 libvirt创建和管理KVM虚拟机
  6. RHEL Guest Image quick start
  7. CentOS 6.9下KVM虚拟机网络Bridge(网桥)方式与NAT方式详解(转)

猜你喜欢

转载自blog.csdn.net/sch0120/article/details/83508879