为避免设备意外断电出现文件系统损坏,根文件系统起不来的情况,用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分区中,再将剩下的空间划分为只读分区和可读写分区用于后面挂载:
要做的工作有:
1.修改dts文件,划分SPI FLASH和NAND FLASH空间;
2.制作Ramdisk,并在编译的内核中支持;
3.修改bootstrap程序,使之不仅能从SPI中搬运内核和dtb还能从nand中搬运ramdisk到内存;
4.制作烧入文件脚本;
5.制作切换脚本linuxrc放入ramdisk中;
烧写脚本如下:
切换脚本如下:
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