文件系统只读方案

  • Post author:
  • Post category:其他




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当中的挂载情况,将文件系统中需要挂载的文件卸载fstab当中。

其中mmc1:2是之前QT使用的目录,为了保证QT不做修改,这里链接到了home目录下。

mmc12

触摸屏的校准文件也进行了链接,保证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有影响,具体情况还需要进一步测试。

对于文件系统文件丢失的具体原因还未找到,暂时不能确定改为只读是否能有效解决丢失文件问题,需要多次测试。

后续会分析文件丢失的具体原因,尝试复现问题。



版权声明:本文为qq_37307259原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。