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