5 # Required-Start: $syslog bootmisc
7 # Should-Start: $local_fs
8 # Should-Stop: halt reboot
9 # X-Stop-After: umountroot
12 # Short-Description: live-boot init script
13 # Description: Resyncs snapshots, evantually caches files in order to
14 # let remove the media.
17 # Authors: Tollef Fog Heen <tfheen@canonical.com>
18 # Marco Amadori <marco.amadori@gmail.com>
20 PATH
=/usr
/sbin
:/usr
/bin
:/sbin
:/bin
22 SCRIPTNAME
=/etc
/init.d
/${NAME}
23 DO_SNAPSHOT
=/sbin
/live-snapshot
24 SNAPSHOT_CONF
="/etc/live/boot.d/snapshot.conf"
26 # Exit if system was not booted by live-boot
27 grep -qs boot
=live
/proc
/cmdline ||
exit 0
29 # Read snapshot configuration variables
30 [ -r ${SNAPSHOT_CONF} ] && .
${SNAPSHOT_CONF}
32 # Load the VERBOSE setting and other rcS variables
33 [ -f /etc
/default
/rcS
] && .
/etc
/default
/rcS
35 # Define LSB log_* functions.
36 # Depend on lsb-base (>= 3.0-6) to ensure that this file is present.
37 .
/lib
/lsb
/init-functions
39 # Try to cache everything we're likely to need after ejecting. This
40 # is fragile and simple-minded, but our options are limited.
47 find "${path}" -type f |
xargs cat > /dev
/null
2>&1
50 if file -L "${path}" |
grep -q 'dynamically linked'
52 # ldd output can be of three forms:
53 # 1. linux-vdso.so.1 => (0x00007fffe3fb4000)
54 # This is a virtual, kernel shared library and we want to skip it
55 # 2. libc.so.6 => /lib/libc.so.6 (0x00007f5e9dc0c000)
56 # We want to cache the third word.
57 # 3. /lib64/ld-linux-x86-64.so.2 (0x00007f5e9df8b000)
58 # We want to cache the first word.
59 ldd
"${path}" |
while read line
61 if echo "$line" |
grep -qs ' => '
64 elif echo "$line" |
grep -qs ' => '
66 lib
=$
(echo "${line}" |
awk '{ print $3 }')
68 lib
=$
(echo "${line}" |
awk '{ print $1 }')
74 cat "${path}" >/dev
/null
2>&1
80 # search in /proc/mounts for the device that is mounted at /live/image
81 while read DEVICE MOUNT REST
83 if [ "${MOUNT}" = "/live/image" ]
91 device_is_USB_flash_drive
()
93 # remove leading "/dev/" and all trailing numbers from input
94 DEVICE
=$
(expr substr
${1} 6 3)
96 # check that device starts with "sd"
97 [ "$(expr substr ${DEVICE} 1 2)" != "sd" ] && return 1
99 # check that the device is an USB device
100 if readlink
/sys
/block
/${DEVICE} |
grep -q usb
110 if ! grep -qs nopersistent
/proc
/cmdline
&& grep -qs persistent
/proc
/cmdline
112 # ROOTSNAP and HOMESNAP are defined in ${SNAPSHOT_CONF} file
113 if [ ! -z "${ROOTSNAP}" ]
115 ${DO_SNAPSHOT} --resync-string="${ROOTSNAP}"
118 if [ ! -z "${HOMESNAP}" ]
120 ${DO_SNAPSHOT} --resync-string="${HOMESNAP}"
125 if [ ! -z "${NETBOOT}" ] ||
grep -qs netboot
/proc
/cmdline ||
grep -qsi root
=/dev
/nfs
/proc
/cmdline ||
grep -qsi root
=/dev
/cifs
/proc
/cmdline
131 if grep -qs toram
/proc
/cmdline
136 # Don't prompt to eject the SD card on Babbage board, where we reuse it
137 # as a quasi-boot-floppy. Technically this uses a bit of ubiquity
138 # (archdetect), but since this is mostly only relevant for
139 # installations, who cares ...
140 if type archdetect
>/dev
/null
2>&1
142 subarch
="$(archdetect)"
152 if [ "${NOPROMPT}" = "Yes" ]
157 for path
in $
(which halt
) $
(which reboot
) /etc
/rc?.d
/etc
/default $
(which stty
) /bin
/plymouth
162 for x
in $
(cat /proc
/cmdline
)
171 mount
-o remount
,ro
/live
/cow
173 if [ -z ${QUICKREBOOT} ]
176 # Exit if the system was booted from an ISO image rather than a physical CD
177 grep -qs find_iso
= /proc
/cmdline
&& return 0
179 BOOT_DEVICE
="$(get_boot_device)"
181 if device_is_USB_flash_drive
${BOOT_DEVICE}
183 # do NOT eject USB flash drives!
184 # otherwise rebooting with most USB flash drives
185 # failes because they actually remember the
186 # "ejected" state even after reboot
187 MESSAGE
="Please remove the USB flash drive"
189 if [ "${NOPROMPT}" = "usb" ]
195 # ejecting is a very good idea here
196 MESSAGE
="Please remove the disc, close the tray (if any)"
198 if [ -x /usr
/bin
/eject
]
200 eject
-p -m /live
/image
>/dev
/null
2>&1
203 if [ ${NOPROMPT} = "cd" ]
210 [ "$prompt" ] ||
return 0
212 if [ -x /bin
/plymouth
] && plymouth
--ping
214 plymouth message
--text="${MESSAGE} and press ENTER to continue:"
215 plymouth watch-keystroke
> /dev
/null
217 stty sane
< /dev
/console
219 printf "\n\n${MESSAGE} and press ENTER to continue:" > /dev
/console
221 read x
< /dev
/console
227 start|restart|reload|force-reload|status
)
228 [ "${VERBOSE}" != no
] && log_end_msg
0
232 log_begin_msg
"${NAME} is resyncing snapshots and caching reboot files..."
237 [ "${VERBOSE}" != no
] && log_end_msg
0
241 [ "${VERBOSE}" != no
] && log_end_msg
1
247 log_success_msg
"Usage: ${SCRIPTNAME} {start|stop|restart|force-reload}" >&2