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 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 cead3b9b7a5f83879a1aee08ab0463049dd228f4..2a42db1fc034b554860393cfd9b17ed8423d7bc4 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
|
|
-}
|