summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
author Eric Hameleers <alien@slackware.com>2021-01-12 17:28:17 +0100
committer Eric Hameleers <alien@slackware.com>2021-01-12 17:28:17 +0100
commita28f988a5d95a3c29cdf615af6d5d5ec8b4fd92a (patch)
tree6fa3fc726aadd7d805f57d144115fb4175407601
parentca9704c956144f191de680a269df847721dc7a91 (diff)
downloadliveslak-a28f988a5d95a3c29cdf615af6d5d5ec8b4fd92a.tar.gz
liveslak-a28f988a5d95a3c29cdf615af6d5d5ec8b4fd92a.tar.xz
Implement a small Console OS - a rescue environment in RAM1.3.9
This uses two squashfs modules that are currently only found in the LEAN and XFCE images: 'min' and 'noxbase'. These two provide a functional console-only Slackware with a lot of useful programs. It will connect to a DHCP server automatically and it also contains the 'setup2hd' script to be able to install Slackware from a network mirror. And since the Console OS gets loaded into RAM, you can remove your USB stick after booting and use that stick for other purposes. Use-case: - You have one computer with a network connection and one USB stick, and want to create a persistent Slackware Live on USB. - Download an ISO supporting 'Console OS' to the computer's hard drive, and transfer the ISO to the USB stick using the computer's ISO imaging tools, making the stick bootable but not persistent. - Boot from the USB stick, select the "Console OS in RAM" option. - After you logged into the Console Slackware, mount the computer's hard drive. - Use the 'iso2usb.sh' script that comes with liveslak to extract the ISO content to the USB stick, making it persistent. See the README.txt for instructions. ----------------------------------------------------------------------------- Implemented as an extension of the liveslak 'toram' boot parameter. Adding 'toram=core' to the boot commandline will load circa 500 MB of squashfs modules into RAM and boot into a sparse but functional console environment. For supported Live variants (currently LEAN and XFCE) the script 'make_slackware_live.sh' will automatically add a menu item "Console OS in RAM" to the Syslinux and Grub bootloaders, using this 'toram=core' parameter. TODO: add this as an option to all liveslak variants. Not so trivial to do.
-rw-r--r--README.txt16
-rw-r--r--grub.tpl5
-rw-r--r--liveinit.tpl84
-rwxr-xr-xmake_slackware_live.sh77
-rw-r--r--menu.tpl9
-rw-r--r--upslak.sh8
6 files changed, 141 insertions, 58 deletions
diff --git a/README.txt b/README.txt
index 3dfe83f..d17d4e4 100644
--- a/README.txt
+++ b/README.txt
@@ -395,6 +395,10 @@ toram => copy the OS from the media to to RAM before running it.
toram=all => Prevent writes to disk since we are supposed to run from RAM;
equivalent to parameter "toram".
+toram=core => Load Console OS modules into RAM. Console-only Slackware
+ loads fast, contains 'setup2hd' and frees up your USB drive so you can
+ overwrite it with a Persistent Live OS.
+
toram=os => Load OS modules into RAM, but write persistent data to USB.
=== Troubleshooting ===
@@ -699,16 +703,17 @@ The script's parameters are:
Use i586 for a 32bit ISO, x86_64 for 64bit.
-c comp Squashfs compression (default: xz).
Can be any of 'gzip lzma lzo xz zstd'.
- -d desktoptype SLACKWARE (full Slack), KDE4 (basic KDE4),
- XFCE (basic XFCE), KTOWN (ktown Plasma5 replacement),
- MATE (Gnome2 fork replaces KDE4), CINNAMON (fork of Gnome3
- Shell replaces KDE4), DLACK (adds Gnome3, PAM and systemd).
+ -d desktoptype SLACKWARE (full Slack), LEAN (basic Plasma5/XFCE),
+ DAW (Digital Audio Workstation), XFCE (basic XFCE,
+ stripped), KTOWN (ktown Plasma5 replacement), MATE
+ (Gnome2 fork replaces KDE), CINNAMON (fork of Gnome3 Shell
+ replaces KDE), DLACK (Gnome3 replaces KDE).
-e Use ISO boot-load-size of 32 for computers
where the ISO won't boot otherwise (default: 4).
-f Forced re-generation of all squashfs modules,
custom configurations and new initrd.img.
-l <localization> Enable a different default localization
- (script-default is 'us').
+ (script-default is 'en').
-m pkglst[,pkglst] Add modules defined by pkglists/<pkglst>,...
-r series[,series] Refresh only one or a few package series.
-s slackrepo_dir Directory containing Slackware repository.
@@ -716,6 +721,7 @@ The script's parameters are:
Trim the ISO (remove man and/or doc and/or bloat).
-v Show debug/error output.
-z version Define your Slackware version (default: current).
+ -C Add RAM-based Console OS to boot menu.
-G Generate ISO file from existing directory tree
-H hostname Hostname of the Live OS (default: darkstar).
-M Add multilib (x86_64 only).
diff --git a/grub.tpl b/grub.tpl
index 09bc7cb..ead3a36 100644
--- a/grub.tpl
+++ b/grub.tpl
@@ -67,3 +67,8 @@ menuentry "Help on boot parameters" --hotkey h {
unset pager
}
+@C2RMH@menuentry "Console OS in RAM ($sl_lang)" --hotkey c {
+@C2RMH@ linux ($root)/boot/generic @KAPPEND@ load_ramdisk=1 prompt_ramdisk=0 rw printk.time=0 kbd=$sl_kbd tz=$sl_tz locale=$sl_locale xkb=$sl_xkb toram=core 3
+@C2RMH@ initrd ($root)/boot/initrd.img
+@C2RMH@}
+
diff --git a/liveinit.tpl b/liveinit.tpl
index ad9d279..79da5bb 100644
--- a/liveinit.tpl
+++ b/liveinit.tpl
@@ -44,6 +44,9 @@ DISTRO="@DISTRO@"
CDISTRO="@CDISTRO@"
VERSION="@VERSION@"
+CORE2RAMMODS="@CORE2RAMMODS@"
+CORE2RAM=0
+
LIVEUID="@LIVEUID@"
LIVEMEDIA=""
@@ -240,6 +243,8 @@ for ARG in $(cat /proc/cmdline); do
TORAM=1
if [ "$(echo $ARG | cut -f2 -d=)" = "os" ]; then
VIRGIN=0 # load OS modules into RAM, write persistent data to disk
+ elif [ "$(echo $ARG | cut -f2 -d=)" = "core" ]; then
+ CORE2RAM=1 # load Core OS modules into RAM
elif [ "$(echo $ARG | cut -f2 -d=)" = "all" ]; then
VIRGIN=1 # prevent writes to disk since we are supposed to run from RAM
fi
@@ -514,11 +519,24 @@ if [ "$RESCUE" = "" ]; then
find_mod() {
MY_LOC="$1"
-
- ( for MY_EXT in ${SQ_EXT_AVAIL} ; do
- echo "$(find ${MY_LOC} -name "*.${MY_EXT}" 2>/dev/null)"
- done
- ) | sort
+ MY_SUBSYS=$(basename "$1")
+ MY_SYSROOT=$(dirname "$1")
+ MY_COREMODS="$(echo boot ${CORE2RAMMODS} zzzconf |tr ' ' '|')"
+
+ # For all except core2ram, this is a simple find & sort, but for core2ram
+ # we have to search two locations (system and core2ram) and filter the
+ # results to return only the Core OS modules:
+ if [ "${MY_SUBSYS}" = "core2ram" ]; then
+ ( for MY_EXT in ${SQ_EXT_AVAIL} ; do
+ echo "$(find ${MY_SYSROOT}/core2ram/ ${MY_SYSROOT}/system/ -name "*.${MY_EXT}" 2>/dev/null |grep -Ew ${DISTRO}_"(${MY_COREMODS})")"
+ done
+ ) | sort
+ else
+ ( for MY_EXT in ${SQ_EXT_AVAIL} ; do
+ echo "$(find ${MY_LOC} -name "*.${MY_EXT}" 2>/dev/null)"
+ done
+ ) | sort
+ fi
}
find_modloc() {
@@ -540,7 +558,7 @@ if [ "$RESCUE" = "" ]; then
}
load_modules() {
- # SUBSYS can be 'system', 'addons', 'optional':
+ # SUBSYS can be 'system', 'addons', 'optional', 'core2ram':
SUBSYS="$1"
# Find all supported modules:
@@ -580,9 +598,18 @@ if [ "$RESCUE" = "" ]; then
else
echo "${MARKER}: Failed to mount $SUBSYS module '${MODBASE}', excluding it from the overlay."
echo "$MODBASE" >> /mnt/live/modules/failed
+ rmdir /mnt/live/modules/${MODBASE} 2>/dev/null
fi
fi
done
+
+ # Warn if Core OS modules were requested but none were found/mounted;
+ if [ "$SUBSYS" = "core2ram" ]; then
+ MY_COREMODS="$(echo ${CORE2RAMMODS} |tr ' ' '|')"
+ if [ -z "$(ls -1 /mnt/live/modules/ |grep -Ew ${DISTRO}_"(${MY_COREMODS})")" ] ; then
+ echo "${MARKER}: '$SUBSYS' modules were not found. Trouble ahead..."
+ fi
+ fi
}
# Function input is a series of device node names. Return all block devices:
@@ -833,26 +860,31 @@ if [ "$RESCUE" = "" ]; then
RODIRS=""
FS2HD=""
- # First, the base Slackware system components:
- load_modules system
-
- # Next, the add-on (3rd party etc) components, if any:
- # Remember, module name must adhere to convention: "NNNN-modname-*.sxz"
- # where 'N' is a digit and 'modname' must not contain a dash '-'.
- load_modules addons
-
- # And finally any explicitly requested optionals (like nvidia drivers):
- ## TODO:
- ## Automatically load the nvidia driver if we find a supported GPU:
- # NVPCIID=$(lspci -nn|grep NVIDIA|grep VGA|rev|cut -d'[' -f1|rev|cut -d']' -f1|tr -d ':'|tr [a-z] [A-Z])
- # if cat /mnt/media/${LIVEMAIN}/optional/nvidia-*xx.ids |grep -wq $NVPCIID ;
- # then
- # LOAD="nvidia,${LOAD}"
- # fi
- ## END TODO:
- # Remember, module name must adhere to convention: "NNNN-modname-*.sxz"
- # where 'N' is a digit and 'modname' must not contain a dash '-'.
- load_modules optional
+ if [ $CORE2RAM -eq 1 ]; then
+ # Only load the Core OS modules:
+ load_modules core2ram
+ else
+ # First, the base Slackware system components:
+ load_modules system
+
+ # Next, the add-on (3rd party etc) components, if any:
+ # Remember, module name must adhere to convention: "NNNN-modname-*.sxz"
+ # where 'N' is a digit and 'modname' must not contain a dash '-'.
+ load_modules addons
+
+ # And finally any explicitly requested optionals (like nvidia drivers):
+ ## TODO:
+ ## Automatically load the nvidia driver if we find a supported GPU:
+ # NVPCIID=$(lspci -nn|grep NVIDIA|grep VGA|rev|cut -d'[' -f1|rev|cut -d']' -f1|tr -d ':'|tr [a-z] [A-Z])
+ # if cat /mnt/media/${LIVEMAIN}/optional/nvidia-*xx.ids |grep -wq $NVPCIID ;
+ # then
+ # LOAD="nvidia,${LOAD}"
+ # fi
+ ## END TODO:
+ # Remember, module name must adhere to convention: "NNNN-modname-*.sxz"
+ # where 'N' is a digit and 'modname' must not contain a dash '-'.
+ load_modules optional
+ fi
# Get rid of the starting colon:
RODIRS=$(echo $RODIRS |cut -c2-)
diff --git a/make_slackware_live.sh b/make_slackware_live.sh
index 32832c5..2c0f1f1 100755
--- a/make_slackware_live.sh
+++ b/make_slackware_live.sh
@@ -35,7 +35,7 @@
# -----------------------------------------------------------------------------
# Version of the Live OS generator:
-VERSION="1.3.8.4"
+VERSION="1.3.9"
# Timestamp:
THEDATE=$(date +%Y%m%d)
@@ -161,6 +161,10 @@ ONLY_ISO="NO"
# The name of the directory used for storing persistence data:
PERSISTENCE=${PERSISTENCE:-"persistence"}
+# Add a Core OS to load into RAM (currently only supported for XFCE and LEAN):
+CORE2RAM=${CORE2RAM:-"NO"}
+CORE2RAMMODS="${MINLIST} noxbase"
+
# Slackware version to use (note: this won't work for Slackware <= 14.1):
SL_VERSION=${SL_VERSION:-"current"}
@@ -304,6 +308,7 @@ LIVE_BOOT=${LIVE_BOOT:-"${LIVE_STAGING}/${LIVEMAIN}/bootinst"}
LIVE_MOD_SYS=${LIVE_MOD_SYS:-"${LIVE_STAGING}/${LIVEMAIN}/system"}
LIVE_MOD_ADD=${LIVE_MOD_ADD:-"${LIVE_STAGING}/${LIVEMAIN}/addons"}
LIVE_MOD_OPT=${LIVE_MOD_OPT:-"${LIVE_STAGING}/${LIVEMAIN}/optional"}
+LIVE_MOD_COS=${LIVE_MOD_COS:-"${LIVE_STAGING}/${LIVEMAIN}/core2ram"}
# ---------------------------------------------------------------------------
# Define some functions.
@@ -323,6 +328,7 @@ function cleanup() {
rmdir ${LIVE_ROOTDIR} 2>${DBGOUT}
rmdir ${LIVE_WORK}/*_$$ 2>${DBGOUT}
+ rm ${LIVE_MOD_COS}/* 2>${DBGOUT} || true
rm ${LIVE_MOD_OPT}/* 2>${DBGOUT} || true
rm ${LIVE_MOD_ADD}/* 2>${DBGOUT} || true
} # End of cleanup()
@@ -668,6 +674,7 @@ function gen_bootmenu() {
-e "s/@SL_VERSION@/$SL_VERSION/g" \
-e "s/@VERSION@/$VERSION/g" \
-e "s/@KAPPEND@/$KAPPEND/g" \
+ -e "s/@C2RMH@/$C2RMH/g" \
> ${MENUROOTDIR}/vesamenu.cfg
for LANCOD in $(cat ${LIVE_TOOLDIR}/languages |grep -Ev "(^ *#|^$)" |cut -d: -f1)
@@ -712,6 +719,7 @@ EOL
-e "s/@SL_VERSION@/$SL_VERSION/g" \
-e "s/@VERSION@/$VERSION/g" \
-e "s/@KAPPEND@/$KAPPEND/g" \
+ -e "s/@C2RMH@/$C2RMH/g" \
> ${MENUROOTDIR}/menu_${LANCOD}.cfg
# Generate custom language selection submenu for selected keyboard:
@@ -771,6 +779,7 @@ function gen_uefimenu() {
-e "s/@SL_VERSION@/$SL_VERSION/g" \
-e "s/@VERSION@/$VERSION/g" \
-e "s/@KAPPEND@/$KAPPEND/g" \
+ -e "s/@C2RMH@/$C2RMH/g" \
> ${GRUBDIR}/grub.cfg
# Set a default keyboard selection:
@@ -1048,7 +1057,7 @@ EOT
# Action!
# ---------------------------------------------------------------------------
-while getopts "a:c:d:efhl:m:r:s:t:vz:GH:MO:R:X" Option
+while getopts "a:c:d:efhl:m:r:s:t:vz:CGH:MO:R:X" Option
do
case $Option in
h )
@@ -1085,6 +1094,7 @@ do
echo " Trim the ISO (remove man and/or doc and/or bloat)."
echo " -v Show debug/error output."
echo " -z version Define your ${DISTRO^} version (default: $SL_VERSION)."
+ echo " -C Add RAM-based Console OS to boot menu."
echo " -G Generate ISO file from existing directory tree"
echo " -H hostname Hostname of the Live OS (default: $LIVE_HOSTNAME)."
echo " -M Add multilib (x86_64 only)."
@@ -1117,6 +1127,8 @@ do
;;
z ) SL_VERSION="${OPTARG}"
;;
+ C ) CORE2RAM="YES"
+ ;;
G ) ONLY_ISO="YES"
;;
H ) LIVE_HOSTNAME="${OPTARG}"
@@ -1172,6 +1184,42 @@ if [ "$SL_ARCH" != "x86_64" -a "$MULTILIB" = "YES" ]; then
exit 1
fi
+# Determine which module sequence we have to build:
+case "$LIVEDE" in
+ SLACKWARE) MSEQ="${SEQ_SLACKWARE}" ;;
+ XFCE) MSEQ="${SEQ_XFCEBASE}" ;;
+ LEAN) MSEQ="${SEQ_LEAN}" ;;
+ DAW) MSEQ="${SEQ_DAW}" ;;
+ KTOWN) MSEQ="${SEQ_KTOWN}" ;;
+ MATE) MSEQ="${SEQ_MSB}" ;;
+ CINNAMON) MSEQ="${SEQ_CIN}" ;;
+ DLACK) MSEQ="${SEQ_DLACK}" ;;
+ STUDIOWARE) MSEQ="${SEQ_STUDW}" ;;
+ *) if [ -n "${SEQ_CUSTOM}" ]; then
+ # Custom distribution with a predefined package list:
+ MSEQ="${SEQ_CUSTOM}"
+ else
+ echo "** Unsupported configuration '$LIVEDE'"; exit 1
+ fi
+ ;;
+esac
+
+if [ "${CORE2RAM}" == "YES" ] || [ "${LIVEDE}" == "XFCE" ] || [ "${LIVEDE}" == "LEAN" ] ; then
+ # For now, allow CORE2RAM only for the variants that actually
+ # have the required modules in their system list.
+ # TODO: create these modules separately in the 'core2ram' subdirectory.
+ for MY_MOD in ${CORE2RAMMODS} ; do
+ if ! echo ${MSEQ} | grep -wq ${MY_MOD} ; then
+ echo ">> Modules required for Core RAM-based OS (${CORE2RAMMODS}) not available."
+ exit 1
+ fi
+ done
+ # Whether to hide the Core OS menu on boot yes or no:
+ C2RMH="#"
+else
+ C2RMH=""
+fi
+
if ! cat ${LIVE_TOOLDIR}/languages |grep -Ev '(^ *#|^$)' |grep -q ^${DEF_LANG}:
then
echo ">> Unsupported language '${DEF_LANG}', select a supported language:"
@@ -1296,7 +1344,7 @@ if [ "$FORCE" = "YES" ]; then
fi
# Create temporary directories for building the live filesystem:
-for LTEMP in $LIVE_OVLDIR $LIVE_BOOT $LIVE_MOD_SYS $LIVE_MOD_ADD $LIVE_MOD_OPT ; do
+for LTEMP in $LIVE_OVLDIR $LIVE_BOOT $LIVE_MOD_SYS $LIVE_MOD_ADD $LIVE_MOD_OPT $LIVE_MOD_COS ; do
umount ${LTEMP} 2>${DBGOUT} || true
mkdir -p ${LTEMP}
if [ $? -ne 0 ]; then
@@ -1329,26 +1377,6 @@ RODIRS="${LIVE_BOOT}"
# Create the verification file for the install_pkgs function:
echo "${THEDATE} (${BUILDER})" > ${LIVE_BOOT}/${MARKER}
-# Determine which module sequence we have to build:
-case "$LIVEDE" in
- SLACKWARE) MSEQ="${SEQ_SLACKWARE}" ;;
- XFCE) MSEQ="${SEQ_XFCEBASE}" ;;
- LEAN) MSEQ="${SEQ_LEAN}" ;;
- DAW) MSEQ="${SEQ_DAW}" ;;
- KTOWN) MSEQ="${SEQ_KTOWN}" ;;
- MATE) MSEQ="${SEQ_MSB}" ;;
- CINNAMON) MSEQ="${SEQ_CIN}" ;;
- DLACK) MSEQ="${SEQ_DLACK}" ;;
- STUDIOWARE) MSEQ="${SEQ_STUDW}" ;;
- *) if [ -n "${SEQ_CUSTOM}" ]; then
- # Custom distribution with a predefined package list:
- MSEQ="${SEQ_CUSTOM}"
- else
- echo "** Unsupported configuration '$LIVEDE'"; exit 1
- fi
- ;;
-esac
-
# Do we need to create/include additional module(s) defined by a pkglist:
if [ -n "$SEQ_ADDMOD" ]; then
echo "-- Adding ${SEQ_ADDMOD}."
@@ -2976,7 +3004,8 @@ cat $LIVE_TOOLDIR/liveinit.tpl | sed \
-e "s/@DISTRO@/$DISTRO/g" \
-e "s/@CDISTRO@/${DISTRO^}/g" \
-e "s/@UDISTRO@/${DISTRO^^}/g" \
- -e "s/@VERSION@/$VERSION/g" \
+ -e "s/@CORE2RAMMODS@/${CORE2RAMMODS}/g" \
+ -e "s/@VERSION@/${VERSION}/g" \
-e "s/@SQ_EXT_AVAIL@/${SQ_EXT_AVAIL}/g" \
-e "s,@DEF_KBD@,${DEF_KBD},g" \
-e "s,@DEF_LOCALE@,${DEF_LOCALE},g" \
diff --git a/menu.tpl b/menu.tpl
index 2417db2..c5ca327 100644
--- a/menu.tpl
+++ b/menu.tpl
@@ -12,7 +12,7 @@ f4 f4.txt #00000000
menu hshift 1
menu vshift 9
-menu width 45
+menu width 55
menu margin 1
menu rows 10
menu helpmsgrow 14
@@ -75,3 +75,10 @@ menu label Memory test with memtest86+
label localboot
menu label Boot from local drive
localboot -1
+
+label core2ram
+ @C2RMH@menu hide
+ menu label Console OS in RAM
+ kernel /boot/generic
+ append initrd=/boot/initrd.img @KAPPEND@ load_ramdisk=1 prompt_ramdisk=0 rw printk.time=0 kbd=@KBD@ locale=@LOCALE@ tz=@TZ@ toram=core 3
+
diff --git a/upslak.sh b/upslak.sh
index 4af5ae5..cd095d7 100644
--- a/upslak.sh
+++ b/upslak.sh
@@ -81,6 +81,7 @@ LIVEUID=""
MARKER=""
MEDIALABEL=""
PERSISTENCE=""
+CORE2RAMMODS=""
SQ_EXT_AVAIL=""
VERSION=""
@@ -359,7 +360,7 @@ collect_kmods() {
else
chroot ${IMGDIR} depmod $KVER 2>/dev/null
fi
-}
+} # End of collect_kmods ()
# Read configuration data from old initrd:
read_initrd() {
@@ -371,7 +372,7 @@ read_initrd() {
OLDWAIT=$(cat ./wait-for-root)
# Read the values of liveslak template variables in the init script:
- for TEMPLATEVAR in DEF_KBD DEF_LOCALE DEF_TZ DISTRO LIVE_HOSTNAME LIVEMAIN LIVEUID MARKER MEDIALABEL PERSISTENCE SQ_EXT_AVAIL VERSION ; do
+ for TEMPLATEVAR in DEF_KBD DEF_LOCALE DEF_TZ DISTRO LIVE_HOSTNAME LIVEMAIN LIVEUID MARKER MEDIALABEL PERSISTENCE CORE2RAMMODS SQ_EXT_AVAIL VERSION ; do
eval $(grep "^ *${TEMPLATEVAR}=" ./init |head -1)
done
@@ -544,10 +545,13 @@ parse_template() {
-e "s/@PERSISTENCE@/${PERSISTENCE:-persistence}/g" \
-e "s/@DARKSTAR@/${LIVE_HOSTNAME:-darkstar}/g" \
-e "s/@LIVEUID@/${LIVEUID:-live}/g" \
+ -e "s/@LIVEUIDNR@/${LIVEUIDNR:-1000}/g" \
-e "s/@DISTRO@/$DISTRO/g" \
-e "s/@CDISTRO@/${DISTRO^}/g" \
-e "s/@UDISTRO@/${DISTRO^^}/g" \
+ -e "s/@CORE2RAMMODS@/${CORE2RAMMODS:-"min noxbase"}/g" \
-e "s/@VERSION@/${VERSION}/g" \
+ -e "s/@KVER@/$KVER/g" \
-e "s/@SQ_EXT_AVAIL@/${SQ_EXT_AVAIL}/g" \
-e "s,@DEF_KBD@,${DEF_KBD},g" \
-e "s,@DEF_LOCALE@,${DEF_LOCALE},g" \