123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934 |
- From: Matthias Schiffer <mschiffer@universe-factory.net>
- Date: Fri, 21 Apr 2017 20:37:58 +0200
- Subject: procd: remove procd-nand package
- We always want to support staged upgrades now, so it's better to include
- upgraded into the main package. /lib/upgrade/nand.sh is moved to
- base-files.
- The procd-nand-firstboot package is removed for now, it may return later
- as a separate package.
- Signed-off-by: Matthias Schiffer <mschiffer@universe-factory.net>
- diff --git a/package/base-files/Makefile b/package/base-files/Makefile
- index 305d0bfd333fd17f0f7c57ee2298dbfd4b97fe29..fe4430d59092dae9ba2ffbea61f58ac7b4b41dc6 100644
- --- a/package/base-files/Makefile
- +++ b/package/base-files/Makefile
- @@ -19,7 +19,9 @@ PKG_BUILD_DEPENDS:=usign/host
- PKG_LICENSE:=GPL-2.0
-
- # Extend depends from version.mk
- -PKG_CONFIG_DEPENDS += CONFIG_SIGNED_PACKAGES CONFIG_TARGET_INIT_PATH CONFIG_TARGET_PREINIT_DISABLE_FAILSAFE
- +PKG_CONFIG_DEPENDS += \
- + CONFIG_SIGNED_PACKAGES CONFIG_TARGET_INIT_PATH CONFIG_TARGET_PREINIT_DISABLE_FAILSAFE \
- + CONFIG_NAND_SUPPORT
-
- include $(INCLUDE_DIR)/package.mk
-
- @@ -31,7 +33,7 @@ endif
- define Package/base-files
- SECTION:=base
- CATEGORY:=Base system
- - DEPENDS:=+netifd +libc +procd +jsonfilter +SIGNED_PACKAGES:usign +SIGNED_PACKAGES:lede-keyring +fstools +fwtool
- + DEPENDS:=+netifd +libc +procd +jsonfilter +SIGNED_PACKAGES:usign +SIGNED_PACKAGES:lede-keyring +NAND_SUPPORT:ubi-utils +fstools +fwtool
- TITLE:=Base filesystem for Lede
- URL:=http://openwrt.org/
- VERSION:=$(PKG_RELEASE)-$(REVISION)
- @@ -106,9 +108,16 @@ ifdef CONFIG_SIGNED_PACKAGES
- endef
- endif
-
- +ifeq ($(CONFIG_NAND_SUPPORT),)
- + define Package/base-files/nand-support
- + rm -f $(1)/lib/upgrade/nand.sh
- + endef
- +endif
- +
- define Package/base-files/install
- $(CP) ./files/* $(1)/
- $(Package/base-files/install-key)
- + $(Package/base-files/nand-support)
- if [ -d $(GENERIC_PLATFORM_DIR)/base-files/. ]; then \
- $(CP) $(GENERIC_PLATFORM_DIR)/base-files/* $(1)/; \
- fi
- diff --git a/package/base-files/files/lib/upgrade/nand.sh b/package/base-files/files/lib/upgrade/nand.sh
- new file mode 100644
- index 0000000000000000000000000000000000000000..6bd2005344c081df20e5a330a69e49e37225c39f
- --- /dev/null
- +++ b/package/base-files/files/lib/upgrade/nand.sh
- @@ -0,0 +1,376 @@
- +#!/bin/sh
- +# Copyright (C) 2014 OpenWrt.org
- +#
- +
- +. /lib/functions.sh
- +
- +# 'kernel' partition on NAND contains the kernel
- +CI_KERNPART="kernel"
- +
- +# 'ubi' partition on NAND contains UBI
- +CI_UBIPART="ubi"
- +
- +ubi_mknod() {
- + local dir="$1"
- + local dev="/dev/$(basename $dir)"
- +
- + [ -e "$dev" ] && return 0
- +
- + local devid="$(cat $dir/dev)"
- + local major="${devid%%:*}"
- + local minor="${devid##*:}"
- + mknod "$dev" c $major $minor
- +}
- +
- +nand_find_volume() {
- + local ubidevdir ubivoldir
- + ubidevdir="/sys/devices/virtual/ubi/$1"
- + [ ! -d "$ubidevdir" ] && return 1
- + for ubivoldir in $ubidevdir/${1}_*; do
- + [ ! -d "$ubivoldir" ] && continue
- + if [ "$( cat $ubivoldir/name )" = "$2" ]; then
- + basename $ubivoldir
- + ubi_mknod "$ubivoldir"
- + return 0
- + fi
- + done
- +}
- +
- +nand_find_ubi() {
- + local ubidevdir ubidev mtdnum
- + mtdnum="$( find_mtd_index $1 )"
- + [ ! "$mtdnum" ] && return 1
- + for ubidevdir in /sys/devices/virtual/ubi/ubi*; do
- + [ ! -d "$ubidevdir" ] && continue
- + cmtdnum="$( cat $ubidevdir/mtd_num )"
- + [ ! "$mtdnum" ] && continue
- + if [ "$mtdnum" = "$cmtdnum" ]; then
- + ubidev=$( basename $ubidevdir )
- + ubi_mknod "$ubidevdir"
- + echo $ubidev
- + return 0
- + fi
- + done
- +}
- +
- +nand_get_magic_long() {
- + dd if="$1" skip=$2 bs=4 count=1 2>/dev/null | hexdump -v -n 4 -e '1/1 "%02x"'
- +}
- +
- +get_magic_long_tar() {
- + ( tar xf $1 $2 -O | dd bs=4 count=1 | hexdump -v -n 4 -e '1/1 "%02x"') 2> /dev/null
- +}
- +
- +identify_magic() {
- + local magic=$1
- + case "$magic" in
- + "55424923")
- + echo "ubi"
- + ;;
- + "31181006")
- + echo "ubifs"
- + ;;
- + "68737173")
- + echo "squashfs"
- + ;;
- + "d00dfeed")
- + echo "fit"
- + ;;
- + "4349"*)
- + echo "combined"
- + ;;
- + *)
- + echo "unknown $magic"
- + ;;
- + esac
- +}
- +
- +
- +identify() {
- + identify_magic $(nand_get_magic_long "$1" "${2:-0}")
- +}
- +
- +identify_tar() {
- + identify_magic $(get_magic_long_tar "$1" "$2")
- +}
- +
- +nand_restore_config() {
- + sync
- + local ubidev=$( nand_find_ubi $CI_UBIPART )
- + local ubivol="$( nand_find_volume $ubidev rootfs_data )"
- + [ ! "$ubivol" ] &&
- + ubivol="$( nand_find_volume $ubidev rootfs )"
- + mkdir /tmp/new_root
- + if ! mount -t ubifs /dev/$ubivol /tmp/new_root; then
- + echo "mounting ubifs $ubivol failed"
- + rmdir /tmp/new_root
- + return 1
- + fi
- + mv "$1" "/tmp/new_root/sysupgrade.tgz"
- + umount /tmp/new_root
- + sync
- + rmdir /tmp/new_root
- +}
- +
- +nand_upgrade_prepare_ubi() {
- + local rootfs_length="$1"
- + local rootfs_type="$2"
- + local has_kernel="${3:-0}"
- + local has_env="${4:-0}"
- +
- + local mtdnum="$( find_mtd_index "$CI_UBIPART" )"
- + if [ ! "$mtdnum" ]; then
- + echo "cannot find ubi mtd partition $CI_UBIPART"
- + return 1
- + fi
- +
- + local ubidev="$( nand_find_ubi "$CI_UBIPART" )"
- + if [ ! "$ubidev" ]; then
- + ubiattach -m "$mtdnum"
- + sync
- + ubidev="$( nand_find_ubi "$CI_UBIPART" )"
- + fi
- +
- + if [ ! "$ubidev" ]; then
- + ubiformat /dev/mtd$mtdnum -y
- + ubiattach -m "$mtdnum"
- + sync
- + ubidev="$( nand_find_ubi "$CI_UBIPART" )"
- + [ "$has_env" -gt 0 ] && {
- + ubimkvol /dev/$ubidev -n 0 -N ubootenv -s 1MiB
- + ubimkvol /dev/$ubidev -n 1 -N ubootenv2 -s 1MiB
- + }
- + fi
- +
- + local kern_ubivol="$( nand_find_volume $ubidev kernel )"
- + local root_ubivol="$( nand_find_volume $ubidev rootfs )"
- + local data_ubivol="$( nand_find_volume $ubidev rootfs_data )"
- +
- + # remove ubiblock device of rootfs
- + local root_ubiblk="ubiblock${root_ubivol:3}"
- + if [ "$root_ubivol" -a -e "/dev/$root_ubiblk" ]; then
- + echo "removing $root_ubiblk"
- + if ! ubiblock -r /dev/$root_ubivol; then
- + echo "cannot remove $root_ubiblk"
- + return 1;
- + fi
- + fi
- +
- + # kill volumes
- + [ "$kern_ubivol" ] && ubirmvol /dev/$ubidev -N kernel || true
- + [ "$root_ubivol" ] && ubirmvol /dev/$ubidev -N rootfs || true
- + [ "$data_ubivol" ] && ubirmvol /dev/$ubidev -N rootfs_data || true
- +
- + # update kernel
- + if [ "$has_kernel" = "1" ]; then
- + if ! ubimkvol /dev/$ubidev -N kernel -s $kernel_length; then
- + echo "cannot create kernel volume"
- + return 1;
- + fi
- + fi
- +
- + # update rootfs
- + local root_size_param
- + if [ "$rootfs_type" = "ubifs" ]; then
- + root_size_param="-m"
- + else
- + root_size_param="-s $rootfs_length"
- + fi
- + if ! ubimkvol /dev/$ubidev -N rootfs $root_size_param; then
- + echo "cannot create rootfs volume"
- + return 1;
- + fi
- +
- + # create rootfs_data for non-ubifs rootfs
- + if [ "$rootfs_type" != "ubifs" ]; then
- + if ! ubimkvol /dev/$ubidev -N rootfs_data -m; then
- + echo "cannot initialize rootfs_data volume"
- + return 1
- + fi
- + fi
- + sync
- + return 0
- +}
- +
- +nand_do_upgrade_success() {
- + local conf_tar="/tmp/sysupgrade.tgz"
- +
- + sync
- + [ -f "$conf_tar" ] && nand_restore_config "$conf_tar"
- + echo "sysupgrade successful"
- + umount -a
- + reboot -f
- +}
- +
- +# Flash the UBI image to MTD partition
- +nand_upgrade_ubinized() {
- + local ubi_file="$1"
- + local mtdnum="$(find_mtd_index "$CI_UBIPART")"
- +
- + [ ! "$mtdnum" ] && {
- + CI_UBIPART="rootfs"
- + mtdnum="$(find_mtd_index "$CI_UBIPART")"
- + }
- +
- + if [ ! "$mtdnum" ]; then
- + echo "cannot find mtd device $CI_UBIPART"
- + umount -a
- + reboot -f
- + fi
- +
- + local mtddev="/dev/mtd${mtdnum}"
- + ubidetach -p "${mtddev}" || true
- + sync
- + ubiformat "${mtddev}" -y -f "${ubi_file}"
- + ubiattach -p "${mtddev}"
- + nand_do_upgrade_success
- +}
- +
- +# Write the UBIFS image to UBI volume
- +nand_upgrade_ubifs() {
- + local rootfs_length=`(cat $1 | wc -c) 2> /dev/null`
- +
- + nand_upgrade_prepare_ubi "$rootfs_length" "ubifs" "0" "0"
- +
- + local ubidev="$( nand_find_ubi "$CI_UBIPART" )"
- + local root_ubivol="$(nand_find_volume $ubidev rootfs)"
- + ubiupdatevol /dev/$root_ubivol -s $rootfs_length $1
- +
- + nand_do_upgrade_success
- +}
- +
- +nand_board_name() {
- + if type 'platform_nand_board_name' >/dev/null 2>/dev/null; then
- + platform_nand_board_name
- + return
- + fi
- +
- + cat /tmp/sysinfo/board_name
- +}
- +
- +nand_upgrade_tar() {
- + local tar_file="$1"
- + local board_name="$(nand_board_name)"
- + local kernel_mtd="$(find_mtd_index $CI_KERNPART)"
- +
- + local kernel_length=`(tar xf $tar_file sysupgrade-$board_name/kernel -O | wc -c) 2> /dev/null`
- + local rootfs_length=`(tar xf $tar_file sysupgrade-$board_name/root -O | wc -c) 2> /dev/null`
- +
- + local rootfs_type="$(identify_tar "$tar_file" sysupgrade-$board_name/root)"
- +
- + local has_kernel=1
- + local has_env=0
- +
- + [ "$kernel_length" != 0 -a -n "$kernel_mtd" ] && {
- + tar xf $tar_file sysupgrade-$board_name/kernel -O | mtd write - $CI_KERNPART
- + }
- + [ "$kernel_length" = 0 -o ! -z "$kernel_mtd" ] && has_kernel=0
- +
- + nand_upgrade_prepare_ubi "$rootfs_length" "$rootfs_type" "$has_kernel" "$has_env"
- +
- + local ubidev="$( nand_find_ubi "$CI_UBIPART" )"
- + [ "$has_kernel" = "1" ] && {
- + local kern_ubivol="$(nand_find_volume $ubidev kernel)"
- + tar xf $tar_file sysupgrade-$board_name/kernel -O | \
- + ubiupdatevol /dev/$kern_ubivol -s $kernel_length -
- + }
- +
- + local root_ubivol="$(nand_find_volume $ubidev rootfs)"
- + tar xf $tar_file sysupgrade-$board_name/root -O | \
- + ubiupdatevol /dev/$root_ubivol -s $rootfs_length -
- +
- + nand_do_upgrade_success
- +}
- +
- +# Recognize type of passed file and start the upgrade process
- +nand_do_upgrade_stage2() {
- + local file_type=$(identify $1)
- +
- + if type 'platform_nand_pre_upgrade' >/dev/null 2>/dev/null; then
- + platform_nand_pre_upgrade "$1"
- + fi
- +
- + [ ! "$(find_mtd_index "$CI_UBIPART")" ] && CI_UBIPART="rootfs"
- +
- + case "$file_type" in
- + "ubi") nand_upgrade_ubinized $1;;
- + "ubifs") nand_upgrade_ubifs $1;;
- + *) nand_upgrade_tar $1;;
- + esac
- +}
- +
- +nand_upgrade_stage2() {
- + [ $1 = "nand" ] && {
- + [ -f "$2" ] && {
- + touch /tmp/sysupgrade
- +
- + killall -9 telnetd
- + killall -9 dropbear
- + killall -9 ash
- +
- + kill_remaining TERM
- + sleep 3
- + kill_remaining KILL
- +
- + sleep 1
- +
- + if [ -n "$(rootfs_type)" ]; then
- + v "Switching to ramdisk..."
- + run_ramfs ". /lib/functions.sh; include /lib/upgrade; nand_do_upgrade_stage2 $2"
- + else
- + nand_do_upgrade_stage2 $2
- + fi
- + return 0
- + }
- + echo "Nand upgrade failed"
- + exit 1
- + }
- +}
- +
- +nand_upgrade_stage1() {
- + [ -f /tmp/sysupgrade-nand-path ] && {
- + path="$(cat /tmp/sysupgrade-nand-path)"
- + [ "$SAVE_CONFIG" != 1 -a -f "$CONF_TAR" ] &&
- + rm $CONF_TAR
- +
- + ubus call system nandupgrade "{\"prefix\": \"$RAM_ROOT\", \"path\": \"$path\" }"
- + exit 0
- + }
- +}
- +
- +# Check if passed file is a valid one for NAND sysupgrade. Currently it accepts
- +# 3 types of files:
- +# 1) UBI - should contain an ubinized image, header is checked for the proper
- +# MAGIC
- +# 2) UBIFS - should contain UBIFS partition that will replace "rootfs" volume,
- +# header is checked for the proper MAGIC
- +# 3) TAR - archive has to include "sysupgrade-BOARD" directory with a non-empty
- +# "CONTROL" file (at this point its content isn't verified)
- +#
- +# You usually want to call this function in platform_check_image.
- +#
- +# $(1): board name, used in case of passing TAR file
- +# $(2): file to be checked
- +nand_do_platform_check() {
- + local board_name="$1"
- + local tar_file="$2"
- + local control_length=`(tar xf $tar_file sysupgrade-$board_name/CONTROL -O | wc -c) 2> /dev/null`
- + local file_type="$(identify $2)"
- +
- + [ "$control_length" = 0 -a "$file_type" != "ubi" -a "$file_type" != "ubifs" ] && {
- + echo "Invalid sysupgrade file."
- + return 1
- + }
- +
- + return 0
- +}
- +
- +# Start NAND upgrade process
- +#
- +# $(1): file to be used for upgrade
- +nand_do_upgrade() {
- + echo -n $1 > /tmp/sysupgrade-nand-path
- + install_bin /sbin/upgraded
- + ln -s "$RAM_ROOT"/sbin/upgraded /tmp/upgraded
- + nand_upgrade_stage1
- +}
- diff --git a/package/system/procd/Makefile b/package/system/procd/Makefile
- index b878ad06b73512fff08246978dbbf11ba47cdfc8..d35248e66d7252d4851f456876a6eb61002fdb66 100644
- --- a/package/system/procd/Makefile
- +++ b/package/system/procd/Makefile
- @@ -22,11 +22,9 @@ PKG_LICENSE_FILES:=
-
- PKG_MAINTAINER:=John Crispin <john@phrozen.org>
-
- -PKG_FLAGS:=nonshared
- -
- PKG_CONFIG_DEPENDS:= \
- CONFIG_TARGET_INIT_PATH CONFIG_KERNEL_SECCOMP \
- - CONFIG_NAND_SUPPORT CONFIG_PROCD_SHOW_BOOT CONFIG_PROCD_ZRAM_TMPFS \
- + CONFIG_PROCD_SHOW_BOOT CONFIG_PROCD_ZRAM_TMPFS \
- CONFIG_KERNEL_NAMESPACES CONFIG_PACKAGE_procd-ujail CONFIG_PACKAGE_procd-seccomp
-
- include $(INCLUDE_DIR)/package.mk
- @@ -42,7 +40,7 @@ TARGET_LDFLAGS += $(if $(CONFIG_USE_GLIBC),-lrt)
- define Package/procd
- SECTION:=base
- CATEGORY:=Base system
- - DEPENDS:=+ubusd +ubus +libjson-script +ubox +USE_GLIBC:librt +libubox +libubus +NAND_SUPPORT:procd-nand
- + DEPENDS:=+ubusd +ubus +libjson-script +ubox +USE_GLIBC:librt +libubox +libubus
- TITLE:=OpenWrt system process manager
- endef
-
- @@ -60,20 +58,6 @@ define Package/procd-seccomp
- TITLE:=OpenWrt process seccomp helper + utrace
- endef
-
- -define Package/procd-nand
- - SECTION:=utils
- - CATEGORY:=Utilities
- - DEPENDS:=@NAND_SUPPORT +ubi-utils
- - TITLE:=OpenWrt sysupgrade nand helper
- -endef
- -
- -define Package/procd-nand-firstboot
- - SECTION:=utils
- - CATEGORY:=Utilities
- - DEPENDS:=procd-nand
- - TITLE:=OpenWrt firstboot nand helper
- -endef
- -
- define Package/procd/config
- menu "Configuration"
- depends on PACKAGE_procd
- @@ -91,10 +75,6 @@ endmenu
- endef
-
-
- -ifeq ($(CONFIG_NAND_SUPPORT),y)
- - CMAKE_OPTIONS += -DBUILD_UPGRADED=1
- -endif
- -
- ifeq ($(CONFIG_PROCD_SHOW_BOOT),y)
- CMAKE_OPTIONS += -DSHOW_BOOT_ON_CONSOLE=1
- endif
- @@ -114,7 +94,7 @@ endif
- define Package/procd/install
- $(INSTALL_DIR) $(1)/sbin $(1)/etc $(1)/lib/functions
-
- - $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/{init,procd,askfirst,udevtrigger} $(1)/sbin/
- + $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/{init,procd,askfirst,udevtrigger,upgraded} $(1)/sbin/
- $(INSTALL_DATA) $(PKG_INSTALL_DIR)/usr/lib/libsetlbf.so $(1)/lib
- $(INSTALL_BIN) ./files/reload_config $(1)/sbin/
- $(INSTALL_DATA) ./files/hotplug*.json $(1)/etc/
- @@ -133,21 +113,6 @@ define Package/procd-seccomp/install
- $(INSTALL_DATA) $(PKG_INSTALL_DIR)/usr/lib/libpreload-trace.so $(1)/lib
- endef
-
- -define Package/procd-nand/install
- - $(INSTALL_DIR) $(1)/sbin $(1)/lib/upgrade
- -
- - $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/upgraded $(1)/sbin/
- - $(INSTALL_DATA) ./files/nand.sh $(1)/lib/upgrade/
- -endef
- -
- -define Package/procd-nand-firstboot/install
- - $(INSTALL_DIR) $(1)/lib/preinit
- -
- - $(INSTALL_DATA) ./files/nand-preinit.sh $(1)/lib/preinit/60-nand-firstboot.sh
- -endef
- -
- $(eval $(call BuildPackage,procd))
- $(eval $(call BuildPackage,procd-ujail))
- $(eval $(call BuildPackage,procd-seccomp))
- -$(eval $(call BuildPackage,procd-nand))
- -$(eval $(call BuildPackage,procd-nand-firstboot))
- diff --git a/package/system/procd/files/nand-preinit.sh b/package/system/procd/files/nand-preinit.sh
- deleted file mode 100644
- index cf596246d1f2891cbeb7b5c7cac4bb6e002b13fb..0000000000000000000000000000000000000000
- --- a/package/system/procd/files/nand-preinit.sh
- +++ /dev/null
- @@ -1,21 +0,0 @@
- -#!/bin/sh
- -# Copyright (C) 2014 OpenWrt.org
- -
- -nand_takeover() {
- - . /lib/upgrade/nand.sh
- - mtd=$(find_mtd_index "$CI_UBIPART")
- - esize=$(cat /proc/mtd | grep mtd$mtd |cut -d" " -f 3)
- - [ -z "$esize" ] && return 1
- - esize=$(printf "%d" 0x$esize)
- - for a in `seq 0 64`; do
- - mtd -o $((a * esize)) -l 400 dump /dev/mtd$mtd > /tmp/takeover.hdr
- - MAGIC=$(dd if=/tmp/takeover.hdr bs=1 skip=261 count=5 2> /dev/null)
- - SIZE=$(printf "%d" 0x$(dd if=/tmp/takeover.hdr bs=4 count=1 2> /dev/null | hexdump -v -n 4 -e '1/1 "%02x"'))
- - [ "$MAGIC" = "ustar" ] && {
- - mtd -o $((a * esize)) -l $((SIZE + 4)) dump /dev/mtd$mtd | dd bs=1 skip=4 of=/tmp/sysupgrade.tar
- - nand_do_upgrade_stage2 /tmp/sysupgrade.tar
- - }
- - done
- -}
- -
- -boot_hook_add initramfs nand_takeover
- diff --git a/package/system/procd/files/nand.sh b/package/system/procd/files/nand.sh
- deleted file mode 100644
- index 6bd2005344c081df20e5a330a69e49e37225c39f..0000000000000000000000000000000000000000
- --- a/package/system/procd/files/nand.sh
- +++ /dev/null
- @@ -1,376 +0,0 @@
- -#!/bin/sh
- -# Copyright (C) 2014 OpenWrt.org
- -#
- -
- -. /lib/functions.sh
- -
- -# 'kernel' partition on NAND contains the kernel
- -CI_KERNPART="kernel"
- -
- -# 'ubi' partition on NAND contains UBI
- -CI_UBIPART="ubi"
- -
- -ubi_mknod() {
- - local dir="$1"
- - local dev="/dev/$(basename $dir)"
- -
- - [ -e "$dev" ] && return 0
- -
- - local devid="$(cat $dir/dev)"
- - local major="${devid%%:*}"
- - local minor="${devid##*:}"
- - mknod "$dev" c $major $minor
- -}
- -
- -nand_find_volume() {
- - local ubidevdir ubivoldir
- - ubidevdir="/sys/devices/virtual/ubi/$1"
- - [ ! -d "$ubidevdir" ] && return 1
- - for ubivoldir in $ubidevdir/${1}_*; do
- - [ ! -d "$ubivoldir" ] && continue
- - if [ "$( cat $ubivoldir/name )" = "$2" ]; then
- - basename $ubivoldir
- - ubi_mknod "$ubivoldir"
- - return 0
- - fi
- - done
- -}
- -
- -nand_find_ubi() {
- - local ubidevdir ubidev mtdnum
- - mtdnum="$( find_mtd_index $1 )"
- - [ ! "$mtdnum" ] && return 1
- - for ubidevdir in /sys/devices/virtual/ubi/ubi*; do
- - [ ! -d "$ubidevdir" ] && continue
- - cmtdnum="$( cat $ubidevdir/mtd_num )"
- - [ ! "$mtdnum" ] && continue
- - if [ "$mtdnum" = "$cmtdnum" ]; then
- - ubidev=$( basename $ubidevdir )
- - ubi_mknod "$ubidevdir"
- - echo $ubidev
- - return 0
- - fi
- - done
- -}
- -
- -nand_get_magic_long() {
- - dd if="$1" skip=$2 bs=4 count=1 2>/dev/null | hexdump -v -n 4 -e '1/1 "%02x"'
- -}
- -
- -get_magic_long_tar() {
- - ( tar xf $1 $2 -O | dd bs=4 count=1 | hexdump -v -n 4 -e '1/1 "%02x"') 2> /dev/null
- -}
- -
- -identify_magic() {
- - local magic=$1
- - case "$magic" in
- - "55424923")
- - echo "ubi"
- - ;;
- - "31181006")
- - echo "ubifs"
- - ;;
- - "68737173")
- - echo "squashfs"
- - ;;
- - "d00dfeed")
- - echo "fit"
- - ;;
- - "4349"*)
- - echo "combined"
- - ;;
- - *)
- - echo "unknown $magic"
- - ;;
- - esac
- -}
- -
- -
- -identify() {
- - identify_magic $(nand_get_magic_long "$1" "${2:-0}")
- -}
- -
- -identify_tar() {
- - identify_magic $(get_magic_long_tar "$1" "$2")
- -}
- -
- -nand_restore_config() {
- - sync
- - local ubidev=$( nand_find_ubi $CI_UBIPART )
- - local ubivol="$( nand_find_volume $ubidev rootfs_data )"
- - [ ! "$ubivol" ] &&
- - ubivol="$( nand_find_volume $ubidev rootfs )"
- - mkdir /tmp/new_root
- - if ! mount -t ubifs /dev/$ubivol /tmp/new_root; then
- - echo "mounting ubifs $ubivol failed"
- - rmdir /tmp/new_root
- - return 1
- - fi
- - mv "$1" "/tmp/new_root/sysupgrade.tgz"
- - umount /tmp/new_root
- - sync
- - rmdir /tmp/new_root
- -}
- -
- -nand_upgrade_prepare_ubi() {
- - local rootfs_length="$1"
- - local rootfs_type="$2"
- - local has_kernel="${3:-0}"
- - local has_env="${4:-0}"
- -
- - local mtdnum="$( find_mtd_index "$CI_UBIPART" )"
- - if [ ! "$mtdnum" ]; then
- - echo "cannot find ubi mtd partition $CI_UBIPART"
- - return 1
- - fi
- -
- - local ubidev="$( nand_find_ubi "$CI_UBIPART" )"
- - if [ ! "$ubidev" ]; then
- - ubiattach -m "$mtdnum"
- - sync
- - ubidev="$( nand_find_ubi "$CI_UBIPART" )"
- - fi
- -
- - if [ ! "$ubidev" ]; then
- - ubiformat /dev/mtd$mtdnum -y
- - ubiattach -m "$mtdnum"
- - sync
- - ubidev="$( nand_find_ubi "$CI_UBIPART" )"
- - [ "$has_env" -gt 0 ] && {
- - ubimkvol /dev/$ubidev -n 0 -N ubootenv -s 1MiB
- - ubimkvol /dev/$ubidev -n 1 -N ubootenv2 -s 1MiB
- - }
- - fi
- -
- - local kern_ubivol="$( nand_find_volume $ubidev kernel )"
- - local root_ubivol="$( nand_find_volume $ubidev rootfs )"
- - local data_ubivol="$( nand_find_volume $ubidev rootfs_data )"
- -
- - # remove ubiblock device of rootfs
- - local root_ubiblk="ubiblock${root_ubivol:3}"
- - if [ "$root_ubivol" -a -e "/dev/$root_ubiblk" ]; then
- - echo "removing $root_ubiblk"
- - if ! ubiblock -r /dev/$root_ubivol; then
- - echo "cannot remove $root_ubiblk"
- - return 1;
- - fi
- - fi
- -
- - # kill volumes
- - [ "$kern_ubivol" ] && ubirmvol /dev/$ubidev -N kernel || true
- - [ "$root_ubivol" ] && ubirmvol /dev/$ubidev -N rootfs || true
- - [ "$data_ubivol" ] && ubirmvol /dev/$ubidev -N rootfs_data || true
- -
- - # update kernel
- - if [ "$has_kernel" = "1" ]; then
- - if ! ubimkvol /dev/$ubidev -N kernel -s $kernel_length; then
- - echo "cannot create kernel volume"
- - return 1;
- - fi
- - fi
- -
- - # update rootfs
- - local root_size_param
- - if [ "$rootfs_type" = "ubifs" ]; then
- - root_size_param="-m"
- - else
- - root_size_param="-s $rootfs_length"
- - fi
- - if ! ubimkvol /dev/$ubidev -N rootfs $root_size_param; then
- - echo "cannot create rootfs volume"
- - return 1;
- - fi
- -
- - # create rootfs_data for non-ubifs rootfs
- - if [ "$rootfs_type" != "ubifs" ]; then
- - if ! ubimkvol /dev/$ubidev -N rootfs_data -m; then
- - echo "cannot initialize rootfs_data volume"
- - return 1
- - fi
- - fi
- - sync
- - return 0
- -}
- -
- -nand_do_upgrade_success() {
- - local conf_tar="/tmp/sysupgrade.tgz"
- -
- - sync
- - [ -f "$conf_tar" ] && nand_restore_config "$conf_tar"
- - echo "sysupgrade successful"
- - umount -a
- - reboot -f
- -}
- -
- -# Flash the UBI image to MTD partition
- -nand_upgrade_ubinized() {
- - local ubi_file="$1"
- - local mtdnum="$(find_mtd_index "$CI_UBIPART")"
- -
- - [ ! "$mtdnum" ] && {
- - CI_UBIPART="rootfs"
- - mtdnum="$(find_mtd_index "$CI_UBIPART")"
- - }
- -
- - if [ ! "$mtdnum" ]; then
- - echo "cannot find mtd device $CI_UBIPART"
- - umount -a
- - reboot -f
- - fi
- -
- - local mtddev="/dev/mtd${mtdnum}"
- - ubidetach -p "${mtddev}" || true
- - sync
- - ubiformat "${mtddev}" -y -f "${ubi_file}"
- - ubiattach -p "${mtddev}"
- - nand_do_upgrade_success
- -}
- -
- -# Write the UBIFS image to UBI volume
- -nand_upgrade_ubifs() {
- - local rootfs_length=`(cat $1 | wc -c) 2> /dev/null`
- -
- - nand_upgrade_prepare_ubi "$rootfs_length" "ubifs" "0" "0"
- -
- - local ubidev="$( nand_find_ubi "$CI_UBIPART" )"
- - local root_ubivol="$(nand_find_volume $ubidev rootfs)"
- - ubiupdatevol /dev/$root_ubivol -s $rootfs_length $1
- -
- - nand_do_upgrade_success
- -}
- -
- -nand_board_name() {
- - if type 'platform_nand_board_name' >/dev/null 2>/dev/null; then
- - platform_nand_board_name
- - return
- - fi
- -
- - cat /tmp/sysinfo/board_name
- -}
- -
- -nand_upgrade_tar() {
- - local tar_file="$1"
- - local board_name="$(nand_board_name)"
- - local kernel_mtd="$(find_mtd_index $CI_KERNPART)"
- -
- - local kernel_length=`(tar xf $tar_file sysupgrade-$board_name/kernel -O | wc -c) 2> /dev/null`
- - local rootfs_length=`(tar xf $tar_file sysupgrade-$board_name/root -O | wc -c) 2> /dev/null`
- -
- - local rootfs_type="$(identify_tar "$tar_file" sysupgrade-$board_name/root)"
- -
- - local has_kernel=1
- - local has_env=0
- -
- - [ "$kernel_length" != 0 -a -n "$kernel_mtd" ] && {
- - tar xf $tar_file sysupgrade-$board_name/kernel -O | mtd write - $CI_KERNPART
- - }
- - [ "$kernel_length" = 0 -o ! -z "$kernel_mtd" ] && has_kernel=0
- -
- - nand_upgrade_prepare_ubi "$rootfs_length" "$rootfs_type" "$has_kernel" "$has_env"
- -
- - local ubidev="$( nand_find_ubi "$CI_UBIPART" )"
- - [ "$has_kernel" = "1" ] && {
- - local kern_ubivol="$(nand_find_volume $ubidev kernel)"
- - tar xf $tar_file sysupgrade-$board_name/kernel -O | \
- - ubiupdatevol /dev/$kern_ubivol -s $kernel_length -
- - }
- -
- - local root_ubivol="$(nand_find_volume $ubidev rootfs)"
- - tar xf $tar_file sysupgrade-$board_name/root -O | \
- - ubiupdatevol /dev/$root_ubivol -s $rootfs_length -
- -
- - nand_do_upgrade_success
- -}
- -
- -# Recognize type of passed file and start the upgrade process
- -nand_do_upgrade_stage2() {
- - local file_type=$(identify $1)
- -
- - if type 'platform_nand_pre_upgrade' >/dev/null 2>/dev/null; then
- - platform_nand_pre_upgrade "$1"
- - fi
- -
- - [ ! "$(find_mtd_index "$CI_UBIPART")" ] && CI_UBIPART="rootfs"
- -
- - case "$file_type" in
- - "ubi") nand_upgrade_ubinized $1;;
- - "ubifs") nand_upgrade_ubifs $1;;
- - *) nand_upgrade_tar $1;;
- - esac
- -}
- -
- -nand_upgrade_stage2() {
- - [ $1 = "nand" ] && {
- - [ -f "$2" ] && {
- - touch /tmp/sysupgrade
- -
- - killall -9 telnetd
- - killall -9 dropbear
- - killall -9 ash
- -
- - kill_remaining TERM
- - sleep 3
- - kill_remaining KILL
- -
- - sleep 1
- -
- - if [ -n "$(rootfs_type)" ]; then
- - v "Switching to ramdisk..."
- - run_ramfs ". /lib/functions.sh; include /lib/upgrade; nand_do_upgrade_stage2 $2"
- - else
- - nand_do_upgrade_stage2 $2
- - fi
- - return 0
- - }
- - echo "Nand upgrade failed"
- - exit 1
- - }
- -}
- -
- -nand_upgrade_stage1() {
- - [ -f /tmp/sysupgrade-nand-path ] && {
- - path="$(cat /tmp/sysupgrade-nand-path)"
- - [ "$SAVE_CONFIG" != 1 -a -f "$CONF_TAR" ] &&
- - rm $CONF_TAR
- -
- - ubus call system nandupgrade "{\"prefix\": \"$RAM_ROOT\", \"path\": \"$path\" }"
- - exit 0
- - }
- -}
- -
- -# Check if passed file is a valid one for NAND sysupgrade. Currently it accepts
- -# 3 types of files:
- -# 1) UBI - should contain an ubinized image, header is checked for the proper
- -# MAGIC
- -# 2) UBIFS - should contain UBIFS partition that will replace "rootfs" volume,
- -# header is checked for the proper MAGIC
- -# 3) TAR - archive has to include "sysupgrade-BOARD" directory with a non-empty
- -# "CONTROL" file (at this point its content isn't verified)
- -#
- -# You usually want to call this function in platform_check_image.
- -#
- -# $(1): board name, used in case of passing TAR file
- -# $(2): file to be checked
- -nand_do_platform_check() {
- - local board_name="$1"
- - local tar_file="$2"
- - local control_length=`(tar xf $tar_file sysupgrade-$board_name/CONTROL -O | wc -c) 2> /dev/null`
- - local file_type="$(identify $2)"
- -
- - [ "$control_length" = 0 -a "$file_type" != "ubi" -a "$file_type" != "ubifs" ] && {
- - echo "Invalid sysupgrade file."
- - return 1
- - }
- -
- - return 0
- -}
- -
- -# Start NAND upgrade process
- -#
- -# $(1): file to be used for upgrade
- -nand_do_upgrade() {
- - echo -n $1 > /tmp/sysupgrade-nand-path
- - install_bin /sbin/upgraded
- - ln -s "$RAM_ROOT"/sbin/upgraded /tmp/upgraded
- - nand_upgrade_stage1
- -}
|