diff --git a/srcpkgs/xbps-casper/files/bin/casper-snapshot b/srcpkgs/xbps-casper/files/bin/casper-snapshot deleted file mode 100755 index 1c611749a64..00000000000 --- a/srcpkgs/xbps-casper/files/bin/casper-snapshot +++ /dev/null @@ -1,309 +0,0 @@ -#! /bin/bash - -# casper-snapshot - utility to manage Debian Live systems snapshots -# -# This program mount a device (fallback to /tmpfs under /mnt/snapshot -# and save the /cow (or a different dir) filesystem in it for reusing -# in another casper session. Look at manpage for more info. -# -# Copyright (C) 2006 Marco Amadori -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -# -# On Debian systems, the complete text of the GNU General Public License -# can be found in /usr/share/common-licenses/GPL file. - -PROGRAM="`basename $0`" -VERSION=0.0.1 - - -# Source casper conf -if [ -e /etc/casper.conf ]; then - . /etc/casper.conf -else - USERNAME=$(cat /etc/passwd | grep "999" | cut -f1 -d ':') - HOSTNAME=$(hostname) - BUILD_SYSTEM="Debian" -fi - -export USERNAME USERFULLNAME HOSTNAME BUILD_SYSTEM - -# Source helper functions -helpers="/usr/share/initramfs-tools/scripts/casper-helpers" -if [ -e "${helpers}" ]; then - . "${helpers}" -else - echo "Error: I cannot found helper functions \"${helpers}\"." - exit 1 -fi - -# Define LSB log_* functions. -# Depend on lsb-base (>= 3.0-6) to ensure that this file is present. -. /lib/lsb/init-functions - -MOUNTP="" -COW="" -DEV="" -DEST="" -TYPE="" -DESKTOP_LINK="" - -Header () -{ - echo "${PROGRAM} - utility to do Debian Live snapshots" - echo - echo "Usage: ${PROGRAM} [-c|--cow DIRECTORY] [-d|--device DEVICE] [-o|--output FILE] [-t|--type TYPE]" - echo "Usage: ${PROGRAM} [-r|--resync-string STRING]" - echo "Usage: ${PROGRAM} [-h|--help]" - echo "Usage: ${PROGRAM} [-u|--usage]" - echo "Usage: ${PROGRAM} [-v|--version]" -} - -Usage () -{ - MESSAGE=${1} - Header - echo - echo "Try \"${PROGRAM} --help\" for more information." - if [ ! -z "${MESSAGE}" ]; then - echo -e "${MESSAGE}" - exit 1 - else - exit 0 - fi -} - -Help () -{ - Header - echo - echo "Options:" - echo " -c, --cow: specifies the copy on write directory (default: /cow)." - echo " -d, --device: specifies the output snapshot device (default: none)." - echo " -o, --output: specifies the output image file (default: $type dependent)." - echo " -r, --resync-string: internally used to resync previous made snapshots." - echo " -t, --type: specifies the snapshot type between \"squashfs\", \"ext2\" or \"cpio\".gz archive (default: cpio)" - echo -e "\nLook at casper-snapshot(1) man page for more information." - exit 0 -} - -Version () -{ - echo "${PROGRAM}, version ${VERSION}" - echo - echo "Copyright (C) 2006 Marco Amadori " - echo - echo "This program is free software; you can redistribute it and/or modify" - echo "it under the terms of the GNU General Public License as published by" - echo "the Free Software Foundation; either version 2 of the License, or" - echo "(at your option) any later version." - echo - echo "This program is distributed in the hope that it will be useful," - echo "but WITHOUT ANY WARRANTY; without even the implied warranty of" - echo "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the" - echo "GNU General Public License for more details." - echo - echo "You should have received a copy of the GNU General Public License" - echo "along with this program; if not, write to the Free Software" - echo "Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA" - echo - echo "On Debian systems, the complete text of the GNU General Public License" - echo "can be found in /usr/share/common-licenses/GPL file." - echo - echo "Homepage: " - exit 0 -} - -Do_snapshot () -{ - case "${TYPE}" in - squashfs) - echo "./tmp/exclude_list" > /tmp/exclude_list - ( cd "${COW}" && find . -name '*.wh.*' >> /tmp/exclude_list ) - mksquashfs "${COW}" "${DEST}" -ef /tmp/exclude_list || exit 1 - rm /tmp/exclude_list - ;; - cpio) - ( cd "${COW}" && find . -path '*.wh.*' -prune -o -print0 | cpio --quiet -o0 -H newc | gzip -9c > "${DEST}" ) || exit 1 - ;; - ext2) - DU_DIM="`du -ks ${COW} | cut -f1`" - REAL_DIM="`expr ${DU_DIM} + ${DU_DIM} / 20`" # Just 5% more to be sure, need something more sophistcated here... - genext2fs --size-in-blocks=${REAL_DIM} --reserved-percentage=0 --root="${COW}" "${DEST}" || exit 1 - ;; - *) - echo "Internal error." - exit 1 - ;; - esac -} - -Is_same_mount () -{ - dir1="`Base_path $1`" - dir2="`Base_path $2`" - if [ "${dir1}" == "${dir2}" ]; then - return 0 - else - return 1 - fi -} - -Parse_args () -{ - # Parse command line - ARGUMENTS="`getopt --longoptions cow:,device:,output,resync-string:,type:,help,usage,version --name=${PROGRAM} --options c:d:o:t:r:,h,u,v --shell sh -- "$@"`" - - if [ "$?" != "0" ]; then - echo "Terminating." >&2 - exit 1 - fi - - eval set -- "${ARGUMENTS}" - - while true; do - case "$1" in - -c|--cow) - SNAP_COW="$2"; shift 2 ;; - -d|--device) - SNAP_DEV="$2"; shift 2 ;; - -o|--output) - SNAP_OUTPUT="$2"; shift 2 ;; - -t|--type) - SNAP_TYPE="$2"; shift 2 ;; - -r|--resync-string) - SNAP_RSTRING="$2"; break ;; - -h|--help) - Help; shift ;; - -u|--usage) - Usage ; shift ;; - -v|--version) - Version; shift ;; - --) - shift; break ;; - *) - echo "Internal error."; exit 1 ;; - esac - done -} - -Mount_device () -{ - dev="$1" - - if [ ! -d "${MOUNTP}" ]; then - mkdir -p "${MOUNTP}" - fi - - if [ -z "${dev}" ]; then - # create a temp - mount -t tmpfs -o rw tmpfs "${MOUNTP}" - if [ ! -L /home/$USERNAME/Desktop/casper-snapshot ]; then - ln -s "${MOUNTP}" /home/$USERNAME/Desktop/casper-snapshot - fi - else - if [ -b "${dev}" ] ; then - try_mount "${dev}" "${MOUNTP}" rw - fi - fi -} - -Defaults () -{ - MOUNTP="/mnt/casper-snapshot" - COW="/cow" - DEV="" - TYPE="cpio" - DESKTOP_LINK=/home/$USERNAME/Desktop/casper-snapshot - - if [ -n "${SNAP_RSTRING}" ]; then - COW=$(echo "${SNAP_RSTRING}" | cut -f1 -d ':') - DEV=$(echo "${SNAP_RSTRING}" | cut -f2 -d ':') - DEST="${MOUNTP}/$(echo "${SNAP_RSTRING}" | cut -f3 -d ':')" - - case "${DEST}" in - *.cpio.gz) - TYPE="cpio" ;; - *.squashfs) - TYPE="squashfs" ;; - "") - TYPE="ext2" ;; - *.ext2) - TYPE="ext2" ;; - *) - Usage "Unrecognized String" ;; - esac - else - DEF_COW="/cow" - # Bad options handling - if [ -z "${SNAP_COW}" ]; then - COW="${DEF_COW}" - else - COW="${SNAP_COW}" - fi - - case "${SNAP_TYPE}" in - "cpio"|"squashfs"|"ext2") - TYPE="${SNAP_TYPE}" - ;; - "") - TYPE="cpio" ;; - *) - Usage "Error: unrecognized snapshot type" - ;; - esac - case "${TYPE}" in - cpio) - DEST="${MOUNTP}/casper-sn.cpio.gz" ;; - squashfs) - DEST="${MOUNTP}/casper-sn.squashfs" ;; - ext2) - DEST="${MOUNTP}/casper-sn.ext2" ;; - *) - echo "Internal error." - exit 1 - ;; - esac - #if [ -d - #if Is_same_mount - fi - - # check vars - if [ ! -d "${COW}" ]; then - Usage "Error: ${COW} is not a directory" - fi - - Mount_device $DEV - -} - -Clean () -{ - if [ -n "$DEV" ]; then - umount "${MOUNTP}" - rmdir "${MOUNTP}" - rm - fi -} - -Main () -{ - Parse_args "$@" - Defaults - Do_snapshot - Clean -} - -Main "$@" diff --git a/srcpkgs/xbps-casper/files/conf.d/compcache b/srcpkgs/xbps-casper/files/conf.d/compcache deleted file mode 100644 index c93c77626ca..00000000000 --- a/srcpkgs/xbps-casper/files/conf.d/compcache +++ /dev/null @@ -1 +0,0 @@ -COMPCACHE_SIZE="25%" diff --git a/srcpkgs/xbps-casper/files/hooks/casper b/srcpkgs/xbps-casper/files/hooks/casper index ea9fd214e71..865452b6ebb 100755 --- a/srcpkgs/xbps-casper/files/hooks/casper +++ b/srcpkgs/xbps-casper/files/hooks/casper @@ -58,7 +58,7 @@ manual_add_modules sbp2 manual_add_modules ohci1394 # Casper helpers. -for helper in getty login new-uuid snapshot; do +for helper in getty login new-uuid; do ln -s /sbin/casper-${helper} ${DESTDIR}/bin done cp /usr/share/initramfs-tools/scripts/casper-helpers $DESTDIR/scripts diff --git a/srcpkgs/xbps-casper/files/scripts/casper b/srcpkgs/xbps-casper/files/scripts/casper index ffe7329cf03..d27a540adbd 100644 --- a/srcpkgs/xbps-casper/files/scripts/casper +++ b/srcpkgs/xbps-casper/files/scripts/casper @@ -6,11 +6,7 @@ export PATH=/usr/bin:/usr/sbin:/bin:/sbin mountpoint=/cdrom LIVE_MEDIA_PATH=casper - -root_persistence="casper-rw" -home_persistence="home-rw" -root_snapshot_label="casper-sn" -home_snapshot_label="home-sn" +LIVE_ROOTFS=filesystem.squashfs USERNAME=casper USERFULLNAME="Live session user" @@ -30,19 +26,18 @@ if [ ! -f /casper.vars ]; then touch /casper.vars fi -parse_cmdline() { +parse_cmdline() +{ for x in $(cat /proc/cmdline); do case $x in - showmounts|show-cow) - export SHOWMOUNTS='Yes' ;; - persistent) - export PERSISTENT="Yes" ;; - nopersistent) - export PERSISTENT="" ;; union=*) export UNIONFS="${x#union=}";; ignore_uuid) IGNORE_UUID="Yes" ;; + live-rootfs=*) + LIVE_ROOTFS="${x#live-rootfs=}" + export LIVE_ROOTFS + echo "export LIVE_ROOTFS=\"$LIVE_ROOTFS\"" >> /etc/casper.conf ;; live-media-path=*) LIVE_MEDIA_PATH="${x#live-media-path=}" export LIVE_MEDIA_PATH @@ -58,27 +53,27 @@ parse_cmdline() { fi } -is_casper_path() { - path=$1 +is_casper_path() +{ + local path=$1 + if [ -d "$path/$LIVE_MEDIA_PATH" ]; then if [ "$(echo $path/$LIVE_MEDIA_PATH/*.squashfs)" != \ - "$path/$LIVE_MEDIA_PATH/*.squashfs" ] || - [ "$(echo $path/$LIVE_MEDIA_PATH/*.ext2)" != \ - "$path/$LIVE_MEDIA_PATH/*.ext2" ] || - [ "$(echo $path/$LIVE_MEDIA_PATH/*.dir)" != \ - "$path/$LIVE_MEDIA_PATH/*.dir" ]; then + "$path/$LIVE_MEDIA_PATH/*.squashfs" ]; then return 0 fi fi return 1 } -matches_uuid() { +matches_uuid() +{ if [ "$IGNORE_UUID" ] || [ ! -e /conf/uuid.conf ]; then return 0 fi - path="$1" - uuid="$(cat /conf/uuid.conf)" + local path="$1" + local uuid="$(cat /conf/uuid.conf)" + for try_uuid_file in "$path/.disk/casper-uuid"*; do [ -e "$try_uuid_file" ] || continue try_uuid="$(cat "$try_uuid_file")" @@ -89,44 +84,34 @@ matches_uuid() { return 1 } -get_backing_device() { +get_backing_device() +{ case "$1" in - *.squashfs|*.ext2) + *.squashfs) echo $(setup_loop "$1" "loop" "/sys/block/loop*") ;; - *.dir) - echo "directory" - ;; *) panic "Unrecognized casper filesystem: $1" ;; esac } -match_files_in_dir() { - # Does any files match pattern $1 ? +mount_image_in_directory() +{ + local directory="$1" + local rootmnt="$2" - local pattern="$1" - if [ "$(echo $pattern)" != "$pattern" ]; then - return 0 + if [ ! -f "$directory/$LIVE_MEDIA_PATH/$LIVE_ROOTFS" ]; then + panic "Cannot find $directory/$LIVE_MEDIA_PATH/$LIVE_ROOTFS" fi - return 1 + + setup_unionfs "$directory/$LIVE_MEDIA_PATH" "$rootmnt" } -mount_images_in_directory() { - directory="$1" - rootmnt="$2" - if match_files_in_dir "$directory/$LIVE_MEDIA_PATH/*.squashfs" || - match_files_in_dir "$directory/$LIVE_MEDIA_PATH/*.ext2" || - match_files_in_dir "$directory/$LIVE_MEDIA_PATH/*.dir"; then - setup_unionfs "$directory/$LIVE_MEDIA_PATH" "$rootmnt" - else - : - fi -} +is_nice_device() +{ + local sysfs_path="${1#/sys}" -is_nice_device() { - sysfs_path="${1#/sys}" if /lib/udev/path_id "${sysfs_path}" | egrep -q "ID_PATH=(usb|pci-[^-]*-(ide|scsi|usb)|platform-orion-ehci|platform- mmc|platform-mxsdhci)"; then return 0 @@ -137,10 +122,12 @@ mmc|platform-mxsdhci)"; then return 1 } -copy_live_to() { - copyfrom="${1}" - copytodev="${2}" - copyto="${copyfrom}_swap" +copy_live_to() +{ + local copyfrom="${1}" + local copytodev="${2}" + local copyto="${copyfrom}_swap" + local size freespace mount_options free_string fstype dev size=$(fs_size "" ${copyfrom} "used") @@ -181,120 +168,12 @@ copy_live_to() { return 0 } -do_snap_copy () +setup_unionfs() { - fromdev="${1}" - todir="${2}" - snap_type="${3}" - - size=$(fs_size "${fromdev}" "" "used") - - if [ -b "${fromdev}" ]; then - # look for free mem - if [ -n "${HOMEMOUNTED}" -a "${snap_type}" = "HOME" ]; then - todev=$(cat /proc/mounts | grep -s " $(base_path ${todir}) " | awk '{print $1}' ) - freespace=$(df -k | grep -s ${todev} | awk '{print $4}') - else - freespace=$(awk '/^MemFree:/{f=$2} /^Cached:/{c=$2} END{print f+c}' /proc/meminfo) - fi - - tomount="/mnt/tmpsnap" - if [ ! -d "${tomount}" ] ; then - mkdir -p "${tomount}" - fi - - fstype=$(get_fstype "${fromdev}") - if [ -n "${fstype}" ]; then - # Copying stuff... - mount -t "${fstype}" -o ro,noatime "${fromdev}" "${tomount}" - cp -a "${tomount}"/* ${todir} - umount "${tomount}" - else - log_warning_msg "Unrecognized fstype: ${fstype} on ${fromdev}:${snap_type}" - fi - - rmdir "${tomount}" - if echo ${fromdev} | grep -qs loop; then - losetup -d "${fromdev}" - fi - return 0 - else - return 1 - [ "$quiet" != "y" ] && \ - log_warning_msg "Unable to find the snapshot ${snap_type} medium" - fi -} - -try_snap () -{ - # Look for $snap_label.* in block devices and copy the contents to $snap_mount - # and remember the device and filename for resync on exit in casper.init - - snap_label="${1}" - snap_mount="${2}" - snap_type="${3}" - - snapdata=$(find_files "${snap_label}.squashfs ${snap_label}.cpio.gz ${snap_label}.ext2") - if [ ! -z "${snapdata}" ]; then - snapdev="$(echo ${snapdata} | cut -f1 -d ' ')" - snapback="$(echo ${snapdata} | cut -f2 -d ' ')" - snapfile="$(echo ${snapdata} | cut -f3 -d ' ')" - if echo "${snapfile}" | grep -qs '\(squashfs\|ext2\)'; then - # squashfs or ext2 snapshot - dev=$(get_backing_device "${snapback}/${snapfile}") - if ! do_snap_copy "${dev}" "${snap_mount}" "${snap_type}"; then - log_warning_msg "Impossible to include the ${snapfile} Snapshot" - return 1 - fi - else - # cpio.gz snapshot - # Unfortunately klibc's cpio is incompatible with the rest of - # the world; everything else requires -u -d, while klibc doesn't - # implement them. Try to detect whether it's in use. - cpiopath="$(which cpio)" || true - if [ "$cpiopath" ] && grep -aq /lib/klibc "$cpiopath"; then - cpioargs= - else - cpioargs='-u -d' - fi - if ! (cd "${snap_mount}" && zcat "${snapback}/${snapfile}" | cpio -i $cpioargs 2>/dev/null) ; then - log_warning_msg "Impossible to include the ${snapfile} Snapshot" - return 1 - fi - fi - umount "${snapback}" - else - dev=$(find_cow_device "${snap_label}") - if [ -b ${dev} ]; then - if echo "${dev}" | grep -qs loop; then - # strange things happens, user confused? - snaploop=$( losetup ${dev} | awk '{print $3}' | tr -d '()' ) - snapfile=$(basename ${snaploop}) - snapdev=$(cat /proc/mounts | awk '{print $2,$1}' | grep -es "^$( dirname ${snaploop} )" | cut -f2 -d ' ') - else - snapdev="${dev}" - fi - if ! do_snap_copy "${dev}" "${snap_mount}" "${snap_type}" ; then - log_warning_msg "Impossible to include the ${snap_label} Snapshot" - return 1 - else - if [ -n "${snapfile}" ]; then - # it was a loop device, user confused - umount ${snapdev} - fi - fi - else - log_warning_msg "Impossible to include the ${snap_label} Snapshot" - return 1 - fi - fi - echo "export ${snap_type}SNAP="/cow${snap_mount#$rootmnt}":${snapdev}:${snapfile}" >> /etc/casper.conf # for resync on reboot/halt - return 0 -} - -setup_unionfs() { - image_directory="$1" - rootmnt="$2" + local image_directory="$1" + local rootmnt="$2" + local croot rofsstring rofslist roopt image imagename backdev + local fstype cowdevice cow_fstrype cow_mountopt case ${UNIONFS} in aufs|unionfs) @@ -306,39 +185,31 @@ setup_unionfs() { # move all of these away before it runs anyway. No, we're not, # put them in / since move-mounting them into / breaks mono and # some other apps. - croot="/" # Let's just mount the read-only file systems first rofsstring="" rofslist="" - if [ "${NETBOOT}" = "nfs" ] ; then - roopt="nfsro" # work around a bug in nfs-unionfs locking - elif [ "${UNIONFS}" = "aufs" ]; then + if [ "${UNIONFS}" = "aufs" ]; then roopt="rr" else roopt="ro" fi mkdir -p "${croot}" - for image_type in "ext2" "squashfs" "dir" ; do - for image in "${image_directory}"/*."${image_type}"; do - imagename=$(basename "${image}") - if [ -d "${image}" ]; then - # it is a plain directory: do nothing - rofsstring="${image}=${roopt}:${rofsstring}" - rofslist="${image} ${rofslist}" - elif [ -f "${image}" ]; then - backdev=$(get_backing_device "$image") - fstype=$(get_fstype "${backdev}") - if [ "${fstype}" = "unknown" ]; then - panic "Unknown file system type on ${backdev} (${image})" - fi - mkdir -p "${croot}/${imagename}" - mount -t "${fstype}" -o ro,noatime "${backdev}" "${croot}/${imagename}" || panic "Can not mount $backdev ($image) on ${croot}/${imagename}" && rofsstring="${croot}/${imagename}=${roopt}:${rofsstring}" && rofslist="${croot}/${imagename} ${rofslist}" - fi - done - done + image="${image_directory}/${LIVE_ROOTFS}" + imagename=$(basename "$image") + backdev=$(get_backing_device "$image") + fstype=$(get_fstype "${backdev}") + if [ "${fstype}" = "unknown" ]; then + panic "Unknown file system type on ${backdev} (${image})" + fi + mkdir -p "${croot}/${imagename}" + mount -t "${fstype}" -o ro,noatime "${backdev}" "${croot}/${imagename}" \ + || panic "Can not mount $backdev ($image) on ${croot}/${imagename}" + + rofsstring="${croot}/${imagename}=${roopt}:${rofsstring}" + rofslist="${croot}/${imagename} ${rofslist}" rofsstring=${rofsstring%:} mkdir -p /cow @@ -346,72 +217,23 @@ setup_unionfs() { cow_fstype="tmpfs" cow_mountopt="rw,noatime,mode=755" - # Looking for "${root_persistence}" device or file - if [ -n "${PERSISTENT}" ]; then - cowprobe=$(find_cow_device "${root_persistence}") - if [ -b "${cowprobe}" ]; then - cowdevice=${cowprobe} - cow_fstype=$(get_fstype "${cowprobe}") - cow_mountopt="rw,noatime" - else - [ "$quiet" != "y" ] && \ - log_warning_msg "Unable to find the persistent medium" - fi - fi - mount -t ${cow_fstype} -o ${cow_mountopt} ${cowdevice} \ /cow || panic "Can not mount $cowdevice on /cow" mount -t ${UNIONFS} -o noatime,dirs=/cow=rw:$rofsstring \ ${UNIONFS} "$rootmnt" || panic "${UNIONFS} mount failed" - # Adding other custom mounts - if [ -n "${PERSISTENT}" ]; then - # directly mount /home - # FIXME: add a custom mounts configurable system - homecow=$(find_cow_device "${home_persistence}" ) - if [ -b "${homecow}" ]; then - mount -t $(get_fstype "${homecow}") -o rw,noatime \ - "${homecow}" "${rootmnt}/home" - # Used to proper calculate free space in do_snap_copy() - export HOMEMOUNTED=1 - else - [ "$quiet" != "y" ] && \ - log_warning_msg "Unable to find the persistent home medium" - fi - # Look for other snapshots to copy in - try_snap "${root_snapshot_label}" "${rootmnt}" "ROOT" - try_snap "${home_snapshot_label}" "${rootmnt}/home" "HOME" - fi - - if [ -n "${SHOWMOUNTS}" ]; then - for d in ${rofslist}; do - mkdir -p "${rootmnt}/${LIVE_MEDIA_PATH}/${d##*/}" - case d in - *.dir) - # do nothing - ;; - *) - mount -o move "${d}" \ - "${rootmnt}/${LIVE_MEDIA_PATH}/${d##*/}" - ;; - esac - done - # shows cow fs on /cow for use by casper-snapshot - mkdir -p "${rootmnt}/cow" - mount -o bind /cow "${rootmnt}/cow" - fi - - # XXX: hardcode the image name for now (xtraeme). # move the first mount. mkdir -p "${rootmnt}/rofs" - mount -o move /filesystem.squashfs "${rootmnt}/rofs" + mount -o move ${croot}${imagename} "${rootmnt}/rofs" } -check_dev () +check_dev() { - sysdev="${1}" - devname="${2}" - skip_uuid_check="${3}" + local sysdev="${1}" + local devname="${2}" + local skip_uuid_check="${3}" + local loopdevname devuid + if [ -z "${devname}" ]; then devname=$(sys2dev "${sysdev}") fi @@ -454,8 +276,11 @@ check_dev () return 1 } -find_livefs() { - timeout="${1}" +find_livefs() +{ + local timeout="${1}" + local devname fstype dev + # first look at the one specified in the command line if [ ! -z "${LIVEMEDIA}" ]; then if check_dev "null" "${LIVEMEDIA}" "skip_uuid_check"; then @@ -484,10 +309,7 @@ find_livefs() { return 0 fi done - elif [ "${fstype}" = "squashfs" -o \ - "${fstype}" = "ext4" -o \ - "${fstype}" = "ext3" -o \ - "${fstype}" = "ext2" ]; then + elif [ "${fstype}" = "squashfs" ]; then # This is an ugly hack situation, the block device has # an image directly on it. It's hopefully # casper, so take it and run with it. @@ -499,7 +321,10 @@ find_livefs() { return 1 } -mountroot() { +mountroot() +{ + local i livefs_root live_dest + parse_cmdline wait_for_udev 10 @@ -510,8 +335,8 @@ mountroot() { # Scan local devices for the image i=0 - while [ "$i" -lt 60 ]; do - livefs_root=$(find_livefs $i) + while [ "$i" -lt 10 ]; do + livefs_root=$(find_livefs $i) [ -n "${livefs_root}" ] && break sleep 1 i="$(($i + 1))" @@ -532,7 +357,7 @@ mountroot() { log_end_msg fi - mount_images_in_directory "${livefs_root}" "${rootmnt}" + mount_image_in_directory "${livefs_root}" "${rootmnt}" maybe_break casper-bottom log_begin_msg "Running /scripts/casper-bottom" diff --git a/srcpkgs/xbps-casper/files/scripts/casper-helpers b/srcpkgs/xbps-casper/files/scripts/casper-helpers index 64cece8b0ec..bcc8389e6fe 100644 --- a/srcpkgs/xbps-casper/files/scripts/casper-helpers +++ b/srcpkgs/xbps-casper/files/scripts/casper-helpers @@ -1,13 +1,15 @@ -## Casper helper functions, used by casper on boot and by casper-snapshot +## Casper helper functions, used by casper on boot. MP_QUIET="-q" -sys2dev() { +sys2dev() +{ sysdev=${1#/sys} echo "/dev/$(/sbin/udevadm info -q name -p ${sysdev} 2>/dev/null|| echo ${sysdev##*/})" } -subdevices() { +subdevices() +{ sysblock=$1 r="" for dev in "${sysblock}" "${sysblock}"/*; do @@ -18,7 +20,8 @@ subdevices() { echo ${r} } -is_supported_fs () { +is_supported_fs() +{ # FIXME: do something better like the scan of supported filesystems fstype="${1}" case ${fstype} in @@ -29,11 +32,13 @@ is_supported_fs () { return 1 } -get_fstype() { +get_fstype() +{ /sbin/blkid -s TYPE -o value $1 2>/dev/null } -where_is_mounted() { +where_is_mounted() +{ device=$1 if grep -q "^$device " /proc/mounts; then mountpoint="$(grep "^$device " /proc/mounts | awk '{print $2; exit}')" @@ -44,31 +49,7 @@ where_is_mounted() { return 1 } -lastline() { - while read lines ; do - line=${lines} - done - echo "${line}" -} - -base_path () -{ - testpath="${1}" - mounts="$(awk '{print $2}' /proc/mounts)" - testpath="$(busybox realpath ${testpath})" - - while true ; do - if echo "${mounts}" | grep -qs "^${testpath}" ; then - set -- `echo "${mounts}" | grep "^${testpath}" | lastline` - echo ${1} - break - else - testpath=`dirname $testpath` - fi - done -} - -fs_size () +fs_size() { # Returns used/free fs kbytes + 5% more # You could pass a block device as $1 or the mount point as $2 @@ -147,73 +128,3 @@ setup_loop() { panic "No loop devices available" fi } - -try_mount () -{ - dev="${1}" - mountp="${2}" - opts="${3}" - - if where_is_mounted ${dev} > /dev/null; then - if [ "${opts}" != "ro" ]; then - mount -o remount,"${opts}" ${dev} $(where_is_mounted ${dev}) || panic "Remounting failed" - fi - mount -o bind $(where_is_mounted ${dev}) ${mountp} || panic "Cannot bind-mount" - else - mount -t $(get_fstype "${dev}") -o "${opts}" "${dev}" "${mountp}" || panic "Cannot mount ${dev} on ${mountp}" - fi -} - -find_cow_device() { - pers_label="${1}" - cow_backing="/${pers_label}-backing" - for sysblock in $(echo /sys/block/* | tr ' ' '\n' | grep -v loop); do - for dev in $(subdevices "${sysblock}"); do - devname=$(sys2dev "${dev}") - if [ "$(/sbin/blkid -s LABEL -o value $devname 2>/dev/null)" = "${pers_label}" ]; then - echo "$devname" - return - # Do not add any filesystem types here that might be able to - # mount a journalled filesystem and replay the journal. Doing so - # will cause data loss when a live CD is booted on a system - # where filesystems are in use by hibernated operating systems. - elif [ "$(get_fstype ${devname})" = "vfat" ]; then - mkdir -p "${cow_backing}" - try_mount "${devname}" "${cow_backing}" "rw" - if [ -e "${cow_backing}/${pers_label}" ]; then - echo $(setup_loop "${cow_backing}/${pers_label}" "loop" "/sys/block/loop*") - return 0 - else - umount ${cow_backing} - fi - fi - done - done -} - -find_files() -# return the first of $filenames found on vfat and ext2 devices -# FIXME: merge with above function -{ - filenames="${1}" - snap_backing="/snap-backing" - for sysblock in $(echo /sys/block/* | tr ' ' '\n' | grep -v loop); do - for dev in $(subdevices "${sysblock}"); do - devname=$(sys2dev "${dev}") - devfstype="$(get_fstype ${devname})" - if [ "${devfstype}" = "vfat" ] || [ "${devfstype}" = "ext2" ] ; then # FIXME: all supported block devices should be scanned - mkdir -p "${snap_backing}" - try_mount "${devname}" "${snap_backing}" "ro" - for filename in ${filenames}; do - if [ -e "${snap_backing}/${filename}" ]; then - echo "${devname} ${snap_backing} ${filename}" - return 0 - fi - done - umount ${snap_backing} - fi - done - done -} - - diff --git a/srcpkgs/xbps-casper/template b/srcpkgs/xbps-casper/template index 65ab0a65217..c493ea07cac 100644 --- a/srcpkgs/xbps-casper/template +++ b/srcpkgs/xbps-casper/template @@ -1,6 +1,6 @@ # Template file for 'xbps-casper' pkgname=xbps-casper -_localver=0.16 # XBPS package version +_localver=0.17 # XBPS package version _distver=1.236 # This should match the upstream (Ubuntu) version version=${_localver}.${_distver} build_style=custom-install @@ -30,12 +30,10 @@ do_install() # initramfs-tools hooks/scripts initramfsdir=${DESTDIR}/usr/share/initramfs-tools - install -d ${initramfsdir}/hooks ${initramfsdir}/scripts/casper-bottom \ - ${initramfsdir}/conf.d + install -d ${initramfsdir}/hooks ${initramfsdir}/scripts/casper-bottom install -m 755 ${FILESDIR}/hooks/* ${initramfsdir}/hooks install -m 755 ${FILESDIR}/scripts/casper-bottom/* \ ${initramfsdir}/scripts/casper-bottom install -m 644 ${FILESDIR}/scripts/{casper,casper-helpers} \ ${initramfsdir}/scripts - install -m 644 ${FILESDIR}/conf.d/* ${initramfsdir}/conf.d }