准备工具:
Visual Studio Code 和 MobaXterm,远程连接服务器。
linux-5.10.tar.gz,供编译内核使用。
使用 VS Code 远程连接服务器
- 下载 Remote - SSH 扩展
成功后,窗口左侧就会出现远程资源管理器。
- 修改 config 文件
点击远程资源管理器的小齿轮,弹出窗口点击 C:\Users\XXX.ssh\config 文件修改内容。
Host 填名称
HostName 填服务器IP
User 填登陆用户名
ForwardAgent yes
- 连接 Connect Host
下载并编译 FEMU
这一部分在 FEMU 的官方 GitHub 网址上面也有详细介绍,具体可查看: FEMU
- 安装依赖项
git clone https://github.com/ucare-uchicago/femu.git
cd femu
mkdir build-femu
# Switch to the FEMU building directory
cd build-femu
# Copy femu script
cp ../femu-scripts/femu-copy-scripts.sh .
./femu-copy-scripts.sh .
# only Debian/Ubuntu based distributions supported
sudo ./pkgdep.sh
- 编译并安装 FEMU
./femu-compile.sh
- 准备 FEMU 虚拟机镜像
cd ~
mkdir images
cd images
wget http://people.cs.uchicago.edu/~huaicheng/femu/femu-vm.tar.xz
tar xJvf femu-vm.tar.xz
这些步骤做完以后,在当前文件夹下面将会得到两个文件: "u20s.qcow2 " 和 "u20s.md5sum "
可以通过下面的语句验证 VM 镜像的完整性
md5sum u20s.qcow2 > tmp.md5sum
diff tmp.md5sum u20s.md5sum
如果 diff 显示两个文件不同,则表示 VM 镜像已损坏,需要重做上述步骤。
在与其他人共用服务器的时候,最好将自己使用的镜像改一个独有的名称,避免出现意外。改完名称运行 FEMU 时,记得同时修改 run-xxx.sh 脚本里面的镜像名称。
运行 FEMU
开启虚拟机:
./run-zns.sh
成功运行后的界面:
一般不在该界面直接使用 VM,所以保持该界面不动,另开一个窗口使用 ssh 登陆。
usernamexxx@hostnamexxx:~$ ssh -p 8080 femu@localhost
# femu 的密码:femu
编译 FEMU 虚拟机内核
- 将提前下载好的 linux-5.10 上传至主机
在 MobaXterm 中远程连接服务器,在 MobaXterm 里,直接拖拽至文件列表。
- 将 5.10 版本的内核压缩包从主机传到 FEMU 里
(主机)scp -P 8080 linux-5.10.tar.gz femu@localhost:~
(femu)sudo mv linux-5.10.tar.gz /usr/src/
- 解压缩
(femu)
cd /usr/src/
sudo tar -zxvpf linux-5.10.tar.gz
- 编译内核
(femu)
cd linux-5.10/
sudo apt-get install ncurses-dev
sudo apt-get install flex
sudo apt-get install bison -y
sudo make menuconfig
# 配置内核选项 File systems ---> 打开zonefs filesystem support
sudo apt-get install libssl-dev
sudo make -j8
sudo make modules_install
sudo make install
sudo poweroff
- 重启 femu,选择 Linux 5.10.0
重启后在主机运行一下命令,保障能够成功运行 ZNS 模式的 FEMU。
(主机)
cd femu/build-femu/
vim run-zns.sh
# 增大虚拟机内存至8G -m 8G \
./run-zns.sh
# 选择编译好的 Linux 5.10
ssh -p 8080 femu@localhost
# 新建窗口运行femu
在 FEMU 虚拟机中使用 nvme-cli 命令集测试 ZNS 模式的配置
- 查看可用命令
nvme zns help
- 区域附加命令的最大命令大小 zasl(Zone Append Size Limit)
nvme zns id-ctrl /dev/nvme0n1
NVMe ZNS Identify Controller:
zasl : 5
- 识别 ZNS 命名空间
nvme zns id-ns /dev/nvme0n1
ZNS Command Set Identify Namespace:
zoc : 0
ozcs : 0
mar : 0xffffffff
mor : 0xffffffff
rrl : 0
frl : 0
lbafe 0: zsze:0x40000 zdes:0 (in use)
lbafe 1: zsze:0x0 zdes:0
lbafe 2: zsze:0x0 zdes:0
lbafe 3: zsze:0x0 zdes:0
lbafe 4: zsze:0x0 zdes:0
显示更详细的信息 -H(human readable)
nvme zns id-ns /dev/nvme0n1 -H
ZNS Command Set Identify Namespace:
zoc : 0 Zone Operation Characteristics
[1:1] : 0 Zone Active Excursions: No
[0:0] : 0 Variable Zone Capacity: No
ozcs : 0 Optional Zoned Command Support
[0:0] : 0 Read Across Zone Boundaries: No
mar : No Active Resource Limit
mor : No Open Resource Limit
rrl : Not Reported
frl : Not Reported
LBA Format Extension 0 : Zone Size: 0x40000 LBAs - Zone Descriptor Extension Size: 0 bytes (in use)
LBA Format Extension 1 : Zone Size: 0x0 LBAs - Zone Descriptor Extension Size: 0 bytes
LBA Format Extension 2 : Zone Size: 0x0 LBAs - Zone Descriptor Extension Size: 0 bytes
LBA Format Extension 3 : Zone Size: 0x0 LBAs - Zone Descriptor Extension Size: 0 bytes
LBA Format Extension 4 : Zone Size: 0x0 LBAs - Zone Descriptor Extension Size: 0 bytes
- 往 zone 里追加信息
echo "hello world" | nvme zns zone-append /dev/nvme0n1 -z 512
Success appended data to LBA 0
- 从设备内读信息
nvme read /dev/nvme0n1 -z 512
read: Success
- 报告 zone 信息
nvme zns report-zones /dev/nvme0n1 -d 10
在 VSCode 里修改并调试 FEMU 内代码
远程连接 FEMU
# C:\Users\77919\.ssh\config
Host 填名称
HostName 主机IP
User 填用户名
ForwardAgent yes
Host localhost
HostName 主机IP
User femu
Port 8080
点击右上角的符号连接到 FEMU,然后使用资源管理器内的打开文件夹,就可以方便地修改 FEMU 虚拟机内的代码,比 vim 好用多啦!
本地调试远程代码
-
远程连接 FEMU 后,在 VSCode 里下载 C++ Runner 插件
-
在 FEMU 内下载 gdb
femu@fvm:/usr/bin$ sudo apt-get install gdb
-
点击 C++ Runner 插件的小齿轮 自动生成 launch.json
-
上述步骤完成,就可以在VS Code 内打开的远程代码上设置 breakpoints了
-
点击 Run - Start Debugging (F5)
-
终端运行程序