blob: f6a6b7b616f95b1fa21a04e68b5aa3b3f7d432c7 [file] [log] [blame]
Milton D. Miller IId89d5e02016-01-20 14:57:54 -06001#!/bin/sh
2
Milton Miller54d882e2016-02-05 12:07:53 -06003fslist="proc sys dev run"
Milton D. Miller IId89d5e02016-01-20 14:57:54 -06004rodir=run/initramfs/ro
5rwdir=run/initramfs/rw
6upper=$rwdir/cow
7work=$rwdir/work
8
9cd /
Milton Miller54d882e2016-02-05 12:07:53 -060010mkdir -p $fslist
Milton D. Miller IId89d5e02016-01-20 14:57:54 -060011mount dev dev -tdevtmpfs
12mount sys sys -tsysfs
13mount proc proc -tproc
14if ! grep run proc/mounts
15then
16 mount tmpfs run -t tmpfs -o mode=755,nodev
17fi
18
19mkdir -p $rodir $rwdir
20
21cp -rp init shutdown update whitelist bin sbin usr lib etc var run/initramfs
22
23# To start a interactive shell with job control at this point, run
24# getty 38400 ttyS4
25
26findmtd() {
27 m=$(grep -xl "$1" /sys/class/mtd/*/name)
28 m=${m%/name}
29 m=${m##*/}
30 echo $m
31}
32
Andrew Jefferyacc2c852016-02-23 23:47:23 +103033blkid_fs_type() {
34 # Emulate util-linux's `blkid -s TYPE -o value $1`
35 # Example busybox blkid output:
36 # # blkid /dev/mtdblock5
37 # /dev/mtdblock5: TYPE="squashfs"
38 # Process output to extract TYPE value "squashfs".
39 blkid $1 | sed -e 's/^.*TYPE="//' -e 's/".*$//'
40}
41
42probe_fs_type() {
43 fst=$(blkid_fs_type $1)
44 echo ${fst:=jffs2}
45}
46
Milton Miller06ccb1a2016-02-05 13:04:29 -060047debug_takeover() {
48 echo "$@"
49 test -n "$@" && echo Enter password to try to manually fix.
50 cat << HERE
51After fixing run exit to continue this script, or reboot -f to retry, or
52touch /takeover and exit to become PID 1 allowing editing of this script.
53HERE
54
55 while ! sulogin && ! test -f /takeover
56 do
57 echo getty failed, retrying
58 done
59
60 # Touch /takeover in the above getty to become pid 1
61 if test -e /takeover
62 then
63 cat << HERE
64
65Takeover of init requested. Executing /bin/sh as PID 1.
66When finished exec new init or cleanup and run reboot -f.
67
68Warning: No job control! Shell exit will panic the system!
69HERE
70 export PS1=init#\
71 exec /bin/sh
72 fi
73}
74
Milton D. Miller IIbf7bfd42016-01-27 20:18:16 -060075env=$(findmtd u-boot-env)
76if test -n $env
77then
78 ln -s /dev/$env /run/mtd:u-boot-env
79 cp /run/mtd:u-boot-env /run/fw_env
80fi
81
Milton D. Miller IId89d5e02016-01-20 14:57:54 -060082rofs=$(findmtd rofs)
83rwfs=$(findmtd rwfs)
84
Milton Miller54d882e2016-02-05 12:07:53 -060085rodev=/dev/mtdblock${rofs#mtd}
86rwdev=/dev/mtdblock${rwfs#mtd}
87
Milton Miller0b0d5fe2016-02-23 21:48:48 -060088# Set to y for yes, anything else for no.
89force_rwfst_jffs2=y
90flash_images_before_init=n
91
Milton D. Miller IId89d5e02016-01-20 14:57:54 -060092rofst=squashfs
Andrew Jefferyacc2c852016-02-23 23:47:23 +103093rwfst=$(probe_fs_type $rwdev)
Milton Miller54d882e2016-02-05 12:07:53 -060094roopts=ro
95rwopts=rw
96
Milton Miller0b0d5fe2016-02-23 21:48:48 -060097image=/run/initramfs/image-
98trigger=${image}rwfs
99
Milton Miller54d882e2016-02-05 12:07:53 -0600100init=/sbin/init
Milton Miller0b0d5fe2016-02-23 21:48:48 -0600101fsckbase=/sbin/fsck.
102fsck=$fsckbase$rwfst
Milton Millerb72114c2016-02-06 16:05:06 -0600103fsckopts=-a
Milton D. Miller II1650db52016-02-27 15:48:52 -0600104optfile=/run/initramfs/init-options
105
106if test ! -f $optfile
107then
108 cat /proc/cmdline > $optfile
109fi
Milton D. Miller IId89d5e02016-01-20 14:57:54 -0600110
111echo rofs = $rofs $rofst rwfs = $rwfs $rwfst
112
Milton D. Miller II1650db52016-02-27 15:48:52 -0600113if grep -w debug-init-sh $optfile
Milton D. Miller IId89d5e02016-01-20 14:57:54 -0600114then
Milton Miller06ccb1a2016-02-05 13:04:29 -0600115 debug_takeover "Debug initial shell requested by command line."
Milton D. Miller IId89d5e02016-01-20 14:57:54 -0600116fi
117
Milton D. Miller II1aaffe82016-02-27 17:01:13 -0600118# If there are images in root move them to /run/initramfs/ or /run/ now.
Milton Miller0b0d5fe2016-02-23 21:48:48 -0600119imagebasename=${image##*/}
Milton D. Miller II1aaffe82016-02-27 17:01:13 -0600120if test -n "${imagebasename}" && ls /${imagebasename}* > /dev/null 2>&1
Milton Miller0b0d5fe2016-02-23 21:48:48 -0600121then
Milton D. Miller II1aaffe82016-02-27 17:01:13 -0600122 if test "x$flash_images_before_init" = xy
123 then
124 echo "Flash images found, will update before starting init."
125 mv /${imagebasename}* ${image%$imagebasename}
126 else
127 echo "Flash images found, will use but deferring flash update."
128 mv /${imagebasename}* /run/
129 fi
Milton Miller0b0d5fe2016-02-23 21:48:48 -0600130fi
131
Milton D. Miller II1650db52016-02-27 15:48:52 -0600132if grep -w clean-rwfs-filesystem $optfile
Milton Miller0b0d5fe2016-02-23 21:48:48 -0600133then
134 echo "Cleaning of read-write overlay filesystem requested."
135 touch $trigger
136fi
137
138if test "x$force_rwfst_jffs2" = xy -a $rwfst != jffs2 -a ! -f $trigger
139then
140 echo "Converting read-write overlay filesystem to jffs2 forced."
141 touch $trigger
142fi
143
144if ls $image* > /dev/null 2>&1
145then
146 if ! test -x /update
147 then
148 debug_takeover "Flash update requested but /update missing!"
149 elif test -f $trigger -a ! -s $trigger
150 then
151 echo "Saving selected files from read-write overlay filesystem."
152 /update && rm -f $image*
153 echo "Clearing read-write overlay filesystem."
154 flash_eraseall /dev/$rwfs
155 echo "Restoring saved files to read-write overlay filesystem."
156 touch $trigger
157 /update
158 rm -rf /save $trigger
159 else
160 /update && rm -f $image*
161 fi
162
163 rwfst=$(probe_fs_type $rwdev)
164 fsck=$fsckbase$rwfst
165fi
166
Milton D. Miller IIedfd12c2016-02-27 17:31:39 -0600167if grep -w overlay-filesystem-in-ram $optfile
168then
169 rwfst=none
170fi
171
Milton D. Miller IIc201b042016-02-27 17:31:39 -0600172if grep -w copy-base-filesystem-to-ram $optfile &&
173 test ! -e /run/image-rofs && ! cp $rodev /run/image-rofs
174then
175 # Remove any partial copy to avoid attempted usage later
176 if test -e /run/image-rofs
177 then
178 ls -l /run/image-rofs
179 rm -f /run/image-rofs
180 fi
181 debug_takeover "Copying $rodev to /run/image-rofs failed."
182fi
183
Milton D. Miller IIa36e99c2016-02-27 16:04:32 -0600184if test -s /run/image-rofs
185then
186 rodev=/run/image-rofs
187 roopts=$roopts,loop
188fi
189
Milton Millerb72114c2016-02-06 16:05:06 -0600190mount $rodev $rodir -t $rofst -o $roopts
191
192if test -x $rodir$fsck
193then
194 for fs in $fslist
195 do
196 mount --bind $fs $rodir/$fs
197 done
198 chroot $rodir $fsck $fsckopts $rwdev
199 rc=$?
200 for fs in $fslist
201 do
202 umount $rodir/$fs
203 done
204 if test $rc -gt 1
205 then
206 debug_takeover "fsck of read-write fs on $rwdev failed (rc=$rc)"
207 fi
Milton D. Miller II6dba31f2016-02-27 16:38:16 -0600208elif test "$rwfst" != jffs2 -a "$rwfst" != none
Milton Millerf81c1082016-02-23 21:00:06 -0600209then
Milton Millerb72114c2016-02-06 16:05:06 -0600210 echo "No '$fsck' in read only fs, skipping fsck."
211fi
212
Milton D. Miller II6dba31f2016-02-27 16:38:16 -0600213if test "$rwfst" = none
214then
215 echo "Running with read-write overlay in RAM for this boot."
216 echo "No state will be preserved unless flash update performed."
217elif ! mount $rwdev $rwdir -t $rwfst -o $rwopts
Milton D. Miller IId89d5e02016-01-20 14:57:54 -0600218then
Milton Miller06ccb1a2016-02-05 13:04:29 -0600219 msg="$(cat)" << HERE
220
221Mounting read-write $rwdev filesystem failed. Please fix and run
Andrew Jefferyed5fb272016-02-17 17:19:58 +1030222 mount $rwdev $rwdir -t $rwfst -o $rwopts
Milton Miller06ccb1a2016-02-05 13:04:29 -0600223to to continue, or do change nothing to run from RAM for this boot.
224HERE
225 debug_takeover "$msg"
Milton D. Miller IId89d5e02016-01-20 14:57:54 -0600226fi
227
Milton D. Miller IId89d5e02016-01-20 14:57:54 -0600228rm -rf $work
Milton Millerb72114c2016-02-06 16:05:06 -0600229mkdir -p $upper $work
Milton D. Miller IId89d5e02016-01-20 14:57:54 -0600230
231mount -t overlay -o lowerdir=$rodir,upperdir=$upper,workdir=$work cow /root
232
Milton Miller06ccb1a2016-02-05 13:04:29 -0600233while ! chroot /root /bin/sh -c "test -x '$init' -a -s '$init'"
234do
235 msg="$(cat)" << HERE
236
237Unable to confirm /sbin/init is an executable non-empty file
238in merged file system mounted at /root.
239
240Change Root test failed! Invoking emergency shell.
241HERE
242 debug_takeover "$msg"
243done
Milton D. Miller IId89d5e02016-01-20 14:57:54 -0600244
Milton Miller54d882e2016-02-05 12:07:53 -0600245for f in $fslist
Milton D. Miller IId89d5e02016-01-20 14:57:54 -0600246do
247 mount --move $f root/$f
248done
249
Milton Miller54d882e2016-02-05 12:07:53 -0600250# switch_root /root $init
251exec chroot /root $init
Milton D. Miller IId89d5e02016-01-20 14:57:54 -0600252