Magellan Linux

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1792 - (hide annotations) (download) (as text)
Mon Apr 2 11:39:05 2012 UTC (12 years, 1 month ago) by niro
File MIME type: application/x-sh
File size: 6513 byte(s)
-mount the best available filesystem for /dev
1 niro 532 #!/bin/sh
2 niro 809 # $Id$
3 niro 532
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 niro 663 FSTYPE="${fs}"
49 niro 532 break
50     fi
51     fi
52     done
53     }
54    
55     ## some defaults ##
56     DOSCSI=no
57     DOUSB=no
58 niro 894 DOSATA=yes
59 niro 663 DOFB=no
60 niro 894 DOPATA=yes
61 niro 663 FORCED_ROOTFS=""
62 niro 1180 INITEXEC="/sbin/init"
63 niro 1188 BREAK_ENABLED=no
64 niro 1296 UNIONFS=no
65     UNIONFS_FILE=""
66     CLOOPMOUNTDIR="/sysroot/mnt/cloop"
67 niro 532
68     ## starts here ##
69    
70     # mount essential filesystems
71     mount -t proc proc /proc
72     mount -t sysfs sysfs /sys
73 niro 1792 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 niro 532
84 niro 894 # install all busybox applets
85     busybox --install -s
86    
87 niro 532 # 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 niro 894 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 niro 1180 init=*) INITEXEC="${i#*=}";;
106 niro 1188 break) BREAK_ENABLED=yes ;;
107 niro 1296 unionfs) UNIONFS=yes;;
108     unionfs_file=*) UNIONFS_FILE="${i#*=}";;
109 niro 1513 rootdelay=*) ROOTDELAY="${i#*=}";;
110 niro 532 esac
111     done
112    
113     # now load all needed modules
114 niro 671 [ "${DOFB}" = "yes" ] && load_kernel_modules "framebuffer"
115 niro 532 load_kernel_modules "generic"
116 niro 673 [ "${DOPATA}" = "yes" ] && load_kernel_modules "pata"
117 niro 532 [ "${DOSCSI}" = "yes" ] && load_kernel_modules "scsi"
118     [ "${DOUSB}" = "yes" ] && load_kernel_modules "usb"
119     [ "${DOSATA}" = "yes" ] && load_kernel_modules "sata"
120    
121 niro 894 # populate dev
122     mdev -s
123     # handle hotplug events properly
124     echo /sbin/mdev > /proc/sys/kernel/hotplug
125    
126 niro 532 # 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 niro 1513 # respect rootdelay kernel param
143     if [ ! -z "${ROOTDELAY}" ]; then
144     echo "-- Requested a rootdelay of ${ROOTDELAY} seconds ..."
145     sleep ${ROOTDELAY}
146     fi
147    
148 niro 532 # 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 niro 663 ROOTFS="vfat"
157 niro 706 [[ ! -z ${FORCED_ROOTFS} ]] && ROOTFS="${FORCED_ROOTFS}"
158 niro 663 check_drives "/dev/sd*" "${ROOTFS}"
159     check_drives "/dev/sg*" "${ROOTFS}"
160 niro 532 fi
161    
162     # for cdrom_device in $CDROM_LIST (ide)
163 niro 663 ROOTFS="iso9660"
164 niro 706 [[ ! -z ${FORCED_ROOTFS} ]] && ROOTFS="${FORCED_ROOTFS}"
165 niro 663 check_drives "/dev/cdroms/*" "${ROOTFS}"
166     check_drives "/dev/hd*" "${ROOTFS}"
167 niro 532
168     # scsi cdroms
169     if [ "${DOSCSI}" = "yes" ] || [ "${DOSATA}" = "yes" ]; then
170 niro 663 ROOTFS="iso9660"
171 niro 706 [[ ! -z ${FORCED_ROOTFS} ]] && ROOTFS="${FORCED_ROOTFS}"
172 niro 663 check_drives "/dev/sr*" "${ROOTFS}"
173     check_drives "/dev/sg*" "${ROOTFS}"
174     check_drives "/dev/scd*" "${ROOTFS}"
175 niro 532 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 niro 1296 mount -o loop,ro -t squashfs /sysroot/mnt/cdrom/livecdrootfs.sqsh "${CLOOPMOUNTDIR}"
196 niro 532
197 niro 1296 # 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 niro 532 # symlinking cloop rootfs to /mnt as newroot
211     cd /sysroot
212    
213 niro 605 for x in bin sbin lib lib64 boot usr opt
214 niro 532 do
215 niro 1296 [ -d ${CLOOPMOUNTDIR/\/sysroot\//}/${x} ] && ln -s ${CLOOPMOUNTDIR/\/sysroot\//}/${x} ${x}
216 niro 532 done
217     mkdir -p initrd proc tmp sys var/tmp dev media
218    
219 niro 1514 # 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 niro 532
233 niro 1296 (cd ${CLOOPMOUNTDIR}; cp -a etc root home var /sysroot)
234 niro 532
235 niro 1512 # ensure that /sysroot/linurc exists
236     [ ! -e /sysroot/linuxrc ] && ln -snf ${INITEXEC} /sysroot/linuxrc
237    
238 niro 532 # ensure the right permissions
239     chmod 1777 /sysroot/tmp
240     chmod 1777 /sysroot/var/tmp
241     fi
242    
243     cd /
244    
245 niro 894 # unset hotplug event-manager
246     echo > /proc/sys/kernel/hotplug
247    
248 niro 532 # de-silencio
249     echo 3 > /proc/sys/kernel/printk
250    
251 niro 1188 if [[ ${BREAK_ENABLED} = yes ]]
252     then
253     echo "-- Break requested, type 'exit' to resume operation ..."
254     ash
255     fi
256    
257 niro 532 echo "-- Switching to real sysroot ..."
258 niro 894 umount /dev
259 niro 532 umount /sys
260     umount /proc
261    
262 niro 1180 exec run-init /sysroot ${INITEXEC} $@ </sysroot/dev/console >/sysroot/dev/console