NVMe 在 Linux 下能工作吗?

如果你还没注意到,一些极速的固态磁盘技术已经可以用在 Linux 和其他操作系统上了。

NVMe 意即非易失性内存主机控制器接口规范non-volatile memory express,它是一个主机控制器接口和存储协议,用于加速企业和客户端系统以及固态驱动器(SSD)之间的数据传输。它通过电脑的高速 PCIe 总线工作。每当我看到这些名词时,我的感受是“羡慕”。而羡慕的原因很重要。

使用 NVMe,数据传输的速度比旋转磁盘快很多。事实上,NVMe 驱动能够比 SATA SSD 快 7 倍。这比我们今天很多人用的固态硬盘快了 7 倍多。这意味着,如果你用一个 NVMe 驱动盘作为启动盘,你的系统能够启动的非常快。事实上,如今任何人买一个新的系统可能都不会考虑那些没有自带 NVMe 的,不管是服务器或者个人电脑。

是的!NVMe 自 Linux 内核 3.3 版本就支持了。然而,要升级系统,通常同时需要一个 NVMe 控制器和一个 NVMe 磁盘。一些外置磁盘也行,但是要连接到系统上,需要的可不仅仅是通用的 USB 接口。

先使用下列命令检查内核版本:

$ uname -r
5.0.0-15-generic

如果你的系统已经用了 NVMe,你将看到一个设备(例如,/dev/nvme0),但是只有在你安装了 NVMe 控制器的情况下才显示。如果你没有 NVMe 控制器,你可以用下列命令获取使用 NVMe 的相关信息。

$ modinfo nvme | head -6
filename:       /lib/modules/5.0.0-15-generic/kernel/drivers/nvme/host/nvme.ko
version:        1.0
license:        GPL
author:         Matthew Wilcox 
srcversion:     AA383008D5D5895C2E60523
alias:          pci:v0000106Bd00002003sv*sd*bc*sc*i*

via: https://www.networkworld.com/article/3397006/nvme-on-linux.html

作者:Sandra Henry-Stocker 选题:lujun9972 译者:warmfrog 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

Linux平台上发送NVMe命令可以通过多种方式实现,主要包括使用命令行工具和编写程序调用NVMe驱动程序的API。以下是几种常见的方法: ### 1. 使用`nvme-cli`工具 `nvme-cli`是一个用于管理和调试NVMe设备的命令行工具。通过它可以发送各种NVMe命令。 **安装`nvme-cli`工具:** ```bash sudo apt-get install nvme-cli ``` **常用命令示例:** - 查看NVMe设备列表: ```bash sudo nvme list ``` - 查看NVMe设备日志: ```bash sudo nvme error-log /dev/nvme0 ``` ### 2. 使用`ioctl`系统调用 `ioctl`系统调用可以用于与设备驱动程序进行交互。NVMe驱动程序通常提供一组`ioctl`命令用于发送NVMe命令。 **示例代码(C语言):** ```c #include <fcntl.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/ioctl.h> #include <linux/nvme_ioctl.h> int main() { int fd = open("/dev/nvme0", O_RDWR); if (fd < 0) { perror("Failed to open /dev/nvme0"); return 1; } struct nvme_passthru_cmd cmd; memset(&cmd, 0, sizeof(cmd)); cmd.opcode = 0x06; // Example opcode cmd.nsid = 1; cmd.addr = (uint64_t)malloc(4096); cmd.data_len = 4096; cmd.iovec_count = 0; cmd.flags = 0; cmd.metadata = 0; cmd.metadata_len = 0; cmd.timeout = 0; if (ioctl(fd, NVME_IOCTL_IO_CMD, &cmd) < 0) { perror("ioctl failed"); close(fd); return 1; } printf("NVMe command sent successfully\n"); close(fd); return 0; } ``` ### 3. 使用`libnvme`库 `libnvme`是一个用于与NVMe设备进行交互的库,提供了更高层次的接口。 **示例代码(C语言):** ```c #include <libnvme.h> #include <stdio.h> #include <stdlib.h> int main() { struct nvme_dev *dev = nvme_connect("0000:01:00.0"); if (!dev) { perror("Failed to connect to NVMe device"); return 1; } struct nvme_cmd cmd; memset(&cmd, 0, sizeof(cmd)); cmd.opcode = 0x06; // Example opcode cmd.nsid = 1; cmd.addr = (uint64_t)malloc(4096); cmd.data_len = 4096; cmd.cdw[0] = 0; cmd.cdw[1] = 0; cmd.cdw[2] = 0; cmd.cdw[3] = 0; struct nvme_req req; memset(&req, 0, sizeof(req)); req.cmd = &cmd; req.buf = malloc(4096); req.len = 4096; req.status = 0; if (nvme_submit_sync(dev, &req) < 0) { perror("nvme_submit_sync failed"); nvme_disconnect(dev); return 1; } printf("NVMe command sent successfully\n"); nvme_disconnect(dev); return 0; } ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值