52d28c1140
The staged sysupgrade allows to properly unmount the rootfs before writing the new partitions. This will fix upgrades losing configuration when parition sizes change on x86 and similar image types.
935 lines
25 KiB
Diff
935 lines
25 KiB
Diff
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 78c3dc9390cf58fde8483596563c2e6e5e500887..aeef3dbc12f0c5ffdef0e7034e5446bfe1a1c7c4 100644
|
|
--- a/package/base-files/Makefile
|
|
+++ b/package/base-files/Makefile
|
|
@@ -18,7 +18,9 @@ PKG_FILE_DEPENDS:=$(PLATFORM_DIR)/ $(GENERIC_PLATFORM_DIR)/base-files/
|
|
PKG_BUILD_DEPENDS:=usign/host
|
|
PKG_LICENSE:=GPL-2.0
|
|
|
|
-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
|
|
|
|
@@ -30,7 +32,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)
|
|
@@ -105,9 +107,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 805583143fa865d9ffb38355f10ad300e222400e..775b9a64e172b250b3ba27e71fbf07aff46ede14 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
|
|
-}
|