1919# This script generates the corresponding SONiC installer images for Bluefield
2020# 1) BFB Image
2121# 2) PXE Archive for Network Booting
22+ # 3) BIN Image for SONiC-SONiC Installation
2223
2324set -e
2425
2526WDIR=
26- IMAGE_VER =
27- KERNEL =
27+ IMAGE_VERSION =
28+ KERNEL_VERSION =
2829CHROOT_DIR=
2930INITRD=
3031VMLINUZ=
@@ -41,6 +42,8 @@ TARGET_MACHINE=nvidia-bluefield
4142BFB=" ${BFB:-/ lib/ firmware/ mellanox/ boot/ default.bfb} "
4243GRUB_AA64=grubnetaa64.efi
4344CONSOLE_PARAM=" console=ttyAMA1 console=hvc0 console=ttyAMA0 earlycon=pl011,0x01000000 earlycon=pl011,0x01800000"
45+ GRUB_CFG=" " # Common Grub Config
46+ DEFAULT_GRUB_CMDLINE_LINUX=" $CONSOLE_PARAM quiet"
4447
4548usage () {
4649cat << EOF
@@ -65,7 +68,7 @@ parse_args() {
6568 ;;
6669 -k|--kernel)
6770 shift
68- KERNEL =$1
71+ KERNEL_VERSION =$1
6972 ;;
7073 * )
7174 usage
@@ -76,12 +79,81 @@ parse_args() {
7679 done
7780}
7881
79- validate_config () {
80- if [[ ! -d " $CHROOT_DIR " ]]; then
81- echo " [create_sonic_image] Error! Path to CHROOT not found"
82+ clean_dir ()
83+ {
84+ rm -rf $1
85+ exit $2
86+ }
87+
88+ generate_s2s_installer_image_bluefield ()
89+ {
90+ if [ ! -d /sonic/installer ] || [ ! -r /sonic/installer/sharch_body.sh ] ; then
91+ echo " Error: Invalid installer script directory: installer"
92+ exit 1
93+ fi
94+
95+ if [ ! -d /sonic/installer/bluefield ] || [ ! -r /sonic/installer/bluefield/sonic_to_sonic.sh.j2 ] ; then
96+ echo " Error: Invalid arch installer directory: installer/bluefield"
8297 exit 1
8398 fi
8499
100+ # Copy platform-specific installer config files
101+ rm -rf /sonic/installer/bluefield/platforms/
102+ mkdir -p /sonic/installer/bluefield/platforms/
103+ for PLATFORM in ` ls ./device/nvidia-bluefield` ; do
104+ if [ -f /sonic/device/nvidia-bluefield/$PLATFORM /installer.conf ]; then
105+ cp /sonic/device/nvidia-bluefield/$PLATFORM /installer.conf /sonic/installer/bluefield/platforms/$PLATFORM
106+ fi
107+ done
108+
109+ echo -n " Building self-extracting installer image ."
110+ tmp_dir=$( mktemp --directory)
111+ tmp_installdir=" $tmp_dir /installer"
112+ mkdir $tmp_installdir || clean_dir $tmp_dir 1
113+
114+ # Replace the build time flags inside the sonic_to_sonic.sh script
115+ j2 /sonic/installer/bluefield/sonic_to_sonic.sh.j2 -o $tmp_installdir /install.sh || clean_dir $tmp_dir 1
116+ chmod 0755 $tmp_installdir /install.sh
117+
118+ # Copy the payload file
119+ cp $ONIE_INSTALLER_PAYLOAD $tmp_installdir || clean_dir $tmp_dir 1
120+
121+ # Create machine.conf file
122+ echo " machine=nvidia-bluefield" > $tmp_installdir /machine.conf
123+ echo " platform=arm64" >> $tmp_installdir /machine.conf
124+
125+ sharch=" $tmp_dir /sharch.tar"
126+ tar -C $tmp_dir -cf $sharch installer || {
127+ echo " Error: Problems creating $sharch archive"
128+ clean_dir $tmp_dir 1
129+ }
130+
131+ [ -f " $sharch " ] || {
132+ echo " Error: $sharch not found"
133+ clean_dir $tmp_dir 1
134+ }
135+
136+ sha1=$( cat $sharch | sha1sum | awk ' {print $1}' )
137+ echo -n " ."
138+
139+ cp /sonic/installer/sharch_body.sh /sonic/$OUTPUT_ONIE_IMAGE || {
140+ echo " Error: Problems copying sharch_body.sh"
141+ clean_dir 1
142+ }
143+
144+ # Replace variables in the sharch template
145+ sed -i -e " s/%%IMAGE_SHA1%%/$sha1 /" /sonic/$OUTPUT_ONIE_IMAGE
146+ echo -n " ."
147+ cat $sharch >> /sonic/$OUTPUT_ONIE_IMAGE
148+ rm -rf $tmp_dir
149+
150+ echo " Done."
151+ echo " Success: sonic-sonic installer install image for bluefield is ready in /sonic/${OUTPUT_ONIE_IMAGE} :"
152+
153+ clean_dir $tmp_dir 0
154+ }
155+
156+ validate_config () {
85157 if [[ ! -f " $INITRD " ]]; then
86158 echo " [create_sonic_image] Error! SONiC INITRD not found"
87159 exit 1
@@ -160,15 +232,8 @@ add_sonic_to_initramfs() {
160232 # Add the logic to put second stage installer into bfb initramfs
161233 mkdir -p debian
162234
163- cp ${SDIR} /install.sh temp_install.sh
164- sed -i -e " s/%%IMAGE_VERSION%%/$IMAGE_VER /g" temp_install.sh
165- sed -i -e " s/%%INSTALLER_PAYLOAD%%/$ONIE_INSTALLER_PAYLOAD /g" temp_install.sh
166- sed -i -e " s/%%FILESYSTEM_DOCKERFS%%/$FILESYSTEM_DOCKERFS /g" temp_install.sh
167- sed -i -e " s/%%DOCKERFS_DIR%%/$DOCKERFS_DIR /g" temp_install.sh
168- sed -i -e " s/%%FILESYSTEM_SQUASHFS%%/$FILESYSTEM_SQUASHFS /g" temp_install.sh
169- sed -i -e " s/%%KERNEL_VERSION%%/$KERNEL /g" temp_install.sh
170- install -m 0755 temp_install.sh ./debian/install.sh
171- rm -f temp_install.sh
235+ j2 ${SDIR} /install.sh.j2 -o ./debian/install.sh
236+ chmod 0755 ./debian/install.sh
172237
173238 # Copy the INSTALLER payload
174239 cp $CDIR /$ONIE_INSTALLER_PAYLOAD ./debian/
@@ -182,7 +247,7 @@ printf_msg()
182247 return 0
183248}
184249
185- depmod -a $KERNEL > /dev/null 2>&1
250+ depmod -a $KERNEL_VERSION > /dev/null 2>&1
186251insmod /usr/lib/modules/5.10.0-8-2-arm64/kernel/drivers/virtio/virtio.ko > /dev/null 2>&1
187252insmod /usr/lib/modules/5.10.0-8-2-arm64/kernel/drivers/virtio/virtio_ring.ko > /dev/null 2>&1
188253insmod /efivarfs.ko > /dev/null 2>&1
@@ -318,7 +383,7 @@ create_bfb_image() {
318383 copy_bin $tool
319384 done
320385
321- sudo depmod -a -b ./ $KERNEL
386+ sudo depmod -a -b ./ $KERNEL_VERSION
322387 mkdir -p usr/share/misc/ bin/ var/log/watchdog
323388 sudo cp /etc/watchdog.conf etc
324389 sudo cp /usr/share/misc/pci.ids usr/share/misc/
@@ -390,22 +455,40 @@ main() {
390455
391456 . $CDIR /onie-image-arm64.conf
392457
458+ # Export ENV Variables for j2cli
393459 CHROOT_DIR=$CDIR /$FILESYSTEM_ROOT
394- INITRD=$CDIR /$FILESYSTEM_ROOT /boot/initrd.img-$KERNEL
395- VMLINUZ=$CDIR /$FILESYSTEM_ROOT /boot/vmlinuz-$KERNEL
396- MODULES_DIR=$CDIR /$FILESYSTEM_ROOT /lib/modules/$KERNEL
397- EFIVARS_MOD=$MODULES_DIR /kernel/fs/efivarfs/efivarfs.ko
398- WATCHDOG=$MODULES_DIR /kernel/drivers/watchdog/sbsa_gwdt.ko
399- IMAGE_VER=$( cat $CHROOT_DIR /etc/sonic/sonic_version.yml | grep " build_version" | sed -e " s/build_version: //g;s/'//g" )
400- validate_config
460+ if [[ ! -d " $CHROOT_DIR " ]]; then
461+ echo " [create_sonic_image] Error! Path to CHROOT not found"
462+ exit 1
463+ fi
464+
465+ export GRUB_CFG=$( cat /sonic/installer/bluefield/sonic-grub.cfg)
466+ export IMAGE_VERSION=$( cat $CHROOT_DIR /etc/sonic/sonic_version.yml | grep " build_version" | sed -e " s/build_version: //g;s/'//g" )
467+ export DEFAULT_GRUB_CMDLINE_LINUX ONIE_INSTALLER_PAYLOAD FILESYSTEM_DOCKERFS DOCKERFS_DIR FILESYSTEM_SQUASHFS KERNEL_VERSION
401468
402- create_workdir
403- echo " Work directory: $WDIR "
469+ if [[ $IMAGE_TYPE == bin ]]; then
470+ # bluefield Doesn't have ONiE Support yet and this *.bin image generated can only be used for SONiC-SONiC installation
471+ echo " Build SONiC to SONiC installer for Bluefield"
472+ mkdir -p ` dirname $OUTPUT_ONIE_IMAGE `
473+ sudo rm -f $OUTPUT_ONIE_IMAGE
474+ generate_s2s_installer_image_bluefield
475+ else
476+ INITRD=$CDIR /$FILESYSTEM_ROOT /boot/initrd.img-$KERNEL_VERSION
477+ VMLINUZ=$CDIR /$FILESYSTEM_ROOT /boot/vmlinuz-$KERNEL_VERSION
478+ MODULES_DIR=$CDIR /$FILESYSTEM_ROOT /lib/modules/$KERNEL_VERSION
479+ EFIVARS_MOD=$MODULES_DIR /kernel/fs/efivarfs/efivarfs.ko
480+ WATCHDOG=$MODULES_DIR /kernel/drivers/watchdog/sbsa_gwdt.ko
481+
482+ validate_config
404483
405- create_bfb_image
484+ create_workdir
485+ echo " Work directory: $WDIR "
406486
407- if [[ $IMAGE_TYPE == pxe ]]; then
408- create_pxe_archive
487+ create_bfb_image
488+
489+ if [[ $IMAGE_TYPE == pxe ]]; then
490+ create_pxe_archive
491+ fi
409492 fi
410493}
411494
0 commit comments