配置 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
参数如下:
整个 SSD 有 4 个 group
每个 group,挂 1 个 PU
每个 PU 下,有 4096 个 chunk
每个 chunk 下,有 32 个 sector
每个 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