一、背景
nvme-cli命令常常用于获取或者设置SSD参数,比如常见的nvme list,nvme id-ctrl等,都是获取SSD的基本信息,也有nvme admin-passthru用于读取或者设置自定义命令。作为使用者,我们并不知道nvme-cli源码怎么实现的,为了探究溯源,阅读源码探究一下nvme-cli常见命令的细节。具体的nvme-cli master代码下载地址见链接。
nvme-builtin.h可以看到,可命令支持如下:
二、常见命令
2.1 nvme list
作为最简单的nvme-cli命令,以此为基础进行分析,首先进入nvme.c函数入口,这是nvme-cli命令的入口,找到nvme list命令function:
最终调用struct print_ops的成员变量,一个函数指针list_items:
而list_items在nvme-cli-master\nvme-print-stdout.c中的struct print_ops stdout_print_ops结构体进行初始化:
在nvme-cli-master\nvme-print-stdout.c找到stdout_list_items
stdout_simple_ns里面找到stdout_list_item,最终可以查看nvme list打印信息:
从代码上可以看到,当在host终端上输入“nvme list”后,显示的数据类型有:dev_name、genname、nvme_ns_get_serial(n)、nvme_ns_get_model(n)、nvme_ns_get_nsid(n)、usage、format、nvme_ns_get_firmware(n))。
其中usage信息有两个,前一个是nuse,另一个是nsze,这都是NVME协议里面规定的位域:
这里需要注意一点:如果SSD不支持thin provisioning,那么NUSE需要等于NCAP,否则NUSE可以小于NCAP。
2.2 nvme list_subsys
主要是nvme_show_subsystem_list函数,
在nvme-print.h获取print_nvme_subsystem_list
初始化.print_nvme_subsystem_list = stdout_subsystem_list,