don't attempt to build iso before burning
[bootcd.git] / build.sh
1 #!/bin/bash
2
3 set -e
4
5 BOOTCD_VERSION="3.0"
6 FULL_VERSION_STRING="PlanetLab BootCD $BOOTCD_VERSION"
7
8 SYSLINUX_SRC=sources/syslinux-2.11.tar.bz2
9
10 ISO=cd.iso
11
12 CD_ROOT=`pwd`/cdroot
13 ROOT_PASSWD='$1$IdEn2srw$/TfrjZSPUC1xP244YCuIi0'
14
15 BOOTCD_YUM_GROUP=BootCD
16
17 CDRECORD_FLAGS="-v -dao -blank=fast"
18
19 CONF_FILES_DIR=conf_files/
20
21 # location of the uncompressed ramdisk image
22 INITRD=$CD_ROOT/usr/isolinux/initrd
23
24 # temporary mount point for rd
25 INITRD_MOUNT=`pwd`/rd
26
27 # size of the ram disk in MB
28 RAMDISK_SIZE=48
29
30 # the bytes per inode ratio (the -i value in mkfs.ext2) for the ramdisk
31 INITRD_BYTES_PER_INODE=1024
32
33
34 function build_cdroot()
35 {
36     if [ -f $CD_ROOT/.built ]; then
37         echo "cd root already built, skipping"
38         return
39     fi
40
41     clean
42     
43     mkdir -p $CD_ROOT/dev/pts
44     mkdir -p $CD_ROOT/proc
45     mkdir -p $CD_ROOT/etc
46
47     echo "copy fstab and mtab"
48     cp -f $CONF_FILES_DIR/fstab $CD_ROOT/etc/
49     cp -f $CONF_FILES_DIR/mtab $CD_ROOT/etc/
50
51     echo "setup rpm to install only en_US locale and no docs"
52     mkdir -p $CD_ROOT/etc/rpm
53     cp -f $CONF_FILES_DIR/macros $CD_ROOT/etc/rpm
54
55     echo "initialize rpm db"
56     mkdir -p $CD_ROOT/var/lib/rpm
57     rpm --root $CD_ROOT --initdb
58
59     echo "install boot cd base rpms"
60     yum -c yum.conf --installroot=$CD_ROOT -y groupinstall $BOOTCD_YUM_GROUP
61
62     echo "removing unneccessary build files"
63     (cd $CD_ROOT/lib/modules && \
64         find ./ -type d -name build -maxdepth 2 -exec rm -rf {} \;)
65
66     echo "setting up non-ssh authentication"
67     mkdir -p $CD_ROOT/etc/samba
68     chroot $CD_ROOT /usr/sbin/authconfig --nostart --kickstart \
69         --enablemd5 --enableshadow
70
71     echo "setting root password"
72     sed -i "s#root::#root:$ROOT_PASSWD:#g" $CD_ROOT/etc/shadow
73
74     echo "relocate some large directories out of the root system"
75     # get /var/lib/rpm out, its 12mb. create in its place a 
76     # symbolic link to /usr/relocated/var/lib/rpm
77     mkdir -p $CD_ROOT/usr/relocated/var/lib/
78     mv $CD_ROOT/var/lib/rpm $CD_ROOT/usr/relocated/var/lib/
79     (cd $CD_ROOT/var/lib && ln -s ../../usr/relocated/var/lib/rpm rpm)
80
81     # get /lib/tls out
82     mkdir -p $CD_ROOT/usr/relocated/lib
83     mv $CD_ROOT/lib/tls $CD_ROOT/usr/relocated/lib/
84     (cd $CD_ROOT/lib && ln -s ../usr/relocated/lib/tls tls)
85
86     echo "extracting syslinux, copying isolinux files to cd"
87     mkdir -p syslinux
88     mkdir -p $CD_ROOT/usr/isolinux/
89     tar -C syslinux -xjvf $SYSLINUX_SRC
90     find syslinux -name isolinux.bin -exec cp -f {} $CD_ROOT/usr/isolinux/ \;
91
92     echo "moving kernel to isolinux directory"
93     KERNEL=$CD_ROOT/boot/vmlinuz-*
94     mv -f $KERNEL $CD_ROOT/usr/isolinux/kernel
95
96     echo "creating version files"
97     echo "$FULL_VERSION_STRING" > $CD_ROOT/usr/isolinux/pl_version
98     echo "$FULL_VERSION_STRING" > $CD_ROOT/pl_version
99
100     touch $CD_ROOT/.built
101 }
102
103 function build_initrd()
104 {
105     echo "building initrd"
106     rm -f $INITRD
107     rm -f $INITRD.gz
108
109     echo "copy fstab and mtab"
110     cp -f $CONF_FILES_DIR/fstab $CD_ROOT/etc/
111     cp -f $CONF_FILES_DIR/mtab $CD_ROOT/etc/
112
113     echo "installing generic modprobe.conf"
114     cp -f $CONF_FILES_DIR/modprobe.conf $CD_ROOT/etc/
115
116     echo "installing our own inittab and init scripts"
117     cp -f $CONF_FILES_DIR/inittab $CD_ROOT/etc
118     init_scripts="pl_sysinit pl_hwinit pl_netinit pl_validateconf pl_boot"
119     for script in $init_scripts; do
120         cp -f $CONF_FILES_DIR/$script $CD_ROOT/etc/init.d/
121         chmod +x $CD_ROOT/etc/init.d/$script
122     done
123
124     echo "setup basic networking files"
125     cp -f $CONF_FILES_DIR/hosts $CD_ROOT/etc/
126
127     echo "setup default network conf file"
128     mkdir -p $CD_ROOT/usr/boot
129     cp -f $CONF_FILES_DIR/default-net.cnf $CD_ROOT/usr/boot
130
131     echo "copying isolinux configuration files"
132     cp -f $CONF_FILES_DIR/isolinux.cfg $CD_ROOT/usr/isolinux/
133     echo "$FULL_VERSION_STRING" > $CD_ROOT/usr/isolinux/message.txt
134
135     echo "making the isolinux initrd kernel command line match rd size"
136     let INITRD_SIZE_KB=$(($RAMDISK_SIZE * 1024))
137     sed -i "s#ramdisk_size=0#ramdisk_size=$INITRD_SIZE_KB#g" \
138         $CD_ROOT/usr/isolinux/isolinux.cfg
139
140     echo "building pcitable for hardware detection"
141     pci_map_file=`find $CD_ROOT/lib/modules/ -name modules.pcimap | head -1`
142     ./scripts/rewrite-pcitable.py $pci_map_file $CD_ROOT/etc/pl_pcitable
143
144     dd if=/dev/zero of=$INITRD bs=1M count=$RAMDISK_SIZE
145     mkfs.ext2 -F -m 0 -i $INITRD_BYTES_PER_INODE $INITRD
146     mkdir -p $INITRD_MOUNT
147     mount -o loop,rw $INITRD $INITRD_MOUNT
148
149     echo "copy all files except usr to ramdisk"
150     (cd $CD_ROOT && find . -path ./usr -prune -o -print | \
151         cpio -p -d -u $INITRD_MOUNT)
152
153     umount $INITRD_MOUNT
154     rmdir $INITRD_MOUNT
155     
156     echo "compressing ramdisk"
157     gzip $INITRD
158 }
159
160 function build_iso()
161 {
162     echo "building iso"
163     rm -f $ISO
164     mkisofs -o $ISO -R -allow-leading-dots -J -r -b isolinux/isolinux.bin \
165         -c isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table \
166         -V PlanetLab-3-0 $CD_ROOT/usr
167 }
168
169 function burn()
170 {
171     cdrecord $CDRECORD_FLAGS -data $ISO
172 }
173
174 function clean()
175 {
176     echo "removing built files"
177     rm -rf cdroot
178     rm -rf syslinux
179     rm -rf $INITRD_MOUNT
180     rm -f $ISO
181 }
182
183
184 if [ "$1" == "clean" ]; then
185     clean
186     exit
187 fi
188
189 if [ "$1" == "burn" ]; then
190     burn
191     exit
192 fi
193
194 if [ "$1" == "force" ]; then
195     clean
196 fi
197
198 # build base image via yum
199 build_cdroot
200
201 # always build/rebuild initrd
202 build_initrd
203
204 build_iso