关于使用qemu-nvme创建OC SSD设备pblk,以及lightnvm子系统介绍

目录

 

欢迎一起研究pblk的小伙伴入群,qq群:851435225

1:下载qemu-nvme源码,配置安装

2:制作qemu系统

3:启动系统

4:进入系统加载pblk驱动,初始化nvme设备,创建/删除pblk设备

a:编辑pblk驱动模块,安装

b:查看nvme设备信息

c:创建pblk设备

d:删除一个pblk设备

5:数据规则

a:部分数据读取规则:

b:磨损均衡策略:

6:chunk状态转换图:

7:pblk整体代码框架

8:pblk IO path

注:如何更新Ubuntu内核

ubuntu18.10源

强制关机后无有线连接解决办法:


欢迎一起研究lightnvm子系统的小伙伴入群,qq群:851435225

这里只列出了部分阶段性分析内容,欢迎做这方面开发的或者有兴趣的小伙伴一起来深入研究。

使用Ubuntu18.10版本,内核为4.18.10直接支持pblk。

1:下载qemu-nvme源码,配置安装

a:git clone https://github.com/OpenChannelSSD/qemu-nvme.git

b:sudo ./configure --enable-kvm --target-list=x86_64-softmmu --enable-linux-aio --enable-sdl --disable-werror --disable-xen --prefix=$HOME/qemu-nvme

 

2:制作qemu系统

a:qemu-img create -f raw ubuntu.raw 20G

b:qemu-system-x86_64 -m 3G -enable-kvm ubuntu.raw -cdrom /mnt/hgfs/E/ubuntu-18.10-desktop-amd64.iso

 

3:启动系统

a:dd if=/dev/zero of=blknvme bs=1M count=8000

b:qemu-system-x86_64 -m 4G -smp 4 -enable-kvm -hda ubuntu.raw -drive file=blknvme,if=none,id=blknvme -device nvme,drive=blknvme,serial=deadbeef,namespaces=1,lnum_pu=4,lstrict=1,meta=16,mc=3

 

 

注:OCSSD版本2

1个channel,每个channel包含4个PU,所以总共4个luns/PU;

每个PU包含125个chunk,每个chunk包含4096个扇区,一共500个chunk【4*125】,总共2048000个扇区【500*4096】;

每次最少要在一个chunk里面写入4个扇区。最好写入8个扇区的数据。在读取某个块数据时这个块不要进入缓存的32个扇区/块数据里面,否则不能读取到想要的磁盘数据。控制器一次可以open的最大chunk数量,0表示所有都可以。单个并行单元里面一次可以打开的最大chunk数量;

典型的读取一个单元的时间:70毫秒,最大读取时间100毫秒。典型的写入一个写单元时间190毫秒,最大写入时间350毫秒。典型的chunk重置时间300毫秒,最大重置时间300毫秒;

LBA格式:channel分配2^0=1个地址长度,因为只有1个channel。PU有4个所以要用两个地址长度指定某个PU单元。每个PU包含chunk有125个,所以需要2^7=128。每个chunk包含4096个扇区,所以需要2^12=4096的地址长度来表示某个起始扇区地址。

LBA分布:sec{0,11}-chk{12-18}-lun{19-20}-ch{21};

各个段的掩码;

扇区大小4K,oob大小16字节。

 

4:进入系统加载pblk驱动,初始化nvme设备,创建/删除pblk设备

a:编辑pblk驱动模块,安装

修改drivers/lightnvm Makefile文件添加 CONFIG_MODULE_SIG=n,避免加载驱动失败

make modules SUBDIRS=drivers/lightnvm

make modules_install SUBDIRS=drivers/lightnvm

modprobe pblk.ko

b:查看nvme设备信息

sudo nvme lnvm id-ns /dev/nvme0n1 -H

 

c:创建pblk设备

 

注:可通过/sys/device/virtual/block/mypblk/pblk查看相关sysfs信息

pblk_core_init:

4个PU,每个为读准备32个,一共128。因为每个扇区大小为4K,每个页大小也为4K,pblk的每chunk最小写入页数量大小使用的是nvm设备的建议写入扇区数量8转换成的页数量,也就是8*4/4=8页数据。因为只有4个PU,所以最多可以一次写入8*4=32个页的数据。

pblk_lines_init->

pblk_line_meta_init:

每个chunk/block包含4096个扇区,一共4个PU,所以一个line里面一共包含4*4096=16384个扇区。每个line里面的block/trunk数量等于所有PU的数量也就是4。64位平台long型数据占用8个字节,也就是占用64个bit,所以每个line里面的block使用情况只需要一个long型数据占用的bit数量就够了,也就是8个字节。一共16384个扇区,所以需要16384/64个long型数据,每个long占用8字节,所以需要16384/64*8=2048个字节。lun信息雷同。line管理器的中间阈值为该line包含的所有扇区数量的一半,也就是8192,high为四分之一,也就是4096.元数据与数据之间距离等于所有lun数量除以2再乘以一个chunk里面的最小写入页数量。

起始元数据区域需要8个扇区,总大小为32768字节数据;

pblk_line_mg_init:

终止元数据区域需要40个扇区,总大小为163840字节,bb需要0扇区,最少保留的好的扇区数为2;

预备3个终止元数据区域,大小跟前面的0号相同;

pblk_luns_init:

初始化pblk的lun信息,指向tgt的lun的基地址;

 

 

d:删除一个pblk设备

 

 

5:数据规则

a:部分数据读取规则:

 

b:磨损均衡策略:

6:chunk状态转换图:

7:pblk整体代码框架

8:pblk IO path

注:如何更新Ubuntu内核

a:apt-cache search linux-source

b:sudo apt-get install linux-source-xxx

c:进入/usr/src目录解压源码,进行配置【将pblk配置为模块】,make,make modules, make modules_install, make install

d:重启系统

单独编译内核里面的一个驱动模块

make modules SUBDIRS=

ubuntu18.10源

##中科大源

deb https://mirrors.ustc.edu.cn/ubuntu/ cosmic main restricted universe multiverse

deb-src https://mirrors.ustc.edu.cn/ubuntu/ cosmic main restricted universe multiverse

deb https://mirrors.ustc.edu.cn/ubuntu/ cosmic-updates main restricted universe multiverse

deb-src https://mirrors.ustc.edu.cn/ubuntu/ cosmic-updates main restricted universe multiverse

deb https://mirrors.ustc.edu.cn/ubuntu/ cosmic-backports main restricted universe multiverse

deb-src https://mirrors.ustc.edu.cn/ubuntu/ cosmic-backports main restricted universe multiverse

deb https://mirrors.ustc.edu.cn/ubuntu/ cosmic-security main restricted universe multiverse

deb-src https://mirrors.ustc.edu.cn/ubuntu/ cosmic-security main restricted universe multiverse

deb https://mirrors.ustc.edu.cn/ubuntu/ cosmic-proposed main restricted universe multiverse

deb-src https://mirrors.ustc.edu.cn/ubuntu/ cosmic-proposed main restricted universe multiverse

强制关机后无有线连接解决办法:

第一步:停掉网络服务

#sudo service NetworkManager stop

第二步:清理网络状态文件

#sudo  rm /var/lib/NetworkManager/NetworkManager.state

第三步:开启网络服务

#sudo  service NetworkManager start

 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值