嵌入式 Linux 的防腐蝕 SD 卡文件系統?
最近,我們的客戶遇到了一個相當不愉快的情況 - 用於顯示遙感數據的基於 Raspberry Pi 的“kiosk”(沒有比顯示來自數據收集伺服器的自我更新網頁的kiosk 模式瀏覽器更花哨的了)無法啟動,原因是文件系統損壞。Ext4,需要手動fsck,系統將成為明天重要展示的一部分,立即需要服務。當然,我們不能要求客戶在晚上關閉系統時很好地關閉系統;該系統必須簡單地承受這種虐待。
我想在將來避免這種情況,並且我想將作業系統移動到可以防止這種情況的文件系統。有一堆用於 MTD 設備的文件系統,讓它們在 SD 卡(標準塊設備)上執行需要一些嚴重的跳躍。還有一些其他文件系統(日誌等)具有良好的抗腐敗能力。我仍然需要對它們的優缺點進行一些合理的比較。
Linux 中可用的哪個文件系統可以在意外電源故障時提供最佳的抗損壞能力,並且不需要跳過像yaffs2這樣的不可能的箍來安裝到 SD。
磨損平衡是一個加分項,但不是必需的 - SD 卡通常有自己的機制,如果不夠完美,雖然系統應該是“溫和的快閃記憶體”(像 NTFS 這樣的系統可以在一個月內殺死一張 SD 卡)。
RAID1 模式下的 BTRFS 將在每個預定義的時間段自動清理執行,從而在單個 SD 卡上提供最佳的抗損壞能力。
好處:
- 保留 RW 到文件系統的能力
- 現代、功能齊全的文件系統,具有非常有用的 RPi 選項,例如透明壓縮和快照
- 設計時考慮到快閃記憶體(除其他外)
這是如何做到的:
我在 ArchARM linux 上執行我的 RaspberryPi,並且我的卡在 SD 讀卡器中,因此針對其他發行版和 /dev 介面相應地修改這些指令。
這是一個範例分區佈局:
/dev/mmcblk0p1: fat32 boot partition /dev/mmcblk0p2: to be used as btrfs partition /dev/mmcblk0p3: to be used as btrfs partition (mirrored with the above) /dev/mmcblk0p4 (optional): swap
要將 btrfs 放入 RAID1,您可以像這樣創建文件系統:
mkfs.btrfs -m raid1 -d raid1 /dev/mmcblk0p2 /dev/mmcblk0p3
然後你
rsync -aAXv
到它你以前備份的系統。要讓它從 raid1 中的 BTRFS 啟動,您需要修改 initramfs。因此,當您的系統仍在舊文件系統上執行時,您需要執行以下操作。
Raspberry 通常不使用 mkinitcpio,因此您必須安裝它。然後,您需要將“btrfs”添加到 mkinitcpio.conf 中的 MODULES 數組中,並使用以下命令重新創建 initramfs
mkinitcpio -g /boot/initrd -k YOUR_KERNEL_VERSION
要知道鍵入什麼而不是 YOUR_KERNEL_VERSION,請執行
ls /lib/modules
如果您更新核心,您必須在重新啟動之前重新創建 initramfs。
然後,您需要修改 RPi 的引導文件。
在 cmdline.txt 中,你需要有
root=/dev/mmcblk0p2 initrd=0x01f00000 rootfstype=btrfs
在 config.txt 中,您需要添加
initramfs initrd 0x01f00000
一旦你完成了所有這些並成功啟動到你的 btrfs RAID1 系統,唯一剩下的就是使用 systemd timer(首選)或 cron(dcron)設置定期清理(每 3-7 天),如下所示:
btrfs scrub start /
如果發現任何損壞,它將在您的文件系統上執行,比較所有文件的校驗和並修復它們(替換為正確的副本)。
BTRFS RAID1、單一介質和 Raspberry Pi 的組合使這個非常神秘的東西。將所有部分放在一起需要一些時間和工作,但它就在這裡。