在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即可获取所需信息。
利用该信息将所需分区挂载至/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等)。
镜像成功启动后,终端将显示登录界面。
默认情况下,根文件系统分区大小限制为2GB。可通过以下命令扩展分区容量:
[root@host ~]# /usr/bin/rootfs-expand