從 QNAP TR-004 DAS 匯出硬碟資訊到文字檔?

嗨~想問一下,有沒有什麼方法可以把 TR-004 裡硬碟的詳細資訊,特別是「型號」跟「序號」,一次輸出到檔案裡啊?
最好是能直接存成一個文字檔,省得我自己一顆一顆去抄~

請問TR-004是接在 Windows 上還是 NAS 上呢?

nas上喔,公司會利用其他endpoint管理軟體,將相關設備的磁碟集中納管,如果銜接在nas上的TR裝備裡的硬碟也能簡單被匯出成csv檔,匯入到該endpoint軟體裡就會方便很多,如果能支援的話就太棒了

目前應該是沒有直接提供介面,但如果你能操作 ssh 的話應該會比較簡單,我手邊沒有 TR-004,方便的話可以先試一下以下命令

[qnap@NAS ~]$ qcli_storage -d                    
Enclosure  Port  Sys_Name          Type      Size      Alias                 Signature   Partitions  Model  
NAS_HOST   3     /dev/sdd          HDD:data  7.28 TB   3.5" SATA HDD 1       --          5           Seagate ST8000VX010-2ZR188
NAS_HOST   4     /dev/sdc          HDD:data  7.28 TB   3.5" SATA HDD 2       --          5           Seagate ST8000VX010-2ZR188
NAS_HOST   5     /dev/sdb          HDD:data  7.28 TB   3.5" SATA HDD 3       --          5           Seagate ST8000VX010-2ZR188
NAS_HOST   6     /dev/sda          HDD:data  7.28 TB   3.5" SATA HDD 4       --          5           Seagate ST8000VX010-2ZR188

理論上你可以看到 Enclosure 屬於 TR-004 的硬碟

然後可以看到類似這樣的資訊

sudo hdparm -i /dev/sdX |grep Model
Model=ST8000VX010-2ZR188                      , FwRev=CV10    , SerialNo=            WPVXXXX4

/dev/sdX 自己用 TR-004 的硬碟取代
如果需要稍微整理成 CSV 的話應該可以用 bash 或者 python 做成 script

如果不需要整理,只是要變成文字檔方便複製的話,可以這樣:

sudo hdparm -i /dev/sdX |grep Model >> /share/Public/hdd.txt

如果需要做成 script 的話我需要看到有 TR-004 的NAS,收到上述指令後的輸出才能想該怎麼轉換

實際上借到了一台 TR-004 ,看過輸出後整理為 script 如下,你需要將這個 script 放到 NAS 用ssh介面執行,也可以依照需求自己修改

使用方式

加上 --csv 代表輸出成 CSV 檔案,會在同一個資料夾。
不加 enc 數字參數時,會列出NAS上所有的磁碟

複製以下內容,存成 hdd_id.sh 後,記得 chmod +x 才能執行

#!/bin/sh
# Usage:
#   ./hdd_id.sh               # all enclosures, tab-separated (to stdout)
#   ./hdd_id.sh --csv         # all enclosures, write to <HOST>-<YYYYMMDD>-DiskList.csv
#   ./hdd_id.sh 1             # only enc_id=1, tab-separated
#   ./hdd_id.sh --csv 1       # only enc_id=1, write to <HOST>-<YYYYMMDD>-DiskList.csv

# Parse options
CSV=0
if [ "$1" = "--csv" ]; then
  CSV=1
  shift
fi

# Build enclosure list
if [ -n "$1" ]; then
  ENC_LIST="$1"
else
  ENC_LIST=$(hal_app --se_enum 2>/dev/null | awk '
    /^=/{next}
    NF==0{next}
    /(^|[[:space:]])enc_id($|[[:space:]])/ { hdr=1; next }
    hdr && $1 ~ /^[0-9]+$/ { print $1 }
  ' | sort -n | uniq)
fi

[ -z "$ENC_LIST" ] && { echo "No enclosure enc_id found."; exit 1; }

# Prepare output file name in CSV mode using uname -n and date
OUTFILE=""
DELIM="\t"
if [ $CSV -eq 1 ]; then
  HOSTNAME=$(uname -n 2>/dev/null)
  [ -z "$HOSTNAME" ] && HOSTNAME="NAS"
  DATESTR=$(date +%Y%m%d)
  OUTFILE="${HOSTNAME}-${DATESTR}-DiskList.csv"
  DELIM="," 
  echo "Enclosure,Slot,Brand,Model,Serial" > "$OUTFILE"
fi

for ENC in $ENC_LIST; do
  NAME=$(hal_app --se_get_jbod_display_name enc_id=$ENC 2>/dev/null)
  [ -z "$NAME" ] && NAME="ENC_${ENC}"

  # Enumerate disks for this enclosure and print Brand, Model, Serial per slot
  hal_app --pd_enum enc_id=$ENC 2>/dev/null | awk -v name="$NAME" -v D="$DELIM" -v csv="$CSV" -v out="$OUTFILE" '
    /^=/{next}
    NF==0{next}
    # Capture header indexes once
    !hdr && /(^|[[:space:]])port_id($|[[:space:]])/ && /vendor/ && /model/ && /serial_no/ {
      for(i=1;i<=NF;i++){
        if($i=="port_id")    pid=i
        if($i=="vendor")     bid=i   # Brand
        if($i=="model")      mid=i
        if($i=="serial_no")  sid=i
      }
      hdr=1; next
    }
    # Data rows: first field is numeric (port_id)
    hdr && $1 ~ /^[0-9]+$/ && pid>0 && bid>0 && mid>0 && sid>0 {
      line = name D $(pid) D $(bid) D $(mid) D $(sid)
      if (csv==1) {
        print line >> out
      } else {
        print line
      }
    }
  '
done