如何在CentOS 7/RHEL 7无头服务器上安装KVM

时间:2020-01-09 10:39:21  来源:igfitidea点击:

如何在CentOS 7或RHEL(Red Hat Enterprise Linux)7服务器上安装和配置KVM(基于内核的虚拟机)?
如何在CentOS 7上设置KVM并使用cloud images/cloud-init来安装来宾VM?
基于内核的虚拟机(KVM)是用于CentOS或RHEL 7的虚拟化软件。
KVM将您的服务器转变为虚拟机监控程序。

在本教程中我们学习了如何在CentOS 7或RHEL 7中使用KVM设置和管理虚拟化环境。
它还描述了如何使用CLI在物理服务器上安装和管理虚拟机(VM)。
确保在服务器BIOS中启用了"虚拟化技术(VT)"。
您还可以运行以下命令来测试CPU是否支持Intel VT和AMD-V虚拟化技术:

$ lscpu | grep Virtualization

`Virtualization:        VT-x`

在CentOS 7/RHEL 7无头服务器上遵循KVM的安装步骤

步骤1:安装kvm

执行以下yum命令:

# yum install qemu-kvm libvirt libvirt-python libguestfs-tools virt-install

启动libvirtd服务:

# systemctl enable libvirtd

# systemctl start libvirtd

步骤2:验证KVM安装

确保使用lsmod命令和grep命令加载KVM模块:

# lsmod | grep -i kvm

步骤3:配置桥接网络

默认情况下,libvirtd配置的基于dhcpd的网桥。
您可以使用以下命令进行验证:

# brctl show

# virsh net-list

所有VM(来宾计算机)仅具有对同一服务器上其他VM的网络访问权限。
为您创建了一个专用网络192.168.122.0/24。
验证一下:

# virsh net-dumpxml default

如果希望您的VM适用于LAN上的其他服务器,请在连接到LAN的服务器上设置网桥。
更新您的nic配置文件,例如ifcfg-enp3s0或em1:

# vi /etc/sysconfig/network-scripts/enp3s0

添加行:

BRIDGE=br0

在vi中保存并关闭文件。
编辑/etc/sysconfig/network-scripts/ifcfg-br0并添加:

# vi /etc/sysconfig/network-scripts/ifcfg-br0

追加以下内容:

DEVICE="br0"
# I am getting ip from DHCP server #
BOOTPROTO="dhcp"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
ONBOOT="yes"
TYPE="Bridge"
DELAY="0"

重新启动网络服务(警告ssh命令将断开连接,最好重新启动该框):

# systemctl restart NetworkManager

使用brctl命令进行验证:

# brctl show

步骤4:创建您的第一个虚拟机

我将创建一个CentOS 7.x VM。
首先,使用wget命令获取CentOS 7.x最新的ISO镜像:

# cd /var/lib/libvirt/boot/

# wget https://mirrors.kernel.org/centos/7.4.1708/isos/x86_64/CentOS-7-x86_64-Minimal-1708.iso

验证ISO镜像:

# wget https://mirrors.kernel.org/centos/7.4.1708/isos/x86_64/sha256sum.txt

# sha256sum -c sha256sum.txt

创建CentOS 7.x VM

在此示例中,我用2GB RAM,2个CPU内核,1个nic和40GB磁盘空间创建CentOS 7.x VM,执行:

# virt-install \

--virt-type=kvm \

--name centos7 \

--ram 2048 \

--vcpus=1 \

--os-variant=centos7.0 \

--cdrom=/var/lib/libvirt/boot/CentOS-7-x86_64-Minimal-1708.iso \

--network=bridge=br0,model=virtio \

--graphics vnc \

--disk path=/var/lib/libvirt/images/centos7.qcow2,size=40,bus=virtio,format=qcow2

要通过ssh从另一个终端配置vnc登录并执行:

# virsh dumpxml centos7 | grep vnc

`<graphics type='vnc' port='5901' autoport='yes' listen='127.0.0.1'>`

请记下端口值(即5901)。
您需要使用SSH客户端设置隧道,并使用VNC客户端访问远程vnc服务器。
从您的client/desktop/macbook pro系统执行以下SSH端口转发命令:

$ ssh [email protected] -L 5901:127.0.0.1:5901

一旦建立了ssh隧道,就可以将VNC客户端指向自己的127.0.0.1(localhost)地址和端口5901,如下所示:您应该看到CentOS Linux 7来宾安装屏幕如下:现在,只需按照屏幕说明进行操作并安装CentOS 7.安装完成后,继续并单击重新启动按钮。
远程服务器关闭了与我们的VNC客户端的连接。
您可以通过KVM客户端重新连接以配置服务器的其余部分,包括基于SSH的会话或防火墙。

如何创建RHEL 7.x VM

确保本地存储了rhel-server-7.3-x86_64-dvd.iso。
在此示例中,我创建具有2GB RAM,2个CPU内核,1个nic和40GB磁盘空间的RHEL 7.x VM,执行:

# virt-install \

--virt-type=kvm \

--name rhel7 \

--memory=2048,maxmemory=4096 \

--vcpus=2 \

--os-variant=rhel7.3 \

--cdrom=/var/lib/libvirt/boot/rhel-server-7.3-x86_64-dvd.iso \

--network=bridge=virbr0,model=virtio \

--graphics vnc \

--disk path=/var/lib/libvirt/images/rhel7.qcow2,size=40,bus=virtio,format=qcow2

要通过ssh从另一个终端配置vnc登录并执行:

$ sudo virsh dumpxml rhel7 | grep vnc

`<graphics type='vnc' port='5904' autoport='yes' listen='127.0.0.1'>`

请记下端口值(即5904)。
您需要使用SSH客户端设置隧道,并使用VNC客户端访问远程vnc服务器。
从客户端/桌面执行以下SSH端口转发命令:

$ ssh [email protected] -L 5904:127.0.0.1:5904

一旦建立了ssh隧道,就可以将VNC客户端指向自己的127.0.0.1(localhost)地址和端口5904,以继续进行RHEL 7.x安装。

步骤5:使用云端镜像

上面的安装方法可以用于学习或单个VM。
您是否需要部署大量VM?
尝试云镜像。
您可以根据需要修改预构建的云镜像。
例如,使用Cloud-init添加实际用户,ssh密钥,设置时区等内容,Cloud-init是事实上的多分发软件包,用于处理云实例的早期初始化。
让我们看看如何创建具有1024MB内存,20GB磁盘空间和1个vCPU的CentOS 7虚拟机。

获取CentOS 7云镜像

# cd /var/lib/libvirt/boot

# wget http://cloud.centos.org/centos/7/images/CentOS-7-x86_64-GenericCloud.qcow2

创建所需的目录

# D=/var/lib/libvirt/images

# VM=centos7-vm1 ## vm name ##

# mkdir -vp $D/$VM

`mkdir: created directory '/var/lib/libvirt/images/centos7-vm1'`

创建元数据文件

# cd $D/$VM

# vi meta-data

追加以下内容:

instance-id: centos7-vm1
local-hostname: centos7-vm1

创建用户数据文件

我将使用ssh键登录到VM。
因此,请确保已安装ssh键:

# ssh-keygen -t ed25519 -C "VM Login ssh key"

如下编辑用户数据:

# cd $D/$VM

# vi user-data

添加如下内容(根据您的设置替换主机名,用户,ssh授权密钥):

#cloud-config
 
# Hostname management
preserve_hostname: False
hostname: centos7-vm1
fqdn: centos7-vm1.theitroad.com
 
# Users
users:
    - default
    - name: Hyman
      groups: ['wheel']
      shell: /bin/bash
      sudo: ALL=(ALL) NOPASSWD:ALL
      ssh-authorized-keys:
        - ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIMP3MOF2ot8MOdNXCpHem0e2Wemg4nNmL2Tio4Ik1JY VM Login ssh key
 
# Configure where output will go
output:
  all: ">> /var/log/cloud-init.log"
 
# configure interaction with ssh server
ssh_genkeytypes: ['ed25519', 'rsa']
 
# Install my public ssh key to the first user-defined user configured
# in cloud.cfg in the template (which is centos for CentOS cloud images)
ssh_authorized_keys:
  - ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIMP3MOF2ot8MOdNXCpHem0e2Wemg4nNmL2Tio4Ik1JY VM Login ssh key
 
# set timezone for VM
timezone: Asia/Kolkata
 
# Remove cloud-init 
runcmd:
  - systemctl stop network && systemctl start network
  - yum -y remove cloud-init

复制云镜像

# cd $D/$VM

# cp /var/lib/libvirt/boot/CentOS-7-x86_64-GenericCloud.qcow2 $VM.qcow2

创建20GB磁盘镜像

# cd $D/$VM

# export LIBGUESTFS_BACKEND=direct

# qemu-img create -f qcow2 -o preallocation=metadata $VM.new.image 20G

# virt-resize --quiet --expand /dev/sda1 $VM.qcow2 $VM.new.image

覆盖它调整大小的镜像:

# cd $D/$VM

# mv $VM.new.image $VM.qcow2

创建一个cloud-init ISO

# mkisofs -o $VM-cidata.iso -V cidata -J -r user-data meta-data

创建一个池

# virsh pool-create-as --name $VM --type dir --target $D/$VM

`Pool centos7-vm1 created`

安装CentOS 7 VM

# cd $D/$VM

# virt-install --import --name $VM \

--memory 1024 --vcpus 1 --cpu host \

--disk $VM.qcow2,format=qcow2,bus=virtio \

--disk $VM-cidata.iso,device=cdrom  \

--network bridge=virbr0,model=virtio  \

--os-type=linux  \

--os-variant=centos7.0 \

--graphics spice  \

--noautoconsole

删除不需要的文件:

# cd $D/$VM

# virsh change-media $VM hda --eject --config

# rm meta-data  user-data centos7-vm1-cidata.iso

找出KVM VM的IP地址(DHCP地址)

# virsh net-dhcp-leases default

登录到您的虚拟机

使用ssh命令:

# ssh [email protected]

有用的命令

让我们看一些管理虚拟机的有用命令。

列出所有虚拟机

# virsh list --all

获取虚拟机信息

# virsh dominfo vmName

# virsh dominfo centos7-vm1

停止/关闭VM

# virsh shutdown centos7-vm1

启动虚拟机

# virsh start centos7-vm1

将VM标记为在引导时自动启动

# virsh autostart centos7-vm1

重启(软安全重启)虚拟机

# virsh reboot centos7-vm1

重置(硬重置/不安全)VM

# virsh reset centos7-vm1

删除虚拟机

# virsh shutdown centos7-vm1

# virsh undefine centos7-vm1

# virsh pool-destroy centos7-vm1

# D=/var/lib/libvirt/images

# VM=centos7-vm1

# rm -ri $D/$VM

查看virsh命令类型的完整列表

# virsh help | less

# virsh help | grep reboot

关于virt-builder的说明

可以使用virt-builder命令在CentOS 7上快速构建虚拟机镜像。

列出虚拟机镜像

virt-builder --list

virt-builder --list | grep -i fedora

virt-builder --list | grep -i debian

virt-builder --list | grep -i ubuntu

virt-builder --list | grep -i freebsd

编译Ubuntu 16.04 LTS vm

# virt-builder ubuntu-16.04 \

--size=20G --format qcow2 -o /var/lib/libvirt/images/ncbz01-disk01.qcow2 \

--hostname ncbz01 --network --timezone Asia/Kolkata \

--firstboot-command "dpkg-reconfigure openssh-server" \

--edit '/etc/default/grub:

            s/^GRUB_CMDLINE_LINUX_DEFAULT=.*/GRUB_CMDLINE_LINUX_DEFAULT="console=tty0 console=ttyS0,115200n8"/' \

--run-command update-grub

输出示例(请注意,它将在屏幕上显示随机的root密码):

[   3.9] Downloading: http://libguestfs.org/download/builder/ubuntu-16.04.xz
######################################################################## 100.0%
[ 121.7] Planning how to build this image
[ 121.7] Uncompressing
[ 126.5] Resizing (using virt-resize) to expand the disk to 20.0G
[ 142.1] Opening the new disk
[ 143.8] Setting a random seed
[ 143.8] Setting the machine ID in /etc/machine-id
[ 143.8] Setting the hostname: ncbz01
[ 144.3] Setting the timezone: Asia/Kolkata
[ 144.3] Setting passwords
virt-builder: Setting random password of root to 1KTLsuVx14k989eq
[ 144.9] Finishing off
                   Output file: /var/lib/libvirt/images/ncbz01-disk01.qcow2
                   Output size: 20.0G
                 Output format: qcow2
            Total usable space: 18.6G
                    Free space: 17.7G (94%)

现在已建立镜像。
让我们安装VM:

# virt-install --import --name ncbz01 \

--ram 2048 \

--vcpu 2 \

--disk path=/var/lib/libvirt/images/ncbz01-disk01.qcow2,format=qcow2 \

--os-variant ubuntu17.04 \

--network=bridge=virbr0,model=virtio \

--noautoconsole

启动它:

# virsh start ncbz01

登录到它:

# virsh console ncbz01