Openwrt開發之SD卡只讀文件系統

問題的現象

Opnewrt作爲基於Linux內核的嵌入式操作系統,支持市面上很多的路由器產品以及諸如LinkIt Smart 7688這樣的物聯網核心開發板,爲我們快速開發實現不同物理層設備(Wifi,RJ45,Uart,485)之間通信的“網關設備“提供了很好的平臺。
SD卡作爲可插拔的外存儲器往往是這種中轉站式產品的必要組成部分,SD卡在Openwrt上識別爲/dev/mmcblk0(若識別不了請檢查相關的電路以及在Openwrt編譯選項中中是否選擇支持SD卡的驅動),命令:

mount -f /dev/mmcblk0 /mnt

會將SD卡作爲只讀系統掛載到/mnt目錄下。
但是,我們今天要討論的不是怎麼將SD卡掛載爲只讀,而是我在開發中遇到的問題是我以可讀寫的方式掛載之後,在業務程序(會對SD卡進行讀寫)正常運行過程中斷電,重新在上電,就會出現SD卡正常的掛載之後卻變成了只讀的文件系統。

查找問題原因

我查閱了Openwrt官網對文件系統相關的說明 官網鏈接,發現了系統對FAT32這種跨平臺的文件系統支持有一些問題,而SD卡的文件系統正是FAT32的。於是着手將SD卡的文件系統換爲EXT4。

問題的解決過程

當初在編譯Openwrt時沒有考慮支持EXT4的文件系統,所以需要將kmod-fs-ext4作爲編譯成IPK的安裝包,跟着業務軟件的更新腳本一併安裝到Openwrt中,這樣不需要更新Openwrt即可完成對EXT4文件系統的支持。
在安裝過程中發現內核依賴出了問題,都是同一套代碼編譯出來的(未同步更新Openwrt代碼),爲什麼會出現這樣的問題呢?原來雖然依賴的內核版本一致,但是後邊跟的MD5值卻不相同,於是打開/usr/lib/opkg/status文件找到:

Package: kmod-usb-serial
Package: kernel
Version: 4.4.135-1-dd771f070793a57e639ba899b957b9d9
Depends: libc
Status: install user installed
Architecture: mipsel_24kc
Installed-Time: 1528658724
Auto-Installed: yes

在安裝腳本中使用sed命令將後邊的MD5值替換爲安裝失敗提示的依賴MD5值:

sed -i ‘s/Version: 4.4.135-1-dd771f070793a57e639ba899b957b9d9/Version: 4.4.135-1-bd23b504438a969434409f08c297498a/’ /usr/lib/opkg/status

替換成功後即可成功安裝,但是SD卡此時還是FAT32,於是利用Openwrt源碼編譯出e2fsprogs格式化工具安裝包。安裝過後即可格式化SD卡。但是這個格式化工具依賴librtlibuuidlibext2fs,需要先安裝這三個庫才能使用。
在一切安裝準備妥當之後,使用命令

mkfs.ext4 -F /dev/mmcblk0

將SD卡格式化成ext4。格式化完成後使用

mount -t ext4 /dev/mmcblk0 /mnt

命令將SD卡成功掛載到/mnt之後即告完成。
將SD卡更換爲EXT4之後再未出現過SD卡掛載上來的文件系統爲只讀的問題。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章