huge RAM improvement on latest image

This commit is contained in:
Tobias Powalowski 2022-03-25 09:14:25 +01:00
parent 1e588a4c2b
commit f2a70dd30b

View file

@ -24,6 +24,32 @@ kver() {
[[ "${_HWKVER}" == "" ]] && _HWKVER="$(uname -r)"
}
zram_mount() {
modprobe zram
echo zstd >/sys/block/zram0/comp_algorithm
echo 3G >/sys/block/zram0/disksize
echo 4 >/sys/block/zram0/max_comp_streams
mkfs.btrfs --mixed /dev/zram0 > /dev/tty7 2>&1 || exit 1
mkdir "${_W_DIR}"
# use -o discard for RAM cleaning on delete
# (online fstrimming the block device!)
# fstrim <mountpoint> for manual action
# it needs some seconds to get RAM free on delete!
mount -o discard /dev/zram0 "${_W_DIR}"
}
clean_archboot() {
# remove everything not necessary
rm -rf "/usr/lib/firmware"
rm -rf "/usr/lib/modules"
rm -rf /usr/lib/{libicu*,libstdc++*}
_SHARE_DIRS="archboot efitools file grub hwdata kbd licenses lshw makepkg nmap nano openvpn pacman refind systemd tc usb_modeswitch vim zoneinfo"
for i in ${_SHARE_DIRS}; do
#shellcheck disable=SC2115
rm -rf "/usr/share/${i}"
done
}
usage () {
echo "Update installer, launch latest environment or create latest image files:"
echo "-------------------------------------------------------------------------"
@ -32,11 +58,11 @@ usage () {
echo ""
echo "On fast internet connection (100Mbit) (approx. 5 minutes):"
echo " -latest Launch latest archboot environment (using kexec)."
echo " This operation needs at least 2.3 GB RAM."
echo " This operation needs at least 1.8 GB RAM."
echo ""
echo " -latest-install Launch latest archboot environment with downloaded"
echo " package cache (using kexec)."
echo " This operation needs at least 2.7 GB RAM."
echo " This operation needs at least 2.5 GB RAM."
echo ""
echo " -latest-image Generate latest image files in /archboot-release directory"
echo " This operation needs at least 4.6 GB RAM."
@ -106,16 +132,9 @@ if [[ "${_L_COMPLETE}" == "1" || "${_L_INSTALL_COMPLETE}" == "1" ]]; then
exit 1
fi
touch /.update-installer
# remove everything not necessary
zram_mount
echo "Step 1/9: Removing not necessary files from / ..."
[[ -d "/usr/lib/firmware" ]] && rm -r "/usr/lib/firmware"
[[ -d "/usr/lib/modules" ]] && rm -r "/usr/lib/modules"
rm -f /usr/lib/{libicu*,libstdc++*}
_SHARE_DIRS="archboot efitools file grub hwdata kbd licenses lshw makepkg nmap nano openvpn pacman refind systemd tc usb_modeswitch vim zoneinfo"
for i in ${_SHARE_DIRS}; do
#shellcheck disable=SC2115
[[ -d "/usr/share/${i}" ]] && rm -r "/usr/share/${i}"
done
clean_archboot
echo "Step 2/9: Waiting for gpg pacman keyring import to finish ..."
while pgrep -x gpg > /dev/null 2>&1; do
sleep 1
@ -144,7 +163,7 @@ if [[ "${_L_COMPLETE}" == "1" || "${_L_INSTALL_COMPLETE}" == "1" ]]; then
fi
echo "Step 4/9: Moving kernel ${VMLINUZ} to ${_W_DIR} ..."
kver
mv "${_W_DIR}"/boot/${VMLINUZ} "${_W_DIR}"/ || exit 1
mv "${_W_DIR}"/boot/${VMLINUZ} / || exit 1
echo "Step 5/9: Collect initramfs files in ${_W_DIR} ..."
echo " This will need some time ..."
# add fix for mkinitcpio 31, remove when 32 is released
@ -155,6 +174,8 @@ if [[ "${_L_COMPLETE}" == "1" || "${_L_INSTALL_COMPLETE}" == "1" ]]; then
#mv "${_W_DIR}/tmp" /initrd || exit 1
echo "Step 6/9: Cleanup ${_W_DIR} ..."
find "${_W_DIR}"/. -mindepth 1 -maxdepth 1 ! -name 'tmp' ! -name "${VMLINUZ}" -exec rm -rf {} \;
# 10 seconds for getting free RAM
sleep 10
echo "Step 7/9: Create initramfs initrd.img ..."
echo " This will need some time ..."
# move cache back to initramfs directory in online mode
@ -166,7 +187,7 @@ if [[ "${_L_COMPLETE}" == "1" || "${_L_INSTALL_COMPLETE}" == "1" ]]; then
cd "${_W_DIR}"/tmp || exit 1
find . -mindepth 1 -printf '%P\0' | sort -z |
bsdtar --uid 0 --gid 0 --null -cnf - -T - |
bsdtar --null -cf - --format=newc @- | zstd -T0 -10> "${_W_DIR}"/initrd.img
bsdtar --null -cf - --format=newc @- | zstd -T0 -10> /initrd.img
for i in $(find . -mindepth 1 -type f | sort); do
rm "${i}" >/dev/null 2>&1
done
@ -174,23 +195,31 @@ if [[ "${_L_COMPLETE}" == "1" || "${_L_INSTALL_COMPLETE}" == "1" ]]; then
sleep 1
done
echo "Step 8/9: Cleanup ${_W_DIR}/tmp ..."
rm -r "${_W_DIR}"/tmp
cd /
umount ${_W_DIR}
echo 1 > /sys/block/zram0/reset
sleep 5
echo "Step 9/9: Loading files through kexec into kernel now ..."
# load kernel and initrds into running kernel in background mode!
kexec -f "${_W_DIR}"/${VMLINUZ} --initrd="${_W_DIR}"/initrd.img --reuse-cmdline&
sleep 1
kexec -f /"${VMLINUZ}" --initrd="/initrd.img" --reuse-cmdline&
# wait 1 seconds for getting a complete initramfs
# remove kernel and initrd to save RAM for kexec in background
rm "${_W_DIR}"/{initrd.img,${VMLINUZ}}
sleep 2
rm /{initrd.img,${VMLINUZ}}
while pgreg -x kexec >/dev/null 2>&1; do
sleep 1
done
echo "Finished: Rebooting in a few seconds ..."
# don't show active prompt wait for kexec to be launched
sleep 30
fi
# Generate new images
if [[ "${_G_RELEASE}" == "1" ]]; then
echo "Step 1/1: Generating new iso files now in ${_W_DIR} ..."
zram_mount
echo "Step 1/2: Removing not necessary files from / ..."
clean_archboot
echo "Step 2/2: Generating new iso files now in ${_W_DIR} ..."
echo " This will need some time ..."
"archboot-${_RUNNING_ARCH}-release.sh" "${_W_DIR}" >/dev/tty7 2>&1 || exit 1
echo "Finished: New isofiles are located in ${_W_DIR}"