配置 QEMU 客户机环境 ========================= 配置一个简单的 guest ------------------------- 因为从 Linux 5.15 开始,LightNVM 相关的代码就从内核主线移除了,因此我们需要一个不那么新的发行版来运行 guest,笔者选择了 Debian 11 Cloud Image (代号 Bullseye) .. highlight:: bash :: 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 文档`_ .. _cloudinit 文档: https://cloudinit.readthedocs.io/en/latest/topics/examples.html :: 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 之后,使用 :command:`sudo apt install nvme-cli` ,接着 :command:`sudo nvme lnvm list`: .. image:: /_static/3-firstrun/qemu-pblk.png :align: center :alt: 初次运行截图 在 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