Openwrt Ubifs保存配置升级

本文介绍了一种在OpenWRT系统下进行固件升级的方法,同时确保了配置文件的完整保存与恢复。通过修改sysupgrade脚本,实现了在更新前将配置文件备份至内存文件系统,并在更新后从备份中恢复,适用于使用ubifs分区的设备。

Openwrt Ubifs保存配置升级

修改target\linux\ipq806x\base-files\sbin\sysupgrade
先将/etc/config下面的配置文件备份到/tmp中(内存文件系统),执行firstboot擦除ubi文件系统
将ubifs分区挂载到/tmp/overlay目录,还原备份文件,再执行固件更新操作

 #!/bin/sh

. /lib/functions.sh
. /lib/functions/system.sh

# initialize defaults
RAMFS_COPY_BIN=""	# extra programs for temporary ramfs root
RAMFS_COPY_DATA=""	# extra data files
export IMAGE_FILE=
export MTD_CONFIG_ARGS=""
export INTERACTIVE=0
export VERBOSE=1
export SAVE_CONFIG=1
export SAVE_OVERLAY=0
export DELAY=3
export CONF_IMAGE=
export CONF_BACKUP_LIST=0
export CONF_BACKUP=
export CONF_RESTORE=
export NEED_IMAGE=
export HELP=0
export FORCE=0
export TEST=0

# parse options
while [ -n "$1" ]; do
	case "$1" in
		-i) export INTERACTIVE=1;;
		-d) export DELAY="$2"; shift;;
		-v) export VERBOSE="$(($VERBOSE + 1))";;
		-q) export VERBOSE="$(($VERBOSE - 1))";;
		-n) export SAVE_CONFIG=0;;
		-c) export SAVE_OVERLAY=1;;
		-b|--create-backup) export CONF_BACKUP="$2" NEED_IMAGE=1; shift;;
		-r|--restore-backup) export CONF_RESTORE="$2" NEED_IMAGE=1; shift;;
		-l|--list-backup) export CONF_BACKUP_LIST=1; break;;
		-f) export CONF_IMAGE="$2"; shift;;
		-F|--force) export FORCE=1;;
		-T|--test) export TEST=1;;
		-h|--help) export HELP=1; break;;
		-*)
			echo "Invalid option: $1"
			exit 1
		;;
		*) 
			export IMAGE_FILE="$1"
			break
		;;
	esac
	shift;
done

export CONFFILES=/tmp/sysupgrade.conffiles
export CONF_TAR=/tmp/sysupgrade.tgz

export ARGV="$*"
export ARGC="$#"

[ -z "$ARGV" -a -z "$NEED_IMAGE" -o $HELP -gt 0 ] && {
	cat <<EOF
Usage: $0 [<upgrade-option>...] <image file or URL>

upgrade-option:
	-n           do not save configuration over reflash
	-q           less verbose
	-v           more verbose
	
	-h | --help  display this help

EOF
	exit 1
}

export CONFFILES=/tmp/sysupgrade.conffiles
export CONF_TAR=/tmp/sysupgrade.tgz

add_uci_conffiles() {
	local file="$1"
	( find $(sed -ne '/^[[:space:]]*$/d; /^#/d; p' \
		/etc/sysupgrade.conf /lib/upgrade/keep.d/* 2>/dev/null) \
		-type f -o -type l 2>/dev/null;
	  opkg list-changed-conffiles ) | sort -u > "$file"
	return 0
}

if [ $CONF_BACKUP_LIST -eq 1 ]; then
	add_uci_conffiles "$CONFFILES"
	# cat "$CONFFILES"
fi

run_hooks() {  
    local arg="$1"; shift  
    for func in "$@"; do  
        eval "$func $arg"  
    done  
}

sysupgrade_init_conffiles="add_uci_conffiles"
do_save_conffiles() {
	local conf_tar="${1:-$CONF_TAR}"
	
	# [ -z "$(rootfs_type)" ] && {
		# echo "Cannot save config while running from ramdisk."
		# # ask_bool 0 "Abort" && exit
		# return 0
	# }
	run_hooks "$CONFFILES" $sysupgrade_init_conffiles
	# ask_bool 0 "Edit config file list" && vi "$CONFFILES"

	echo "Saving config files..."
	[ "$VERBOSE" -gt 1 ] && TAR_V="v" || TAR_V=""
	tar c${TAR_V}zf "$conf_tar" -T "$CONFFILES" 2>/dev/null

	rm -f "$CONFFILES"
}

ubifs_copy_config() {
    if grep netgear /proc/mtd >/dev/null; then
	
		local conf_tar="${1:-$CONF_TAR}"
        # squashfs+jffs2
		echo "Saving config files...(squashfs+ubifs)"
		mount -t ubifs ubi0:rootfs_data /tmp/overlay
		
		#erase all ubifs rootfs_data partition
		firstboot
		#backup configfiles
		[ "$VERBOSE" -gt 1 ] && TAR_V="v" || TAR_V=""
		tar x${TAR_V}zf "$conf_tar" -C /tmp/overlay/
    fi  
}

if [ $SAVE_CONFIG -eq 1 ]; then
	do_save_conffiles

	ubifs_copy_config
fi
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值