Ubuntu1804 虚拟机实现 KVM 嵌套虚拟化

在虚拟机 Ubuntu 18.04 下使用 KVM 新建 Ubuntu18.04 虚拟机,涉及到 Promox VE 开启嵌套虚拟化、qemu-kvm 的安装,virt-install 工具的使用等

套 娃 警 告

环境

  • Ubuntu 18.04.4 Server KVM 虚拟机
    • Proxmox VE 平台

准备

  • Ubuntu 18.04.4 CDROM 镜像
    • 下载地址
    • 需要注意镜像的选择,使用 Ubuntu 当前官网下载链接的镜像无法正常安装(原因见 虚拟机内的 KVM 虚拟化 – 第 4 步 新建二级虚拟机
  • 如果不想下载镜像,也可以使用网络镜像

参考

步骤

配置宿主机

我的宿主机使用了 Proxmox VE,有现成的脚本工具 pvetools 来开启嵌套虚拟化——此工具也支持 Debian9 以上系统,使用 modprobe 指令实现——其他发行版也可以参照

  1. 下载 pvetools
    • 执行指令
      git clone https://github.com/ivanhao/pvetools.git
  2. 运行脚本
    • 执行指令
      cd pvetools
      ./pvetools
      # 如果提示没有权限,则执行
      # chmod +x ./*.sh
  3. 选择开启嵌套虚拟化,此操作需要重启所有虚拟机

虚拟机内的 KVM 虚拟化

虚拟机为 Ubuntu 18.04 Server

以下将 虚拟机中的虚拟机 称为 二级虚拟机(自创土嗨名称),PVE 的虚拟机 称为 一级虚拟机(自创土嗨名称)

  1. 查看是否支持 KVM
    • 执行指令
      egrep -c '(svm|vmx)' /proc/cpuinfo

      结果为 0 则不支持,如果上一步 PVE 开启了虚拟化则结果是虚拟机分配的核心数

  2. 安装虚拟化工具
    • 执行指令
      sudo apt install qemu-kvm libvirt-bin virtinst bridge-utils libosinfo-bin libguestfs-tools virt-top
  3. 网络配置
    • 此处使用桥接网络模式,这样二级虚拟机和一级虚拟机的网络同级
    • Ubuntu 18.04 使用 netplan 来配置网络,编辑 netplan 配置文件
      sudo vim /etc/netplan/xxxx.yaml/yml

      配置文件为 yaml 格式(缩进为两个空格),名称不唯一,不同机器名称不同

    • 更改为以下内容,新增桥接端口 br0
      network:
        ethernets:
          ens18:
            dhcp4: false 
        version: 2
      
        bridges:
          br0:
            interfaces: [ens18]
            addresses: [192.168.10.20/24]
            gateway4: 192.168.10.1
            nameservers:
              addresses: [192.168.10.1,8.8.8.8]
            dhcp4: no
            dhcp6: no

      interfaces 设置为 ethernets 中的网络端口名称
      addresses 设置为本机(一级虚拟机)的 IP 地址
      网关设置为路由器 IP(根据自己家的网络情况填写)
      关闭 dhcp(在之后安装二级虚拟机时)

    • 加载新配置
      sudo netplan apply --debug

      添加 –debug 参数可以显示配置文件错误

    • 查看网络配置
      ifconfig

  4. 新建二级虚拟机
    • 使用 scp 等工具上传安装镜像(注意必须为 cdrom 安装镜像)
    • 新建虚拟机,执行指令
      sudo virt-install -n ubuntu1804 \
       --os-type=linux \
       --os-variant=ubuntu18.04 \
       --ram=2048 --vcpus=2 \
       --disk path=/var/lib/libvirt/images/ubuntu1804.img,bus=virtio,size=15 \
       --network bridge:br0 \
       --graphics none  \
       --location=/home/azhuge233/ubuntu-18.04.4-server-amd64.iso \
       --extra-args='console=ttyS0,115200n8 serial' \
       --debug

      参数的意义

      • -n 指定虚拟机名称
      • –os-type 指定虚拟机操作系统类型(Linux、Windows 还是其他)
      • –os-variant 指定虚拟机具体操作系统系统类型(Linux 中的 CentOS 还是 Debian),系统类型可以通过安装 libosinfo-bin 后使用指令
        osinfo-query os

        查看

      • –ram 指定虚拟机内存
      • –vcpus 指定虚拟机处理器数量
      • –disk path 指定虚拟机的磁盘位置、总线类型和磁盘大小
      • –network 指定网络类型
      • –graphics GUI输出方式,none 为没有图像输出,也可以选择 vnc 或 serial
      • –location 安装介质的路径
      • –extra-args 只有使用 –location 时才有效,指定一些附加参数
      • –debug 输出 debug 信息(方便查错)
    • 也可以选择更改 –location 参数,使用网络镜像
      sudo virt-install -n ubuntu1804 \
       --os-type=linux \
       --os-variant=ubuntu18.04 \
       --ram=2048 --vcpus=2 \
       --disk path=/var/lib/libvirt/images/ubuntu1804.img,bus=virtio,size=15 \
       --network bridge:br0 \
       --graphics none \
       --location=http://cn.archive.ubuntu.com/ubuntu/dists/bionic/main/installer-amd64/ \
       --extra-args='console=ttyS0,115200n8 serial' \
       --debug

      注意网址的路径,定位到 …/installer-amd64/ 时 virt-install 才能正确识别网络安装镜像,否则 virt-install 会提示找不到路径

    • 解释一下为什么对镜像有要求(可跳过)
      镜像内 /install 目录下的对比图前两个窗口为 Ubuntu 官网下载页通过 bt 下载的安装镜像(Server 和 Desktop),其 /install 目录下没有完整的安装文件,而 virt-install 会检查 /install 下的安装文件(其中一项为 vmlinz),检测不到就无法生成相应的信息文件,安装就会报错并终止
  5. 正常启动后,终端会自动连接到虚拟机,显示 ubuntu 18.04 的安装界面(如下图)

连接虚拟机

按照上面步骤,虚拟机安装完毕后是无法直接与之连接的(至少在我这里是这样)

具体表现为:

  • 启动虚拟机后有 grub 界面,但无论选择一般启动还是高级启动均无法进入系统
  • 执行指令
    virsh list

    查看虚拟机,发现其处于 paused 状态,已经暂停了运行

  • 在 grub 选择 高级启动 – 恢复模式 启动后卡在

    loading initial ramdisk

    这之后虚拟机就进入了 paused 状态

发生状况的原因是 grub 未配置控制台输出,解决方法:

  1. 正常进入 grub,按 E 键编辑 grub 文件
  2. 在 linux 行 的 quiet 后加入 console=ttyS0(即之前在 –extra-args 中设置的控制台端口),Ctrl+X 进入系统
  3. 注意:在 grub 界面更改的配置文件只有本次启动生效,进入系统后需及时更新 grub 配置文件

效果

成功套娃并进入系统

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据