配置 QEMU 客户机环境

配置一个简单的 guest

因为从 Linux 5.15 开始,LightNVM 相关的代码就从内核主线移除了,因此我们需要一个不那么新的发行版来运行 guest,笔者选择了 Debian 11 Cloud Image (代号 Bullseye)

mkdir images && cd images

wget https://cloud.debian.org/images/cloud/bullseye/latest/debian-11-generic-amd64.qcow2

mv debian-11-generic-amd64.qcow2 debian11.img

接着,我们需要配置 cloudinit 镜像,这样 ubuntu 初次启动时会读取我们的 cloudinit 中的参数,配置镜像 地址等,具体使用方法可以参考:cloudinit 文档

sudo apt-get install cloud-image-utils

cat << EOF > cloud.yaml
#cloud-config
users:
  - name: xjtu
    gecos: XJTU
    sudo: ALL=(ALL) NOPASSWD:ALL
    groups: users, admin
    lock-passwd: false
    plain_text_passwd: 'xjtu'
apt:
  primary:
    - arches: [default]
    - uri: http://mirrors.bfsu.edu.cn/debian
EOF

cloud-localds cloud.img cloud.yaml

最后,我们扩容 cloudimage 到 8GB,这样进入 guest 后我们还有安装一些应用程序的空间。

qemu-img resize debian11.img 8G

首次运行 guest

输入以下命令运行 guest:

qemu-system-x86_64 -m 1024 \
-drive file=images/debian11.img,format=qcow2 \
-drive file=images/cloud.img,format=raw

初始化后,默认用户名密码为 xjtu / xjtu

在 guest 中启用 网络

qemu-system-x86_64 -m 1024 \
-drive file=images/debian11.img,format=qcow2 \
-drive file=images/cloud.img,format=raw \
-netdev user,id=mynet0 \
-device virtio-net-pci,netdev=mynet0

此时启动的 Linux 客户机可以正常上网

创建一个 ocssd 的镜像

qemu-img create -f ocssd -o num_grp=4,num_pu=1,num_chk=4096,num_sec=32 ocssd.img

参数如下:

  1. 整个 SSD 有 4 个 group

  2. 每个 group,挂 1 个 PU

  3. 每个 PU 下,有 4096 个 chunk

  4. 每个 chunk 下,有 32 个 sector

  5. 每个 sector 默认为 4KiB

在 guest 中添加 ocssd

qemu-system-x86_64 -m 1024 \
-drive file=images/debian11.img,format=qcow2 \
-netdev user,id=mynet0 \
-device virtio-net-pci,netdev=mynet0 \
-blockdev ocssd,node-name=nvme01,file.driver=file,file.filename=images/ocssd.img \
-device nvme,drive=nvme01,serial=deadbeef,id=lnvm

此时发现 ocssd 还不能被 cloud image 的内核完全识别,只在 lspci 中可以检测到有关设备,这是因为内核是精简版,因此我们需要替换刚刚 build 出来的内核

使用 bzImage 启动 guest

为了避免每次都要重新进到 guest 里安装 deb 版本的内核,我们可以使用 linux 提供的 bzImage 来简化启动流程:

qemu-system-x86_64 -m 1024 \
-drive file=images/debian11.img,format=qcow2 \
--append "root=/dev/sda1" \
-kernel "linux/arch/x86/boot/bzImage" \
-netdev user,id=mynet0 \
-device virtio-net-pci,netdev=mynet0 \
-blockdev ocssd,node-name=nvme01,file.driver=file,file.filename=images/ocssd.img \
-device nvme,drive=nvme01,serial=deadbeef,id=lnvm

这样的话就不需要每次手动安装内核到镜像中了,通过 qemu 直接指定内核镜像来启动。

启动 geust 之后,使用 sudo apt install nvme-cli ,接着 sudo nvme lnvm list

初次运行截图

在 guest 中创建 pblk 磁盘

sudo nvme lnvm create -d nvme0n1 -n mypblk -t pblk -b 0 -e 3 -o 30

# 卸载设备
sudo nvme lnvm remove -n mypblk

使用 fio 运行性能测试

安装:

sudo apt install fio
# 随机读性能
fio -name=Rand_Read_IOPS_Test -group_reporting -direct=1 -iodepth=16 \
-rw=randread -ioengine=libaio -refill_buffers -norandommap -randrepeat=0 \
-bs=4k -size=1G -numjobs=1 -runtime=30 -filename=/dev/mypblk

# 随机写性能
fio -name=Rand_Write_IOPS_Test -group_reporting -direct=1 -iodepth=16 \
-rw=randwrite -ioengine=libaio -refill_buffers -norandommap -randrepeat=0 \
-bs=4k -size=1G -numjobs=1 -runtime=30 -filename=/dev/mypblk