Magellan Linux

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1512 - (hide annotations) (download) (as text)
Wed Sep 7 17:39:50 2011 UTC (12 years, 8 months ago) by niro
File MIME type: application/x-sh
File size: 5732 byte(s)
-ensure that /sysroot/linurc exists

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