基于Qemu构建虚拟机

Spring Lv2

  环境信息:

  OS:​CentOS Linux 8

一、 Qemu安装

  1. 下载源码并解压;

    1
    wget https://download.qemu.org/qemu-8.1.2.tar.xz && tar -xvf qemu-8.1.2.tar.xz
  2. 安装编译需要的工具

    TODO

  3. 编译检查配置

    1
    ./configure --prefix=/usr/local/qemu
  4. 编译及安装

    1
    make -j8 && make install
  5. 配置可执行文件的环境变量(下列命令二选一);

    1. 临时添加环境变量(在终端中输入下列命令);

      1
      export PATH="/usr/local/qemu/bin:$PATH"
    2. 每次登陆均生效;

      1. 在HOME目录下的.bashrc​​或者.bash_profile​​中添加下列命令;

        1
        export PATH="/usr/local/qemu/bin:$PATH"
      2. 执行source​​;

        1
        source .bashrc

二、 配置虚拟机

  1. 网络配置

    1. 创建桥接设备(已创建则可以使用现有设备);

      1. 创建一个名为 virbr0​​ 的桥接设备

        1
        ip link add name virbr0 type bridge
      2. 为桥接设备分配IP地址

        1
        ip addr add 192.168.1.1/24 dev virbr0
      3. 激活桥接设备

        1
        ip link set dev virbr0 up
    2. 在主机上配置TAP设备(网络设备)来创建一个虚拟局域网(设备名称可以自定义)

      1
      2
      3
      ip tuntap add sf-tap0 mode tap

      # tunctl -t sf-tap4 -u root
    3. 激活TAP设备

      1
      ip link set sf-tap0 up
    4. 将TAP设备连接到主机的虚拟网卡上

      1
      2
      3
      ip link set sf-tap0 master virbr0

      # brctl addif virbr0 sf-tap4
    5. 删除选项(可选)

      1. 删除网桥

        1
        ip link set sf-br0 down && brctl delbr sf-br0
      2. 删除接口

        1
        ip link set sf-tap2 down && ip tuntap del mode tap sf-tap5
  2. 构建qcow2格式的QEMU虚拟机磁盘文件;

    1
    qemu-img create -f qcow2 centos7-minmial.qcow2 32G

    使用qemu-img​​命令创建一个名为centos7-minmial​​,格式为qcow2​​的镜像文件,磁盘大小为32G;

  3. 下载系统镜像(这里以Centos 7为例,镜像可以在https://vault.centos.org/7.6.1810/isos/x86_64/ 中查找)

    1
    wget https://vault.centos.org/7.6.1810/isos/x86_64/CentOS-7-x86_64-Minimal-1810.iso
  4. 虚拟机系统安装(纯命令行模式);

    1. 挂载ISO到本地

      1
      mount CentOS-7-x86_64-Minimal-1810.iso /mnt/temp/ && cp -r /mnt/temp/ ../
    2. 启动虚拟机安装操作系统

      注意:需要找到挂载到本地的系统kernel​​以及initrd​​文件以启动系统;

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      qemu-system-x86_64 \
      -m 16384M \
      -smp 2 \
      -boot c \
      -cpu host \
      -hda sf-vm2.qcow2 \
      --enable-kvm \
      -kernel temp/isolinux/vmlinuz \
      -initrd temp/isolinux/initrd.img \
      --nographic \
      -append console=ttyS0 \
      -cdrom ./iso_images/CentOS-7-x86_64-Minimal-1810.iso
      • -m 16384M​: 分配给虚拟机的内存大小,这里设置为 16 GB(16384 MB)。
      • -smp 2​: 设置虚拟机的 CPU 核心数量为 2。
      • -boot c​: 设置虚拟机从硬盘启动。
      • -cpu host​: 使用宿主机的 CPU 型号和特性作为虚拟机的 CPU。
      • -hda sf-vm2.qcow2​: 指定虚拟机的硬盘镜像文件为 sf-vm2.qcow2​。
      • --enable-kvm​: 启用 KVM(Kernel-based Virtual Machine)加速。
      • -kernel temp/isolinux/vmlinuz​: 指定用于虚拟机启动的内核镜像文件路径。
      • -initrd temp/isolinux/initrd.img​: 指定用于虚拟机启动的初始 RAM 磁盘镜像文件路径。
      • --nographic​: 禁用图形界面,以纯文本模式运行虚拟机。
      • -append console=ttyS0​: 指定内核启动参数,将控制台输出重定向到串口终端(ttyS0)。
      • -cdrom ./iso_images/CentOS-7-x86_64-Minimal-1810.iso​: 指定用于虚拟机启动的光盘镜像文件路径。
  5. 启动虚拟机以配置镜像系统;

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    vm_num=1
    vm_mac=$(openssl rand -hex 6 | sed 's/\(..\)/\1:/g; s/.$//')
    qemu-system-x86_64 \
    -name sf-${vm_num} \
    --enable-kvm \
    -cpu host \
    -m 20480 \
    -drive file=sf-vm${vm_num}.qcow2,format=qcow2 \
    -netdev tap,id=net0,ifname=sf-tap${vm_num},script=no,downscript=no \
    -device virtio-net-pci,netdev=net0,mac=${vm_mac} \
    --nographic
    • -name sf-2​: 设置虚拟机的名称为 “sf-2”。
    • --enable-kvm​: 启用 KVM(Kernel-based Virtual Machine)加速。
    • -cpu host​: 使用宿主机的 CPU 型号和特性作为虚拟机的 CPU。
    • -m 20480​: 分配给虚拟机的内存大小,这里设置为 20 GB(20480 MB)。
    • -drive file=sf-vm2.qcow2,format=qcow2​: 指定虚拟机的硬盘镜像文件为 sf-vm2.qcow2​,并指定其格式为 QEMU Copy-On-Write 2(qcow2)。
    • -netdev tap,id=net0,ifname=sf-tap1,script=no,downscript=no​: 创建一个 tap 类型的网络设备,名称为 net0​,接口名称为 sf-tap1​,并禁用脚本和关闭脚本。
    • -device virtio-net-pci,netdev=net0,mac=52:54:00:12:34:57​: 将虚拟机的网络设备类型设置为 VirtIO,并将其连接到 net0​ 网络设备,并指定虚拟机的 MAC 地址为 52:54:00:12:34:57​。
    • --nographic​: 禁用图形界面,以纯文本模式运行虚拟机
  6. 修改虚拟机ip地址

    1. 修改/etc/sysconfig/network-scripts/ifcfg-eth0​文件为下列内容(如果没有则创建即可)

      IPADDR​修改为指定的ip地址即可

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      TYPE=Ethernet
      PROXY_METHOD=none
      BROWSER_ONLY=no
      BOOTPROTO=static
      DEFROUTE=yes
      IPV4_FAILURE_FATAL=no
      NAME=eth0
      UUID=e59fb3fa-7d4a-40f2-93d4-7ad21897f829
      DEVICE=eth0
      ONBOOT=yes

      IPADDR=192.168.122.x
      NETMASK=255.255.255.0
      GATEWAY=192.168.122.1
    2. 重新载入network服务

      1
      systemctl restart network
    3. 重启虚拟机(如果上面不成功再尝试重启大法)

      1
      reboot

  ‍

三、基于libvirt管理虚拟机

  TODO

  1. 配置文件编写

    1. linux生成UUID可以使用命令:uuidgen
    2. linux生成随机的MAC地址可以使用命令:​openssl rand -hex 6 | sed 's/\(..\)/\1:/g; s/.$//'

配置主机的路由和端口转发(可选)

  TODO

知识点

  桥接(bridge)设备和 TAP 设备是在网络虚拟化和网络配置中使用的两种不同类型的网络设备,它们具有不同的功能和用途。

  1. 桥接(Bridge)设备:

    • 桥接设备是一个虚拟的网络设备,它可以将多个网络接口连接在一起,形成一个逻辑网络。
    • 桥接设备工作在数据链路层(第二层),根据 MAC 地址将数据包从一个接口转发到另一个接口。
    • 桥接设备通常用于创建虚拟局域网(VLAN)以及在虚拟化环境中连接虚拟机和物理网络之间的网络通信。
    • 桥接设备可以通过配置 IP 地址和其他网络参数来与网络进行通信。
  2. TAP 设备:

    • TAP(以太网隧道)设备是一种虚拟网络设备,它可以模拟一个以太网接口,用于在虚拟化环境中与虚拟机进行通信。
    • TAP 设备工作在数据链路层(第二层),与物理以太网接口类似,可以接收和发送以太网帧。
    • TAP 设备通常用于虚拟机监控器(如 KVM、VirtualBox 等)中,它允许虚拟机通过 TAP 设备与宿主机或其他虚拟机进行通信。
    • TAP 设备通常需要一个桥接设备来将其连接到物理网络或其他虚拟机,以实现网络通信。

  在虚拟化环境中,通常会将 TAP 设备连接到桥接设备上,以实现虚拟机与物理网络之间的通信。TAP 设备相当于虚拟机的网络接口,而桥接设备则负责将虚拟机的网络流量转发到物理网络或其他虚拟机。

  总结起来,桥接设备用于创建逻辑网络,而 TAP 设备用于模拟以太网接口,使虚拟机能够与网络进行通信。

  ‍

参考资料

  [1] https://www.owalle.com/2019/12/26/network-in-vm/#:~:text=%E9%80%9A%E8%BF%87TAP%E9%85%8D%E7%BD%AENAT%201%20%E7%A1%AE%E4%BF%9D%E5%B7%B2%E5%AE%89%E8%A3%85libvirt-clients%E5%92%8Clibvirt-daemon%201%202%203%204%205,%3A7%20%5C%20-device%20virtio-net-pci%2Cnetdev%3Dnic0%2Cmac%3D00%3A16%3A3e%3A0c%3A12%3A78%20%5C%20-netdev%20tap%2Cid%3Dnic0%2Cbr%3Dbr0%2Chelper%3D%2Fusr%2Flocal%2Flibexec%2Fqemu-bridge-helper%2Cvhost%3Don%20

  [2] ChatGPT

  ‍

  • Title: 基于Qemu构建虚拟机
  • Author: Spring
  • Created at : 2023-10-30 13:21:56
  • Updated at : 2023-11-02 09:58:56
  • Link: https://www.tecacc.com//post/build-a-virtual-machine-based-on-qemu-ldf4l.html
  • License: This work is licensed under CC BY-NC-SA 4.0.