Hi Mike.
After all the issues with DD and being left high-and-dry, I transitioned over to just using a frugal boot of pure Debian. Basically created a ext3 partition, installed grub4dos to that and then copied the /live folder from Debian LiveCD to that partition.
With live-boot commands (similar for ubuntu's manual)
http://manpages.ubuntu.com/manpages/pre ... oot.7.html I allocated that same partition a 'persistence' label so it became the save space as well (partition based save rather than a save file or save folder). With a single imported/modified script based on save2flash, that could then be booted and have changes optionally saved. Loading sfs's is also possible.
I took that a stage further and extracted all of the main filesystem.squashfs to the save partition, so the main sfs was in effect redundant (I created a empty version of the sfs purely for booting purposes). With everything in the save space that is also the primary partition it means I can also boot as though a full install, which I do only to update the kernel as and when new kernels are released.
Given the ease of access and extent of the Debian repository I've dropped using sfs's now and just apt-get install .... to install whatever I need that's not already installed, and just don't bother save the session.
None of the drama, works really well, great stability, security updates comes through in a timely manner, extensive repository and runs frugally. Best of both (Debian and Puppy) worlds as far as I'm concerned.
Getting used to not running as root by default was a bit awkward at first, but I added a right click context option to the filemanager to open a sub-folder as a root filemanager and have got totally used to that now. Along with running su to switch to root in a terminal window if so desired. Kept forgetting to to that at first, now its second nature.
As part of that transition I did go through various desktop choices, Gnome, KDE ... etc, but finally opted for LXDE. Similar to most pup's, but I prefer my menu bar at the top of screen (which pup's can also do). I've also transitioned over to using systemD boot which personally I've found works great despite many seeming to have a intense dislike.
Still light enough to fully load into ram at startup if you so desire (on a moderately newish machine), but I personally don't bother with that. What you gain is speed once its up and running is lost in slower initial startup (once a program has been loaded once anyway it tends to remain in cache so its quicker to start the second time).
I've sym linked a bottom layer folder in to my home directory, so that any docs/data want saved during a session simply uses that folder. I also have the likes of osmo calendar/diary set to store in that folder as well so changes are also preserved.
The modified save2flash script that I called flush2disk to distinguish a difference looks like
Code: Select all
#!/bin/bash
#
#2007 Lesser GPL licence v2 (http://www.fsf.org/licensing/licenses/lgpl.html)
#Barry Kauler www.puppylinux.com
#Edited for 'porteus-boot' on Debiandog for the "save on exit" boot option, by fredx181
#2016-02-26 Change; Line 89 "--remove-destination" instead of "-f", workaround possible crashing when
# copying files from upgraded libc6
#2016-07-19 fredx181 make save 'on demand' (to directory) work also with live-boot (originally idea from
# Toni (saintless) https://github.com/MintPup/DebianDog-Wheezy/commit/9d510cd0189be4bdfe8ead97 ).
#2016-07-22 fredx181 parse location of live folder more exact (works now on DebianDog also)
#2016-07-29 Rufwoof - renamed to avoid confusion from save2flash to flush2disk and changed to specifically
# run on persistence persistence-read-only pure Debian Live CD frugal
#2016-07-30 Rufwoof changed the BASE grep to pick up just the first line (partition) [added -m 1 parameter]
#2016-08-08 fredx181 changed: do the copying by 'rsync' instead of 'cp'
# rsync does a better job, will skip copying files that are earlier copied to BASE by this script,
# so much faster then, also it will 'flush' the memory space (tmpfs) in SNAP to (almost) how it was
# at startup (see last code block).
#2016-10-05 Rufwoof - changed to launch find as early as possible as for first run that slows things down
# Also added spinner that's shown whilst waitign for that pre-find to finish
################################################################################################################
spinner()
{
local pid=$1
local delay=0.25
local spinstr='|/-\'
while [ "$(ps a | awk '{print $1}' | grep $pid)" ]; do
local temp=${spinstr#?}
printf " [%c] " "$spinstr"
local spinstr=$temp${spinstr%"$temp"}
sleep $delay
printf "\b\b\b\b\b\b"
done
printf " \b\b\b\b"
}
if [ "`whoami`" != "root" ]; then
exec sudo ${0}
fi
export LANG=C #110206 Dougal: I **think** this should not cause problems with filenames
PATH="/bin:/sbin:/usr/bin:/usr/sbin:/usr/X11R7/bin"
# Debian LiveCD defaults to use a partition with a label of persistence or a partition
# with a label that matches the perisistence-label= kernel boot parameter (menu.lst)
LABEL=`cat /proc/cmdline | grep persistence-label`
if [ -z "$LABEL" ]; then
LABEL="persistence"
else
LABEL=`cat /proc/cmdline | awk 'BEGIN{FS="persistence-label="} {print $2}' | awk 'BEGIN{FS=" "} {print $1}'`
fi
BASE=`mount -l | grep "\[$LABEL\]" | grep -m 1 /lib/live/mount/persistence | awk 'BEGIN{FS=" "} {print $3}'`
if [ -z "$BASE" ]; then
echo -----------------------------------------------------
echo Only valid when booted a Read Only session and when
echo persistence-label boot parameter specified - exiting
echo -----------------------------------------------------
sleep 4
exit
fi
# Remount the 'home' partition read-write, otherwise we can't copy the changes
mount -o remount,rw $BASE 2> /dev/null
# help speed up find by pre-running as early as possible
find $BASE/. >/dev/null &
PID=$! # record pid of background find
dialog --backtitle "Are you sure you want to flush all changes to disk?" --yesno " Save " 5 20
if test $? -ne 0
then
exit
fi
clear
#dialog --backtitle "Should I leave existing network and graphics values?" --yesno " Save " 5 20
#if test $? -ne 0
#then
# rm -f /etc/udev/rules.d/70-persistent*
# rm -f /home/user/.config/autostart/LXRandR*
# rm -f /etc/X11/xorg.conf
#fi
#clear
# fredx181 mod, create variable for list containing files to save (to be used further below).
FILESAVELIST="/tmp/filesave$RANDOM"
# By default overlay is mounted twice (in case no persistence), unmounting it, sort of 'releases' it, not sure why but it works ;)
# On DebianDog it's different, but doing the below does not harm
umount /lib/live/mount/overlay 2> /dev/null
# Rufwoof append root to path
SNAP="/lib/live/mount/overlay/root/"
if [ ! -d /lib/live/mount/overlay/root ]
then
echo "Looks like you're running a continual save session"
echo "Invalid operation. Exiting"
sleep 5
exit
fi
# create BASE directory if not exist
mkdir $BASE 2> /dev/null
cd $SNAP || exit 1
echo "Merging $SNAP onto $BASE..."
if [ -f /mnt/live/tmp/modules ]; then
SFSPoints=$( ls -d -1 /mnt/live/memory/images/* |sort -u ) #110206 Dougal: get a list of the sfs mountpoints
else
# live-boot v3 or v4
SFSPoints=$( ls -d -1 /lib/live/mount/rootfs/* |sort -u ) #110206 Dougal: get a list of the sfs mountpoints
fi
# Wait for early launched find to finish, showing a spinner whilst waiting
echo -n "Scanning ..."
spinner ${PID}
#wait $PID # wait until background updatedb finishes
echo
echo "Updating ..."
#Handle Whiteouts...
find . -mount \( -regex '.*/\.wh\.[^/]*' -type f \) | sed -e 's/\.\///;s/\.wh\.//' |
while read N
do
BN="`basename "$N"`"
DN="`dirname "$N"`"
[ "$BN" = ".wh.aufs" ] && continue #w003 aufs has file .wh..wh.aufs in /initrd/pup_rw.
#[ "$DN" = "." ] && continue
#110212 unionfs and early aufs: '.wh.__dir_opaque' marks ignore all contents in lower layers...
if [ "$BN" = "__dir_opaque" ];then #w003
#'.wh.__dir_opaque' marks ignore all contents in lower layers...
rm -rf "${BASE}/${DN}" 2>/dev/null #wipe anything in save layer. 110212 delete entire dir.
mkdir -p "${BASE}/${DN}" #jemimah: files sometimes mysteriously reappear if you don't delete and recreate the directory, aufs bug? 111229 rerwin: need -p, may have to create parent dir.
#also need to save the whiteout file to block all lower layers (may be readonly)...
touch "${BASE}/${DN}/.wh.__dir_opaque" 2>/dev/null
rm -f "$SNAP/$DN/.wh.__dir_opaque" #should force aufs layer "reval".
continue
fi
#110212 recent aufs: .wh.__dir_opaque name changed to .wh..wh..opq ...
if [ "$BN" = ".wh..opq" ] ; then
rm -rf "${BASE}/${DN}" 2>/dev/null #wipe anything in save layer.
mkdir -p "${BASE}/${DN}" #jemimah: files sometimes mysteriously reappear if you don't delete and recreate the directory, aufs bug? 111229 rerwin: need -p, may have to create parent dir.
#also need to save the whiteout file to block all lower layers (may be readonly)...
touch "${BASE}/${DN}/.wh..wh..opq" 2>/dev/null
rm -f "$SNAP/$DN/.wh..wh..opq" #should force aufs layer "reval".
continue
fi
#comes in here with the '.wh.' prefix stripped off, leaving actual filename...
rm -rf "$BASE/$N"
#if file exists on a lower layer, have to save the whiteout file...
#110206 Dougal: speedup and refine the search...
for P in $SFSPoints
do
if [ -e "$P/$N" ] ; then
[ ! -d "${BASE}/${DN}" ] && mkdir -p "${BASE}/${DN}"
touch "${BASE}/${DN}/.wh.${BN}"
break
fi
done #110206 End Dougal.
done
#Directories... v409 remove '^var'. w003 remove aufs .wh. dirs.
#w003 /dev/.udev also needs to be screened out... 100820 added var/tmp #110222 shinobar: remove all /dev
find . -mount -type d | busybox tail +2 | sed -e 's/\.\///' | grep -v -E '^mnt|^initrd|^proc|^sys|^tmp|^root/tmp|^\.wh\.|/\.wh\.|^dev/|^run|^var/run/udev|^run/udev|^var/tmp|^etc/blkid-cache' |
#110224 BK revert, leave save of /dev in for now, just take out some subdirs... 110503 added dev/snd
#find . -mount -type d | busybox tail +2 | sed -e 's/\.\///' | grep -v -E '^mnt|^initrd|^proc|^sys|^tmp|^root/tmp|^\.wh\.|/\.wh\.|^dev/\.|^dev/fd|^dev/pts|^dev/shm|^dev/snd|^var/tmp' |
while read N
do
mkdir -p "$BASE/$N"
# I think nathan advised this, to handle non-root user:
chmod "$BASE/$N" --reference="$N"
OWNER="`stat --format=%U "$N"`"
chown $OWNER "$BASE/$N"
GRP="`stat --format=%G "$N"`"
chgrp $GRP "$BASE/$N"
touch "$BASE/$N" --reference="$N"
done
#Copy Files... v409 remove '^var'. w003 screen out some /dev files. 100222 shinobar: more exclusions. 100422 added ^root/ftpd. 100429 modify 'trash' exclusion. 100820 added var/tmp #110222 shinobar: remove all /dev
find . -mount -not \( -regex '.*/\.wh\.[^/]*' -type f \) -not -type d | sed -e 's/\.\///' | grep -v -E '^mnt|^initrd|^proc|^sys|^tmp|^pup_|^zdrv_|^root/tmp|_zdrv_|^dev/|^\.wh\.|^run|^var/run/udev|^run/udev|^root/ftpd|^var/tmp' | grep -v -E -i '\.thumbnails|\.trash|trash/|^etc/blkid-cache|\.part$' |
#110224 BK: revert, leave save of /dev in for now... 120103 rerwin: add .XLOADED
#find . -mount -not \( -regex '.*/\.wh\.[^/]*' -type f \) -not -type d | sed -e 's/\.\///' | grep -v -E '^mnt|^initrd|^proc|^sys|^tmp|^run|^pup_|^zdrv_|^root/tmp|_zdrv_|^dev/\.|^dev/fd|^dev/pts|^dev/shm|^\.wh\.|^var/run|^root/ftpd|^var/tmp|\.XLOADED$' | grep -v -E -i '\.thumbnails|\.trash|trash/|\.part$' |
while read N
do
[ -L "$BASE/$N" ] && rm -f "$BASE/$N"
# Finally, copy files unconditionally.
# fredx181 mod, no, don't use 'cp' just create filelist (for to save) here and run rsync later.
#cp -a --remove-destination "$N" "$BASE/$N"
echo "$N" >> "$FILESAVELIST"
BN="`basename "$N"`" #111229 rerwin: bugfix for jemimah code (110212).
DN="`dirname "$N"`" #111229 "
[ -e "$BASE/$DN/.wh.${BN}" ] && rm "$BASE/$DN/.wh.${BN}" #110212 jemimah bugfix - I/O errors if you don't do this
done
# fredx181 mod, rsync copy from $FILESAVELIST
[ -f "$FILESAVELIST" ] && rsync -a --files-from=$FILESAVELIST "$SNAP" "$BASE"
# Remove files, corresponding with .wh files, from zchanges.dir
# Taken from 'cleanup' script included in the official Porteus initrd.xz
MNAME="$BASE"; NAME="basename "$MNAME""
find $MNAME -name ".wh.*" 2>/dev/null | while IFS= read -r NAME; do wh=`echo "$NAME" | sed -e 's^$MNAME^^g' -e 's/.wh.//g'`; test -e "$wh" && rm -rf "$NAME"; done
# fredx181 mod, remount BASE and remove the just copied files from SNAP.
if [ -f "$FILESAVELIST" ]; then
# remount BASE
mount -no remount,add:1:"$BASE"=ro+wh aufs /
REMOVE=$(echo $(cat "$FILESAVELIST" | grep -v '\->'))
cd "$SNAP"
# remove files from SNAP that had just been copied to BASE
rm -fr $REMOVE
rm -f "$FILESAVELIST"
else
echo "No changes found, nothing to do!"
fi
sync &
echo Done
sleep 1
exit 0
###END###
My menu.lst looks like
Code: Select all
# menu.lst
color white/blue black/cyan white/black cyan/black
timeout 2
default 1
title Debian FULL *** USE THIS TO UPGRADE KERNEL *** Install RW filesys must be extracted (/boot/grub/menu.lst)
find --set-root /debian-usb
configfile /boot/grub/menu.lst
commandline
title 0 Debian Jessie Frugal RO only saves if run flush2disk
find --set-root /live/frugalboot
kernel /vmlinuz boot=live timezone=Europe/London xorg-resolution=1280x768 config nofastboot persistence persistence-read-only persistence-label=persistence quickreboot noprompt showmounts live-media-path=/live/ config rw fsck.mode=auto fsck.repair=preen
initrd /initrd.img
The first boot option is for as though fully installed bootup, it chains to the standard debian bootup menu. The second is the default choice i.e. frugal that I most often boot (read only, with optional save if so desired via flush2disk (save2flash) i.e. I tend to keep the system factory-fresh, and only use the full boot (read/write) to apply updates before booting back frugally again (sometimes for small updates I will apply those in the frugal session before running a save (flush2disk)).