Ubuntu最小GUI文件系统

目的

以前做小文件系统的时候,都是基于Busybox或者BuildRoot等工具,但是再做GPU虚拟化
过程中,由于图形软件堆栈依赖太多,很难把全部的包都包含到小文件系统中。这篇文章
介绍如何基于Ubuntu官方提供的base文件系统加入最小图形软件栈。

Ubuntu最小GUI文件系统的具体步骤:

我的系统是Ubuntu20.04的,为了方便共享host和guest,guest也选择Ubuntu20.04的base包。
有两种方式生成base包:

  • 可以直接从http://cdimage.ubuntu.com/ubuntu-base/releases/里面下载
  • 或者通过qemu-debootstrap下载,如果host和guest是同一种arch,效果和debootstrap一样

    sudo apt-get install debootstrap qemu-user-static schroot
    dd if=/dev/zero of=./rootfs.img bs=1M count=4000
    mke2fs -t ext4 ./rootfs.img
    mkdir ./test
    sudo mount -o loop ./rootfs.img ./test
    
    #option 1
    wget -c http://cdimage.ubuntu.com/ubuntu-base/releases/20.04/release/ubuntu-base-20.04.3-base-arm64.tar.gz
    sudo tar -xzvf ubuntu-base-20.04.3-base-arm64.tar.gz -C test/
    sudo cp -a /usr/bin/qemu-aarch64-static test/usr/bin/
    
    #option 2
    cd test
    sudo qemu-debootstrap --arch=arm64 --variant=minbase focal ./ http://mirrors.ustc.edu.cn/ubuntu-ports/
    
    sudo cp /etc/apt/sources.list ./etc/apt/sources.list
    cd ..
    
    sudo chroot test/
    
    #change root passwd
    passwd
    
    echo "nameserver xxxx" >> /etc/resolv.conf 
    apt update
    
    #install gui package
    apt install xorg -y
    apt install --no-install-recommends lightdm-gtk-greeter lightdm openbox mesa-utils vulkan-tools -y
    
    exit
    umount ./test
    

QEMU虚拟机启动脚本

为了方便和host共享,启用了9P共享文件系统,QEMU启动脚本:

qemu-system-aarch64 -machine virt,kernel_irqchip=on,gic-version=3 \
-cpu host -enable-kvm -smp 4 \
-m 8G \
-kernel ./Image \
-drive file=./rootfs.img,format=raw,if=none,id=hd0,readonly=off \
-device virtio-blk-device,drive=hd0 \
-netdev user,id=user0 \
-device virtio-net-pic,netdev=user0 \
-device virtio-gpu-pci,virgl=on -display egl-headless \
-vnc 0.0.0.0:53 \
-device usb-ehci -device usb-kbd -device usb-tablet -usb \
-fsdev local,security_model=passthrough,id=fsdev0,path=~/ \
-device virtio-9p-pci,id=fs0,fsdev=fsdev0,mount_tag=hostshare \
-append "root=/dev/vda rw" \
-serial stdio

进入到guest之后,

mkdir /tmp/host_files
mount -t 9p -o trans=virtio,version=9p2000.L hostshare /tmp/host_files

安装piglit测试OpenGL和Vulkan

在上面生成小系统过程中,

apt install piglit

进入到guest之后,测试OpenGL:

cd /usr/lib/aarch64-linux-gnu/piglit/tests/
piglit run quick ~/piglit-results/quick.out

测试Vulkan:

cd /usr/lib/aarch64-linux-gnu/piglit/tests/
piglit run vulkan ~/piglit-results/vulkan.out

参考:

How do you run Ubuntu Server with a GUI?
Building Ubuntu Root Filesystem
AM5728-移植ARM Ubuntu 20.04根文件系统
Introduction to qemu-debootstrap
为n1制作aarcm64/arm64 ubuntu rootfs系统
Example Sharing Host files with the Guest
QEMU

知道是不会有人点的,但万一有人呢:)