使用QUME搭建ZNS SSD

2023-10-15 12:52
文章标签 使用 搭建 ssd zns qume

本文主要是介绍使用QUME搭建ZNS SSD,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

安装QUME

QEMU从 1.6 版开始支持模拟 NVMe 命名空间。但是仅从QEMU 6.0 版本开始支持模拟分区命名空间。
下载QUME:https://www.qemu.org/download/#source

镜像下载

The user account and guest OS of the VM:

  • username: femu
  • passwd : femu
  • Guest OS: Ubuntu 20.04.1 server, with kernel 5.4
mkdir -p ~/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 镜像已损坏,需要重做上述步骤。

建立host与guest之间的共享目录

qemu 启动参数需要添加 :

-fsdev local,security_model=passthrough,id=fsdev0,path=/tmp/share \
-device virtio-9p-pci,id=fs0,fsdev=fsdev0,mount_tag=hostshare

其中 path 为 host 本地的共享目录
在 guest 中挂载 host 共享的目录

mkdir /tmp/host_files
sudo mount -t 9p -o trans=virtio,version=9p2000.L hostshare /tmp/host_files

参考https://blog.csdn.net/gatieme/article/details/82912921

切换linux5.10内核

1.将提前下载好的 linux-5.10 上传至主机
2.通过share将5.10版本的内核压缩包从主机传到 QUME里
3.解压缩

cd /usr/src/
sudo tar -zxvpf linux-5.10.tar.gz

4.编译内核(可以在host侧编译)

cd linux-5.10/ 
sudo apt-get install ncurses-dev
sudo apt-get install flex
sudo apt-get install bison -y

配置内核选项

sudo make menuconfig

具体参考https://zonedstorage.io/docs/linux/config

sudo apt-get install libssl-dev
sudo make -j32

5.安装

sudo make modules_install
sudo make install
sudo poweroff

创建模拟分区命名空间

要创建模拟的分区命名空间,您必须首先拥有该命名空间可以使用的后备存储文件。文件的大小决定了从运行在QEMU虚拟机中的guest OS看到的命名空间的容量。
例如:创建32GiB分区的命名空间,必须先在主机上创建32GiB文件。这可以通过使用truncate命令创建一个稀疏文件,或者使用dd命令创建一个完全分配的文件来实现。
使用truncate创建仿真区域命名空间Backstore

# truncate -s 32G /var/lib/qemu/images/zns.raw# ls -l /var/lib/qemu/images/zns.raw
-rw-r--r-- 1 root root 34359738368 Jun 21 15:13 /var/lib/qemu/images/zns.raw

使用dd创建仿真区域命名空间Backstore

# dd if=/dev/zero of=/var/lib/qemu/images/zns.raw bs=1M count=32768
32768+0 records in
32768+0 records out
34359738368 bytes (34 GB, 32 GiB) copied, 11.4072 s, 3.0 GB/s# ls -l /var/lib/qemu/images/zns.raw
-rw-r--r-- 1 root root 34359738368 Jun 22 11:22 /var/lib/qemu/images/zns.raw

创建ZNS并使用Backstore文件

使用命令行选项和参数执行QEMU,以创建一个分区的名称空间,该名称空间使用后台存储文件作为存储。
QEMU中NVMe设备仿真和ZNS命名空间仿真的实现提供了几个配置选项来控制设备的特征。与“分区名称空间”相关的选项和参数如下。

OptionDefault ValueDescription
zoned.zasl=UINT320Zone Append Size Limit. If left at the default (0), the zone append size limit will be equal to the maximum data transfer size (MDTS). Otherwise, the zone append size limit is equal to 2 to the power of zasl multiplied by the minimum memory page size (4096 B), but cannot exceed the maximum data transfer size.
zoned.zone_size=SIZE128MiBDefine the zone size (ZSZE)
zoned.zone_capacity=SIZE0Define the zone capacity (ZCAP). If left at the default (0), the zone capacity will equal the zone size.
zoned.descr_ext_size=UINT320Set the Zone Descriptor Extension Size (ZDES). Must be a multiple of 64 bytes.
zoned.cross_read=BOOLoffSet to “on” to allow reads to cross zone boundaries.
zoned.max_active=UINT320Set the maximum number of active resources (MAR). The default (0) allows all zones to be active.
zoned.max_open=UINT320Set the maximum number of open resources (MOR). The default (0) allows all zones to be open. If zoned.max_active is specified, this value must be less than or equal to that

在下面的例子中,backstore文件被用来模拟一个分区的命名空间,分区的大小为64个MiB,分区的容量为62个MiB。命名空间块大小为4096b。命名空间最多允许16个开放的zone和32个活跃的zone。

#!/bin/bash
# Huaicheng Li <huaicheng@cs.uchicago.edu>
# Run FEMU as a black-box SSD (FTL managed by the device)# image directory
IMGDIR=/home/qwj/ZNS/images
# Virtual machine disk image
OSIMGF=$IMGDIR/u20s.qcow2
ZNSIMGF=$IMGDIR/zns.raw
if [[ ! -e "$OSIMGF" ]]; thenecho ""echo "VM disk image couldn't be found ..."echo "Please prepare a usable VM image and place it as $OSIMGF"echo "Once VM disk image is ready, please rerun this script again"echo ""exit
fisudo /home/qwj/ZNS/qemu-7.0.0/bin/debug/native/x86_64-softmmu/qemu-system-x86_64 \-name "FEMU-BBSSD-VM" \-enable-kvm \-cpu host \-smp 4 \-m 32G \-fsdev local,security_model=passthrough,id=fsdev0,path=/home/qwj/ZNS/share \-device virtio-9p-pci,id=fs0,fsdev=fsdev0,mount_tag=hostshare \-device virtio-scsi-pci,id=scsi0 \-device scsi-hd,drive=hd0 \-drive file=$OSIMGF,if=none,aio=native,cache=none,format=qcow2,id=hd0 \-device nvme,id=nvme0,serial=deadbeef,zoned.zasl=5 \-drive file=$ZNSIMGF,id=nvmezns0,format=raw,if=none \-device nvme-ns,drive=nvmezns0,bus=nvme0,nsid=1,logical_block_size=4096,physical_block_size=4096,zoned=true,zoned.zone_size=64M,zoned.zone_capacity=62M,zoned.max_open=16,zoned.max_active=32,uuid=5e40ec5f-eeb6-4317-bc5e-c919796a5f79 \-net user,hostfwd=tcp::8081-:22 \-net nic,model=virtio \-nographic \-qmp unix:./qmp-sock,server,nowait 2>&1 | tee log

一般不在该界面直接使用 VM,所以保持该界面不动,另开一个窗口使用 ssh 登陆

usernamexxx@hostnamexxx:~$ ssh -p8081 femu@localhost
# femu 的密码:femu

验证模拟分区命名空间

# sudo nvme list
Node             SN                   Model                                    Namespace Usage                      Format           FW Rev
---------------- -------------------- ---------------------------------------- --------- -------------------------- ---------------- --------
/dev/nvme0n1     deadbeef             QEMU NVMe Ctrl                           1          34.36  GB /  34.36  GB      4 KiB +  0 B   1.

ZNS SSD搭建之rocksdb和zenfs

https://github.com/westerndigitalcorporation/zenfs
1.Download, build and install libzbd. See the libzbd READMEfor instructions.
2.Download rocksdb and the zenfs projects:

$ git clone https://github.com/facebook/rocksdb.git
$ cd rocksdb
$ git clone https://github.com/westerndigitalcorporation/zenfs plugin/zenfs

3.Build and install rocksdb with zenfs enabled:
安装前先安装sudo apt-get install libgflags-dev
https://github.com/westerndigitalcorporation/zenfs/issues/3
https://www.jianshu.com/p/4a79b95bca9a
https://blog.csdn.net/qq_41108558/article/details/118513202
启用调试log:ROCKSDB_PLUGINS=zenfs make -j4 db_bench dbg
https://github.com/westerndigitalcorporation/zenfs/issues/240
I mastered the latest version, I found that, > 1. users can change the destination for logs in #define DEFAULT_ZENV_LOG_PATH "/tmp/ > 2

$ DEBUG_LEVEL=0 ROCKSDB_PLUGINS=zenfs make -j4 db_bench install

4.Build the zenfs utility:

$ pushd
$ cd plugin/zenfs/util
$ make
$ popd

5.Configure the IO Scheduler for the zoned block device
The IO scheduler must be set to deadline to avoid writes from being reordered. This must be done every time the zoned name space is enumerated (e.g at boot).

echo deadline > /sys/class/block/<zoned block device>/queue/scheduler

6.Creating a ZenFS file system

cd ./rocksdb/plugin/zenfs/
mkdir log
sudo ./util/zenfs mkfs --zbd=nvme0n1 --aux-path=./log --force

7.Testing with db_bench
To instruct db_bench to use zenfs on a specific zoned block device, the --fs_uri parameter is used. The device name may be used by specifying --fs_uri=zenfs://dev: or by specifying a unique identifier for the created file system by specifying --fs_uri=zenfs://uuid:. UUIDs can be listed using ./plugin/zenfs/util/zenfs ls-uuid

sudo ./db_bench --fs_uri=zenfs://dev:nvme0n1 --benchmarks=fillrandom --use_direct_io_for_flush_and_compaction

ZNS SSD搭建之挂载F2FS(双硬盘)

1.创建传统SSD

由于f2fs 使用具有固定块位置的磁盘元数据块格式,因此仅支持包含常规区域的分区块设备。完全由顺序区域组成的分区设备不能与f2fs 一起用作独立设备,并且它们需要多设备设置才能将元数据块放置在随机可写存储上。f2fs支持多设备设置,其中多个块设备地址空间线性连接以形成逻辑上更大的块设备。
使用以下原理实现了F2FS 分区块设备支持:
1 Section Alignment 在f2fs中,section是一组固定大小的segment(2mb)。通过指定一个section中的segment数,来匹配分区设备zone大小。例如:zone大小为256mb,一个section包含128个2MB的段。
2 Forced LFS mode 默认情况下,f2fs通过允许段内的一些随机写操作来优化块分配(以避免过多的追加写操作)。LFS模式强制对段进行顺序写操作,并强制在段内顺序使用段,这导致完全符合分区的块设备的写约束。
3 Zone reset as discard operation 在过去,块discard(或trim)向设备表明一个块或一组块不再使用。当一个section的所有段的所有块都空闲时,就会执行“zone write pointer reset”命令。这允许重用该section。
与使用dm分区的设备映射器目标的解决方案相比,分区设备上的f2fs的性能不会受到“区域回收开销”的影响,因为写操作总是顺序的,并且不需要磁盘上的临时缓冲区。F2fs垃圾收集(段清理)只对频繁删除文件或修改文件数据的工作负载产生开销。
Zone Capacity Support
NVMe ZNS ssd的每个zone容量可以小于zone的大小。为了支持ZNS设备,f2fs确保块分配和计费只考虑一个区域内在该区域容量内的块。这种对NVMe ZNS区域容量的支持自从在Linux内核版本5.10中引入以来就一直可用。
F2fs卷需要一些随机可写的存储空间,以便存储和更新卷的元数据块。由于NVMe分区的名称空间没有conventional zones,所以不能在单个NVMe分区的名称空间中自包含f2fs卷。要使用NVMe分区的命名空间格式化f2fs卷,必须使用多设备卷格式,以便提供额外的常规块设备来存储卷元数据块。这个额外的常规块设备可以是同一个NVMe设备上的常规名称空间,也可以是另一个NVMe设备上的常规名称空间。
f2fs使用32位的块号,块大小为4 KB。这导致卷的最大大小为16 TB。任何设备或设备组合(对于多设备卷)总容量大于16tb的设备不能与f2fs一起使用。
为了克服这个限制,可以使用dm-linear设备映射器目标将分区的块设备划分为可用的、更小的逻辑设备。此配置必须确保为创建的每个逻辑设备分配足够数量的常规区域来存储f2fs固定位置元数据块。
在QUME的运行命令中加入传统NVMe SSD:


#!/bin/bash
# Huaicheng Li <huaicheng@cs.uchicago.edu>
# Run FEMU as a black-box SSD (FTL managed by the device)# image directory
IMGDIR=/home/qwj/ZNS/images
# Virtual machine disk image
OSIMGF=$IMGDIR/u20s.qcow2
ZNSIMGF=$IMGDIR/zns.raw
CONVIMGF=$IMGDIR/convSSD.raw
if [[ ! -e "$OSIMGF" ]]; thenecho ""echo "VM disk image couldn't be found ..."echo "Please prepare a usable VM image and place it as $OSIMGF"echo "Once VM disk image is ready, please rerun this script again"echo ""exit
fisudo /home/qwj/ZNS/qemu-7.0.0/bin/debug/native/x86_64-softmmu/qemu-system-x86_64 \-name "FEMU-BBSSD-VM" \-enable-kvm \-cpu host \-smp 4 \-m 32G \-fsdev local,security_model=passthrough,id=fsdev0,path=/home/qwj/ZNS/share \-device virtio-9p-pci,id=fs0,fsdev=fsdev0,mount_tag=hostshare \-device virtio-scsi-pci,id=scsi0 \-device scsi-hd,drive=hd0 \-drive file=$OSIMGF,if=none,aio=native,cache=none,format=qcow2,id=hd0 \-device nvme,id=nvme0,serial=deadbeef,zoned.zasl=5 \-drive file=$ZNSIMGF,id=nvmezns0,format=raw,if=none \-device nvme-ns,drive=nvmezns0,bus=nvme0,nsid=1,logical_block_size=4096,physical_block_size=4096,zoned=true,zoned.zone_size=64M,zoned.zone_capacity=62M,zoned.max_open=16,zoned.max_active=32,uuid=5e40ec5f-eeb6-4317-bc5e-c919796a5f79 \-drive file=$CONVIMGF,if=none,id=nvmeconv0,format=raw,if=none \-device nvme-ns,drive=nvmeconv0,logical_block_size=4096,physical_block_size=4096 \-net user,hostfwd=tcp::8081-:22 \-net nic,model=virtio \-nographic \-qmp unix:./qmp-sock,server,nowait 2>&1 | tee log

2.安装f2fs-tools-1.14.0

旧版本的f2fs-tools可能不支持双硬盘挂载F2FS,因此需要下载安装1.14.0及以上的工具
https://git.kernel.org/pub/scm/linux/kernel/git/jaegeuk/f2fs-tools.git
https://git.kernel.org/pub/scm/linux/kernel/git/jaegeuk/f2fs-tools.git/about/
https://f2fs.wiki.kernel.org/

3.挂载F2FS

与SMR硬盘不同,内核在默认情况下不会为代表NVMe分区名称空间的块设备选择mq-deadline块- io调度器。为了确保f2fs使用的常规写操作按顺序交付给设备,必须将NVMe分区的名称空间块设备的IO调配器设置为mq-deadline。这是通过以下命令完成的

echo mq-deadline > /sys/block/nvme1n1/queue/scheduler

在上面的命令中,/dev/nvme1n1是分区名称空间的块设备文件,将用于f2fs卷。使用这个名称空间,可以使用mkfs.f2fs的-c选项格式化使用额外常规块设备(以下示例中的/dev/nvme0n1)的多设备f2fs卷,如下面的示例所示

cd ~/f2fs-tools-1.14.0/mkfs
sudo ./mkfs.f2fs -f -m -c /dev/nvme1n1 /dev/nvme0n1F2FS-tools: mkfs.f2fs Ver: 1.14.0 (2021-06-23)Info: Disable heap-based policy
Info: Debug level = 0
Info: Trim is enabled
Info: Host-managed zoned block device:2048 zones, 0 randomly writeable zones524288 blocks per zone
Info: Segments per section = 1024
Info: Sections per zone = 1
Info: sector size = 4096
Info: total sectors = 1107296256 (4325376 MB)
Info: zone aligned segment0 blkaddr: 524288
Info: format version with"Linux version 5.13.0-rc6+ (user1@brahmaputra) (gcc (Ubuntu 10.3.0-1ubuntu1) 10.3.0, GNU ld (GNU Binutils for Ubuntu) 2.36.1) #2 SMP Fri Jun 18 16:45:29 IST 2021"
Info: [/dev/nvme0n1] Discarding device
Info: This device doesn't support BLKSECDISCARD
Info: This device doesn't support BLKDISCARD
Info: [/dev/nvme1n1] Discarding device
Info: Discarded 4194304 MB
Info: Overprovision ratio = 3.090%
Info: Overprovision segments = 74918 (GC reserved = 40216)
Info: format successful

要挂载使用上述命令格式化的卷,必须指定常规块设备:

# mount -t f2fs /dev/nvme0n1 /mnt/f2fs/

可能出现的问题

0.最好设置内存大于8G,我设的32GB,不然编译rocksdb可能会崩溃
需提前安装sudo apt-get install libgflags-dev
1.服务器无法git clone
使用linux的PC git clone后,通过U盘复制到服务器。然后你可能需要:
sudo chmod -R +x rocksdb/
sudo git config --global --add safe.directory /home/femu/rocksdb/plugin/zenfs
2.需要提前安装libzbd
https://github.com/westerndigitalcorporation/libzbd
其中需要先安装autoconf autoconf-archive automake libtool m4
3.对zenfs运行make时可能报错,原因是没有安装sudo apt-get install libgflags-dev
https://github.com/westerndigitalcorporation/zenfs/issues/3
在makefile中修改这一行,链接libgflags:
$(TARGET): $(TARGET).cc
$(CXX) $(CXXFLAGS) -g -o $(TARGET) $< $(LIBS) -lgflags $(LDFLAGS)
修改调度算法:echo deadline > /sys/class/block/nvme0n1/queue/scheduler
格式化文件系统:sudo ./plugin/zenfs/util/zenfs mkfs --zbd=nvme0n1 --aux-path=./plugin/zenfs/log

这篇关于使用QUME搭建ZNS SSD的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/217850

相关文章

中文分词jieba库的使用与实景应用(一)

知识星球:https://articles.zsxq.com/id_fxvgc803qmr2.html 目录 一.定义: 精确模式(默认模式): 全模式: 搜索引擎模式: paddle 模式(基于深度学习的分词模式): 二 自定义词典 三.文本解析   调整词出现的频率 四. 关键词提取 A. 基于TF-IDF算法的关键词提取 B. 基于TextRank算法的关键词提取

使用SecondaryNameNode恢复NameNode的数据

1)需求: NameNode进程挂了并且存储的数据也丢失了,如何恢复NameNode 此种方式恢复的数据可能存在小部分数据的丢失。 2)故障模拟 (1)kill -9 NameNode进程 [lytfly@hadoop102 current]$ kill -9 19886 (2)删除NameNode存储的数据(/opt/module/hadoop-3.1.4/data/tmp/dfs/na

Hadoop数据压缩使用介绍

一、压缩原则 (1)运算密集型的Job,少用压缩 (2)IO密集型的Job,多用压缩 二、压缩算法比较 三、压缩位置选择 四、压缩参数配置 1)为了支持多种压缩/解压缩算法,Hadoop引入了编码/解码器 2)要在Hadoop中启用压缩,可以配置如下参数

Makefile简明使用教程

文章目录 规则makefile文件的基本语法:加在命令前的特殊符号:.PHONY伪目标: Makefilev1 直观写法v2 加上中间过程v3 伪目标v4 变量 make 选项-f-n-C Make 是一种流行的构建工具,常用于将源代码转换成可执行文件或者其他形式的输出文件(如库文件、文档等)。Make 可以自动化地执行编译、链接等一系列操作。 规则 makefile文件

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

pdfmake生成pdf的使用

实际项目中有时会有根据填写的表单数据或者其他格式的数据,将数据自动填充到pdf文件中根据固定模板生成pdf文件的需求 文章目录 利用pdfmake生成pdf文件1.下载安装pdfmake第三方包2.封装生成pdf文件的共用配置3.生成pdf文件的文件模板内容4.调用方法生成pdf 利用pdfmake生成pdf文件 1.下载安装pdfmake第三方包 npm i pdfma

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

搭建Kafka+zookeeper集群调度

前言 硬件环境 172.18.0.5        kafkazk1        Kafka+zookeeper                Kafka Broker集群 172.18.0.6        kafkazk2        Kafka+zookeeper                Kafka Broker集群 172.18.0.7        kafkazk3

git使用的说明总结

Git使用说明 下载安装(下载地址) macOS: Git - Downloading macOS Windows: Git - Downloading Windows Linux/Unix: Git (git-scm.com) 创建新仓库 本地创建新仓库:创建新文件夹,进入文件夹目录,执行指令 git init ,用以创建新的git 克隆仓库 执行指令用以创建一个本地仓库的

【IPV6从入门到起飞】5-1 IPV6+Home Assistant(搭建基本环境)

【IPV6从入门到起飞】5-1 IPV6+Home Assistant #搭建基本环境 1 背景2 docker下载 hass3 创建容器4 浏览器访问 hass5 手机APP远程访问hass6 更多玩法 1 背景 既然电脑可以IPV6入站,手机流量可以访问IPV6网络的服务,为什么不在电脑搭建Home Assistant(hass),来控制你的设备呢?@智能家居 @万物互联