Friday, September 20, 2024

Tra cứu thông tin ổ cứng NVME với nvme-cli

-

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.

LEAVE A REPLY

Please enter your comment!
Please enter your name here

4,956FansLike
256FollowersFollow
223SubscribersSubscribe
spot_img

Related Stories