>> 3.1.0b.
[genkernel.git] / gen_initrd.sh
1 #!/bin/bash
2
3 # create_initrd_loop(size)
4 create_initrd_loop() {
5         local inodes
6         [ "$#" -ne '1' ] && gen_die 'create_initrd_loop(): Not enough arguments!'
7         mkdir -p ${TEMP}/initrd-mount ||
8                 gen_die 'Could not create loopback mount directory!'
9         dd if=/dev/zero of=${TEMP}/initrd-${KV} bs=1k count=${1} >> "${DEBUGFILE}" 2>&1 ||
10                 gen_die "Could not zero initrd-${KV}"
11         mke2fs -F -N500 -q "${TEMP}/initrd-${KV}" >> "${DEBUGFILE}" 2>&1 ||
12                 gen_die "Could not format initrd-${KV}!"
13         mount -t ext2 -o loop "${TEMP}/initrd-${KV}" "${TEMP}/initrd-mount" >> "${DEBUGFILE}" 2>&1 ||
14                 gen_die 'Could not mount the initrd filesystem!'
15 }
16
17 create_initrd_unmount_loop()
18 {
19         cd ${TEMP}
20         umount "${TEMP}/initrd-mount" ||
21                 gen_die 'Could not unmount initrd system!'
22 }
23
24 move_initrd_to_loop()
25 {
26         cd "${TEMP}/initrd-temp"
27         mv * "${TEMP}/initrd-mount" >> ${DEBUGFILE} 2>&1
28 }
29
30 create_base_initrd_sys() {
31         rm -rf "${TEMP}/initrd-temp" > /dev/null
32         mkdir -p ${TEMP}/initrd-temp/dev
33         mkdir -p ${TEMP}/initrd-temp/bin
34         mkdir -p ${TEMP}/initrd-temp/etc
35         mkdir -p ${TEMP}/initrd-temp/usr
36         mkdir -p ${TEMP}/initrd-temp/proc
37         mkdir -p ${TEMP}/initrd-temp/temp
38         mkdir -p ${TEMP}/initrd-temp/sys
39         mkdir -p ${TEMP}/initrd-temp/.initrd
40         ln -s bin ${TEMP}/initrd-temp/sbin
41         ln -s ../bin ${TEMP}/initrd-temp/usr/bin
42         ln -s ../bin ${TEMP}/initrd-temp/usr/sbin
43
44         echo "/dev/ram0     /           ext2    defaults" > ${TEMP}/initrd-temp/etc/fstab
45         echo "proc          /proc       proc    defaults    0 0" >> ${TEMP}/initrd-temp/etc/fstab
46
47         echo "REGISTER        .*           MKOLDCOMPAT" > ${TEMP}/initrd-temp/etc/devfsd.conf
48         echo "UNREGISTER      .*           RMOLDCOMPAT" >> ${TEMP}/initrd-temp/etc/devfsd.conf
49         echo "REGISTER        .*           MKNEWCOMPAT" >> ${TEMP}/initrd-temp/etc/devfsd.conf
50         echo "UNREGISTER      .*           RMNEWCOMPAT" >> ${TEMP}/initrd-temp/etc/devfsd.conf
51
52         cd ${TEMP}/initrd-temp/dev
53         MAKEDEV std
54         MAKEDEV console
55
56         cp "${BUSYBOX_BINCACHE}" "${TEMP}/initrd-temp/bin/busybox.bz2" ||
57                 gen_die 'Could not copy busybox from bincache!'
58         bunzip2 "${TEMP}/initrd-temp/bin/busybox.bz2" ||
59                 gen_die 'Could not uncompress busybox!'
60         chmod +x "${TEMP}/initrd-temp/bin/busybox"
61
62         if [ "${NOINITRDMODULES}" = '' ]
63         then
64                 if [ "${PAT}" -gt "4" ]
65                 then
66                         cp "${MODULE_INIT_TOOLS_BINCACHE}" "${TEMP}/initrd-temp/bin/insmod.static.bz2" ||
67                                 gen_die 'Could not copy insmod.static from bincache!'
68                 else
69                         cp "${MODUTILS_BINCACHE}" "${TEMP}/initrd-temp/bin/insmod.static.bz2" ||
70                                 gen_die 'Could not copy insmod.static from bincache'
71                 fi
72
73                 bunzip2 "${TEMP}/initrd-temp/bin/insmod.static.bz2" ||
74                         gen_die 'Could not uncompress insmod.static!'
75                 mv "${TEMP}/initrd-temp/bin/insmod.static" "${TEMP}/initrd-temp/bin/insmod"
76                 chmod +x "${TEMP}/initrd-temp/bin/insmod"
77         fi
78
79         cp "${DEVFSD_BINCACHE}" "${TEMP}/initrd-temp/bin/devfsd.bz2" || gen_die "could not copy devfsd executable from bincache"
80         bunzip2 "${TEMP}/initrd-temp/bin/devfsd.bz2" || gen_die "could not uncompress devfsd"
81         chmod +x "${TEMP}/initrd-temp/bin/devfsd"
82
83         [ "${UDEV}" -eq '1' ] && { tar -jxpf "${UDEV_BINCACHE}" -C "${TEMP}/initrd-temp" ||
84                 gen_die "Could not extract udev binary cache!"; }
85
86 # We make our own devfsd.conf these days, the default one doesn't work with the stripped
87 # down devfsd we use with dietlibc
88 #       cp "${DEVFSD_CONF_BINCACHE}" "${TEMP}/initrd-temp/etc/devfsd.conf.bz2" ||
89 #               gen_die "could not copy devfsd.conf from bincache"
90 #       bunzip2 "${TEMP}/initrd-temp/etc/devfsd.conf.bz2" ||
91 #               gen_die "could not uncompress devfsd.conf"
92
93         # LVM2
94         if [ -e '/sbin/lvm' ] && ldd /sbin/lvm|grep -q 'not a dynamic executable';
95         then
96                 if [ "${CMD_NOLVM2}" != '1' ]
97                 then
98                         cp /sbin/lvm "${TEMP}/initrd-temp/bin/lvm" ||
99                                 gen_die 'Could not copy over lvm!'
100                         ln -sf "${TEMP}/initrd-temp/bin/lvm" "${TEMP}/initrd-temp/bin/vgscan" ||
101                                 gen_die 'Could not symlink lvm -> vgscan!'
102                         ln -sf "${TEMP}/initrd-temp/bin/lvm" "${TEMP}/initrd-temp/bin/vgchange" ||
103                                 gen_die 'Could not symlink lvm -> vgchange!'
104                 fi
105 #       else
106 #               print_warning 1 "initrd: No LVM2 static binaries found; skipping support..."
107         fi
108
109         for i in '[' ash basename cat chroot clear cp dirname echo env false find \
110         grep gunzip gzip ln ls loadkmap losetup lsmod mkdir mknod more mount mv \
111         pivot_root ps awk pwd rm rmdir rmmod sed sh sleep tar test touch true umount uname \
112         xargs yes zcat chmod chown cut kill killall; do
113                 rm -f ${TEMP}/initrd-temp/bin/$i > /dev/null
114                 ln  ${TEMP}/initrd-temp/bin/busybox ${TEMP}/initrd-temp/bin/$i ||
115                         gen_die "Busybox error: could not link ${i}!"
116         done
117 }
118
119 print_list()
120 {
121         local x
122         for x in ${*}
123         do
124                 echo ${x}
125         done
126 }
127
128 create_initrd_modules() {
129         local group
130         local group_modules
131         
132         if [ "${PAT}" -gt "4" ]
133         then
134                 MOD_EXT=".ko"
135         else
136                 MOD_EXT=".o"
137         fi
138
139         print_info 2 "initrd: >> Searching for modules..."
140         if [ "${INSTALL_MOD_PATH}" != '' ]
141         then
142           cd ${INSTALL_MOD_PATH}
143         else
144           cd /
145         fi
146         for i in `gen_dep_list`
147         do
148                 mymod=`find ./lib/modules/${KV} -name "${i}${MOD_EXT}" | head -n 1`
149                 if [ -z "${mymod}" ]
150                 then
151                         print_warning 2 "Warning :: ${i}${MOD_EXT} not found; skipping..."
152                         continue;
153                 fi
154                 print_info 2 "initrd: >> Copying ${i}${MOD_EXT}..."
155                 cp -ax --parents "${mymod}" "${TEMP}/initrd-temp"
156         done
157
158         cp -ax --parents ./lib/modules/${KV}/modules* ${TEMP}/initrd-temp
159
160         mkdir -p "${TEMP}/initrd-temp/etc/modules"
161         for group_modules in ${!MODULES_*}; do
162                 group="$(echo $group_modules | cut -d_ -f2 | tr "[:upper:]" "[:lower:]")"
163                 print_list ${!group_modules} > "${TEMP}/initrd-temp/etc/modules/${group}"
164         done
165 }
166
167 create_initrd_aux() {
168         if [ -f "${GK_SHARE}/${ARCH}/linuxrc" ]
169         then
170                 cp "${GK_SHARE}/${ARCH}/linuxrc" "${TEMP}/initrd-temp/linuxrc"
171         else
172                 cp "${GK_SHARE}/generic/linuxrc" "${TEMP}/initrd-temp/linuxrc"
173         fi
174
175         if [ -f "${GK_SHARE}/${ARCH}/initrd.scripts" ]
176         then
177                 cp "${GK_SHARE}/${ARCH}/initrd.scripts" "${TEMP}/initrd-temp/etc/initrd.scripts"
178         else    
179                 cp "${GK_SHARE}/generic/initrd.scripts" "${TEMP}/initrd-temp/etc/initrd.scripts"
180         fi
181
182         if [ -f "${GK_SHARE}/${ARCH}/initrd.defaults" ]
183         then
184                 cp "${GK_SHARE}/${ARCH}/initrd.defaults" "${TEMP}/initrd-temp/etc/initrd.defaults"
185         else
186                 cp "${GK_SHARE}/generic/initrd.defaults" "${TEMP}/initrd-temp/etc/initrd.defaults"
187         fi
188         
189         echo -n 'HWOPTS="$HWOPTS ' >> "${TEMP}/initrd-temp/etc/initrd.defaults" 
190         for group_modules in ${!MODULES_*}; do
191                 group="$(echo $group_modules | cut -d_ -f2 | tr "[:upper:]" "[:lower:]")"
192                 echo -n "${group} " >> "${TEMP}/initrd-temp/etc/initrd.defaults"
193         done
194         echo '"' >> "${TEMP}/initrd-temp/etc/initrd.defaults"   
195
196         if [ -f "${GK_SHARE}/${ARCH}/modprobe" ]
197         then
198                 cp "${GK_SHARE}/${ARCH}/modprobe" "${TEMP}/initrd-temp/sbin/modprobe"
199         else
200                 cp "${GK_SHARE}/generic/modprobe" "${TEMP}/initrd-temp/sbin/modprobe"
201         fi
202         if isTrue $CMD_DOKEYMAPAUTO
203         then
204                 echo 'MY_HWOPTS="${MY_HWOPTS} keymap"' >> ${TEMP}/initrd-temp/etc/initrd.defaults
205         fi
206         mkdir -p "${TEMP}/initrd-temp/lib/keymaps"
207         tar -C "${TEMP}/initrd-temp/lib/keymaps" -zxf "${GK_SHARE}/generic/keymaps.tar.gz"
208
209         cd ${TEMP}/initrd-temp/sbin && ln -s ../linuxrc init
210         cd ${OLDPWD}
211         chmod +x "${TEMP}/initrd-temp/linuxrc"
212         chmod +x "${TEMP}/initrd-temp/etc/initrd.scripts"
213         chmod +x "${TEMP}/initrd-temp/etc/initrd.defaults"
214         chmod +x "${TEMP}/initrd-temp/sbin/modprobe"
215 }
216
217 calc_initrd_size() {
218         local TEST
219         cd ${TEMP}/initrd-temp/
220         TEST=`du -sk 2> /dev/null` 
221         echo $TEST | cut "-d " -f1
222 }
223
224 create_initrd() {
225         local MOD_EXT
226
227         print_info 1 "initrd: >> Initializing..."
228         create_base_initrd_sys
229
230         if [ "${NOINITRDMODULES}" = '' ]
231         then
232                 print_info 1 "        >> Copying modules..."
233                 create_initrd_modules
234         else
235                 print_info 1 "initrd: Not copying modules..."
236         fi
237
238         print_info 1 "        >> Copying auxilary files..."
239         create_initrd_aux
240
241         INITRD_CALC_SIZE=`calc_initrd_size`
242         INITRD_SIZE=`expr ${INITRD_CALC_SIZE} + 100`
243         print_info 1 "        :: Size is at ${INITRD_SIZE}K"
244
245         print_info 1 "        >> Creating loopback filesystem..."
246         create_initrd_loop ${INITRD_SIZE}
247
248         print_info 1 "        >> Moving initrd files to the loopback..."
249         move_initrd_to_loop
250
251         print_info 1 "        >> Cleaning up and compressing the initrd..."
252         create_initrd_unmount_loop
253
254         if [ "${COMPRESS_INITRD}" ]
255         then
256                 gzip -f -9 ${TEMP}/initrd-${KV}
257                 mv ${TEMP}/initrd-${KV}.gz ${TEMP}/initrd-${KV}
258         fi
259
260         if [ "${BOOTSPLASH}" -eq "1" ]
261         then
262                 if [ -x /sbin/splash ]
263                 then
264                         [ -z "${BOOTSPLASH_THEME}" ] && [ -e /etc/conf.d/bootsplash.conf ] && source /etc/conf.d/bootsplash.conf
265                         [ -z "${BOOTSPLASH_THEME}" ] && [ -e /etc/conf.d/bootsplash ] && source /etc/conf.d/bootsplash
266                         [ -z "${BOOTSPLASH_THEME}" ] && BOOTSPLASH_THEME=default
267                         print_info 1 "        >> Installing bootsplash [ using the ${BOOTSPLASH_THEME} theme ]..."
268                         for bootRes in '800x600' '1024x768' '1280x1024' '1600x1200'
269                         do
270                                 if [ -f "/etc/bootsplash/${BOOTSPLASH_THEME}/config/bootsplash-${bootRes}.cfg" ]
271                                 then
272                                         /sbin/splash -s -f /etc/bootsplash/${BOOTSPLASH_THEME}/config/bootsplash-${bootRes}.cfg >> ${TEMP}/initrd-${KV} ||
273                                                 gen_die "Error: could not copy ${bootRes} bootsplash!"
274                                 else
275                                         print_warning 1 "splash: Did not find a bootsplash for the ${bootRes} resolution..."
276                                 fi
277                         done
278                 else
279                         print_warning 1 '        >> No bootsplash detected; skipping!'
280                 fi
281         fi
282         if ! isTrue "${CMD_NOINSTALL}"
283         then
284                 cp ${TEMP}/initrd-${KV} /boot/initrd-${KV} ||
285                         gen_die 'Could not copy the initrd to /boot!'
286         fi
287 }