Magellan Linux

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1514 - (show annotations) (download) (as text)
Wed Sep 7 17:45:14 2011 UTC (12 years, 7 months ago) by niro
File MIME type: application/x-sh
File size: 6085 byte(s)
-prefer devtmpfs if supported

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 mount -t tmpfs tmpfs /dev -o rw,mode=0644,size=1024
74
75 # install all busybox applets
76 busybox --install -s
77
78 # silencio
79 echo 0 > /proc/sys/kernel/printk
80
81 # check command line for params
82 for i in $(cat /proc/cmdline)
83 do
84 case "${i}" in
85 doscsi) DOSCSI=yes;;
86 noscsi) DOSCSI=no;;
87 dousb) DOUSB=yes;;
88 nousb) DOUSB=no;;
89 dosata) DOSATA=yes ;;
90 nosata) DOSATA=no ;;
91 dofb) DOFB=yes;;
92 nofb) DOFB=no;;
93 dopata) DOPATA=yes;;
94 nopata) DOPATA=no;;
95 rootfs=*) FORCED_ROOTFS="${i#*=}";;
96 init=*) INITEXEC="${i#*=}";;
97 break) BREAK_ENABLED=yes ;;
98 unionfs) UNIONFS=yes;;
99 unionfs_file=*) UNIONFS_FILE="${i#*=}";;
100 rootdelay=*) ROOTDELAY="${i#*=}";;
101 esac
102 done
103
104 # now load all needed modules
105 [ "${DOFB}" = "yes" ] && load_kernel_modules "framebuffer"
106 load_kernel_modules "generic"
107 [ "${DOPATA}" = "yes" ] && load_kernel_modules "pata"
108 [ "${DOSCSI}" = "yes" ] && load_kernel_modules "scsi"
109 [ "${DOUSB}" = "yes" ] && load_kernel_modules "usb"
110 [ "${DOSATA}" = "yes" ] && load_kernel_modules "sata"
111
112 # populate dev
113 mdev -s
114 # handle hotplug events properly
115 echo /sbin/mdev > /proc/sys/kernel/hotplug
116
117 # create newroot mount point
118 mkdir -p /sysroot
119 # fake a new filesystem (also needed with an initramfs!!)
120 mount -t tmpfs tmpfs /sysroot
121
122 mkdir -p /sysroot/mnt/cdrom
123 mkdir -p /sysroot/mnt/cloop
124 mkdir -p /sysroot/mnt/magellan
125
126
127 # needed for the usbstick, the timeout maybe to short
128 if [ "${DOUSB}" = "yes" ]; then
129 echo "-- Waiting 8 seconds for possible usb mount ..."
130 sleep 8
131 fi
132
133 # respect rootdelay kernel param
134 if [ ! -z "${ROOTDELAY}" ]; then
135 echo "-- Requested a rootdelay of ${ROOTDELAY} seconds ..."
136 sleep ${ROOTDELAY}
137 fi
138
139 # searching cdrom with cdid
140 BOOT_DEVICE=""
141 FSTYPE=""
142
143 echo "Searching for a boot device ..."
144
145 # searching usbstick
146 if [ "${DOUSB}" = "yes" ]; then
147 ROOTFS="vfat"
148 [[ ! -z ${FORCED_ROOTFS} ]] && ROOTFS="${FORCED_ROOTFS}"
149 check_drives "/dev/sd*" "${ROOTFS}"
150 check_drives "/dev/sg*" "${ROOTFS}"
151 fi
152
153 # for cdrom_device in $CDROM_LIST (ide)
154 ROOTFS="iso9660"
155 [[ ! -z ${FORCED_ROOTFS} ]] && ROOTFS="${FORCED_ROOTFS}"
156 check_drives "/dev/cdroms/*" "${ROOTFS}"
157 check_drives "/dev/hd*" "${ROOTFS}"
158
159 # scsi cdroms
160 if [ "${DOSCSI}" = "yes" ] || [ "${DOSATA}" = "yes" ]; then
161 ROOTFS="iso9660"
162 [[ ! -z ${FORCED_ROOTFS} ]] && ROOTFS="${FORCED_ROOTFS}"
163 check_drives "/dev/sr*" "${ROOTFS}"
164 check_drives "/dev/sg*" "${ROOTFS}"
165 check_drives "/dev/scd*" "${ROOTFS}"
166 fi
167
168 # mount our rootfs from cdrom
169 if [ "${BOOT_DEVICE}" = "" ]
170 then
171 echo "No Magellan boot CD/USBStick found!!!"
172 ash
173 exit 1
174 else
175 echo -e "Booting from: $BOOT_DEVICE ..."
176 mount -o ro -t "${FSTYPE}" "${BOOT_DEVICE}" /sysroot/mnt/cdrom >/dev/null 2>&1
177
178 # write our boot_device to /mnt/.bootdev for later use (mtab)
179 echo "BOOTDEV=${BOOT_DEVICE}" > /sysroot/.bootdev
180 echo "FSTYPE=${FSTYPE}" >> /sysroot/.bootdev
181
182 # mount squashfs
183 echo -e "Mounting squashfs system image ..."
184 echo
185 [ ! -e /dev/loop0 ] && mknod /dev/loop0 b 7 0
186 mount -o loop,ro -t squashfs /sysroot/mnt/cdrom/livecdrootfs.sqsh "${CLOOPMOUNTDIR}"
187
188 # mount unionfs if enabled
189 if [[ ${UNIONFS} = yes ]]
190 then
191 echo -e "Mounting writeable cdbuffer (unionfs) ..."
192
193 # default setting
194 CLOOPMOUNTDIR="/sysroot/mnt/unionfs"
195 [[ -z ${UNIONFS_FILE} ]] && UNIONFS_FILE="/sysroot/mnt/cdrom/unionfs"
196
197 [[ ! -d /sysroot/mnt/unionfs ]] && install -d /sysroot/mnt/unionfs
198 mount -t unionfs dirs=${UNIONFS_FILE}=rw:/sysroot/mnt/cloop=ro ${CLOOPMOUNTDIR}
199 fi
200
201 # symlinking cloop rootfs to /mnt as newroot
202 cd /sysroot
203
204 for x in bin sbin lib lib64 boot usr opt
205 do
206 [ -d ${CLOOPMOUNTDIR/\/sysroot\//}/${x} ] && ln -s ${CLOOPMOUNTDIR/\/sysroot\//}/${x} ${x}
207 done
208 mkdir -p initrd proc tmp sys var/tmp dev media
209
210 # use devtmpfs if supported
211 if [ "$(grep devtmpfs /proc/filesystems | cut -d$'\t' -f2)" = "devtmpfs" ]
212 then
213 mount -t devtmpfs dev /sysroot/dev
214 else
215 # make /sysroot/dev/console & /mnt/dev/null
216 [ ! -e /sysroot/dev/console ] && mknod -m 600 /sysroot/dev/console c 5 1
217 [ ! -e /sysroot/dev/null ] && mknod -m 666 /sysroot/dev/null c 1 3
218 # only to be safe and to have a log channel
219 [ ! -e /sysroot/dev/tty ] && mknod /sysroot/dev/tty c 5 0
220 # busybox needs this one
221 [ ! -e /sysroot/dev/tty5 ] && mknod /sysroot/dev/tty5 c 4 5
222 fi
223
224 (cd ${CLOOPMOUNTDIR}; cp -a etc root home var /sysroot)
225
226 # ensure that /sysroot/linurc exists
227 [ ! -e /sysroot/linuxrc ] && ln -snf ${INITEXEC} /sysroot/linuxrc
228
229 # ensure the right permissions
230 chmod 1777 /sysroot/tmp
231 chmod 1777 /sysroot/var/tmp
232 fi
233
234 cd /
235
236 # unset hotplug event-manager
237 echo > /proc/sys/kernel/hotplug
238
239 # de-silencio
240 echo 3 > /proc/sys/kernel/printk
241
242 if [[ ${BREAK_ENABLED} = yes ]]
243 then
244 echo "-- Break requested, type 'exit' to resume operation ..."
245 ash
246 fi
247
248 echo "-- Switching to real sysroot ..."
249 umount /dev
250 umount /sys
251 umount /proc
252
253 exec run-init /sysroot ${INITEXEC} $@ </sysroot/dev/console >/sysroot/dev/console