[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
This commit is contained in:
Ying Xie 2021-08-13 09:01:34 -07:00 committed by Guohan Lu
parent 5ed6b64c99
commit 92fb9c94bd
2 changed files with 52 additions and 26 deletions

View File

@ -591,12 +591,16 @@ write_platform_specific_cmdline() {
if [ $flash_size -ge 28000 ]; then if [ $flash_size -ge 28000 ]; then
varlog_size=4096 varlog_size=4096
elif [ $flash_size -ge 3700 ]; then elif [ $flash_size -gt 3700 ]; then
varlog_size=400 varlog_size=400
elif [ $flash_size -le 2000 ]; then else
# enable docker_inram for switches with less than 2G of flash varlog_size=256
cmdline_add docker_inram=on
cmdline_add logs_inram=on 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 fi
cmdline_add "varlog_size=$varlog_size" cmdline_add "varlog_size=$varlog_size"

View File

@ -15,6 +15,7 @@ docker_inram=false
logs_inram=false logs_inram=false
secureboot=false secureboot=false
bootloader=generic bootloader=generic
varlog_size=0
# Extract kernel parameters # Extract kernel parameters
for x in $(cat /proc/cmdline); do for x in $(cat /proc/cmdline); do
@ -28,6 +29,9 @@ for x in $(cat /proc/cmdline); do
logs_inram=on) logs_inram=on)
logs_inram=true logs_inram=true
;; ;;
varlog_size=*)
varlog_size="${x#varlog_size=}"
;;
secure_boot_enable=[y1]) secure_boot_enable=[y1])
secureboot=true secureboot=true
docker_inram=true docker_inram=true
@ -40,6 +44,10 @@ done
set_tmpfs_log_partition_size() set_tmpfs_log_partition_size()
{ {
if [ $varlog_size -gt 0 ]; then
# Use the varlog_size passed in from command line
varlogsize=$varlog_size
else
varlogsize=128 varlogsize=128
# set varlogsize to existing var-log.ext4 size # set varlogsize to existing var-log.ext4 size
@ -47,6 +55,7 @@ set_tmpfs_log_partition_size()
varlogsize=$(ls -l ${rootmnt}/host/disk-img/var-log.ext4 | awk '{print $5}') varlogsize=$(ls -l ${rootmnt}/host/disk-img/var-log.ext4 | awk '{print $5}')
varlogsize=$(($varlogsize/1024/1024)) varlogsize=$(($varlogsize/1024/1024))
fi fi
fi
# make sure varlogsize is between 5% to 10% of total memory size # make sure varlogsize is between 5% to 10% of total memory size
memkb=$(grep MemTotal /proc/meminfo | awk '{print $2}') memkb=$(grep MemTotal /proc/meminfo | awk '{print $2}')
@ -54,8 +63,12 @@ set_tmpfs_log_partition_size()
minsize=$(($memmb*5/100)) minsize=$(($memmb*5/100))
maxsize=$(($memmb*10/100)) maxsize=$(($memmb*10/100))
[ $minsize -ge $varlogsize ] && varlogsize=$minsize if [ $minsize -ge $varlogsize ]; then
[ $maxsize -le $varlogsize ] && varlogsize=$maxsize varlogsize=$minsize
fi
if [ $maxsize -le $varlogsize ]; then
varlogsize=$maxsize
fi
} }
remove_not_in_allowlist_files() remove_not_in_allowlist_files()
@ -147,14 +160,23 @@ mount --bind ${rootmnt}/host/$image_dir/boot ${rootmnt}/boot
if $logs_inram; then if $logs_inram; then
# NOTE: some platforms, when reaching initramfs stage, have a small # NOTE: some platforms, when reaching initramfs stage, have a small
# limit of mounting tmpfs partition, potentially due to amount # limit of mounting tmpfs partition, potentially due to amount
# of RAM available in this stage. e.g. Arista 7050-qx32[s] and 7060-cx32s # 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 set_tmpfs_log_partition_size
mount -t tmpfs -o rw,nosuid,nodev,size=${varlogsize}M tmpfs ${rootmnt}/var/log 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 if [ -f ${rootmnt}/host/disk-img/var-log.ext4 ]; then
rm -rf ${rootmnt}/host/disk-img/var-log.ext4
fi
else else
[ -f ${rootmnt}/host/disk-img/var-log.ext4 ] && fsck.ext4 -v -p ${rootmnt}/host/disk-img/var-log.ext4 2>&1 \ if [ -f ${rootmnt}/host/disk-img/var-log.ext4 ]; then
| gzip -c >> /tmp/fsck.log.gz 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 mount -t ext4 -o loop,rw ${rootmnt}/host/disk-img/var-log.ext4 ${rootmnt}/var/log
fi
fi fi
## fscklog file: /tmp will be lost when overlayfs is mounted ## fscklog file: /tmp will be lost when overlayfs is mounted