alt_mountpoint="/media"
LIVE_MEDIA_PATH="live"
-root_persistence="live-rw"
-home_persistence="home-rw"
-root_snapshot_label="live-sn"
-home_snapshot_label="home-sn"
-
USERNAME="user"
USERFULLNAME="Live user"
HOSTNAME="host"
touch /live.vars
fi
-Arguments ()
-{
- PRESEEDS=""
- LOCATIONS=""
-
- for ARGUMENT in $(cat /proc/cmdline)
- do
- case "${ARGUMENT}" in
- skipconfig)
- NOACCESSIBILITY="Yes"
- NOFASTBOOT="Yes"
- NOFSTAB="Yes"
- NONETWORKING="Yes"
-
- export NOACCESSIBILITY NOFASTBOOT NOFSTAB NONETWORKING
- ;;
-
- access=*)
- ACCESS="${ARGUMENT#access=}"
- export ACCESS
- ;;
-
- console=*)
- DEFCONSOLE="${ARGUMENT#*=}"
- export DEFCONSOLE
- ;;
-
- BOOTIF=*)
- BOOTIF="${x#BOOTIF=}"
- ;;
-
- debug)
- DEBUG="Yes"
- export DEBUG
-
- set -x
- ;;
-
- dhcp)
- # Force dhcp even while netbooting
- # Use for debugging in case somebody works on fixing dhclient
- DHCP="Force";
- export DHCP
- ;;
-
- nodhcp)
- unset DHCP
- ;;
-
- ethdevice=*)
- DEVICE="${ARGUMENT#ethdevice=}"
- ETHDEVICE="${DEVICE}"
- export DEVICE ETHDEVICE
- ;;
-
- ethdevice-timeout=*)
- ETHDEV_TIMEOUT="${ARGUMENT#ethdevice-timeout=}"
- export ETHDEV_TIMEOUT
- ;;
-
- fetch=*)
- FETCH="${ARGUMENT#fetch=}"
- export FETCH
- ;;
-
- forcepersistentfsck)
- FORCEPERSISTENTFSCK="Yes"
- export FORCEPERSISTENTFSCK
- ;;
-
- ftpfs=*)
- FTPFS="${ARGUMENT#ftpfs=}"
- export FTPFS
- ;;
-
- httpfs=*)
- HTTPFS="${ARGUMENT#httpfs=}"
- export HTTPFS
- ;;
-
- iscsi=*)
- ISCSI="${ARGUMENT#iscsi=}"
- #ip:port - separated by ;
- ISCSI_PORTAL="${ISCSI%;*}"
- if echo "${ISCSI_PORTAL}" | grep -q , ; then
- ISCSI_SERVER="${ISCSI_PORTAL%,*}"
- ISCSI_PORT="${ISCSI_PORTAL#*,}"
- fi
- #target name
- ISCSI_TARGET="${ISCSI#*;}"
- export ISCSI ISCSI_PORTAL ISCSI_TARGET ISCSI_SERVER ISCSI_PORT
- ;;
-
- isofrom=*|fromiso=*)
- FROMISO="${ARGUMENT#*=}"
- export FROMISO
- ;;
-
- ignore_uuid)
- IGNORE_UUID="Yes"
- export IGNORE_UUID
- ;;
-
- integrity-check)
- INTEGRITY_CHECK="Yes"
- export INTEGRITY_CHECK
- ;;
-
- ip=*)
- STATICIP="${ARGUMENT#ip=}"
-
- if [ -z "${STATICIP}" ]
- then
- STATICIP="frommedia"
- fi
-
- export STATICIP
- ;;
-
- live-getty)
- LIVE_GETTY="1"
- export LIVE_GETTY
- ;;
-
- live-media=*|bootfrom=*)
- LIVE_MEDIA="${ARGUMENT#*=}"
- export LIVE_MEDIA
- ;;
-
- live-media-encryption=*|encryption=*)
- LIVE_MEDIA_ENCRYPTION="${ARGUMENT#*=}"
- export LIVE_MEDIA_ENCRYPTION
- ;;
-
- live-media-offset=*)
- LIVE_MEDIA_OFFSET="${ARGUMENT#live-media-offset=}"
- export LIVE_MEDIA_OFFSET
- ;;
-
- live-media-path=*)
- LIVE_MEDIA_PATH="${ARGUMENT#live-media-path=}"
- export LIVE_MEDIA_PATH
- ;;
-
- live-media-timeout=*)
- LIVE_MEDIA_TIMEOUT="${ARGUMENT#live-media-timeout=}"
- export LIVE_MEDIA_TIMEOUT
- ;;
-
- module=*)
- MODULE="${ARGUMENT#module=}"
- export MODULE
- ;;
-
- netboot=*)
- NETBOOT="${ARGUMENT#netboot=}"
- export NETBOOT
- ;;
-
- nfsopts=*)
- NFSOPTS="${ARGUMENT#nfsopts=}"
- export NFSOPTS
- ;;
-
- nfscow=*)
- NFS_COW="${ARGUMENT#nfscow=}"
- export NFS_COW
- ;;
-
- noaccessibility)
- NOACCESSIBILITY="Yes"
- export NOACCESSIBILITY
- ;;
-
- nofastboot)
- NOFASTBOOT="Yes"
- export NOFASTBOOT
- ;;
-
- nofstab)
- NOFSTAB="Yes"
- export NOFSTAB
- ;;
-
- nonetworking)
- NONETWORKING="Yes"
- export NONETWORKING
- ;;
-
- swapon)
- SWAPON="Yes"
- export SWAPON
- ;;
-
- persistent)
- PERSISTENT="Yes"
- export PERSISTENT
- ;;
-
- persistent=*)
- PERSISTENT="${ARGUMENT#persistent=}"
- if [ -z "${PERSISTENT}" ]
- then
- PERSISTENT="Yes"
- fi
- export PERSISTENT
- ;;
-
- persistent-path=*)
- PERSISTENT_PATH="${ARGUMENT#persistent-path=}"
- export PERSISTENT_PATH
- ;;
-
- persistent-subtext=*)
- root_persistence="${root_persistence}-${ARGUMENT#persistent-subtext=}"
- home_persistence="${home_persistence}-${ARGUMENT#persistent-subtext=}"
- root_snapshot_label="${root_snapshot_label}-${ARGUMENT#persistent-subtext=}"
- home_snapshot_label="${home_snapshot_label}-${ARGUMENT#persistent-subtext=}"
- ;;
-
- nopersistent)
- NOPERSISTENT="Yes"
- export NOPERSISTENT
- ;;
-
- quickusbmodules)
- QUICKUSBMODULES="Yes"
- export QUICKUSBMODULES
- ;;
-
- preseed/file=*|file=*)
- LOCATIONS="${ARGUMENT#*=} ${LOCATIONS}"
- export LOCATIONS
- ;;
-
- nopreseed)
- NOPRESEED="Yes"
- export NOPRESEED
- ;;
-
- */*=*)
- question="${ARGUMENT%%=*}"
- value="${ARGUMENT#*=}"
- PRESEEDS="${PRESEEDS}\"${question}=${value}\" "
- export PRESEEDS
- ;;
-
- showmounts)
- SHOWMOUNTS="Yes"
- export SHOWMOUNTS
- ;;
-
- silent)
- SILENT="Yes"
- export SILENT
- ;;
-
- todisk=*)
- TODISK="${ARGUMENT#todisk=}"
- export TODISK
- ;;
-
- toram)
- TORAM="Yes"
- export TORAM
- ;;
-
- toram=*)
- TORAM="Yes"
- MODULETORAM="${ARGUMENT#toram=}"
- export TORAM MODULETORAM
- ;;
-
- exposedroot)
- EXPOSED_ROOT="Yes"
- export EXPOSED_ROOT
- ;;
-
- plainroot)
- PLAIN_ROOT="Yes"
- export PLAIN_ROOT
- ;;
-
- skipunion)
- SKIP_UNION_MOUNTS="Yes"
- export SKIP_UNION_MOUNTS
- ;;
-
- root=*)
- ROOT="${ARGUMENT#root=}"
- export ROOT
- ;;
-
- union=*)
- UNIONTYPE="${ARGUMENT#union=}"
- export UNIONTYPE
- ;;
- esac
- done
-
- # sort of compatibility with netboot.h from linux docs
- if [ -z "${NETBOOT}" ]
- then
- if [ "${ROOT}" = "/dev/nfs" ]
- then
- NETBOOT="nfs"
- export NETBOOT
- elif [ "${ROOT}" = "/dev/cifs" ]
- then
- NETBOOT="cifs"
- export NETBOOT
- fi
- fi
-
- if [ -z "${MODULE}" ]
- then
- MODULE="filesystem"
- export MODULE
- fi
-
- if [ -z "${UNIONTYPE}" ]
- then
- UNIONTYPE="aufs"
- export UNIONTYPE
- fi
-}
-
is_live_path ()
{
DIRECTORY="${1}"
{
sysfs_path="${1#/sys}"
- if /lib/udev/path_id "${sysfs_path}" | egrep -q "ID_PATH=(usb|pci-|platform-sata_mv|platform-orion-ehci|platform-mmc|platform-mxsdhci|)"
+ if [ -e /lib/udev/path_id ]
+ then
+ # squeeze
+ PATH_ID="/lib/udev/path_id"
+ else
+ # wheezy/sid (udev >= 174)
+ PATH_ID="/sbin/udevadm test-builtin path_id"
+ fi
+
+ if ${PATH_ID} "${sysfs_path}" | egrep -q "ID_PATH=(usb|pci-[^-]*-(ide|sas|scsi|usb|virtio)|platform-sata_mv|platform-orion-ehci|platform-mmc|platform-mxsdhci)"
then
return 0
elif echo "${sysfs_path}" | grep -q '^/block/vd[a-z]$'
elif echo ${sysfs_path} | grep -q "^/block/dm-"
then
return 0
+ elif echo ${sysfs_path} | grep -q "^/block/mtdblock"
+ then
+ return 0
fi
return 1
return 1
fi
+ # Custom ramdisk size
+ if [ -z "${mount_options}" ] && [ -n "${ramdisk_size}" ]
+ then
+ # FIXME: should check for wrong values
+ mount_options="-o size=${ramdisk_size}"
+ fi
+
# begin copying (or uncompressing)
mkdir "${copyto}"
log_begin_msg "mount -t ${fstype} ${mount_options} ${dev} ${copyto}"
if [ -n "${DNSDOMAIN}" ]
then
echo "domain ${DNSDOMAIN}" > /etc/resolv.conf
- echo "search ${DNSDOMAIN}" > /etc/resolv.conf
+ echo "search ${DNSDOMAIN}" >> /etc/resolv.conf
fi
for i in ${IPV4DNS0} ${IPV4DNS1} ${IPV4DNS1}
do
- echo "nameserver $i" >> /etc/resolv.conf
+ if [ -n "$i" ] && [ "$i" != 0.0.0.0 ]
+ then
+ echo "nameserver $i" >> /etc/resolv.conf
+ fi
done
fi
#modprobe ib_iser
modprobe iscsi_tcp
local debugopt=""
- [ "${DEBUG}" == "Yes" ] && debugopt="-d 8"
+ [ "${DEBUG}" = "Yes" ] && debugopt="-d 8"
#FIXME this name is supposed to be unique - some date + ifconfig hash?
ISCSI_INITIATORNAME="iqn.1993-08.org.debian.live:01:$(echo "${HWADDR}" | sed -e s/://g)"
- export ISCSI_INITIATORNAME
+ export ISCSI_INITIATORNAME
if [ -n "${ISCSI_SERVER}" ] ; then
iscsistart $debugopt -i "${ISCSI_INITIATORNAME}" -t "${ISCSI_TARGET}" -g 1 -a "${ISCSI_SERVER}" -p "${ISCSI_PORT}"
else
modprobe -q nfs
- if [ -z "${NFSOPTS}" ]
+ if [ -n "${NFSOPTS}" ]
then
- NFSOPTS=""
+ NFSOPTS="-o ${NFSOPTS}"
fi
log_begin_msg "Trying nfsmount -o nolock -o ro ${NFSOPTS} ${NFSROOT} ${mountpoint}"
then
CIFSOPTS="-ouser=root,password="
else
- CIFSOPTS="${NFSOPTS}"
+ CIFSOPTS="-o ${NFSOPTS}"
fi
log_begin_msg "Trying mount.cifs ${NFSROOT} ${mountpoint} ${CIFSOPTS}"
if [ -b "${fromdev}" ]
then
+ log_success_msg "Copying snapshot ${fromdev} to ${todir}..."
+
# look for free mem
if [ -n "${HOMEMOUNTED}" -a "${snap_type}" = "HOME" ]
then
return 0
else
- return 1
-
log_warning_msg "Unable to find the snapshot ${snap_type} medium"
+ return 1
fi
}
-find_snap ()
-{
- # Look for ${snap_label}.* in block devices
- snap_label="${1}"
-
- if [ "${PERSISTENT}" != "nofiles" ]
- then
- # search for image files
- snapdata=$(find_files "${PERSISTENT_PATH}${snap_label}.squashfs ${PERSISTENT_PATH}${snap_label}.cpio.gz ${PERSISTENT_PATH}${snap_label}.ext2 ${PERSISTENT_PATH}${snap_label}.ext3 ${PERSISTENT_PATH}${snap_label}.ext4 ${PERSISTENT_PATH}${snap_label}.jffs2")
- fi
-
- if [ -z "${snapdata}" ]
- then
- snapdata=$(find_cow_device "${snap_label}")
- fi
- echo "${snapdata}"
-}
-
try_snap ()
{
- # copy the contents of previously found snapshot to ${snap_mount}
+ # copy the contents of previously found snapshot to ${snap_mount}
# and remember the device and filename for resync on exit in live-boot.init
snapdata="${1}"
snap_mount="${2}"
snap_type="${3}"
+ snap_relpath="${4}"
+
+ if [ -z "${snap_relpath}" ]
+ then
+ # root snapshot, default usage
+ snap_relpath="/"
+ else
+ # relative snapshot (actually used just for "/home" snapshots)
+ snap_mount="${2}${snap_relpath}"
+ fi
if [ -n "${snapdata}" ] && [ ! -b "${snapdata}" ]
then
cpioargs='--unconditional --make-directories'
fi
- cd "${snap_mount}" && zcat "${snapback}/${snapfile}" | $cpiopath $cpioargs --extract --preserve-modification-time --no-absolute-filenames --sparse 2>/dev/null
- RES="$?"
+ if [ -s "${snapback}/${snapfile}" ]
+ then
+ BEFOREDIR="$(pwd)"
+ cd "${snap_mount}" && zcat "${snapback}/${snapfile}" | $cpiopath $cpioargs --extract --preserve-modification-time --no-absolute-filenames --sparse 2>/dev/null
+ RES="$?"
+ cd "${BEFOREDIR}"
+ else
+ log_warning_msg "${snapback}/${snapfile} is empty, adding it for sync on reboot."
+ RES="0"
+ fi
if [ "${RES}" != "0" ]
then
if ! do_snap_copy "${dev}" "${snap_mount}" "${snap_type}"
then
- log_warning_msg "Impossible to include the ${snap_type} Snapshot"
+ log_warning_msg "Impossible to include the ${snap_type} Snapshot (i)"
return 1
else
if [ -n "${snapfile}" ]
fi
fi
else
- log_warning_msg "Impossible to include the ${snap_type} Snapshot"
+ log_warning_msg "Impossible to include the ${snap_type} Snapshot (o)"
return 1
fi
- echo "export ${snap_type}SNAP="/cow${snap_mount#$rootmnt}":${snapdev}:${snapfile}" >> /etc/live.conf # for resync on reboot/halt
+ if [ -z ${PERSISTENT_READONLY} ]
+ then
+ echo "export ${snap_type}SNAP=${snap_relpath}:${snapdev}:${snapfile}" >> snapshot.conf # for resync on reboot/halt
+ fi
return 0
}
{
image_directory="${1}"
rootmnt="${2}"
- addimage_directory="${3}"
+ addimage_directory="${3}"
case ${UNIONTYPE} in
- aufs|unionfs)
+ aufs|unionfs|overlayfs)
modprobe -q -b ${UNIONTYPE}
if ! cut -f2 /proc/filesystems | grep -q "^${UNIONTYPE}\$" && [ -x /bin/unionfs-fuse ]
croot="/"
# Let's just mount the read-only file systems first
- rofsstring=""
rofslist=""
- if [ "${UNIONTYPE}" = "aufs" ]
- then
- roopt="rr"
- noxino_opt="noxino,"
- elif [ "${UNIONTYPE}" = "unionfs-fuse" ]
- then
- roopt="RO"
- else
- roopt="ro"
- fi
-
if [ -z "${PLAIN_ROOT}" ]
then
# Read image names from ${MODULE}.module if it exists
image_string="$(echo ${image_string} | sed -e 's/ /\n/g' | sort )"
fi
- [ -n "${MODULETORAMFILE}" ] && image_string="${image_directory}/$(basename ${MODULETORAMFILE})"
+ [ -n "${MODULETORAMFILE}" ] && image_string="${image_directory}/$(basename ${MODULETORAMFILE})"
mkdir -p "${croot}"
if [ -d "${image}" ]
then
# it is a plain directory: do nothing
- rofsstring="${image}=${roopt}:${rofsstring}"
rofslist="${image} ${rofslist}"
elif [ -f "${image}" ]
then
log_warning_msg "Unknown file system type on ${backdev} (${image}), assuming ${fstype}."
fi
- mkdir -p "${croot}/${imagename}"
- log_begin_msg "Mounting \"${image}\" on \"${croot}${imagename}\" via \"${backdev}\""
- 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}"
+ if [ "${UNIONTYPE}" != "unionmount" ]
+ then
+ mpoint="${croot}/${imagename}"
+ rofslist="${mpoint} ${rofslist}"
+ else
+ mpoint="${rootmnt}"
+ rofslist="${rootmnt} ${rofslist}"
+ fi
+ mkdir -p "${mpoint}"
+ log_begin_msg "Mounting \"${image}\" on \"${mpoint}\" via \"${backdev}\""
+ mount -t "${fstype}" -o ro,noatime "${backdev}" "${mpoint}" || panic "Can not mount ${backdev} (${image}) on ${mpoint}"
log_end_msg
fi
done
# we have a plain root system
mkdir -p "${croot}/filesystem"
log_begin_msg "Mounting \"${image_directory}\" on \"${croot}/filesystem\""
- mount -t $(get_fstype "${image_directory}") -o ro,noatime "${image_directory}" "${croot}/filesystem" || panic "Can not mount ${image_directory} on ${croot}/filesystem" && rofsstring="${croot}/filesystem=${roopt}:${rofsstring}" && rofslist="${croot}/filesystem ${rofslist}"
+ mount -t $(get_fstype "${image_directory}") -o ro,noatime "${image_directory}" "${croot}/filesystem" || \
+ panic "Can not mount ${image_directory} on ${croot}/filesystem" && \
+ rofslist="${croot}/filesystem ${rofslist}"
# probably broken:
mount -o bind ${croot}/filesystem $mountpoint
log_end_msg
fi
- rofsstring=${rofsstring%:}
-
mkdir -p /cow
- # Looking for "${root_persistence}" device or file
+ # Looking for persistent devices or files
if [ -n "${PERSISTENT}" ] && [ -z "${NOPERSISTENT}" ]
then
+
if [ -z "${QUICKUSBMODULES}" ]
then
# Load USB modules
done
fi
- # search for label and files (this could be hugely optimized)
- cowprobe=$(find_cow_device "${root_persistence}")
- if [ -b "${cowprobe}" ]
+ case "${PERSISTENT_MEDIA}" in
+ removable)
+ whitelistdev="$(removable_dev)"
+ ;;
+ removable-usb)
+ whitelistdev="$(removable_usb_dev)"
+ ;;
+ *)
+ whitelistdev=""
+ ;;
+ esac
+
+ if echo ${PERSISTENT_METHOD} | grep -qe "\<overlay\>"
then
- # Blacklist /cow device, to avoid inconsistent setups for overlapping snapshots
- # makes sense to have both persistence for /cow and /home mounted, maybe also with
- # snapshots to be sure to really store some e.g key config files,
- # but not on the same media
- blacklistdev="${cowprobe}"
- PERSISTENCE_IS_ON="1"
- export PERSISTENCE_IS_ON
+ overlays="${root_overlay_label} ${old_root_overlay_label} ${old_home_overlay_label} ${custom_overlay_label}"
fi
- # homecow just mount something on /home, this should be generalized some way
- homecow=$(find_cow_device "${home_persistence}" "${blacklistdev}")
- if [ -b "${homecow}" ]
+
+ if echo ${PERSISTENT_METHOD} | grep -qe "\<snapshot\>"
then
- PERSISTENCE_IS_ON="1"
- export PERSISTENCE_IS_ON
+ snapshots="${root_snapshot_label} ${home_snapshot_label}"
fi
- root_snapdata=$(find_snap "${root_snapshot_label}" "${blacklistdev}")
- # This second type should be removed when snapshot will get smarter,
- # hence when "/etc/live-snapshot*list" will be supported also by
- # ext2|ext3|ext4|jffs2 snapshot types.
- home_snapdata=$(find_snap "${home_snapshot_label}" "${blacklistdev}")
- if [ -b "${cowprobe}" ]
+ local root_snapdata=""
+ local home_snapshot_label=""
+ local root_overlay_label=""
+ local overlay_devices=""
+ for media in $(find_persistent_media "${overlays}" "${snapshots}" "${whitelistdev}")
+ do
+ media="$(echo ${media} | tr ":" " ")"
+ case ${media} in
+ ${root_snapshot_label}=*|${old_root_snapshot_label}=*)
+ if [ -z "${root_snapdata}" ]
+ then
+ root_snapdata="${media#*=}"
+ fi
+ ;;
+ ${home_snapshot_label}=*)
+ # This second type should be removed when snapshot will get smarter,
+ # hence when "/etc/live-snapshot*list" will be supported also by
+ # ext2|ext3|ext4|jffs2 snapshot types.
+ if [ -z "${home_snapdata}" ]
+ then
+ home_snapdata="${media#*=}"
+ fi
+ ;;
+ ${root_overlay_label}=*|${old_root_overlay_label}=*)
+ if [ -z "${root_overlay_device}" ]
+ then
+ device="${media#*=}"
+ root_overlay_device="${device}"
+ fi
+ ;;
+ ${old_home_overlay_label}=*)
+ device="${media#*=}"
+ fix_home_rw_compatibility ${device}
+ overlay_devices="${overlay_devices} ${device}"
+ ;;
+ ${custom_overlay_label}=*)
+ device="${media#*=}"
+ overlay_devices="${overlay_devices} ${device}"
+ ;;
+ esac
+ done
+
+ if [ -b "${root_overlay_device}" ]
then
- cowdevice=${cowprobe}
- cow_fstype=$(get_fstype "${cowprobe}")
- cow_mountopt="rw,noatime"
+ PERSISTENCE_IS_ON="1"
+ export PERSISTENCE_IS_ON
+
+ cowdevice=${root_overlay_device}
+ cow_fstype=$(get_fstype "${root_overlay_device}")
+ if [ -z "${PERSISTENT_READONLY}" ]
+ then
+ cow_mountopt="rw,noatime"
+ else
+ cow_mountopt="ro,noatime"
+ fi
if [ "${FORCEPERSISTENTFSCK}" = "Yes" ]
then
fsck -y ${cowdevice}
fi
- else
- log_warning_msg "Unable to find the persistent medium"
- cowdevice="tmpfs"
- cow_fstype="tmpfs"
- cow_mountopt="rw,noatime,mode=755"
fi
elif [ -n "${NFS_COW}" ] && [ -z "${NOPERSISTENT}" ]
then
nfs_cow_opts="-o nolock"
nfs_cow=${NFS_COW}
fi
+
+ if [ -n "${PERSISTENT_READONLY}" ]
+ then
+ nfs_cow_opts="${nfs_cow_opts},nocto,ro"
+ fi
+
mac="$(get_mac)"
if [ -n "${mac}" ]
then
else
panic "unable to determine mac address"
fi
- else
+ fi
+
+ if [ -z "${cowdevice}" ]
+ then
cowdevice="tmpfs"
cow_fstype="tmpfs"
cow_mountopt="rw,noatime,mode=755"
fi
- if [ "${cow_fstype}" = "nfs" ]
+ if [ "${UNIONTYPE}" != "unionmount" ]
then
- log_begin_msg \
- "Trying nfsmount ${nfs_cow_opts} ${cowdevice} /cow"
- nfsmount ${nfs_cow_opts} ${cowdevice} /cow || \
- panic "Can not mount ${cowdevice} (n: ${cow_fstype}) on /cow"
- else
- mount -t ${cow_fstype} -o ${cow_mountopt} ${cowdevice} /cow || \
- panic "Can not mount ${cowdevice} (o: ${cow_fstype}) on /cow"
+ if [ -n "${PERSISTENT_READONLY}" ]
+ then
+ mount -t tmpfs -o rw,noatime,mode=755 tmpfs "/cow"
+ root_backing="${rootmnt}/live/persistent/$(basename ${cowdevice})-root"
+ mkdir -p ${root_backing}
+ else
+ root_backing="/cow"
+ fi
+
+ if [ "${cow_fstype}" = "nfs" ]
+ then
+ log_begin_msg \
+ "Trying nfsmount ${nfs_cow_opts} ${cowdevice} ${root_backing}"
+ nfsmount ${nfs_cow_opts} ${cowdevice} ${root_backing} || \
+ panic "Can not mount ${cowdevice} (n: ${cow_fstype}) on ${root_backing}"
+ else
+ mount -t ${cow_fstype} -o ${cow_mountopt} ${cowdevice} ${root_backing} || \
+ panic "Can not mount ${cowdevice} (o: ${cow_fstype}) on ${root_backing}"
+ fi
fi
rofscount=$(echo ${rofslist} |wc -w)
- if [ -n "${EXPOSED_ROOT}" ]
+ # XXX: we now ensure that there can only be one read-only filesystem. Should this be inside the EXPOSED_ROOT if?
+ if [ ${rofscount} -ne 1 ]
then
- if [ ${rofscount} -ne 1 ]
- then
- panic "only one RO file system supported with exposedroot: ${rofslist}"
- fi
- exposedrootfs=${rofslist%% }
+ panic "only one RO file system supported with exposedroot: ${rofslist}"
+ fi
+ rofs=${rofslist%% }
- mount --bind ${exposedrootfs} ${rootmnt} || \
- panic "bind mount of ${exposedrootfs} failed"
+ if [ -n "${EXPOSED_ROOT}" ]
+ then
+ mount --bind ${rofs} ${rootmnt} || \
+ panic "bind mount of ${rofs} failed"
if [ -z "${SKIP_UNION_MOUNTS}" ]
then
else
cow_dirs=''
fi
-
- for dir in ${cow_dirs}; do
- mkdir -p /cow${dir}
-
- case "${UNIONTYPE}" in
- unionfs-fuse)
- (ulimit -n 16384; unionfs-fuse -o cow -o noinitgroups -o default_permissions -o allow_other -o use_ino -o suid /cow=RW:${exposedrootfs}${dir} "${rootmnt}${dir}" || panic "mount ${UNIONTYPE} on ${rootmnt}${dir} failed with option cow,noinitgroups,default_permissions,allow_other,use_ino,suid=/cow=RW:${exposedrootfs}${dir}")
- mkdir -p /dev/.initramfs/varrun
- pidof unionfs-fuse >> /dev/.initramfs/varrun/sendsigs.omit || true
- ;;
-
- *)
- mount -t ${UNIONTYPE} -o rw,noatime,dirs=/cow${dir}=rw:${exposedrootfs}${dir}=ro ${UNIONTYPE} "${rootmnt}${dir}" || panic "mount ${UNIONTYPE} on ${rootmnt}${dir} failed with option rw,noatime,dirs=/cow${dir}=rw:${exposedrootfs}${dir}=ro"
- ;;
- esac
- done
else
- case "${UNIONTYPE}" in
- unionfs-fuse)
- (ulimit -n 16384; unionfs-fuse -o cow -o noinitgroups -o default_permissions -o allow_other -o use_ino -o suid /cow=RW:${rofsstring} "${rootmnt}" || panic "mount ${UNIONTYPE} on ${rootmnt} failed with option cow,noinitgroups,default_permissions,allow_other,use_ino,suid=/cow:RW:${rofsstring}")
- mkdir -p /dev/.initramfs/varrun
- pidof unionfs-fuse >> /dev/.initramfs/varrun/sendsigs.omit || true
- ;;
+ cow_dirs="/"
+ fi
- *)
- mount -t ${UNIONTYPE} -o noatime,${noxino_opt}dirs=/cow=rw:${rofsstring} ${UNIONTYPE} "${rootmnt}" || panic "mount ${UNIONTYPE} on ${rootmnt} failed with option noatime,${noxino_opt}dirs=/cow=rw:${rofsstring}"
- ;;
- esac
+ if [ "${cow_fstype}" != "tmpfs" ] && [ "${cow_dirs}" != "/" ] && [ "${UNIONTYPE}" = "unionmount" ]
+ then
+ true # FIXME: Maybe it does, I don't really know.
+ #panic "unionmount does not support subunions (${cow_dirs})."
fi
+ for dir in ${cow_dirs}; do
+ unionmountpoint="${rootmnt}${dir}"
+ mkdir -p ${unionmountpoint}
+ if [ "${UNIONTYPE}" = "unionmount" ]
+ then
+ # FIXME: handle PERSISTENT_READONLY
+ unionmountopts="-t ${cow_fstype} -o noatime,union,${cow_mountopt} ${cowdevice}"
+ mount_full $unionmountopts "${unionmountpoint}"
+ else
+ cow_dir="/cow${dir}"
+ rofs_dir="${rofs}${dir}"
+ mkdir -p ${cow_dir}
+ if [ -n "${PERSISTENT_READONLY}" ] && [ "${cowdevice}" != "tmpfs" ]
+ then
+ #mount -t tmpfs -o rw,noatime,mode=755 tmpfs "${cow_dir}"
+ do_union ${unionmountpoint} ${cow_dir} ${root_backing} ${rofs_dir}
+ else
+ do_union ${unionmountpoint} ${cow_dir} ${rofs_dir}
+ fi
+ fi || panic "mount ${UNIONTYPE} on ${unionmountpoint} failed with option ${unionmountopts}"
+ done
+
# Correct the permissions of /:
chmod 0755 "${rootmnt}"
mkdir -p "${rootmnt}/live"
mount -t tmpfs tmpfs ${rootmnt}/live
- # Adding other custom mounts
- if [ -n "${PERSISTENT}" ] && [ -z "${NOPERSISTENT}" ]
- then
- # directly mount /home
- # FIXME: add a custom mounts configurable system
-
- if [ -b "${homecow}" ]
- then
- mount -t $(get_fstype "${homecow}") -o rw,noatime "${homecow}" "${rootmnt}/home"
- export HOMEMOUNTED=1 # used to proper calculate free space in do_snap_copy()
- else
- log_warning_msg "Unable to find the persistent home medium"
- fi
-
- # Look for other snapshots to copy in
- try_snap "${root_snapdata}" "${rootmnt}" "ROOT"
- # This second type should be removed when snapshot grow smarter
- try_snap "${home_snapdata}" "${rootmnt}/home" "HOME"
- fi
-
- if [ -n "${SHOWMOUNTS}" ]
+ live_rofs_list=""
+ # SHOWMOUNTS is necessary for custom mounts with the union option
+ # Since we may want to do custom mounts in user-space it's best to always enable SHOWMOUNTS
+ if true #[ -n "${SHOWMOUNTS}" ] || ( [ -n "${PERSISTENT}" ] && [ -z "${NOPERSISTENT}" ] 1)
then
+ # XXX: is the for loop really necessary? rofslist can only contain one item (see above XXX about EXPOSEDROOT) and this is also assumed elsewhere above (see use of $rofs above).
for d in ${rofslist}
do
- mkdir -p "${rootmnt}/live/${d##*/}"
-
+ live_rofs="${rootmnt}/live/rofs/${d##*/}"
+ live_rofs_list="${live_rofs_list} ${live_rofs}"
+ mkdir -p "${live_rofs}"
case d in
*.dir)
- # do nothing # mount -o bind "${d}" "${rootmnt}/live/${d##*/}"
+ # do nothing # mount -o bind "${d}" "${live_rofs}"
;;
-
*)
case "${UNIONTYPE}" in
unionfs-fuse)
- mount -o bind "${d}" "${rootmnt}/live/${d##*/}"
+ mount -o bind "${d}" "${live_rofs}"
;;
-
*)
- mount -o move "${d}" "${rootmnt}/live/${d##*/}"
+ mount -o move "${d}" "${live_rofs}"
;;
esac
;;
done
fi
+ # Adding custom persistent
+ if [ -n "${PERSISTENT}" ] && [ -z "${NOPERSISTENT}" ]
+ then
+ local custom_mounts="/tmp/custom_mounts.list"
+ rm -rf ${custom_mounts} 2> /dev/null
+
+ # Gather information about custom mounts from devies detected as overlays
+ get_custom_mounts ${custom_mounts} ${overlay_devices}
+
+ [ -n "${DEBUG}" ] && cp ${custom_mounts} "${rootmnt}/live/persistent"
+
+ # Now we do the actual mounting (and symlinking)
+ local used_overlays=""
+ used_overlays=$(activate_custom_mounts ${custom_mounts})
+ rm ${custom_mounts}
+
+ # Close unused overlays (e.g. due to missing $persistence_list)
+ for overlay in ${overlay_devices}
+ do
+ if echo ${used_overlays} | grep -qve "^\(.* \)\?${device}\( .*\)\?$"
+ then
+ close_persistent_media ${overlay}
+ fi
+ done
+
+ # Look for other snapshots to copy in
+ try_snap "${root_snapdata}" "${rootmnt}" "ROOT"
+ # This second type should be removed when snapshot grow smarter
+ try_snap "${home_snapdata}" "${rootmnt}" "HOME" "/home"
+ fi
+
# shows cow fs on /cow for use by live-snapshot
mkdir -p "${rootmnt}/live/cow"
mount -o move /cow "${rootmnt}/live/cow" >/dev/null 2>&1 || mount -o bind /cow "${rootmnt}/live/cow" || log_warning_msg "Unable to move or bind /cow to ${rootmnt}/live/cow"
if [ "$ISO_DEVICE" = "/" ]
then
- echo "Warning: device for bootoption isofrom= ($FROMISO) not found.">>/live.log
+ echo "Warning: device for bootoption isofrom= ($FROMISO) not found.">>/live-boot.log
else
- mkdir /isofrom
- mount "$ISO_DEVICE" /isofrom
- ISO_NAME="$(echo $FROMISO | sed "s|$ISO_DEVICE||")"
- loopdevname=$(setup_loop "/isofrom/${ISO_NAME}" "loop" "/sys/block/loop*" "" '')
- devname="${loopdevname}"
+ fs_type=$(get_fstype "${ISO_DEVICE}")
+ if is_supported_fs ${fs_type}
+ then
+ mkdir /isofrom
+ mount -t $fs_type "$ISO_DEVICE" /isofrom
+ ISO_NAME="$(echo $FROMISO | sed "s|$ISO_DEVICE||")"
+ loopdevname=$(setup_loop "/isofrom/${ISO_NAME}" "loop" "/sys/block/loop*" "" '')
+ devname="${loopdevname}"
+ else
+ echo "Warning: unable to mount $ISO_DEVICE." >>/live-boot.log
+ fi
fi
fi
umount $mountpoint
fi
fi
+
+ IFS=","
+ for device in ${devname}
+ do
+ case "$device" in
+ *mapper*)
+ # Adding lvm support
+ if [ -x /scripts/local-top/lvm2 ]
+ then
+ ROOT="$device" resume="" /scripts/local-top/lvm2
+ fi
+ ;;
+
+ /dev/md*)
+ # Adding raid support
+ if [ -x /scripts/local-top/mdadm ]
+ then
+ cp /conf/conf.d/md /conf/conf.d/md.orig
+ echo "MD_DEVS=$device " >> /conf/conf.d/md
+ /scripts/local-top/mdadm
+ mv /conf/conf.d/md.orig /conf/conf.d/md
+ fi
+ ;;
+ esac
+ done
+ unset IFS
+
+ [ -n "$device" ] && devname="$device"
+
[ -e "$devname" ] || continue
if [ -n "${LIVE_MEDIA_OFFSET}" ]
echo ${mountpoint}
return 0
else
- umount ${mountpoint}
+ umount ${mountpoint} 2>/dev/null
fi
fi
# first look at the one specified in the command line
case "${LIVE_MEDIA}" in
removable-usb)
- for sysblock in $(echo /sys/block/* | tr ' ' '\n' | grep -vE "/(loop|ram|dm-|fd)")
+ for sysblock in $(removable_usb_dev "sys")
do
- if [ "$(cat ${sysblock}/removable)" = "1" ]
- then
- if readlink ${sysblock} | grep -q usb ||
- readlink ${sysblock}/device | grep -q usb # linux < 2.6.29
+ for dev in $(subdevices "${sysblock}")
+ do
+ if check_dev "${dev}"
then
- for dev in $(subdevices "${sysblock}")
- do
- if check_dev "${dev}"
- then
- return 0
- fi
- done
+ return 0
fi
- fi
+ done
done
return 1
;;
removable)
- for sysblock in $(echo /sys/block/* | tr ' ' '\n' | grep -vE "/(loop|ram|dm-|fd)")
+ for sysblock in $(removable_dev "sys")
do
- if [ "$(cat ${sysblock}/removable)" = "1" ]
- then
- for dev in $(subdevices "${sysblock}")
- do
- if check_dev "${dev}"
- then
- return 0
- fi
- done
- fi
+ for dev in $(subdevices "${sysblock}")
+ do
+ if check_dev "${dev}"
+ then
+ return 0
+ fi
+ done
done
return 1
;;
# or do the scan of block devices
# prefer removable devices over non-removable devices, so scan them first
- for sysblock in $(echo /sys/block/* | tr ' ' '\n' | egrep -v "/(loop|ram|dm-|fd)")
- do
- if [ "$(cat ${sysblock}/removable)" = "1" ]
- then
- removable_devices_to_scan="$removable_devices_to_scan $sysblock"
- else
- nonremovable_devices_to_scan="$nonremovable_devices_to_scan $sysblock"
- fi
- done
- devices_to_scan="$removable_devices_to_scan $nonremovable_devices_to_scan"
+ devices_to_scan="$(removable_dev 'sys') $(non_removable_dev 'sys')"
for sysblock in $devices_to_scan
do
return 1
}
-set_usplash_timeout ()
-{
- if [ -x /sbin/usplash_write ]
- then
- /sbin/usplash_write "TIMEOUT 120"
- else if [ -x /sbin/splashy_update ] ; then
- /sbin/splashy_update "TIMEOUT 120"
- fi ; fi
-}
-
integrity_check ()
{
media_mountpoint="${1}"
fi
}
-start_usplash_pulse ()
-{
- if [ -x /sbin/usplash_write ]
- then
- /sbin/usplash_write "PULSELOGO"
- fi
-}
-
mountroot ()
{
- if [ -x /scripts/local-top/cryptroot ]; then
+ if [ -x /scripts/local-top/cryptroot ]; then
/scripts/local-top/cryptroot
fi
exec 6>&1
exec 7>&2
- exec > live.log
+ exec > live-boot.log
exec 2>&1
- tail -f live.log >&7 &
+ tail -f live-boot.log >&7 &
tailpid="${!}"
# Ensure 'panic' function is overridden
Arguments
- set_usplash_timeout
- start_usplash_pulse
-
maybe_break live-premount
log_begin_msg "Running /scripts/live-premount"
run_scripts /scripts/live-premount
# Needed here too because some things (*cough* udev *cough*)
# changes the timeout
- set_usplash_timeout
-
if [ ! -z "${NETBOOT}" ] || [ ! -z "${FETCH}" ] || [ ! -z "${HTTPFS}" ] || [ ! -z "${FTPFS}" ]
then
if do_netmount
# when booting FAI, this simple workaround solves it
ls /root/* >/dev/null 2>&1
+ # copy snapshot configuration if exists
+ if [ -f snapshot.conf ]
+ then
+ log_begin_msg "Copying snapshot.conf to ${rootmnt}/etc/live/boot.d"
+ if [ ! -d "${rootmnt}/etc/live/boot.d" ]
+ then
+ mkdir -p "${rootmnt}/etc/live/boot.d"
+ fi
+ cp snapshot.conf "${rootmnt}/etc/live/boot.d/"
+ log_end_msg
+ fi
+
+ if [ -f /etc/resolv.conf ] && [ ! -s ${rootmnt}/etc/resolv.conf ]
+ then
+ log_begin_msg "Copying /etc/resolv.conf to ${rootmnt}/etc/resolv.conf"
+ cp -v /etc/resolv.conf ${rootmnt}/etc/resolv.conf
+ log_end_msg
+ fi
+
maybe_break live-bottom
log_begin_msg "Running /scripts/live-bottom\n"
exec 1>&6 6>&-
exec 2>&7 7>&-
kill ${tailpid}
- [ -w "${rootmnt}/var/log/" ] && cp live.log "${rootmnt}/var/log/" 2>/dev/null
+ [ -w "${rootmnt}/var/log/" ] && cp live-boot.log "${rootmnt}/var/log/" 2>/dev/null
}