ca214b947c
* Bump sonic-platform-modules-arista Improves i2c performance for xcvrs Fix the led_plugin by ignoring unknown ports Miscellaneous improvements * Fix index column for Arista-7260CX3-D108C8 * Fix flash permissions for Arista platforms The ext4 flash uses acl to properly handle permissions in EOS. Aboot isn't built with this support and therefore can't be used to set the flash permissions. It has to be deferred in sonic initrd.
182 lines
5.8 KiB
Django/Jinja
182 lines
5.8 KiB
Django/Jinja
#!/bin/sh
|
|
# Copyright (C) 2016 Arista Networks, Inc.
|
|
#
|
|
# This program is free software: you can redistribute it and/or modify
|
|
# it under the terms of the GNU General Public License as published by
|
|
# the Free Software Foundation, either version 3 of the License, or
|
|
# (at your option) any later version.
|
|
#
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
# Aboot stage 0 boot
|
|
|
|
set -x
|
|
|
|
kernel=boot/vmlinuz-3.16.0-4-amd64
|
|
initrd=boot/initrd.img-3.16.0-4-amd64
|
|
kernel_params=kernel-params
|
|
|
|
aboot_machine="arista_unknown"
|
|
|
|
[ -z "$target_path" ] && target_path=/mnt/flash
|
|
image_path="$target_path/image-%%IMAGE_VERSION%%"
|
|
|
|
# expect the swi to be a non empty file
|
|
[ -s "$swipath" ] || exit 1
|
|
|
|
bootconfigvars="SWI SWI_COPY POST_LEVEL CONSOLESPEED PASSWORD NETDEV NETAUTO NETIP NETMASK NETGW NETDOMAIN NETDNS NETHW memtest"
|
|
|
|
parse_environment_config() {
|
|
for n in ${bootconfigvars}; do
|
|
eval v="\$$n"
|
|
if [ "$v" ]; then
|
|
echo "$n=$v"
|
|
fi
|
|
done
|
|
}
|
|
|
|
clean_flash() {
|
|
## Remove all the other unnecssary files except swi file, boot-config
|
|
for f in $(ls -A $target_path); do
|
|
if [ $f != "${swipath##*/}" ] &&
|
|
[ $f != "boot-config" ] &&
|
|
[ $f != "minigraph.xml" ]
|
|
then
|
|
rm -rf "$target_path/$f"
|
|
fi
|
|
done
|
|
}
|
|
|
|
extract_image() {
|
|
|
|
mkdir -p "$image_path"
|
|
|
|
## Unzip the image except boot0 and dockerfs archive
|
|
unzip -oq "$swipath" -x boot0 {{ FILESYSTEM_DOCKERFS }} -d "$image_path"
|
|
|
|
## detect rootfs type
|
|
rootfs_type=`grep " $target_path " /proc/mounts | cut -d' ' -f3`
|
|
|
|
## vfat does not support symbol link
|
|
if [ -n "$sonic_upgrade" ] || [ "$rootfs_type" != "vfat" ]; then
|
|
mkdir -p "$image_path/{{ DOCKERFS_DIR }}"
|
|
|
|
if [ -n "$sonic_upgrade" ]; then
|
|
TAR_EXTRA_OPTION="--numeric-owner"
|
|
fi
|
|
|
|
## extract docker archive
|
|
unzip -oqp "$swipath" {{ FILESYSTEM_DOCKERFS }} | tar xzf - -C "$image_path/{{ DOCKERFS_DIR }}" $TAR_EXTRA_OPTION
|
|
else
|
|
## save dockerfs archive in the image directory
|
|
unzip -oq "$swipath" {{ FILESYSTEM_DOCKERFS }} -d "$image_path"
|
|
echo "$target_path is $rootfs_type, extract {{ FILESYSTEM_DOCKERFS }} in later stage"
|
|
fi
|
|
|
|
## use new reduced-size boot swi
|
|
echo "SWI=flash:image-%%IMAGE_VERSION%%/{{ ABOOT_BOOT_IMAGE }}" > "$target_path/boot-config"
|
|
|
|
## Remove installer swi as it has lots of redundunt contents
|
|
rm -f "$swipath"
|
|
|
|
## sync disk operations
|
|
sync
|
|
}
|
|
|
|
write_machine_config() {
|
|
## Detect SKU and create a hardware description file
|
|
aboot_version=$(grep ^Aboot /etc/cmdline | sed 's/^.*norcal.-//')
|
|
aboot_build_date=$(stat -c %y /bin/sysinit | sed 's/ /T/')
|
|
cat <<EOF > ${target_path}/machine.conf
|
|
aboot_version=$aboot_version
|
|
aboot_vendor=arista
|
|
aboot_platform=x86_64-$aboot_machine
|
|
aboot_machine=$aboot_machine
|
|
aboot_arch=x86_64
|
|
aboot_build_date=$aboot_build_date
|
|
EOF
|
|
}
|
|
|
|
platform_specific() {
|
|
local platform="$(grep -Eo 'platform=[^ ]+' /etc/cmdline | cut -f2 -d=)"
|
|
local sid="$(grep -Eo 'sid=[^ ]+' /etc/cmdline | cut -f2 -d=)"
|
|
|
|
# set varlog size to 100MB
|
|
local varlog_size=100
|
|
|
|
# This is temporary as the platform= and sid= parameters don't provide enough
|
|
# information to identify the SKU
|
|
# An initramfs hook or a later processing done by the initscripts will be
|
|
# required to read the system eeprom
|
|
if [ "$platform" = "raven" ]; then
|
|
aboot_machine=arista_7050_qx32
|
|
echo "modprobe.blacklist=radeon" >>/tmp/append
|
|
fi
|
|
if [ "$platform" = "crow" ]; then
|
|
aboot_machine=arista_7050_qx32s
|
|
echo "modprobe.blacklist=radeon" >>/tmp/append
|
|
fi
|
|
if [ "$sid" = "Upperlake" ] || [ "$sid" = "UpperlakeES" ]; then
|
|
aboot_machine=arista_7060_cx32s
|
|
echo "amd_iommu=off" >> /tmp/append
|
|
fi
|
|
if [ "$sid" = "Gardena" ] || [ "$sid" = "GardenaSsd" ]; then
|
|
aboot_machine=arista_7260cx3_64
|
|
fi
|
|
if [ "$platform" = "rook" ]; then
|
|
varlog_size=200
|
|
readprefdl -f /tmp/.system-prefdl -d > /mnt/flash/.system-prefdl
|
|
fi
|
|
|
|
echo "varlog_size=$varlog_size" >>/tmp/append
|
|
}
|
|
|
|
# check the hash file in the image, and determine to install or just skip
|
|
GIT_REVISION=$(unzip -p "$swipath" .imagehash)
|
|
LOCAL_IMAGEHASH=$(cat $image_path/.imagehash 2>/dev/null || true)
|
|
if [ "$GIT_REVISION" != "$LOCAL_IMAGEHASH" ]; then
|
|
[ -z "$sonic_upgrade" ] && clean_flash
|
|
extract_image
|
|
fi
|
|
|
|
[ -z "$sonic_upgrade" ] || exit 0
|
|
|
|
# build the new cmdline
|
|
echo "$append" >/tmp/append
|
|
parse_environment_config >>/tmp/append
|
|
cat /etc/cmdline | sed "/^\(${bootconfigvars// /\|}\|crashkernel\|loglevel\|ignore_loglevel\)\(\$\|=\)/d;/^\$/d" >>/tmp/append
|
|
|
|
echo "rw loop=image-%%IMAGE_VERSION%%/fs.squashfs loopfstype=squashfs apparmor=1 security=apparmor quiet" >>/tmp/append
|
|
|
|
# process platform specific operations
|
|
platform_specific
|
|
|
|
[ -e ${taget_path}/machine.conf ] || write_machine_config
|
|
|
|
# use extra parameters from kernel-params hook if the file exists
|
|
if [ -f "$image_path/$kernel_params" ]; then
|
|
cat "$image_path/$kernel_params" >>/tmp/append
|
|
fi
|
|
|
|
# setting root partition if not overridden by kernel-params
|
|
if ! grep -q "root=" /tmp/append; then
|
|
rootdev=$(mount | grep '/mnt/flash' | cut -f1 -d' ')
|
|
rootfstype=$(mount | grep '/mnt/flash' | cut -f5 -d' ')
|
|
echo "root=$rootdev" >>/tmp/append
|
|
fi
|
|
|
|
# chainloading using kexec
|
|
initrd_path="$image_path/$initrd"
|
|
kernel_path="$image_path/$kernel"
|
|
cmdline="$(tr '\n' ' ' </tmp/append)"
|
|
|
|
kexec --load --initrd="$initrd_path" --append="$cmdline" "$kernel_path"
|
|
[ -z "$testonly" ] || exit 0
|
|
kexec --exec
|