由於USB的方便攜帶跟普及性,所以現在市售走USB protocol 的外接硬碟非常多,大部分的構造都是一顆SATA硬碟搭配SATA-to-USB 轉卡。還有些人是自行購買SATA-to-USB 轉卡透過USB port來外接硬碟 or SSD。接 SSD這樣的用法是有隱憂的,接下來解釋原因。
以上的架構(SATA過轉卡轉USB), 如果想傳原生的ATA Command給硬碟,則必須穿過 SATA-to-USB 轉卡才能將ATA command傳給碟機。方法是透過呼叫 DeviceIoControl 來發出 SCSI_PASS_THROUGH_DIRECT_WITH_BUFFER。以前在硬碟廠寫相關Utility (Update FW/ Identify...), 就是透過這個protocol發出ATA 給硬碟。
以上的架構(SATA過轉卡轉USB), 如果想傳原生的ATA Command給硬碟,則必須穿過 SATA-to-USB 轉卡才能將ATA command傳給碟機。方法是透過呼叫 DeviceIoControl 來發出 SCSI_PASS_THROUGH_DIRECT_WITH_BUFFER。以前在硬碟廠寫相關Utility (Update FW/ Identify...), 就是透過這個protocol發出ATA 給硬碟。
然而一般使用者透過SATA-to-USB轉卡外接SSD,這樣卻隱藏著硬碟資料損壞的機會以及PE Cycle增加的隱憂。資料損壞的原因是SSD組成的原件NAND Flash, 現在幾乎都是使用19nm/15nm或更低的製成, 大多又是TLC架構,如果在斷電前OS沒有告知碟機,讓碟機FW介入做一些斷電前的保護(如: 補Dummy data),那麼一些尚未被closed的block下次讀回來ECC就會飆高而進入FW的Error recovery程序,甚至loss data。而PE Cycle增加的原因是因為沒有Trim command, 造成碟機的Garbage collection演算法一直把已經刪除的資料在Nand flash裡搬來搬去。
蒐集市售的SATA-to-USB轉卡發現到,有些外接轉卡並不會忠實的把從OS傳過來的指令轉發給後面的碟機,像是ATA Standby Immediate command這種告訴碟機要準備斷電的指令就不一定會有,另外,OS也不會透過轉卡發Trim Command, 因為Trim Command是屬於ATA規範的Command。
蒐集市售的SATA-to-USB轉卡發現到,有些外接轉卡並不會忠實的把從OS傳過來的指令轉發給後面的碟機,像是ATA Standby Immediate command這種告訴碟機要準備斷電的指令就不一定會有,另外,OS也不會透過轉卡發Trim Command, 因為Trim Command是屬於ATA規範的Command。
因此我的作法都會在移除SATA-to-USB轉卡上的硬碟之前,透過IOCTL_SCSI_PASS_THROUGH_DIRECT 下Standby Immediate 這個ATA command給碟機。 另外Trim command這個解法則是將準備刪掉的資料先統一丟到某個待刪資料夾,直行刪除的命令時,碟機記得接到原生的Sata port而不要過轉卡,這樣OS才會發出Trim command告訴碟機哪些是無用的LBA(資料)讓SSD FW實際去刪掉它。
謝謝分享
回覆刪除哈哈 你又來了!
回覆刪除