爲什麼固態會掉盤?著名的30分鐘大法修復是什麼原理?

如果現代的臺式機或者筆記本忽然斷電(Power Loss),你覺得哪個硬件部分容易損壞?出乎大多數人的意料的是,固態硬盤SSD最脆弱,容易出現掉盤的現象,也就是BIOS和操作系統不認盤的情況。今天我們就一起來Deep Dive一下原理和應對之道,並對有趣的“30分鐘大法”的原理和是否正確進行一些分析。

FTL損壞和丟失

我介紹了很多SSD的原理,其中最重要的根本是對FTL的理解。SSD甚至SD卡、手機存貯的很多問題和解決方案都或多或少地和它相關,再怎麼強調都不爲過。爲了理解後面的原理,我們先來簡單回顧一下FTL:我們的寫(Program)Flash操作只能把bit 1改成0,而不能從0改成1. 即我們可以把11110000改成11000000,但不能改成11111111。即有點像邏輯and操作(我們可以通過NAND這個名字聯想記憶一下)。那麼如何把0改回1呢?這就要靠擦除操作了,但是別忘了,NAND flash的壽命是由其擦寫次數決定的(P/E數 (Program/Erase Count)來衡量的),頻繁的擦除慢慢的會產生壞塊,如FAT分區的文件分配表(老狼:FAT文件系統與UEFI)等。爲了能夠做到壽命均衡(Wear Levelling)和對壞塊的遮蔽,就需要一個邏輯地址(LBA,logical block addresses )和物理地址(PBA, physical block addresses)的對應表,對外界暴露邏輯塊,裏面是具體是哪個物理塊,固件自己做主,這個對應關係表就是FTL表:

爲什麼固態會掉盤?著名的30分鐘大法修復是什麼原理?

因爲LBA大部分實現是基於Page的,也叫做Page Mapping Table (PMT):

爲什麼固態會掉盤?著名的30分鐘大法修復是什麼原理?

FTL看起來挺簡單,但它是SSD、NAND等基礎邏輯,它的實現多種多樣,是各個固件的核心機密。也有些Open Source的方案。

FTL表在哪裏呢?作爲核心數據結構,它當然也要存儲在Flash上。但由於它會被頻繁更新,所以每次改動也不能立刻寫會Flash,一般會先暫存在內存中,在積累到一定程度,再寫回Flash:

爲什麼固態會掉盤?著名的30分鐘大法修復是什麼原理?

什麼時間寫回,這是SSD固件的核心機密之一。另一方面,隨着SSD容量的提高,FTL表的容量也快速上漲。我們以8GB的爲例,FTL表不加處理可以達到8MB;以此類推,800G的SSD,FTL表可以有800MB!有些省空間的方案可以大大減小FTL表的大小,但也高達數十MB。這麼大,FTL表也就有了部分被換入換出的過程。如何設計,也是很講究技巧的。

FTL表如此重要,沒了它,整個SSD/SD卡就沒法工作了。如果在FTL寫回Flash之前,還在內存的時候,忽然沒電了,內存數據丟失,FTL表也就丟失了。有鑑於此,高端SSD和服務器SSD都加上了電容,來作爲應急供電方案,讓SSD控制器有時間把內存中的FTL表和一些緩存內容存到Flash上去:

爲什麼固態會掉盤?著名的30分鐘大法修復是什麼原理?

現實中的例子,我們在M.2的SSD上面有很多很小的電容:

爲什麼固態會掉盤?著名的30分鐘大法修復是什麼原理?

在Vcc沒電的時候,這些電容的gate就會打開,會爲主控爭取1ms左右的時間。主控會立刻放棄現在所有沒有存儲的數據,而立刻開始存儲FTL表,保證不會出大問題。

在企業級的SSD中,有的DRAM大小將近1GB,而企業SSD的數據完整性要求極高,不容有失,不但FTL表要存好,DRAM中沒有存儲過的,也必須全部存下來。這就需要很大的電容,來爭取更多的時間,如果我們拆開企業SSD,就會發現很多大黃快:

爲什麼固態會掉盤?著名的30分鐘大法修復是什麼原理?

它們也是爲了這個目的。

但是,一些低端消費級的SSD,沒有這種措施,忽然掉電,會造成FTL丟失。那麼發生這種情況是不是SSD就報廢了呢?也不是。

FTL表的重建

在內存中FTL丟失之前,Flash上還有上次的FTL內容,雖然已經過時了,但總比沒有好吧!於是可以搜索SSD中的Flash,找到上次的FTL,這樣儘管會丟失一些信息,但大部分數據可以保持。於此同時,有些實際塊已經被分配使用過了,再次用會發生錯誤,就需要修正最後的FTL。那麼怎麼修正呢?

每個Flash的page都有一些額外的空間,這些空間大部分做ECC校驗用,但還有些富餘,我們拿來做Mapping Flag(MF):

爲什麼固態會掉盤?著名的30分鐘大法修復是什麼原理?

有了這個提示,我們可以逐Page掃描整個Flash,來修正FTL。

看到逐Page,就知道這是個很耗時的工作。現在SSD那麼大,需要不少時間,可以高達數分鐘乃至數十分鐘!

那麼什麼時間做FTL的重建呢?不少主控都在發現錯誤後會開始重建,直到成功重建,主控纔會響應ATA等命令。這就是爲什麼忽然斷點後,有些SSD會很長時間沒有響應,想掉盤一樣了!那麼爲什麼有時候斷電後又沒問題呢?如果當時最新的FTL已經被寫回Flash中去,沒有錯誤,當然也就不會出問題了。

30分鐘大法是怎麼回事?

掉電後各個主控的表現不一,這和它們的FTL存儲算法有關。某些主控可以迅速恢復,有些則可能耗時很久,爲了給某些主控充足的時間重建FTL表,掉盤後可以這樣做:

1.掉電開機後,發現掉盤。如果是系統盤,則啓動失敗,如果是數據盤,則在操作系統裏面發現該盤沒有了。

2.不要立即重啓,啥也不幹,等待30分鐘,讓SSD主控充分的時間自行修復FTL。

3. 30分鐘後,關機。再開機,看能不能找到該SSD。

有些同學還有些額外的步驟,即不插數據線,光插電源線開機30分鐘。儘管我現在已經不做Flash相關工作,但我從經驗和原理上認爲這個步驟不是必須的。另外M.2的SSD也可照此辦理。

需要特別提醒的是,比較忌諱在此過程中十分煩躁,不停關機開機和重啓,打斷主控重建FTL的過程,有可能加劇錯誤造成徹底不可以用了。

結論

斷電會造成FTL表損壞,進而可能出現掉盤的現象。正確利用30分鐘大法,可以修正部分問題,關鍵是給主控充分的時間進行FTL表的重建。其實不光斷電,高溫也有可能造成掉盤。我在我的筆記本M.2上插了塊500GB某廠SSD,在大量拷貝電影時,過熱會讓該SSD主控忽然停止工作。我的筆記本這時就會沒有響應,在過了一會後,要不藍屏,要不就是發現該盤符沒有了。這是我如果直接重啓,就會發現在BIOS裏面和Windows中,該硬盤都沒有了。我這時就會讓筆記本涼一會,再重啓,硬盤就又出現了。這也是30分鐘大法的一個變種。

如果還不能修復,其實還可以進入工程模式進行恢復。但是該過程比較複雜,軟件昂貴,還是留給專業人士吧!

我在下一篇文章會介紹爲什麼有時候micorSD卡(TFlash卡/T卡)會忽然進入類似寫保護狀態,敬請期待!

相关文章