我做了一些研究,聽說過 SD 卡的壽命終止行為(不太確定還能叫什麼),其中 SD 卡和 microSD 卡將自身設定為唯讀以避免資料遺失。當我第一次聽到它時,我覺得它非常聰明。現在我不太確定了。
一些背景:我有一個 microSD,在進入寫入保護模式之前,它在樹莓派上使用了兩年。我使用 dd 將整個作業系統和檔案系統移至我的替換卡上。使用幾天后,我發現這張卡本身也被寫入保護了。我以為我運氣很差,直到我的第二張備用卡幾乎立即也做了同樣的事情。
這讓我很困擾,所以從那時起我就讓我的樹莓派閒置了。但我開始想知道SD卡是如何知道自己寫保護的。如果它記錄了寫入週期的計數,並且我使用 dd 來製作整個磁碟的映像,那麼我可能會透過欺騙它們認為它們是舊的來損壞我的 SD 卡。但我在任何地方都找不到生命終止行為的實現。有誰知道它是如何運作的?我想嘗試撤消它,但寫入保護似乎是在非常低的級別上實現的。我什至無法使用 sudo 訪問 /dev/sdX。
如果我是對的並且它保留了某種寫入周期計數,那麼這會有點令人沮喪。這意味著 SD 卡實際上並沒有失效——這只是一種預防措施。雖然這很好,但我想一直使用它直到真正的死亡,因為我正在定期進行備份。
以此作為我冗長的背景,有誰知道臨終行為是如何實施的,有什麼方法可以撤銷意外觸發的行為嗎?
答案1
大多數製造商沒有公佈他們的磨損均衡機制,這使得無法確定最佳和最差的預期壽命情況(可能是這個原因,因為有了這些知識,人們可以立即毀掉這樣的卡片)。
SanDisk 確實在不久前提供了一些見解(https://web.archive.org/web/20150326122100/http://ugweb.cs.ualberta.ca/~c274/resources/hardware/SDcards/WPaperWearLevelv1.0.pdf)。雖然這可能已經改變或完善,但基礎知識仍然適用:
每個記憶體晶片被分成塊。區塊是組織為磁區的儲存單元陣列。 (...) 寫入或讀取操作的最小單位是頁(或磁區)。擦除操作的最小單位是區塊。物理塊在邏輯上分組為區域。 (...) 磨損均衡是在一個區域內完成的。目前韌體不會將磨損分散到卡片的整個容量。每個區域除了分配的容量之外還有大約 3% 的額外「備用區塊」以滿足閃存卡的邏輯容量。這組塊通常稱為「擦除池」。
即使磨損分佈在卡片上,原理仍然是一樣的。
當卡片偵測到某個區塊已達到其使用壽命時,它會從可用於寫入操作的區塊中刪除該區塊。結果是擦除池的大小減少。這不會影響主機所看到的卡片的容量。當可用於寫入操作的區塊池因磨損而耗盡時,卡片將達到寫入操作的使用壽命。
由於卡片的容量不會減少,且消費卡上的磨損均衡不會重寫儲存的資料(如 SSD),因此某些類型的寫入可能會快速磨損卡片。一種類型是僅寫入需要寫入整個區塊的磁區。根據您的作業系統,dd
可能會使用預設區塊大小,該區塊大小512
可能遠低於卡片的區塊大小,因此會導致巨大的寫入放大。舉個例子:當SD卡的區塊大小為16kB且一個磁區為512位元組時,在這種情況下磨損量可以增加到31倍!這可能是您的第二張卡過早失敗的原因。
磨損資訊不會被複製,因為它是 SD 卡硬體的一部分,因此無法透過正常方式讀取/恢復該資訊。這同樣適用於寫入保護,因為 SD 卡控制器本身會阻止這種情況。所以,不,如果我們不是在談論硬體(SD 卡中的機械開關)或軟體(安裝唯讀)寫入保護,則此過程是不可逆的。
答案2
這些卡片應該有一些額外的空間用於磨損均衡,但聽起來你擁有的卡可能很愚蠢,沒有任何備用區塊並且將變為只讀,因為你已經寫入了上面的每個區塊驅動器。複製檔案而不是使用dd
,或使用e2image -ar
來複製 ext[234] 檔案系統將避免不必要地寫入磁碟上的每個未使用的區塊,這可能會有所幫助。