USB 外接盒、外接硬碟櫃拿來放備份或冷資料很方便,但要檢查裡面硬碟的健康狀態時,常常會發現 smartctl -a /dev/sdc 什麼都讀不到。原因是中間隔了一顆 USB 轉 SATA 橋接晶片,smartctl 預設不知道怎麼穿過它跟硬碟對話。
這篇以常見的 JMicron(智微) 晶片為例,整理讀取 SMART 的方法,以及讀不到完整資料時可以嘗試的參數。
先確認橋接晶片
lsusb
Bus 002 Device 003: ID 152d:0578 JMicron Technology Corp. / JMicron USA Technology Corp. JMS578 SATA 6Gb/s
152d 是 JMicron 的 USB 廠商 ID,後面的 0578 是晶片型號(JMS578)。常見的還有 0567(JMS567)、0583(JMS583,這顆是 USB 轉 NVMe)。
也可以讓 smartctl 自己偵測:
smartctl --scan-open
新版 smartmontools 內建 USB 橋接晶片資料庫,很多晶片會自動選對類型,選不到才需要手動指定。
使用 -d sat
大部分新的 JMicron 晶片都支援標準的 SAT(SCSI/ATA Translation)指令轉送,加上 -d sat 就能讀:
smartctl -a -d sat /dev/sdc
實際在一台 PVE 主機上,讀一顆接在 JMicron 外接盒裡的 Toshiba 4 TB 硬碟:
=== START OF INFORMATION SECTION ===
Device Model: TOSHIBA HDWG440
Firmware Version: 1000
User Capacity: 4,000,787,030,016 bytes [4.00 TB]
Sector Size: 512 bytes logical/physical
SMART support is: Available - device has SMART capability.
SMART support is: Enabled
=== START OF READ SMART DATA SECTION ===
SMART overall-health self-assessment test result: PASSED
SMART Error Log not supported
SMART Self-test Log not supported
型號、容量、整體健康狀態都讀到了,-d sat 確實有作用。
讀不到完整資料的狀況
仔細看會發現少了最重要的 SMART 屬性表(重新配置磁區數、待處理磁區、溫度、通電時數等),錯誤記錄、自我測試記錄也都是 not supported。改用 -x 讀延伸資訊:
smartctl -x -d sat /dev/sdc
Read SMART Log Directory failed: SAT command failed
General Purpose Log Directory not supported
SCT Commands not supported
Device Statistics (GP/SMART Log 0x04) not supported
一樣讀不到。硬碟本身當然支援這些功能,是這顆橋接晶片(或它的韌體)只轉送了部分指令。這種情況下 PASSED 只能當參考,看不到屬性表就無法提早發現磁區開始損壞的跡象。
可以嘗試的參數
依序試以下幾種,找出這個外接盒能讀到最多資訊的組合:
# 1. 改用 12 位元組的 SAT 指令(預設是 16)
smartctl -a -d sat,12 /dev/sdc
# 2. 舊式 JMicron 專用的轉送方式
smartctl -a -d usbjmicron /dev/sdc
# 3. 雙槽外接盒,指定第幾個埠(0 或 1)
smartctl -a -d usbjmicron,0 /dev/sdc
smartctl -a -d usbjmicron,1 /dev/sdc
# 4. 某些指令失敗時仍繼續讀其他項目
smartctl -a -d sat -T permissive /dev/sdc
注意:smartctl 官方說明特別提醒,-d usbjmicron,x(啟用 48 位元指令)在不支援的晶片上會造成 I/O 錯誤,甚至讓硬碟斷線;指定不存在的埠號也一樣。外接盒裡如果是正在寫入的資料碟,請在沒有讀寫時再測試。
外接硬碟櫃
多槽的外接硬碟櫃,內部常用 port multiplier(例如 JMB575)把多顆硬碟接到一個橋接晶片上。這種架構下每顆硬碟會出現成獨立的 /dev/sdX,不用指定埠號,一顆一顆用 -d sat 讀即可:
for d in /dev/sd[c-f]; do
echo "== $d"
smartctl -i -H -d sat "$d" | grep -E 'Device Model|Serial|result'
done
如果是硬體 RAID 模式的外接櫃,硬碟會被包成一個邏輯磁碟,smartctl 通常讀不到個別硬碟,只能用廠商的管理工具。
USB 轉 NVMe
JMS583 這類 USB 轉 NVMe 的晶片,要改用 -d sntjmicron:
smartctl -a -d sntjmicron /dev/sdc
確認讀到的資料可不可信
讀到屬性表之後,可以做個簡單的自我測試,確認指令真的有送到硬碟:
smartctl -t short -d sat /dev/sdc
# 等約 2 分鐘
smartctl -l selftest -d sat /dev/sdc
如果自我測試記錄有出現剛才那筆,代表這個外接盒可以完整轉送 SMART 指令;如果一直顯示 not supported,就要接受這個外接盒只能看到基本健康狀態。
讓 smartd 自動監控
確定可用的參數後,可以寫進 /etc/smartd.conf,讓 smartd 定期檢查並寄信通知:
/dev/disk/by-id/usb-TOSHIBA_HDWG440_xxxxxxxxxxxx-0:0 -d sat -a -o on -S on -s (S/../.././02) -m admin@example.com
USB 裝置重新插拔後代號(/dev/sdc)可能會變,務必用 /dev/disk/by-id/ 的路徑。
選購外接盒的建議
如果外接盒是要長期放資料用,選購時可以注意:
- 選擇支援 UASP 與完整 SAT 轉送的晶片,購買前可以查 smartmontools 的 USB 裝置支援清單
- 外接櫃避免選只能用硬體 RAID 模式的,選擇 JBOD(每顆獨立)的才能個別監控
- 重要資料不要只放在單一外接硬碟上,外接盒本身也可能故障
結論
USB 外接盒讀 SMART,第一步就是加 -d sat;讀不到屬性表的話,再依序試 sat,12、usbjmicron。像這次這顆只回報 PASSED、看不到屬性表的情況,就要知道這個健康狀態的參考價值有限,重要資料還是要靠多份備份來保護。
參考資料
- smartmontools:smartctl(8) 手冊
https://www.smartmontools.org/browser/trunk/smartmontools/smartctl.8.in - smartmontools:USB 裝置支援清單
https://www.smartmontools.org/wiki/Supported_USB-Devices - smartmontools 原始碼(GitHub 鏡像)
https://github.com/smartmontools/smartmontools



