2 # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
3 # ex: ts=8 sw=4 sts=4 et filetype=sh
5 # Licensed under the GPLv2
7 # Copyright 2008-2010, Red Hat, Inc.
8 # Harald Hoyer <harald@redhat.com>
9 # Jeremy Katz <katzj@redhat.com>
13 if getarg rdinitdebug
; then
15 exec 0<>/dev
/console
1<>/dev
/console
2<>/dev
/console
18 while [ $i -lt 10 ]; do
21 [ -z "${j##*Running*}" ] ||
break
25 [ $i -eq 10 ] && kill %1 >/dev
/null
2>&1
27 while pidof
-x /sbin
/loginit
>/dev
/null
2>&1; do
28 for pid
in $
(pidof
-x /sbin
/loginit
); do
29 kill $HARD $pid >/dev
/null
2>&1
39 if [ "$1" = "-n" ]; then
50 if getarg rdshell || getarg rdbreak
; then
51 echo "Dropping to debug shell."
53 export PS1
="$_rdshell_name:\${PWD}# "
54 [ -e /.profile
] ||
echo "exec 0<>/dev/console 1<>/dev/console 2<>/dev/console" > /.profile
57 echo "Boot has failed, sleeping forever."
58 while :; do sleep 365d
;done
62 export PATH
=/sbin
:/bin
:/usr
/sbin
:/usr
/bin
66 trap "emergency_shell Signal caught!" 0
74 mknod
-m 0666 /dev
/null c
1 3
76 # mount some important things
77 mount
-t proc
/proc
/proc
>/dev
/null
2>&1
78 mount
-t sysfs
/sys
/sys
>/dev
/null
2>&1
80 read RDTIMESTAMP _tmp
< /proc
/uptime
83 if [ ! -c /dev
/ptmx
]; then
84 # try to mount devtmpfs
85 if ! mount
-t devtmpfs
-omode=0755 udev
/dev
>/dev
/null
2>&1; then
86 # if it failed fall back to normal tmpfs
87 mount
-t tmpfs
-omode=0755 udev
/dev
>/dev
/null
2>&1
88 # Make some basic devices first, let udev handle the rest
89 mknod
-m 0666 /dev
/null c
1 3
90 mknod
-m 0666 /dev
/ptmx c
5 2
91 mknod
-m 0600 /dev
/console c
5 1
92 mknod
-m 0660 /dev
/kmsg c
1 11
96 ln -s /proc
/self
/fd
/dev
/fd
>/dev
/null
2>&1
98 if getarg rdinitdebug
; then
99 getarg quiet
&& DRACUT_QUIET
="yes"
100 mkfifo /dev
/initlog.pipe
101 /sbin
/loginit
$DRACUT_QUIET </dev
/initlog.pipe
>/dev
/console
2>&1 &
102 exec >/dev
/initlog.pipe
2>&1
104 exec 0<>/dev
/console
1<>/dev
/console
2<>/dev
/console
111 mount
-t devpts
-o gid
=5,mode
=620 devpts
/dev
/pts
>/dev
/null
2>&1
112 mount
-t tmpfs tmpfs
/dev
/shm
>/dev
/null
2>&1
113 mkdir
-m 0755 /dev
/.udev
114 mkdir
-m 0755 /dev
/.udev
/rules.d
116 UDEVVERSION
=$
(udevadm
--version)
118 source_conf
/etc
/conf.d
120 # run scriptlets to parse the command line
121 getarg
'rdbreak=cmdline' && emergency_shell
-n cmdline
"Break before cmdline"
124 [ -z "$root" ] && die
"No or empty root= argument"
125 [ -z "$rootok" ] && die
"Don't know how to handle 'root=$root'"
127 # Network root scripts may need updated root= options,
128 # so deposit them where they can see them (udev purges the env)
131 echo "rflags='$rflags'"
132 echo "fstype='$fstype'"
133 echo "netroot='$netroot'"
134 echo "NEWROOT='$NEWROOT'"
137 # pre-udev scripts run before udev starts, and are run only once.
138 getarg
'rdbreak=pre-udev' && emergency_shell
-n pre-udev
"Break before pre-udev"
141 # start up udev and trigger cold plugs
142 udevd
--daemon --resolve-names=never
144 UDEV_LOG_PRIO_ARG
=--log-priority
145 UDEV_QUEUE_EMPTY
="udevadm settle --timeout=0"
147 if [ $UDEVVERSION -lt 140 ]; then
148 UDEV_LOG_PRIO_ARG
=--log_priority
149 UDEV_QUEUE_EMPTY
="udevadm settle --timeout=1"
152 getarg rdudevinfo
&& udevadm control
$UDEV_LOG_PRIO_ARG=info
153 getarg rdudevdebug
&& udevadm control
$UDEV_LOG_PRIO_ARG=debug
155 getarg
'rdbreak=pre-trigger' && emergency_shell
-n pre-trigger
"Break before pre-trigger"
156 source_all pre-trigger
159 udevadm trigger
--action=add
$udevtriggeropts >/dev
/null
2>&1
161 getarg
'rdbreak=initqueue' && emergency_shell
-n initqueue
"Break before initqueue"
163 RDRETRY
=$
(getarg
'rd_retry=')
164 RDRETRY
=${RDRETRY:-20}
165 RDRETRY
=$
(($RDRETRY*2))
170 check_finished
&& break
174 check_finished
&& break
176 if [ -f /initqueue
/work
]; then
180 for job
in /initqueue
/*.sh
; do
181 [ -e "$job" ] ||
break
183 check_finished
&& break 2
186 $UDEV_QUEUE_EMPTY >/dev
/null
2>&1 ||
continue
188 modprobe scsi_wait_scan
&& rmmod scsi_wait_scan
190 $UDEV_QUEUE_EMPTY >/dev
/null
2>&1 ||
continue
192 for job
in /initqueue-settled
/*.sh
; do
193 [ -e "$job" ] ||
break
195 check_finished
&& break 2
198 $UDEV_QUEUE_EMPTY >/dev
/null
2>&1 ||
continue
200 # no more udev jobs and queues empty.
203 # dirty hack for some cdrom drives,
204 # which report no medium for quiet
206 for cdrom
in /sys
/block
/sr
*; do
207 [ -e "$cdrom" ] ||
continue
208 # skip, if cdrom medium was already found
209 strstr
"$(udevadm info --query=env --path=${cdrom##/sys})" \
210 ID_CDROM_MEDIA
&& continue
211 echo change
> "$cdrom/uevent"
215 [ $i -gt $RDRETRY ] \
216 && { flock
-s 9 ; emergency_shell
"No root device found"; } 9>/.console_lock
221 # pre-mount happens before we try to mount the root filesystem,
223 getarg
'rdbreak=pre-mount' && emergency_shell
-n pre-mount
"Break pre-mount"
227 getarg
'rdbreak=mount' && emergency_shell
-n mount
"Break mount"
228 # mount scripts actually try to mount the root filesystem, and may
229 # be sourced any number of times. As soon as one suceeds, no more are sourced.
232 [ -d "$NEWROOT/proc" ] && break;
233 for f
in /mount
/*.sh
; do
234 [ -f "$f" ] && .
"$f"
235 [ -d "$NEWROOT/proc" ] && break;
240 && { flock
-s 9 ; emergency_shell
"Can't mount root filesystem"; } 9>/.console_lock
244 echo -n "Mounted root filesystem "
245 while read dev mp rest
; do [ "$mp" = "$NEWROOT" ] && echo $dev; done < /proc
/mounts
248 # pre pivot scripts are sourced just before we switch over to the new root.
249 getarg
'rdbreak=pre-pivot' && emergency_shell
-n pre-pivot
"Break pre-pivot"
252 # by the time we get here, the root filesystem should be mounted.
254 for i
in "$(getarg init=)" /sbin
/init
/etc
/init
/init
/bin
/sh
; do
255 [ -f "$NEWROOT$i" -a -x "$NEWROOT$i" ] && { INIT
="$i"; break; }
259 echo "Cannot find init!"
260 echo "Please check to make sure you passed a valid root filesystem!"
264 getarg rdbreak
&& emergency_shell
-n switch_root
"Break before switch_root"
266 # stop udev queue before killing it
267 udevadm control
--stop-exec-queue
270 while pidof udevd
>/dev
/null
2>&1; do
271 for pid
in $
(pidof udevd
); do
272 kill $HARD $pid >/dev
/null
2>&1
277 # Clean up the environment
278 for i
in $
(export -p); do
282 [ "$i" = "root" -o "$i" = "PATH" -o "$i" = "HOME" -o "$i" = "TERM" ] ||
unset $i
287 read CLINE
</proc
/cmdline
288 if getarg init
= >/dev
/null
; then
289 ignoreargs
="console BOOT_IMAGE"
290 # only pass arguments after init= to the init
291 CLINE
=${CLINE#*init=}
295 for s
in $ignoreargs; do
296 [ "${x%%=*}" = $s ] && continue 2
298 initargs
="$initargs $x"
306 [0-9]|s|S|single|emergency|auto
) \
307 initargs
="$initargs $x"
315 if getarg rdcopystate
; then
316 mkdir
/dev
/.initramfs
/
317 cp /tmp
/* /dev
/.initramfs
/ >/dev
/null
2>&1
320 if getarg rd.timestamp
; then
326 info
"Switching root"
333 exec switch_root
"$NEWROOT" "$INIT" $initargs ||
{
334 echo "Something went very badly wrong in the initramfs. Please "
335 echo "file a bug against dracut."