- fix removal of junk; let bash expand the wildcards
[bootcd.git] / prep.sh
1 #!/bin/bash
2 #
3 # Builds the BootCD reference image, the first of two
4 # initramfs cpio archives that are concatenated together by
5 # isolinux/syslinux to form a custom BootCD.
6 #
7 # Aaron Klingaman <alk@absarokasoft.com>
8 # Mark Huang <mlhuang@cs.princeton.edu>
9 # Copyright (C) 2004-2006 The Trustees of Princeton University
10 #
11 # $Id: prep.sh,v 1.6 2006/05/18 22:18:07 mlhuang Exp $
12 #
13
14 PATH=/sbin:/bin:/usr/sbin:/usr/bin
15
16 # In both a normal CVS environment and a PlanetLab RPM
17 # build environment, all of our dependencies are checked out into
18 # directories at the same level as us.
19 if [ -d ../build ] ; then
20     PATH=$PATH:../build
21     srcdir=..
22 else
23     echo "Error: Could not find sources in either . or .."
24     exit 1
25 fi
26
27 export PATH
28
29 # Release and architecture to install
30 releasever=4
31 basearch=i386
32
33 # Packages to install
34 packagelist=(
35 dev
36 dhclient
37 bash
38 coreutils
39 iputils
40 kernel
41 bzip2
42 diffutils
43 logrotate
44 passwd
45 rsh
46 rsync
47 sudo
48 tcpdump
49 telnet
50 traceroute
51 time
52 wget
53 yum
54 curl
55 gzip
56 python
57 tar
58 pciutils
59 kbd
60 authconfig
61 hdparm
62 lvm
63 lvm2
64 kexec-tools
65 gnupg
66 nano
67 parted
68 pyparted
69 openssh-server
70 openssh-clients
71 ncftp
72 dosfstools
73 dos2unix
74 bind-utils
75 sharutils
76 pycurl
77 )
78
79 # Unnecessary junk
80 junk=(
81 lib/obsolete
82 lib/tls
83 usr/share/cracklib
84 usr/share/emacs
85 usr/share/gnupg
86 usr/share/i18n
87 usr/share/locale
88 usr/share/terminfo
89 usr/share/zoneinfo
90 usr/sbin/build-locale-archive
91 usr/sbin/dbconverter-2
92 usr/sbin/sasl*
93 usr/sbin/tcpslice
94 usr/lib/perl*
95 usr/lib/locale
96 usr/lib/sasl*
97 )
98
99 precious=(
100 usr/share/i18n/locales/en_US
101 usr/share/i18n/charmaps/UTF-8.gz
102 usr/share/locale/en
103 usr/share/terminfo/l/linux
104 usr/share/terminfo/v/vt100
105 usr/share/terminfo/x/xterm
106 usr/share/zoneinfo/UTC
107 usr/lib/locale/en_US.utf8
108 )
109
110 usage()
111 {
112     echo "Usage: prep.sh [OPTION]..."
113     echo "      -r release      Fedora release number (default: $releasever)"
114     echo "      -a arch         Fedora architecture (default: $basearch)"
115     echo "      -h              This message"
116     exit 1
117 }
118
119 # Get options
120 while getopts "r:a:h" opt ; do
121     case $opt in
122         r)
123             releasever=$OPTARG
124             ;;
125         a)
126             basearch=$OPTARG
127             ;;
128         h|*)
129             usage
130             ;;
131     esac
132 done
133
134 # Do not tolerate errors
135 set -e
136
137 # Root of the initramfs reference image
138 bootcd=$PWD/build/bootcd
139 install -d -m 755 $bootcd
140
141 # Write version number
142 rpmquery --specfile bootcd.spec --queryformat '%{VERSION}\n' | head -1 >build/version.txt
143
144 # Install base system
145 for package in "${packagelist[@]}" ; do
146     packages="$packages -p $package"
147 done
148 mkfedora -v -r $releasever -a $basearch -k $packages $bootcd
149
150 pushd $bootcd
151
152 echo "* Removing unnecessary junk"
153
154 # Save precious files
155 tar --ignore-failed-read -cpf precious.tar ${precious[*]}
156
157 # Remove unnecessary junk
158 rm -rf ${junk[*]}
159
160 # Restore precious files
161 tar -xpf precious.tar
162 rm -f precious.tar
163
164 popd
165
166 # Disable all services in reference image
167 chroot $bootcd sh -c "/sbin/chkconfig --list | awk '{ print \$1 }' | xargs -i /sbin/chkconfig {} off"
168
169 # Install configuration files
170 echo "* Installing configuration files"
171 for file in fstab mtab modprobe.conf inittab hosts sysctl.conf ; do
172     install -D -m 644 conf_files/$file $bootcd/etc/$file
173 done
174
175 # Install initscripts
176 echo "* Installing initscripts"
177 for file in pl_sysinit pl_hwinit pl_netinit pl_validateconf pl_boot ; do
178     install -D -m 755 conf_files/$file $bootcd/etc/init.d/$file
179 done
180
181 # Install fallback node configuration file
182 echo "* Installing fallback node configuration file"
183 install -D -m 644 conf_files/default-net.cnf $bootcd/usr/boot/default-net.cnf
184
185 # Build pcitable for hardware detection
186 echo "* Building pcitable for hardware detection"
187 pci_map_file=$(find $bootcd/lib/modules/ -name modules.pcimap | head -1)
188 module_dep_file=$(find $bootcd/lib/modules/ -name modules.dep | head -1)
189 pci_table=$bootcd/usr/share/hwdata/pcitable
190 $srcdir/bootmanager/source/merge_hw_tables.py \
191     $module_dep_file $pci_map_file $pci_table $bootcd/etc/pl_pcitable
192
193 # Copy /etc/passwd out
194 install -D -m 644 $bootcd/etc/passwd build/passwd
195
196 # Root of the isofs
197 isofs=$PWD/build/isofs
198 install -d -m 755 $isofs
199
200 # Copy the kernel out
201 for kernel in $bootcd/boot/vmlinuz-* ; do
202     if [ -f $kernel ] ; then
203         install -D -m 644 $kernel $isofs/kernel
204     fi
205 done
206
207 # initramfs requires that /init be present
208 ln -sf /sbin/init $bootcd/init
209
210 # Pack the rest into a compressed archive
211 echo "* Compressing reference image"
212 (cd $bootcd && find . | cpio --quiet -c -o) | gzip -9 >$isofs/bootcd.img
213
214 # Build syslinux
215 echo "* Building syslinux"
216 CFLAGS="-Werror -Wno-unused -finline-limit=2000" make -C syslinux
217
218 # Install isolinux
219 echo "* Installing isolinux"
220 install -D -m 644 syslinux/isolinux.bin $isofs/isolinux.bin
221
222 exit 0