目录
欢迎一起研究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源
强制关机后无有线连接解决办法:
这里只列出了部分阶段性分析内容,欢迎做这方面开发的或者有兴趣的小伙伴一起来深入研究。
使用Ubuntu18.10版本,内核为4.18.10直接支持pblk。
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
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
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字节。
修改drivers/lightnvm Makefile文件添加 CONFIG_MODULE_SIG=n,避免加载驱动失败
make modules SUBDIRS=drivers/lightnvm
make modules_install SUBDIRS=drivers/lightnvm
modprobe pblk.ko
sudo nvme lnvm id-ns /dev/nvme0n1 -H
注:可通过/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的基地址;
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=
##中科大源
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