rootcopy custom

master
Pietro Brenna 2020-01-19 18:15:33 +01:00
parent f02e73e522
commit a3bfaccea1
9 changed files with 489 additions and 0 deletions

View File

@ -0,0 +1,10 @@
\1
_ ____ _____
| | / __ \ / ____|
__| |_ __ __ _| | | | (___
/ _` | '_ \ / _` | | | |\___ \
| (_| | | | | (_| | |__| |____) |
\__,_|_| |_|\__,_|\____/|_____/
powered by Briq

View File

@ -0,0 +1,58 @@
#!/bin/bash
# Author: Tomas M. <http://www.slax.org/>
usage()
{
echo ""
echo "Convert directory to .sb compressed module"
echo "Usage: $0 [source_directory.sb] [[target_file.sb]]"
echo " If source_directory does not have .sb suffix and it is not 'squashfs-root',"
echo " then the source_directory itself is included in the module and"
echo " then the target_file.sb parameter is required."
echo " If target_file.sb is not specified, the source_directory is erased"
echo " and replaced by the newly generated module file."
}
P1="$(readlink -f "$1")"
P2="$(readlink -f "$2")"
if [ "$P1" = "$P2" ]; then
P2=""
fi
SB=$(echo "$P1" | grep -o "[.]sb/*\$")
if [ "$(echo "$P1" | grep -o "/squashfs-root/*\$")" != "" ]; then
SB="true"
fi
if [ "$SB" = "" ]; then
KEEP="-keep-as-directory"
if [ "$P2" = "" ]; then
usage
exit 1
fi
else
KEEP=""
fi
if [ ! -d "$P1" ]; then
echo "Not a directory: $P1" >&2
exit 2
fi
if [ "$P2" = "" ]; then
TARGET="$P1".sb
while [ -e "$TARGET" ]; do TARGET="$TARGET"x; done
mksquashfs "$P1" "$TARGET" -comp xz -b 1024K -always-use-fragments $KEEP >/dev/null || exit 3
umount "$P1" 2>/dev/null
rm -Rf "$P1"
mv "$TARGET" "$P1"
else
if [ -e "$P2" ]; then
echo "Target exists: $P2" >&2
exit 4
fi
mksquashfs "$P1" "$P2" -comp xz -b 1024K -always-use-fragments $KEEP >/dev/null
fi

View File

@ -0,0 +1,32 @@
#! /bin/bash --
# Aggrega file di pacchetti installati o aggiornati con Pacman
# dall'ultimo avvio di una distribuzione linux-live
# (cfr. https://www.linux-live.org/ ) senza persistenza attivata,
# creando un unico bundle .sb
# I file vengono letti dalla directory changes e da essa filtrati solo
# quelli appartenenti ai pacchetti di pacman.
#
# Autore: Guido Longoni <guidolongoni@gmail.com>
IFS=$'\n'
OUTLST="/tmp/added_files_$$.lst"
CACHEDIR=$(sed -n -e '/^[[:space:]]*CacheDir/s|^[^=]*=[[:space:]]*||gp' -e 's|[[:space:]]*$||g' /etc/pacman.conf | head -n1)
OUTDIR="/tmp/sb_$$"
OUTFILE="$OUTDIR".sb
CHGDIR=$(realpath $(mount | sed -n -e '/squashfs/s|.* on \([^ ]*\)/.*|\1|gp' | head -n1)/../changes)
mkdir -p '/tmp'
mkdir -p "$OUTDIR"
rm -rf "$OUTLST"
touch "$OUTLST"
for i in $(find "$CACHEDIR" -iname '*.pkg.tar.xz'); do
tar t -f $i >> "$OUTLST" 2>/dev/null
done
sort -u "$OUTLST" | grep -v '^\.' > "$OUTLST".tmp
mv "$OUTLST".tmp "$OUTLST"
rsync -av --old-d --files-from="$OUTLST" "$CHGDIR" "$OUTDIR"
dir2sb "$OUTDIR" "$OUTFILE"
rm -rf "$OUTDIR"
rm -rf "$OUTLST"

View File

@ -0,0 +1,86 @@
#!/bin/bash
# Rebuild initial ramdisk with full network drivers,
# start DHCP and TFTP server in order to provide PXE service
#
# Author: Tomas M <www.slax.org>
LIVE=/run/initramfs
FTPROOT=/var/state/dnsmasq/root
# find out our own IP address. If more interfaces are available, use the first one
IP="$(hostname -I | cut -d " " -f 1)"
GW=$(ip route show | grep default | grep -o "via.*" | head -n 1 | cut -d " " -f 2)
# if no IP is assigned to this computer, setup private address randomly
if [ "$IP" = "" ]; then
killall dhclient 2>/dev/null
IP="10."$(($RANDOM/130+1))"."$(($RANDOM/130+1))".1"
ifconfig $(ls -1 /sys/class/net | egrep -v '^lo$' | sort | head -n 1) $IP netmask 255.255.255.0
fi
# if gateway is not recognized, lets make our IP a gateway and enable forwarding
if [ "$GW" = "" ]; then
GW="$IP"
echo 1 > /proc/sys/net/ipv4/conf/all/forwarding
echo 1 > /proc/sys/net/ipv6/conf/all/forwarding
fi
echo Starting PXE server on $IP ...
# calculate C class range
RANGE=$(echo $IP | cut -d "." -f 1-3)
# make sure dnsmasq can be started
killall dnsmasq 2>/dev/null
killall busybox 2>/dev/null
rm -Rf $FTPROOT 2>/dev/null
mkdir -p $FTPROOT/{pxelinux.cfg,tmp}/
# create root filesystem for ftfp
cd $LIVE
( find . -print | grep -v "memory"
cd /
find /lib/modules/$(uname -r)/kernel/drivers/net | grep -v wireless
) | cpio -pvd $FTPROOT/tmp 2>/dev/null
cp /lib/modules/$(uname -r)/modules.* $FTPROOT/tmp/lib/modules/$(uname -r)
depmod -b $FTPROOT/tmp
rm $FTPROOT/tmp/lib/initramfs_escaped
# pack root in initramfs
cd $FTPROOT/tmp
find . -print | cpio -o -H newc 2>/dev/null | gzip -f --fast >../initrfs.img
cd ..
rm -Rf tmp
# link files here since copying is not necessary
ln -s $(find $LIVE/memory/{data,iso,toram} 2>/dev/null | grep vmlinuz | head -n 1) $FTPROOT/vmlinuz
ln -s $(find $LIVE/memory/{data,iso,toram} 2>/dev/null | grep pxelinux.0 | head -n 1) $FTPROOT/pxelinux.0
ln -s $(find $LIVE/memory/{data,iso,toram} 2>/dev/null | grep ldlinux.c32 | head -n 1) $FTPROOT/ldlinux.c32
find $LIVE/memory/{data,iso,toram} 2>/dev/null | egrep "[.]sb\$" | sort -n | while read LINE; do
BAS="$(basename "$LINE")"
ln -s $LINE "$FTPROOT/$BAS"
echo $BAS >> "$FTPROOT/PXEFILELIST"
done
echo "This is <a href=http://www.slax.org/>Slax</a> PXE data server. PXE clients will download <a href=PXEFILELIST>file list</a>" > "$FTPROOT/index.html"
# default pxelinux configuration. Keep xmode selection for clients the same like for the server
echo "
PROMPT 0
DEFAULT slax
LABEL slax
KERNEL /vmlinuz
IPAPPEND 1
APPEND initrd=/initrfs.img load_ramdisk=1 prompt_ramdisk=0 rw printk.time=0 $(cat /proc/cmdline | egrep -o 'slax.flags=[^ ]+' | sed -r 's:[,=]pxe::' | sed -r 's:[,=]toram::')
" > $FTPROOT/pxelinux.cfg/default
# start the DHCP server and TFTP server
dnsmasq --enable-tftp --tftp-root=/var/state/dnsmasq/root \
--dhcp-boot=pxelinux.0,"$IP",$IP \
--dhcp-option=3,$GW \
--dhcp-range=$RANGE.2,$RANGE.250,infinite --log-dhcp
# start HTTP server at port 7529 (that are the numbers you type on your phone to write 'slax')
busybox httpd -p 7529 -h /var/state/dnsmasq/root

View File

@ -0,0 +1,17 @@
#!/bin/bash
# Author: Tomas M. <http://www.slax.org/>
if [ ! -e "$1" ]; then
echo
echo "Erase module directory created by sb2dir"
echo "Usage: $0 [source_directory.sb]"
exit 1
fi
if [ ! -d "$1" ]; then
echo "Directory does not exist: $1" >&2
exit
fi
umount "$1" 2>/dev/null
rm -Rf "$1"

View File

@ -0,0 +1,46 @@
#!/bin/bash
TMP=/tmp/changes$$
EXCLUDE="^\$|/\$|[.]wh[.][.]wh[.]orph/|^[.]wh[.][.]wh[.]plnk/|^[.]wh[.][.]wh[.]aufs|^var/cache/|^var/backups/|^var/tmp/|^var/log/|^var/lib/apt/|^var/lib/dhcp/|^var/lib/systemd/|^sbin/fsck[.]aufs|^etc/resolv[.]conf|^root/[.]Xauthority|^root/[.]xsession-errors|^root/[.]fehbg|^root/[.]fluxbox/lastwallpaper|^root/[.]fluxbox/menu_resolution|^etc/mtab|^etc/fstab|^boot/|^dev/|^mnt/|^proc/|^run/|^sys/|^tmp/"
CHANGES=/run/initramfs/memory/changes
if [ "$1" = "" ]; then
echo ""
echo "savechanges - save all changed files in a compressed filesystem bundle"
echo " - excluding some predefined files such as /etc/mtab,"
echo " temp & log files, empty directories, apt cache, and such"
echo ""
echo "Usage:"
echo " $0 [ target_file.sb ] [ changes_directory ]"
echo ""
echo "If changes_directory is not specified, /run/initramfs/memory/changes is used."
echo ""
exit 1
fi
if [ ! "$2" = "" ]; then
CHANGES="$2"
fi
# exclude the save_file itself of course
EXCLUDE="$EXCLUDE|^""$(readlink -f "$1" | cut -b 2- | sed -r "s/[.]/[.]/")""\$"
CWD=$(pwd)
cd $CHANGES || exit
mkdir -p $TMP
mount -t tmpfs tmpfs $TMP
find \( -type d -printf "%p/\n" , -not -type d -print \) \
| sed -r "s/^[.]\\///" | egrep -v "$EXCLUDE" \
| while read FILE; do
cp --parents -afr "$FILE" "$TMP"
done
cd $CWD
mksquashfs $TMP "$1" -comp xz -b 1024K -always-use-fragments -noappend
umount $TMP
rmdir $TMP

View File

@ -0,0 +1,29 @@
#!/bin/bash
if [ "$1" = "rm" ]; then
shift
rmsbdir "$@"
exit $?
fi
if [ "$1" = "rmdir" ]; then
shift
rmsbdir "$@"
exit $?
fi
if [ "$1" = "conv" ]; then
shift
fi
if [ ! -r "$1" ]; then
echo File not found "$1"
exit 1
fi
if [ -d "$1" ]; then
dir2sb "$@"
exit $?
fi
sb2dir "$@"

View File

@ -0,0 +1,33 @@
#!/bin/bash
# Author: Tomas M. <http://www.slax.org/>
if [ ! -e "$1" ]; then
echo
echo "Convert .sb compressed module into directory with the same name"
echo "Usage: $0 [source_file.sb] [[optional output_directory]]"
echo " If the output_directory is specified, it must exist"
echo " If the output_directory is not specified, the name source_file.sb"
echo " is used and the directory is overmounted with tmpfs"
exit 1
fi
if [ ! -r "$1" ]; then
echo "File does not exist: $1" >&2
exit
fi
if [ "$2" = "" ]; then
SOURCE="$1".x
while [ -e "$SOURCE" ]; do SOURCE="$SOURCE"x; done
mv "$1" "$SOURCE" || exit
mkdir "$1"
mount -t tmpfs tmpfs "$1"
unsquashfs -f -dest "$1" "$SOURCE" >/dev/null || exit
rm "$SOURCE"
else
if [ ! -d "$2" ]; then
echo "Directory does not exist: $2" >&2
exit
fi
unsquashfs -f -dest "$2" "$1" >/dev/null
fi

View File

@ -0,0 +1,178 @@
#!/bin/bash
# Slax management and control script
# Author: Tomas M <http://www.slax.org/>
# activate
# deactivate
# list
LIVE=/run/initramfs/memory
RAMSTORE=$LIVE/modules
# Print error message and exit
# $1 = error message
#
die()
{
echo "$1" >&2
exit 1
}
print_branches()
{
local SI BUNDLE LOOP CWD
SI="/sys/fs/aufs/$(cat /proc/mounts | grep 'aufs / aufs' | egrep -o 'si=([^,) ]+)' | tr = _)"
CWD="$(pwd)"
cd "$SI"
ls -v1 | grep -v xi_path | egrep 'br[0-9]+' | xargs cat | grep memory/bundles | rev | cut -b 4- | rev | while read BUNDLE; do
if mountpoint -q "$BUNDLE"; then
LOOP=$(cat /proc/mounts | fgrep " $BUNDLE squashfs" | cut -d " " -f 1)
echo -n "$BUNDLE"
echo -ne "\t"
losetup $LOOP | sed -r "s:.*[(]|[)].*::g"
fi
done | tac
cd "$CWD"
}
# Activate Slax Bundle
# $1 = file to activate
#
activate()
{
local SB TGT BAS
SB="$(readlink -f "$1")"
BAS="$(basename "$SB")"
# check if file exists
if [ ! -r "$SB" ]; then
usage
die "file not found $SB"
fi
# check if the file is part of aufs union, if yes we need to copy it outside
if df "$SB" | cut -d " " -f 1 | grep -q aufs; then
TGT="$RAMSTORE"
mkdir -p "$TGT"
if [ -r $TGT/$BAS ]; then die "File exists: $TGT/$BAS"; fi
cp -n "$SB" "$TGT/$BAS"
if [ $? -ne 0 ]; then die "Error copying file to $TGT/$BAS. Not enough free RAM or disk space?"; fi
SB="$TGT/$BAS"
fi
# check if this particular file is already activated
if print_branches | cut -f 2 | fgrep -q "$SB"; then
exit
fi
# mount remount,add
TGT="$LIVE/bundles/$BAS"
mkdir -p "$TGT"
mount -n -o loop,ro "$SB" "$TGT"
if [ $? -ne 0 ]; then
die "Error mounting $SB to $TGT, perhaps corrupted download"
fi
# add current branch to aufs union
mount -t aufs -o remount,add:1:"$TGT" aufs /
if [ $? -ne 0 ]; then
umount "$TGT"
rmdir "$TGT"
die "Error attaching bundle filesystem to Slax"
fi
echo "Slax Bundle activated: $BAS"
}
# Deactivate Slax bundle of the given name
# $1 = path to bundle file, or its name
#
deactivate()
{
local BUNDLES SB MATCH LOOP LOOPFILE
BUNDLES=$LIVE/bundles
MODULES=$LIVE/modules
SB="$(basename "$1")"
rmdir "$BUNDLES/$SB" 2>/dev/null # this fails unless the dir is
rmdir "$BUNDLES/$SB.sb" 2>/dev/null # forgotten there empty. It's safe this way
if [ ! -d "$BUNDLES/$SB" ]; then
# we don't have real filename match, lets try to add .sb extension
if [ ! -d "$BUNDLES/$SB.sb" ]; then
# no, still no match. Lets use some guesswork
SB=$(print_branches | cut -f 2 | egrep -o "/[0-9]+-$SB.sb\$" | tail -n 1 | xargs -r basename)
else
SB="$SB.sb"
fi
fi
if [ "$SB" = "" -o ! -d "$BUNDLES/$SB" ]; then
die "can't find active slax bundle $1"
fi
echo "Attempting to deactivate Slax bundle $SB..."
mount -t aufs -o remount,verbose,del:"$BUNDLES/$SB" aufs / 2>/dev/null
if [ $? -ne 0 ]; then
die "Unable to deactivate Slax Bundle - still in use. See dmesg for more."
fi
# remember what loop device was the bundle mounted to, it may be needed later
LOOP="$(cat /proc/mounts | fgrep " $BUNDLES/$SB " | cut -d " " -f 1)"
LOOPFILE="$(losetup "$LOOP" | cut -d " " -f 3 | sed -r 's:^.|.$::g')"
umount "$BUNDLES/$SB" 2>/dev/null
if [ $? -ne 0 ]; then
die "Unable to umount Slax bundle loop-mount $BUNDLES/$SB"
fi
rmdir "$BUNDLES/$SB"
# free the loop device manually since umount fails to do that if the bundle was activated on boot
losetup -d "$LOOP" 2>/dev/null
if echo "$LOOPFILE" | grep -q $RAMSTORE; then
rm -f $LOOPFILE
fi
echo "Slax Bundle deactivated: $SB"
}
usage()
{
echo "Usage: $0 [ activate | deactivate | list ] [ file.sb ]" >&2
if [ "$1" != "" ]; then
echo "$1" >&2
fi
}
if [ "$1" = "" ]; then
usage
die
fi
if [ "$1" = "activate" ]; then
activate "$2"
fi
if [ "$1" = "deactivate" ]; then
deactivate "$2"
fi
if [ "$1" = "list" ]; then
print_branches
fi
if [ "$1" = "savechanges" ]; then
shift
savechanges "$@"
fi