]>
Commit | Line | Data |
---|---|---|
3e6a3a30 PZ |
1 | #!/bin/bash |
2 | LANG=C | |
3 | ||
4 | PATH=$PATH:/sbin:/usr/sbin | |
81a99973 | 5 | IMAGEUUID=$(date +%Y%m%d%H%M).$(uname -i) |
3e6a3a30 PZ |
6 | |
7 | usage () { | |
8 | echo "usage: mk-images <pkgsrc> <toplevel> <template> <imgdir> <buildarch> <productname> <version> [<productpath>]" | |
9 | exit 0 | |
10 | } | |
11 | ||
12 | DEBUG="" | |
13 | if [ "$1" == "--debug" ]; then | |
14 | DEBUG="--debug" | |
15 | shift | |
16 | fi | |
17 | ||
18 | if [ -z "$1" -o -z "$2" -o -z "$3" -o -z "$4" -o -z "$5" -o -z "$6" -o -z "$7" -o -z "$8" ]; then usage; fi | |
19 | ||
20 | PRODUCT=$6 | |
21 | VERSION=$7 | |
22 | PRODUCTPATH=$8 | |
23 | if [ -n "$9" ]; then | |
24 | BUGURL=$9 | |
25 | fi | |
26 | ||
27 | TOPDIR=$(echo $0 | sed "s,/[^/]*$,,") | |
28 | if [ $TOPDIR = $0 ]; then | |
29 | $TOPDIR="." | |
30 | fi | |
3e6a3a30 PZ |
31 | TOPDIR=$(cd $TOPDIR; pwd) |
32 | ||
81a99973 ER |
33 | # modules that are needed. this is the generic "needed for every arch" stuff |
34 | COMMONMODS="fat vfat nfs sunrpc lockd floppy cramfs loop edd pcspkr squashfs" | |
35 | USBMODS="ohci-hcd uhci-hcd ehci-hcd hid mousedev usb-storage sd_mod sr_mod ub" | |
36 | FIREWIREMODS="ieee1394 ohci1394 sbp2" | |
37 | IDEMODS="ide-cd" | |
38 | SCSIMODS="sr_mod sg st sd_mod scsi_mod iscsi_tcp" | |
39 | FSMODS="fat msdos vfat ext3 reiserfs jfs xfs" | |
40 | LVMMODS="dm-mod dm-zero dm-snapshot dm-mirror" | |
41 | RAIDMODS="md raid0 raid1 raid5 raid6" | |
42 | SECSTAGE="$RAIDMODS $LVMMODS $FSMODS $IDEMODS $SCSIMODS" | |
43 | BTERMMODS="vga16fb" | |
44 | PCMCIASOCKMODS="yenta_socket i82365 tcic pcmcia" | |
45 | INITRDMODS="$USBMODS $FIREWIREMODS $IDEMODS $SCSIMODS $FSMODS $LVMMODS $RAIDMODS $BTERMMODS $COMMONMODS $PCMCIASOCKMODS =scsi =net" | |
46 | ||
3e6a3a30 PZ |
47 | # Set, verify, and create paths |
48 | KERNELPATH=$1 | |
49 | TOPDESTPATH=$2 | |
50 | IMAGEPATH=$TOPDESTPATH/images | |
51 | FULLMODPATH=/tmp/instimagemods.$$ | |
52 | FINALFULLMODPATH=$4/modules | |
53 | INSTIMGPATH=$TOPDESTPATH/$PRODUCTPATH/base | |
54 | INSTIMGTEMPLATE=$3 | |
55 | IMGPATH=$4 | |
56 | KERNELBASE=/tmp/updboot.kernel.$$ | |
57 | MODDEPS=$KERNELBASE/moddeps | |
81a99973 | 58 | MODALIAS=$KERNELBASE/modules.alias |
3e6a3a30 PZ |
59 | BUILDARCH=$5 |
60 | ||
61 | KERNELNAME=vmlinuz | |
62 | ||
63 | if [ "$BUILDARCH" = "ia64" ]; then | |
64 | KERNELDIR="/boot/efi/EFI/redhat" | |
65 | else | |
66 | KERNELDIR="/boot" | |
67 | fi | |
68 | ||
69 | if [ "$BUILDARCH" = "sparc64" ]; then | |
70 | BASEARCH=sparc | |
71 | else | |
72 | BASEARCH=$BUILDARCH | |
73 | fi | |
74 | ||
75 | # explicit block size setting for some arches (FIXME: we compose | |
76 | # ppc64-ish trees as ppc, so we have to set the "wrong" block size) | |
77 | if [ "$BUILDARCH" = "sparc64" ]; then | |
78 | CRAMBS="--blocksize 8192" | |
79 | elif [ "$BUILDARCH" = "sparc" ]; then | |
80 | CRAMBS="--blocksize 4096" | |
81 | else | |
82 | CRAMBS="" | |
83 | fi | |
84 | ||
3e6a3a30 PZ |
85 | if [ $BUILDARCH = x86_64 -o $BUILDARCH = s390x ]; then |
86 | LIBDIR=lib64 | |
87 | else | |
88 | LIBDIR=lib | |
89 | fi | |
90 | ||
3ef72932 ER |
91 | FONTARCH=${BASEARCH} |
92 | if [ $FONTARCH = i686 ]; then | |
93 | FONTARCH=i386 | |
94 | fi | |
95 | ||
3e6a3a30 PZ |
96 | rm -rf $IMAGEPATH |
97 | rm -rf $FULLMODPATH | |
98 | rm -rf $FINALFULLMODPATH | |
99 | rm -rf $KERNELBASE | |
100 | mkdir -p $IMAGEPATH | |
101 | mkdir -p $FULLMODPATH | |
102 | mkdir -p $FINALFULLMODPATH | |
103 | mkdir -p $KERNELBASE | |
104 | mkdir -p $INSTIMGPATH | |
105 | ||
3e6a3a30 | 106 | # Stuff that we need |
81a99973 | 107 | TRIMMODALIAS=$IMGPATH/usr/lib/anaconda-runtime/trimmodalias |
3e6a3a30 | 108 | TRIMPCIIDS=$IMGPATH/usr/lib/anaconda-runtime/trimpciids |
3e6a3a30 PZ |
109 | GETKEYMAPS=$IMGPATH/usr/lib/anaconda-runtime/getkeymaps |
110 | KEYMAPS=/tmp/keymaps-$BUILDARCH.$$ | |
3ef72932 | 111 | SCREENFONT=$IMGPATH/usr/lib/anaconda-runtime/screenfont-${FONTARCH}.gz |
3e6a3a30 PZ |
112 | GETMODDEPS=$IMGPATH/usr/lib/anaconda-runtime/moddeps |
113 | MODLIST=$IMGPATH/usr/lib/anaconda-runtime/modlist | |
114 | MODINFO=$IMGPATH/usr/lib/anaconda-runtime/loader/module-info | |
115 | FILTERMODDEPS=$IMGPATH/usr/lib/anaconda-runtime/filtermoddeps | |
116 | LOADERBINDIR=$IMGPATH/usr/lib/anaconda-runtime/loader | |
117 | BOOTDISKDIR=$IMGPATH/usr/lib/anaconda-runtime/boot | |
118 | LANGTABLE=$IMGPATH/usr/lib/anaconda/lang-table | |
3e6a3a30 | 119 | PCIIDS=$IMGPATH/usr/share/hwdata/pci.ids |
81a99973 ER |
120 | XDRIVERS=$IMGPATH/usr/share/hwdata/videoaliases |
121 | XDRIVERDESCS=$IMGPATH/usr/share/hwdata/videodrivers | |
3e6a3a30 PZ |
122 | CACHE=$KERNELBASE/.cache |
123 | MODULESUSED=$KERNELBASE/modules-used | |
124 | ||
125 | touch $MODULESUSED | |
126 | ||
81a99973 ER |
127 | REQUIREMENTS="$TRIMMODALIAS $TRIMPCIIDS $PCIIDS $XDRIVERDESCS $GETMODDEPS $MODINFO |
128 | $FILTERMODDEPS $LANGTABLE $GETKEYMAPS" | |
3e6a3a30 PZ |
129 | |
130 | dieLater= | |
131 | for n in $REQUIREMENTS; do | |
132 | if [ ! -f $n ]; then | |
133 | echo "$n doesn't exist" | |
134 | dieLater=1 | |
135 | fi | |
136 | done | |
137 | ||
138 | for n in $BOOTDISKDIR; do | |
139 | if [ ! -d $n ]; then | |
140 | echo "$n doesn't exist" | |
141 | dieLater=1 | |
142 | fi | |
143 | done | |
144 | ||
145 | if [ -n "$dieLater" ]; then exit 1; fi | |
146 | ||
147 | if [ "$BUILDARCH" != "s390" -a "$BUILDARCH" != "s390x" ]; then | |
148 | # go ahead and create the keymaps so we only have to do it once | |
149 | if [ -f $IMGPATH/usr/lib/anaconda-runtime/keymaps-override-$BUILDARCH ]; then | |
150 | echo "Found keymap override, using it" | |
151 | cp $IMGPATH/usr/lib/anaconda-runtime/keymaps-override-$BUILDARCH $KEYMAPS | |
152 | else | |
153 | echo "Running: $GETKEYMAPS $BUILDARCH $KEYMAPS $IMGPATH" | |
154 | $GETKEYMAPS $BUILDARCH $KEYMAPS $IMGPATH | |
155 | if [ $? != 0 ]; then | |
156 | echo "Unable to create keymaps and thus can't create initrd." | |
157 | exit 1 | |
158 | fi | |
159 | fi | |
160 | fi | |
161 | ||
162 | findPackage() { | |
163 | dir=$1 | |
164 | name=$2 | |
165 | ||
166 | for n in $dir/$name*{$KERNELARCH,noarch}.rpm; do | |
167 | thisName=$(rpm --nodigest --nosignature --qf '%{NAME}' -qp $n) | |
168 | if [ -z "$thisName" ]; then | |
169 | continue | |
170 | fi | |
171 | if [ $thisName = $name ]; then | |
172 | echo $n | |
173 | return | |
174 | fi | |
175 | done | |
176 | ||
177 | echo "cannot find package $name in path $dir" >&2 | |
178 | } | |
179 | ||
180 | findmodule () { | |
181 | if [ ! -f $CACHE ]; then | |
182 | find $KERNELROOT/lib/modules/ > $CACHE | |
183 | fi | |
184 | ||
185 | grep "/$1\.ko" $CACHE | |
186 | } | |
187 | ||
188 | rundepmod () { | |
189 | what=$1 | |
190 | final=$2 | |
191 | ||
192 | $FAKEARCH /sbin/depmod -a -F $KERNELROOT/boot/System.map-$version \ | |
193 | -b $KERNELROOT $version | |
81a99973 | 194 | mv $KERNELROOT/lib/modules/$version/modules.alias $MODALIAS |
3e6a3a30 PZ |
195 | |
196 | cat $KERNELROOT/lib/modules/$version/modules.dep | $FILTERMODDEPS > $final | |
197 | } | |
198 | ||
199 | getmoddeps () { | |
200 | what=$1 | |
201 | final=$2 | |
202 | ||
203 | for mod in $what ; do | |
204 | mod=$(echo $mod | sed 's/\.ko */|^/g;s/\.ko$//;s/.*\///') | |
205 | egrep $mod $MODDEPS >> $final.foo | |
206 | done | |
207 | mv $final.foo $final | |
208 | } | |
209 | ||
3e6a3a30 PZ |
210 | intcopymodules () { |
211 | dir=$2 | |
212 | ||
213 | for n in $1; do | |
214 | m=$(findmodule $n) | |
215 | if [ -z "$m" ]; then | |
216 | [ -n "$DEBUG" ] && echo "Module $n not found in kernel rpm" >&2 | |
217 | else | |
218 | echo $n >> $MODULESUSED | |
219 | for o in $m ; do | |
220 | echo $n | |
221 | ver=$(echo $o |cut -d / -f 7) | |
222 | myarch=$(echo $o |cut -d / -f 4) | |
223 | if ! [ -d $dir/$ver/$myarch ] ; then mkdir -p $dir/$ver/$myarch ; fi | |
224 | if ! cp $o $dir/$ver/$myarch; then | |
225 | echo "Failed to copy $o to $dir/$ver/$myarch (for module $n)" >&2 | |
226 | fi | |
227 | done | |
228 | fi | |
229 | done | |
230 | } | |
231 | ||
232 | # This loops to make sure it resolves dependencies of dependencies of... | |
233 | resdeps () { | |
234 | items="$*" | |
235 | ||
236 | before=1 | |
237 | after=2 | |
238 | ||
239 | while [ $before != $after ]; do | |
240 | before=`echo $items | wc -c` | |
241 | ||
242 | if [ $? != "0" ] ; then | |
243 | kill -9 $$ | |
244 | fi | |
245 | list=`$GETMODDEPS -m $MODDEPS $items` | |
246 | items=$(for n in $items $list; do echo $n; done | sort -u) | |
247 | after=`echo $items | wc -c` | |
248 | done | |
249 | ||
250 | echo $items | |
251 | } | |
252 | ||
253 | expandModuleSet() { | |
254 | SET="" | |
255 | for name in $1; do | |
256 | char=$(echo $name | cut -c1) | |
257 | if [ $char = '=' ]; then | |
258 | NAME=$(echo $name | cut -c2-) | |
259 | SET="$SET $($MODLIST --modinfo-file $MODINFO $NAME)" | |
260 | elif [ $char = '+' ]; then | |
261 | NAME=$(echo $name | cut -c2-) | |
262 | ||
263 | # all of the modules of this type | |
264 | $MODLIST --modinfo-file $MODINFO $NAME > /tmp/emsAll.$$ | |
265 | # the modules used that are of this type | |
266 | sort -u $MODULESUSED | cat - /tmp/emsAll.$$ | sort | | |
267 | uniq -d > /tmp/emsUsed.$$ | |
268 | # the modules that are of this type, but not used | |
269 | SET="$SET $(cat /tmp/emsAll.$$ /tmp/emsUsed.$$ | sort | uniq -u)" | |
270 | ||
271 | rm -f /tmp/emsAll.$$ /tmp/emsUsed.$$ | |
272 | else | |
273 | SET="$SET $name" | |
274 | fi | |
275 | done | |
276 | ||
277 | echo $SET | |
278 | } | |
279 | ||
280 | makemoduleball() { | |
281 | unset MMB_DD | |
282 | MMB_MODINFO="module-info" | |
283 | MMB_NAME="modules.cgz" | |
284 | ||
285 | while [ x$(echo $1 | cut -c1-2) = x"--" ]; do | |
286 | if [ "$1" = "--dd" ]; then | |
287 | MMB_DD="$2" | |
288 | shift; shift | |
289 | MMB_MODINFO="modinfo" | |
290 | continue | |
291 | elif [ "$1" = "--name" ]; then | |
292 | MMB_NAME="$2" | |
293 | shift; shift | |
294 | continue | |
295 | fi | |
296 | echo "unknown option passed to $0" | |
297 | exit 1 | |
298 | done | |
299 | ||
300 | MMB_DIR=$1 | |
301 | MMB_MODULESET=$(resdeps $2) | |
302 | ||
81a99973 | 303 | rm -rf $MMB_DIR/modules $MMB_DIR/$MMB_NAME $MMB_DIR/modules.dep $MMB_DIR/modules.alias \ |
3e6a3a30 PZ |
304 | $MMB_DIR/modules.pcimap $MMB_DIR/pcitable $MMB_DIR/$MMB_MODINFO \ |
305 | $MMB_DIR/pci.ids | |
306 | mkdir -p $MMB_DIR/modules | |
307 | ||
308 | MMB_MODULESET=$(intcopymodules "$MMB_MODULESET" $MMB_DIR/modules) | |
309 | ||
310 | pushd $MMB_DIR/modules > /dev/null | |
311 | ||
312 | $MODLIST --modinfo-file $MODINFO --ignore-missing --modinfo \ | |
313 | $MMB_MODULESET > ../$MMB_MODINFO | |
314 | ||
315 | getmoddeps "$(find . -name *.ko)" ../modules.dep | |
316 | ||
81a99973 ER |
317 | # create the modules.alias file |
318 | $TRIMMODALIAS $(find . -name *.ko -exec basename {} \;) < $MODALIAS > ../modules.alias | |
3e6a3a30 | 319 | |
81a99973 | 320 | # create the pci.ids, from modules.alias and the X driver aliases |
3e6a3a30 | 321 | awk '!/^(\t\t|#)/ { print ;if ($0 == "ffff Illegal Vendor ID") nextfile; }' < $PCIIDS | \ |
81a99973 | 322 | $TRIMPCIIDS ../modules.alias $XDRIVERS/* > ../pci.ids |
3e6a3a30 PZ |
323 | |
324 | if [ -n "$MMB_DD" ]; then | |
325 | echo $MMB_DD > $MMB_DIR/rhdd | |
326 | fi | |
327 | ||
328 | find . -type f | cpio --quiet -H crc -o | gzip -9 > ../$MMB_NAME | |
329 | cd .. | |
330 | rm -rf modules | |
331 | chmod 644 * | |
332 | popd > /dev/null | |
333 | } | |
334 | ||
3e6a3a30 PZ |
335 | makeproductfile() { |
336 | root=$1 | |
337 | ||
338 | rm -f $root/.buildstamp | |
339 | echo $IMAGEUUID > $root/.buildstamp | |
340 | echo $PRODUCT >> $root/.buildstamp | |
341 | echo $VERSION >> $root/.buildstamp | |
342 | echo $PRODUCTPATH >> $root/.buildstamp | |
343 | if [ -n "$BUGURL" ]; then | |
344 | echo $BUGURL >> $root/.buildstamp | |
345 | fi | |
346 | } | |
347 | ||
348 | setupShellEnvironment() { | |
349 | # setup password/group entries | |
350 | cat > $MBD_DIR/etc/passwd << EOF | |
351 | root::0:0::/:/sbin/loader | |
352 | debug::0:0:debug shell:/:/bin/bash | |
353 | sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin | |
354 | EOF | |
355 | cat > $MBD_DIR/etc/group << EOF | |
356 | root:x:0:root | |
357 | tty:x:5: | |
358 | EOF | |
359 | echo "sshd:x:74:" >> $MBD_DIR/etc/group | |
360 | echo "telnet 23/tcp" > $MBD_DIR/etc/services | |
361 | echo "tcp 6 TCP" > $MBD_DIR/etc/protocols | |
362 | ||
363 | # PAM configuration | |
364 | for i in pam_limits.so pam_env.so pam_unix.so pam_deny.so; do | |
365 | cp -f $IMGPATH/$LIBDIR/security/$i $MBD_DIR/$LIBDIR/security | |
366 | done | |
367 | ||
368 | cp -f $IMGPATH/etc/pam.d/other $MBD_DIR/etc/pam.d | |
369 | cat > $MBD_DIR/etc/pam.d/login << EOF | |
370 | #%PAM-1.0 | |
371 | auth required pam_env.so | |
372 | auth sufficient pam_unix.so likeauth nullok | |
373 | auth required pam_deny.so | |
374 | account required pam_unix.so | |
375 | password sufficient pam_unix.so nullok use_authtok md5 shadow | |
376 | password required pam_deny.so | |
377 | session required pam_limits.so | |
378 | session required pam_unix.so | |
379 | EOF | |
380 | cp -f $MBD_DIR/etc/pam.d/login $MBD_DIR/etc/pam.d/sshd | |
381 | cp -f $MBD_DIR/etc/pam.d/login $MBD_DIR/etc/pam.d/remote | |
382 | ||
383 | cp -f $IMGPATH/etc/security/{limits.conf,pam_env.conf} $MBD_DIR/etc/security/ | |
384 | ||
385 | # setup xinetd for telnet | |
386 | cp -f $IMGPATH/etc/xinetd.conf $MBD_DIR/etc/xinetd.conf | |
387 | mkdir -p $MBD_DIR/etc/xinetd.d | |
388 | cat > $MBD_DIR/etc/xinetd.d/telnet <<EOF | |
389 | service telnet | |
390 | { | |
391 | flags = REUSE | |
392 | socket_type = stream | |
393 | wait = no | |
394 | user = root | |
395 | server = /sbin/in.telnetd | |
396 | log_on_failure += USERID | |
397 | disable = no | |
398 | } | |
399 | EOF | |
400 | ||
401 | # key generation takes ages on s390, you really don't want this for every | |
402 | # installation attempt. These are NOT the keys of the installed system! | |
403 | mkdir -m 0700 -p $MBD_DIR/etc/ssh | |
404 | echo -n "Generating SSH1 RSA host key: " | |
405 | /usr/bin/ssh-keygen -q -t rsa1 -f $MBD_DIR/etc/ssh/ssh_host_key \ | |
406 | -C '' -N '' >&/dev/null | |
407 | echo | |
408 | echo -n "Generating SSH2 RSA host key: " | |
409 | /usr/bin/ssh-keygen -q -t rsa -f $MBD_DIR/etc/ssh/ssh_host_rsa_key \ | |
410 | -C '' -N '' >&/dev/null | |
411 | echo | |
412 | echo -n "Generating SSH2 DSA host key: " | |
413 | /usr/bin/ssh-keygen -q -t dsa -f $MBD_DIR/etc/ssh/ssh_host_dsa_key \ | |
414 | -C '' -N '' >&/dev/null | |
415 | echo | |
416 | (cd $MBD_DIR/etc/ssh; \ | |
417 | chmod 600 ssh_host_key ssh_host_rsa_key ssh_host_dsa_key; \ | |
418 | chmod 644 ssh_host_key.pub ssh_host_rsa_key.pub ssh_host_dsa_key.pub; ) | |
419 | ||
420 | ||
421 | cat > $MBD_DIR/etc/ssh/sshd_config <<EOF | |
422 | Port 22 | |
423 | HostKey /etc/ssh/ssh_host_key | |
424 | HostKey /etc/ssh/ssh_host_rsa_key | |
425 | HostKey /etc/ssh/ssh_host_dsa_key | |
426 | PermitRootLogin yes | |
427 | IgnoreRhosts yes | |
428 | StrictModes yes | |
429 | X11Forwarding yes | |
430 | X11DisplayOffset 10 | |
431 | PrintMotd yes | |
432 | XAuthLocation /sbin/xauth | |
433 | KeepAlive yes | |
434 | SyslogFacility AUTHPRIV | |
435 | RSAAuthentication yes | |
436 | PasswordAuthentication yes | |
437 | PermitEmptyPasswords yes | |
438 | PermitUserEnvironment yes | |
439 | EOF | |
440 | chmod 600 $MBD_DIR/etc/ssh/sshd_config | |
441 | ||
442 | # copy in the binaries | |
72e73543 | 443 | cp -f $IMGPATH/bin/login $MBD_DIR/sbin/login |
3e6a3a30 PZ |
444 | cp -f $IMGPATH/usr/sbin/sshd $MBD_DIR/sbin/sshd |
445 | cp -f $IMGPATH/usr/sbin/xinetd $MBD_DIR/sbin/xinetd | |
446 | cp -f $IMGPATH/usr/sbin/in.telnetd $MBD_DIR/sbin/in.telnetd | |
72e73543 ER |
447 | cp -f $IMGPATH/bin/bash $MBD_DIR/sbin/bash |
448 | cp -f $IMGPATH/bin/busybox $MBD_DIR/sbin/busybox | |
3e6a3a30 PZ |
449 | |
450 | # make some symlinks | |
3ef72932 | 451 | ln -sf bash $MBD_DIR/bin/sh |
3e6a3a30 PZ |
452 | (cd $MBD_DIR/sbin; |
453 | set $(./busybox 2>&1| awk '/^\t([[:alnum:]_\[]+,)+/' | sed 's/,//g' | sed 's/ +//'); | |
454 | while [ -n "$1" ]; do | |
455 | if [ $1 != "busybox" -a $1 != "sh" ]; then | |
456 | # if file doesnt already exist, link to busybox | |
457 | if [ ! -f "$1" ]; then | |
458 | ln -sf ./busybox $1 | |
459 | else | |
460 | [ -n "$DEBUG" ] && echo "Overriding busybox version of $1" | |
461 | fi | |
462 | fi | |
463 | shift | |
464 | done ) | |
465 | ||
466 | # and copy libraries too | |
467 | mkdir -p $MBD_DIR/$LIBDIR | |
468 | for lib in $IMGPATH/$LIBDIR/libc.so* \ | |
469 | $IMGPATH/$LIBDIR/libc-*.so* \ | |
470 | $IMGPATH/$LIBDIR/ld-*.so* \ | |
471 | $IMGPATH/$LIBDIR/ld.so* \ | |
472 | $IMGPATH/$LIBDIR/ld64.so* \ | |
473 | $IMGPATH/$LIBDIR/libtermcap.so* \ | |
474 | $IMGPATH/$LIBDIR/libpam.so* \ | |
475 | $IMGPATH/$LIBDIR/libdl.so* \ | |
476 | $IMGPATH/$LIBDIR/libdl-*.so* \ | |
477 | $IMGPATH/$LIBDIR/libnss_files* \ | |
478 | $IMGPATH/$LIBDIR/libnsl* \ | |
479 | $IMGPATH/$LIBDIR/libutil.so* \ | |
480 | $IMGPATH/$LIBDIR/libutil-*.so* \ | |
481 | $IMGPATH/$LIBDIR/libcrypt*so* \ | |
482 | $IMGPATH/$LIBDIR/libselinux*so* \ | |
483 | $IMGPATH/$LIBDIR/libsepol*so* \ | |
484 | $IMGPATH/$LIBDIR/libattr*so* \ | |
485 | $IMGPATH/$LIBDIR/libresolv.so* \ | |
486 | $IMGPATH/$LIBDIR/libresolv-*.so* \ | |
487 | $IMGPATH/$LIBDIR/libm.so* \ | |
488 | $IMGPATH/$LIBDIR/libm-*.so* \ | |
489 | $IMGPATH/usr/$LIBDIR/libz.so* \ | |
490 | $IMGPATH/$LIBDIR/libssl* \ | |
491 | $IMGPATH/$LIBDIR/libcom_err* \ | |
492 | $IMGPATH/$LIBDIR/libe2p* \ | |
493 | $IMGPATH/$LIBDIR/libuuid* \ | |
494 | $IMGPATH/usr/$LIBDIR/libwrap*.so* \ | |
495 | $IMGPATH/usr/X11R6/$LIBDIR/libX11.so* \ | |
496 | $IMGPATH/usr/X11R6/$LIBDIR/libXmuu.so* \ | |
497 | $IMGPATH/usr/X11R6/$LIBDIR/libXext.so* \ | |
498 | $IMGPATH/usr/X11R6/$LIBDIR/libXt.so* \ | |
499 | $IMGPATH/usr/X11R6/$LIBDIR/libSM.so* \ | |
500 | $IMGPATH/usr/X11R6/$LIBDIR/libICE.so* ; do | |
501 | if [ -e $lib ]; then cp -df $lib $MBD_DIR/$LIBDIR/ ; fi | |
502 | done | |
503 | ||
504 | mkdir -p $MBD_DIR/usr/$LIBDIR | |
505 | for lib in $IMGPATH/usr/$LIBDIR/libkrb5.so* \ | |
506 | $IMGPATH/usr/$LIBDIR/libkrb5support.so* \ | |
507 | $IMGPATH/usr/$LIBDIR/libgssapi_krb5.so* \ | |
508 | $IMGPATH/usr/$LIBDIR/libk5crypto.so* \ | |
509 | $IMGPATH/usr/$LIBDIR/libcom_err.so* ; do | |
510 | if [ -e $lib ]; then cp -df $lib $MBD_DIR/usr/$LIBDIR/ ; fi | |
511 | done | |
512 | } | |
513 | ||
514 | makeinitrd() { | |
515 | EXTRAINITRDPATH="" | |
3e6a3a30 PZ |
516 | INITRDSIZE="" |
517 | KEEP="" | |
518 | PADSIZE="" | |
519 | LOADERBIN="" | |
520 | INITRDMODULES="" | |
521 | MODULEBALLNAME="modules.cgz" | |
522 | MYLANGTABLE=$LANGTABLE | |
523 | MYLOADERTR=loader.tr | |
3e6a3a30 PZ |
524 | while [ x$(echo $1 | cut -c1-2) = x"--" ]; do |
525 | if [ $1 = "--initrdto" ]; then | |
526 | EXTRAINITRDPATH=$2 | |
527 | shift; shift | |
528 | continue | |
3e6a3a30 PZ |
529 | elif [ $1 = "--keep" ]; then |
530 | KEEP=yes | |
531 | shift | |
532 | continue | |
533 | elif [ $1 = "--initrdsize" ]; then | |
534 | INITRDSIZE=$2 | |
535 | shift; shift | |
536 | continue | |
537 | elif [ $1 = "--loaderbin" ]; then | |
538 | LOADERBIN=$2 | |
539 | shift; shift | |
540 | continue | |
541 | elif [ $1 = "--modules" ]; then | |
542 | INITRDMODULES=$2 | |
543 | shift; shift | |
544 | continue | |
545 | elif [ $1 = "--moduleballname" ]; then | |
546 | MODULEBALLNAME=$2 | |
547 | shift; shift | |
548 | continue | |
3e6a3a30 PZ |
549 | fi |
550 | echo "Unknown option passed to makeinitrd" | |
551 | exit 1 | |
552 | done | |
553 | if [ -z "$LOADERBIN" ]; then | |
554 | echo "no loader binary specified!" >&2 | |
555 | exit 1 | |
556 | fi | |
557 | if [ -z "$INITRDMODULES" ]; then | |
558 | echo "warning: no loader modules specified!" >&2 | |
559 | fi | |
560 | if [ -z "$INITRDSIZE" ]; then | |
561 | echo "I don't know how big to make the initrd image!" >&2 | |
562 | exit 1 | |
563 | fi | |
564 | ||
565 | MBD_DIR=/tmp/makebootdisk.dir.$$ | |
566 | MBD_FSIMAGE=/tmp/makebootdisk.initrdimage.$$ | |
567 | MBD_BOOTTREE=/tmp/makebootdisk.tree.$$ | |
568 | ||
569 | rm -rf $MBD_DIR MBD_FSIMAGE | |
570 | mkdir -p $MBD_DIR/modules | |
571 | mkdir -p $MBD_DIR/sbin | |
572 | mkdir -p $MBD_DIR/dev | |
573 | mkdir -p $MBD_DIR/etc | |
574 | mkdir -p $MBD_DIR/proc | |
575 | mkdir -p $MBD_DIR/selinux | |
576 | mkdir -p $MBD_DIR/sys | |
577 | mkdir -p $MBD_DIR/tmp | |
578 | mkdir -p $MBD_DIR/etc/terminfo/{a,b,d,l,s,v,x} | |
579 | mkdir -p $MBD_DIR/var/state | |
580 | mkdir -p $MBD_DIR/var/run | |
581 | mkdir -p $MBD_DIR/var/lock/rpm | |
582 | ||
583 | if [ "$BUILDARCH" = "ppc" -o "$BUILDARCH" = "ppc64" ]; then | |
584 | mkdir -p $MBD_DIR/dev/iseries | |
585 | fi | |
586 | ||
587 | if [ "$BUILDARCH" = "s390" -o "$BUILDARCH" = "s390x" ]; then | |
588 | mkdir -m 111 -p $MBD_DIR/var/empty/sshd | |
589 | mkdir -p $MBD_DIR/etc/{pam.d,security} | |
590 | mkdir -p $MBD_DIR/$LIBDIR/security | |
591 | cp $IMGPATH/$LIBDIR/libpam_misc.so.0.* $MBD_DIR/$LIBDIR/libpam_misc.so.0 | |
592 | ln -s /tmp $MBD_DIR/var/state/xkb | |
593 | cp $IMGPATH/usr/X11R6/bin/xauth $MBD_DIR/sbin/xauth | |
594 | cp $IMGPATH/usr/sbin/cmsfs* $MBD_DIR/sbin/ | |
595 | fi | |
596 | ||
597 | if [ -n "$INITRDMODULES" ]; then | |
598 | MODSET=`expandModuleSet "$INITRDMODULES"` | |
599 | makemoduleball --name $MODULEBALLNAME $MBD_DIR/modules "$MODSET" | |
600 | fi | |
601 | ||
602 | cat > $MBD_DIR/etc/passwd << EOF | |
603 | root::0:0:root:/:/bin/bash | |
604 | EOF | |
605 | ||
606 | # set up the arch bits | |
607 | echo $arch > $MBD_DIR/etc/arch | |
608 | ||
609 | install -s -m 755 $LOADERBINDIR/$LOADERBIN $MBD_DIR/sbin/loader | |
81a99973 | 610 | strip $MBD_DIR/sbin/loader |
3e6a3a30 PZ |
611 | if [ "$BUILDARCH" != "s390" -a "$BUILDARCH" != "s390x" ]; then |
612 | install -s -m 755 $LOADERBINDIR/init $MBD_DIR/sbin | |
81a99973 | 613 | strip $MBD_DIR/sbin/init |
3e6a3a30 PZ |
614 | ln -s ./init $MBD_DIR/sbin/shutdown |
615 | ln -s ./init $MBD_DIR/sbin/halt | |
616 | ln -s ./init $MBD_DIR/sbin/poweroff | |
617 | else | |
618 | install -s -m 755 $LOADERBINDIR/shutdown $MBD_DIR/sbin/shutdown | |
619 | install -m 755 $IMGPATH/usr/lib/anaconda-runtime/loader/linuxrc.s390 $MBD_DIR/sbin/init | |
620 | install -m 755 $IMGPATH/usr/sbin/dasdfmt $MBD_DIR/sbin/dasdfmt | |
621 | fi | |
622 | ||
623 | if [ "$BUILDARCH" != "s390" -a "$BUILDARCH" != "s390x" ]; then | |
624 | install -m 644 $KEYMAPS $MBD_DIR/etc/keymaps.gz | |
625 | install -m 644 $SCREENFONT $MBD_DIR/etc/screenfont.gz | |
626 | fi | |
627 | install -m 644 $MYLANGTABLE $MBD_DIR/etc/lang-table | |
628 | ||
629 | install -m 644 $LOADERBINDIR/$MYLOADERTR $MBD_DIR/etc/loader.tr | |
630 | for i in a/ansi d/dumb l/linux s/screen v/vt100 v/vt100-nav v/vt102 x/xterm x/xterm-color b/bterm g/gnome ; do | |
631 | [ -f $IMGPATH/usr/share/terminfo/$i ] && \ | |
632 | install -m 644 $IMGPATH/usr/share/terminfo/$i $MBD_DIR/etc/terminfo/$i | |
633 | done | |
634 | ||
635 | makeproductfile $MBD_DIR | |
636 | ||
3e6a3a30 PZ |
637 | for n in insmod rmmod modprobe; do |
638 | ln -s loader $MBD_DIR/sbin/$n | |
639 | done | |
640 | ||
641 | ln -s /usr/bin/sh $MBD_DIR/sbin/sh | |
642 | ln -s /sbin/init $MBD_DIR/init | |
643 | ln -s /proc/mounts $MBD_DIR/etc/mtab | |
644 | ln -s sbin $MBD_DIR/bin | |
81a99973 ER |
645 | mkdir -p $MBD_DIR/var/lib |
646 | ln -s ../../tmp $MBD_DIR/var/lib/xkb | |
3e6a3a30 PZ |
647 | |
648 | # s390/s390x need sshd/telnet setup | |
649 | if [ "$BUILDARCH" = "s390" -o "$BUILDARCH" = "s390x" ]; then | |
650 | setupShellEnvironment | |
651 | fi | |
652 | ||
653 | cat > $MBD_DIR/.profile <<EOF | |
654 | PATH=/bin:/usr/bin:/usr/sbin:/usr/X11R6/bin:/mnt/sysimage/sbin:/mnt/sysimage/usr/sbin:/mnt/sysimage/bin:/mnt/sysimage/usr/bin | |
655 | export PATH | |
656 | EOF | |
657 | ||
658 | rm -f $MBD_FSIMAGE | |
659 | (cd $MBD_DIR; find . |cpio --quiet -c -o) |gzip -9 > $MBD_FSIMAGE | |
660 | ||
661 | size=$(du $MBD_FSIMAGE | awk '{ print $1 }') | |
662 | ||
663 | echo "Wrote $MBD_FSIMAGE (${size}k compressed)" | |
664 | ||
665 | if [ -n "$EXTRAINITRDPATH" ]; then | |
666 | mkdir -p `dirname $EXTRAINITRDPATH` | |
667 | cp -a $MBD_FSIMAGE $EXTRAINITRDPATH | |
668 | fi | |
669 | ||
670 | if [ -z "$KEEP" ]; then | |
671 | rm -rf $MBD_FSIMAGE $MBD_BOOTTREE | |
672 | fi | |
673 | } | |
674 | ||
3e6a3a30 PZ |
675 | makeinstimage () { |
676 | imagename=$1 | |
81a99973 | 677 | type=$2 |
3e6a3a30 PZ |
678 | tmpdir=/tmp/instimage.dir.$$ |
679 | ||
680 | rm -rf $tmpimage $tmpdir | |
681 | mkdir -p $mntpoint $tmpdir | |
682 | ||
683 | mkdir -p $tmpdir | |
684 | (cd $INSTIMGTEMPLATE; find . | cpio --quiet -p $tmpdir) | |
3e6a3a30 PZ |
685 | makeproductfile $tmpdir |
686 | ||
81a99973 ER |
687 | if [ -z "$type" -o "$type" = "cramfs" ]; then |
688 | echo "Running mkcramfs $CRAMBS $tmpdir $INSTIMGPATH/${imagename}2.img" | |
689 | mkfs.cramfs $CRAMBS $tmpdir /tmp/${imagename}2.img.$$ | |
690 | elif [ "$type" = "squashfs" ]; then | |
691 | echo "Running mksquashfs $tmpdir /tmp/${imagename}2.img -all-root" | |
692 | mksquashfs $tmpdir /tmp/${imagename}2.img.$$ -all-root | |
693 | chmod 0644 /tmp/${imagename}2.img.$$ | |
694 | fi | |
3e6a3a30 PZ |
695 | cp /tmp/${imagename}2.img.$$ $INSTIMGPATH/${imagename}2.img |
696 | size=$(ls -l $INSTIMGPATH/${imagename}2.img | awk '{print $5}') | |
697 | size=$(expr $size / 1024) | |
698 | echo "Wrote $INSTIMGPATH/${imagename}2.img (${size}k)..." | |
699 | rm -rf $tmpdir | |
700 | } | |
701 | ||
3e6a3a30 PZ |
702 | makemainimage () { |
703 | imagename=$1 | |
704 | type=$2 | |
705 | mmi_tmpimage=/tmp/instimage.img.$$ | |
706 | mmi_mntpoint=/tmp/instimage.mnt.$$ | |
707 | ||
708 | rm -rf $mmi_tmpimage $mmi_mntpoint | |
709 | mkdir $mmi_mntpoint | |
710 | ||
711 | if [ $type = "ext2" ]; then | |
712 | SIZE=$(du -sk $IMGPATH | awk '{ print int($1 * 1.1) }') | |
713 | if [ -d $IMGPATH/usr/lib/anaconda-runtime ]; then | |
714 | ERROR=$(du -sk $IMGPATH/usr/lib/anaconda-runtime | awk '{ print $1 }') | |
715 | SIZE=$(expr $SIZE - $ERROR) | |
716 | fi | |
717 | dd if=/dev/zero bs=1k count=${SIZE} of=$mmi_tmpimage 2>/dev/null | |
718 | mke2fs -q -F $mmi_tmpimage > /dev/null | |
719 | tune2fs -c0 -i0 $mmi_tmpimage >/dev/null | |
720 | mount -o loop $mmi_tmpimage $mmi_mntpoint | |
721 | ||
722 | (cd $IMGPATH; find . | fgrep -v "./usr/lib/anaconda-runtime" | | |
723 | cpio -H crc -o) | (cd $mmi_mntpoint; cpio -iumd) | |
724 | makeproductfile $mmi_mntpoint | |
725 | umount $mmi_mntpoint | |
726 | rmdir $mmi_mntpoint | |
81a99973 ER |
727 | elif [ $type = "squashfs" ]; then |
728 | makeproductfile $IMGPATH | |
729 | echo "Running mksquashfs $IMGPATH $mmi_tmpimage -all-root" | |
730 | mksquashfs $IMGPATH $mmi_tmpimage -all-root | |
731 | chmod 0644 $mmi_tmpimage | |
732 | SIZE=$(expr `cat $mmi_tmpimage | wc -c` / 1024) | |
3e6a3a30 PZ |
733 | elif [ $type = "cramfs" ]; then |
734 | makeproductfile $IMGPATH | |
735 | echo "Running mkcramfs $CRAMBS $IMGPATH $mmi_tmpimage" | |
81a99973 | 736 | mkfs.cramfs $CRAMBS $IMGPATH $mmi_tmpimage |
3e6a3a30 PZ |
737 | SIZE=$(expr `cat $mmi_tmpimage | wc -c` / 1024) |
738 | fi | |
739 | ||
740 | cp $mmi_tmpimage $INSTIMGPATH/${imagename}.img | |
741 | chmod 644 $INSTIMGPATH/${imagename}.img | |
742 | ||
743 | echo "Wrote $INSTIMGPATH/${imagename}.img (${SIZE}k)" | |
744 | ||
745 | rm $mmi_tmpimage | |
746 | } | |
747 | ||
81a99973 ER |
748 | makeSecondStage() { |
749 | echo "Building minstg.img" | |
750 | makeinstimage "minstg" "squashfs" | |
751 | [ $? = 0 ] || exit 1 | |
752 | echo "Building stage2.img" | |
753 | makemainimage "stage2" "squashfs" | |
754 | [ $? = 0 ] || exit 1 | |
755 | } | |
3e6a3a30 | 756 | |
81a99973 ER |
757 | doPostImages() { |
758 | /bin/true | |
3e6a3a30 PZ |
759 | } |
760 | ||
761 | # source the architecture specific mk-images file so we can call functions | |
762 | # in it | |
763 | if [ ${BUILDARCH} = s390x ]; then | |
764 | # FIXME: this is a bad hack for s390, but better than copying for now | |
765 | source $TOPDIR/mk-images.s390 | |
3ef72932 ER |
766 | elif [ ${BUILDARCH} = i686 ]; then |
767 | source $TOPDIR/mk-images.i386 | |
3e6a3a30 PZ |
768 | else |
769 | source $TOPDIR/mk-images.${BUILDARCH} | |
770 | fi | |
771 | ||
772 | # Find the kernel, unpack it, and verify it | |
81a99973 | 773 | kerneltags="kernel" |
3e6a3a30 PZ |
774 | if [ "$BUILDARCH" = "ppc" -o "$BUILDARCH" = "ppc64" ]; then |
775 | arches="ppc64pseries ppc64 ppc64iseries ppc" | |
3ef72932 ER |
776 | elif [ "$BUILDARCH" = "i686" ]; then |
777 | arches="i386 i586 i686" | |
81a99973 ER |
778 | kerneltags="kernel kernel-xenU" |
779 | elif [ "$BUILDARCH" = "x86_64" ]; then | |
780 | arches="x86_64" | |
781 | kerneltags="kernel kernel-xenU" | |
3e6a3a30 PZ |
782 | else |
783 | arches="$BUILDARCH" | |
784 | fi | |
81a99973 | 785 | |
3e6a3a30 PZ |
786 | foundakernel="" |
787 | for KERNELARCH in $arches; do | |
81a99973 ER |
788 | for kernelvers in $kerneltags; do |
789 | kpackage=$(findPackage $KERNELPATH $kernelvers) | |
3e6a3a30 PZ |
790 | if [ "$KERNELARCH" = "i586" -a ! -f "$kpackage" ]; then |
791 | echo "No i586 kernel, trying i686..." | |
792 | KERNELARCH="i686" | |
81a99973 | 793 | kpackage=$(findPackage $KERNELPATH $kernelvers) |
3e6a3a30 PZ |
794 | fi |
795 | ||
796 | if [ ! -f "$kpackage" ]; then | |
81a99973 | 797 | echo "kernel ($kernelvers) doesn't exist for $KERNELARCH. skipping" |
3e6a3a30 PZ |
798 | continue |
799 | fi | |
800 | ||
801 | KERNELROOT=$KERNELBASE/$KERNELARCH | |
81a99973 | 802 | mkdir -p $KERNELROOT/lib/modules/misc |
3e6a3a30 PZ |
803 | |
804 | foundakernel="yes" | |
805 | ||
81a99973 | 806 | if [ "${kernelvers}" = "kernel-xenU" ]; then kerneltag="xenU" ; fi |
3e6a3a30 | 807 | |
81a99973 | 808 | version=$(rpm --nodigest --nosignature --qf '%{VERSION}-%{RELEASE}' -qp $kpackage)${kerneltag} |
3e6a3a30 PZ |
809 | arch=$(rpm --nodigest --nosignature --qf '%{ARCH}\n' -qp $kpackage) |
810 | echo "unpacking $kpackage.$arch" | |
811 | ||
812 | rpm2cpio $kpackage | (cd $KERNELROOT; cpio --quiet -iumd) | |
3e6a3a30 PZ |
813 | |
814 | if [ ! -d "$KERNELROOT/lib/modules/$version" ]; then | |
815 | echo "$KERNELROOT/lib/modules/$version is not a valid modules directory" 2>&1 | |
816 | exit 1 | |
817 | fi | |
818 | ||
819 | if [ ! -f "$KERNELROOT/$KERNELDIR/${KERNELNAME}-$version" ]; then | |
820 | echo "$KERNELROOT/$KERNELDIR/${KERNELNAME}-$version does not exist" | |
821 | exit 1 | |
822 | fi | |
823 | ||
3e6a3a30 PZ |
824 | allmods=$(find $KERNELROOT/lib/modules/$version -name *.ko) |
825 | ||
826 | rundepmod "$allmods" $MODDEPS | |
827 | find $KERNELROOT/lib/modules/$version > $CACHE | |
828 | ||
829 | # make the boot images | |
830 | makeBootImages | |
831 | done | |
832 | done | |
833 | ||
81a99973 ER |
834 | doPostImages |
835 | ||
3e6a3a30 PZ |
836 | # do some clean up before making the cramfs of the second stage |
837 | rm -rf $INSTIMGTEMPLATE/usr/lib/anaconda-runtime $INSTIMGTEMPLATE/usr/lib/syslinux $IMGPATH/usr/lib/syslinux | |
838 | ||
839 | if [ -n "$foundakernel" ]; then | |
840 | # make the second stage | |
841 | find $KERNELBASE/*/lib/modules/ > $CACHE | |
842 | makeSecondStage | |
843 | rm -rf $KERNELBASE | |
844 | fi | |
845 | ||
846 | cd $TOPDIR |