diff options
Diffstat (limited to 'package/system/procd')
-rw-r--r-- | package/system/procd/Makefile | 41 | ||||
-rw-r--r-- | package/system/procd/files/nand-preinit.sh | 21 | ||||
-rw-r--r-- | package/system/procd/files/nand.sh | 376 |
3 files changed, 3 insertions, 435 deletions
diff --git a/package/system/procd/Makefile b/package/system/procd/Makefile index 805583143f..775b9a64e1 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 cf596246d1..0000000000 --- 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 9c831df3b4..0000000000 --- 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="${CI_KERNPART:-kernel}" - -# 'ubi' partition on NAND contains UBI -CI_UBIPART="${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 -} |