Magellan Linux

Contents of /trunk/mkinitrd-magellan/livecd/linuxrc.sh

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1793 - (show annotations) (download) (as text)
Mon Apr 2 11:40:49 2012 UTC (12 years ago) by niro
File MIME type: application/x-sh
File size: 6571 byte(s)
-mount move initrd filesystems to real sysroot
1 #!/bin/sh
2 # $Id$
3
4 # loads given kernel modules
5 load_kernel_modules()
6 {
7 local type="$1"
8 local module
9 local args
10
11 echo -e "-- Loading ${type} modules:"
12 ( cat /etc/modules.${type}; echo) | while read module args
13 do
14 case "${module}" in
15 \#*|"") continue ;;
16 esac
17
18 if [ -e /lib/${module}.ko ]
19 then
20 insmod -f /lib/${module}.ko ${args} > /dev/null 2>&1
21 [ $? -eq 0 ] && echo -e "-- ${module}"
22 fi
23 done
24 echo
25 }
26
27 # check_drives $devices $fstype
28 check_drives()
29 {
30 local devices="$1"
31 local fs="$2"
32
33 for dev in ${devices}
34 do
35 mount -t ${fs} ${dev} /sysroot/mnt/cdrom >/dev/null 2>&1
36 media_found=$?
37
38 # if mount was ok check if cdid exists
39 if [ "${media_found}" -eq 0 ]
40 then
41 [ -e /sysroot/mnt/cdrom/livecdrootfs.sqsh ] && media_id_ok=$?
42 umount /sysroot/mnt/cdrom
43
44 if [ "${media_id_ok}" -eq 0 ]
45 then
46 echo -e "Magellan boot device found."
47 BOOT_DEVICE="${dev}"
48 FSTYPE="${fs}"
49 break
50 fi
51 fi
52 done
53 }
54
55 ## some defaults ##
56 DOSCSI=no
57 DOUSB=no
58 DOSATA=yes
59 DOFB=no
60 DOPATA=yes
61 FORCED_ROOTFS=""
62 INITEXEC="/sbin/init"
63 BREAK_ENABLED=no
64 UNIONFS=no
65 UNIONFS_FILE=""
66 CLOOPMOUNTDIR="/sysroot/mnt/cloop"
67
68 ## starts here ##
69
70 # mount essential filesystems
71 mount -t proc proc /proc
72 mount -t sysfs sysfs /sys
73 if [[ -z $(grep '[[:space:]]/dev[[:space:]]' /proc/mounts | cut -d ' ' -f2) ]]
74 then
75 # many video drivers needed exec access
76 fstype=ramfs
77 # tmpfs was suggested by Greg Kroah-Hartman
78 [[ $(grep '[[:space:]]tmpfs' /proc/filesystems | cut -d $'\t' -f2) = tmpfs ]] && fstype=tmpfs
79 # mount devtmpfs if supported
80 [[ $(grep '[[:space:]]devtmpfs' /proc/filesystems | cut -d $'\t' -f2) = devtmpfs ]] && fstype=devtmpfs
81 mount -t ${fstype} dev /dev -o exec,nosuid,mode=0755,size=10M
82 fi
83
84 # install all busybox applets
85 busybox --install -s
86
87 # silencio
88 echo 0 > /proc/sys/kernel/printk
89
90 # check command line for params
91 for i in $(cat /proc/cmdline)
92 do
93 case "${i}" in
94 doscsi) DOSCSI=yes;;
95 noscsi) DOSCSI=no;;
96 dousb) DOUSB=yes;;
97 nousb) DOUSB=no;;
98 dosata) DOSATA=yes ;;
99 nosata) DOSATA=no ;;
100 dofb) DOFB=yes;;
101 nofb) DOFB=no;;
102 dopata) DOPATA=yes;;
103 nopata) DOPATA=no;;
104 rootfs=*) FORCED_ROOTFS="${i#*=}";;
105 init=*) INITEXEC="${i#*=}";;
106 break) BREAK_ENABLED=yes ;;
107 unionfs) UNIONFS=yes;;
108 unionfs_file=*) UNIONFS_FILE="${i#*=}";;
109 rootdelay=*) ROOTDELAY="${i#*=}";;
110 esac
111 done
112
113 # now load all needed modules
114 [ "${DOFB}" = "yes" ] && load_kernel_modules "framebuffer"
115 load_kernel_modules "generic"
116 [ "${DOPATA}" = "yes" ] && load_kernel_modules "pata"
117 [ "${DOSCSI}" = "yes" ] && load_kernel_modules "scsi"
118 [ "${DOUSB}" = "yes" ] && load_kernel_modules "usb"
119 [ "${DOSATA}" = "yes" ] && load_kernel_modules "sata"
120
121 # populate dev
122 mdev -s
123 # handle hotplug events properly
124 echo /sbin/mdev > /proc/sys/kernel/hotplug
125
126 # create newroot mount point
127 mkdir -p /sysroot
128 # fake a new filesystem (also needed with an initramfs!!)
129 mount -t tmpfs tmpfs /sysroot
130
131 mkdir -p /sysroot/mnt/cdrom
132 mkdir -p /sysroot/mnt/cloop
133 mkdir -p /sysroot/mnt/magellan
134
135
136 # needed for the usbstick, the timeout maybe to short
137 if [ "${DOUSB}" = "yes" ]; then
138 echo "-- Waiting 8 seconds for possible usb mount ..."
139 sleep 8
140 fi
141
142 # respect rootdelay kernel param
143 if [ ! -z "${ROOTDELAY}" ]; then
144 echo "-- Requested a rootdelay of ${ROOTDELAY} seconds ..."
145 sleep ${ROOTDELAY}
146 fi
147
148 # searching cdrom with cdid
149 BOOT_DEVICE=""
150 FSTYPE=""
151
152 echo "Searching for a boot device ..."
153
154 # searching usbstick
155 if [ "${DOUSB}" = "yes" ]; then
156 ROOTFS="vfat"
157 [[ ! -z ${FORCED_ROOTFS} ]] && ROOTFS="${FORCED_ROOTFS}"
158 check_drives "/dev/sd*" "${ROOTFS}"
159 check_drives "/dev/sg*" "${ROOTFS}"
160 fi
161
162 # for cdrom_device in $CDROM_LIST (ide)
163 ROOTFS="iso9660"
164 [[ ! -z ${FORCED_ROOTFS} ]] && ROOTFS="${FORCED_ROOTFS}"
165 check_drives "/dev/cdroms/*" "${ROOTFS}"
166 check_drives "/dev/hd*" "${ROOTFS}"
167
168 # scsi cdroms
169 if [ "${DOSCSI}" = "yes" ] || [ "${DOSATA}" = "yes" ]; then
170 ROOTFS="iso9660"
171 [[ ! -z ${FORCED_ROOTFS} ]] && ROOTFS="${FORCED_ROOTFS}"
172 check_drives "/dev/sr*" "${ROOTFS}"
173 check_drives "/dev/sg*" "${ROOTFS}"
174 check_drives "/dev/scd*" "${ROOTFS}"
175 fi
176
177 # mount our rootfs from cdrom
178 if [ "${BOOT_DEVICE}" = "" ]
179 then
180 echo "No Magellan boot CD/USBStick found!!!"
181 ash
182 exit 1
183 else
184 echo -e "Booting from: $BOOT_DEVICE ..."
185 mount -o ro -t "${FSTYPE}" "${BOOT_DEVICE}" /sysroot/mnt/cdrom >/dev/null 2>&1
186
187 # write our boot_device to /mnt/.bootdev for later use (mtab)
188 echo "BOOTDEV=${BOOT_DEVICE}" > /sysroot/.bootdev
189 echo "FSTYPE=${FSTYPE}" >> /sysroot/.bootdev
190
191 # mount squashfs
192 echo -e "Mounting squashfs system image ..."
193 echo
194 [ ! -e /dev/loop0 ] && mknod /dev/loop0 b 7 0
195 mount -o loop,ro -t squashfs /sysroot/mnt/cdrom/livecdrootfs.sqsh "${CLOOPMOUNTDIR}"
196
197 # mount unionfs if enabled
198 if [[ ${UNIONFS} = yes ]]
199 then
200 echo -e "Mounting writeable cdbuffer (unionfs) ..."
201
202 # default setting
203 CLOOPMOUNTDIR="/sysroot/mnt/unionfs"
204 [[ -z ${UNIONFS_FILE} ]] && UNIONFS_FILE="/sysroot/mnt/cdrom/unionfs"
205
206 [[ ! -d /sysroot/mnt/unionfs ]] && install -d /sysroot/mnt/unionfs
207 mount -t unionfs dirs=${UNIONFS_FILE}=rw:/sysroot/mnt/cloop=ro ${CLOOPMOUNTDIR}
208 fi
209
210 # symlinking cloop rootfs to /mnt as newroot
211 cd /sysroot
212
213 for x in bin sbin lib lib64 boot usr opt
214 do
215 [ -d ${CLOOPMOUNTDIR/\/sysroot\//}/${x} ] && ln -s ${CLOOPMOUNTDIR/\/sysroot\//}/${x} ${x}
216 done
217 mkdir -p initrd proc tmp sys var/tmp dev media
218
219 # use devtmpfs if supported
220 if [ "$(grep devtmpfs /proc/filesystems | cut -d$'\t' -f2)" = "devtmpfs" ]
221 then
222 mount -t devtmpfs dev /sysroot/dev
223 else
224 # make /sysroot/dev/console & /mnt/dev/null
225 [ ! -e /sysroot/dev/console ] && mknod -m 600 /sysroot/dev/console c 5 1
226 [ ! -e /sysroot/dev/null ] && mknod -m 666 /sysroot/dev/null c 1 3
227 # only to be safe and to have a log channel
228 [ ! -e /sysroot/dev/tty ] && mknod /sysroot/dev/tty c 5 0
229 # busybox needs this one
230 [ ! -e /sysroot/dev/tty5 ] && mknod /sysroot/dev/tty5 c 4 5
231 fi
232
233 (cd ${CLOOPMOUNTDIR}; cp -a etc root home var /sysroot)
234
235 # ensure that /sysroot/linurc exists
236 [ ! -e /sysroot/linuxrc ] && ln -snf ${INITEXEC} /sysroot/linuxrc
237
238 # ensure the right permissions
239 chmod 1777 /sysroot/tmp
240 chmod 1777 /sysroot/var/tmp
241 fi
242
243 cd /
244
245 # unset hotplug event-manager
246 echo > /proc/sys/kernel/hotplug
247
248 # de-silencio
249 echo 3 > /proc/sys/kernel/printk
250
251 if [[ ${BREAK_ENABLED} = yes ]]
252 then
253 echo "-- Break requested, type 'exit' to resume operation ..."
254 ash
255 fi
256
257 echo "-- Switching to real sysroot ..."
258 mount --move /dev /sysroot/dev
259 mount --move /sys /sysroot/sys
260 mount --move /proc /sysroot/proc
261
262 exec run-init /sysroot ${INITEXEC} $@ </sysroot/dev/console >/sysroot/dev/console