网址:lightnvm.io
这套模拟器一共包含三部分:
virtual ocssd, lightnvm(linux kernel), liblightnvm
virtual ocssd: 就是 虚拟的 open channel ssd。也就是一个虚拟ssd硬盘
lightnvm: 是一个linux内核(kernel),这个内核包含了对virtual ocssd的调用接口。并且把相关io接口提供给软件应用层。并且使应用层可以使用ssd的特有的特性,比如并行读写。
liblightnvm: 这个是一套软件应用层面上的sdk。它将lightnvm内核的相关接口提供给application。
相关网址:https://openchannelssd.readthedocs.io/en/latest/qemu/#getting-started-with-a-virtual-open-channel-ssd
github网址:https://github.com/OpenChannelSSD/qemu-nvme
开始安装here we go
Pre-requirements 安装的前提条件:
UBuntu 16.04 (更高的版本也可以)
请先安装好git,gcc等工具。大部分可以通过 sudo apt-get install 安装得到
git clone https://github.com/OpenChannelSSD/qemu-nvme
代码克隆完毕后输入
cd qemu-nvme
./configure --enable-kvm --target-list=x86_64-softmmu --enable-linux-aio --disable-werror --disable-xen --prefix=$HOME/qemu-nvme
这时可能会报错
Disabling libtool due to broken toolchain support
ERROR: pkg-config binary 'pkg-config' not found
source does not have file "pkg-config"
解决办法,输入
sudo apt install pkg-config
然后再次输入
./configure --enable-kvm --target-list=x86_64-softmmu --enable-linux-aio --disable-werror --disable-xen --prefix=$HOME/qemu-nvme
若再次报错:
ERROR: zlib check failed Make sure to have the zlib libs and headers installed.
输入:
sudo apt-get install zlib1g
sudo apt-get install zlib1g-dev
然后再次输入
./configure --enable-kvm --target-list=x86_64-softmmu --enable-linux-aio --disable-werror --disable-xen --prefix=$HOME/qemu-nvme
若再次报错:
glib-2.12 gthread-2.0 is required to compile QEMU
输入:
sudo apt-get install libglib2.0-dev
然后再次输入
./configure --enable-kvm --target-list=x86_64-softmmu --enable-linux-aio --disable-werror --disable-xen --prefix=$HOME/qemu-nvme
若再次报错:
pixman >= 0.21.8 not present. Your options:
输入
sudo apt-get install libpixman-1-dev
然后再次输入
./configure --enable-kvm --target-list=x86_64-softmmu --enable-linux-aio --disable-werror --disable-xen --prefix=$HOME/qemu-nvme
若再次报错:
User requested feature linux AIO
configure was not able to find it.
Install libaio devel
输入
sudo apt-get install libaio-dev
然后再次输入
./configure --enable-kvm --target-list=x86_64-softmmu --enable-linux-aio --disable-werror --disable-xen --prefix=$HOME/qemu-nvme
make
make install
接下来是做硬盘配置
需要创建一个大文件, 这个大文件建议8g,也可以更大
(这个文件将用来作为OCSSD硬盘)
创建,输入:
dd if=/dev/zero of=ocssd_backend.img bs=1M count=4096
这样子就创建了个8g的文件。后面的“count=”为文件大小。可以改为4g(4096)
接下来就是运行了!
输入(全部复制):
sudo bin/qemu-system-x86_64 -m 4G -smp 4 -s \
-drive file=ocssd_backend.img,id=myocssd,format=raw,if=none \
-device nvme,drive=myocssd,serial=deadbeef,lnum_pu=4,lstrict=1,meta=16,mc=3
上面qemu-nvm是一个虚拟机
整套Virtual OCSSD实验平台的原理是这样的:
首先物理机装 Ubuntu,然后在物理机上创建两个大文件
ubuntu.raw
ocssd_backend.img (已经在上面的步骤中创建好了)
然后 ocssd_backend.img 是用来作为一块OCSSD硬盘
而 ubuntu.raw 是用来作为一块普通主硬盘。
qemu-nvm 虚拟机要加载两块硬盘(ubuntu.raw 和 ocssd_backend.img)
在ubuntu.raw 上装 ubuntu系统。
然后整个实验环境都是在虚拟机里面完成
现在开始给虚拟机装系统了
第一步装虚拟机查看器
sudo apt-get install xvnc4viewer
然后在运行着qemu的情况下,新建一个终端,输入
vncviewer localhost:5900
(注意上面的端口号要和qemu运行时给出端口号一致)
就可以显示虚拟机的状况了
给虚拟机装ubuntu系统
第一步创建 ubuntu.raw 文件作为虚拟机的主硬盘
cd qemu-nvme
sudo $HOME/qemu-nvme/bin/qemu-img create -f raw ubuntu.raw 70G
上面的70G可以改为别的数字,比如40G?30G。。
然后就开始装系统了
sudo $HOME/qemu-nvme/bin/qemu-system-x86_64 -m 4096 -enable-kvm ubuntu.raw -cdrom ~/ubuntu.iso
运行完上面的语句后,使用VNC查看虚拟机
然后一步一步把系统装完就行,不再介绍。
装机好之后,以后要重新进入虚拟机,只需要输入:
sudo $HOME/qemu-nvme/bin/qemu-system-x86_64 -m 4G -enable-kvm ubuntu.raw
-drive file=ocssd_backend.img,id=myocssd,format=raw,if=none
-device nvme,drive=myocssd,serial=deadbeef,lnum_pu=4,lstrict=1,meta=16,mc=3
即可。
上面的指令很好理解,首先加载了 ubuntu.raw作为主硬盘(带操作系统),然后挂载了一个 ocssd_backend.img作为ocssd硬盘。
到此为止,虚拟机装ubuntu的步骤就完成了
注意内核是装到虚拟机的ubuntu系统中去
而不是装到物理机的ubuntu系统去
首先编译内核是一个很占内存的工作
因此建议在物理机上编译内核,然后把编译好的内核文件传入到虚拟机中,再在虚拟机中安装内核。
Step1 在物理机上面编译内核的工作
以下的指令,可能会提示缺少相关的库。
根据提示安装相关的库即可,可用 sudo apt install 库名
git clone https://github.com/OpenChannelSSD/linux.git
cd linux
sudo apt-get install libncurses*
make menuconfig
在输入make menuconfig后,会出现图形菜单
然后我们要修改某些配置,最终保证以下参数成立
CONFIG_BLK_DEV_NVME=y
CONFIG_NVM=y
CONFIG_NVM_DEBUG=y
CONFIG_NVM_PBLK=y
进入图形菜单后,输入“/”即出现搜索页面
在搜索栏输入 CONFIG_BLK_DEV_NVME 即可出现该配置项位于图形菜单的哪一个位置中。然后在图形菜单中进入到该位置,去修改配置项就行。把上面三个参数的配置项改为 Y
接下来就是编译内核了
sudo apt-get install libssl-dev
make bzImage
make modules
到此为止,内核就编译完了。
现在要把在物理机上编译好的内核装到虚拟机上面去
技术方案是:
建立物理机和虚拟机的共享文件夹
我们把编译好的内核放入共享文件夹,然后打开虚拟机,在虚拟机上进入该共享文件夹,把内核安装到系统上去。
共享文件夹的建立
创建一个20G的共享硬盘文件
sudo dd if=/dev/zero of=/opt/share.img bs=1M count=20000
sudo mkfs.ext4 /opt/share.img
sudo mkdir /tmp/share
sudo mount -o loop /opt/share.img /tmp/share
(使用 umount可以卸载硬盘 (sudo umount /opt/share.img))
这样,在物理机上把需要传输给虚拟机的文件放到/tmp/share 下即可。
如果需要传输新文件,需要重启虚拟机。
将编译好的linux文件夹整个拷贝到共享文件夹中
sudo cp -r /home/niko/linux/. /tmp/share/linux
启动虚拟机
sudo $HOME/qemu-nvme/bin/qemu-system-x86_64 -m 2048 -enable-kvm ubuntu.raw -hdc /opt/share.img
在虚拟机中,打开我的电脑就会看得到共享硬盘了
df -h 查看挂在点,然后使用cd 命令进入相关挂在点位置
凭所示目录 使用 cd 指令就可以进入相关文件夹啦
然后再进入linux文件夹
接下来输入
sudo apt-get update
sudo apt install make
sudo apt install gcc
sudo apt install libelf-dev
sudo make modules_install install
即可开始安装内核
启动虚拟机(并加载ocssd硬盘):
sudo $HOME/qemu-nvme/bin/qemu-system-x86_64 -m 4G -enable-kvm ubuntu.raw
-drive file=ocssd_backend.img,id=myocssd,format=raw,if=none
-device nvme,drive=myocssd,serial=deadbeef,lnum_pu=4,lstrict=1,meta=16,mc=3
工具包的安装:
sudo apt-get install nvme-cli
sudo nvme lnvm create -d nvme0n1 --lun-begin=0 --lun-end=3 -n mydevice -t pblk
然后使用nvme-cli 测试看看ocssd硬盘是否已经成功被加载:
输入
sudo nvme lnvm list
git clone https://github.com/OpenChannelSSD/liblightnvm.git
cd liblightnvm
sudo apt install cmake
sudo apt install libcunit1-dev
make configure
make
sudo make install
到此为止就大功告成了。
接下来测试一段helloworld代码来验证我们已经搭建完毕
首先进行一次配置(这一步的必要性未经验证,有可能是非必要的)
sudo NVM_CLI_BE_ID=0x1 nvm_dev info /dev/nvme0n1
然后
#include
#includeint main(int argc, char **argv)
{
struct 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;
}
将上面的代码保存为 hello.c
然后编译:
gcc hello.c -fopenmp -llightnvm -o hello
最后运行
sudo ./hello