From 92fb9c94bda034c263b38fbf5a5cf62b3a532353 Mon Sep 17 00:00:00 2001 From: Ying Xie Date: Fri, 13 Aug 2021 09:01:34 -0700 Subject: [PATCH] [aboot] use ram partition for /var/log for devices with 3.7G disks (#8400) Master/202012 image size grew quite a bit. 3.7G harddrive can no longer hold one image and safely upgrade to another image. Every bit of harddrive space is precious to save now. Also sh syntax seemingly changed, [ condition ] && action was a legit syntax in 201911 branch but it is an error when condition not met with 202012 or later images. Change the syntax to if statement to avoid the issue. Signed-off-by: Ying Xie ying.xie@microsoft.com --- files/Aboot/boot0.j2 | 12 +++-- files/initramfs-tools/union-mount.j2 | 72 ++++++++++++++++++---------- 2 files changed, 55 insertions(+), 29 deletions(-) diff --git a/files/Aboot/boot0.j2 b/files/Aboot/boot0.j2 index 3317e6282d46..3052f13d583b 100644 --- a/files/Aboot/boot0.j2 +++ b/files/Aboot/boot0.j2 @@ -591,12 +591,16 @@ write_platform_specific_cmdline() { if [ $flash_size -ge 28000 ]; then varlog_size=4096 - elif [ $flash_size -ge 3700 ]; then + elif [ $flash_size -gt 3700 ]; then varlog_size=400 - elif [ $flash_size -le 2000 ]; then - # enable docker_inram for switches with less than 2G of flash - cmdline_add docker_inram=on + else + varlog_size=256 cmdline_add logs_inram=on + if [ $flash_size -le 2000 ]; then + # enable docker_inram for switches with less than 2G of flash + varlog_size=128 + cmdline_add docker_inram=on + fi fi cmdline_add "varlog_size=$varlog_size" diff --git a/files/initramfs-tools/union-mount.j2 b/files/initramfs-tools/union-mount.j2 index a2b5a5266da6..3ffe2f633d87 100644 --- a/files/initramfs-tools/union-mount.j2 +++ b/files/initramfs-tools/union-mount.j2 @@ -15,6 +15,7 @@ docker_inram=false logs_inram=false secureboot=false bootloader=generic +varlog_size=0 # Extract kernel parameters for x in $(cat /proc/cmdline); do @@ -28,6 +29,9 @@ for x in $(cat /proc/cmdline); do logs_inram=on) logs_inram=true ;; + varlog_size=*) + varlog_size="${x#varlog_size=}" + ;; secure_boot_enable=[y1]) secureboot=true docker_inram=true @@ -40,22 +44,31 @@ done set_tmpfs_log_partition_size() { - varlogsize=128 - - # set varlogsize to existing var-log.ext4 size - if [ -f ${rootmnt}/host/disk-img/var-log.ext4 ]; then - varlogsize=$(ls -l ${rootmnt}/host/disk-img/var-log.ext4 | awk '{print $5}') - varlogsize=$(($varlogsize/1024/1024)) - fi - - # make sure varlogsize is between 5% to 10% of total memory size - memkb=$(grep MemTotal /proc/meminfo | awk '{print $2}') - memmb=$(($memkb/1024)) - minsize=$(($memmb*5/100)) - maxsize=$(($memmb*10/100)) - - [ $minsize -ge $varlogsize ] && varlogsize=$minsize - [ $maxsize -le $varlogsize ] && varlogsize=$maxsize + if [ $varlog_size -gt 0 ]; then + # Use the varlog_size passed in from command line + varlogsize=$varlog_size + else + varlogsize=128 + + # set varlogsize to existing var-log.ext4 size + if [ -f ${rootmnt}/host/disk-img/var-log.ext4 ]; then + varlogsize=$(ls -l ${rootmnt}/host/disk-img/var-log.ext4 | awk '{print $5}') + varlogsize=$(($varlogsize/1024/1024)) + fi + fi + + # make sure varlogsize is between 5% to 10% of total memory size + memkb=$(grep MemTotal /proc/meminfo | awk '{print $2}') + memmb=$(($memkb/1024)) + minsize=$(($memmb*5/100)) + maxsize=$(($memmb*10/100)) + + if [ $minsize -ge $varlogsize ]; then + varlogsize=$minsize + fi + if [ $maxsize -le $varlogsize ]; then + varlogsize=$maxsize + fi } remove_not_in_allowlist_files() @@ -145,16 +158,25 @@ mount --bind ${rootmnt}/host/$image_dir/boot ${rootmnt}/boot ## Mount loop device or tmpfs for /var/log if $logs_inram; then - # NOTE: some platforms, when reaching initramfs stage, have a small - # limit of mounting tmpfs partition, potentially due to amount - # of RAM available in this stage. e.g. Arista 7050-qx32[s] and 7060-cx32s - set_tmpfs_log_partition_size - mount -t tmpfs -o rw,nosuid,nodev,size=${varlogsize}M tmpfs ${rootmnt}/var/log - [ -f ${rootmnt}/host/disk-img/var-log.ext4 ] && rm -rf ${rootmnt}/host/disk-img/var-log.ext4 + # NOTE: some platforms, when reaching initramfs stage, have a small + # limit of mounting tmpfs partition, potentially due to amount + # of RAM available in this stage. Therefore limiting the size + # set for tmpfs partitions. + # + # Another reason for using tmpfs /var/log partition is: + # Some platforms have a small flash and therefore the log partition takes valuable space. + # To improve the longevity of these devices storing the logs in memory will permit more + # SONiC image growth before being bottlenecked. + set_tmpfs_log_partition_size + mount -t tmpfs -o rw,nosuid,nodev,size=${varlogsize}M tmpfs ${rootmnt}/var/log + if [ -f ${rootmnt}/host/disk-img/var-log.ext4 ]; then + rm -rf ${rootmnt}/host/disk-img/var-log.ext4 + fi else - [ -f ${rootmnt}/host/disk-img/var-log.ext4 ] && fsck.ext4 -v -p ${rootmnt}/host/disk-img/var-log.ext4 2>&1 \ - | gzip -c >> /tmp/fsck.log.gz - [ -f ${rootmnt}/host/disk-img/var-log.ext4 ] && mount -t ext4 -o loop,rw ${rootmnt}/host/disk-img/var-log.ext4 ${rootmnt}/var/log + if [ -f ${rootmnt}/host/disk-img/var-log.ext4 ]; then + fsck.ext4 -v -p ${rootmnt}/host/disk-img/var-log.ext4 2>&1 | gzip -c >> /tmp/fsck.log.gz + mount -t ext4 -o loop,rw ${rootmnt}/host/disk-img/var-log.ext4 ${rootmnt}/var/log + fi fi ## fscklog file: /tmp will be lost when overlayfs is mounted