/bin/live-partial-squashfs-updates is in live-tools 4.0.2-1.1.
This file is owned by root:root, with mode 0o755.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220  | #!/bin/sh
## live-partial-squashfs-updates - Generate partial squashfs updates.
## Copyright (C) 2013 Richard Nelson <unixabg@gmail.com>
##
## This program comes with ABSOLUTELY NO WARRANTY; for details see COPYING.
## This is free software, and you are welcome to redistribute it
## under certain conditions; see COPYING for details.
set -e
#set -x
Cleanup_mounts () {
	echo "Unmounting the areas we created."
	for mount_point in "${_MOUNTLIST}"; do
		umount -l $mount_point
		rmdir $mount_point
	done
}
_MOUNTDIR=""
_MOUNTLIST="./filesystem_squashfs ./partial_squashfs_union ./partial_squashfs_updates"
_ROSTACK=":./filesystem_squashfs=ro"
for squash_file in $(ls ./psu-*.squashfs); do
	# Setup mount for the squashfs images.
	# Note that we stack here on the listing provided by ls command.
	_MOUNTDIR="$(basename $squash_file .squashfs)_squashfs"
	echo "Found $squash_file and setting up mount point of ${_MOUNTDIR}"
	if [ ! -d "${_MOUNTDIR}" ]; then
		mkdir "${_MOUNTDIR}"
	fi
	mount -o loop "./$squash_file" "./${_MOUNTDIR}"
	_ROSTACK=":./${_MOUNTDIR}=rr+wh${_ROSTACK}"
	_MOUNTLIST="${_MOUNTLIST} ./${_MOUNTDIR}"
done
echo "${_ROSTACK}"
echo "${_MOUNTLIST}"
# Setup mount for the filesystem.squashfs mount.
if [ ! -d "filesystem_squashfs" ]; then
	mkdir filesystem_squashfs
fi
mount -o loop ./filesystem.squashfs ./filesystem_squashfs
# Setup mount for the updates which we will squash later.
if [ ! -d "partial_squashfs_updates" ]; then
	mkdir partial_squashfs_updates
fi
mount -t tmpfs tmpfs ./partial_squashfs_updates
# Setup mount for the union where we stack ro squashfs and rw updates mount.
if [ ! -d "partial_squashfs_union" ]; then
	mkdir partial_squashfs_union
fi
_DEFAULTRUNTYPE="C"
echo "#############################################################"
echo "  (C)hroot - Chroot in to the filesystem.squashfs + psu-*.squashfs stack."
echo "  (J)oin   - Join the partial squashfs update files to new single psu-DATE.squashfs"
echo "  (N)ew    - New master filesystem.squashfs file which joins all *.squashfs file to new single filesystem.squashfs"
echo "Select run type (default is ${_DEFAULTRUNTYPE}):"
read _RUNTYPE
_RUNTYPE="${_RUNTYPE:-${_DEFAULTRUNTYPE}}"
if [ ${_RUNTYPE} = "C" ]
then
	#mount -t aufs -o br=./partial_squashfs_updates=rw:./filesystem_squashfs=ro none ./partial_squashfs_union
	mount -t aufs -o br=./partial_squashfs_updates=rw"${_ROSTACK}" none ./partial_squashfs_union
	echo "You selected to run a chroot"
	echo "Setup the chroot to union mount."
	echo "Mounting bindings for dev, proc, sys, pts in union."
	mount --bind /dev ./partial_squashfs_union/dev
	mount --bind /proc ./partial_squashfs_union/proc
	mount --bind /sys ./partial_squashfs_union/sys
	mount --bind /dev/pts ./partial_squashfs_union/dev/pts
	echo "Backup the union/etc/hosts."
	mv ./partial_squashfs_union/etc/hosts ./hosts.bak
	echo "Copying /etc/hosts to union/etc/hosts."
	cp /etc/hosts ./partial_squashfs_union/etc/hosts
	echo "Backup the union/etc/resolv.conf."
	mv ./partial_squashfs_union/etc/resolv.conf ./resolv.conf.bak
	echo "Copying /etc/resolv.conf to the union/etc/resolv.conf."
	cp /etc/resolv.conf ./partial_squashfs_union/etc/resolv.conf
	echo "Starting chroot in the union directory."
	chroot ./partial_squashfs_union /bin/bash
	echo "Exited the chroot so time to clean up."
	umount -l ./partial_squashfs_union/dev
	umount -l ./partial_squashfs_union/proc
	umount -l ./partial_squashfs_union/sys
	echo "Restore original union/etc/hosts."
	mv ./hosts.bak ./partial_squashfs_union/etc/hosts
	echo "Restore union/etc/resolv.conf."
	mv ./resolv.conf.bak ./partial_squashfs_union/etc/resolv.conf
	echo "Remove union/root/.bash_history."
	rm ./partial_squashfs_union/root/.bash_history
	# Prompt to save changes or not.
	_DEFAULTYESNO="N"
	echo "#############################################################"
	echo " (Y)es save my chroot modifications."
	echo " (N)o do not save my chroot modifications."
	echo "Select to save your chroot modifications (default is ${_DEFAULTYESNO}):
	"
	read _YESNO
	_YESNO="${_YESNO:-${_DEFAULTYESNO}}"
	if [ ${_YESNO} = "Y" ]
	then
		_DATE=$(date +%Y%m%d-%H%M%S)
		echo "Now making the updated squashfs ${_DATE}."
		mksquashfs ./partial_squashfs_updates psu-${_DATE}.squashfs
		# Since we use sed to put text at the top of the file make sure the file exists.
		if [ ! -e psu-changelog.txt ]
		then
			echo "Created changelog." >> psu-changelog.txt
		fi
		# Add entry to changelog for the psu file.
		echo "Please provide a small changelog entry for the psu-${_DATE}.squashfs :"
		read _NOTES
		sed -i "1s/^/${_DATE} - ${_NOTES}.\n/" psu-changelog.txt
	else
		echo "No chroot modifications saved to a psu file."
	fi
	Cleanup_mounts
elif [ ${_RUNTYPE} = "J" ] || [ ${_RUNTYPE} = "N" ]
then
	if [ ${_RUNTYPE} = "J" ]
	then
		# Modify the _ROSTACK to not include the filesystem_squashfs mount so we just stack the updates together
		_ROSTACK=$(echo ${_ROSTACK} | sed s@:./filesystem_squashfs=ro@@g)
		_ACTIONTYPE="join psu squashfs files to new single psu-DATE.squashfs"
	else
		_ACTIONTYPE="create a new single filesystem.squashfs"
	fi
	echo "${_ROSTACK}"
	#mount -t aufs -o br=./partial_squashfs_updates=rw:./filesystem_squashfs=ro none ./partial_squashfs_union
	mount -t aufs -o br=./partial_squashfs_updates=rw"${_ROSTACK}" none ./partial_squashfs_union
	# Prompt to join squashfs files or not.
	_DEFAULTYESNO="N"
	echo "#############################################################"
	echo " (Y)es, ${_ACTIONTYPE}."
	echo " (N)o, do not ${_ACTIONTYPE}."
	echo "Select to ${_ACTIONTYPE} (default is ${_DEFAULTYESNO}):
	"
	read _YESNO
	_YESNO="${_YESNO:-${_DEFAULTYESNO}}"
	if [ ${_YESNO} = "Y" ]
	then
		# Since we use sed to put text at the top of the file make sure the file exists.
		if [ ! -e psu-changelog.txt ]
		then
			echo "Created changelog." >> psu-changelog.txt
		fi
		_DATE=$(date +%Y%m%d-%H%M%S)
		if [ ${_RUNTYPE} = "N" ]
		then
			if [ ! -d "new_squashfs" ]; then
				mkdir new_squashfs
			fi
			echo "Now making a new and updated filesystem.squashfs."
			mksquashfs ./partial_squashfs_union ./new_squashfs/filesystem.squashfs
			# Add entry to changelog for the joining of the *.squashfs files to a new filesystem.squashfs.
			sed -i "1s/^/******* ${_DATE} - New filesystem.squashfs generated. ********\n/" psu-changelog.txt
		else
			echo "Now making the updated squashfs ${_DATE} from union."
			mksquashfs ./partial_squashfs_union psu-${_DATE}.squashfs
			# Add entry to changelog for the joining of the psu files.
			sed -i "1s/^/******* ${_DATE} - Joined squashfs files. ********\n/" psu-changelog.txt
		fi
	else
		echo "No psu files will be joined."
	fi
	Cleanup_mounts
	# Remove old directories and move old partials out.
	if [ ${_YESNO} = "Y" ]
	then
		if [ ! -d "partial_squashfs_updates-OLD-${_DATE}" ]; then
			mkdir psu-OOS-${_DATE}
		fi
		if [ ${_RUNTYPE} = "N" ]
		then
			rsync -av --remove-source-files ./psu-*.squashfs ./psu-OOS-${_DATE}/
			rsync -av --remove-source-files ./filesystem.squashfs ./psu-OOS-${_DATE}/
			rsync -av --remove-source-files ./new_squashfs/filesystem.squashfs ./
			rmdir ./new_squashfs
		else
			rsync -av --remove-source-files --exclude psu-${_DATE}.squashfs ./psu-*.squashfs ./psu-OOS-${_DATE}/
		fi
	else
		echo "No rsync of current partials to an Out Of Service folder will occur."
	fi
else
	echo "You entered an unknowon choice!"
	echo "Aborting."
	Cleanup_mounts
	exit 1
fi
echo "All done goodbye!"
exit 0
 |