- get rid of a lot of unnecessary junk
[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.4 2006/05/16 18:31:32 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 # Save precious files
153 tar --ignore-failed-read -cpf precious.tar "${precious[@]}"
154
155 # Remove unnecessary junk
156 rm -rf "${junk[@]}"
157
158 # Restore precious files
159 tar -xpf precious.tar
160
161 popd
162
163 # Disable all services in reference image
164 chroot $bootcd sh -c "/sbin/chkconfig --list | awk '{ print \$1 }' | xargs -i /sbin/chkconfig {} off"
165
166 # Install configuration files
167 echo "* Installing configuration files"
168 for file in fstab mtab modprobe.conf inittab hosts sysctl.conf ; do
169     install -D -m 644 conf_files/$file $bootcd/etc/$file
170 done
171
172 # Install initscripts
173 echo "* Installing initscripts"
174 for file in pl_sysinit pl_hwinit pl_netinit pl_validateconf pl_boot ; do
175     install -D -m 755 conf_files/$file $bootcd/etc/init.d/$file
176 done
177
178 # Install fallback node configuration file
179 echo "* Installing fallback node configuration file"
180 install -D -m 644 conf_files/default-net.cnf $bootcd/usr/boot/default-net.cnf
181
182 # Build pcitable for hardware detection
183 echo "* Building pcitable for hardware detection"
184 pci_map_file=$(find $bootcd/lib/modules/ -name modules.pcimap | head -1)
185 module_dep_file=$(find $bootcd/lib/modules/ -name modules.dep | head -1)
186 pci_table=$bootcd/usr/share/hwdata/pcitable
187 $srcdir/bootmanager/source/merge_hw_tables.py \
188     $module_dep_file $pci_map_file $pci_table $bootcd/etc/pl_pcitable
189
190 # Copy /etc/passwd out
191 install -D -m 644 $bootcd/etc/passwd build/passwd
192
193 # Root of the isofs
194 isofs=$PWD/build/isofs
195 install -d -m 755 $isofs
196
197 # Copy the kernel out
198 for kernel in $bootcd/boot/vmlinuz-* ; do
199     if [ -f $kernel ] ; then
200         install -D -m 644 $kernel $isofs/kernel
201     fi
202 done
203
204 # initramfs requires that /init be present
205 ln -sf /sbin/init $bootcd/init
206
207 # Pack the rest into a compressed archive
208 echo "* Compressing reference image"
209 (cd $bootcd && find . | cpio --quiet -c -o) | gzip -9 >$isofs/bootcd.img
210
211 # Build syslinux
212 echo "* Building syslinux"
213 CFLAGS="-Werror -Wno-unused -finline-limit=2000" make -C syslinux
214
215 # Install isolinux
216 echo "* Installing isolinux"
217 install -D -m 644 syslinux/isolinux.bin $isofs/isolinux.bin
218
219 exit 0