Adding live-initramfs 1.95.3-1.
[live-boot-grml.git] / scripts / live
1 #!/bin/sh
2
3 # set -e
4
5 export PATH="/root/usr/bin:/root/usr/sbin:/root/bin:/root/sbin:/usr/bin:/usr/sbin:/bin:/sbin"
6
7 echo "/root/lib" >> /etc/ld.so.conf
8 echo "/root/usr/lib" >> /etc/ld.so.conf
9
10 mountpoint="/live/image"
11 LIVE_MEDIA_PATH="live"
12
13 root_persistence="live-rw"
14 home_persistence="home-rw"
15 root_snapshot_label="live-sn"
16 home_snapshot_label="home-sn"
17
18 USERNAME="user"
19 USERFULLNAME="Live user"
20 HOSTNAME="host"
21 BUILD_SYSTEM="Custom"
22
23 mkdir -p "${mountpoint}"
24
25 [ -f /etc/live.conf ] && . /etc/live.conf
26 export USERNAME USERFULLNAME HOSTNAME BUILD_SYSTEM
27
28 . /scripts/live-helpers
29
30 if [ ! -f /live.vars ]; then
31     touch /live.vars
32 fi
33
34 Arguments ()
35 {
36         PRESEEDS=""
37
38         for ARGUMENT in `cat /proc/cmdline`
39         do
40                 case "${ARGUMENT}" in
41                         access=*)
42                                 ACCESS="${ARGUMENT#access=}"
43                                 export ACCESS
44                                 ;;
45
46                         console=*)
47                                 DEFCONSOLE="${ARGUMENT#*=}"
48                                 export DEFCONFSOLE
49                                 ;;
50
51                         debug)
52                                 DEBUG="Yes"
53                                 export DEBUG
54
55                                 set -x
56                                 ;;
57
58                         fetch=*)
59                                 FETCH="${ARGUMENT#fetch=}"
60                                 export FETCH
61                                 ;;
62
63                         hostname=*)
64                                 HOSTNAME="${ARGUMENT#hostname=}"
65                                 LIVECONF="changed"
66                                 export HOSTNAME LIVECONF
67                                 ;;
68
69                         username=*)
70                                 USERNAME="${ARGUMENT#username=}"
71                                 LIVECONF="changed"
72                                 export USERNAME LIVECONF
73                                 ;;
74
75                         userfullname=*)
76                                 USERFULLNAME="${ARGUMENT#userfullname=}"
77                                 LIVECONF="changed"
78                                 export USERFULLNAME LIVECONF
79                                 ;;
80
81                         ip=*)
82                                 STATICIP="${ARGUMENT#ip=}"
83
84                                 if [ -z "${STATICIP}" ]
85                                 then
86                                         STATICIP="frommedia"
87                                 fi
88
89                                 export STATICIP
90                                 ;;
91
92                         keyb=*|kbd-chooser/method=*)
93                                 KBD="${ARGUMENT#*=}"
94                                 export KBD
95                                 ;;
96
97                         klayout=*|console-setup/layoutcode=*)
98                                 KLAYOUT="${ARGUMENT#*=}"
99                                 export KLAYOUT
100                                 ;;
101
102                         kvariant=*|console-setup/variantcode=*)
103                                 KVARIANT="${ARGUMENT#*=}"
104                                 export KVARIANT
105                                 ;;
106
107                         kmodel=*|console-setup/modelcode=*)
108                                 KMODEL="${ARGUMENT#*=}"
109                                 export KMODEL
110                                 ;;
111
112                         koptions=*)
113                                 KOPTIONS="${ARGUMENT#koptions=}"
114                                 export KOPTIONS
115                                 ;;
116
117                         live-getty)
118                                 LIVE_GETTY="1"
119                                 export LIVE_GETTY
120                                 ;;
121
122                         live-media=*|bootfrom=*)
123                                 LIVE_MEDIA="${ARGUMENT#*=}"
124                                 export LIVE_MEDIA
125                                 ;;
126
127                         live-media-encryption=*|encryption=*)
128                                 LIVE_MEDIA_ENCRYPTION="${ARGUMENT#*=}"
129                                 export LIVE_MEDIA_ENCRYPTION
130                                 ;;
131
132                         live-media-offset=*)
133                                 LIVE_MEDIA_OFFSET="${ARGUMENT#live-media-offset=}"
134                                 export LIVE_MEDIA_OFFSET
135                                 ;;
136
137                         live-media-path=*)
138                                 LIVE_MEDIA_PATH="${ARGUMENT#live-media-path=}"
139                                 export LIVE_MEDIA_PATH
140                                 ;;
141
142                         live-media-timeout=*)
143                                 LIVE_MEDIA_TIMEOUT="${ARGUMENT#live-media-timeout=}"
144                                 export LIVE_MEDIA_TIMEOUT
145                                 ;;
146
147                         locale=*|debian-installer/locale=*)
148                                 LOCALE="${ARGUMENT#*=}"
149                                 export LOCALE
150                                 ;;
151
152                         module=*)
153                                 MODULE="${ARGUMENT#module=}"
154                                 export MODULE
155                                 ;;
156
157                         netboot=*)
158                                 NETBOOT="${ARGUMENT#netboot=}"
159                                 export NETBOOT
160                                 ;;
161
162                         nfsopts=*)
163                                 NFSOPTS="${ARGUMENT#nfsopts=}"
164                                 export NFSOPTS
165                                 ;;
166
167                         noautologin)
168                                 NOAUTOLOGIN="Yes"
169                                 export NOAUTOLOGIN
170                                 ;;
171
172                         noxautologin)
173                                 NOXAUTOLOGIN="Yes"
174                                 export NOXAUTOLOGIN
175                                 ;;
176
177                         nofastboot)
178                                 NOFASTBOOT="Yes"
179                                 export NOFASTBOOT
180                                 ;;
181
182                         nopersistent)
183                                 PERSISTENT=""
184                                 export PERSISTENT
185                                 ;;
186
187                         nosudo)
188                                 NOSUDO="Yes"
189                                 export NOSUDO
190                                 ;;
191
192                         noswap)
193                                 NOSWAP="Yes"
194                                 export NOSWAP
195                                 ;;
196
197                         persistent)
198                                 PERSISTENT="Yes"
199                                 export PERSISTENT
200                                 ;;
201
202                         preseed/file=*|file=*)
203                                 LOCATION="${ARGUMENT#*=}"
204                                 export LOCATION
205                                 ;;
206
207                         url=*)
208                                 location="${ARGUMENT#url=}"
209
210                                 mount -n -o bind /sys /root/sys
211                                 mount -n -o bind /proc /root/proc
212                                 mount -n -o bind /dev /root/dev
213
214                                 mkdir -p /root/var/run/network
215                                 chroot /root ifup -a
216                                 chroot /root wget -P /tmp "$location"
217                                 chroot /root ifdown -a
218
219                                 umount /root/sys
220                                 umount /root/proc
221                                 umount /root/dev
222
223                                 LOCATION="/tmp/$(basename "$location")"
224                                 ;;
225
226                         */*=*)
227                                 question="${ARGUMENT%%=*}"
228                                 value="${ARGUMENT#*=}"
229                                 PRESEEDS="${PRESEEDS}\"${question}=${value}\" "
230                                 export PRESEEDS
231                                 ;;
232
233                         showmounts)
234                                 SHOWMOUNTS="Yes"
235                                 export SHOWMOUNTS
236                                 ;;
237
238                         timezone=*)
239                                 TIMEZONE="${ARGUMENT#timezone=}"
240                                 export TIMEZONE
241                                 ;;
242
243                         todisk=*)
244                                 TODISK="${ARGUMENT#todisk=}"
245                                 export TODISK
246                                 ;;
247
248                         toram)
249                                 TORAM="Yes"
250                                 export TORAM
251                                 ;;
252
253                         union=*)
254                                 UNIONTYPE="${ARGUMENT#union=}"
255                                 export UNIONTYPE
256                                 ;;
257
258                         utc=*)
259                                 UTC="${ARGUMENT#utc=}"
260                                 export UTC
261                                 ;;
262
263                         xdebconf)
264                                 XDEBCONF="Yes"
265                                 export XDEBCONF
266                                 ;;
267
268                         xvideomode=*)
269                                 XVIDEOMODE="${ARGUMENT#xvideomode=}"
270                                 export XVIDEOMODE
271                                 ;;
272                 esac
273         done
274
275         # sort of compatibility with netboot.h from linux docs
276         if [ -z "${NETBOOT}" ]
277         then
278                 if [ "${ROOT}" = "/dev/nfs" ]
279                 then
280                         NETBOOT="nfs"
281                         export NETBOOT
282                 elif [ "${ROOT}" = "/dev/cifs" ]
283                 then
284                         NETBOOT="cifs"
285                         export NETBOOT
286                 fi
287         fi
288
289         if [ -z "${MODULE}" ]
290         then
291                 MODULE="filesystem"
292                 export MODULE
293         fi
294
295         if [ -z "${UNIONTYPE}" ]
296         then
297                 UNIONTYPE="unionfs"
298                 export UNIONTYPE
299         fi
300 }
301
302 is_live_path()
303 {
304         DIRECTORY="${1}"
305
306         if [ -d "${DIRECTORY}"/"${LIVE_MEDIA_PATH}" ]
307         then
308                 for FILESYSTEM in squashfs ext2 ext3 xfs dir
309                 do
310                         if [ "`echo ${DIRECTORY}/${LIVE_MEDIA_PATH}/*.${FILESYSTEM}`" != "${DIRECTORY}/${LIVE_MEDIA_PATH}/*.${FILESYSTEM}" ]
311                         then
312                                 return 0
313                         fi
314                 done
315         fi
316
317         return 1
318 }
319
320 get_backing_device() {
321     case "$1" in
322         *.squashfs|*.ext2|*.ext3)
323             echo $(setup_loop "$1" "loop" "/sys/block/loop*" '0' "${LIVE_MEDIA_ENCRYPTION}")
324             ;;
325         *.dir)
326             echo "directory"
327             ;;
328         *)
329             panic "Unrecognized live filesystem: $1"
330             ;;
331     esac
332 }
333
334 match_files_in_dir() {
335     # Does any files match pattern $1 ?
336
337     local pattern="$1"
338     if [ "$(echo $pattern)" != "$pattern" ]; then
339         return 0
340     fi
341     return 1
342 }
343
344 mount_images_in_directory() {
345     directory="$1"
346     rootmnt="$2"
347
348     if match_files_in_dir "$directory/${LIVE_MEDIA_PATH}/*.squashfs" ||
349         match_files_in_dir "$directory/${LIVE_MEDIA_PATH}/*.ext2" ||
350         match_files_in_dir "$directory/${LIVE_MEDIA_PATH}/*.ext3" ||
351         match_files_in_dir "$directory/${LIVE_MEDIA_PATH}/*.dir"; then
352         setup_unionfs "$directory/${LIVE_MEDIA_PATH}" "$rootmnt"
353     else
354         :
355     fi
356 }
357
358 is_nice_device() {
359     sysfs_path="${1#/sys}"
360     if /lib/udev/path_id "${sysfs_path}" | grep -E -q "ID_PATH=(usb|pci-[^-]*-[ide|scsi|usb])"; then
361         return 0
362     fi
363     return 1
364 }
365
366 is_supported_fs () {
367     # FIXME: do something better like the scan of supported filesystems
368     fstype="${1}"
369     case ${fstype} in
370         vfat|iso9660|udf|ext2|ext3|ntfs)
371             return 0
372             ;;
373     esac
374     return 1
375 }
376
377 copy_live_to() {
378     copyfrom="${1}"
379     copytodev="${2}"
380     copyto="${copyfrom}_swap"
381
382     size=$(fs_size "" ${copyfrom} "used")
383
384     if [ "${copytodev}" = "ram" ]; then
385         # copying to ram:
386         freespace=$( expr $(awk '/MemFree/{print $2}' /proc/meminfo) + $( cat /proc/meminfo | grep Cached | head -n 1 | awk '/Cached/{print $2}' - ) )
387         mount_options="-o size=${size}k"
388         free_string="memory"
389         fstype="tmpfs"
390         dev="/dev/shm"
391     else
392         # it should be a writable block device
393         if [ -b "${copytodev}" ]; then
394             dev="${copytodev}"
395             free_string="space"
396             fstype=$(get_fstype "${dev}")
397             freespace=$(fs_size "${dev}")
398         else
399             [ "$quiet" != "y" ] && log_warning_msg "${copytodev} is not a block device."
400             return 1
401         fi
402     fi
403     if [ "${freespace}" -lt "${size}" ] ; then
404         [ "$quiet" != "y" ] && log_warning_msg "Not enough free ${free_string} (${freespace}k > ${size}k) to copy live media in ${copytodev}."
405         return 1
406     fi
407
408     # begin copying (or uncompressing)
409     mkdir "${copyto}"
410     echo "mount -t ${fstype} ${mount_options} ${dev} ${copyto}"
411     mount -t "${fstype}" ${mount_options} "${dev}" "${copyto}"
412
413     if [ "$extension" == "tgz" ]; then
414         cd "${copyto}"
415         tar zxf "${copyfrom}/${LIVE_MEDIA_PATH}/$(basename ${FETCH})"
416         rm -f "${copyfrom}/${LIVE_MEDIA_PATH}/$(basename ${FETCH})"
417         mount -r --move "${copyto}" "${rootmnt}"
418         cd "${OLDPWD}"
419     else
420         cp -a ${copyfrom}/* ${copyto} # "cp -a" from busybox also copies hidden files
421         umount ${copyfrom}
422         mount -r --move ${copyto} ${copyfrom}
423     fi
424     rmdir ${copyto}
425     return 0
426 }
427
428 do_netmount() {
429     rc=1
430
431     modprobe "${MP_QUIET}" af_packet # For DHCP
432
433     udevtrigger
434     udevsettle
435
436     ipconfig ${DEVICE} /tmp/net-${DEVICE}.conf | tee /netboot.config
437
438     if [ "${NFSROOT}" = "auto" ]; then
439         NFSROOT=${ROOTSERVER}:${ROOTPATH}
440     fi
441
442     # source relevant ipconfig output
443     . /tmp/net-${DEVICE}.conf
444     export HOSTNAME
445
446     if [ -n "${FETCH}" ] && do_httpmount; then
447         rc=0
448         return ${rc}
449     fi
450
451     if [ "${NFSROOT#*:}" = "$NFSROOT" ] && [ "$NETBOOT" != "cifs" ]; then
452         NFSROOT=${ROOTSERVER}:${NFSROOT}
453     fi
454
455     [ "$quiet" != "y" ] && log_begin_msg "Trying netboot from ${NFSROOT}"
456
457     if [ "${NETBOOT}" != "nfs" ] && do_cifsmount ; then
458         rc=0
459     elif do_nfsmount ; then
460         NETBOOT="nfs"
461         export NETBOOT
462         rc=0
463     fi
464
465     [ "$quiet" != "y" ] && log_end_msg
466     return ${rc}
467 }
468
469 do_httpmount() {
470     rc=1
471     extension=`echo "${FETCH}" | sed 's/\(.*\)\.\(.*\)/\2/'`
472     case "${extension}" in
473         squashfs|tgz|tar)
474             [ "$quiet" != "y" ] && log_begin_msg "Trying wget ${FETCH} -O ${mountpoint}/$(basename ${FETCH})"
475             mkdir -p "${mountpoint}/${LIVE_MEDIA_PATH}"
476             wget "${FETCH}" -O "${mountpoint}/${LIVE_MEDIA_PATH}/$(basename ${FETCH})"
477             [ $? -eq 0 ] && rc=0
478             [ "${extension}" == "tgz" ] && live_dest="ram"
479             ;;
480         *)
481             [ "$quiet" != "y" ] && log_begin_msg "Unrecognized archive extension for ${FETCH}"
482     esac
483     return ${rc}
484 }
485
486 do_nfsmount() {
487     rc=1
488     modprobe "${MP_QUIET}" nfs
489     if [ -z "${NFSOPTS}" ]; then
490         NFSOPTS=""
491     fi
492
493     [ "$quiet" != "y" ] && log_begin_msg "Trying nfsmount -o nolock -o ro ${NFSOPTS} ${NFSROOT} ${mountpoint}"
494     # FIXME: This for loop is an ugly HACK round an nfs bug
495     for i in 0 1 2 3 4 5 6 7 8 9 a b c d e f 10 11 12 13; do
496         nfsmount -o nolock -o ro ${NFSOPTS} "${NFSROOT}" "${mountpoint}" && rc=0 && break
497         sleep 1
498     done
499     return ${rc}
500 }
501
502 do_cifsmount() {
503     rc=1
504     if [ -x "/sbin/mount.cifs" ]; then
505         if [ -z "${NFSOPTS}" ]; then
506             CIFSOPTS="-ouser=root,password="
507         else
508             CIFSOPTS="${NFSOPTS}"
509         fi
510
511         [ "$quiet" != "y" ] && log_begin_msg "Trying mount.cifs ${NFSROOT} ${mountpoint} ${CIFSOPTS}"
512         modprobe "${MP_QUIET}" cifs
513
514         if mount.cifs "${NFSROOT}" "${mountpoint}" "${CIFSOPTS}" ; then
515             rc=0
516         fi
517     fi
518     return ${rc}
519 }
520
521 do_snap_copy ()
522 {
523     fromdev="${1}"
524     todir="${2}"
525     snap_type="${3}"
526
527     size=$(fs_size "${fromdev}" "" "used")
528
529     if [ -b "${fromdev}" ]; then
530         # look for free mem
531         if [ -n "${HOMEMOUNTED}" -a "${snap_type}" = "HOME" ]; then
532             todev=$(cat /proc/mounts | grep -s " $(base_path ${todir}) " | awk '{print $1}' )
533             freespace=$(df -k  | grep -s ${todev} | awk '{print $4}')
534         else
535             freespace=$( expr $(awk '/MemFree/{print $2}' /proc/meminfo) + $( cat /proc/meminfo | grep Cached | head -n 1 | awk '/Cached/{print $2}' - ))
536         fi
537
538         tomount="/mnt/tmpsnap"
539         if [ ! -d "${tomount}" ] ; then
540             mkdir -p "${tomount}"
541         fi
542
543         fstype=$(get_fstype "${fromdev}")
544         if [ -n "${fstype}" ]; then
545             # Copying stuff...
546             mount -t "${fstype}" -o ro "${fromdev}" "${tomount}"
547             cp -a "${tomount}"/* ${todir}
548             umount "${tomount}"
549         else
550             log_warning_msg "Unrecognized fstype: ${fstype} on ${fromdev}:${snap_type}"
551         fi
552
553         rmdir "${tomount}"
554         if echo ${fromdev} | grep -qs loop; then
555            losetup -d "${fromdev}"
556         fi
557         return 0
558     else
559         return 1
560         [ "$quiet" != "y" ] && log_warning_msg "Unable to find the snapshot ${snap_type} medium"
561     fi
562 }
563
564 try_snap ()
565 {
566     # Look for $snap_label.* in block devices and copy the contents to $snap_mount
567     #   and remember the device and filename for resync on exit in live-initramfs.init
568
569     snap_label="${1}"
570     snap_mount="${2}"
571     snap_type="${3}"
572
573     snapdata=$(find_files "${snap_label}.squashfs ${snap_label}.cpio.gz ${snap_label}.ext2 ${snap_label}.ext3")
574     if [ ! -z "${snapdata}" ]; then
575         snapdev="$(echo ${snapdata} | cut -f1 -d ' ')"
576         snapback="$(echo ${snapdata} | cut -f2 -d ' ')"
577         snapfile="$(echo ${snapdata} | cut -f3 -d ' ')"
578         if echo "${snapfile}" | grep -qs '\(squashfs\|ext2\|ext3\)'; then
579             # squashfs or ext2/ext3 snapshot
580             dev=$(get_backing_device "${snapback}/${snapfile}")
581             if ! do_snap_copy "${dev}" "${snap_mount}" "${snap_type}"; then
582                  log_warning_msg "Impossible to include the ${snapfile} Snapshot"
583                  return 1
584             fi
585         else
586             # cpio.gz snapshot
587             if ! (cd "${snap_mount}" && zcat "${snapback}/${snapfile}" | cpio -i -u -d 2>/dev/null) ; then
588                 log_warning_msg "Impossible to include the ${snapfile} Snapshot"
589                 return 1
590             fi
591         fi
592         umount "${snapback}"
593     else
594         dev=$(find_cow_device "${snap_label}")
595         if [ -b ${dev} ]; then
596             if echo "${dev}" | grep -qs loop; then
597                 # strange things happens, user confused?
598                 snaploop=$( losetup ${dev} | awk '{print $3}' | tr -d '()' )
599                 snapfile=$(basename ${snaploop})
600                 snapdev=$(cat /proc/mounts | awk '{print $2,$1}' | grep -es "^$( dirname ${snaploop} )" | cut -f2 -d ' ')
601             else
602                 snapdev="${dev}"
603             fi
604             if ! do_snap_copy "${dev}" "${snap_mount}" "${snap_type}" ; then
605                 log_warning_msg "Impossible to include the ${snap_label} Snapshot"
606                 return 1
607             else
608                 if [ -n "${snapfile}" ]; then
609                      # it was a loop device, user confused
610                      umount ${snapdev}
611                 fi
612             fi
613         else
614             log_warning_msg "Impossible to include the ${snap_label} Snapshot"
615             return 1
616         fi
617     fi
618     echo "export ${snap_type}SNAP="${snap_mount}":${snapdev}:${snapfile}" >> /etc/live.conf # for resync on reboot/halt
619     return 0
620 }
621
622 setup_unionfs() {
623     image_directory="$1"
624     rootmnt="$2"
625
626     modprobe "${MP_QUIET}" -b ${UNIONTYPE}
627
628     # run-init can't deal with images in a subdir, but we're going to
629     # move all of these away before it runs anyway.  No, we're not,
630     # put them in / since move-mounting them into / breaks mono and
631     # some other apps.
632
633     croot="/"
634
635     # Let's just mount the read-only file systems first
636     rofsstring=""
637     rofslist=""
638     minor_kernel_version=`uname -r|cut -c 5-|sed 's/[^0-9].*//'`
639     if [ "${NETBOOT}" = "nfs" ] && [ "${minor_kernel_version}" -lt 22 ]; then
640         # go aroung a bug in nfs-unionfs locking for unionfs <= 1.4
641         roopt="nfsro"
642     else
643         roopt="ro"
644     fi
645
646         # Read image names from ${MODULE}.module if it exists
647         if [ -e "${image_directory}/filesystem.${MODULE}.module" ]
648         then
649                 for IMAGE in `cat ${image_directory}/filesystem.${MODULE}.module`
650                 do
651                         image_string="${image_string} ${image_directory}/${image}"
652                 done
653         elif [ -e "${image_directory}/${MODULE}.module" ]
654         then
655                 for IMAGE in `cat ${image_directory}/${MODULE}.module`
656                 do
657                         image_string="${image_string} ${image_directory}/${image}"
658                 done
659         else
660                 # ${MODULE}.module does not exist, create a list of images
661                 for FILESYSTEM in squashfs ext2 ext3 xfs dir
662                 do
663                         for IMAGE in "${image_directory}"/*."${FILESYSTEM}"
664                         do
665                                 if [ -e "${IMAGE}" ]
666                                 then
667                                         image_string="${image_string} ${IMAGE}"
668                                 fi
669                         done
670                 done
671
672                 # Now sort the list
673                 image_string="`echo ${image_string} | sed -e 's/ /\n/g' | sort `"
674         fi
675
676     mkdir -p "${croot}"
677     for image in ${image_string}; do
678         imagename=$(basename "${image}")
679         if [ -d "${image}" ]; then
680             # it is a plain directory: do nothing
681             rofsstring="${image}=${roopt}:${rofsstring}"
682             rofslist="${image} ${rofslist}"
683         elif [ -f "${image}" ]; then
684             backdev=$(get_backing_device "$image")
685             fstype=$(get_fstype "${backdev}")
686             if [ "${fstype}" = "unknown" ]; then
687                 panic "Unknown file system type on ${backdev} (${image})"
688              fi
689             mkdir -p "${croot}/${imagename}"
690             mount -t "${fstype}" -o ro "${backdev}" "${croot}/${imagename}" || panic "Can not mount $backdev ($image) on ${croot}/${imagename}" && rofsstring="${croot}/${imagename}=${roopt}:${rofsstring}" && rofslist="${croot}/${imagename} ${rofslist}"
691         fi
692     done
693     rofsstring=${rofsstring%:}
694
695     mkdir -p /cow
696     cowdevice="tmpfs"
697     cow_fstype="tmpfs"
698
699     # Looking for "${root_persistence}" device or file
700     if [ -n "${PERSISTENT}" ]; then
701         cowprobe=$(find_cow_device "${root_persistence}")
702         if [ -b "${cowprobe}" ]; then
703             cowdevice=${cowprobe}
704             cow_fstype=$(get_fstype "${cowprobe}")
705         else
706             [ "$quiet" != "y" ] && log_warning_msg "Unable to find the persistent medium"
707         fi
708     fi
709
710     mount ${cowdevice} -t ${cow_fstype} -o rw /cow || panic "Can not mount $cowdevice on /cow"
711
712     mount -t ${UNIONTYPE} -o dirs=/cow=rw:$rofsstring ${UNIONTYPE} "$rootmnt" || panic "${UNIONTYPE} mount failed"
713
714     # Adding other custom mounts
715     if [ -n "${PERSISTENT}" ]; then
716         # directly mount /home
717         # FIXME: add a custom mounts configurable system
718         homecow=$(find_cow_device "${home_persistence}" )
719         if [ -b "${homecow}" ]; then
720             mount -t $(get_fstype "${homecow}") -o rw "${homecow}" "${rootmnt}/home"
721             export HOMEMOUNTED=1 # used to proper calculate free space in do_snap_copy()
722         else
723             [ "$quiet" != "y" ] && log_warning_msg "Unable to find the persistent home medium"
724         fi
725         # Look for other snapshots to copy in
726         try_snap "${root_snapshot_label}" "${rootmnt}" "ROOT"
727         try_snap "${home_snapshot_label}" "${rootmnt}/home" "HOME"
728     fi
729
730     if [ -n "${SHOWMOUNTS}" ]; then
731         for d in ${rofslist}; do
732             mkdir -p "${rootmnt}/live/${d##*/}"
733             case d in
734                 *.dir) # do nothing # mount -o bind "${d}" "${rootmnt}/live/${d##*/}"
735                     ;;
736                 *) mount --move "${d}" "${rootmnt}/live/${d##*/}"
737                     ;;
738             esac
739         done
740     fi
741
742     # shows cow fs on /cow for use by live-snapshot
743     mkdir -p "${rootmnt}/live/cow"
744     mount -o bind /cow "${rootmnt}/live/cow"
745 }
746
747 check_dev ()
748 {
749     sysdev="${1}"
750     devname="${2}"
751     if [ -z "${devname}" ]; then
752         devname=$(sys2dev "${sysdev}")
753     fi
754
755     if [ -n "${LIVE_MEDIA_OFFSET}" ]; then
756         loopdevname=$(setup_loop "${devname}" "loop" "/sys/block/loop*" "${LIVE_MEDIA_OFFSET}" '')
757         devname="${loopdevname}"
758     fi
759
760     fstype=$(get_fstype "${devname}")
761     if is_supported_fs ${fstype}; then
762         mount -t ${fstype} -o ro "${devname}" $mountpoint || continue
763         if is_live_path $mountpoint; then
764             echo $mountpoint
765             return 0
766         else
767             umount $mountpoint
768         fi
769     fi
770
771     if [ -n "${LIVE_MEDIA_OFFSET}" ]; then
772         losetup -d "${loopdevname}"
773     fi
774     return 1
775 }
776
777 find_livefs() {
778     timeout="${1}"
779     # first look at the one specified in the command line
780     if [ ! -z "${LIVE_MEDIA}" ]; then
781         if check_dev "null" "${LIVE_MEDIA}"; then
782             return 0
783         fi
784     fi
785     # don't start autodetection before timeout has expired
786     if [ -n "${LIVE_MEDIA_TIMEOUT}" ]; then
787         if [ "${timeout}" -lt "${LIVE_MEDIA_TIMEOUT}" ]; then
788             return 1
789         fi
790     fi
791     # or do the scan of block devices
792     for sysblock in $(echo /sys/block/* | tr ' ' '\n' | grep -v loop | grep -v ram); do
793         devname=$(sys2dev "${sysblock}")
794         fstype=$(get_fstype "${devname}")
795         if /lib/udev/cdrom_id ${devname} > /dev/null; then
796             if check_dev "null" "${devname}" ; then
797                 return 0
798             fi
799         elif is_nice_device "${sysblock}" ; then
800             for dev in $(subdevices "${sysblock}"); do
801                 if check_dev "${dev}" ; then
802                     return 0
803                 fi
804             done
805         elif [ "${fstype}" = "squashfs" -o \
806                 "${fstype}" = "ext2" -o \
807                 "${fstype}" = "ext3" ]; then
808             # This is an ugly hack situation, the block device has
809             # an image directly on it.  It's hopefully
810             # live-initramfs, so take it and run with it.
811             ln -s "${devname}" "${devname}.${fstype}"
812             echo "${devname}.${fstype}"
813             return 0
814         fi
815     done
816     return 1
817 }
818
819 pulsate() {
820     if [ -x /sbin/usplash_write ]; then
821         /sbin/usplash_write "PULSATE"
822     fi
823 }
824
825 set_usplash_timeout() {
826     if [ -x /sbin/usplash_write ]; then
827         /sbin/usplash_write "TIMEOUT 120"
828     fi
829 }
830
831 mountroot() {
832     exec 6>&1
833     exec 7>&2
834     exec > live.log
835     exec 2>&1
836
837     Arguments
838
839     set_usplash_timeout
840     [ "$quiet" != "y" ] && log_begin_msg "Running /scripts/live-premount"
841     pulsate
842     run_scripts /scripts/live-premount
843     [ "$quiet" != "y" ] && log_end_msg
844
845     # Needed here too because some things (*cough* udev *cough*)
846     # changes the timeout
847
848     set_usplash_timeout
849
850     if [ ! -z "${NETBOOT}" ] || [ ! -z "${FETCH}" ]; then
851         if do_netmount ; then
852             livefs_root="${mountpoint}"
853         else
854             panic "Unable to find a live file system on the network"
855         fi
856     else
857         # Scan local devices for the image
858         for i in 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19; do
859             livefs_root=$(find_livefs $i)
860             if [ -n "${livefs_root}" ]; then
861                 break
862             fi
863             sleep 1
864         done
865     fi
866
867     if [ -z "${livefs_root}" ]; then
868         panic "Unable to find a medium containing a live file system"
869     fi
870
871     if [ "${TORAM}" ]; then
872         live_dest="ram"
873     elif [ "${TODISK}" ]; then
874         live_dest="${TODISK}"
875     fi
876     if [ "${live_dest}" ]; then
877         log_begin_msg "Copying live media to ${live_dest}"
878         copy_live_to "${livefs_root}" "${live_dest}"
879         log_end_msg
880     fi
881
882     mount_images_in_directory "${livefs_root}" "${rootmnt}"
883
884     log_end_msg
885
886     maybe_break live-bottom
887     [ "$quiet" != "y" ] && log_begin_msg "Running /scripts/live-bottom"
888
889     pulsate
890     run_scripts /scripts/live-bottom
891     [ "$quiet" != "y" ] && log_end_msg
892
893     exec 1>&6 6>&-
894     exec 2>&7 7>&-
895     cp live.log "${rootmnt}/var/log/"
896 }