Compare commits

..

No commits in common. "600bd0a7f58da65dfdcfb467ee7f6364d0c179d3" and "c0d40900dcb9ab1eebb04c45c282dba5f03b21fc" have entirely different histories.

3 changed files with 54 additions and 71 deletions

View File

@ -460,6 +460,7 @@ The installer will now create a system image and reboot the computer.
press_any_key press_any_key
echo "Creating system image..." echo "Creating system image..."
run_in_target /opt/void-usb/system-image --yes #TODO: make this work without user interaction
run_in_target /opt/void-usb/system-image
reboot reboot
# #

View File

@ -29,8 +29,8 @@ when shutting down, let Xorg exit first, then run `loginctl {poweroff,reboot}`
add polkit to common packages add polkit to common packages
https://github.com/aarnt/octoxbps https://github.com/aarnt/octoxbps
system-image system-image
check that all output goes to current TTY make all output appear on current TTY
sync before and after creating the image
package selections: package selections:
desktop desktop
icewm-full icewm-full

View File

@ -7,100 +7,82 @@ else
TTY_OR_CONSOLE="/dev/console" TTY_OR_CONSOLE="/dev/console"
fi fi
function echo_tty {
if [ "$1" = "-n" ]; then
shift
echo -n "$@" > $TTY_OR_CONSOLE
else
echo "$@" > $TTY_OR_CONSOLE
fi
}
function yesno { function yesno {
unset DISCARD_ME unset DISCARD_ME
while [ -z "$DISCARD_ME" ]; do while [ -z "$DISCARD_ME" ]; do
read -p "[y/n] " -n1 DISCARD_ME < $TTY_OR_CONSOLE > $TTY_OR_CONSOLE read -p "[y/n] " -n1 DISCARD_ME < $TTY_OR_CONSOLE
case "$DISCARD_ME" in case "$DISCARD_ME" in
y) y)
echo_tty echo ""
return 0 return 0
;; ;;
n) n)
echo_tty echo ""
return 1 return 1
;; ;;
*) *)
echo_tty " Please enter y for yes or n for no." echo " Please enter y for yes or n for no."
unset DISCARD_ME unset DISCARD_ME
;; ;;
esac esac
done done
} }
# cutting off the leading slash allows us to just ignore empty lines below
readarray -t MOUNT_LIST <<< "$(findmnt --output TARGET --noheadings --raw | sed -e 's|^/||' | sort)"
# always ignore /tmp and the package cache
EXCLUDE_LIST=("tmp" "var/cache/xbps")
for I in ${!MOUNT_LIST[@]}; do
if [ ! -z "${MOUNT_LIST[$I]}" ]; then
FOUND=0
for J in ${!EXCLUDE_LIST[@]}; do
if grep "${EXCLUDE_LIST[$J]}" > /dev/null <<< "${MOUNT_LIST[$I]}"; then
FOUND=1
break
fi
done
# if no parent dir of ${MOUNT_LIST[$I]} is found in $EXCLUDE_LIST
if [ $FOUND -eq 0 ]; then
EXCLUDE_LIST+=("${MOUNT_LIST[$I]}")
fi
fi
done
touch /run/void-usb/system-image-excludes
touch /run/void-usb/system-image-pseudo
for I in ${!EXCLUDE_LIST[@]}; do
echo "/${EXCLUDE_LIST[$I]}" >> /run/void-usb/system-image-excludes
FILE_PERMS="$(stat -c '%a %u %g' "${EXCLUDE_LIST[$I]}")"
echo "\"/${EXCLUDE_LIST[$I]}\" d $FILE_PERMS" >> /run/void-usb/system-image-pseudo
done
#TODO: refuse to run if system is running #TODO: refuse to run if system is running
if [ "$1" = "--yes" ]; then #TODO: add a way to force a new system image up without asking (for example a file in /run/void-usb)
DONT_ASK="true"
else
DONT_ASK="false"
echo_tty "Create a new system image?"
echo_tty
echo_tty "This will replace the existing system image with a snapshot of the currently"
echo_tty "running system. Choosing no here will discard any newly installed programs,"
echo_tty "updates, system configuration changes, etc."
echo_tty
echo_tty "This should not affect your files in /home as they are stored to disk directly."
echo_tty "Check /TODO/README.txt for more information."
echo_tty
echo_tty "Creating a new system image will take some time."
echo_tty
fi
#TODO: colors (bright white / light gray for readability) #TODO: colors (bright white / light gray for readability)
echo "Create a new system image?
if $DONT_ASK || yesno; then This will replace the existing system image with a snapshot of the currently
echo_tty -n "Generating exclusion list... " running system. Choosing no here will discard any newly installed programs,
# cutting off the leading slash allows us to just ignore empty lines below updates, system configuration changes, etc.
readarray -t MOUNT_LIST <<< "$(findmnt --output TARGET --noheadings --raw | sed -e 's|^/||' | sort)"
# always ignore /tmp and the package cache
EXCLUDE_LIST=("tmp" "var/cache/xbps")
for I in ${!MOUNT_LIST[@]}; do This should not affect your files in /home as they are stored to disk directly.
if [ ! -z "${MOUNT_LIST[$I]}" ]; then Check /TODO/README.txt for more information.
FOUND=0
for J in ${!EXCLUDE_LIST[@]}; do
if grep "${EXCLUDE_LIST[$J]}" > /dev/null <<< "${MOUNT_LIST[$I]}"; then
FOUND=1
break
fi
done
# if no parent dir of ${MOUNT_LIST[$I]} is found in $EXCLUDE_LIST
if [ $FOUND -eq 0 ]; then
EXCLUDE_LIST+=("${MOUNT_LIST[$I]}")
fi
fi
done
touch /run/void-usb/system-image-excludes Creating a new system image will take some time.
touch /run/void-usb/system-image-pseudo "
for I in ${!EXCLUDE_LIST[@]}; do
echo "/${EXCLUDE_LIST[$I]}" >> /run/void-usb/system-image-excludes
FILE_PERMS="$(stat -c '%a %u %g' "${EXCLUDE_LIST[$I]}")"
echo "\"/${EXCLUDE_LIST[$I]}\" d $FILE_PERMS" >> /run/void-usb/system-image-pseudo
done
echo_tty "done"
echo_tty "Building image..." if yesno; then
mksquashfs / /run/void-usb/container/new_squashfs.img -b 1M -comp xz -progress -noappend -pf /run/void-usb/system-image-pseudo -ef /run/void-usb/system-image-excludes > $TTY_OR_CONSOLE echo "Building image..."
mksquashfs / /run/void-usb/container/new_squashfs.img -b 1M -comp xz -progress -noappend -pf /run/void-usb/system-image-pseudo -ef /run/void-usb/system-image-excludes
echo_tty -n "Moving new image in place... " #TODO: check if enough disk space
# yes -> create new image next to old image
# no -> create new image in RAM
#TODO: figure out when appending to existing squashfs is a good idea
mv /run/void-usb/container/new_squashfs.img /run/void-usb/container/squashfs.img mv /run/void-usb/container/new_squashfs.img /run/void-usb/container/squashfs.img
echo_tty "done"
else else
echo_tty "Discarding system changes." echo "Discarding system changes."
fi fi
echo_tty -n "Syncing... "
sync
echo_tty "done"