什麼可以防止 linux ahci 中的 hdd 熱插拔?
我正在為這個問題撕扯頭髮。
我想在我的家庭伺服器上添加一個熱插拔托架,以便輕鬆添加和移除 HDD,例如輕鬆輪換異地備份。有問題的主機板是帶有四個本機 SATA 埠的 Asrock J4105-ITX 主機板,這些埠分為 ASM1062 和英特爾處理器 SATA 控制器。兩者都可以正常工作並使用
ahci
核心模組。BIOS 中有一個熱插拔選項,但似乎沒有效果。如果驅動器斷開連接(通過
echo 1 > /sys/block/sdX/device/delete
或粗魯地移除驅動器),重新連接後將無法辨識新設備。我嘗試強制重新掃描 (echo "- - -" > /sys/class/scsi_host/host<n>/scan
) 但無濟於事,SATA 埠實際上在下次重新啟動之前不再可用。我還嘗試了一些更極端的命令,但沒有任何運氣:echo 1 > /sys/class/scsi_device/2:0:0:0/device/reset echo 1 > /sys/devices/pci0000:00/0000:00:1f.2/rescan echo 1 > /sys/devices/pci0000:00/0000:00:1f.2/reset
(取自如何讓 Linux 辨識我在不重新啟動的情況下熱插拔的新 SATA /dev/sda 驅動器?)
“好吧,可能是晶片組不支持熱插拔或者BIOS壞了。” 所以我訂購了兩個 PCIe SATA 控制器(一個使用 ASM1064,另一個使用 Marvell 88SE9215)。兩者都表現出相同的問題,儘管其他買家表示熱插拔適用於他們,所以我猜這個問題要麼與軟體有關(我的安裝?我正在執行 Arch OS,它會盡職盡責地保持最新狀態)。
一些希望有用的資訊:
$ uname -a Linux servername 5.14.14-arch1-1 #1 SMP PREEMPT Wed, 20 Oct 2021 21:35:18 +0000 x86_64 GNU/Linux $ dmesg | grep ahci [ 0.447450] ahci 0000:00:12.0: version 3.0 [ 0.447842] ahci 0000:00:12.0: SSS flag set, parallel bus scan disabled [ 0.457970] ahci 0000:00:12.0: AHCI 0001.0301 32 slots 2 ports 6 Gbps 0x3 impl SATA mode [ 0.457981] ahci 0000:00:12.0: flags: 64bit ncq sntf stag pm clo only pmp pio slum part sxs deso sadm sds apst [ 0.458750] scsi host0: ahci [ 0.459204] scsi host1: ahci [ 0.469788] ahci 0000:01:00.0: AHCI 0001.0000 32 slots 4 ports 6 Gbps 0xf impl SATA mode [ 0.469801] ahci 0000:01:00.0: flags: 64bit ncq sntf led only pmp fbs pio slum part sxs [ 0.470767] scsi host2: ahci [ 0.471203] scsi host3: ahci [ 0.471562] scsi host4: ahci [ 0.471904] scsi host5: ahci [ 0.472341] ahci 0000:04:00.0: SSS flag set, parallel bus scan disabled [ 0.472376] ahci 0000:04:00.0: AHCI 0001.0200 32 slots 2 ports 6 Gbps 0x3 impl SATA mode [ 0.472382] ahci 0000:04:00.0: flags: 64bit ncq sntf stag led clo pmp pio slum part ccc [ 0.472803] scsi host6: ahci [ 0.473011] scsi host7: ahci $ lspci -v [...] 01:00.0 SATA controller: Marvell Technology Group Ltd. 88SE9215 PCIe 2.0 x1 4-port SATA 6 Gb/s Controller (rev 11) (prog-if 01 [AHCI 1.0]) Subsystem: Marvell Technology Group Ltd. 88SE9215 PCIe 2.0 x1 4-port SATA 6 Gb/s Controller Flags: bus master, fast devsel, latency 0, IRQ 127 I/O ports at e050 [size=8] I/O ports at e040 [size=4] I/O ports at e030 [size=8] I/O ports at e020 [size=4] I/O ports at e000 [size=32] Memory at a1340000 (32-bit, non-prefetchable) [size=2K] Expansion ROM at a1300000 [disabled] [size=256K] Capabilities: [40] Power Management version 3 Capabilities: [50] MSI: Enable+ Count=1/1 Maskable- 64bit- Capabilities: [70] Express Legacy Endpoint, MSI 00 Capabilities: [e0] SATA HBA v0.0 Capabilities: [100] Advanced Error Reporting Kernel driver in use: ahci [...]
終於找到原因了:我的powertop-tuning太激進了!
因為這台伺服器 24/7 全天候執行,而且這裡的電費有點貴,所以我添加了一個 systemd 服務來自動調整所有 powertop 選項:
$ cat /etc/systemd/system/powertop.service [Unit] Description=Powertop tunings [Service] Type=oneshot RemainAfterExit=yes ExecStart=/usr/bin/powertop --auto-tune [Install] WantedBy=multi-user.target
這與打開 powertop tui 並將所有選項設置為“好”相同。關鍵的一點是關於 的四行
Runtime PM for port ataX
:Good Runtime PM for port ata3 of PCI device: Marvell Technology Group Ltd. 88SE9215 PCIe 2.0 x1 4-port SATA 6 Gb/s Controller Bad Runtime PM for port ata4 of PCI device: Marvell Technology Group Ltd. 88SE9215 PCIe 2.0 x1 4-port SATA 6 Gb/s Controller Good Runtime PM for port ata5 of PCI device: Marvell Technology Group Ltd. 88SE9215 PCIe 2.0 x1 4-port SATA 6 Gb/s Controller >> Good Runtime PM for port ata6 of PCI device: Marvell Technology Group Ltd. 88SE9215 PCIe 2.0 x1 4-port SATA 6 Gb/s Controller Good Runtime PM for PCI Device Marvell Technology Group Ltd. 88SE9215 PCIe 2.0 x1 4-port SATA 6 Gb/s Controller
他們執行
echo 'auto' > '/sys/bus/pci/devices/0000:01:00.0/ata4/power/control';
這顯然會導致 SATA 卡永遠無法辨識埠上的新設備!只有設置
power/control
為on
(根據powertop的’Bad’選項)後,卡才會在執行後找到新設備echo 0 0 0 | sudo tee /sys/class/scsi_host/host*/scan
我唯一缺少的是自動重新掃描,因為我的台式電腦會自動查找新設備而無需寫入
hostX/scan
,但我現在可以忍受這個。這是一次非常令人沮喪的經歷,所以我希望這可以幫助面臨同樣問題的人。