在Ubuntu 18.04桌面版上搭建CentOS armhfp虚拟机

不久前,我因项目需求有机会在Ubuntu 18.04桌面版上搭建CentOS armhfp虚拟机。虽然本可以采用其他测试方式(例如将ARM镜像烧录至SD卡并在开发板上启动),但我更倾向于使用QEMU进行工作。原因在于,像Cubietruck或树莓派这类开发板的测试过程非常耗时。若镜像意外损坏,我们将不得不重复执行整套流程:取出SD卡、重新烧录正确的操作系统镜像、启动/测试软件包/更新、修改U-boot设置等。

QEMU是一款开源的机器模拟器或虚拟化工具,能够运行任何架构的操作系统。在Ubuntu或CentOS这类基础操作系统中搭建QEMU环境相当简便。

环境准备

在Ubuntu 18.04系统中安装QEMU及相关支持软件包以启用QEMU功能。

sudo apt-get update

sudo apt-get install -y qemu-kvm qemu virt-manager virt-viewer libvirt-bin

您也可以从官方网站下载QEMU。下载并编译QEMU 5.0.0版本:

wget https://download.qemu.org/qemu-5.0.0.tar.xz
tar xvJf qemu-5.0.0.tar.xz
cd qemu-5.0.0
./configure
make

通过git下载并编译QEMU:

git clone https://git.qemu.org/git/qemu.git
cd qemu
git submodule init
git submodule update --recursive
./configure
make

在系统中配置桥接网络。桥接网络是专用于虚拟机的网络适配器,可使客户机连接外部网络,此配置需在使用QEMU创建虚拟机前完成设置。

sudo apt-get install -y bridge-utils resolvconf

编辑网络接口文件以创建桥接网卡br1,您也可以为桥接网卡分配静态IP。

sudo nano /etc/network/interfaces
# interfaces(5) file used by ifup(8) and ifdown(8)

auto lo

iface lo inet loopback

#桥接名称 #
auto br1

# 桥接信息 #
iface br1 inet static
bridge_ports ens33
bridge_stp off
bridge_fd 9
# 桥接IP #
address 192.168.1.10
netmask 255.255.255.0
network 192.168.1.0
broadcast 192.168.1.255
gateway 192.168.1.1
dns-nameservers 192.168.1.1
dns-nameservers 8.8.8.8

下载CentOS ARM镜像

下载或导入ARM镜像。这里我们使用CentOS ARM镜像,您可以从CentOS官网下载,或通过wget/curl从CentOS FTP服务器获取。也可直接通过下方链接下载镜像。

或通过命令行使用wget下载镜像:

wget http://centos.zero.com.ar/centos-altarch/7.8.2003/isos/armhfp/CentOS-Userland-7-armv7hl-generic-Minimal-2003-sda.raw.xz

运行QEMU

QEMU需要内核和initramfs文件来启动镜像。您可以通过kpartx和mount命令挂载镜像来提取这些文件。

使用kpartx:
sudo kpartx -av (镜像路径)

执行上述命令将在系统中创建循环设备。您可以使用mount命令将特定循环设备挂载至/mnt目录,并从镜像中复制所需文件。

sudo mount /dev/mapper/loop21p2 /mnt/

完成操作后,需要卸载挂载点并删除循环设备。

sudo umount /mnt/
sudo kpart -dv (镜像路径)
使用mount命令:

通过parted命令获取镜像中分区的起始与结束扇区。

sudo parted (镜像路径)

执行上述命令将启动parted工具。输入Unit并按回车,选择选项b。完成后输入print即可获取所需信息。

![Image](/s/image/setup-a-centos-armhfp-vm-on-ubuntu-18-04-desktop/setup-a-centos-armhfp-vm-on-ubuntu-18-04-desktop-1.webp)

利用该信息将所需分区挂载至/mnt目录。此处我将第一个分区挂载至/mnt:

sudo mount -o loop,offset=4194304 (镜像路径) /mnt/

完成从镜像中提取所需文件后,即可使用QEMU命令运行虚拟机环境。

qemu-system-arm \
-M cubieboard -m 2048 -cpu arm1176 -dtb sun4i-a10-cubieboard.dtb \
-kernel vmlinuz-4.19.113-300.el7.armv7hl \
-append "ro root=UUID=64e0ba9f-b645-4ce1-925d-e1a723a580fd rhgb quiet LANG=en_US.UTF-8" \
-initrd initramfs-4.19.113-300.el7.armv7hl.img -nographic \
-drive file=(镜像文件路径),format=raw,if=none,id=d1 \
-device ide-hd,drive=d1 -net user,hostfwd=tcp::10022-:22 -net nic

此处我为虚拟机分配了2GB内存,并提供了启动镜像所需的其他信息(如内核、initrd等)。

镜像成功启动后,终端将显示登录界面。

![Image](/s/image/setup-a-centos-armhfp-vm-on-ubuntu-18-04-desktop/setup-a-centos-armhfp-vm-on-ubuntu-18-04-desktop-2.webp)

默认情况下,根文件系统分区大小限制为2GB。可通过以下命令扩展分区容量:

[root@host ~]# /usr/bin/rootfs-expand