X-Git-Url: http://git.grml.org/?a=blobdiff_plain;f=scripts%2Flive;h=9c747d5c4ab64456480082ac240c470220d2ef0c;hb=70366e34b42762b4c3e4e25b431fd62b14916a09;hp=1dcbc7425edc3df47dffd56243d7cad71d378d81;hpb=d3b94484913d8edc3e04a95030ab9471ab445276;p=live-boot-grml.git diff --git a/scripts/live b/scripts/live index 1dcbc74..9c747d5 100755 --- a/scripts/live +++ b/scripts/live @@ -21,6 +21,17 @@ HOSTNAME="host" mkdir -p "${mountpoint}" +# Create /etc/mtab for debug purpose and future syncs +if [ ! -d /etc ] +then + mkdir /etc/ +fi + +if [ ! -f /etc/mtab ] +then + touch /etc/mtab +fi + [ -f /etc/live.conf ] && . /etc/live.conf export USERNAME USERFULLNAME HOSTNAME @@ -60,6 +71,21 @@ Arguments () export FETCH ;; + hook=*) + HOOK="${ARGUMENT#hook=}" + export HOOK + ;; + + ftpfs=*) + FTPFS="${ARGUMENT#ftpfs=}" + export FTPFS + ;; + + httpfs=*) + HTTPFS="${ARGUMENT#httpfs=}" + export HTTPFS + ;; + hostname=*) HOSTNAME="${ARGUMENT#hostname=}" LIVECONF="changed" @@ -149,6 +175,12 @@ Arguments () export LIVE_MEDIA_TIMEOUT ;; + language=*|debian-installer/language=*) + language=${x#debian-installer/language=} + locale="$(lang2locale "$language")" + set_locale="true" + ;; + locale=*|debian-installer/locale=*) LOCALE="${ARGUMENT#*=}" export LOCALE @@ -229,11 +261,6 @@ Arguments () export NOKPERSONALIZER ;; - nokwallet) - NOKWALLET="Yes" - export NOKWALLET - ;; - nolanguageselector) NOLANGUAGESELECTOR="Yes" export NOLANGUAGESELECTOR @@ -269,9 +296,9 @@ Arguments () export NOSUDO ;; - noswap) - NOSWAP="Yes" - export NOSWAP + swapon) + SWAPON="Yes" + export SWAPON ;; noupdatenotifier) @@ -299,6 +326,15 @@ Arguments () export PERSISTENT ;; + persistent=*) + PERSISTENT="${ARGUMENT#persistent=}" + if [ -z "${PERSISTENT}" ] + then + PERSISTENT="Yes" + fi + export PERSISTENT + ;; + nopersistent) NOPERSISTENT="Yes" export NOPERSISTENT @@ -317,14 +353,14 @@ Arguments () url=*) location="${ARGUMENT#url=}" - mount -n -o bind /sys /root/sys - mount -n -o bind /proc /root/proc - mount -n -o bind /dev /root/dev + mount -o bind /sys /root/sys + mount -o bind /proc /root/proc + mount -o bind /dev /root/dev mkdir -p /root/var/run/network - chroot /root ifup -a + chroot /root dhclient eth0 chroot /root wget -P /tmp "${location}" - chroot /root ifdown -a + chroot /root ifconfig eth0 down umount /root/sys umount /root/proc @@ -381,6 +417,16 @@ Arguments () export EXPOSED_ROOT ;; + plainroot) + PLAIN_ROOT="Yes" + export PLAIN_ROOT + ;; + + root=*) + ROOT="${ARGUMENT#root=}" + export ROOT + ;; + union=*) UNIONTYPE="${ARGUMENT#union=}" export UNIONTYPE @@ -396,6 +442,11 @@ Arguments () export XDEBCONF ;; + xdriver=*) + XDRIVER="${ARGUMENT#xdriver=}" + export XDRIVER + ;; + xvideomode=*) XVIDEOMODE="${ARGUMENT#xvideomode=}" export XVIDEOMODE @@ -425,7 +476,7 @@ Arguments () if [ -z "${UNIONTYPE}" ] then - UNIONTYPE="unionfs" + UNIONTYPE="aufs" export UNIONTYPE fi } @@ -436,7 +487,7 @@ is_live_path () if [ -d "${DIRECTORY}"/"${LIVE_MEDIA_PATH}" ] then - for FILESYSTEM in squashfs ext2 ext3 xfs dir + for FILESYSTEM in squashfs ext2 ext3 xfs dir jffs2 do if [ "$(echo ${DIRECTORY}/${LIVE_MEDIA_PATH}/*.${FILESYSTEM})" != "${DIRECTORY}/${LIVE_MEDIA_PATH}/*.${FILESYSTEM}" ] then @@ -458,7 +509,7 @@ matches_uuid () path="${1}" uuid="$(cat /conf/uuid.conf)" - for try_uuid_file in "${mountpoint}/.disk/casper-uuid"* + for try_uuid_file in "${mountpoint}/.disk/live-uuid"* do [ -e "${try_uuid_file}" ] || continue @@ -476,8 +527,8 @@ matches_uuid () get_backing_device () { case "${1}" in - *.squashfs|*.ext2|*.ext3) - echo $(setup_loop "${1}" "loop" "/sys/block/loop*" '0' "${LIVE_MEDIA_ENCRYPTION}") + *.squashfs|*.ext2|*.ext3|*.jffs2) + echo $(setup_loop "${1}" "loop" "/sys/block/loop*" '0' "${LIVE_MEDIA_ENCRYPTION}" "${2}") ;; *.dir) @@ -507,13 +558,17 @@ mount_images_in_directory () { directory="${1}" rootmnt="${2}" + mac="${3}" + 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}/*.ext3" || + match_files_in_dir "${directory}/${LIVE_MEDIA_PATH}/*.jffs2" || match_files_in_dir "${directory}/${LIVE_MEDIA_PATH}/*.dir" then - setup_unionfs "${directory}/${LIVE_MEDIA_PATH}" "${rootmnt}" + [ -n "${mac}" ] && adddirectory="${directory}/${LIVE_MEDIA_PATH}/${mac}" + setup_unionfs "${directory}/${LIVE_MEDIA_PATH}" "${rootmnt}" "${adddirectory}" else : fi @@ -526,25 +581,14 @@ is_nice_device () if /lib/udev/path_id "${sysfs_path}" | grep -E -q "ID_PATH=(usb|pci-[^-]*-[ide|scsi|usb])" then return 0 + elif echo "${sysfs_path}" | grep -q '^/block/vd[a-z]$' + then + return 0 fi return 1 } -is_supported_fs () -{ - # FIXME: do something better like the scan of supported filesystems - fstype="${1}" - - case ${fstype} in - vfat|iso9660|udf|ext2|ext3|ntfs) - return 0 - ;; - esac - - return 1 -} - copy_live_to () { copyfrom="${1}" @@ -569,7 +613,7 @@ copy_live_to () if [ "${copytodev}" = "ram" ] then # copying to ram: - freespace=$( expr $(awk '/MemFree/{print $2}' /proc/meminfo) + $( cat /proc/meminfo | grep Cached | head -n 1 | awk '/Cached/{print $2}' - ) ) + freespace=$( expr $(awk '/MemFree/{print $2}' /proc/meminfo) + $( awk '/\/dev/null) + cd "${snap_mount}" + zcat "${snapback}/${snapfile}" | /bin/cpio --extract --preserve-modification-time --no-absolute-filenames --sparse --unconditional --make-directories > /dev/null 2>&1 + RES=$? + if [ "${RES}" != "0" ] then - log_warning_msg "Impossible to include the ${snapfile} Snapshot" - return 1 + log_warning_msg "failure to \"zcat ${snapback}/${snapfile} | /bin/cpio --extract --preserve-modification-time --no-absolute-filenames --sparse --unconditional --make-directories\"" fi + cd "${OLDPWD}" fi - umount "${snapback}" - else - dev=$(find_cow_device "${snap_label}") + umount "${snapback}" || log_warning_msg "failure to \"umount ${snapback}\"" - if [ -b ${dev} ] + if [ "${RES}" != "0" ] 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 + log_warning_msg "Impossible to include the ${snapfile} Snapshot file" + 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 + + elif [ -b "${snapdata}" ] + then + # Try to find if it could be a snapshot partition + dev="${snapdata}" + log_success_msg "found snapshot device on ${dev}" + if echo "${dev}" | grep -qs loop + then + # strange things happens, user confused? + snaploop=$( losetup ${dev} | awk '{print $3}' | tr -d '()' ) + snapfile=$(basename ${snaploop}) + snapdev=$(awk -v pat="$( dirname ${snaploop})" '$2 == pat { print $1 }' /proc/mounts) else - log_warning_msg "Impossible to include the ${snap_label} Snapshot" + snapdev="${dev}" + fi + + if ! do_snap_copy "${dev}" "${snap_mount}" "${snap_type}" + then + log_warning_msg "Impossible to include the ${snap_type} 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_type} Snapshot" + return 1 fi echo "export ${snap_type}SNAP="${snap_mount}":${snapdev}:${snapfile}" >> /etc/live.conf # for resync on reboot/halt @@ -869,7 +992,7 @@ setup_unionfs () { image_directory="${1}" rootmnt="${2}" - + addimage_directory="${3}" modprobe -q -b ${UNIONTYPE} # run-init can't deal with images in a subdir, but we're going to @@ -888,6 +1011,9 @@ setup_unionfs () then # go aroung a bug in nfs-unionfs locking for unionfs <= 1.4 roopt="nfsro" + elif [ "${UNIONTYPE}" = "aufs" ] + then + roopt="rr" else roopt="ro" fi @@ -907,7 +1033,7 @@ setup_unionfs () done else # ${MODULE}.module does not exist, create a list of images - for FILESYSTEM in squashfs ext2 ext3 xfs dir + for FILESYSTEM in squashfs ext2 ext3 xfs jffs2 dir do for IMAGE in "${image_directory}"/*."${FILESYSTEM}" do @@ -918,6 +1044,20 @@ setup_unionfs () done done + if [ -n "${addimage_directory}" ] && [ -d "${addimage_directory}" ] + then + for FILESYSTEM in squashfs ext2 ext3 xfs jffs2 dir + do + for IMAGE in "${addimage_directory}"/*."${FILESYSTEM}" + do + if [ -e "${IMAGE}" ] + then + image_string="${image_string} ${IMAGE}" + fi + done + done + fi + # Now sort the list image_string="$(echo ${image_string} | sed -e 's/ /\n/g' | sort )" fi @@ -937,7 +1077,12 @@ setup_unionfs () rofslist="${image} ${rofslist}" elif [ -f "${image}" ] then - backdev=$(get_backing_device "${image}") + if losetup --help 2>&1 | grep -q -- "-r\b" + then + backdev=$(get_backing_device "${image}" "-r") + else + backdev=$(get_backing_device "${image}") + fi fstype=$(get_fstype "${backdev}") if [ "${fstype}" = "unknown" ] @@ -945,9 +1090,16 @@ setup_unionfs () panic "Unknown file system type on ${backdev} (${image})" fi + if [ -z "${fstype}" ] + then + fstype="${imagename##*.}" + log_warning_msg "Unknown file system type on ${backdev} (${image}), assuming ${fstype}." + fi + mkdir -p "${croot}/${imagename}" - echo "debug: Can not mount backdev ${backdev} (image = ${image}) on croot/imagename ${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}" + log_end_msg fi done @@ -956,18 +1108,77 @@ setup_unionfs () mkdir -p /cow # Looking for "${root_persistence}" device or file - if [ -n "${PERSISTENT}" ] + if [ -n "${PERSISTENT}" ] && [ -z "${NOPERSISTENT}" ] then + # Load USB modules + num_block=$(ls -l /sys/block | wc -l) + for module in sd_mod uhci-hcd ehci-hcd ohci-hcd usb-storage + do + modprobe -q -b ${module} + done + + if [ -x /sbin/udevadm ] + then + # lenny + udevadm trigger + udevadm settle + else + # etch + udevtrigger + udevsettle + fi + + # For some reason, udevsettle does not block in this scenario, + # so we sleep for a little while. + # + # See https://bugs.launchpad.net/ubuntu/+source/casper/+bug/84591 + for timeout in 5 4 3 2 1 + do + sleep 1 + + if [ $(ls -l /sys/block | wc -l) -gt ${num_block} ] + then + break + fi + done + + # search for label and files (this could be hugely optimized) cowprobe=$(find_cow_device "${root_persistence}") + if [ -b "${cowprobe}" ] + 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 + fi + # homecow just mount something on /home, this should be generalized some way + homecow=$(find_cow_device "${home_persistence}" "${blacklistdev}") + if [ -b "${homecow}" ] + then + PERSISTENCE_IS_ON="1" + export PERSISTENCE_IS_ON + 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|jffs2 snapshot types. + home_snapdata=$(find_snap "${home_snapshot_label}" "${blacklistdev}") 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" + 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}" ] + elif [ -n "${NFS_COW}" ] && [ -z "${NOPERSISTENT}" ] then # check if there are any nfs options if echo ${NFS_COW}|grep -q ',' @@ -978,7 +1189,7 @@ setup_unionfs () nfs_cow_opts="-o nolock" nfs_cow=${NFS_COW} fi - mac=$(get_mac) + mac="$(get_mac)" if [ -n "${mac}" ] then cowdevice=$(echo ${nfs_cow}|sed "s/client_mac_address/${mac}/") @@ -989,17 +1200,18 @@ setup_unionfs () else cowdevice="tmpfs" cow_fstype="tmpfs" + cow_mountopt="rw,noatime,mode=755" fi if [ "${cow_fstype}" = "nfs" ] then - [ "${quiet}" != "y" ] && log_begin_msg \ + log_begin_msg \ "Trying nfsmount ${nfs_cow_opts} ${cowdevice} /cow" nfsmount ${nfs_cow_opts} ${cowdevice} /cow || \ - panic "Can not mount ${cowdevice} on /cow" + panic "Can not mount ${cowdevice} (n: ${cow_fstype}) on /cow" else - mount ${cowdevice} -t ${cow_fstype} -o rw,noatime /cow || \ - panic "Can not mount ${cowdevice} on /cow" + mount -t ${cow_fstype} -o ${cow_mountopt} ${cowdevice} /cow || \ + panic "Can not mount ${cowdevice} (o: ${cow_fstype}) on /cow" fi rofscount=$(echo ${rofslist} |wc -w) @@ -1033,27 +1245,28 @@ setup_unionfs () fi # tmpfs file systems + touch /etc/fstab mkdir -p "${rootmnt}/live" mount -t tmpfs tmpfs ${rootmnt}/live # Adding other custom mounts - if [ -n "${PERSISTENT}" ] + if [ -n "${PERSISTENT}" ] && [ -z "${NOPERSISTENT}" ] 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" export HOMEMOUNTED=1 # used to proper calculate free space in do_snap_copy() else - [ "${quiet}" != "y" ] && log_warning_msg "Unable to find the persistent home medium" + 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" + 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}" ] @@ -1068,7 +1281,7 @@ setup_unionfs () ;; *) - mount --move "${d}" "${rootmnt}/live/${d##*/}" + mount -o move "${d}" "${rootmnt}/live/${d##*/}" ;; esac done @@ -1076,7 +1289,7 @@ setup_unionfs () # shows cow fs on /cow for use by live-snapshot mkdir -p "${rootmnt}/live/cow" - mount -o move /cow "${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" } check_dev () @@ -1090,6 +1303,19 @@ check_dev () devname=$(sys2dev "${sysdev}") fi + if [ -d "${devname}" ] + then + mount -o bind "${devname}" $mountpoint || continue + + if is_live_path $mountpoint + then + echo $mountpoint + return 0 + else + umount $mountpoint + fi + fi + if [ -n "${LIVE_MEDIA_OFFSET}" ] then loopdevname=$(setup_loop "${devname}" "loop" "/sys/block/loop*" "${LIVE_MEDIA_OFFSET}" '') @@ -1143,7 +1369,7 @@ find_livefs () fi # or do the scan of block devices - for sysblock in $(echo /sys/block/* | tr ' ' '\n' | grep -v loop | grep -v ram) + for sysblock in $(echo /sys/block/* | tr ' ' '\n' | grep -v loop | grep -v ram | grep -v 'dm-' | grep -v fd ) do devname=$(sys2dev "${sysblock}") fstype=$(get_fstype "${devname}") @@ -1165,7 +1391,8 @@ find_livefs () done elif [ "${fstype}" = "squashfs" -o \ "${fstype}" = "ext2" -o \ - "${fstype}" = "ext3" ] + "${fstype}" = "ext3" -o \ + "${fstype}" = "jffs2" ] then # This is an ugly hack situation, the block device has # an image directly on it. It's hopefully @@ -1179,43 +1406,47 @@ find_livefs () return 1 } -pulsate () -{ - if [ -x /sbin/usplash_write ] - then - /sbin/usplash_write "PULSATE" - fi -} - set_usplash_timeout () { if [ -x /sbin/usplash_write ] then /sbin/usplash_write "TIMEOUT 120" - fi + else if [ -x /sbin/splashy_update ] ; then + /sbin/splashy_update "TIMEOUT 120" + fi ; fi } mountroot () { + if [ -x /scripts/local-top/cryptroot ]; then + /scripts/local-top/cryptroot + fi + exec 6>&1 exec 7>&2 exec > live.log exec 2>&1 + tail -f live.log >&7 & + tailpid="${!}" + + # Ensure 'panic' function is overridden + . /scripts/live-functions Arguments set_usplash_timeout - [ "${quiet}" != "y" ] && log_begin_msg "Running /scripts/live-premount" - pulsate + + maybe_break live-premount + log_begin_msg "Running /scripts/live-premount" run_scripts /scripts/live-premount - [ "${quiet}" != "y" ] && log_end_msg + log_end_msg # Needed here too because some things (*cough* udev *cough*) # changes the timeout set_usplash_timeout - if [ ! -z "${NETBOOT}" ] || [ ! -z "${FETCH}" ] + if [ ! -z "${NETBOOT}" ] || [ ! -z "${FETCH}" ] || [ ! -z "${HTTPFS}" ] || [ ! -z "${FTPFS}" ] then if do_netmount then @@ -1224,18 +1455,24 @@ mountroot () panic "Unable to find a live file system on the network" fi else - # Scan local devices for the image - for i in 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 - do - livefs_root=$(find_livefs ${i}) + if [ -n "${PLAIN_ROOT}" ] && [ -n "${ROOT}" ] + then + # Do a local boot from hd + livefs_root=${ROOT} + else + # Scan local devices for the image + for i in 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + do + livefs_root=$(find_livefs ${i}) - if [ -n "${livefs_root}" ] - then - break - fi + if [ -n "${livefs_root}" ] + then + break + fi - sleep 1 - done + sleep 1 + done + fi fi if [ -z "${livefs_root}" ] @@ -1262,19 +1499,21 @@ mountroot () then setup_unionfs "${livefs_root}" "${rootmnt}" else - mount_images_in_directory "${livefs_root}" "${rootmnt}" + mac="$(get_mac)" + mac="$(echo ${mac} | sed 's/-//g')" + mount_images_in_directory "${livefs_root}" "${rootmnt}" "${mac}" fi log_end_msg maybe_break live-bottom - [ "${quiet}" != "y" ] && log_begin_msg "Running /scripts/live-bottom" + log_begin_msg "Running /scripts/live-bottom" - pulsate run_scripts /scripts/live-bottom - [ "${quiet}" != "y" ] && log_end_msg + log_end_msg exec 1>&6 6>&- exec 2>&7 7>&- + kill ${tailpid} cp live.log "${rootmnt}/var/log/" }