- [Qemu OpenChannelSSD] Hello worl
- [Qemu OpenChannelSSD]Geometry
- [Qemu OpenChannelSSD] Address Is
- [Qemu OpenChannelSSD] 阶段总结
- [Qemu OpenChannelSSD] feature I/
- [Qemu OpenChannelSSD] Bad Block
- [Qemu OpenChannelSSD] Basic I/O
- [Qemu OpenChannelSSD] Basic I/O
- Spring 3 hello world example
- Spring 3 hello world example
- 命令行启动虚拟机,虚拟机内核需要是
分支pblk.20
分支pblk-lastest
(git clone https://github.com/OpenChannelSSD/linux.git)
sudo qemu-system-x86_64 --enable-kvm -m 4G -smp 2 -hda ./VMs/vm1.raw -hdb ./VMs/vm1_1.raw -net nic -net tap \
-drive file=./VMs/blknvme.1,if=none,id=blknvme.1 \
-device nvme,drive=blknvme.1,serial=deadbeef,namespaces=1,lver=1,nlbaf=5,lba_index=3,mdts=10
- 其中nvme设备的参数(qemu_src/hw/block/nvme.c)
serial=deadbeef,
namespaces=1, # namespaces=<int> : Namespaces to make out of the backing storage, Default:1
lver=1, # lver=<int> : version of the LightNVM standard to use, Default:1
nlbaf=5, # nlbaf=<int> : Number of logical block formats, Default:1
lba_index=3, # lba_index=<int> : Default namespace block format index, Default:0
mdts=10 # mdts=<int> : Maximum data transfer size, Default:5
-
nlbaf=5,lba_index=3据说这两个参数决定了nvme设备的块大小(block = 4K),具体怎么处理的需要看Qemu中nvme设备的相关处理.
(git clone https://github.com/OpenChannelSSD/qemu-nvme.git) -
在虚拟机内可以见到一个nvme设备了.
work@vm1:~$ sudo nvme lnvm list
Number of devices: 1
Device Block manager Version
nvme0n1 none (0,0,0)
work@vm1:~$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdb 8:16 0 30G 0 disk
└─sdb1 8:17 0 30G 0 part /home/work/mnt/1
sr0 11:0 1 1024M 0 rom
sda 8:0 0 20G 0 disk
├─sda2 8:2 0 1.4G 0 part [SWAP]
└─sda1 8:1 0 18.6G 0 part /
nvme0n1 259:0 0 16G 0 disk
work@vm1:~$ sudo nvme lnvm init -d nvme0n1
work@vm1:~$ sudo nvme lnvm list
Number of devices: 1
Device Block manager Version
nvme0n1 gennvm (0,1,0)
- 紧接着在虚拟机中安装liblightnvm,以便用户态可以使用一些与OpenChannelSSD相关的api.就是去下这个githttps://github.com/OpenChannelSSD/liblightnvm,并make&&make install.
- 在虚拟机装好liblightnvm后,可以在用户态access一个OpenChannelSSD.
- hello_nvme.c:
#include <stdio.h>
#include <liblightnvm.h>
int main(int argc, char **argv)
{
NVM_DEV dev = nvm_dev_open("/dev/nvme0n1");
if (!dev) {
perror("nvm_dev_open");
return 1;
}
nvm_dev_pr(dev);
nvm_dev_close(dev);
return 0;
- 编译:(需要gcc版本 4.9.1以上)
gcc hello_nvme.c -llightnvm -o hello_nvme
- 运行:
work@vm1:~/mnt/1/OpenChannelSSD/src/hello_nvme$ sudo ./hello_nvme
dev { path(/dev/nvme0n1), name(nvme0n1), fd(3) }
dev-geo {
nchannels(1), nluns(1), nplanes(1),
nblocks(16352), npages(256), nsectors(1),
page_nbytes(4096), sector_nbytes(4096), meta_nbytes(16),
tbytes(17146314752b:16352Mb),
vpg_nbytes(4096b:4Kb),
vblk_nbytes(1048576b:1Mb)
}
dev-lba_map {
channel_nbytes(17146314752)
lun_nbytes(17146314752)
plane_nbytes(4096)
block_nbytes(1048576)
page_nbytes(4096)
sector_nbytes(4096)
}
dev-fmt {
ch_ofz(20), ch_len(0),
lun_ofz(20), lun_len(0),
pl_ofz(20), pl_len(0),
blk_ofz(0), blk_len(12),
pg_ofz(12), pg_len(8),
sec_ofz(20), sec_len(0)
}
- (补上一个模块关系简图)
(http://openchannelssd.readthedocs.io/en/latest/)

- 过程中出了个问题.(感觉是需要OpenMP4.0)
/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../lib/liblightnvm.so: undefined reference to `GOMP_parallel@GOMP_4.0'
看一下我的GCC版本
work@vm1:~/mnt/1/OpenChannelSSD/src/hello_nvme$ gcc --version
gcc (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4
Copyright (C) 2013 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
查一下这个GOMP是个所谓的多线程框架,gcc自带的,并且版本关系如下:
From GCC 4.2.0, OpenMP 2.5 is fully supported.
From GCC 4.4.0, OpenMP 3.0 is fully supported.
From GCC 4.7.0, OpenMP 3.1 is fully supported.
In GCC 4.9.0, OpenMP 4.0 is supported for C and C++, but not Fortran.
From GCC 4.9.1, OpenMP 4.0 is fully supported.
所以这里应该是gcc的版本不够.按照这个threadUbuntu 14.04 LTS 下升级 gcc 到 gcc-4.9、gcc-5 版本
装个gcc-4.9.
简要步骤如下:
1 sudo add-apt-repository ppa:ubuntu-toolchain-r/test
2 sudo apt-get update
3 sudo apt-get upgrade
4 sudo apt-get install gcc-4.9 g++-4.9
work@vm1:~/mnt/1/OpenChannelSSD/src/hello_nvme$ gcc-4.9 --version
gcc-4.9 (Ubuntu 4.9.4-2ubuntu1~14.04.1) 4.9.4
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
再编译果然就OK.
- 与OpenchannelSSD相关项目
Linux Kernel Support (https://github.com/OpenChannelSSD/linux) Implements support for Open-Channel SSDs in the kernel. It is the core of identifying, managing, and using the Open-Channel SSDs.
liblightnvm Library (https://github.com/OpenChannelSSD/liblightnvm)A library that abstracts the underlying "raw" Open-Channel SSD device and provides abstractions such as append only, bad block management, etc.
General documentation (https://github.com/OpenChannelSSD/documentation)The documentation that is exposed through readthedocs.org
liblightnvm documentation (http://lightnvm.io/liblightnvm)The liblightnvm documentation
LightNVM Conditioning Tool (https://github.com/OpenChannelSSD/lnvm) Provides the lnvm-tool
cli management tool for verifying and conditioning Open-Channel SSDs.
LightNVM Test Tools (https://github.com/OpenChannelSSD/lightnvm-hw)Various tools to test kernel and target implementations.
QEMU with NVMe Open-Channel Support (https://github.com/OpenChannelSSD/qemu-nvme)Implements support for exposing a virtual open-channel SSD. Very useful for development.
网友评论
sudo nvme lnvm init -d nvme0n1
sudo nvme lnvm create -d nvme0n1 --lun-begin=0 --lun-end=3 -n mydevice -t pblk这两个命令时报错:“creation of target failed ”
用dmesg命令查看报:target type pblk not find
我用过的内核有:master, pblk.latest, pblk.20, for-next都不能解决该问题
我用rrpc创建的target能够完成,也能mkfs,但在挂载文件系统时会提示超级块出错。请问你用open channel ssd的qemu挂载成功过文件系统吗?
1.调用nvme lnvm list可以看到nvme0n1,但是lsblk却没有。
2.调用nvme lvnm create -d nvme0n1 -n mydevice -t rrpc -b 0 -e 0创建一个target,可以通过lsblk看到mydevice,但是hw.c运行的结果是Input/output error,似乎是无法看到mydevice的信息(hw.c路径改成/dev/mydevice)。
3.如果-b -e的值不都是0,则创建不成功,输出killed。
如果您了解问题出现的原因,烦请给一些指导。谢谢!
请问这篇博文使用的是什么环境?ubuntu 的哪个版本、哪个内核、在 virtualbox 下安装的ubuntu嘛?
我在ubuntu 16.04 desktop amd64 和 ubuntu 16.04.2 desktop amd64 环境下,连安装qemu-nvme 的 ./configure 这一步的时候报错『Disabling libtool due to broken toolchain support』。
忽略这个错误强行运行的时候又报错『Property '.namespaces' not found』。
请问楼主遇到过这些问题嘛?
2. hw.c中liblightnvm是直接与nvme设备交互,而不是与某种target,因此你这里不能用mydevice,而只能用nvme0n1(rrpc目标貌似目前不能用,目前kernel里能用的分支只有pblk,或者说与qemu-nvme配对的kernel分支)
3. -b -e指的是LUN,你这个设备本身LUN有多少个才能指定多少个,也就是qemu里的参数llun_number=xxx(貌似是这个,你去hw/block/nvme.c的注释里看看)