如何在CentOS 7/RHEL 7无头服务器上安装KVM
如何在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