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。格式化完成后使用

扫描二维码关注公众号,回复: 11149376 查看本文章

mount -t ext4 /dev/mmcblk0 /mnt

命令将SD卡成功挂载到/mnt之后即告完成。
将SD卡更换为EXT4之后再未出现过SD卡挂载上来的文件系统为只读的问题。

原创文章 21 获赞 29 访问量 2万+

猜你喜欢

转载自blog.csdn.net/geek_liyang/article/details/88558333
今日推荐