在Ubuntu 20.04上安装KVM
我们需要以下软件包:
软件包名称 | 说明 | 安装目标/类型 |
---|---|---|
qemu-kvm | QEMU x86硬件上的完全虚拟化 | 无终端外设服务器 |
libvirt-daemon-system | Libvirt守护程序配置文件 | |
libvirt-clients | libvirt库的程序 | 无终端外设服务器 |
virtinst | 用于创建和克隆虚拟机的程序 | 无终端外设服务器 |
libosinfo-bin | 查询osinfo数据库的工具 | 无终端外设服务器 |
libguestfs-tools | 用于云镜像的客户机磁盘镜像管理系统和工具 | 无终端外设服务器 |
cpu-checker | 工具可帮助评估某些CPU(或者BIOS)功能 | 无头或者GUI服务器 |
virt-manager | 用于管理虚拟机的桌面应用程序 | 图形/ GUI服务器 |
ssh-askpass-gnome | 交互式X程序,提示用户输入ssh-add的密码短语 | 以图形方式/用于远程服务器的GUI |
执行以下apt命令/ apt-get命令安装软件包:
$ sudo apt install qemu-kvm libvirt-daemon-system libvirt-clients virtinst cpu-checker libguestfs-tools libosinfo-bin
使用云镜像
构建单个虚拟机,我们可以采用手动安装方法。但是,如果我们需要部署大量的虚拟机呢?
可以试试云镜像。
我们可以根据需要修改预构建好的云镜像。
让我们看一下如何使用云镜像创建一个CentOS 8虚拟机。
下载CentOS 8云镜像
$ sudo -i cd /var/lib/libvirt/boot wget https://cloud.centos.org/centos/8/x86_64/images/CentOS-8-GenericCloud-8.2.2004-20200611.2.x86_64.qcow2
创建所需的目录
D=/var/lib/libvirt/images VM=centos8-vm1 ### 新建虚拟机名称 mkdir -vp $D/$VM
创建meta-data文件
cd $D/$VM vi meta-data
添加下面配置:
instance-id: centos8-vm1 local-hostname: centos8-vm1
创建user-data文件
我们将使用ssh密钥登录虚拟机。
所以请确保使用ssh-keygen生成了相应的密钥:
ssh-keygen -t ed25519 -C "centos 8 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: vivek groups: ['wheel'] shell: /bin/bash sudo: ALL=(ALL) NOPASSWD:ALL ssh-authorized-keys: - ssh-ed25519 T1D1J+Y4evzDB2lrN7udI3vRXi4U3z2gxSCp/mU3DuA centos8 login ssh key # 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 T1D1J+Y4evzDB2lrN7udI3vRXi4U3z2gxSCp/mU3DuA centos8 login ssh key # set timezone for VM timezone: Asia/Kolkata # 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.2.2004-20200611.2.x86_64.qcow $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 rm -v meta-data user-data $VM-cidata.iso
查看KVM虚拟机的IP地址
如果使用br0,则执行:
host $VM
如果使用virbr0,则执行:
virsh net-dhcp-leases default
验证是否可以登录到centos8-vm
使用ssh命令
ssh jack@$VM ssh jack@192.168.2.201
创建第一个虚拟机
我们将创建一个CentOS 8.x 虚拟机。
下载CentOS 8.x最新的ISO镜像:
$ cd / var / lib / libvirt / boot / $ sudo wget https:// mirrors.edge.kernel.org / centos / 8 / isos / x86_64 / CentOS-8.2.2004-x86_64-dvd1.iso
在Ubuntu 20.04 LTS上创建CentOS 8 虚拟机
$ export ISO="/var/lib/libvirt/boot/CentOS-8.2.2004-x86_64-dvd1.iso" Installation media $ export NET="br0" bridge name $ export OS="centos8" os type $ export VM_IMG="/var/lib/libvirt/images/centos8.qcow2" VM image on disk $ sudo virt-install \ --virt-type=kvm \ --name centos8 \ --ram 2048 \ --vcpus=2 \ --os-variant=${OS} \ --virt-type=kvm \ --hvm \ --cdrom=${ISO} \ --network=bridge=${NET},model=virtio \ --graphics vnc \ --disk path=${VM_IMG},size=40,bus=virtio,format=qcow2
配置从另一个终端通过ssh使用vnc登录:
$ sudo virsh dumpxml centos8 | grep vnc $ sudo virsh vncdisplay centos8
记下port号。
然后使用ssh客户端建立隧道,使用vnc客户端访问远程vnc服务器。
在你的客户端/桌面系统尚,执行下面命令,设置SSH端口转发:
$ ssh jack@server1.onitroad.local -L 5900:127.0.0.1:5900 $ ssh jack@192.168.2.25 -L 5900:127.0.0.1:5900
一旦建立了ssh隧道,就可以将VNC客户端指向127.0.0.1(localhost)地址和端口5900。
您应该在Linux/macOS/Unix桌面上看到CentOS Linux 8 虚拟机安装界面。
现在按照屏幕上的说明安装CentOS 8 虚拟机。安装后,继续并单击重新启动按钮。远程服务器关闭了与VNC客户端的连接。您可以通过KVM客户机重新连接以配置服务器的其余部分。
在Ubuntu 20.04上配置桥接网络
默认情况下,KVM安装会创建一个virbr0网桥,我们可以将其用于外界进行通信。
让我们使用ip命令查看有关virbr0网桥的信息:
$ ip link show master virbr0 $ bridge link show dev virbr0-nic $ ip a s virbr0
查看以太网设备名称
执行以下命令,然后记下以太网名称:
$ nmcli connection show --active
使用enp0s31f6创建一个名为br0的新网桥
执行:
$ sudo nmcli con add ifname br0 type bridge con-name br0 $ sudo nmcli con add type bridge-slave ifname enp0s31f6 master br0 $ nmcli connection show #SET UP IPv4 too as per your config # $ sudo nmcli connection modify br0 ipv4.addresses '192.168.2.25/24' $ sudo nmcli connection modify br0 ipv4.gateway '192.168.2.254' $ sudo nmcli connection modify br0 ipv4.dns '192.168.2.254' $ sudo nmcli connection modify br0 ipv4.dns-search 'sweet.home' $ sudo nmcli connection modify br0 ipv4.method manual
现在,我们可以将br0或者virbr0用于虚拟机网络。
KVM管理命令virsh
查看所有KVM虚拟机
# 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
如何在Ubuntu 20.04 LTS Linux服务器上安装KVM并使用virt-install创建新的虚拟机?
如何使用virt-builder快速构建新的虚拟机?
检测CPU是否支持KVM
执行下面命令:
$ lscpu $ kvm-ok
默认情况下,许多系统制造商在BIOS中禁用了CPU虚拟化技术。
我们需要在BIOS中打开它。
使用virt-builder和云镜像创建虚拟机
我们可以使用virt-builder命令在Ubuntu 20.04 LTS服务器上快速构建虚拟机。
要查看镜像,运行:
$ sudo virt-builder --list filter it using grep command/egrep command $ sudo virt-builder --list | egrep -i 'debian|ubuntu' $ sudo virt-builder --list | egrep -i centos
在KVM上按以下方式构建Debian 10 LTS 虚拟机
首先,设置SHELL变量:
export vm="debian-10-vm1" # 虚拟机名称 export os="debian-10" # 操作系统 export tz="Asia/Chongqing" # 时区 export ram="1024" # 内存大小 单位MB export disk="10G" # 磁盘大小 export vcpu="1" # cpu数量 export key=/home/vivek/.ssh/id_rsa.pub # SSH公钥 export pwd="Encrypted_PASSWORD_HERE" # 使用 'mkpasswd --method=sha512crypt'生成加密的密码 export bridge="br0" # 桥接网络名称,比如'br0' 或 'virbr0' export ostype="debian10" # 执行 'osinfo-query os' 获取系统类型
现在,根据变量快速构建虚拟机镜像:
$ sudo 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/vivek -G sudo vivek" \ --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密码。
现在,我们的自定义VM镜像已经构建好了。
让我们开始安装虚拟机:
安装虚拟机
$ sudo 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
查看所有虚拟机:
$ sudo virsh list
使用控制台登录虚拟机:
$ sudo virsh console ${vm}
因为我们在镜像中注入了ssh公钥。所以还可以通过ssh登录
$ host $vm $ ssh root@vm-ip-here $ ssh root@${vm}
我们可以使用virt-builder命令构建各种虚拟机。然后,我们使用virt-install在Ubuntu 20.04 LTS服务器上安装虚拟机。