searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

在x86_64服务器上创建arm64虚拟机

2023-05-19 02:01:13
115
0

一、安装qemu-system-aarch64

yum install -y ninja-build

# qemu-1.5.3不支持aarch64,需要编译更新的qemu版本
wget https://download.qemu.org/qemu-4.2.0.tar.bz2
tar -xvf qemu-4.2.0.tar.bz2

cd qemu-4.2.0
mkdir build
cd build

# 用gcc8
source /opt/rh/devtoolset-8/enable
../configure --target-list=aarch64-softmmu,aarch64-linux-user --enable-virtfs
make
make install

二、 下载镜像

wget http://cloud.centos.org/centos/7/images/CentOS-7-aarch64-GenericCloud-2111.qcow2

三、 下载AAVMF

AAVMF(Open Virtual Machine Firmware)用于在aarch64平台应用UEFI固件引导虚拟机。

yum install http://mirror.centos.org/altarch/7/os/aarch64/Packages/AAVMF-20180508-6.gitee3198e672e2.el7.noarch.rpm

需要在虚拟机的xml配置文件中做如下配置:

<os>
  <type arch='aarch64' machine='virt-4.2'>hvm</type>
  <loader readonly='yes' type='pflash'>/usr/share/AAVMF/AAVMF_CODE.fd</loader>
  <nvram>/usr/share/AAVMF/AAVMF_VARS.fd</nvram>
  <boot dev='hd'/>
</os>

四、 创建虚拟机

1、通过virt-install来创建

  • 先把下载的镜像拷贝到指定位置,如/home/nobody/arm64/vm-instance/centos-aarch64-test1/,名字可以改成自己喜欢的。
  • 拷贝/usr/share/AAVMF/AAVMF_VARS.fd到指定位置,如/home/nobody/arm64/vm-instance/centos-aarch64-test1/。
  • 创建命令如下:
virt-install -n centos-aarch64-test1 --memory 2048 --arch aarch64 --vcpus 4 \
     --disk /home/nobody/arm64/vm-instance/centos-aarch64-test1/centos-aarch64-test1.qcow2,device=disk,bus=virtio \
     --os-type=generic \
     --video vga \
     --boot uefi \
     --graphics vnc,port=5901 \
     --noautoconsole \
     --noreboot \
     --network bridge=virbr0 \
     --import \
     --boot loader=/home/nobody/arm64/AAVMF/AAVMF_CODE.fd,loader_ro=yes,loader_type=pflash,nvram=/home/nobody/arm64/vm-instance/centos-aarch64-test1/AAVMF_VARS.fd

# 创建完后 virst list --all看处于shut off的状态
# 可以先virsh edit  centos-aarch64-test1修改vnc的listen address为0.0.0.0
# 启动
virsh start centos-aarch64-test1
# 或者
virsh --connect qemu:///system start centos-aarch64-test1
    • virt-install后,可以通过virsh edit centos-aarch64-test1修改vnc的listen address,然后reset domain,就可以用vnc连接了。

    • <graphics type='vnc' port='5901' autoport='no'>
        <listen type='address' address='0.0.0.0'/>
      </graphics>

       

  • 可以把上面virt-install创建的虚拟机dump一份xml配置文件出来:virsh dumpxml centos-aarch64-test1 > centos-aarch64-test2.xml,然后修改 centos-aarch64-test2.xml里面的name、uuid、nvram、镜像(disk/source)、vnc等字段,再通过下面的第2种方法创建虚拟机。

2、通过xml配置文件来创建虚拟机

可以用下面的xml配置直接创建一台虚拟机,假设配置文件名称为centos-aarch64-test1.xml,命令如下:

1)创建:virsh define centos-aarch64-test1.xml

2)启动:virsh start centos-aarch64-test1

3)从串口登录:virsh console centos-aarch64-test1

<domain type='qemu' id='9'>
  <name>centos-aarch64-test1</name>
  <uuid>fee6eaf5-4067-49a1-9526-d40a01b9be24</uuid>
  <memory unit='KiB'>2097152</memory>
  <currentMemory unit='KiB'>2097152</currentMemory>
  <vcpu placement='static'>4</vcpu>
  <os>
    <type arch='aarch64' machine='virt-4.2'>hvm</type>
    <loader readonly='yes' type='pflash'>/home/nobody/arm64/AAVMF/AAVMF_CODE.fd</loader>
    <nvram>/home/nobody/arm64/vm-instance/centos-aarch64-test1/centos-aarch64-test1-AAVMF_VARS.fd</nvram>
    <boot dev='hd'/>
  </os>
  <features>
    <acpi/>
    <gic version='2'/>
  </features>
  <cpu mode='custom' match='exact' check='none'>
    <model fallback='forbid'>cortex-a57</model>
  </cpu>
  <clock offset='utc'/>
  <on_poweroff>destroy</on_poweroff>
  <on_reboot>restart</on_reboot>
  <on_crash>destroy</on_crash>
  <devices>
    <emulator>/usr/local/bin/qemu-system-aarch64</emulator>
    <disk type='file' device='disk'>
      <driver name='qemu' type='qcow2'/>
      <source file='/home/nobody/arm64/vm-instance/centos-aarch64-test1/centos-aarch64-test1.qcow2'/>
      <backingStore/>
      <target dev='vda' bus='virtio'/>
      <alias name='virtio-disk0'/>
      <address type='pci' domain='0x0000' bus='0x04' slot='0x00' function='0x0'/>
    </disk>
    <controller type='usb' index='0' model='qemu-xhci' ports='8'>
      <alias name='usb'/>
      <address type='pci' domain='0x0000' bus='0x03' slot='0x00' function='0x0'/>
    </controller>
    <controller type='pci' index='0' model='pcie-root'>
      <alias name='pcie.0'/>
    </controller>
    <controller type='pci' index='1' model='pcie-root-port'>
      <model name='pcie-root-port'/>
      <target chassis='1' port='0x8'/>
      <alias name='pci.1'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x0' multifunction='on'/>
    </controller>
    <controller type='pci' index='2' model='pcie-root-port'>
      <model name='pcie-root-port'/>
      <target chassis='2' port='0x9'/>
      <alias name='pci.2'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/>
    </controller>
    <controller type='pci' index='3' model='pcie-root-port'>
      <model name='pcie-root-port'/>
      <target chassis='3' port='0xa'/>
      <alias name='pci.3'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/>
    </controller>
    <controller type='pci' index='4' model='pcie-root-port'>
      <model name='pcie-root-port'/>
      <target chassis='4' port='0xb'/>
      <alias name='pci.4'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x3'/>
    </controller>
    <controller type='pci' index='5' model='pcie-to-pci-bridge'>
      <model name='pcie-pci-bridge'/>
      <alias name='pci.5'/>
      <address type='pci' domain='0x0000' bus='0x01' slot='0x00' function='0x0'/>
    </controller>
    <controller type='pci' index='6' model='pcie-root-port'>
      <model name='pcie-root-port'/>
      <target chassis='6' port='0xc'/>
      <alias name='pci.6'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x4'/>
    </controller>
    <interface type='bridge'>
      <mac address='52:54:00:69:57:f7'/>
      <source bridge='virbr0'/>
      <target dev='tap2'/>
      <model type='virtio'/>
      <alias name='net0'/>
      <address type='pci' domain='0x0000' bus='0x02' slot='0x00' function='0x0'/>
    </interface>
    <serial type='pty'>
      <source path='/dev/pts/16'/>
      <target type='system-serial' port='0'>
        <model name='pl011'/>
      </target>
      <alias name='serial0'/>
    </serial>
    <console type='pty' tty='/dev/pts/16'>
      <source path='/dev/pts/16'/>
      <target type='serial' port='0'/>
      <alias name='serial0'/>
    </console>
    <input type='tablet' bus='usb'>
      <alias name='input0'/>
      <address type='usb' bus='0' port='1'/>
    </input>
    <input type='keyboard' bus='usb'>
      <alias name='input1'/>
      <address type='usb' bus='0' port='2'/>
    </input>
    <graphics type='vnc' port='5903' autoport='no' listen='0.0.0.0'>
      <listen type='address' address='0.0.0.0'/>
    </graphics>
    <video>
      <model type='vga' vram='16384' heads='1' primary='yes'/>
      <alias name='video0'/>
      <address type='pci' domain='0x0000' bus='0x05' slot='0x01' function='0x0'/>
    </video>
  </devices>
</domain>

五、相关命令

# 修改密码
# 方法1:
openssl passwd -1  your.great.password
# 关闭虚拟机后,用生成的字符串替换虚机中的/etc/shadow中第一个和第二个冒号之间的内容
virt-edit -d centos-aarch64-test1 /etc/shadow

# 方法2:修改镜像
virt-customize -a image_name.qcow2 --root-password password:your.great.password
############################

# --nvram会把domain中定义的nvram删除掉,如/usr/share/AAVMF/AAVMF_VARS.fd
# 因此AAVMF_VARS.fd应该每个domain独立放一个位置
virsh undefine centos-aarch64-test1 --nvram
0条评论
0 / 1000
rysf
5文章数
0粉丝数
rysf
5 文章 | 0 粉丝
原创

在x86_64服务器上创建arm64虚拟机

2023-05-19 02:01:13
115
0

一、安装qemu-system-aarch64

yum install -y ninja-build

# qemu-1.5.3不支持aarch64,需要编译更新的qemu版本
wget https://download.qemu.org/qemu-4.2.0.tar.bz2
tar -xvf qemu-4.2.0.tar.bz2

cd qemu-4.2.0
mkdir build
cd build

# 用gcc8
source /opt/rh/devtoolset-8/enable
../configure --target-list=aarch64-softmmu,aarch64-linux-user --enable-virtfs
make
make install

二、 下载镜像

wget http://cloud.centos.org/centos/7/images/CentOS-7-aarch64-GenericCloud-2111.qcow2

三、 下载AAVMF

AAVMF(Open Virtual Machine Firmware)用于在aarch64平台应用UEFI固件引导虚拟机。

yum install http://mirror.centos.org/altarch/7/os/aarch64/Packages/AAVMF-20180508-6.gitee3198e672e2.el7.noarch.rpm

需要在虚拟机的xml配置文件中做如下配置:

<os>
  <type arch='aarch64' machine='virt-4.2'>hvm</type>
  <loader readonly='yes' type='pflash'>/usr/share/AAVMF/AAVMF_CODE.fd</loader>
  <nvram>/usr/share/AAVMF/AAVMF_VARS.fd</nvram>
  <boot dev='hd'/>
</os>

四、 创建虚拟机

1、通过virt-install来创建

  • 先把下载的镜像拷贝到指定位置,如/home/nobody/arm64/vm-instance/centos-aarch64-test1/,名字可以改成自己喜欢的。
  • 拷贝/usr/share/AAVMF/AAVMF_VARS.fd到指定位置,如/home/nobody/arm64/vm-instance/centos-aarch64-test1/。
  • 创建命令如下:
virt-install -n centos-aarch64-test1 --memory 2048 --arch aarch64 --vcpus 4 \
     --disk /home/nobody/arm64/vm-instance/centos-aarch64-test1/centos-aarch64-test1.qcow2,device=disk,bus=virtio \
     --os-type=generic \
     --video vga \
     --boot uefi \
     --graphics vnc,port=5901 \
     --noautoconsole \
     --noreboot \
     --network bridge=virbr0 \
     --import \
     --boot loader=/home/nobody/arm64/AAVMF/AAVMF_CODE.fd,loader_ro=yes,loader_type=pflash,nvram=/home/nobody/arm64/vm-instance/centos-aarch64-test1/AAVMF_VARS.fd

# 创建完后 virst list --all看处于shut off的状态
# 可以先virsh edit  centos-aarch64-test1修改vnc的listen address为0.0.0.0
# 启动
virsh start centos-aarch64-test1
# 或者
virsh --connect qemu:///system start centos-aarch64-test1
    • virt-install后,可以通过virsh edit centos-aarch64-test1修改vnc的listen address,然后reset domain,就可以用vnc连接了。

    • <graphics type='vnc' port='5901' autoport='no'>
        <listen type='address' address='0.0.0.0'/>
      </graphics>

       

  • 可以把上面virt-install创建的虚拟机dump一份xml配置文件出来:virsh dumpxml centos-aarch64-test1 > centos-aarch64-test2.xml,然后修改 centos-aarch64-test2.xml里面的name、uuid、nvram、镜像(disk/source)、vnc等字段,再通过下面的第2种方法创建虚拟机。

2、通过xml配置文件来创建虚拟机

可以用下面的xml配置直接创建一台虚拟机,假设配置文件名称为centos-aarch64-test1.xml,命令如下:

1)创建:virsh define centos-aarch64-test1.xml

2)启动:virsh start centos-aarch64-test1

3)从串口登录:virsh console centos-aarch64-test1

<domain type='qemu' id='9'>
  <name>centos-aarch64-test1</name>
  <uuid>fee6eaf5-4067-49a1-9526-d40a01b9be24</uuid>
  <memory unit='KiB'>2097152</memory>
  <currentMemory unit='KiB'>2097152</currentMemory>
  <vcpu placement='static'>4</vcpu>
  <os>
    <type arch='aarch64' machine='virt-4.2'>hvm</type>
    <loader readonly='yes' type='pflash'>/home/nobody/arm64/AAVMF/AAVMF_CODE.fd</loader>
    <nvram>/home/nobody/arm64/vm-instance/centos-aarch64-test1/centos-aarch64-test1-AAVMF_VARS.fd</nvram>
    <boot dev='hd'/>
  </os>
  <features>
    <acpi/>
    <gic version='2'/>
  </features>
  <cpu mode='custom' match='exact' check='none'>
    <model fallback='forbid'>cortex-a57</model>
  </cpu>
  <clock offset='utc'/>
  <on_poweroff>destroy</on_poweroff>
  <on_reboot>restart</on_reboot>
  <on_crash>destroy</on_crash>
  <devices>
    <emulator>/usr/local/bin/qemu-system-aarch64</emulator>
    <disk type='file' device='disk'>
      <driver name='qemu' type='qcow2'/>
      <source file='/home/nobody/arm64/vm-instance/centos-aarch64-test1/centos-aarch64-test1.qcow2'/>
      <backingStore/>
      <target dev='vda' bus='virtio'/>
      <alias name='virtio-disk0'/>
      <address type='pci' domain='0x0000' bus='0x04' slot='0x00' function='0x0'/>
    </disk>
    <controller type='usb' index='0' model='qemu-xhci' ports='8'>
      <alias name='usb'/>
      <address type='pci' domain='0x0000' bus='0x03' slot='0x00' function='0x0'/>
    </controller>
    <controller type='pci' index='0' model='pcie-root'>
      <alias name='pcie.0'/>
    </controller>
    <controller type='pci' index='1' model='pcie-root-port'>
      <model name='pcie-root-port'/>
      <target chassis='1' port='0x8'/>
      <alias name='pci.1'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x0' multifunction='on'/>
    </controller>
    <controller type='pci' index='2' model='pcie-root-port'>
      <model name='pcie-root-port'/>
      <target chassis='2' port='0x9'/>
      <alias name='pci.2'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/>
    </controller>
    <controller type='pci' index='3' model='pcie-root-port'>
      <model name='pcie-root-port'/>
      <target chassis='3' port='0xa'/>
      <alias name='pci.3'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/>
    </controller>
    <controller type='pci' index='4' model='pcie-root-port'>
      <model name='pcie-root-port'/>
      <target chassis='4' port='0xb'/>
      <alias name='pci.4'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x3'/>
    </controller>
    <controller type='pci' index='5' model='pcie-to-pci-bridge'>
      <model name='pcie-pci-bridge'/>
      <alias name='pci.5'/>
      <address type='pci' domain='0x0000' bus='0x01' slot='0x00' function='0x0'/>
    </controller>
    <controller type='pci' index='6' model='pcie-root-port'>
      <model name='pcie-root-port'/>
      <target chassis='6' port='0xc'/>
      <alias name='pci.6'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x4'/>
    </controller>
    <interface type='bridge'>
      <mac address='52:54:00:69:57:f7'/>
      <source bridge='virbr0'/>
      <target dev='tap2'/>
      <model type='virtio'/>
      <alias name='net0'/>
      <address type='pci' domain='0x0000' bus='0x02' slot='0x00' function='0x0'/>
    </interface>
    <serial type='pty'>
      <source path='/dev/pts/16'/>
      <target type='system-serial' port='0'>
        <model name='pl011'/>
      </target>
      <alias name='serial0'/>
    </serial>
    <console type='pty' tty='/dev/pts/16'>
      <source path='/dev/pts/16'/>
      <target type='serial' port='0'/>
      <alias name='serial0'/>
    </console>
    <input type='tablet' bus='usb'>
      <alias name='input0'/>
      <address type='usb' bus='0' port='1'/>
    </input>
    <input type='keyboard' bus='usb'>
      <alias name='input1'/>
      <address type='usb' bus='0' port='2'/>
    </input>
    <graphics type='vnc' port='5903' autoport='no' listen='0.0.0.0'>
      <listen type='address' address='0.0.0.0'/>
    </graphics>
    <video>
      <model type='vga' vram='16384' heads='1' primary='yes'/>
      <alias name='video0'/>
      <address type='pci' domain='0x0000' bus='0x05' slot='0x01' function='0x0'/>
    </video>
  </devices>
</domain>

五、相关命令

# 修改密码
# 方法1:
openssl passwd -1  your.great.password
# 关闭虚拟机后,用生成的字符串替换虚机中的/etc/shadow中第一个和第二个冒号之间的内容
virt-edit -d centos-aarch64-test1 /etc/shadow

# 方法2:修改镜像
virt-customize -a image_name.qcow2 --root-password password:your.great.password
############################

# --nvram会把domain中定义的nvram删除掉,如/usr/share/AAVMF/AAVMF_VARS.fd
# 因此AAVMF_VARS.fd应该每个domain独立放一个位置
virsh undefine centos-aarch64-test1 --nvram
文章来自个人专栏
文章 | 订阅
0条评论
0 / 1000
请输入你的评论
0
0