diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..c5fbe04 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "ext/checkbox"] + path = ext/checkbox + url = https://github.com/pedro-hs/checkbox.sh diff --git a/LICENSE b/LICENSE index 0d7fde0..d7d83aa 100644 --- a/LICENSE +++ b/LICENSE @@ -3,6 +3,7 @@ Linux Live Framework Copyright (C) 2023 Tomas M. . Copyright (C) 2023 Daniel K. . +Copyright (C) 2020 Pedro Santos Arruda 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 diff --git a/README.txt b/README.txt index cf0a3b3..a68e6e0 100644 --- a/README.txt +++ b/README.txt @@ -6,7 +6,6 @@ This project is for supporting many CPUs architectures & extended functions unli Note: * Your distro must have installed: - squashfs-tools, - - xorriso, - cpio, - file, - gzip, @@ -15,7 +14,7 @@ Note: - grep, - rsync, - find-utils, - - syslinux-utils, + - grub2, - bash, - (Optional) mdadm. - (Optional for light "system.sfs", (if most on left then best compression)) zstd, xz, lzma, bzip2 and gzip. @@ -28,7 +27,6 @@ Note: - fdisk, - cfdisk, - mke2fs, - - grub2. * You can also boot your linux distro in frugal mode (for Windows and Linux): - For Linux (All hdd free space in frugal mode): - Boot your linux distro, diff --git a/build b/build index 9c5f21f..3e8c9d5 100755 --- a/build +++ b/build @@ -1,9 +1,10 @@ #!/usr/bin/env bash -set -eE -o pipefail -exec > >(tee -i /tmp/lif.log) 2>&1 +. initrd/functions +set -eET -o pipefail +exec > >(tee -i /tmp/llf.log) 2>&1 cd "$(dirname $(readlink -f ${0}))" -cp -fv config .config +cp -f $([ ${V} ]&&echo ${V}) config .config for i in mksquashfs cpio gzip sed grep xorriso tar find file; do if [ ! -x "$(command -v ${i})" ]; then case ${i} in @@ -18,18 +19,21 @@ for i in mksquashfs cpio gzip sed grep xorriso tar find file; do done main() { - local top DATA INITRD ret tmpRoot utc v + local DATA ret tmpRoot utc v krnV echo "KERNEL=\"${kernel}}\"" >>.config - echo "LMK=\"/lib/modules/$(file -bL ${kernel} | grep -o 'version .*' | cut -d' ' -f2)\"" >>.config - top="$(pwd)" + echo "LMK=\"/lib/modules/\"" >>.config + krnV="$(file -bL ${kernel} | grep -o 'version .*' | cut -d' ' -f2)" + top="${PWD}" + INITRAMFS="${workTmpDir}/initRd" DATA="${workTmpDir}/isoImage" - INITRD="$(initrd/create)" + env DATA="${DATA}" INITRAMFS="${INITRAMFS}" V="${V}" top="${top}" initrd/create ret="${?}" tmpRoot="${workTmpDir}/tmpRoot" - mkdir -pv ${DATA}/changes ${DATA}/os/modules - rsync --force -aAP $(for i in $(awk '{print $2}' /proc/mounts) /tmp; do echo "--exclude=${i}/*"; done) / ${tmpRoot} - chmod +x -Rv inc2sys - cp -rvf inc2sys/* ${tmpRoot} + mkdir -p $([ ${V} ]&&echo ${V}) ${DATA}/changes ${DATA}/os/modules + mv -f $([ ${V} ]&&echo ${V}) ${INITRAMFS}.img ${DATA}/initrd.img + rsync --force -aA $([ ${V} ]&&echo -P) $(for i in $(awk '{print $2}' /proc/mounts) /tmp; do echo "--exclude=${i}/*"; done) $(for i in /lib/modules/*; do [[ "${i}" =~ ${krnV} ]]&&continue||echo "--exclude=${i}";done) / ${tmpRoot} + chmod +x -R $([ ${V} ]&&echo ${V}) inc2sys + cp -rf $([ ${V} ]&&echo ${V}) inc2sys/* ${tmpRoot} mknod ${tmpRoot}/dev/console c 5 1 mknod ${tmpRoot}/dev/null c 1 3 mknod ${tmpRoot}/dev/ram0 b 1 0 @@ -37,70 +41,61 @@ main() mknod ${tmpRoot}/dev/tty2 c 4 2 mknod ${tmpRoot}/dev/tty3 c 4 3 mknod ${tmpRoot}/dev/tty4 c 4 4 - for i in zstd xz lzma bzip2 gzip; do - mksquashfs ${tmpRoot} ${DATA}/os/system.sfs -comp ${i} -noappend -limit 50 + for i in zstd xz lz4 lzo gzip; do + mksquashfs ${tmpRoot} ${DATA}/os/system.sfs -comp $([ ${i} = lz4 ]&&echo echo "${i} -Xhc"||echo ${i}) $([ ${V} ]&&echo "-progress"||echo "-no-progress") -processors $(($(nproc)/6)) -noappend -limit 50 [ -e ${DATA}/os/system.sfs ]&&break done - mv -fv ${INITRD} ${DATA}/initrd.img - cp -rvf bootfiles/* ${DATA} + cp -rf $([ ${V} ]&&echo ${V}) bootfiles/* ${DATA} for i in ${DATA}/syslinux.cfg ${DATA}/boot/grub/grub.cfg; do sed -i -r "s/__DISTRO__/${DISTRO}/" ${i} done - cp -f ${KERNEL} ${DATA}/vmlinuz + cp -f $([ ${V} ]&&echo ${V}) ${KERNEL} ${DATA}/vmlinuz cd ${DATA} utc="$(date +%s)" v="$(git -C ${top} rev-parse HEAD 2>/dev/null|tr [:lower:] [:upper:]):$(git -C ${top} branch --show-current 2>/dev/null|tr [:lower:] [:upper:]):GIT"||v="INFINITY:PRIVATE:LOCAL" cat <.LlfMeta # Built using Linux-Live-Framework technology. -LLF_VERSION="${v}" LLF_NAME="${DISTRO}" +LLF_VERSION="${v}" LLF_UTC="${utc}" eot [[ ${ret} = 2 ]]&&echo "LLF_ELF_STATIC_INITRD=\"y\"" >>.LlfMeta||echo "LLF_ELF_STATIC_INITRD=\"n\"" >>.LlfMeta - xorriso -as mkisofs -o /${DISTRO}-${utc}.iso -iso-level 3 -J -R -D -A ${DISTRO} -V ${DISTRO} -no-emul-boot -boot-info-table -boot-load-size 2 -b boot/grub/i386-pc/eltorito.img -c boot/grub/grub.cat -eltorito-alt-boot -e /efi.img -no-emul-boot . - isohybrid --version >/dev/null 2>&1&&isohybrid -u /${DISTRO}-${utc}.iso - return 0 + grub-mkrescue $([ ${V} ]&&echo ${V}) -o /${DISTRO}-${utc}.iso --compress=xz --product-name="${DISTRO}" --product-version="v=${v} t=${UTC}" . + #xorriso -as mkisofs -o /${DISTRO}-${utc}.iso -iso-level 3 -J -R -D -A ${DISTRO} -V ${DISTRO} -no-emul-boot -boot-info-table -boot-load-size 2 -b isolinux.bin -c boot/grub/grub.cat -eltorito-alt-boot -e /efi.img -no-emul-boot . + #isohybrid --version >/dev/null 2>&1&&isohybrid -u /${DISTRO}-${utc}.iso } -chooseKernel() +selectKernel() { - local n=0 list - mapfile -t list < <(find /boot -type f | egrep "bzImage|kernel|vmlinuz" 2>/dev/null | egrep -v "init|*.old") + local checkbox_output list krn + mapfile -t list < <(find /boot -type f|egrep"bzImage|kernel|vmlinuz" 2>/dev/null|egrep -v "init|$.old"|sort -n) if [ ${#list[@]} -gt 1 ]; then - echo -e "Please choose your kernel to proceed:\nChoose number from ${n} to ${#list[@]}\n-----\n" - for a in "${list[@]}"; do - echo "[${n}] - ${a}" - ((n++)) - done - echo "-----" - read kernel - kernel="/boot/${list[${kernel}]}" + . ext/checkbox/checkbox.sh checkbox.sh --message="Please choose your kernel version to proceed:" --index --options="$(for i in "${list[@]}"; do basename "${i}";done;)" + krn="/boot/${list[${checkbox_output}]}" else - kernel="/boot/${list[0]}" + krn="${list[0]}" fi + kernel="${krn}" export kernel - return 0 } +declare -g kernel DISTRO workTmpDir V setCompatFlags for i; do case ${i} in - -i|--interactive) helper="true" ;; - -k|--kernel) export kernel="${2}"; shift ;; + -i|--interactive) helper=true ;; + -k|--kernel) kernel="${2}"; shift ;; -d|--distro) DISTRO="${2}"; shift ;; -w|--workdir) workTmpDir="${2}"; shift ;; - -D|--debug) set -x; export V="-v" ;; - -C|--clean) clean="true" ;; + -D|--debug) set -x; setCompatFlags+=" -x " ;; + -n|--dry-run) set -n; setCompatFlags+=" -n " ;; + -v|--verbose) set -v; V="-v" ;; + -C|--clean) clean=true ;; --) shift; break ;; *) echo "Unknown option: ${i}"; exit 1 ;; esac done -trap '[[ ${clean} ]]&&echo "Cleaning up..."&&rm -rvf ${workTmpDir} /tmp/MlbInitRd{,.img};exit 1' 2 6 15 -export workTmpDir -[[ -t 0 && ${helper} || ${helper} ]]&&if chooseKernel&&main; then true else; false; fi -[[ ! ${helper} ]]&& { - [[ ! -e ${kernel} ]]&&echo "[E]: Kernel not found: ${kernel}"&&false - [[ -z ${DISTRO} ]]&&. .config&&echo "[W]: DISTRO not set. Using defaults: ${DISTRO}"||true - [[ -z ${workTmpDir} ]]&&workTmpDir="$(mktemp -d /tmp/Llf_WorkDir_XXXXXXX)"&&echo "[W]: workTmpDir not set. Using defaults: ${workTmpDir}"&&true - export workTmpDir - export DISTRO - mkdir -pv "${workTmpDir}" - if main; then true; else false; fi -} +trap '. initrd/functions&&[[ ${clean} ]]&& { m A "\nCleaning-up";if rp "rm -rf ${workTmpDir}";then m i "Done!\n";else m w "Failed!\n";fi; };exit ${?}' HUP INT QUIT ILL TRAP ABRT TERM +[[ -t 0 && ${helper} || ${helper} ]]&&if selectKernel&&main; then true else; false; fi +[[ -e ${kernel} ]]||m e "Kernel not found: ${kernel}\n"&&false +[[ -z ${DISTRO} ]]&&. .config&&m w "DISTRO not set. Using defaults: ${DISTRO}\n"||true +workTmpDir="${workTmpDir:-$(mktemp -d /tmp/Llf_WorkDir_XXXXXXX)}"||true +mkdir -p "${workTmpDir}" +if main; then true; else false; fi \ No newline at end of file diff --git a/ext/checkbox b/ext/checkbox new file mode 160000 index 0000000..5692b6e --- /dev/null +++ b/ext/checkbox @@ -0,0 +1 @@ +Subproject commit 5692b6e8f0a673a71ffcac28f7aa8218f438c65f diff --git a/initrd/create b/initrd/create index 5cb83c8..eb22c14 100755 --- a/initrd/create +++ b/initrd/create @@ -1,127 +1,110 @@ #!/usr/bin/env bash -set -x -cd "$(dirname $(readlink -f ${0}))"||exit 1 +#set -eET -o pipefail +export setCompatFlags top +grep -q -- -x <<<"${setCompatFlags}"&&set -x +grep -q -- -n <<<"${setCompatFlags}"&&set -n +grep -q -- -v <<<"${V}"&&set -v +cd "$(dirname $(readlink -f ${0}))"||false +. ../.config||false +trap 'rm -rf ${TOP}/${INITRAMFS}{,.img};exit ${?}' HUP INT QUIT ILL TRAP ABRT TERM -. ../.config - -INITRAMFS="/tmp/LifInitRd" -trap "rm -rf ${INITRAMFS}&&exit 1" 2 3 6 15 +#add more ELFs, if need ;) +list=(bash tar e2fsck fsck.fat f2fs mdadm mount.ntfs-3g blkid) # copy file to initramfs tree, including # all library dependencies (as shown by ldd) -# $1 = file to copy (full path) +# ${1} = file to copy (full path) copy_including_deps() { # if source doesn't exist or target exists, do nothing - if [ ! -e "$1" -o -e "$INITRAMFS"/"$1" ]; then + if [[ ! -e "${1}" || -e "${INITRAMFS}"/"${1}" || -e ${INITRAMFS}"/${2}" ]]; then return 1 fi - cp -R --parents "$1" "$INITRAMFS" - if [ -L "$1" ]; then - DIR="$(dirname "$1")" - LNK="$(readlink "$1")" + [ ${2} ]&&cp -r -T $([ ${V} ]&&echo ${V}) "${1}" "${INITRAMFS}/bin"||cp -r --parents $([ ${V} ]&&echo ${V}) "${1}" "${INITRAMFS}" + if [ -L "${1}" ]; then + DIR="$(dirname "${1}")" + LNK="$(readlink "${1}")" copy_including_deps "$(cd "$DIR"; realpath -s "$LNK")" fi - ldd "$1" 2>/dev/null | sed -r "s/.*=>|[(].*//g" | sed -r "s/^\\s+|\\s+\$//" \ + ldd "${1}" 2>/dev/null | sed -r "s/.*=>|[(].*//g" | sed -r "s/^\\s+|\\s+\$//" \ | while read LIB; do copy_including_deps "$LIB" done - for MOD in $(find "$1" -type f -name "*.ko"); do + for MOD in $(find "${1}" -type f -name "*.ko"); do for DEP in $(cat /$LMK/modules.dep | fgrep /$(basename $MOD):); do copy_including_deps "/$LMK/$DEP" done done shift - if [ "$1" != "" ]; then - copy_including_deps "$@" + if [ "${1}" != "" ]; then + copy_including_deps "${@}" fi } +incDynElf() +{ + local f + f="$(type -P ${1})" + copy_including_deps ${f} /bin/$(basename ${f}) + return ${?} +} -rm -Rf $INITRAMFS -mkdir -p $INITRAMFS/{bin,dev,etc,lib,lib64,mnt,proc,root,run,sys,tmp,usr,var/log} -mkdir -p $INITRAMFS/usr/{sbin,bin} -ln -s bin $INITRAMFS/sbin +mkdir -p $([ ${V} ]&&echo ${V}) ${INITRAMFS}/{bin,dev,etc,lib{32,64,x32,},mnt,proc,root,run,sys,tmp,usr{,/local}/{sbin,bin,lib{32,64,x32,}},var/log} # If bb is not found use all static prebuilt -copy_including_deps /bin/busybox || { cp static/busybox $INITRAMFS/bin;static="true"; } -for i in $($INITRAMFS/bin/busybox --list|egrep -v "tar|init"); do [ ! -e $INITRAMFS/bin/$i ]&&ln -sf busybox $INITRAMFS/bin/$i; done +incDynElf busybox || { cp -f $([ ${V} ]&&echo ${V}) static/busybox ${INITRAMFS}/bin;static=true; } +for i in $(${INITRAMFS}/bin/busybox --list|egrep -v "tar|init|blkid"); do ln -sf $([ ${V} ]&&echo ${V}) busybox ${INITRAMFS}/bin/$i; done -mknod $INITRAMFS/dev/console c 5 1 -mknod $INITRAMFS/dev/null c 1 3 -mknod $INITRAMFS/dev/ram0 b 1 0 -mknod $INITRAMFS/dev/tty1 c 4 1 -mknod $INITRAMFS/dev/tty2 c 4 2 -mknod $INITRAMFS/dev/tty3 c 4 3 -mknod $INITRAMFS/dev/tty4 c 4 4 +mknod ${INITRAMFS}/dev/console c 5 1 +mknod ${INITRAMFS}/dev/null c 1 3 +mknod ${INITRAMFS}/dev/ram0 b 1 0 +mknod ${INITRAMFS}/dev/tty1 c 4 1 +mknod ${INITRAMFS}/dev/tty2 c 4 2 +mknod ${INITRAMFS}/dev/tty3 c 4 3 +mknod ${INITRAMFS}/dev/tty4 c 4 4 -copy_including_deps /$LMK/kernel/fs -for LINE in $(find /$LMK/kernel/ | grep crc32c); do - copy_including_deps $LINE -done -copy_including_deps /$LMK/kernel/drivers/staging/zsmalloc # needed by zram -copy_including_deps /$LMK/kernel/drivers/block/zram -copy_including_deps /$LMK/kernel/drivers/block/loop.* -# usb drivers -copy_including_deps /$LMK/kernel/drivers/usb/storage/usb-storage.* -copy_including_deps /$LMK/kernel/drivers/usb/host -copy_including_deps /$LMK/kernel/drivers/usb/common -copy_including_deps /$LMK/kernel/drivers/usb/core -copy_including_deps /$LMK/kernel/drivers/hid/usbhid -copy_including_deps /$LMK/kernel/drivers/hid/hid.* -copy_including_deps /$LMK/kernel/drivers/hid/uhid.* -copy_including_deps /$LMK/kernel/drivers/hid/hid-generic.* -# disk and cdrom drivers -copy_including_deps /$LMK/kernel/drivers/cdrom -copy_including_deps /$LMK/kernel/drivers/scsi/sr_mod.* -copy_including_deps /$LMK/kernel/drivers/scsi/sd_mod.* -copy_including_deps /$LMK/kernel/drivers/scsi/scsi_mod.* -copy_including_deps /$LMK/kernel/drivers/scsi/sg.* -copy_including_deps /$LMK/kernel/drivers/ata -copy_including_deps /$LMK/kernel/drivers/nvme -copy_including_deps /$LMK/kernel/drivers/mmc -# copy all custom-built modules -copy_including_deps /$LMK/updates -copy_including_deps /$LMK/modules.* - -cp static/mount.dynfilefs $INITRAMFS/bin -cp static/fsck $INITRAMFS/bin -[[ ${static} ]]&&cp static/bash $INITRAMFS/bin||copy_including_deps /bin/bash -[[ ${static} ]]&&cp static/tar $INITRAMFS/bin||copy_including_deps /bin/tar||copy_including_deps /usr/bin/tar -[[ ${static} ]]&&cp static/e2fsck $INITRAMFS/bin||copy_including_deps /sbin/e2fsck -[[ ${static} ]]&&cp static/fsck.fat $INITRAMFS/bin||copy_including_deps /sbin/fsck.fat -[[ ${static} ]]&&cp static/f2fs $INITRAMFS/bin||copy_including_deps /sbin/fsck.f2fs -[[ ${static} ]]&&cp static/mdadm $INITRAMFS/bin||copy_including_deps /sbin/mdadm -[[ ${static} ]]&&cp static/mount.ntfs-3g $INITRAMFS/bin||copy_including_deps /sbin/mount.ntfs-3g -#[[ ${static} ]]&&cp static/blkid $INITRAMFS/bin||copy_including_deps /sbin/blkid -#[[ ${static} ]]&©_including_deps /usr/bin/eject || cp static/eject $INITRAMFS/bin +for i in /$LMK/kernel/fs $(find /$LMK/kernel/ | grep crc32) /$LMK/kernel/drivers/staging/zsmalloc /$LMK/kernel/drivers/block/zram /$LMK/kernel/drivers/block/loop.* /$LMK/kernel/drivers/usb/storage/usb-storage.* /$LMK/kernel/drivers/usb/host /$LMK/kernel/drivers/usb/common /$LMK/kernel/drivers/usb/core /$LMK/kernel/drivers/hid/usbhid /$LMK/kernel/drivers/hid/hid.* /$LMK/kernel/drivers/hid/uhid.* /$LMK/kernel/drivers/hid/hid-generic.* /$LMK/kernel/drivers/cdrom /$LMK/kernel/drivers/scsi/sr_mod.* /$LMK/kernel/drivers/scsi/sd_mod.* /$LMK/kernel/drivers/scsi/scsi_mod.* /$LMK/kernel/drivers/scsi/sg.* /$LMK/kernel/drivers/ata /$LMK/kernel/drivers/nvme /$LMK/kernel/drivers/mmc /$LMK/updates /$LMK/modules.*; do copy_including_deps ${i};done +cp -f $([ ${V} ]&&echo ${V}) static/mount.dynfilefs static/fsck ${top}/ext/checkbox/checkbox.sh ${INITRAMFS}/bin +if [[ ${static} ]]; then + for i in "${list[@]}"; do + cp -f $([ ${V} ]&&echo ${V}) static/${i} ${INITRAMFS}/bin + done +else + for i in "${list[@]}"; do + incDynElf ${i} + done +fi # trim modules.order file. Perhaps we could remove it entirely -MODULEORDER="$(cd "$INITRAMFS/$LMK/"; find -name "*.ko" | sed -r "s:^./::g" | tr "\n" "|" | sed -r "s:[.]:.:g")" -cat $INITRAMFS/$LMK/modules.order | sed -r "s/.ko.gz\$/.ko/" | grep -E "$MODULEORDER"/foo/bar > $INITRAMFS/$LMK/_ -mv $INITRAMFS/$LMK/_ $INITRAMFS/$LMK/modules.order +MODULEORDER="$(cd "${INITRAMFS}/$LMK/"; find . -name "*.ko" | sed -r "s:^./::g" | tr "\n" "|" | sed -r "s:[.]:.:g")" +cat ${INITRAMFS}/$LMK/modules.order | sed -r "s/.ko.gz\$/.ko/" | grep -E "$MODULEORDER"/foo/bar > ${INITRAMFS}/$LMK/_ +mv -f $([ ${V} ]&&echo ${V}) ${INITRAMFS}/$LMK/_ ${INITRAMFS}/$LMK/modules.order -depmod -b $INITRAMFS $(ls $INITRAMFS/lib/modules | sort) +depmod -b ${INITRAMFS} $(ls ${INITRAMFS}/lib/modules | sort) -echo "root::0:0::/root:/bin/sh" >$INITRAMFS/etc/passwd -touch $INITRAMFS/etc/{m,fs}tab +echo "root::0:0::/root:/bin/bash" >${INITRAMFS}/etc/passwd +:>${INITRAMFS}/etc/{m,fs}tab -cp shutdown $INITRAMFS -cp functions $INITRAMFS/lib -cp init $INITRAMFS -ln -s ../init $INITRAMFS/bin/init -cp ../.config $INITRAMFS/lib -chmod a+x -R $INITRAMFS +cp -f $([ ${V} ]&&echo ${V}) functions ${INITRAMFS}/lib +cp -f $([ ${V} ]&&echo ${V}) init shutdown ${INITRAMFS} +ln -sf -$([ ${V} ]&&echo ${V}) ../init ${INITRAMFS}/bin/init +cp -f $([ ${V} ]&&echo ${V}) ../.config ${INITRAMFS}/lib +chmod a+x -R $([ ${V} ]&&echo ${V}) ${INITRAMFS} -cd $INITRAMFS -find | cpio -R root:root -o -H newc 2>/dev/null | gzip -cf9 >$INITRAMFS.img -echo $INITRAMFS.img +cd ${INITRAMFS} +find lib usr{,/local}/lib -name "*.so" -exec sh -c 'ln -s ${1} lib/$(basename ${1})' _ {} \; +# for d in {s,}bin usr{,/local}/{s,}bin; do +# for f in ${d}/*; do +# ln -s ${f} bin +# done +# done +find . | cpio -R root:root -o -H newc 2>/dev/null | gzip -cf9 >${INITRAMFS}.img cd .. -rm -rf $INITRAMFS +rm -rf ${INITRAMFS} [[ ${static} ]]&&exit 2||exit 0 diff --git a/initrd/functions b/initrd/functions index 3ef106b..9fc8cf9 100755 --- a/initrd/functions +++ b/initrd/functions @@ -9,25 +9,12 @@ export WORK="${CHANGES_MNT}/work" export UNION="${MEMORY}/union" export DATAMNT="${MEMORY}/data" export SYSTEM="${MEMORY}/system" -export SHELL_IS_ENABLED="_SHELL_ENABLED_" +export SHELL_IS_ENABLED=false -progress() -{ - local pid - sh -c "${1}" >/dev/null 2>&1& - pid="${!}" - while :; do - if [ -d /proc/${pid} ]; then - echo -n "." - sleep 0.25 - else - break - fi - done -} grepCmdLine() { - for i in $(/dev/null 2>&1& + pid="${!}" + while :; do + if [ -d /proc/${pid} ]; then + [ ${force} ]&&echo -n "." + d&&echo -n "." + sleep 0.25 + else + break + fi + done + return ${?} +} isShellEnabled() { d&&m q "Is 'shell' bootloader variable set " if grepCmdLine shell; then d&&m a "Yes\n" - sed -i "s/_SHELL_ENABLED_/true/g" /lib/functions >/dev/null 2>&1 + sed -i "s/SHELL_IS_ENABLED=false/SHELL_IS_ENABLED=true/" /lib/functions m A "Reloading /lib/functions " if . /lib/functions; then m i "Done\n" @@ -72,40 +77,44 @@ isZramEnabled() d&&m a "Yes\n" m A "Enabling zram " echo 536870912 >/sys/block/zram0/disksize - mkswap /dev/zram0 >/dev/null 2>&1&&m i "Done\n"||m w "Failed\n" - swapon /dev/zram0 >/dev/null 2>&1&&m i "Done\n"||m w "Failed\n" + if mkswap /dev/zram0 >/dev/null 2>&1;then m i "Done\n";else m w "Failed\n";fi + if swapon /dev/zram0 >/dev/null 2>&1;then m i "Done\n";else m w "Failed\n";fi echo 100 >/proc/sys/vm/swappiness else d&&m i "No\n" fi } +toRam() +{ + d&&m q "Is 'toram' bootloader variable set and enought RAM space? " + if grepCmdLine toram; a=${?}&&[[ "$(grep MemFree /proc/meminfo|awk '{print $2}')" -gt $(("$(du ${DATAMNT}|tail -n1|awk '{print $1}')"-"$(du ${DATAMNT}/changes|tail -n1|awk '{print $1}')")) ]]; then + d&&m a "Yes\n" + mkdir -p /tmp/data + d&&m A "Copying to RAM " + if progress f "tar -c -C ${DATAMNT} --exclude ./changes -f - . | tar -xf - -C /tmp/data";then dm i "Done\n";else m w "Failed\n";fi + umount -f ${DATAMNT} >/dev/null 2>&1 + [[ ${from} ]]&&umount -f ${DATAMNT} >/dev/null 2>&1 + mv -f /tmp/data/* ${DATAMNT} >/dev/null 2>&1 + rm -rf /tmp/data >/dev/null 2>&1 + else + d&&[[ "${a}" != "0" ]]&&m e "Not requested by bootloader or low RAM space!\n"||m w "Internal error? Trying tmpfs, so data after power-off will be erased permanently!\n" + mount -o remount,rw ${DATAMNT} >/dev/null 2>&1||true + fi +} findData() { d&&m A "Searching ${DISTRO} in /dev -> " - local from a - from="$(grepCmdLine from)" - for i in ${root:-/dev/[hmnsv][dmrv][0-9a-z]*}; do + local data a + data="$(grepCmdLine from)" + for i in ${root:-$(blkid|cut -d: -f1||echo /dev/[hmnsv][dmrv][0-9a-z]*)}; do d&&m "${i#/dev/} " mount -o ro ${i} ${DATAMNT} >/dev/null 2>&1 sleep 0.5 - [[ ${from} ]]&&mount ${DATAMNT}/${from} ${DATAMNT} >/dev/null 2>&1 - if [ -e ${DATAMNT}/.LlfMeta ]; then + [[ ${data} ]]&&mount ${DATAMNT}/${data} ${DATAMNT} >/dev/null 2>&1 + if [[ -e ${DATAMNT}/.LlfMeta && -e ${DATAMNT}/os/system.sfs ]]; then d&&m i "\nFound ${DISTRO} in ${i}\n" - grepCmdLine fsck&&fsck ${i} >/dev/null 2>&1||true - d&&m q "Is 'toram' bootloader variable set and enought RAM space? " - if grepCmdLine toram; a=${?}&&[[ "$(grep MemFree /proc/meminfo|awk '{print $2}')" -gt $(("$(du ${DATAMNT}|tail -n1|awk '{print $1}')"-"$(du ${DATAMNT}/changes|tail -n1|awk '{print $1}')")) ]]; then - d&&m a "Yes\n" - mkdir -p /tmp/data - d&&m A "Copying to RAM " - d&&progress "tar -c -C ${DATAMNT} --exclude ./changes -f - . | tar -xf - -C /tmp/data"&&m i "Done\n"||m w "Failed\n" - umount -f ${DATAMNT} >/dev/null 2>&1 - [[ ${from} ]]&&umount -f ${DATAMNT} >/dev/null 2>&1 - mv -f /tmp/data/* ${DATAMNT} >/dev/null 2>&1 - rm -rf /tmp/data >/dev/null 2>&1 - else - d&&[[ "${a}" != "0" ]]&&m e "Not requested by bootloader or low RAM space!\n"||m e "Internal error? Trying tmpfs, so data after power-off will be erased permanently!\n" - mount -o remount,rw ${DATAMNT} >/dev/null 2>&1||true - fi + if grepCmdLine fsck;then fsck ${i} >/dev/null 2>&1;else true;fi + toRam mount ${DATAMNT}/os/system.sfs ${SYSTEM} >/dev/null 2>&1 sleep 0.5 break @@ -161,7 +170,7 @@ persistentChanges() else d&&m w "Failed\n" fi - if [ -e "$CHANGES/changes.dat.0" ]; then + if [ -e "$CHANGES/changes.dat" ]; then d&&m A "Restoring persistent changes\n" EXISTS="true" else @@ -178,14 +187,9 @@ debugShell() { if [ "$SHELL_IS_ENABLED" = "true" ]; then echo -e "Debug shell!\nControl+D or 'exit' to contiunue boot.\n" - setsid cttyhack sh + setsid cttyhack bash fi } -pivotRoot() -{ - pivot_root ${1} run/initramfs - exec chroot ${1} init -} changeRoot() { cd "$1" @@ -201,15 +205,16 @@ eot mount -t tmpfs tmpfs run mkdir -p run/initramfs mount -o remount,ro overlay . - pivotRoot . + pivot_root . run/initramfs + exec chroot . init } emergencyShell() { exec >/dev/console >&1 2>&1 <&1 - echo "Error: Please inspect '/tmp/mlb.log' file" + echo "Error: Please inspect '/llf.log' file" export PS1="RESCUE # " while :; do echo "Rescue shell!" - setsid cttyhack sh + setsid cttyhack bash done } diff --git a/initrd/init b/initrd/init index 34efd72..127bbba 100755 --- a/initrd/init +++ b/initrd/init @@ -11,7 +11,7 @@ if [ ! -e /lib/.escaped ]; then cd ${SWITCH} mount -t proc proc /proc echo "0" >/proc/sys/kernel/printk - >lib/.escaped + :>lib/.escaped d&&echo "[!] Reloading ${0}" mount --move /proc proc exec switch_root . ${0} @@ -29,7 +29,7 @@ sleep 3 mdev -s debugShell isZramEnabled -mdadm --assemble --scan >/dev/null 2>&1 +mdadm --assemble --scan >/dev/null 2>&1||true sleep 0.5 debugShell findData diff --git a/initrd/shutdown b/initrd/shutdown index ac67071..7f51155 100755 --- a/initrd/shutdown +++ b/initrd/shutdown @@ -17,9 +17,8 @@ umount_all() done } -exec >/dev/console 2>>/dev/console -[ "${DEBUG_IS_ENABLED}" = "true" ]&&set -x -read -sr -N 1 -t 5 -p "[Info]: If poweroff by accident, press any key to restore your work. Waiting 5 seconds for input..."&&pivotRoot /oldroot +exec >/dev/console >&1 2>&1 <&1 +[[ "${DEBUG_IS_ENABLED}" = "true" ]]&&set -x debugShell echo "Linux Live Framework - Shutdown Magic!" echo "Entering to clean-up things before final step." diff --git a/initrd/static/blkid b/initrd/static/blkid index feaf742..77cb7d7 100755 Binary files a/initrd/static/blkid and b/initrd/static/blkid differ diff --git a/initrd/static/mount.dynfilefs b/initrd/static/mount.dynfilefs index 8ff36c0..cc649c7 100755 Binary files a/initrd/static/mount.dynfilefs and b/initrd/static/mount.dynfilefs differ