文章目录
1、问题现象
示教器在测试过程中丢失了根文件系统下的usr目录,出现了严重的无法正常启动的问题。
具体为什么丢失该目录,原因未能查到,解决方案是除了用户目录以外,将根文件系统的权限设置为只读,保证根文件系统的安全性。
2、具体方案
2.1 分区方案
增加用户目录分区,将根文件系统分为两部分,一部分为系统组使用,设置为只读;另一份给用户使用,可任意读写。
具体根文件系统占200M,放在mtdblock8当中,剩余部分作为用户目录,放在mtdblock9当中,可用大概为800M。
2.2 分区后的烧写情况
烧写主要放在uboot当中,其中分为usb烧写和SD卡烧写,两者差别比较小,以sd烧写为例。
通过以下宏定义,设置分区名字,方便烧写。
#define MTDPARTS_DEFAULT
"mtdparts=omap2-nand.0:256k(SPL)," \
"256k(SPL.backup1)," \
"256k(SPL.backup2)," \
"256k(SPL.backup3),2048k(u-boot)," \
"256k(u-boot-env),3m(LOGO),5m(kernel),200m(rootfs),-(home)"
烧写时通过TYPE环境变量控制进度条的显示,home镜像较小,烧写很快,所以整体上进度条保持原来4条的样子。
2.3 对文件系统的修改
修改fstab当中的挂载情况,将文件系统中需要挂载的文件卸载fstab当中。
其中mmc1:2是之前QT使用的目录,为了保证QT不做修改,这里链接到了home目录下。
触摸屏的校准文件也进行了链接,保证QT不做修改。
2.4 关于之前挂载后拔卡无法删除相应目录的分析
2.4.1 问题分析
问题现象:拔卡或者拔出USB出现无法删除挂载目录的现象。
分析挂载脚本可知,当存在/tmp/.automount-$name时,才可以将目录删除掉。
if [ "$ACTION" = "remove" ] && [ -x "$UMOUNT" ] && [ -n "$DEVNAME" ]; then
for mnt in `cat /proc/mounts | grep "$DEVNAME" | cut -f 2 -d " " `
do
$UMOUNT $mnt
done
# Remove empty directories from auto-mounter
name="`basename "$DEVNAME"`"
test -e "/tmp/.automount-$name" && rm_dir "/mmc1:2/Disk/$name"
fi
产生该问题的原因就是在挂载SD卡和USB时,系统的tmp目录还没有挂载,在上边fstab设置当中,可以看到var/volatile目录是一个临时目录,当断电之后就会重置,tmp目录就是从这里边链接出来的。
这就是之前注释掉rcS.d当中的mount -at nonfs,nosmbfs,noncpfs 2>/dev/null解决了该问题的原因,注释掉这句话之后,不再挂载所有的fstab目录下的所有文件系统,只能创建不是临时目录的目录,这样文件就永久保存了下来,就能够保证保留下/tmp/.automount-$name,就不再产生该问题。
2.4.2 解决方案
挂载情况修改为以下,因为修改为只读后,mmc1:2目录只能放到home下,udev开始挂载sd卡时,home目录还未挂载,所以导致无法正常挂载SD卡,所以需要在系统初始化完成之后再次挂载。
rootfs / auto ro 1 1
proc /proc proc defaults 0 0
devpts /dev/pts devpts mode=0620,gid=5 0 0
usbfs /proc/bus/usb usbfs defaults 0 0
tmpfs /var/volatile tmpfs defaults,size=16M 0 0
tmpfs /dev/shm tmpfs mode=0777 0 0
tmpfs /media/ram tmpfs defaults,size=16M 0 0
/dev/mtdblock9 /home/root auto rw,sync 0 0
# uncomment this if your device has a SD/MMC/Transflash slot
/dev/mmcblk0p1 /home/root/mmc1:2/Disk/mmcblk0p1 auto rw,sync 0 0
/dev/sda1 /home/root/mmc1:2/Disk/sda1 auto rw,sync 0 0
在rc5.d中最后的脚本中增加以下内容。
if [ -e /dev/mmcblk0p1 ];
then
mkdir /home/root/mmc1\:2/Disk/mmcblk0p1
touch "/tmp/.automount-mmcblk0p1"
fi
if [ -e /dev/sda1 ];
then
mkdir /home/root/mmc1\:2/Disk/sda1
touch "/tmp/.automount-sda1"
fi
mount -at nonfs,nosmbfs,noncpfs 2>/dev/null
有效解决了之前拔卡无法删除目录的问题,也解决了home未挂载,SD卡不能挂载问题。同时解决了之前取消挂载tmpfs的问题。
测试情况
经过简单的测试,未发现文件系统只读后对QT有影响,具体情况还需要进一步测试。
对于文件系统文件丢失的具体原因还未找到,暂时不能确定改为只读是否能有效解决丢失文件问题,需要多次测试。
后续会分析文件丢失的具体原因,尝试复现问题。