Merging casper 1.168.
[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
22 mkdir -p "${mountpoint}"
23
24 # Create /etc/mtab for debug purpose and future syncs
25 if [ ! -d /etc ]
26 then
27         mkdir /etc/
28 fi
29
30 if [ ! -f /etc/mtab ]
31 then
32         touch /etc/mtab
33 fi
34
35 [ -f /etc/live.conf ] && . /etc/live.conf
36 export USERNAME USERFULLNAME HOSTNAME
37
38 . /scripts/live-helpers
39
40 if [ ! -f /live.vars ]
41 then
42         touch /live.vars
43 fi
44
45 Arguments ()
46 {
47         PRESEEDS=""
48
49         for ARGUMENT in $(cat /proc/cmdline)
50         do
51                 case "${ARGUMENT}" in
52                         access=*)
53                                 ACCESS="${ARGUMENT#access=}"
54                                 export ACCESS
55                                 ;;
56
57                         console=*)
58                                 DEFCONSOLE="${ARGUMENT#*=}"
59                                 export DEFCONSOLE
60                                 ;;
61
62                         debug)
63                                 DEBUG="Yes"
64                                 export DEBUG
65
66                                 set -x
67                                 ;;
68
69                         ethdevice=*)
70                                 DEVICE="${ARGUMENT#ethdevice=}"
71                                 export DEVICE
72                                 ;;
73
74                         fetch=*)
75                                 FETCH="${ARGUMENT#fetch=}"
76                                 export FETCH
77                                 ;;
78
79                         forcepersistentfsck)
80                                 FORCEPERSISTENTFSCK="Yes"
81                                 export FORCEPERSISTENTFSCK
82                                 ;;
83
84                         hook=*)
85                                 HOOK="${ARGUMENT#hook=}"
86                                 export HOOK
87                                 ;;
88
89                         ftpfs=*)
90                                 FTPFS="${ARGUMENT#ftpfs=}"
91                                 export FTPFS
92                                 ;;
93
94                         httpfs=*)
95                                 HTTPFS="${ARGUMENT#httpfs=}"
96                                 export HTTPFS
97                                 ;;
98
99                         hostname=*)
100                                 HOSTNAME="${ARGUMENT#hostname=}"
101                                 LIVECONF="changed"
102                                 export HOSTNAME LIVECONF
103                                 ;;
104
105                         isofrom=*|fromiso=*)
106                                 FROMISO="${ARGUMENT#*=}"
107                                 export FROMISO
108                                 ;;
109
110                         username=*)
111                                 USERNAME="${ARGUMENT#username=}"
112                                 LIVECONF="changed"
113                                 export USERNAME LIVECONF
114                                 ;;
115
116                         userfullname=*)
117                                 USERFULLNAME="${ARGUMENT#userfullname=}"
118                                 LIVECONF="changed"
119                                 export USERFULLNAME LIVECONF
120                                 ;;
121
122                         ignore_uuid)
123                                 IGNORE_UUID="Yes"
124                                 export IGNORE_UUID
125                                 ;;
126
127                         integrity-check)
128                                 INTEGRITY_CHECK="Yes"
129                                 export INTEGRITY_CHECK
130                                 ;;
131
132                         ip=*)
133                                 STATICIP="${ARGUMENT#ip=}"
134
135                                 if [ -z "${STATICIP}" ]
136                                 then
137                                         STATICIP="frommedia"
138                                 fi
139
140                                 export STATICIP
141                                 ;;
142
143                         keyb=*|kbd-chooser/method=*)
144                                 KBD="${ARGUMENT#*=}"
145                                 export KBD
146                                 ;;
147
148                         klayout=*|console-setup/layoutcode=*)
149                                 KLAYOUT="${ARGUMENT#*=}"
150                                 export KLAYOUT
151                                 ;;
152
153                         kvariant=*|console-setup/variantcode=*)
154                                 KVARIANT="${ARGUMENT#*=}"
155                                 export KVARIANT
156                                 ;;
157
158                         kmodel=*|console-setup/modelcode=*)
159                                 KMODEL="${ARGUMENT#*=}"
160                                 export KMODEL
161                                 ;;
162
163                         koptions=*)
164                                 KOPTIONS="${ARGUMENT#koptions=}"
165                                 export KOPTIONS
166                                 ;;
167
168                         live-getty)
169                                 LIVE_GETTY="1"
170                                 export LIVE_GETTY
171                                 ;;
172
173                         live-media=*|bootfrom=*)
174                                 LIVE_MEDIA="${ARGUMENT#*=}"
175                                 export LIVE_MEDIA
176                                 ;;
177
178                         live-media-encryption=*|encryption=*)
179                                 LIVE_MEDIA_ENCRYPTION="${ARGUMENT#*=}"
180                                 export LIVE_MEDIA_ENCRYPTION
181                                 ;;
182
183                         live-media-offset=*)
184                                 LIVE_MEDIA_OFFSET="${ARGUMENT#live-media-offset=}"
185                                 export LIVE_MEDIA_OFFSET
186                                 ;;
187
188                         live-media-path=*)
189                                 LIVE_MEDIA_PATH="${ARGUMENT#live-media-path=}"
190                                 export LIVE_MEDIA_PATH
191                                 ;;
192
193                         live-media-timeout=*)
194                                 LIVE_MEDIA_TIMEOUT="${ARGUMENT#live-media-timeout=}"
195                                 export LIVE_MEDIA_TIMEOUT
196                                 ;;
197
198                         language=*|debian-installer/language=*)
199                                 language=${x#debian-installer/language=}
200                                 locale="$(lang2locale "$language")"
201                                 set_locale="true"
202                                 ;;
203
204                         locale=*|debian-installer/locale=*)
205                                 LOCALE="${ARGUMENT#*=}"
206                                 export LOCALE
207                                 ;;
208
209                         module=*)
210                                 MODULE="${ARGUMENT#module=}"
211                                 export MODULE
212                                 ;;
213
214                         netboot=*)
215                                 NETBOOT="${ARGUMENT#netboot=}"
216                                 export NETBOOT
217                                 ;;
218
219                         nfsopts=*)
220                                 NFSOPTS="${ARGUMENT#nfsopts=}"
221                                 export NFSOPTS
222                                 ;;
223
224                         nfscow=*)
225                                 NFS_COW="${ARGUMENT#nfscow=}"
226                                 export NFS_COW
227                                 ;;
228
229                         noaccessibility)
230                                 NOACCESSIBILITY="Yes"
231                                 export NOACCESSIBILITY
232                                 ;;
233
234                         noapparmor)
235                                 NOAPPARMOR="Yes"
236                                 export NOAPPARMOR
237                                 ;;
238
239                         noaptcdrom)
240                                 NOAPTCDROM="Yes"
241                                 export NOAPTCDROM
242                                 ;;
243
244                         noautologin)
245                                 NOAUTOLOGIN="Yes"
246                                 export NOAUTOLOGIN
247                                 ;;
248
249                         noxautologin)
250                                 NOXAUTOLOGIN="Yes"
251                                 export NOXAUTOLOGIN
252                                 ;;
253
254                         noconsolekeyboard)
255                                 NOCONSOLEKEYBOARD="Yes"
256                                 export NOCONSOLEKEYBOARD
257                                 ;;
258
259                         nofastboot)
260                                 NOFASTBOOT="Yes"
261                                 export NOFASTBOOT
262                                 ;;
263
264                         nofstab)
265                                 NOFSTAB="Yes"
266                                 export NOFSTAB
267                                 ;;
268
269                         nognomepanel)
270                                 NOGNOMEPANEL="Yes"
271                                 export NOGNOMEPANEL
272                                 ;;
273
274                         nohosts)
275                                 NOHOSTS="Yes"
276                                 export NOHOSTS
277                                 ;;
278
279                         nokpersonalizer)
280                                 NOKPERSONALIZER="Yes"
281                                 export NOKPERSONALIZER
282                                 ;;
283
284                         nolanguageselector)
285                                 NOLANGUAGESELECTOR="Yes"
286                                 export NOLANGUAGESELECTOR
287                                 ;;
288
289                         nolocales)
290                                 NOLOCALES="Yes"
291                                 export NOLOCALES
292                                 ;;
293
294                         nonetworking)
295                                 NONETWORKING="Yes"
296                                 export NONETWORKING
297                                 ;;
298
299                         nopowermanagement)
300                                 NOPOWERMANAGEMENT="Yes"
301                                 export NOPOWERMANAGEMENT
302                                 ;;
303
304                         noprogramcrashes)
305                                 NOPROGRAMCRASHES="Yes"
306                                 export NOPROGRAMCRASHES
307                                 ;;
308
309                         nojockey)
310                                 NOJOCKEY="Yes"
311                                 export NOJOCKEY
312                                 ;;
313
314                         nosudo)
315                                 NOSUDO="Yes"
316                                 export NOSUDO
317                                 ;;
318
319                         swapon)
320                                 SWAPON="Yes"
321                                 export SWAPON
322                                 ;;
323
324                         noupdatenotifier)
325                                 NOUPDATENOTIFIER="Yes"
326                                 export NOUPDATENOTIFIER
327                                 ;;
328
329                         nouser)
330                                 NOUSER="Yes"
331                                 export NOUSER
332                                 ;;
333
334                         noxautoconfig)
335                                 NOXAUTOCONFIG="Yes"
336                                 export NOXAUTOCONFIG
337                                 ;;
338
339                         noxscreensaver)
340                                 NOXSCREENSAVER="Yes"
341                                 export NOXSCREENSAVER
342                                 ;;
343
344                         persistent)
345                                 PERSISTENT="Yes"
346                                 export PERSISTENT
347                                 ;;
348
349                         persistent=*)
350                                 PERSISTENT="${ARGUMENT#persistent=}"
351                                 if [ -z "${PERSISTENT}" ]
352                                 then
353                                         PERSISTENT="Yes"
354                                 fi
355                                 export PERSISTENT
356                                 ;;
357
358                         persistent-path=*)
359                                 PERSISTENT_PATH="${ARGUMENT#persistent-path=}"
360                                 export PERSISTENT_PATH
361                                 ;;
362
363                         persistent-subtext=*)
364                                 root_persistence="${root_persistence}-${ARGUMENT#persistent-subtext=}"
365                                 home_persistence="${home_persistence}-${ARGUMENT#persistent-subtext=}"
366                                 root_snapshot_label="${root_snapshot_label}-${ARGUMENT#persistent-subtext=}"
367                                 home_snapshot_label="${home_snapshot_label}-${ARGUMENT#persistent-subtext=}"
368                                 ;;
369
370                         nopersistent)
371                                 NOPERSISTENT="Yes"
372                                 export NOPERSISTENT
373                                 ;;
374
375                         preseed/file=*|file=*)
376                                 LOCATION="${ARGUMENT#*=}"
377                                 export LOCATION
378                                 ;;
379
380                         nopreseed)
381                                 NOPRESEED="Yes"
382                                 export NOPRESEED
383                                 ;;
384
385                         url=*)
386                                 location="${ARGUMENT#url=}"
387
388                                 mount -o bind /sys /root/sys
389                                 mount -o bind /proc /root/proc
390                                 mount -o bind /dev /root/dev
391
392                                 mkdir -p /root/var/run/network
393                                 [ "${NETBOOT}" ] || chroot /root dhclient eth0
394                                 chroot /root wget -P /tmp "${location}"
395                                 [ "${NETBOOT}" ] || chroot /root ifconfig eth0 down
396
397                                 umount /root/sys
398                                 umount /root/proc
399                                 umount /root/dev
400
401                                 LOCATION="/tmp/$(basename "${location}")"
402                                 ;;
403
404                         */*=*)
405                                 question="${ARGUMENT%%=*}"
406                                 value="${ARGUMENT#*=}"
407                                 PRESEEDS="${PRESEEDS}\"${question}=${value}\" "
408                                 export PRESEEDS
409                                 ;;
410
411                         showmounts)
412                                 SHOWMOUNTS="Yes"
413                                 export SHOWMOUNTS
414                                 ;;
415
416                         silent)
417                                 SILENT="Yes"
418                                 export SILENT
419                                 ;;
420
421                         textonly)
422                                 TEXTONLY="Yes"
423                                 export TEXTONLY
424                                 ;;
425
426                         timezone=*)
427                                 TIMEZONE="${ARGUMENT#timezone=}"
428                                 export TIMEZONE
429                                 ;;
430
431                         notimezone)
432                                 NOTIMEZONE="Yes"
433                                 export NOTIMEZONE
434                                 ;;
435
436                         todisk=*)
437                                 TODISK="${ARGUMENT#todisk=}"
438                                 export TODISK
439                                 ;;
440
441                         toram)
442                                 TORAM="Yes"
443                                 export TORAM
444                                 ;;
445
446                         toram=*)
447                                 TORAM="Yes"
448                                 MODULETORAM="${ARGUMENT#toram=}"
449                                 export TORAM MODULETORAM
450                                 ;;
451
452                         exposedroot)
453                                 EXPOSED_ROOT="Yes"
454                                 export EXPOSED_ROOT
455                                 ;;
456
457                         plainroot)
458                                 PLAIN_ROOT="Yes"
459                                 export PLAIN_ROOT
460                                 ;;
461
462                         skipunion)
463                                 SKIP_UNION_MOUNTS="Yes"
464                                 export SKIP_UNION_MOUNTS
465                                 ;;
466
467                         root=*)
468                                 ROOT="${ARGUMENT#root=}"
469                                 export ROOT
470                                 ;;
471
472                         union=*)
473                                 UNIONTYPE="${ARGUMENT#union=}"
474                                 export UNIONTYPE
475                                 ;;
476
477                         utc=*)
478                                 UTC="${ARGUMENT#utc=}"
479                                 export UTC
480                                 ;;
481
482                         xdebconf)
483                                 XDEBCONF="Yes"
484                                 export XDEBCONF
485                                 ;;
486
487                         xdriver=*)
488                                 XDRIVER="${ARGUMENT#xdriver=}"
489                                 export XDRIVER
490                                 ;;
491
492                         xvideomode=*)
493                                 XVIDEOMODE="${ARGUMENT#xvideomode=}"
494                                 export XVIDEOMODE
495                                 ;;
496                 esac
497         done
498
499         # sort of compatibility with netboot.h from linux docs
500         if [ -z "${NETBOOT}" ]
501         then
502                 if [ "${ROOT}" = "/dev/nfs" ]
503                 then
504                         NETBOOT="nfs"
505                         export NETBOOT
506                 elif [ "${ROOT}" = "/dev/cifs" ]
507                 then
508                         NETBOOT="cifs"
509                         export NETBOOT
510                 fi
511         fi
512
513         if [ -z "${MODULE}" ]
514         then
515                 MODULE="filesystem"
516                 export MODULE
517         fi
518
519         if [ -z "${UNIONTYPE}" ]
520         then
521                 UNIONTYPE="aufs"
522                 export UNIONTYPE
523         fi
524 }
525
526 is_live_path ()
527 {
528         DIRECTORY="${1}"
529
530         if [ -d "${DIRECTORY}"/"${LIVE_MEDIA_PATH}" ]
531         then
532                 for FILESYSTEM in squashfs ext2 ext3 ext4 xfs dir jffs2
533                 do
534                         if [ "$(echo ${DIRECTORY}/${LIVE_MEDIA_PATH}/*.${FILESYSTEM})" != "${DIRECTORY}/${LIVE_MEDIA_PATH}/*.${FILESYSTEM}" ]
535                         then
536                                 return 0
537                         fi
538                 done
539         fi
540
541         return 1
542 }
543
544 matches_uuid ()
545 {
546         if [ "${IGNORE_UUID}" ] || [ ! -e /conf/uuid.conf ]
547         then
548                 return 0
549         fi
550
551         path="${1}"
552         uuid="$(cat /conf/uuid.conf)"
553
554         for try_uuid_file in "${path}/.disk/live-uuid"*
555         do
556                 [ -e "${try_uuid_file}" ] || continue
557
558                 try_uuid="$(cat "${try_uuid_file}")"
559
560                 if [ "${uuid}" = "${try_uuid}" ]
561                 then
562                         return 0
563                 fi
564         done
565
566         return 1
567 }
568
569 get_backing_device ()
570 {
571         case "${1}" in
572                 *.squashfs|*.ext2|*.ext3|*.ext4|*.jffs2)
573                         echo $(setup_loop "${1}" "loop" "/sys/block/loop*" '0' "${LIVE_MEDIA_ENCRYPTION}" "${2}")
574                         ;;
575
576                 *.dir)
577                         echo "directory"
578                         ;;
579
580                 *)
581                         panic "Unrecognized live filesystem: ${1}"
582                         ;;
583         esac
584 }
585
586 match_files_in_dir ()
587 {
588         # Does any files match pattern ${1} ?
589         local pattern="${1}"
590
591         if [ "$(echo ${pattern})" != "${pattern}" ]
592         then
593                 return 0
594         fi
595
596         return 1
597 }
598
599 mount_images_in_directory ()
600 {
601         directory="${1}"
602         rootmnt="${2}"
603         mac="${3}"
604
605
606         if match_files_in_dir "${directory}/${LIVE_MEDIA_PATH}/*.squashfs" ||
607                 match_files_in_dir "${directory}/${LIVE_MEDIA_PATH}/*.ext2" ||
608                 match_files_in_dir "${directory}/${LIVE_MEDIA_PATH}/*.ext3" ||
609                 match_files_in_dir "${directory}/${LIVE_MEDIA_PATH}/*.ext4" ||
610                 match_files_in_dir "${directory}/${LIVE_MEDIA_PATH}/*.jffs2" ||
611                 match_files_in_dir "${directory}/${LIVE_MEDIA_PATH}/*.dir"
612         then
613                 [ -n "${mac}" ] && adddirectory="${directory}/${LIVE_MEDIA_PATH}/${mac}"
614                 setup_unionfs "${directory}/${LIVE_MEDIA_PATH}" "${rootmnt}" "${adddirectory}"
615         else
616                 panic "No supported filesystem images found at /${LIVE_MEDIA_PATH}."
617         fi
618 }
619
620 is_nice_device ()
621 {
622         sysfs_path="${1#/sys}"
623
624         if /lib/udev/path_id "${sysfs_path}" | grep -E -q "ID_PATH=(usb|pci-)"
625         then
626                 return 0
627         elif echo "${sysfs_path}" | grep -q '^/block/vd[a-z]$'
628         then
629                 return 0
630         fi
631
632         return 1
633 }
634
635 copy_live_to ()
636 {
637         copyfrom="${1}"
638         copytodev="${2}"
639         copyto="${copyfrom}_swap"
640
641         if [ -z "${MODULETORAM}" ]
642         then
643                 size=$(fs_size "" ${copyfrom}/${LIVE_MEDIA_PATH} "used")
644         else
645                 MODULETORAMFILE="${copyfrom}/${LIVE_MEDIA_PATH}/${MODULETORAM}"
646
647                 if [ -f "${MODULETORAMFILE}" ]
648                 then
649                         size=$( expr $(ls -la ${MODULETORAMFILE} | awk '{print $5}') / 1024 + 5000 )
650                 else
651                         log_warning_msg "Error: toram-module ${MODULETORAM} (${MODULETORAMFILE}) could not be read."
652                         return 1
653                 fi
654         fi
655
656         if [ "${copytodev}" = "ram" ]
657         then
658                 # copying to ram:
659                 freespace=$( expr $(awk '/MemFree/{print $2}' /proc/meminfo) + $( awk '/\<Cached/{print $2}' /proc/meminfo ) )
660                 mount_options="-o size=${size}k"
661                 free_string="memory"
662                 fstype="tmpfs"
663                 dev="/dev/shm"
664         else
665                 # it should be a writable block device
666                 if [ -b "${copytodev}" ]
667                 then
668                         dev="${copytodev}"
669                         free_string="space"
670                         fstype=$(get_fstype "${dev}")
671                         freespace=$(fs_size "${dev}")
672                 else
673                         log_warning_msg "${copytodev} is not a block device."
674                         return 1
675                 fi
676         fi
677
678         if [ "${freespace}" -lt "${size}" ]
679         then
680                 log_warning_msg "Not enough free ${free_string} (${freespace}k free, ${size}k needed) to copy live media in ${copytodev}."
681                 return 1
682         fi
683
684         # begin copying (or uncompressing)
685         mkdir "${copyto}"
686         log_begin_msg "mount -t ${fstype} ${mount_options} ${dev} ${copyto}"
687         mount -t "${fstype}" ${mount_options} "${dev}" "${copyto}"
688
689         if [ "${extension}" = "tgz" ]
690         then
691                 cd "${copyto}"
692                 tar zxf "${copyfrom}/${LIVE_MEDIA_PATH}/$(basename ${FETCH})"
693                 rm -f "${copyfrom}/${LIVE_MEDIA_PATH}/$(basename ${FETCH})"
694                 mount -r -o move "${copyto}" "${rootmnt}"
695                 cd "${OLDPWD}"
696         else
697                 if [ -n "${MODULETORAMFILE}" ]
698                 then
699                         if [ -x /bin/rsync ]
700                         then
701                                 echo " * Copying $MODULETORAMFILE to RAM" 1>/dev/console
702                                 rsync -a --progress ${MODULETORAMFILE} ${copyto} 1>/dev/console # copy only the filesystem module
703                         else
704                                 cp ${MODULETORAMFILE} ${copyto} # copy only the filesystem module
705                         fi
706                 else
707                         if [ -x /bin/rsync ]
708                         then
709                                 echo " * Copying whole medium to RAM" 1>/dev/console
710                                 rsync -a --progress ${copyfrom}/* ${copyto} 1>/dev/console  # "cp -a" from busybox also copies hidden files
711                         else
712                                 mkdir -p ${copyto}/${LIVE_MEDIA_PATH}
713                                 cp -a ${copyfrom}/${LIVE_MEDIA_PATH}/* ${copyto}/${LIVE_MEDIA_PATH}   # "cp -a" from busybox also copies hidden files
714                         fi
715                 fi
716
717                 umount ${copyfrom}
718                 mount -r -o move ${copyto} ${copyfrom}
719         fi
720
721         rmdir ${copyto}
722         return 0
723 }
724
725 do_netmount ()
726 {
727         rc=1
728
729         modprobe -q af_packet # For DHCP
730
731         if [ -x /sbin/udevadm ]
732         then
733                 # lenny
734                 udevadm trigger
735                 udevadm settle
736         else
737                 # etch
738                 udevtrigger
739                 udevsettle
740         fi
741
742         ipconfig ${DEVICE} | tee /netboot.config
743
744         # source relevant ipconfig output
745         OLDHOSTNAME=${HOSTNAME}
746         . /tmp/net-${DEVICE}.conf
747         [ -z ${HOSTNAME} ] && HOSTNAME=${OLDHOSTNAME}
748         export HOSTNAME
749
750         # Check if we have a network device at all
751         if ! ls /sys/class/net/eth0 > /dev/null 2>&1 && \
752            ! ls /sys/class/net/wlan0 > /dev/null 2>&1 && \
753            ! ls /sys/class/net/ath0 > /dev/null 2>&1 && \
754            ! ls /sys/class/net/ra0 > /dev/null 2>&1
755         then
756                 panic "No supported network device found, maybe a non-mainline driver is required."
757         fi
758
759         if [ "${NFSROOT}" = "auto" ]
760         then
761                 NFSROOT=${ROOTSERVER}:${ROOTPATH}
762         fi
763
764         if ( [ -n "${FETCH}" ] || [ -n "${HTTPFS}" ] || [ -n "${FTPFS}" ] ) && do_httpmount
765         then
766                 rc=0
767                 return ${rc}
768         fi
769
770         if [ "${NFSROOT#*:}" = "${NFSROOT}" ] && [ "$NETBOOT" != "cifs" ]
771         then
772                 NFSROOT=${ROOTSERVER}:${NFSROOT}
773         fi
774
775         log_begin_msg "Trying netboot from ${NFSROOT}"
776
777         if [ "${NETBOOT}" != "nfs" ] && do_cifsmount
778         then
779                 rc=0
780         elif do_nfsmount
781         then
782                 NETBOOT="nfs"
783                 export NETBOOT
784                 rc=0
785         fi
786
787         log_end_msg
788         return ${rc}
789 }
790
791 do_httpmount ()
792 {
793         rc=1
794         dest="${mountpoint}/${LIVE_MEDIA_PATH}"
795         mount -t ramfs ram "${mountpoint}"
796         mkdir -p "${dest}"
797
798         for webfile in HTTPFS FTPFS FETCH
799         do
800                 url="$(eval echo \"\$\{${webfile}\}\")"
801                 extension="$(echo "${url}" | sed 's/\(.*\)\.\(.*\)/\2/')"
802
803                 if [ -n "$url" ]
804                 then
805                         case "${extension}" in
806                                 squashfs|tgz|tar)
807                                         if [ "${webfile}" = "FETCH" ]
808                                         then
809                                                 case "$url" in
810                                                         tftp*)
811                                                                 ip="$(dirname $url | sed -e 's|tftp://||g' -e 's|/.*$||g')"
812                                                                 rfile="$(echo $url | sed -e "s|tftp://$ip||g")"
813                                                                 lfile="$(basename $url)"
814                                                                 log_begin_msg "Trying tftp -g -b 10240 -r $rfile -l ${dest}/$lfile $ip"
815                                                                 tftp -g -b 10240 -r $rfile -l ${dest}/$lfile $ip
816                                                         ;;
817
818                                                         *)
819                                                                 log_begin_msg "Trying wget ${url} -O ${dest}/$(basename ${url})"
820                                                                 wget "${url}" -O "${dest}/$(basename ${url})"
821                                                                 ;;
822                                                 esac
823                                         else
824                                                 log_begin_msg "Trying to mount ${url} on ${dest}/$(basename ${url})"
825                                                 if [ "${webfile}" = "FTPFS" ]
826                                                 then
827                                                         FUSE_MOUNT="curlftpfs"
828                                                         url="$(dirname ${url})"
829                                                 else
830                                                         FUSE_MOUNT="httpfs"
831                                                 fi
832                                                 modprobe fuse
833                                                 $FUSE_MOUNT "${url}" "${dest}"
834                                         fi
835                                         [ ${?} -eq 0 ] && rc=0
836                                         [ "${extension}" = "tgz" ] && live_dest="ram"
837                                         break
838                                         ;;
839
840                                 *)
841                                         log_begin_msg "Unrecognized archive extension for ${url}"
842                                         ;;
843                         esac
844                 fi
845         done
846
847         if [ ${rc} != 0 ]
848         then
849             umount "${mountpoint}"
850         fi
851
852         return ${rc}
853 }
854
855 do_nfsmount ()
856 {
857         rc=1
858
859         modprobe -q nfs
860
861         if [ -z "${NFSOPTS}" ]
862         then
863                 NFSOPTS=""
864         fi
865
866         log_begin_msg "Trying nfsmount -o nolock -o ro ${NFSOPTS} ${NFSROOT} ${mountpoint}"
867
868         # FIXME: This while loop is an ugly HACK round an nfs bug
869         i=0
870         while [ "$i" -lt 60 ]
871         do
872                 nfsmount -o nolock -o ro ${NFSOPTS} "${NFSROOT}" "${mountpoint}" && rc=0 && break
873                 sleep 1
874                 i="$(($i + 1))"
875         done
876
877         return ${rc}
878 }
879
880 do_cifsmount ()
881 {
882         rc=1
883
884         if [ -x "/sbin/mount.cifs" ]
885         then
886                 if [ -z "${NFSOPTS}" ]
887                 then
888                         CIFSOPTS="-ouser=root,password="
889                 else
890                         CIFSOPTS="${NFSOPTS}"
891                 fi
892
893                 log_begin_msg "Trying mount.cifs ${NFSROOT} ${mountpoint} ${CIFSOPTS}"
894                 modprobe -q cifs
895
896                 if mount.cifs "${NFSROOT}" "${mountpoint}" "${CIFSOPTS}"
897                 then
898                         rc=0
899                 fi
900         fi
901
902         return ${rc}
903 }
904
905 do_snap_copy ()
906 {
907         fromdev="${1}"
908         todir="${2}"
909         snap_type="${3}"
910         size=$(fs_size "${fromdev}" "" "used")
911
912         if [ -b "${fromdev}" ]
913         then
914                 # look for free mem
915                 if [ -n "${HOMEMOUNTED}" -a "${snap_type}" = "HOME" ]
916                 then
917                         todev=$(awk -v pat="$(base_path ${todir})" '$2 == pat { print $1 }' /proc/mounts)
918                         freespace=$(df -k | awk '/'${todev}'/{print $4}')
919                 else
920                         freespace=$( expr $(awk '/MemFree/{print $2}' /proc/meminfo) + $( awk '/\<Cached/{print $2}' /proc/meminfo))
921                 fi
922
923                 tomount="/mnt/tmpsnap"
924
925                 if [ ! -d "${tomount}" ]
926                 then
927                         mkdir -p "${tomount}"
928                 fi
929
930                 fstype=$(get_fstype "${fromdev}")
931
932                 if [ -n "${fstype}" ]
933                 then
934                         # Copying stuff...
935                         mount -o ro -t "${fstype}" "${fromdev}" "${tomount}" || log_warning_msg "Error in mount -t ${fstype} -o ro ${fromdev} ${tomount}"
936                         cp -a "${tomount}"/* ${todir}
937                         umount "${tomount}"
938                 else
939                         log_warning_msg "Unrecognized fstype: ${fstype} on ${fromdev}:${snap_type}"
940                 fi
941
942                 rmdir "${tomount}"
943
944                 if echo ${fromdev} | grep -qs loop
945                 then
946                         losetup -d "${fromdev}"
947                 fi
948
949                 return 0
950         else
951                 return 1
952
953                 log_warning_msg "Unable to find the snapshot ${snap_type} medium"
954         fi
955 }
956
957 find_snap ()
958 {
959         # Look for ${snap_label}.* in block devices
960         snap_label="${1}"
961
962         if [ "${PERSISTENT}" != "nofiles" ]
963         then
964                 # search for image files
965                 snapdata=$(find_files "${snap_label}.squashfs ${snap_label}.cpio.gz ${snap_label}.ext2 ${snap_label}.ext3 ${snap_label}.ext4 ${snap_label}.jffs2")
966         fi
967
968         if [ -z "${snapdata}" ]
969         then
970                 snapdata=$(find_cow_device "${snap_label}")
971         fi
972         echo "${snapdata}"
973 }
974
975 try_snap ()
976 {
977         # copy the contents of previously found snapshot to ${snap_mount}
978         # and remember the device and filename for resync on exit in live-initramfs.init
979
980         snapdata="${1}"
981         snap_mount="${2}"
982         snap_type="${3}"
983
984         if [ -n "${snapdata}" ] && [ ! -b "${snapdata}" ]
985         then
986                 log_success_msg "found snapshot: ${snapdata}"
987                 snapdev="$(echo ${snapdata} | cut -f1 -d ' ')"
988                 snapback="$(echo ${snapdata} | cut -f2 -d ' ')"
989                 snapfile="$(echo ${snapdata} | cut -f3 -d ' ')"
990
991                 RES=""
992                 if ! try_mount "${snapdev}" "${snapback}" "ro"
993                 then
994                         break
995                 fi
996
997                 if echo "${snapfile}" | grep -qs '\(squashfs\|ext2\|ext3\|ext4\|jffs2\)'
998                 then
999                         # squashfs, jffs2 or ext2/ext3/ext4 snapshot
1000                         dev=$(get_backing_device "${snapback}/${snapfile}")
1001
1002                         do_snap_copy "${dev}" "${snap_mount}" "${snap_type}"
1003                         RES=$?
1004                 else
1005                         # cpio.gz snapshot
1006                         cd "${snap_mount}"
1007                         zcat "${snapback}/${snapfile}" | /bin/cpio --extract --preserve-modification-time --no-absolute-filenames --sparse --unconditional --make-directories > /dev/null 2>&1
1008                         RES=$?
1009                         if [ "${RES}" != "0" ]
1010                         then
1011                                 log_warning_msg "failure to \"zcat ${snapback}/${snapfile} | /bin/cpio --extract --preserve-modification-time --no-absolute-filenames --sparse --unconditional --make-directories\""
1012                         fi
1013                         cd "${OLDPWD}"
1014                 fi
1015
1016                 umount "${snapback}" ||  log_warning_msg "failure to \"umount ${snapback}\""
1017
1018                 if [ "${RES}" != "0" ]
1019                 then
1020                         log_warning_msg "Impossible to include the ${snapfile} Snapshot file"
1021                 fi
1022
1023         elif [ -b "${snapdata}" ]
1024         then
1025                 # Try to find if it could be a snapshot partition
1026                 dev="${snapdata}"
1027                 log_success_msg "found snapshot ${snap_type} device on ${dev}"
1028                 if echo "${dev}" | grep -qs loop
1029                 then
1030                         # strange things happens, user confused?
1031                         snaploop=$( losetup ${dev} | awk '{print $3}' | tr -d '()' )
1032                         snapfile=$(basename ${snaploop})
1033                         snapdev=$(awk -v pat="$( dirname ${snaploop})" '$2 == pat { print $1 }' /proc/mounts)
1034                 else
1035                         snapdev="${dev}"
1036                 fi
1037
1038                 if ! do_snap_copy "${dev}" "${snap_mount}" "${snap_type}"
1039                 then
1040                         log_warning_msg "Impossible to include the ${snap_type} Snapshot"
1041                         return 1
1042                 else
1043                         if [ -n "${snapfile}" ]
1044                         then
1045                                 # it was a loop device, user confused
1046                                 umount ${snapdev}
1047                         fi
1048                 fi
1049         else
1050                 log_warning_msg "Impossible to include the ${snap_type} Snapshot"
1051                 return 1
1052         fi
1053
1054         echo "export ${snap_type}SNAP="${snap_mount}":${snapdev}:${snapfile}" >> /etc/live.conf # for resync on reboot/halt
1055         return 0
1056 }
1057
1058 setup_unionfs ()
1059 {
1060         image_directory="${1}"
1061         rootmnt="${2}"
1062         addimage_directory="${3}"
1063         modprobe -q -b ${UNIONTYPE}
1064
1065         # run-init can't deal with images in a subdir, but we're going to
1066         # move all of these away before it runs anyway.  No, we're not,
1067         # put them in / since move-mounting them into / breaks mono and
1068         # some other apps.
1069
1070         croot="/"
1071
1072         # Let's just mount the read-only file systems first
1073         rofsstring=""
1074         rofslist=""
1075         minor_kernel_version=$(uname -r|cut -c 5-|sed 's/[^0-9].*//')
1076
1077         if [ "${NETBOOT}" = "nfs" ] && [ "${minor_kernel_version}" -lt 22 ]
1078         then
1079                 # go aroung a bug in nfs-unionfs locking for unionfs <= 1.4
1080                 roopt="nfsro"
1081         elif [ "${UNIONTYPE}" = "aufs" ]
1082         then
1083                 roopt="rr"
1084         else
1085                 roopt="ro"
1086         fi
1087
1088         if [ -z "${PLAIN_ROOT}" ]
1089         then
1090                 # Read image names from ${MODULE}.module if it exists
1091                 if [ -e "${image_directory}/filesystem.${MODULE}.module" ]
1092                 then
1093                         for IMAGE in $(cat ${image_directory}/filesystem.${MODULE}.module)
1094                         do
1095                                 image_string="${image_string} ${image_directory}/${IMAGE}"
1096                         done
1097                 elif [ -e "${image_directory}/${MODULE}.module" ]
1098                 then
1099                         for IMAGE in $(cat ${image_directory}/${MODULE}.module)
1100                         do
1101                                 image_string="${image_string} ${image_directory}/${IMAGE}"
1102                         done
1103                 else
1104                         # ${MODULE}.module does not exist, create a list of images
1105                         for FILESYSTEM in squashfs ext2 ext3 ext4 xfs jffs2 dir
1106                         do
1107                                 for IMAGE in "${image_directory}"/*."${FILESYSTEM}"
1108                                 do
1109                                         if [ -e "${IMAGE}" ]
1110                                         then
1111                                                 image_string="${image_string} ${IMAGE}"
1112                                         fi
1113                                 done
1114                         done
1115
1116                         if [ -n "${addimage_directory}" ] && [ -d "${addimage_directory}" ]
1117                         then
1118                                 for FILESYSTEM in squashfs ext2 ext3 ext4 xfs jffs2 dir
1119                                 do
1120                                         for IMAGE in "${addimage_directory}"/*."${FILESYSTEM}"
1121                                         do
1122                                                 if [ -e "${IMAGE}" ]
1123                                                 then
1124                                                         image_string="${image_string} ${IMAGE}"
1125                                                 fi
1126                                         done
1127                                 done
1128                         fi
1129
1130                         # Now sort the list
1131                         image_string="$(echo ${image_string} | sed -e 's/ /\n/g' | sort )"
1132                 fi
1133
1134         [ -n "${MODULETORAMFILE}" ] && image_string="${image_directory}/$(basename ${MODULETORAMFILE})"
1135
1136                 mkdir -p "${croot}"
1137
1138                 for image in ${image_string}
1139                 do
1140                         imagename=$(basename "${image}")
1141
1142                         export image devname
1143                         maybe_break live-realpremount
1144                         log_begin_msg "Running /scripts/live-realpremount"
1145                         run_scripts /scripts/live-realpremount
1146                         log_end_msg
1147
1148                         if [ -d "${image}" ]
1149                         then
1150                                 # it is a plain directory: do nothing
1151                                 rofsstring="${image}=${roopt}:${rofsstring}"
1152                                 rofslist="${image} ${rofslist}"
1153                         elif [ -f "${image}" ]
1154                         then
1155                                 if losetup --help 2>&1 | grep -q -- "-r\b"
1156                                 then
1157                                         backdev=$(get_backing_device "${image}" "-r")
1158                                 else
1159                                         backdev=$(get_backing_device "${image}")
1160                                 fi
1161                                 fstype=$(get_fstype "${backdev}")
1162
1163                                 if [ "${fstype}" = "unknown" ]
1164                                 then
1165                                         panic "Unknown file system type on ${backdev} (${image})"
1166                                 fi
1167
1168                                 if [ -z "${fstype}" ]
1169                                 then
1170                                         fstype="${imagename##*.}"
1171                                         log_warning_msg "Unknown file system type on ${backdev} (${image}), assuming ${fstype}."
1172                                 fi
1173
1174                                 mkdir -p "${croot}/${imagename}"
1175                                 log_begin_msg "Mounting \"${image}\" on \"${croot}${imagename}\" via \"${backdev}\""
1176                                 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}"
1177                                 log_end_msg
1178                         fi
1179                 done
1180         else
1181                 # we have a plain root system
1182                 mkdir -p "${croot}/filesystem"
1183                 log_begin_msg "Mounting \"${image_directory}\" on \"${croot}/filesystem\""
1184                 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}"
1185                 # probably broken:
1186                 mount -o bind ${croot}/filesystem $mountpoint
1187                 log_end_msg
1188         fi
1189
1190         rofsstring=${rofsstring%:}
1191
1192         mkdir -p /cow
1193
1194         # Looking for "${root_persistence}" device or file
1195         if [ -n "${PERSISTENT}" ] && [ -z "${NOPERSISTENT}" ]
1196         then
1197                 # Load USB modules
1198                 num_block=$(ls -l /sys/block | wc -l)
1199                 for module in sd_mod uhci-hcd ehci-hcd ohci-hcd usb-storage
1200                 do
1201                         modprobe -q -b ${module}
1202                 done
1203
1204                 if [ -x /sbin/udevadm ]
1205                 then
1206                         # lenny
1207                         udevadm trigger
1208                         udevadm settle
1209                 else
1210                         # etch
1211                         udevtrigger
1212                         udevsettle
1213                 fi
1214
1215                 # For some reason, udevsettle does not block in this scenario,
1216                 # so we sleep for a little while.
1217                 #
1218                 # See https://bugs.launchpad.net/ubuntu/+source/casper/+bug/84591
1219                 for timeout in 5 4 3 2 1
1220                 do
1221                         sleep 1
1222
1223                         if [ $(ls -l /sys/block | wc -l) -gt ${num_block} ]
1224                         then
1225                                 break
1226                         fi
1227                 done
1228
1229                 # search for label and files (this could be hugely optimized)
1230                 cowprobe=$(find_cow_device "${root_persistence}")
1231                 if [ -b "${cowprobe}" ]
1232                 then
1233                         # Blacklist /cow device, to avoid inconsistent setups for overlapping snapshots
1234                         # makes sense to have both persistence for /cow and /home mounted, maybe also with
1235                         # snapshots to be sure to really store some e.g key config files,
1236                         # but not on the same media
1237                         blacklistdev="${cowprobe}"
1238                         PERSISTENCE_IS_ON="1"
1239                         export PERSISTENCE_IS_ON
1240                 fi
1241                 # homecow just mount something on /home, this should be generalized some way
1242                 homecow=$(find_cow_device "${home_persistence}" "${blacklistdev}")
1243                 if [ -b "${homecow}" ]
1244                 then
1245                         PERSISTENCE_IS_ON="1"
1246                         export PERSISTENCE_IS_ON
1247                 fi
1248                 root_snapdata=$(find_snap "${root_snapshot_label}" "${blacklistdev}")
1249                 # This second type should be removed when snapshot will get smarter,
1250                 # hence when "/etc/live-snapshot*list" will be supported also by
1251                 # ext2|ext3|ext4|jffs2 snapshot types.
1252                 home_snapdata=$(find_snap "${home_snapshot_label}" "${blacklistdev}")
1253
1254                 if [ -b "${cowprobe}" ]
1255                 then
1256                         cowdevice=${cowprobe}
1257                         cow_fstype=$(get_fstype "${cowprobe}")
1258                         cow_mountopt="rw,noatime"
1259
1260                         if [ "${FORCEPERSISTENTFSCK}" = "Yes" ]
1261                         then
1262                                 fsck -y ${cowdevice}
1263                         fi
1264                 else
1265                         log_warning_msg "Unable to find the persistent medium"
1266                         cowdevice="tmpfs"
1267                         cow_fstype="tmpfs"
1268                         cow_mountopt="rw,noatime,mode=755"
1269                 fi
1270         elif [ -n "${NFS_COW}" ] && [ -z "${NOPERSISTENT}" ]
1271         then
1272                 # check if there are any nfs options
1273                 if echo ${NFS_COW}|grep -q ','
1274                 then
1275                         nfs_cow_opts="-o nolock,$(echo ${NFS_COW}|cut -d, -f2-)"
1276                         nfs_cow=$(echo ${NFS_COW}|cut -d, -f1)
1277                 else
1278                         nfs_cow_opts="-o nolock"
1279                         nfs_cow=${NFS_COW}
1280                 fi
1281                 mac="$(get_mac)"
1282                 if [ -n "${mac}" ]
1283                 then
1284                         cowdevice=$(echo ${nfs_cow}|sed "s/client_mac_address/${mac}/")
1285                         cow_fstype="nfs"
1286                 else
1287                         panic "unable to determine mac address"
1288                 fi
1289         else
1290                 cowdevice="tmpfs"
1291                 cow_fstype="tmpfs"
1292                 cow_mountopt="rw,noatime,mode=755"
1293         fi
1294
1295         if [ "${cow_fstype}" = "nfs" ]
1296         then
1297                 log_begin_msg \
1298                         "Trying nfsmount ${nfs_cow_opts} ${cowdevice} /cow"
1299                 nfsmount ${nfs_cow_opts} ${cowdevice} /cow || \
1300                         panic "Can not mount ${cowdevice} (n: ${cow_fstype}) on /cow"
1301         else
1302                 mount -t ${cow_fstype} -o ${cow_mountopt} ${cowdevice} /cow || \
1303                         panic "Can not mount ${cowdevice} (o: ${cow_fstype}) on /cow"
1304         fi
1305
1306         rofscount=$(echo ${rofslist} |wc -w)
1307
1308         if [ -n "${EXPOSED_ROOT}" ]
1309         then
1310                 if [ ${rofscount} -ne 1 ]
1311                 then
1312                         panic "only one RO file system supported with exposedroot: ${rofslist}"
1313                 fi
1314                 exposedrootfs=${rofslist%% }
1315
1316                 mount --bind ${exposedrootfs} ${rootmnt} || \
1317                         panic "bind mount of ${exposedrootfs} failed"
1318
1319                 if [ -z "${SKIP_UNION_MOUNTS}" ]
1320                 then
1321                         cow_dirs='/var/tmp /var/lock /var/run /var/log /var/spool /home /var/lib/live'
1322                 else
1323                         cow_dirs=''
1324                 fi
1325
1326                 for dir in ${cow_dirs}; do
1327                         mkdir -p /cow${dir}
1328                         mount -t ${UNIONTYPE} \
1329                                 -o rw,noatime,dirs=/cow${dir}=rw:${exposedrootfs}${dir}=ro \
1330                                 ${UNIONTYPE} "${rootmnt}${dir}" || \
1331                                 panic "mount ${UNIONTYPE} on ${rootmnt}${dir} failed with option \
1332                                         rw,noatime,dirs=/cow${dir}=rw:${exposedrootfs}${dir}=ro"
1333                 done
1334         else
1335                 mount -t ${UNIONTYPE} -o noatime,dirs=/cow=rw:${rofsstring} \
1336                         ${UNIONTYPE} "${rootmnt}" || panic "mount ${UNIONTYPE} on \
1337                         ${rootmnt} failed with option noatime,dirs=/cow=rw:${rofsstring}"
1338         fi
1339
1340         # Correct the permissions of /:
1341         chmod 0755 "${rootmnt}"
1342
1343         # tmpfs file systems
1344         touch /etc/fstab
1345         mkdir -p "${rootmnt}/live"
1346         mount -t tmpfs tmpfs ${rootmnt}/live
1347
1348         # Adding other custom mounts
1349         if [ -n "${PERSISTENT}" ] && [ -z "${NOPERSISTENT}" ]
1350         then
1351                 # directly mount /home
1352                 # FIXME: add a custom mounts configurable system
1353
1354                 if [ -b "${homecow}" ]
1355                 then
1356                         mount -t $(get_fstype "${homecow}") -o rw,noatime "${homecow}" "${rootmnt}/home"
1357                         export HOMEMOUNTED=1 # used to proper calculate free space in do_snap_copy()
1358                 else
1359                         log_warning_msg "Unable to find the persistent home medium"
1360                 fi
1361
1362                 # Look for other snapshots to copy in
1363                 try_snap "${root_snapdata}" "${rootmnt}" "ROOT"
1364                 # This second type should be removed when snapshot grow smarter
1365                 try_snap "${home_snapdata}" "${rootmnt}/home" "HOME"
1366         fi
1367
1368         if [ -n "${SHOWMOUNTS}" ]
1369         then
1370                 for d in ${rofslist}
1371                 do
1372                         mkdir -p "${rootmnt}/live/${d##*/}"
1373
1374                         case d in
1375                                 *.dir)
1376                                         # do nothing # mount -o bind "${d}" "${rootmnt}/live/${d##*/}"
1377                                         ;;
1378
1379                                 *)
1380                                         mount -o move "${d}" "${rootmnt}/live/${d##*/}"
1381                                         ;;
1382                         esac
1383                 done
1384         fi
1385
1386         # shows cow fs on /cow for use by live-snapshot
1387         mkdir -p "${rootmnt}/live/cow"
1388         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"
1389 }
1390
1391 check_dev ()
1392 {
1393         sysdev="${1}"
1394         devname="${2}"
1395         skip_uuid_check="${3}"
1396
1397         # support for fromiso=.../isofrom=....
1398         if [ -n "$FROMISO" ]
1399         then
1400                 mkdir /isofrom
1401                 ISO_DEVICE="$(echo $FROMISO | sed 's|\(/dev/[a-z]*[0-9]*\).*|\1|')"
1402                 mount "$ISO_DEVICE" /isofrom
1403                 ISO_NAME="$(echo $FROMISO | sed 's|/dev/[a-z]*[0-9]*/||')"
1404                 loopdevname=$(setup_loop "/isofrom/${ISO_NAME}" "loop" "/sys/block/loop*" "" '')
1405                 devname="${loopdevname}"
1406         fi
1407
1408         if [ -z "${devname}" ]
1409         then
1410                 devname=$(sys2dev "${sysdev}")
1411         fi
1412
1413         if [ -d "${devname}" ]
1414         then
1415                 mount -o bind "${devname}" $mountpoint || continue
1416
1417                 if is_live_path $mountpoint
1418                 then
1419                         echo $mountpoint
1420                         return 0
1421                 else
1422                         umount $mountpoint
1423                 fi
1424         fi
1425
1426         if [ -n "${LIVE_MEDIA_OFFSET}" ]
1427         then
1428                 loopdevname=$(setup_loop "${devname}" "loop" "/sys/block/loop*" "${LIVE_MEDIA_OFFSET}" '')
1429                 devname="${loopdevname}"
1430         fi
1431
1432         fstype=$(get_fstype "${devname}")
1433
1434         if is_supported_fs ${fstype}
1435         then
1436                 mount -t ${fstype} -o ro,noatime "${devname}" ${mountpoint} || continue
1437
1438                 if is_live_path ${mountpoint} && \
1439                         ([ "${skip_uuid_check}" ] || matches_uuid ${mountpoint})
1440                 then
1441                         echo ${mountpoint}
1442                         return 0
1443                 else
1444                         umount ${mountpoint}
1445                 fi
1446         fi
1447
1448         if [ -n "${LIVE_MEDIA_OFFSET}" ]
1449         then
1450                 losetup -d "${loopdevname}"
1451         fi
1452
1453         return 1
1454 }
1455
1456 find_livefs ()
1457 {
1458         timeout="${1}"
1459
1460         # don't start autodetection before timeout has expired
1461         if [ -n "${LIVE_MEDIA_TIMEOUT}" ]
1462         then
1463                 if [ "${timeout}" -lt "${LIVE_MEDIA_TIMEOUT}" ]
1464                 then
1465                         return 1
1466                 fi
1467         fi
1468
1469         # first look at the one specified in the command line
1470         case "${LIVE_MEDIA}" in
1471                 removable-usb)
1472                         for sysblock in $(echo /sys/block/* | tr ' ' '\n' | grep -vE "/(loop|ram|dm-|fd)")
1473                         do
1474                                 if [ "$(cat ${sysblock}/removable)" = "1" ]
1475                                 then
1476                                         if readlink ${sysblock} | grep -q usb ||
1477                                            readlink ${sysblock}/device | grep -q usb # linux < 2.6.29
1478                                         then
1479                                                 for dev in $(subdevices "${sysblock}")
1480                                                 do
1481                                                         if check_dev "${dev}"
1482                                                         then
1483                                                                 return 0
1484                                                         fi
1485                                                 done
1486                                         fi
1487                                 fi
1488                         done
1489                         ;;
1490
1491                 removable)
1492                         for sysblock in $(echo /sys/block/* | tr ' ' '\n' | grep -vE "/(loop|ram|dm-|fd)")
1493                         do
1494                                 if [ "$(cat ${sysblock}/removable)" = "1" ]
1495                                 then
1496                                         for dev in $(subdevices "${sysblock}")
1497                                         do
1498                                                 if check_dev "${dev}"
1499                                                 then
1500                                                         return 0
1501                                                 fi
1502                                         done
1503                                 fi
1504                         done
1505                         ;;
1506
1507                 *)
1508                         if [ ! -z "${LIVE_MEDIA}" ]
1509                         then
1510                                 if check_dev "null" "${LIVE_MEDIA}" "skip_uuid_check"
1511                                 then
1512                                         return 0
1513                                 fi
1514                         fi
1515                         ;;
1516         esac
1517
1518         # or do the scan of block devices
1519         for sysblock in $(echo /sys/block/* | tr ' ' '\n' | grep -vE "/(loop|ram|dm-|fd)")
1520         do
1521                 devname=$(sys2dev "${sysblock}")
1522                 fstype=$(get_fstype "${devname}")
1523
1524                 if /lib/udev/cdrom_id ${devname} > /dev/null
1525                 then
1526                         if check_dev "null" "${devname}"
1527                         then
1528                                 return 0
1529                         fi
1530                 elif is_nice_device "${sysblock}"
1531                 then
1532                         for dev in $(subdevices "${sysblock}")
1533                         do
1534                                 if check_dev "${dev}"
1535                                 then
1536                                         return 0
1537                                 fi
1538                         done
1539                 elif [ "${fstype}" = "squashfs" -o \
1540                         "${fstype}" = "ext2" -o \
1541                         "${fstype}" = "ext3" -o \
1542                         "${fstype}" = "ext4" -o \
1543                         "${fstype}" = "jffs2" ]
1544                 then
1545                         # This is an ugly hack situation, the block device has
1546                         # an image directly on it.  It's hopefully
1547                         # live-initramfs, so take it and run with it.
1548                         ln -s "${devname}" "${devname}.${fstype}"
1549                         echo "${devname}.${fstype}"
1550                         return 0
1551                 fi
1552         done
1553
1554         return 1
1555 }
1556
1557 set_usplash_timeout ()
1558 {
1559         if [ -x /sbin/usplash_write ]
1560         then
1561                 /sbin/usplash_write "TIMEOUT 120"
1562         else if [ -x /sbin/splashy_update ] ; then
1563                 /sbin/splashy_update "TIMEOUT 120"
1564         fi ; fi
1565 }
1566
1567 integrity_check ()
1568 {
1569         media_mountpoint="${1}"
1570
1571         log_begin_msg "Checking media integrity"
1572
1573         cd ${media_mountpoint}
1574         /bin/md5sum -c md5sum.txt < /dev/tty8 > /dev/tty8
1575         RC="${?}"
1576
1577         log_end_msg
1578
1579         if [ "${RC}" -eq 0 ]
1580         then
1581                 log_success_msg "Everything ok, will reboot in 10 seconds."
1582                 sleep 10
1583                 cd /
1584                 umount ${media_mountpoint}
1585                 sync
1586                 echo u > /proc/sysrq-trigger
1587                 echo b > /proc/sysrq-trigger
1588         else
1589                 panic "Not ok, a media defect is likely, switch to VT8 for details."
1590         fi
1591 }
1592
1593 mountroot ()
1594 {
1595         if [ -x /scripts/local-top/cryptroot ]; then
1596             /scripts/local-top/cryptroot
1597         fi
1598
1599         exec 6>&1
1600         exec 7>&2
1601         exec > live.log
1602         exec 2>&1
1603         tail -f live.log >&7 &
1604         tailpid="${!}"
1605
1606         # Ensure 'panic' function is overridden
1607         . /scripts/live-functions
1608
1609         Arguments
1610
1611         set_usplash_timeout
1612
1613         maybe_break live-premount
1614         log_begin_msg "Running /scripts/live-premount"
1615         run_scripts /scripts/live-premount
1616         log_end_msg
1617
1618         # Needed here too because some things (*cough* udev *cough*)
1619         # changes the timeout
1620
1621         set_usplash_timeout
1622
1623         if [ ! -z "${NETBOOT}" ] || [ ! -z "${FETCH}" ] || [ ! -z "${HTTPFS}" ] || [ ! -z "${FTPFS}" ]
1624         then
1625                 if do_netmount
1626                 then
1627                         livefs_root="${mountpoint}"
1628                 else
1629                         panic "Unable to find a live file system on the network"
1630                 fi
1631         else
1632                 if [ -n "${PLAIN_ROOT}" ] && [ -n "${ROOT}" ]
1633                 then
1634                         # Do a local boot from hd
1635                         livefs_root=${ROOT}
1636                 else
1637                         # Scan local devices for the image
1638                         i=0
1639                         while [ "$i" -lt 60 ]
1640                         do
1641                                 livefs_root=$(find_livefs ${i})
1642
1643                                 if [ -n "${livefs_root}" ]
1644                                 then
1645                                         break
1646                                 fi
1647
1648                                 sleep 1
1649                                 i="$(($i + 1))"
1650                         done
1651                 fi
1652         fi
1653
1654         if [ -z "${livefs_root}" ]
1655         then
1656                 panic "Unable to find a medium containing a live file system"
1657         fi
1658
1659         if [ "${INTEGRITY_CHECK}" ]
1660         then
1661                 integrity_check "${livefs_root}"
1662         fi
1663
1664         if [ "${TORAM}" ]
1665         then
1666                 live_dest="ram"
1667         elif [ "${TODISK}" ]
1668         then
1669                 live_dest="${TODISK}"
1670         fi
1671
1672         if [ "${live_dest}" ]
1673         then
1674                 log_begin_msg "Copying live media to ${live_dest}"
1675                 copy_live_to "${livefs_root}" "${live_dest}"
1676                 log_end_msg
1677         fi
1678
1679         # if we do not unmount the ISO we can't run "fsck /dev/ice" later on
1680         # because the mountpoint is left behind in /proc/mounts, so let's get
1681         # rid of it when running from RAM
1682         if [ -n "$FROMISO" ] && [ "${TORAM}" ]
1683         then
1684           losetup -d /dev/loop0
1685           grep -q /isofrom /proc/mounts && umount /isofrom
1686         fi
1687
1688         if [ -n "${MODULETORAMFILE}" ] || [ -n "${PLAIN_ROOT}" ]
1689         then
1690                 setup_unionfs "${livefs_root}" "${rootmnt}"
1691         else
1692                 mac="$(get_mac)"
1693                 mac="$(echo ${mac} | sed 's/-//g')"
1694                 mount_images_in_directory "${livefs_root}" "${rootmnt}" "${mac}"
1695         fi
1696
1697         log_end_msg
1698
1699         maybe_break live-bottom
1700         log_begin_msg "Running /scripts/live-bottom\n"
1701
1702         run_scripts /scripts/live-bottom
1703         log_end_msg
1704
1705         exec 1>&6 6>&-
1706         exec 2>&7 7>&-
1707         kill ${tailpid}
1708         [ -w "${rootmnt}/var/log/" ] && cp live.log "${rootmnt}/var/log/" 2>/dev/null
1709 }