Ubuntu 安装 KVM 虚拟化

07-17 1571阅读

1. Ubuntu 安装 KVM 虚拟化

KVM 是 Linux 内核中一个基于 hypervisor 的虚拟化模块,它允许用户在 Linux 操作系统上创建和管理虚拟机。

Ubuntu 安装 KVM 虚拟化

如果机器的CPU不支持硬件虚拟化扩展,是无法使用KVM(基于内核的虚拟机)直接创建和运行虚拟机的。此时最多只能使用QEMU的完全软件仿真模式来运行虚拟机,但是性能会极度低下。

检查您的 CPU 是否支持虚拟化:

运行以下命令,输出大于0,说明KVM与系统兼容,可以安装。

egrep -c 'vmx|svm' /proc/cpuinfo

或者安装cpu-checker工具。

apt install -y cpu-checker

它应该输出:

root@ubuntu:~# kvm-ok
INFO: /dev/kvm exists
KVM acceleration can be used

Vmware workstation可以通过编辑虚拟机处理器选项,开启嵌套虚拟化。

Ubuntu 安装 KVM 虚拟化

环境信息:

  • 安装环境:vmware workstation
  • 操作系统:ubuntu 22.04 LTS

    安装kvm软件包

    配置主机名

    root@ubuntu:~# hostnamectl set-hostname kvm-host
    

    更新系统

    apt update -y
    

    安装必要的包:

    ## qemu+kvm
    apt install -y qemu-kvm 
    ## libvirt
    apt install -y virt-manager libvirt-daemon-system virtinst libvirt-clients
    ## bridge tool
    apt install -y bridge-utils
    

    安装包说明:

    • qemu-kvm - 为 KVM 管理程序提供硬件模拟的软件程序
    • libvirt-daemon-system - 将 libvirt 守护程序作为系统服务运行的配置文件
    • libvirt-clients - 用来管理虚拟化平台的软件
    • bridge-utils - 用来配置网络桥接的命令行工具
    • virtinst - 用来创建虚拟机的命令行工具

      一旦软件包被安装好,libvirt 守护程序将会自动启动。你可以通过运行下面的命令验证:

      root@kvm-host:~# systemctl is-active libvirtd
      active
      

      用户添加到 KVM 和 Libvirt 组

      想要创建和管理虚拟机,你需要添加你的用户到libvirt和kvm用户组。

      sudo usermod -aG kvm $USER
      sudo usermod -aG libvirt $USER
      

      网络设置

      在libvirt 安装过程中,一个被称为 virbr0 的桥接设备默认被创建。这个设备使用 NAT 来连接客户机到外面的世界。

      查看网卡变化,新增了一个virtbr0的网桥接口。

      root@kvm-host:~# ip a
      1: lo:  mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
          link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
          inet 127.0.0.1/8 scope host lo
             valid_lft forever preferred_lft forever
          inet6 ::1/128 scope host 
             valid_lft forever preferred_lft forever
      2: ens33:  mtu 1500 qdisc fq_codel state UP group default qlen 1000
          link/ether 00:0c:29:15:cb:54 brd ff:ff:ff:ff:ff:ff
          altname enp2s1
          inet 192.168.93.9/24 brd 192.168.93.255 scope global ens33
             valid_lft forever preferred_lft forever
          inet6 fe80::20c:29ff:fe15:cb54/64 scope link 
             valid_lft forever preferred_lft forever
      3: virbr0:  mtu 1500 qdisc noqueue state DOWN group default qlen 1000
          link/ether 52:54:00:93:99:53 brd ff:ff:ff:ff:ff:ff
          inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
             valid_lft forever preferred_lft forever
      

      运行 brctl 工具来列出当前的网桥和它们连接的接口:

      root@kvm-host:~# brctl show
      bridge name     bridge id               STP enabled     interfaces
      virbr0          8000.525400939953       yes
      

      默认网络设置适合大部分 Ubuntu 用户,但是有限制,由于虚拟机地址段为私有IP地址,你只能从虚拟机所在宿主机访问虚拟机地址,无法从外部网络访问虚拟机地址。

      Libvirt默认NAT网络模式原理图:

      Ubuntu 安装 KVM 虚拟化

      如果需要从外部连接虚拟机,需要创建一个新的网桥,将该网桥桥接到物理网卡,以便虚拟机配置物理网段的IP地址,进而实现通过外部网络直连虚拟机。

      下载 cloud image 镜像

      下面以默认NAT网络模式为例,介绍使用 ubuntu cloud image 快速启动虚拟机。

      以 jammy(Ubuntu Server 22.04 LTS)为例

      # 官方源
      wget https://cloud-images.ubuntu.com/bionic/current/bionic-server-cloudimg-amd64.img
      # 国内源
      wget https://mirrors.tuna.tsinghua.edu.cn/ubuntu-cloud-images/jammy/current/jammy-server-cloudimg-amd64.img
      

      安装guestfs-tools 镜像定制工具

      apt install -y guestfs-tools
      

      创建镜像模板目录

      mkdir -p /var/lib/libvirt/images/templates
      

      复制镜像到模板目录

      cp jammy-server-cloudimg-amd64.img /var/lib/libvirt/images/templates/
      

      定制镜像参数

      export image=/var/lib/libvirt/images/templates/jammy-server-cloudimg-amd64.img
      virt-customize -a $image --run-command 'adduser ubuntu'
      virt-customize -a $image --run-command 'echo "ubuntu:ubuntu123" | chpasswd'
      virt-customize -a $image --run-command 'adduser ubuntu sudo'
      virt-customize -a $image --run-command 'apt update -y'
      virt-customize -a $image --run-command 'apt install -y qemu-guest-agent'
      

      参数说明:

      • 创建 ubuntu 用户,密码为 ubuntu123,并赋予sudo权限
      • 更新系统软件索引(可选)
      • 安装必要的软件包(可选)

        创建虚拟机

        创建虚拟机存储路径并复制镜像模板

        mkdir -p /var/lib/libvirt/images/ubuntu01
        cp /var/lib/libvirt/images/templates/jammy-server-cloudimg-amd64.img /var/lib/libvirt/images/ubuntu01/
        

        使用virt-install命令创建虚拟机

        virt-install \
          --name ubuntu01 \
          --vcpus 1 \
          --memory 2048 \
          --disk path=/var/lib/libvirt/images/ubuntu01/jammy-server-cloudimg-amd64.img \
          --os-variant ubuntu22.04 \
          --import \
          --autostart \
          --noautoconsole
        

        参数说明:

        • --name:可选,指定虚拟机名称
        • --vcps:可选,指定虚拟机cpu大小
        • --memory:可选,指定虚拟机内存大小
        • --disk path:必选,指定虚拟机镜像位置
        • --os-variant:必选,指定虚拟机操作系统类型
        • --import :必选,指定虚拟机安装方式,安装方式不同该参数不同
        • --autostart:可选,默认虚拟机不会随主机重启后一起启动,可通过添加该参数配置
        • --noautoconsole:可选,不指定该参数virt-install命令将始终处于挂起状态,需要另开窗口登录虚拟机

          说明:使用osinfo-query命令可以列出--os-variant选项支持的所有参数。

          $ apt install -y libosinfo-bin
          $ osinfo-query os
          

          命令示例输出如下

          root@kvm-host:~# virt-install \
            --name ubuntu01 \
            --vcpus 1 \
            --memory 2048 \
            --disk path=/var/lib/libvirt/images/ubuntu01/jammy-server-cloudimg-amd64.img \
            --os-variant ubuntu22.04 \
            --import \
            --autostart \
            --noautoconsole
          Starting install...
          Creating domain...                      |    0 B  00:00:00     
          Domain creation completed.
          root@kvm-host:~#
          

          创建虚拟机后,查看网口及网桥变化,主机新增vnet0网卡,网桥新增vnet0接口,说明虚拟机连接到了网桥上。

          root@kvm-host:~# ip a
          1: lo:  mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
              link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
              inet 127.0.0.1/8 scope host lo
                 valid_lft forever preferred_lft forever
              inet6 ::1/128 scope host 
                 valid_lft forever preferred_lft forever
          2: ens33:  mtu 1500 qdisc fq_codel state UP group default qlen 1000
              link/ether 00:0c:29:15:cb:54 brd ff:ff:ff:ff:ff:ff
              altname enp2s1
              inet 192.168.93.9/24 brd 192.168.93.255 scope global ens33
                 valid_lft forever preferred_lft forever
              inet6 fe80::20c:29ff:fe15:cb54/64 scope link 
                 valid_lft forever preferred_lft forever
          3: virbr0:  mtu 1500 qdisc noqueue state UP group default qlen 1000
              link/ether 52:54:00:93:99:53 brd ff:ff:ff:ff:ff:ff
              inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
                 valid_lft forever preferred_lft forever
          4: vnet0:  mtu 1500 qdisc noqueue master virbr0 state UNKNOWN group default qlen 1000
              link/ether fe:54:00:fc:fe:df brd ff:ff:ff:ff:ff:ff
              inet6 fe80::fc54:ff:fefc:fedf/64 scope link 
                 valid_lft forever preferred_lft forever
          root@kvm-host:~# brctl show
          bridge name     bridge id               STP enabled     interfaces
          virbr0          8000.525400939953       yes             vnet0
          

          查看虚拟机运行状态

          root@kvm-host:~# virsh list
           Id   Name       State
          --------------------------
           1    ubuntu01   running
          root@kvm-host:~# 
          

          使用virsh console命令连接到虚拟机,使用上面定义的用户密码ubuntu/ubuntu123登录到虚拟机

          virsh console ubuntu01
          

          示例命令输出如下:

          root@kvm-host:~# virsh console ubuntu01 
          Connected to domain 'ubuntu01'
          Escape character is ^] (Ctrl + ])
          ubuntu login: ubuntu
          Password: 
          Welcome to Ubuntu 22.04.4 LTS (GNU/Linux 5.15.0-100-generic x86_64)
           * Documentation:  https://help.ubuntu.com
           * Management:     https://landscape.canonical.com
           * Support:        https://ubuntu.com/pro
            System information as of Fri Mar 15 11:31:43 UTC 2024
            System load: 0.0458984375      Memory usage: 8%   Processes:       114
            Usage of /:  81.3% of 1.96GB   Swap usage:   0%   Users logged in: 0
          Expanded Security Maintenance for Applications is not enabled.
          1 update can be applied immediately.
          1 of these updates is a standard security update.
          To see these additional updates run: apt list --upgradable
          Enable ESM Apps to receive additional future security updates.
          See https://ubuntu.com/esm or run: sudo pro status
          The programs included with the Ubuntu system are free software;
          the exact distribution terms for each program are described in the
          individual files in /usr/share/doc/*/copyright.
          Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by
          applicable law.
          To run a command as administrator (user "root"), use "sudo ".
          See "man sudo_root" for details.
          ubuntu@ubuntu:~$ 
          ubuntu@ubuntu:~$ cat /etc/os-release 
          PRETTY_NAME="Ubuntu 22.04.4 LTS"
          NAME="Ubuntu"
          VERSION_ID="22.04"
          VERSION="22.04.4 LTS (Jammy Jellyfish)"
          VERSION_CODENAME=jammy
          ID=ubuntu
          ID_LIKE=debian
          HOME_URL="https://www.ubuntu.com/"
          SUPPORT_URL="https://help.ubuntu.com/"
          BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
          PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
          UBUNTU_CODENAME=jammy
          ubuntu@ubuntu:~$ 
          

          切换到root用户,输入ubuntu用户的密码ubuntu123

          ubuntu@ubuntu:~$ sudo -i
          [sudo] password for ubuntu: 
          root@ubuntu:~# 
          root@ubuntu:~# ip a
          1: lo:  mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
              link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
              inet 127.0.0.1/8 scope host lo
                 valid_lft forever preferred_lft forever
              inet6 ::1/128 scope host 
                 valid_lft forever preferred_lft forever
          2: enp1s0:  mtu 1500 qdisc noop state DOWN group default qlen 1000
              link/ether 52:54:00:fc:fe:df brd ff:ff:ff:ff:ff:ff
          root@ubuntu:~# 
          

          可以看到网卡未获取任何IP地址,通过主机上的网桥接口virbr0可以确认网桥地址段默认为192.168.122.0/24,网关地址为192.168.122.1/24,该地址段和网关就是虚拟机可用的地址段和网关。

          确认虚拟机网卡名称为enp1s0,虚拟机中创建网卡配置文件

          cat >/etc/netplan/00-installer-config.yaml
VPS购买请点击我

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

目录[+]