Virtual OCSSD实验平台搭建

virtual ocssd是什么?

网址: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。


virtual OCSSD 的安装,编译与运行

相关网址: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 安装得到

打开终端
Virtual OCSSD实验平台搭建_第1张图片
输入

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

这时 如果显示:
Virtual OCSSD实验平台搭建_第2张图片
就表示成功了
接下来输入:

make
make install

Virtual OCSSD实验平台搭建_第3张图片
这样就编译完成了

接下来是做硬盘配置

需要创建一个大文件, 这个大文件建议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

在这里插入图片描述
运行成功!
按ctrl+c停止运行

Qemu-nvme 虚拟机装系统与配置

上面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运行时给出端口号一致)
就可以显示虚拟机的状况了
Virtual OCSSD实验平台搭建_第4张图片
给虚拟机装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的步骤就完成了

LightNVM(kernel) 的安装,编译与运行


注意内核是装到虚拟机的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

在虚拟机中,打开我的电脑就会看得到共享硬盘了
Virtual OCSSD实验平台搭建_第5张图片df -h 查看挂在点,然后使用cd 命令进入相关挂在点位置
Virtual OCSSD实验平台搭建_第6张图片凭所示目录 使用 cd 指令就可以进入相关文件夹啦
然后再进入linux文件夹
Virtual OCSSD实验平台搭建_第7张图片接下来输入

sudo apt-get update
sudo apt install make
sudo apt install gcc
sudo apt install libelf-dev
sudo make modules_install install

即可开始安装内核

LibLightNVM 的安装,编译与运行

启动虚拟机(并加载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

Virtual OCSSD实验平台搭建_第8张图片安装liblightnvm:

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
#include

int 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

得到的输出结果
Virtual OCSSD实验平台搭建_第9张图片

你可能感兴趣的:(SSD模拟器)