实验一、基本环境安装
GitHub链接
相关文件
安装QEMU
安装依赖
Required additional packages
sudo apt install git libglib2.0-dev libfdt-dev libpixman-1-dev zlib1g-dev ninja-build
Recommended additional packages
sudo apt install git-email
sudo apt install libaio-dev libbluetooth-dev libcapstone-dev libbrlapi-dev libbz2-dev
sudo apt install libcap-ng-dev libcurl4-gnutls-dev libgtk-3-dev
sudo apt install libibverbs-dev libjpeg8-dev libncurses5-dev libnuma-dev
sudo apt install librbd-dev librdmacm-dev
sudo apt install libsasl2-dev libsdl2-dev libseccomp-dev libsnappy-dev libssh-dev
sudo apt install libvde-dev libvdeplug-dev libvte-2.91-dev libxen-dev liblzo2-dev
sudo apt install valgrind xfslibs-dev
sudo apt install libnfs-dev libiscsi-dev
编译安装QEMU
wget https://download.qemu.org/qemu-7.1.0.tar.xz
tar xvJf qemu-7.1.0.tar.xz
cd qemu-7.1.0
./configure
make
sudo make install
检验
qemu-system-x86_64 --version
安装Ubuntu
创建虚拟盘
- -f qcow2:磁盘格式为qcow2
- ubuntu.qcow2:磁盘名
- 30G:磁盘大小
qemu-img create -f qcow2 ubuntu.qcow2 30G
创建的虚拟磁盘文件默认在当前目录下,可以使用
ls
查看查看磁盘信息
qemu-img info ubuntu.qcow2
设置并启动虚拟机
- --enable-kvm:使用KVM虚拟化
- -m 8G:8G虚拟内存
- -smp 2:模拟的SMP架构中CPU的个数为2
- -boot order=dc:引导顺序为 d(第一个光驱)->c(第一块硬盘)
- -hda /path/to/file:指定虚拟盘文件路径为/path/to/file
- -cdrom /path/to/iso:指定CD-ROM镜像文件的路径为/path/to/iso
qemu-system-x86_64 --enable-kvm -m 8G -smp 2 -boot order=dc -hda ./env/ubuntu.qcow2 -cdrom ./env-resource/ubuntu-22.04.1-live-server-amd64.iso
选择Try or Install Ubuntu Server
语言选择English
不更新版本
键盘保持默认
选择完整安装
网络部分选择DHCP自动获取,之后会通过端口映射方式暴露虚拟机端口
QEMU网络相关参数
QEMU命令使用“-net user”参数配置用户模式网络,命令格式如下:
qemu-kvm -net nic -net user [, opion[, option[, ... ] ] ] myVM.img
用户模式的参数选项描述如下:
- vlan=vlan编号,将用户模式网络栈连接到编号为n的VLAN中(默认值为0)。
- name=名称,分配一个网络名称,可以用来在QEMU monitor中识别该网络。
- net=地址[/掩码],设置客户机所在子网,缺省值是10.0.2.0/24。
- host=地址,设置客户机看到的宿主机IP地址,缺省值为客户机所在网络的第2个IP地址10.0.2.2。
- restrict=开关,如果将此选项打开(y或yes),则客户机不能与宿主机通信,也不能通过宿主机路由到外部网络。缺省设置为n或no。
- hostname=名称,设置在宿主机DHCP服务器中保存的客户机主机名。
- dhcpstart=地址,设置能够分配给客户机的第一个IP,QEMU内嵌的DHCP服务器有16个IP地址可供分配,缺省地址范围是10.0.2.15-10.0.2.30。
- dns=地址,指定虚拟DNS的地址,其缺省值是网络中的第3个IP地址10.0.2.3,不能与“host= ”中指定的相同。
- hostfwd=[tcpludp] [宿主机地址]:宿主机端口- [客户机地址]:客户机端口,将访问宿主机指定端口的TCP/UDP连接重定向到客户机端口上。该选项可以在一个命令行中可以多次重复使用。
不使用代理,此处留空即可
镜像源保持默认即可,也可以换成阿里、清华等其他源
没必要使用LVM逻辑卷,这里直接取消勾选
确认分区没问题就下一步
设置主机名、用户名和密码
勾选SSH
其他的软件包用不着,直接下一步
等待安装完成后,点击左上角Machine选择Quit即可
再创建一块虚拟盘用于模拟NVMe ZNS SSD
qemu-img create -f qcow2 znsssd.qcow2 10G
此时目录下应该有两个虚拟磁盘文件,一个是前文安装Ubuntu Server的系统盘,一个是用于模拟ZNS的虚拟盘
再次启动虚拟机并挂载两块硬盘
- -name:虚拟机名称
- -m:虚拟内存
- --enable-kvm:使用KVM虚拟化
- -cpu host:CPU虚拟化模型
- x86 base:base CPU model type with no features enabled
- x86 host :processor with all supported host features
- x86 max:Enables all features supported by the accelerator in the current host
- -smp 4:虚拟CPU个数
- -hda:系统盘路径
- -net user, -net nic:网络设置
- -drive:驱动
- file:硬件映像文件路径
- id:名称
- format:格式
- if:接口类型,即控制器类型,如ide、scsi、sd、mtd、floppy、pflash及virtio等
- -device nvme:添加NVMe设备(仅支持一个单独的namespace id为1的namespace)
- serial:序列号
- id:设备ID
- -device nvme-ns:为支持多个namespaces和额外特性,必须使用"nvme-ns"设备。 由"nvme-ns"设备定义的namespaces将连结到由"nvme"设备创建的"nvme-bus"。Namespace id自动分配,从1开始。
- id:设备ID
- drive:Node name or ID of a block device to use as a backend
- nsid:namespace id
- logical_block_size:逻辑块大小,512 B ~ 2 MiB (一般由1个或者多个物理块组合成一个逻辑块)
- physical_block_size:物理块大小,512 B ~ 2 MiB
- zoned:Zoned Namespace
- zone_size:zone大小
- zone_capacity:zone容量。若设置为0,zone容量等于zone大小
- max_open:最大打开的资源数目,为0允许所有zone都打开
- max_active:最大有效的资源数目,为0允许所有zone都有效
- bus:将namespace关联到特定的nvme设备
qemu-system-x86_64 -name cs-exp-zns -m 8G --enable-kvm -cpu host -smp 4 \
-hda ./env/ubuntu.qcow2 \
-net user,hostfwd=tcp:127.0.0.1:7777-:22,hostfwd=tcp:127.0.0.1:2222-:2000 -net nic \
-drive file=./env/znsssd.qcow2,id=mynvme,format=qcow2,if=none \
-device nvme,serial=baz,id=nvme2 \
-device nvme-ns,id=ns2,drive=mynvme,nsid=2,logical_block_size=4096,physical_block_size=4096,zoned=true,zoned.zone_size=131072,zoned.zone_capacity=131072,zoned.max_open=0,zoned.max_active=0,bus=nvme2
查看NVMe设备
启动虚拟机后登陆,在dev下查看nvme设备是否存在
ls /dev/ | grep nv
用nvme cli命令查看zns ssd设备信息
sudo apt update
sudo apt full-upgrade
reboot
sudo apt install nvme-cli
sudo nvme zns id-ns /dev/nvme0n1 -H
额外工作
目录共享
添加共享目录优点
- 便于保存LOG文件至宿主机
- 可以在宿主机直接编写代码
- 便于文件传输
- ...
在启动参数中添加共享配置
- path:主机目录路径
- mount_tag:mount标签,后续在虚拟机里挂载会用到
-fsdev local,id=fsdev0,path=./work/,security_model=none \
-device virtio-9p-pci,id=fs0,fsdev=fsdev0,mount_tag=hostshare
启动虚拟机后挂载共享目录
cd ~
mkdir work
sudo mount hostshare -t 9p ./work
这样当前目录下的更改就会实时同步到虚拟机和宿主机中了
此外,还可以设置开机自动挂载来避免每次打开虚拟机都需要手动挂载文件夹
echo "hostshare /home/miracle/work 9p trans=virtio,version=9p2000.L,rw, 0 0" | sudo tee -a /etc/fstab
使用sudo mount -a
挂载并检查
将virtio写入initramfs,否则由于fstab挂载时virtio模块没有被加载导致挂载失败,最终无法正常启动(会进入恢复模式)
echo """
9p
9pnet
9pnet_virtio
""" | sudo tee -a /etc/initramfs-tools/modules
更新initramfs
sudo update-initramfs -u
无界面启动,重定向输出到当前终端
先正常启动后修改GRUB参数sudo vim /etc/default/grub
在GRUB_CMDLINE_LINUX=""
中添加console=ttyS0
更新GRUB:sudo update-grub
在QEMU启动参数中添加-nographic
在当前QEMU虚拟机中Quit后用加入-nographic
参数的启动命令重新运行虚拟机即可
以
-nographic
启动的虚拟机退出时直接关机 sudo shutdown now
即可。也可以强制退出:键盘按 CTRL
+ A
然后按 x
效果图
保存启动配置
vim start.sh
#! /bin/bash
cd /home/miracle/Documents/CS_Exp_ZNS
qemu-system-x86_64 --enable-kvm \
-nographic \
-name cs-exp-zns \
-m 8G \
-cpu host -smp 4 \
-hda ./env/ubuntu.qcow2 \
-net user,hostfwd=tcp:127.0.0.1:7777-:22,hostfwd=tcp:127.0.0.1:2222-:2000 -net nic \
-drive file=./env/znsssd.qcow2,id=mynvme,format=qcow2,if=none \
-device nvme,serial=baz,id=nvme2 \
-device nvme-ns,id=ns2,drive=mynvme,nsid=2,logical_block_size=4096,physical_block_size=4096,zoned=true,zoned.zone_size=131072,zoned.zone_capacity=131072,zoned.max_open=0,zoned.max_active=0,bus=nvme2 \
-fsdev local,id=fsdev0,path=./work/,security_model=none \
-device virtio-9p-pci,id=fs0,fsdev=fsdev0,mount_tag=hostshare
chmod +x ./start.sh
之后使用./start.sh
就可以快速启动虚拟机了