ramdisk + overlay打造只读文件系统

       为避免设备意外断电出现文件系统损坏,根文件系统起不来的情况,用ramdisk+overlay的方式制作分层的只读文件系统,lower层为只读文件系统,upper层为可读写分区,这样当文件系统出现问题时只需将upper层文件删除即可恢复文件系统,具体方案如下:

硬件资源:

SPI FLASH     : 4M

NAND FLASH: 1G

基于nand flash 不可靠考量,将uImage 、boot、dtb存放到SPI FLASH中,由于SPI FLASH大小限制,放弃内核和ramdisk打包在一起的initramfs方案,将分开的ramdisk存放到NAND FLASH单独划分的10M分区中,再将剩下的空间划分为只读分区和可读写分区用于后面挂载:

ramdisk + overlay打造只读文件系统

ramdisk + overlay打造只读文件系统

ramdisk + overlay打造只读文件系统

要做的工作有:

1.修改dts文件,划分SPI FLASH和NAND FLASH空间;

2.制作Ramdisk,并在编译的内核中支持;

3.修改bootstrap程序,使之不仅能从SPI中搬运内核和dtb还能从nand中搬运ramdisk到内存;

4.制作烧入文件脚本;

5.制作切换脚本linuxrc放入ramdisk中;

烧写脚本如下:

ramdisk + overlay打造只读文件系统

切换脚本如下:

echo "To overlayfs ..."

mkdir /mnt/ro /mnt/rw
ubiattach /dev/ubi_ctrl -m 1
mount -t ubifs -o rw ubi0:rw-part /mnt/rw

ubiattach /dev/ubi_ctrl -m 2
mount -t ubifs -o ro ubi1:rootfs /mnt/ro

mkdir /mnt/rw/worker /mnt/rw/rw /mnt/rw/overlay

mount -n -t overlay overlayfs:/overlay -o lowerdir=/mnt/ro,upperdir=/mnt/rw/rw,workdir=/mnt/rw/worker /mnt/rw/overlay
mount --move /dev  /mnt/rw/overlay/dev/
mount --move /proc /mnt/rw/overlay/proc/
mount --move /sys  /mnt/rw/overlay/sys/

mkdir /mnt/rw/overlay/ro /mnt/rw/overlay/rw

cd /mnt/rw/overlay
pivot_root . tmp/
#exec chroot . /sbin/init <dev/console >dev/console 2>&1
exec chroot . sh -c "$(cat <<END
	# Move ro and rw mounts to the new root
	mount --move /tmp/mnt/ro/ /ro
	if [ $? -ne 0 ]; then
	    echo "ERROR: could not move ro-root into newroot"
	    /bin/bash
	fi
	mount --move /tmp/mnt/rw /rw
	if [ $? -ne 0 ]; then
	    echo "ERROR: could not move tempfs rw mount into newroot"
	    /bin/bash
	fi
	# Continue with regular init
	exec /sbin/init
END
)"

fi

 

 

上一篇:android – Settings.canDrawOverlays即使在从设置中启用权限后返回false


下一篇:Android中更高效的地图叠加层