Tổng quan.
Để hiển thị thông tin về NVMe trên server có thể bạn sẽ không dùng các lệnh thông thường để lấy được, vì vậy giải pháp thay thế là bạn có thể sử dụng công cụ nvme-cli
thay vì lshw
, vì lshw
có thể không hiển thị đầy đủ thông tin về các ổ NVMe. nvme-cli
là một công cụ dòng lệnh được thiết kế để làm việc với các thiết bị NVMe. Dưới đây là cách bạn có thể sử dụng nvme-cli
để lấy thông tin về các ổ NVMe, bao gồm số serial và các thông tin khác.
Cài đặt nvme-cli
(nếu chưa có).
Trên hệ điều hành dựa trên Debian/Ubuntu hãy cập nhật danh sách gói phần mềm, điều này sẽ đảm bảo rằng bạn có thông tin mới nhất về các gói phần mềm và phiên bản của chúng từ các kho lưu trữ.
sudo apt-get update
Cài đặt nvme-cli.
sudo apt-get install nvme-cli
Trên hệ điều hành dựa trên Red Hat/CentOS bạn có thể sử dụng lệnh sudo yum install nvme-cli
Cách sử dụng lệnh.
Sử dụng lệnh nvme list
để liệt kê tất cả các ổ NVMe có trong hệ thống. Lệnh này sẽ cung cấp một bảng tổng quan về các ổ, bao gồm cả số serial.
shell> nvme list
Node SN Model Namespace Usage Format FW Rev
--------------------- -------------------- ---------------------------------------- --------- -------------------------- ---------------- --------
/dev/nvme0n1 S6CRNA0T716138 Dell Ent NVMe v2 AGN MU U.2 3.2TB 1 3.20 TB / 3.20 TB 512 B + 0 B 2.3.0
/dev/nvme1n1 S6CRNA0T716150 Dell Ent NVMe v2 AGN MU U.2 3.2TB 1 3.20 TB / 3.20 TB 512 B + 0 B 2.3.0
/dev/nvme2n1 S6CRNA0T716140 Dell Ent NVMe v2 AGN MU U.2 3.2TB 1 3.20 TB / 3.20 TB 512 B + 0 B 2.3.0
/dev/nvme3n1 S6CRNA0T716148 Dell Ent NVMe v2 AGN MU U.2 3.2TB 1 3.20 TB / 3.20 TB 512 B + 0 B 2.3.0
/dev/nvme4n1 S6CRNA0T716141 Dell Ent NVMe v2 AGN MU U.2 3.2TB 1 3.20 TB / 3.20 TB 512 B + 0 B 2.3.0
/dev/nvme5n1 S6CRNA0T716149 Dell Ent NVMe v2 AGN MU U.2 3.2TB 1 3.20 TB / 3.20 TB 512 B + 0 B 2.3.0
/dev/nvme6n1 S6CRNA0T716139 Dell Ent NVMe v2 AGN MU U.2 3.2TB 1 3.20 TB / 3.20 TB 512 B + 0 B 2.3.0
/dev/nvme7n1 S6CRNA0T716147 Dell Ent NVMe v2 AGN MU U.2 3.2TB 1 3.20 TB / 3.20 TB 512 B + 0 B 2.3.0
Hoặc nếu bạn muốn in ra định dạng json, hãy thêm tham số -o json vào.
shell> nvme list -o json
{
{
"NameSpace" : 1,
"DevicePath" : "/dev/nvme4n1",
"Firmware" : "2.3.0",
"Index" : 4,
"ModelNumber" : "Dell Ent NVMe v2 AGN MU U.2 3.2TB",
"ProductName" : "Non-Volatile memory controller: Samsung Electronics Co Ltd VMe SSD Controller PM173X Ent NVMe v2 AGN MU U.2 3.2TB",
"SerialNumber" : "S6CRNA0T716141",
"UsedBytes" : 3200631791616,
"MaximumLBA" : 6251233968,
"PhysicalSize" : 3200631791616,
"SectorSize" : 512
},
{
"NameSpace" : 1,
"DevicePath" : "/dev/nvme5n1",
"Firmware" : "2.3.0",
"Index" : 5,
"ModelNumber" : "Dell Ent NVMe v2 AGN MU U.2 3.2TB",
"ProductName" : "Non-Volatile memory controller: Samsung Electronics Co Ltd VMe SSD Controller PM173X Ent NVMe v2 AGN MU U.2 3.2TB",
"SerialNumber" : "S6CRNA0T716149",
"UsedBytes" : 3200631791616,
"MaximumLBA" : 6251233968,
"PhysicalSize" : 3200631791616,
"SectorSize" : 512
},
{
"NameSpace" : 1,
"DevicePath" : "/dev/nvme6n1",
"Firmware" : "2.3.0",
"Index" : 6,
"ModelNumber" : "Dell Ent NVMe v2 AGN MU U.2 3.2TB",
"ProductName" : "Non-Volatile memory controller: Samsung Electronics Co Ltd VMe SSD Controller PM173X Ent NVMe v2 AGN MU U.2 3.2TB",
"SerialNumber" : "S6CRNA0T716139",
"UsedBytes" : 3200631791616,
"MaximumLBA" : 6251233968,
"PhysicalSize" : 3200631791616,
"SectorSize" : 512
},
{
"NameSpace" : 1,
"DevicePath" : "/dev/nvme7n1",
"Firmware" : "2.3.0",
"Index" : 7,
"ModelNumber" : "Dell Ent NVMe v2 AGN MU U.2 3.2TB",
"ProductName" : "Non-Volatile memory controller: Samsung Electronics Co Ltd VMe SSD Controller PM173X Ent NVMe v2 AGN MU U.2 3.2TB",
"SerialNumber" : "S6CRNA0T716147",
"UsedBytes" : 3200631791616,
"MaximumLBA" : 6251233968,
"PhysicalSize" : 3200631791616,
"SectorSize" : 512
}
]
}
Để lấy thông tin chi tiết hơn về một ổ NVMe cụ thể, sử dụng lệnh nvme show-regs <device>
, thay <device>
bằng định danh thiết bị của ổ NVMe, ví dụ: /dev/nvme0n1
.
Để lấy thông tin chi tiết về namespace của một ổ NVMe, sử dụng lệnh nvme id-ns <device> -n <namespace>
, thay <device>
và <namespace>
tương ứng.
Automation với Python.
Hàm dưới đây sẽ lấy thông tin đơn giản của NVME.
Dưới đây là một ví dụ về cách bạn có thể tích hợp nvme-cli
vào mã Python để tự động hóa việc lấy thông tin NVMe:
import subprocess
import json
def get_nvme_info():
try:
result = subprocess.run(['nvme', 'list', '-o', 'json'], capture_output=True, text=True)
nvme_list = json.loads(result.stdout)
for device in nvme_list['Devices']:
print(f"Device Path: {device['DevicePath']}")
print(f"Serial Number: {device['SerialNumber']}")
print(f"Model Number: {device['ModelNumber']}")
print(f"Firmware Version: {device['Firmware']}")
print("-----")
except Exception as e:
print(f"Error getting NVMe information: {e}")
get_nvme_info()
Lưu ý rằng bạn cần cài đặt nvme-cli
và có quyền truy cập vào các thiết bị NVMe trên hệ thống của mình để sử dụng đoạn code này.
shell> python3 nvme.detail.py
Device Path: /dev/nvme0n1
Serial Number: S6CRNA0T716138
Model Number: Dell Ent NVMe v2 AGN MU U.2 3.2TB
Firmware Version: 2.3.0
-----
Device Path: /dev/nvme1n1
Serial Number: S6CRNA0T716150
Model Number: Dell Ent NVMe v2 AGN MU U.2 3.2TB
Firmware Version: 2.3.0
-----
Device Path: /dev/nvme2n1
Serial Number: S6CRNA0T716140
Model Number: Dell Ent NVMe v2 AGN MU U.2 3.2TB
Firmware Version: 2.3.0
-----
Device Path: /dev/nvme3n1
Serial Number: S6CRNA0T716148
Model Number: Dell Ent NVMe v2 AGN MU U.2 3.2TB
Firmware Version: 2.3.0
-----
Device Path: /dev/nvme4n1
Serial Number: S6CRNA0T716141
Model Number: Dell Ent NVMe v2 AGN MU U.2 3.2TB
Firmware Version: 2.3.0
-----
Device Path: /dev/nvme5n1
Serial Number: S6CRNA0T716149
Model Number: Dell Ent NVMe v2 AGN MU U.2 3.2TB
Firmware Version: 2.3.0
-----
Device Path: /dev/nvme6n1
Serial Number: S6CRNA0T716139
Model Number: Dell Ent NVMe v2 AGN MU U.2 3.2TB
Firmware Version: 2.3.0
-----
Device Path: /dev/nvme7n1
Serial Number: S6CRNA0T716147
Model Number: Dell Ent NVMe v2 AGN MU U.2 3.2TB
Firmware Version: 2.3.0
-----
Hàm dưới đây sẽ lấy thông tin SerialNumber
của NVME.
Code này sẽ nhận một tên thiết bị (device_name
) làm tham số và chỉ in ra SerialNumber
của thiết bị đó, bạn có thể thực hiện như sau:
Bước 1: Gọi lệnh và nhận dữ liệu.
import subprocess
import json
import sys
def get_nvme_data():
try:
result = subprocess.run(['nvme', 'list', '-o', 'json'], capture_output=True, text=True, check=True)
data = json.loads(result.stdout)
return data
except subprocess.CalledProcessError as e:
print(f"Error calling nvme list: {e}")
return None
Bước 2: Viết hàm trích xuất SerialNumber
.
Hàm extract_serial_number_by_device_name
được thiết kế để nhận thêm một tham số device_name
. Hàm này sẽ duyệt qua danh sách các thiết bị và so sánh DevicePath
của mỗi thiết bị với device_name
được truyền vào. Nếu tìm thấy thiết bị phù hợp, hàm sẽ trả về SerialNumber
của thiết bị đó. Nếu không tìm thấy thiết bị nào có DevicePath
khớp với device_name
, hàm sẽ in ra thông báo và trả về None
.
Bước 3: Gọi các hàm và in kết quả.
device_name = f"/dev/{sys.argv[1]}"
nvme_data = get_nvme_data()
serial_number = extract_serial_number_by_device_name(nvme_data, device_name)
if serial_number:
print(f"SerialNumber for {device_name}: {serial_number}")
Đây là đoạn code đẩy đủ.
import subprocess
import json
import sys
def get_nvme_data():
try:
result = subprocess.run(['nvme', 'list', '-o', 'json'], capture_output=True, text=True, check=True)
data = json.loads(result.stdout)
return data
except subprocess.CalledProcessError as e:
print(f"Error calling nvme list: {e}")
return None
def extract_serial_number_by_device_name(data, device_name):
if data is None or 'Devices' not in data:
print("No data available to extract SerialNumber.")
return None
for device in data['Devices']:
if 'DevicePath' in device and device['DevicePath'] == device_name:
return device.get('SerialNumber', None)
print(f"No device found with the name {device_name}.")
return None
device_name = f"/dev/{sys.argv[1]}"
nvme_data = get_nvme_data()
serial_number = extract_serial_number_by_device_name(nvme_data, device_name)
if serial_number:
print(f"SerialNumber for {device_name}: {serial_number}")
Kết quả.
shell> python3 nvme.detail.py nvme1n1
SerialNumber for /dev/nvme1n1: S6CRNA0T716150
Tài liệu tham khảo https://www.51cto.com/article/683585.html.