Magellan Linux

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1188 - (show annotations) (download) (as text)
Thu Dec 16 01:24:51 2010 UTC (13 years, 4 months ago) by niro
File MIME type: application/x-sh
File size: 5053 byte(s)
-added shell drop-in support into the initrd when 'break' was given on the cmdline
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
65 ## starts here ##
66
67 # mount essential filesystems
68 mount -t proc proc /proc
69 mount -t sysfs sysfs /sys
70 mount -t tmpfs tmpfs /dev -o rw,mode=0644,size=1024
71
72 # install all busybox applets
73 busybox --install -s
74
75 # silencio
76 echo 0 > /proc/sys/kernel/printk
77
78 # check command line for params
79 for i in $(cat /proc/cmdline)
80 do
81 case "${i}" in
82 doscsi) DOSCSI=yes;;
83 noscsi) DOSCSI=no;;
84 dousb) DOUSB=yes;;
85 nousb) DOUSB=no;;
86 dosata) DOSATA=yes ;;
87 nosata) DOSATA=no ;;
88 dofb) DOFB=yes;;
89 nofb) DOFB=no;;
90 dopata) DOPATA=yes;;
91 nopata) DOPATA=no;;
92 rootfs=*) FORCED_ROOTFS="${i#*=}";;
93 init=*) INITEXEC="${i#*=}";;
94 break) BREAK_ENABLED=yes ;;
95 esac
96 done
97
98 # now load all needed modules
99 [ "${DOFB}" = "yes" ] && load_kernel_modules "framebuffer"
100 load_kernel_modules "generic"
101 [ "${DOPATA}" = "yes" ] && load_kernel_modules "pata"
102 [ "${DOSCSI}" = "yes" ] && load_kernel_modules "scsi"
103 [ "${DOUSB}" = "yes" ] && load_kernel_modules "usb"
104 [ "${DOSATA}" = "yes" ] && load_kernel_modules "sata"
105
106 # populate dev
107 mdev -s
108 # handle hotplug events properly
109 echo /sbin/mdev > /proc/sys/kernel/hotplug
110
111 # create newroot mount point
112 mkdir -p /sysroot
113 # fake a new filesystem (also needed with an initramfs!!)
114 mount -t tmpfs tmpfs /sysroot
115
116 mkdir -p /sysroot/mnt/cdrom
117 mkdir -p /sysroot/mnt/cloop
118 mkdir -p /sysroot/mnt/magellan
119
120
121 # needed for the usbstick, the timeout maybe to short
122 if [ "${DOUSB}" = "yes" ]; then
123 echo "-- Waiting 8 seconds for possible usb mount ..."
124 sleep 8
125 fi
126
127 # searching cdrom with cdid
128 BOOT_DEVICE=""
129 FSTYPE=""
130
131 echo "Searching for a boot device ..."
132
133 # searching usbstick
134 if [ "${DOUSB}" = "yes" ]; then
135 ROOTFS="vfat"
136 [[ ! -z ${FORCED_ROOTFS} ]] && ROOTFS="${FORCED_ROOTFS}"
137 check_drives "/dev/sd*" "${ROOTFS}"
138 check_drives "/dev/sg*" "${ROOTFS}"
139 fi
140
141 # for cdrom_device in $CDROM_LIST (ide)
142 ROOTFS="iso9660"
143 [[ ! -z ${FORCED_ROOTFS} ]] && ROOTFS="${FORCED_ROOTFS}"
144 check_drives "/dev/cdroms/*" "${ROOTFS}"
145 check_drives "/dev/hd*" "${ROOTFS}"
146
147 # scsi cdroms
148 if [ "${DOSCSI}" = "yes" ] || [ "${DOSATA}" = "yes" ]; then
149 ROOTFS="iso9660"
150 [[ ! -z ${FORCED_ROOTFS} ]] && ROOTFS="${FORCED_ROOTFS}"
151 check_drives "/dev/sr*" "${ROOTFS}"
152 check_drives "/dev/sg*" "${ROOTFS}"
153 check_drives "/dev/scd*" "${ROOTFS}"
154 fi
155
156 # mount our rootfs from cdrom
157 if [ "${BOOT_DEVICE}" = "" ]
158 then
159 echo "No Magellan boot CD/USBStick found!!!"
160 ash
161 exit 1
162 else
163 echo -e "Booting from: $BOOT_DEVICE ..."
164 mount -o ro -t "${FSTYPE}" "${BOOT_DEVICE}" /sysroot/mnt/cdrom >/dev/null 2>&1
165
166 # write our boot_device to /mnt/.bootdev for later use (mtab)
167 echo "BOOTDEV=${BOOT_DEVICE}" > /sysroot/.bootdev
168 echo "FSTYPE=${FSTYPE}" >> /sysroot/.bootdev
169
170 # mount squashfs
171 echo -e "Mounting squashfs system image ..."
172 echo
173 [ ! -e /dev/loop0 ] && mknod /dev/loop0 b 7 0
174 mount -o loop,ro -t squashfs /sysroot/mnt/cdrom/livecdrootfs.sqsh /sysroot/mnt/cloop
175
176 # symlinking cloop rootfs to /mnt as newroot
177 cd /sysroot
178
179 for x in bin sbin lib lib64 boot usr opt
180 do
181 [ -d mnt/cloop/${x} ] && ln -s mnt/cloop/${x} ${x}
182 done
183 mkdir -p initrd proc tmp sys var/tmp dev media
184
185 # make /sysroot/dev/console & /mnt/dev/null
186 [ ! -e /sysroot/dev/console ] && mknod -m 600 /sysroot/dev/console c 5 1
187 [ ! -e /sysroot/dev/null ] && mknod -m 666 /sysroot/dev/null c 1 3
188 # only to be safe and to have a log channel
189 [ ! -e /sysroot/dev/tty ] && mknod /sysroot/dev/tty c 5 0
190 # busybox needs this one
191 [ ! -e /sysroot/dev/tty5 ] && mknod /sysroot/dev/tty5 c 4 5
192
193 (cd /sysroot/mnt/cloop; cp -a etc root home var /sysroot)
194
195 # ensure the right permissions
196 chmod 1777 /sysroot/tmp
197 chmod 1777 /sysroot/var/tmp
198 fi
199
200 cd /
201
202 # unset hotplug event-manager
203 echo > /proc/sys/kernel/hotplug
204
205 # de-silencio
206 echo 3 > /proc/sys/kernel/printk
207
208 if [[ ${BREAK_ENABLED} = yes ]]
209 then
210 echo "-- Break requested, type 'exit' to resume operation ..."
211 ash
212 fi
213
214 echo "-- Switching to real sysroot ..."
215 umount /dev
216 umount /sys
217 umount /proc
218
219 exec run-init /sysroot ${INITEXEC} $@ </sysroot/dev/console >/sysroot/dev/console