mirror of
https://github.com/openwrt/openwrt.git
synced 2024-12-30 18:47:06 +00:00
9bc782dfd8
This commit adds the logic required to install OpenWrt on a Cisco/Viptela vEdge 1000 while nicely integrating with the already present bootloader and making it possible to roll back to stock OS. The vEdge 1000 has a built-in SSD with a ext2 partition from which the stock u-boot boots the Linux kernel from. In order for Linux not to be confused about which partition the root file system is on, there are some tricks needed to ensure the partition is identifiable at boot time. For this we use blkid as part of the scripts, and sfdisk as part of the manual installation process documented on the wiki. Thus, those packages have been added as a platform dependency. Finally, the u-boot environment is updated which requires the use of uboot-envtools. Tested on a Cisco vEdge 1000. Signed-off-by: Christian Svensson <blue@cmd.nu> Link: https://github.com/openwrt/openwrt/pull/16140 Signed-off-by: Robert Marko <robimarko@gmail.com>
183 lines
4.2 KiB
Bash
Executable File
183 lines
4.2 KiB
Bash
Executable File
#
|
|
# Copyright (C) 2021 OpenWrt.org
|
|
#
|
|
|
|
if [ -x /usr/sbin/blkid ]; then
|
|
RAMFS_COPY_BIN="/usr/sbin/blkid"
|
|
fi
|
|
|
|
platform_get_rootfs() {
|
|
local rootfsdev
|
|
local rootpartuuid
|
|
|
|
if read cmdline < /proc/cmdline; then
|
|
case "$cmdline" in
|
|
*root=PARTUUID=*)
|
|
rootpartuuid="${cmdline##*root=PARTUUID=}"
|
|
rootpartuuid="${rootpartuuid%% *}"
|
|
rootfsdev="$(blkid -o device -t PARTUUID="${rootpartuuid}")"
|
|
;;
|
|
*root=*)
|
|
rootfsdev="${cmdline##*root=}"
|
|
rootfsdev="${rootfsdev%% *}"
|
|
;;
|
|
esac
|
|
|
|
echo "${rootfsdev}"
|
|
fi
|
|
}
|
|
|
|
platform_get_n821_disk() {
|
|
local partnum=$1
|
|
local DEVNAME
|
|
while read line; do
|
|
export -n "${line}"
|
|
done < $(find /sys/bus/platform/devices/16f0000000000.ehci/ -path \*block/sd[a-z]/uevent)
|
|
echo "/dev/${DEVNAME}${partnum}"
|
|
}
|
|
|
|
platform_copy_config_helper() {
|
|
local device=$1
|
|
local fstype=$2
|
|
|
|
mount -t "${fstype}" "$device" /mnt
|
|
cp -af "$UPGRADE_BACKUP" "/mnt/$BACKUP_FILE"
|
|
umount /mnt
|
|
}
|
|
|
|
platform_copy_config() {
|
|
case "$(board_name)" in
|
|
erlite|\
|
|
ubnt,usg)
|
|
platform_copy_config_helper /dev/sda1 vfat
|
|
;;
|
|
itus,shield-router)
|
|
platform_copy_config_helper /dev/mmcblk1p1 vfat
|
|
;;
|
|
er|\
|
|
ubnt,edgerouter-4|\
|
|
ubnt,edgerouter-6p)
|
|
platform_copy_config_helper /dev/mmcblk0p1 vfat
|
|
;;
|
|
cisco,vedge1000)
|
|
platform_copy_config_helper "$(platform_get_n821_disk 1)" ext2
|
|
;;
|
|
esac
|
|
}
|
|
|
|
platform_do_flash() {
|
|
local tar_file=$1
|
|
local board=$2
|
|
local kernel=$3
|
|
local rootfs=$4
|
|
|
|
local board_dir=$(tar tf "$tar_file" | grep -m 1 '^sysupgrade-.*/$')
|
|
board_dir=${board_dir%/}
|
|
[ -n "$board_dir" ] || return 1
|
|
|
|
mkdir -p /boot
|
|
|
|
if [ $board = "itus,shield-router" ]; then
|
|
# mmcblk1p1 (fat) contains all ELF-bin images for the Shield
|
|
mount /dev/mmcblk1p1 /boot
|
|
|
|
echo "flashing Itus Kernel to /boot/$kernel (/dev/mmblk1p1)"
|
|
tar -Oxf $tar_file "$board_dir/kernel" > /boot/$kernel
|
|
else
|
|
if [ "${board}" = "cisco,vedge1000" ]; then
|
|
local rootpartuuid
|
|
rootpartuuid="$(/usr/sbin/blkid -o value -s PARTUUID "${rootfs}")"
|
|
if [ -n "${rootpartuuid}" ]; then
|
|
echo "setting root partition to PARTUUID=${rootpartuuid}"
|
|
fw_setenv bootcmd 'usb start; ext2load usb 0:1 $loadaddr vmlinux.64; bootoctlinux $loadaddr coremask=f endbootargs rootfstype=squashfs rootwait root=PARTUUID='"${rootpartuuid}"
|
|
else
|
|
echo "WARNING: unable to figure out root partition UUID, leaving bootcmd unchanged"
|
|
fi
|
|
mount -t ext2 "${kernel}" /boot
|
|
else
|
|
mount -t vfat "${kernel}" /boot
|
|
fi
|
|
|
|
[ -f /boot/vmlinux.64 -a ! -L /boot/vmlinux.64 ] && {
|
|
mv /boot/vmlinux.64 /boot/vmlinux.64.previous
|
|
mv /boot/vmlinux.64.md5 /boot/vmlinux.64.md5.previous
|
|
}
|
|
|
|
echo "flashing kernel to $(awk '/\/boot/ {print $1}' /proc/mounts)"
|
|
tar xf $tar_file $board_dir/kernel -O > /boot/vmlinux.64
|
|
md5sum /boot/vmlinux.64 | cut -f1 -d " " > /boot/vmlinux.64.md5
|
|
fi
|
|
|
|
echo "flashing rootfs to ${rootfs}"
|
|
tar xf $tar_file $board_dir/root -O | dd of="${rootfs}" bs=4096
|
|
|
|
sync
|
|
umount /boot
|
|
}
|
|
|
|
platform_do_upgrade() {
|
|
local tar_file="$1"
|
|
local board=$(board_name)
|
|
local rootfs="$(platform_get_rootfs)"
|
|
local kernel=
|
|
|
|
if [ ! -b "${rootfs}" ] && [ "${board}" = "cisco,vedge1000" ]; then
|
|
# Default to the built-in USB disk for N821
|
|
rootfs="$(platform_get_n821_disk 2)"
|
|
fi
|
|
[ -b "${rootfs}" ] || return 1
|
|
case "$board" in
|
|
er | \
|
|
ubnt,edgerouter-4 | \
|
|
ubnt,edgerouter-6p)
|
|
kernel=/dev/mmcblk0p1
|
|
;;
|
|
erlite|\
|
|
ubnt,usg)
|
|
kernel=/dev/sda1
|
|
;;
|
|
itus,shield-router)
|
|
kernel=ItusrouterImage
|
|
;;
|
|
cisco,vedge1000)
|
|
kernel="$(platform_get_n821_disk 1)"
|
|
;;
|
|
*)
|
|
return 1
|
|
esac
|
|
|
|
platform_do_flash $tar_file $board $kernel $rootfs
|
|
|
|
return 0
|
|
}
|
|
|
|
platform_check_image() {
|
|
local board=$(board_name)
|
|
local tar_file="$1"
|
|
|
|
local board_dir=$(tar tf "$tar_file" | grep -m 1 '^sysupgrade-.*/$')
|
|
board_dir=${board_dir%/}
|
|
[ -n "$board_dir" ] || return 1
|
|
|
|
case "$board" in
|
|
er | \
|
|
erlite | \
|
|
itus,shield-router | \
|
|
ubnt,edgerouter-4 | \
|
|
ubnt,edgerouter-6p | \
|
|
ubnt,usg | \
|
|
cisco,vedge1000)
|
|
local kernel_length=$(tar xf $tar_file $board_dir/kernel -O | wc -c 2> /dev/null)
|
|
local rootfs_length=$(tar xf $tar_file $board_dir/root -O | wc -c 2> /dev/null)
|
|
[ "$kernel_length" = 0 -o "$rootfs_length" = 0 ] && {
|
|
echo "The upgrade image is corrupt."
|
|
return 1
|
|
}
|
|
return 0
|
|
;;
|
|
esac
|
|
|
|
echo "Sysupgrade is not yet supported on $board."
|
|
return 1
|
|
}
|