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