RHEL7 上的 NVMe


RHEL7 上的 NVMe


什么是NVMe?

NVM Express [NVMe] 或非易失性存储器主机控制器接口规范 (NVMHCI) 是用于访问通过 PCI Express (PCIe) 总线连接的固态硬盘 (SSD) 的规范。NVM 是在固态硬盘中使用的 non-volatile memory(非易失性存储器)的缩写。  NVMe 为 PCIe 固态硬盘定义优化的寄存器接口、命令集和功能集。NVMe 专注于标准化 PCIe 固态硬盘并提高性能

基于 NVMe 规范设计的 PCIe 固态硬盘设备是基于 NVMe 的 PCIeSSD。有关 NVMe 的详细信息,请参阅以下链接 http://www.nvmexpress.org/。目前使用的 NVMe 设备符合 NVMe 1.0c 标准

下面我们探讨 RHEL 7 对 NVMe 设备的支持。
 
目前,戴尔通过 RHEL 7 现成的 [基于供应商] 驱动程序支持 NVMe 设备 


下面列出了所涵盖的内容:
 

NVMe - 支持的功能

NVMe 驱动程序公开以下功能
  • 基本 IO 操作
  • 热插拔
  • 引导支持 [UEFI 和传统方式]
下表列出了适用于 12G 和 13G 机器上 NVMe 的 RHEL 7 [现成] 驱动程序支持的功能

 
基本 IO 热插拔 UEFI 引导 传统方式引导
13 G
12 G
表 1:RHEL 7 驱动程序支持


NVMe 设备:列出设备及其功能

1) 列出 RHEL 7 OS 信息

[root@localhost ~]# uname -a

Linux localhost.localdomain 3.10.0-123.el7.x86_64 #1 SMP Mon May 5 11:16:57 EDT 2014 x86_64 x86_64 x86_64 GNU/Linux 

2) 通过使用 lspci 实用程序获取设备详细信息

a) 我们支持基于三星的 NVMe 驱动器。首先通过使用以下命令获得 pci 插槽 id

[root@localhost ~]# lspci | grep -i Samsung

45:00.0 非易失性存储器控制器:Samsung Electronics Co Ltd NVMe SSD Controller 171X (rev 03)

47:00.0 非易失性存储器控制器:Samsung Electronics Co Ltd NVMe SSD Controller 171X (rev 03)


 B) 将会列出插槽 id,如下所示 [图 1]。这里的“45:00.0”和“47:00.0”是驱动器所连接到的插槽。

lspci 列出插槽 id
图 1:lspci 列出插槽 id

a) 使用插槽 id 并使用以下 lspci 选项,获得设备详细信息、功能和相应的驱动程序

[root@localhost ~]# lspci -s 45:00.0 -v

45:00.0 非易失性存储器控制器:Samsung Electronics Co Ltd NVMe SSD Controller 171X (rev 03) (prog-if 02)

     子系统:Dell Express Flash NVMe XS1715 SSD 800GB

     物理插槽:25

     标志:总线主控、快速 devsel、延迟 0、IRQ 76

     Memory at d47fc000 (64-bit, non-prefetchable) [size=16K]

     功能:[c0] 电源管理版本 3

     功能:[c8] MSI:启用- 计数=1/32 Maskable+ 64bit+

     功能:[e0] MSI-X:启用+ 计数=129 Masked-

     功能:[70] Express 端点,MSI 00

     功能:[40] 供应商特定信息:Len=24

     功能:[100] 高级错误报告

     功能:[180] #19

     功能:[150] 供应商特定信息:ID=0001 Rev=1 Len=02c

     正在使用的内核驱动程序:nvme

 

下面的 [图 2] 显示三星 NVMe 设备和列出的设备详细信息。它还显示驱动程序的名称,在本例中此设备为“nvme”

lspci 列出 NVMe 设备详细信息
图 2:lspci 列出 NVMe 设备详细信息

检查 MaxPayLoad

通过执行以下命令来检查 MaxPayload 值。应将其设置为 256 个字节 [图 3]

[root@localhost home]#  lspci | grep -i Samsung

45:00.0 非易失性存储器控制器:Samsung Electronics Co Ltd NVMe SSD Controller 171X (rev 03) 

[root@localhost home]# lspci -vvv -s 45:00.0


MaxPayload 设置为 256 个字节
图 3:MaxPayload 设置为 256 个字节


NVMe 驱动程序:列出驱动程序信息

1) 使用 modinfo 命令列出驱动程序详细信息

[root@localhost ~]# modinfo nvme

文件名:    /lib/modules/3.10.0-123.el7.x86_64/extra/nvme/nvme.ko

版本:    0.8-dell1.17

许可证:    GPL

作者:    Samsung Electronics Corporation

srcversion:    AB81DD9D63DD5DADDED9253

别名:     pci:v0000144Dd0000A820sv*sd*bc*sc*i*

取决:     

vermagic:     3.10.0-123.el7.x86_64 SMP mod_unload modversions

parm:       nvme_major:int

parm:       use_threaded_interrupts:int 


下面的 [图 4] 显示 NVMe 驱动程序 nvme.ko 的详细信息 

Modinfo 列出驱动程序信息
图 4:Modinfo 列出驱动程序信息 
 

NVMe 设备节点和命名约定

1) cat  /proc/partitions 显示 nvme 的设备节点。

a) 以下命令运行后,列出的 nvme 设备为 nvme0n1 和 nvme1n1

[root@localhost ~]# cat /proc/partitions

主要 次要 模块号 名称 

 259     0  781412184 nvme0n1

  8     0 1952448512 sda

  8     1    512000 sda1

  8     2 1951935488 sda2

  11     0   1048575 sr0

 253     0   52428800 dm-0

 253     1   16523264 dm-1

 253     2 1882980352 dm-2

259    3  390711384 nvme1n1 


使用任何分区工具(fdisk、parted)对设备进行分区

b) 再次执行以下命令,列出 nvme 设备以及分区

[root@localhost ~]# cat /proc/partitions

主要 次要 模块号 名称 

 259     0  781412184 nvme0n1

 259     1  390705068 nvme0n1p1

 259     2  390706008 nvme0n1p2

  8     0 1952448512 sda

  8     1    512000 sda1

  8     2 1951935488 sda2

  11     0   1048575 sr0

 253     0   52428800 dm-0

 253     1   16523264 dm-1

 253     2 1882980352 dm-2

 259     3  390711384 nvme1n1

 259     4  195354668 nvme1n1p1

 259     5  195354712 nvme1n1p2 

 

命名约定:

下面的 [图 5] 说明设备节点的命名约定 

紧随字符串“nvme”之后的数字是设备编号

示例:

nvme0n1 - 这里的设备编号为 0

分区使用前缀“p”追加在设备名称后面 

示例:

nvme0n1p1 - 分区 1

nvme1n1p2 - 分区 2 

示例:

nvme0n1p1 - 设备 0 的分区 1

nvme0n1p2 - 设备 0 的分区 2

nvme1n1p1 - 设备 1 的分区 1

nvme1n1p2 - 设备 1 的分区 2  

设备节点命名约定
图 5:设备节点命名约定


格式化为 xfs 和挂载设备

1) 以下命令将设备 1 上的 nvme 分区 1 格式化为 xfs 

[root@localhost ~]# mkfs.xfs /dev/nvme1n1p1

meta-data=/dev/nvme1n1p1      isize=256   agcount=4, agsize=12209667 blks

     =             sectsz=512   attr=2, projid32bit=1

     =             crc=0

data    =             bsize=4096   blocks=48838667, imaxpct=25

     =             sunit=0    swidth=0 blks

naming   =version 2        bsize=4096   ascii-ci=0 ftype=0

log    =internal log       bsize=4096   blocks=23847, version=2

     =             sectsz=512   sunit=0 blks, lazy-count=1

realtime =none           extsz=4096   blocks=0, rtextents=0 


2) 将设备挂载到挂载点并同样列出 

[root@localhost ~]# mount /dev/nvme1n1p1 /mnt/

[root@localhost ~]# mount | grep -i nvme

/dev/nvme1n1p1 on /mnt type xfs (rw,relatime,seclabel,attr2,inode64,noquota) 


使用 ledmon 实用程序管理 NVMe 设备的背板 LED 指示灯

Ledmon 和 ledctl 是 Linux 的两个实用程序,可用来控制驱动器背板上的 LED 状态。  通常,驱动器背板 LED 指示灯由硬件 RAID 控制器 (PERC) 控制,但是在 Linux 上使用软件 RAID (mdadm) 控制 NVMe PCIE SSD 时,ledmon 守护程序将会监视驱动器阵列的状态,并更新驱动器 LED 指示灯的状态。

如需额外阅读,请检查以下链接 https://www.dell.com/support/article/SLN310523/



安装和使用 ledmon/ledctl 实用程序

1) 安装 OpenIPMI 和 ledmon/ledctl 实用程序:

执行以下命令,安装 OpenIPMI 和 ledmon

[root@localhost ~]# yum install OpenIPMI

[root@localhost ~]# yum install  ledmon-0.79-3.el7.x86_64.rpm 


2) 使用 ledmod/ledctl 实用程序 

同时运行 ledctl 和 ledmon,ledmon 最终将覆盖 ledctl 设置

a) 使用以下命令,启动 ipmi 并检查其状态,如 [图 6] 所示

[root@localhost ~]# systemctl start ipmi

IPMI 启动和状态

图 6:
IPMI 启动和状态
 

a) 启动 ledmod

[root@localhost ~]# ledmon

b) [图 7] 显示执行 ledmon 后的 LED 指示灯状态,反映设备的工作状态


运行 ledmon 后反映设备工作状态的 LED 指示灯状态(绿色)
图 7:
运行 ledmon 后反映设备工作状态的 LED 指示灯状态(绿色)  

a) 下面的命令将使 [设备节点 /dev/nvme0n1 上] 驱动器 LED 指示灯闪烁

[root@localhost ~]# ledctl locate=/dev/nvme0n1

下面的命令将使 [设备节点 /dev/nvme0n1 和 /dev/nvme1n1 上] 驱动器 LED 指示灯闪烁

[root@localhost ~]# ledctl locate={ /dev/nvme0n1 /dev/nvme1n1 }

       下面的命令将使特定的 LED 熄灭

[root@localhost ~]# ledctl locate_off=/dev/nvme0n1





文章ID: SLN312382

上次修改日期: 2019/09/20 23:32

评价此文章

准确性
有用性
易理解性
这篇文章对您有帮助吗?
0/3000 characters
请提供评级(1-5星)。
请提供评级(1-5星)。
请提供评级(1-5星)。
请选择这篇文章是否有帮助。
注释中不得包含以下特殊字符:<>()\
剩余字符数。