]> git.sur5r.net Git - bacula/rescue/blob - rescue/linux/cdrom/mkbootdisk
243a77e5eaed4ecbf10fedfac102003672d89751
[bacula/rescue] / rescue / linux / cdrom / mkbootdisk
1 #!/bin/bash
2
3 # mkbootdisk
4 #
5 # Written by Erik Troan <ewt@redhat.com>
6
7 pause=yes
8 unset kernel
9 device=bootcd.iso
10 unset verbose
11 unset kernelargs
12 unset mountopts
13 unset isoimage
14 unset realdev
15 size=1440
16 failed=0
17 isoimage=1
18 verbose=1
19
20 MOUNTDIR=`mktemp -d /tmp/mkbootdisk.XXXXXX`
21 PATH=/sbin:$PATH
22 export PATH
23
24 VERSION=1.5.2
25
26 usage () {
27     cat >&2 <<EOF
28 usage: `basename $0` [--version] [--noprompt] [--device <devicefile>] 
29        [--verbose -v] [--iso] [--kernelargs <args>] [--size <size>]  <kernel>
30        (ex: `basename $0` --device /dev/fd1 2.0.31)
31 EOF
32     exit $1
33 }
34
35 while [ $# -gt 0 ]; do
36     case $1 in
37         --device)
38             shift
39             device=$1
40             ;;
41         --kernelargs)
42             shift
43             kernelargs=$1
44             ;;
45         --help)
46             usage 0
47             ;;
48         --iso)
49             isoimage=1
50             ;;
51         --size)
52             shift
53             size=$1
54             ;;
55         --noprompt)
56             unset pause
57             ;;
58         -v)
59             verbose=true
60             ;;
61         --verbose)
62             verbose=true
63             ;;
64         --version)
65             echo "mkbootdisk: version $VERSION"
66             exit 0
67             ;;
68         *)
69             if [ -z "$kernel" ]; then
70                 kernel=$1
71             else
72                 usage
73             fi
74             ;;
75     esac
76
77     shift
78 done
79
80 [ -z "$kernel" ] && usage 1
81
82 [ -d /lib/modules/$kernel ] || {
83     echo "/lib/modules/$kernel is not a directory." >&2
84     exit 1
85 }
86
87 [ -f /boot/vmlinuz-$kernel ] || {
88     echo "/boot/vmlinuz-$kernel does not exist." >&2
89     exit 1
90 }
91
92
93 rootdev=`awk '$1 ~ /^[^#]/ && $2 ~ /^\/$/ { print $1 ; exit }' /etc/fstab`
94
95 if [ $(echo $rootdev | cut -c1-6) = "LABEL=" ]; then
96     rootlabel=$(echo $rootdev | cut -c7-)
97
98     # whee, now we have to look through every partition looking for
99     # the thing called $rootlabel, which could be raid. Ick.
100
101     list=$(tail +3 /proc/partitions | awk '{ print $4 '} | grep '^md')
102     list="$list $(tail +3 /proc/partitions | 
103                         awk '{ print $4 '} | grep -v '^md')"
104     rootdev=""
105     for dev in $list; do
106         if tune2fs -l /dev/$dev >/dev/null 2>/dev/null; then
107             label=$(tune2fs -l /dev/$dev 2>/dev/null | 
108                 grep "Filesystem volume name" | awk '{print $4}')
109             if [ "$label" = $rootlabel ]; then
110                 rootdev=/dev/$dev
111                 break
112             fi
113         fi
114     done
115 fi
116
117 if [ -z "$kernelargs" -a -x /sbin/grubby -a -f /boot/grub/grub.conf ]; then
118     # sed gross... this grep's for the args= line and removes the args=" and "$
119     defkernel=$(grubby --default-kernel)
120     if [ -n "$defkernel" ]; then
121         kernelargs=$(grubby --info "$defkernel" |
122                      sed -n '/^args=/{s/^args="//;s/"$//;p;}')
123     fi
124 fi
125
126 [ -z "$rootdev" ] && {
127     echo 'Cannot find root partition in /etc/fstab.' >&2
128     exit 1
129 }
130
131 rm -rf $MOUNTDIR
132 mkdir $MOUNTDIR || {
133     echo "Failed to create $MOUNTDIR" >&2
134     exit 1
135 }
136 [ -d $MOUNTDIR ] || {
137     echo "$MOUNTDIR is not a directory!" >&2
138     exit 1
139 }
140
141 cfgfile=$MOUNTDIR/isolinux/isolinux.cfg
142 bootmsg=$MOUNTDIR/isolinux/boot.msg
143
144 # create an iso image; the directory is all we need
145 [ -n "$verbose" ] && echo -n "Installing isolinux... "
146 mkdir $MOUNTDIR/isolinux
147 cp /usr/lib/syslinux/isolinux.bin $MOUNTDIR/isolinux
148 [ -n "$verbose" ] && echo done
149
150
151 BOOTDESTDIR=$MOUNTDIR/isolinux
152
153 [ -n "$verbose" ] && echo -n "Copying /boot/vmlinuz-$kernel... "
154 cp -p /boot/vmlinuz-$kernel $BOOTDESTDIR/vmlinuz
155 [ $? = 0 ] || failed=1
156 [ -n "$verbose" ] && echo "done."
157
158 [ -n "$verbose" ] && echo -n "Copying /boot/initrd-$kernel.img... "
159 if [ -f /boot/initrd-$kernel.img ]; then
160   cp -p /boot/initrd-$kernel.img $BOOTDESTDIR/initrd.img
161 fi
162 [ $? = 0 ] || failed=1
163 [ -n "$verbose" ] && echo "done."
164
165 [ -n "$verbose" ] && echo -n "Configuring bootloader... "
166
167 [ -f $BOOTDESTDIR/initrd.img ] && INITRDARG="initrd=initrd.img"
168
169 if [ $(echo $rootdev | cut -b 6-9) = "loop" ]; then
170     rootdev=$(ls -l $rootdev | sed 's/,//' | awk '{ printf("%02x%02x\n", $5, $6); }')
171 fi
172
173 cat > $cfgfile <<EOF
174 default linux
175 prompt 1
176 display boot.msg
177 timeout 100
178 label linux
179         kernel vmlinuz
180         append $INITRDARG $kernelargs root=$rootdev
181 EOF
182
183 [ $? = 0 ] || failed=1
184
185 [ -n "$verbose" ] && echo "append $INITRDARG kernelargs=$kernlargs root=$rootdev"
186
187
188 chmod 644 $cfgfile
189
190 if [ -f /etc/redhat-release ]; then
191     title="$(sed 's/ release.*$//' < /etc/redhat-release)"
192 else
193     title="Red Hat Linux"
194 fi
195
196
197 cat >> $bootmsg <<EOF
198
199 Press <return> (or wait 10 seconds) to boot your $title system from
200 $rootdev. You may override the default linux kernel parameters by typing
201 "linux <params>", followed by <return> if you like.
202
203 EOF
204
205 [ $? = 0 ] || failed=1
206
207 [ -n "$verbose" ] && echo "done."
208
209 mkisofs \
210     -A "Red Hat Linux Boot CD" \
211     -V "Red Hat Linux Boot CD" \
212     -J -R -T -quiet \
213     -o $device \
214     -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot \
215        -boot-load-size 4 -boot-info-table $MOUNTDIR
216 rm -rf $MOUNTDIR/*
217 rmdir $MOUNTDIR
218
219
220 if [ $failed -eq 1 ]; then
221   exit 1
222 else
223   exit 0
224 fi