KVM常用命令virsh
列出所有虚拟机
# virsh list --all
获取KVM虚拟机信息
# virsh dominfo vmName # virsh dominfo centos8-vm1
停止/关闭虚拟机
# virsh shutdown centos8-vm1
启动KVM虚拟机
# virsh start centos8-vm1
设置虚拟机在CentOS 8服务器启动时自动启动
# virsh autostart centos8-vm1
重启(软安全重启)虚拟机
# virsh reboot ubuntu-vm1
重置(硬重置/不安全)VM
最后一招
# virsh reset ubuntu-vm1
删除KVM虚拟机
# virsh shutdown centos8-vm1 # virsh undefine centos8-vm1 # virsh pool-destroy centos8-vm1 # D=/var/lib/libvirt/images # VM=centos8-vm1.img # rm -ri $D/$VM
查看virsh命令帮助手册
# virsh help | less # virsh help | grep reboot
安装kvm
运行以下dnf命令/yum命令:
# dnf module install virt
然后安装创建新虚拟机所需的工具
# dnf install virt-install virt-viewer libguestfs-tools
使用systemctl命令启动libvirtd服务并设置开机自启动:
# systemctl enable libvirtd.service # systemctl start libvirtd.service # systemctl status libvirtd.service ## 查看服务状态
KVM
KVM是基于Linux内核的免费的开放源代码虚拟化软件。
用于在物理服务器上创建多个虚拟机。
要使用KVM,必须在服务器BIOS中启用了虚拟化技术(VT)。
使用下面命令来检查CPU是否支持Intel VT和AMD-V虚拟化技术:
$ lscpu | grep Virtualization
配置桥接网络
virbr0网络是私有网络。用于同一个服务器中的多个虚拟机之间通讯。
如果要使虚拟机和外界的服务器通讯,那么需要在服务器上搭建一个新网桥。
修改接口的配置文件。
# vi /etc/sysconfig/network-scripts/ifcfg-br0
br0配置:
## my lan 192.168.2.0/24 ## ## Bridge br0 config, only IPv4 and no IPv6 here for now ## STP=no TYPE=Bridge PROXY_METHOD=none BROWSER_ONLY=no BOOTPROTO=none DEFROUTE=yes IPV4_FAILURE_FATAL=no IPV6INIT=no IPV6_DEFROUTE=yes IPV6_FAILURE_FATAL=no IPV6_ADDR_GEN_MODE=stable-privacy NAME=br0 UUID=dd51480e-fbac-41a8-b5e6-ea3d097f5059 DEVICE=br0 ONBOOT=yes IPADDR=192.168.2.19 PREFIX=24 GATEWAY=192.168.2.254 DNS1=192.168.2.254 DOMAIN=sweet.home IPV6_DISABLED=yes
配置eno1以太网:
# vi /etc/sysconfig/network-scripts/ifcfg-bridge-slave-eno1
eno1配置:
TYPE=Ethernet NAME=bridge-slave-eno1 UUID=f43a8688-81f0-4860-91d4-f8f41efe2d10 DEVICE=eno1 ONBOOT=yes BRIDGE=br0
重启网络服务
# systemctl restart NetworkManager.service 或者 # nmcli con up br0 # nmcli connection delete eno1
使用nmcli命令进行验证
# nmcli device
输出示例:
DEVICE TYPE STATE CONNECTION br0 bridge connected br0 virbr0 bridge connected virbr0 eno1 ethernet connected bridge-slave-eno1 lo loopback unmanaged -- virbr0-nic tun unmanaged -- wlp1s0 wifi unmanaged --
检查kvm安装
使用lsmod命令确保已经加载了KVM Linux内核模块(驱动程序):
# lsmod | grep -i kvm
配置桥接网络
默认情况下,libvirtd配置了一个网桥virbr0。
使用下面命令进行确认:
# virsh net-info default # nmcli device # nmcli connection show
libvirtd使用轻型DHCP和缓存DNS服务器dnsmasq。
查看DHCP的IP分配范围:
# cat /var/lib/libvirt/dnsmasq/default.conf # egrep '^(dhcp-range|interface)' /var/lib/libvirt/dnsmasq/default.conf # ip a show virbr0 # ip r
使用virt-builder构建来宾镜像
使用virt-builder命令可以在CentOS 8上快速构建虚拟机。
查看所有镜像
# virt-builder --list # virt-builder --list | egrep -i 'debian|ubuntu' # virt-builder --list | egerp -i centos
构建Ubuntu 18.04 LTS 虚拟机
首先,设置SHELL变量:
vm="ubuntu-vm1" # VM name os="ubuntu-18.04" # OS tz="Asia/Chongqing" # Time zone ram="1024" # VM RAM disk="10G" # VM Disk Size vcpu="1" # Number of Virtual CPUs key=~/.ssh/id_rsa.pub # SSH Pub key pwd="Encrypted_PASSWORD_HERE" # Use 'mkpasswd --method=sha512crypt' to create Encrypted password bridge="br0" # Network bridge name such as 'br0' or 'virbr0' ostype="ubuntu18.04" # Run 'osinfo-query os' to get exact varient
现在,使用变量快速构建虚拟机镜像:
# virt-builder "${os}" \ --hostname "${vm}" \ --network \ --timezone "${tz}" \ --size=${disk} \ --format qcow2 -o /var/lib/libvirt/images/${vm}-disk01.qcow2 \ --update \ --firstboot-command "dpkg-reconfigure openssh-server" \ --firstboot-command "useradd -p ${pwd} -s /bin/bash -m -d /home/jack -G sudo jack" \ --edit '/etc/default/grub:s/^GRUB_CMDLINE_LINUX_DEFAULT=.*/GRUB_CMDLINE_LINUX_DEFAULT="console=tty0 console=ttyS0,115200n8"/' \ --ssh-inject "root:file:${key}" \ --run-command update-grub
注意,记下输出中的root密码。
虚拟机镜像制作好了以后,就可以使用它来安装虚拟机了。
安装虚拟机
# virt-install --import --name "${vm}" \ --ram "${ram}" \ --vcpu "${vcpu}" \ --disk path=/var/lib/libvirt/images/${vm}-disk01.qcow2,format=qcow2 \ --os-variant "${ostype}" \ --network=bridge=${bridge},model=virtio \ --noautoconsole
查看所有虚拟机
# virsh list
使用控制台登录虚拟机
# virsh console ${vm}
由于我们在镜像中置入了ssh密钥,所以可以使用ssh登录:
# host $vm # ssh root@vm-ip-here # ssh root@${vm}
我们可以使用virt-builder在在几分钟内构建各种虚拟机。
创建第一个虚拟机/来宾操作系统
这里,我们将创建一个全新的CentOS 8.x VM。
使用wget命令下载最新的CentOS 8.x ISO映像。
# cd /var/lib/libvirt/boot/ # wget https://mirrors.edge.kernel.org/centos/8/isos/x86_64/CentOS-8.1.1911-x86_64-boot.iso
创建CentOS 8.x 虚拟机
执行下面命令:
# virt-install \ --virt-type=kvm \ --name centos8-vm \ --memory 1024 \ --vcpus=1 \ --os-variant=rhel8.1 \ --cdrom=/var/lib/libvirt/boot/CentOS-8.1.1911-x86_64-boot.iso \ --network=bridge=br0,model=virtio \ --graphics vnc \ --disk path=/var/lib/libvirt/images/centos8.qcow2,size=20,bus=virtio,format=qcow2
查看vnc端口。
# virsh dumpxml centos8-vm | grep vnc
我们将通过SSH建立隧道。然后使用VNC客户端通过VNC服务远程访问虚拟机。
首先在Linux和Unix客户端上执行以下SSH端口转发命令:
{jack@linux-desktop:~ }$ ssh jack@192.168.2.19 -L 5900:127.0.0.1:5900
当建立ssh隧道后,在VNC客户端中,将HOST和端口指向127.0.0.1(localhost)地址和" 5900"。
连接并继续进行CentOS 8.x安装。
如何创建RHEL 8.x 虚拟机
你需要下载rhel-server.iso到本地,然后执行下面命令创建。
# virt-install \ --virt-type=kvm \ --name rhe8-server \ --memory 2048 \ --vcpus=2 \ --os-variant=rhel8.1 \ --cdrom=/var/lib/libvirt/boot/rhel-server.iso \ --network=bridge=br0,model=virtio \ --graphics vnc \ --disk path=/var/lib/libvirt/images/rhel8.qcow2,size=40,bus=virtio,format=qcow2
然后查看vnc端口信息
$ sudo virsh dumpxml rhel8-server | grep vnc
使用SSH客户端设置隧道:
$ ssh jack@192.168.2.19 -L 5906:127.0.0.1:5906
建立ssh隧道后,将VNC客户端指向127.0.0.1(localhost)地址和端口5906,以继续进行RHEL 8.x安装。
如何在CentOS 8上安装KVM并使用云镜像来安装来宾虚拟机?
如何在CentOS 8中使用KVM设置和管理虚拟化环境?
如何在Linux物理服务器上安装和管理Linux虚拟机?
使用云镜像
上面手动安装方法只适用于创建单个虚拟机或者用于学习目的。
如果我们要部署大量的虚拟机呢?
那么可以尝试使用云镜像。
我们可以根据需要对云镜像进行修改。比如,添加用户,安装ssh密钥,设置时区等。
下面演示如何使用云镜像创建CentOS 8虚拟机。
下载CentOS 8云镜像
# cd /var/lib/libvirt/boot # wget https://cloud.centos.org/centos/8/x86_64/images/CentOS-8-GenericCloud-8.1.1911-20200113.3.x86_64.qcow2
创建所需的目录
# D=/var/lib/libvirt/images # VM=centos8-vm1 # mkdir -vp $D/$VM mkdir: created directory '/var/lib/libvirt/images/centos8-vm1'
创建元数据文件meta-data
# cd $D/$VM # vi meta-data
内容如下:
instance-id: centos8-vm1 local-hostname: centos8-vm1
创建用户数据文件
生成ssh密钥,用于通过ssh密钥登录到虚拟机中。
# ssh-keygen -t ed25519 -C "CentOS 8 host server login ssh key"
编辑user-data文件
# cd $D/$VM # vi user-data
添加如下内容
#cloud-config # Hostname management preserve_hostname: False hostname: centos8-vm1 fqdn: centos8-vm1.sweet.home # Users users: - default - name: jack groups: ['wheel'] shell: /bin/bash sudo: ALL=(ALL) NOPASSWD:ALL ssh-authorized-keys: - ssh-ed25519 CentOS 8主机服务器登录ssh密钥 # Configure where output will go output: all: ">> /var/log/cloud-init.log" # configure interaction with ssh server ssh_genkeytypes: ['ed25519', 'rsa'] ssh_authorized_keys: - ssh-ed25519 CentOS 8主机服务器登录ssh密钥 # set timezone for VM timezone: Asia/Chongqing # Remove cloud-init runcmd: - systemctl stop NetworkManager.service && systemctl start NetworkManager.service - dnf -y remove cloud-init
检查user-data语法是否正确
# cloud-init devel schema --config-file user-data
复制云镜像
# cd $D/$VM # cp -v /var/lib/libvirt/boot/CentOS-8-GenericCloud-8.1.1911-20200113.3.x86_64.qcow2 $VM.qcow2
创建20GB的磁盘镜像
# cd $D/$VM # qemu-img create -f qcow2 -o preallocation=metadata $VM.new.image 20G # virt-resize --quiet --expand /dev/sda1 $VM.qcow2 $VM.new.image # mv -f $VM.new.image $VM.qcow2 # ls -l
创建一个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
使用云镜像安装CentOS 8 虚拟机
# 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=br0,model=virtio \ --os-variant=rhel8.1 \ --graphics spice \ --noautoconsole
删除不需要的文件:
# cd $D/$VM # virsh change-media $VM sda --eject --config
查看DHCP分配给虚拟机的IP地址
如果使用br0,请使用host命令查看centos8-vm1的地址:
# host $VM
如果使用默认的virbr0 桥接接口,则使用下面命令:
# virsh net-dhcp-leases default
登录到centos8-vm
使用ssh命令:
# ssh jack@$VM # ssh jack@192.168.2.212