1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362
|
# bootcd2disk.lib
# vim: set filetype=sh :
### Functions ###
cleanup()
{
echo "ignoring trap"
}
check_kern()
{
KERN_YES="y"
[ "$INITRD" ] && KERN_YES="[m|y]" # if initrd is used, a kernel-module is enough
date "+--- $0 %d.%m.%Y ---" > $ERRLOG
[ "$SCRIPT" ] || echo "To see full output: tail -f $ERRLOG" | tee -a $ERRLOG
# only call the function, if it is defined
doit=$(egrep "^[[:space:]]*(function)*[[:space:]]*do_first" $CONFDIR/bootcd2disk.conf)
if [ ! -z "$doit" ]; then
echo "--- do function do_first ---" | tee -a $ERRLOG
do_first
fi
}
check_auto()
{
if [ "$GRUB" != "" ]; then
if [ -f /sbin/grub -o -f /usr/sbin/grub ]; then
# ignore LILO
LILO=""
elif [ "$GRUB" = "auto" ]; then
GRUB=""
# if GRUB is manual defined but /sbin/grub does not exist, the user will see an ERROR later
fi
fi
if [ "$GRUB" = "auto" ]; then
[ "$DISK0" = "auto" ] || err "If you define GRUB=auto, you have to define DISK0=auto too."
fi
if [ "$SFDISK0" != "auto" ]; then
[ "$EXT2FS" = "auto" ] && warn "To define EXT2FS=auto makes only sence if you define SFDISK0=auto too"
[ "$SWAP" = "auto" ] && warn "To define SWAP=auto makes only sence if you define SFDISK0=auto too"
fi
if [ "$EXT2FS" != "auto" ]; then
[ "$MOUNT" = "auto" ] && warn "To define MOUNT=auto makes only sence if you define EXT2FS=auto too"
[ "$UMOUNT" = "auto" ] && warn "To define UMOUNT=auto makes only sence if you define EXT2FS=auto too"
[ "$FSTAB" = "auto" ] && warn "To define FSTAB=auto makes only sence if you define EXT2FS=auto too"
[ "$LILO" = "auto" ] && warn "To define LILO=auto makes only sence if you define EXT2FS=auto too"
[ "$GRUB" = "auto" ] && warn "To define GRUB=auto makes only sence if you define EXT2FS=auto too"
fi
}
check_DISK0()
{
if [ "$DISK0" = "auto" ]; then
get_disk
for i in $DISKVARS; do
eval "SFDISKOPTS$i=\"\""
[ "$(eval "echo \"\$DISK$i\"")" ] || err "Could not automatically calculate DISK$i"
done
[ "$VERBOSE" ] && eval "echo \"DISK$i=<\$DISK$i>\""
else
s="\([^[:space:]]\+\)[[:space:]]*\(.*\)"
for i in $DISKVARS; do
eval "DISK$i=\"$(eval "echo \"\$DISK$i\"" | sed "s/$s/\1/")\""
eval "SFDISKOPTS$i=\"$(eval "echo \"\$DISK$i\"" | sed "s/$s/\2/")\""
if [ "$(eval "echo \"\$SFDISKOPTS$i\"")" ]; then
eval "echo \"DISK$i=<\$DISK$i> SFDISKOPTS$i=<\$SFDISKOPTS$i>\"" >>$ERRLOG
[ "$VERBOSE" ] && eval "echo \"DISK$i=<\$DISK$i> SFDISKOPTS$i=<\$SFDISKOPTS$i>\""
fi
done
fi
}
check_SFDISK0()
{
BOOTS=50
if [ "$SFDISK0" = "auto" ]; then
[ -b "$DISK0" ] || err \
"If you define SFDISK=auto, please define DISK as auto or <block-device>"
MEMS=`free | grep Mem | awk '{print $2}'`
SWAPS=$(expr 2 \* $MEMS / 1024)
SFDISK0="
,$BOOTS
,$SWAPS,S
;
"
echo "auto SFDISK0=<$SFDISK0>" >>$ERRLOG
[ "$VERBOSE" ] && echo "SFDISK0=<$SFDISK0>"
fi
}
check_EXT2_EXT3()
{
if [ "$EXT2FS" = "auto" ]; then
[ -b "$DISK0" ] || err "If you define EXT2FS=auto, please define DISK0 as auto or <block-device>"
EXT2FS="DISK0P1 DISK0P3"
fi
EXT2FS=$(disk2real "$EXT2FS")
echo "EXT2FS=<$EXT2FS>" >>$ERRLOG
[ "$VERBOSE" ] && echo "EXT2FS=<$EXT2FS>"
[ "$EXT3" = "no" ] && return
KCONF=`echo "$KERNEL" | sed "s/vmlinu./config/"`
PROBLEM="
To use EXT3 some kernel options are needed. It seems not all needed
Options are build in the kernel."
if [ "$KCONF" ]; then
for i in \
"CONFIG_EXT3_FS=$KERN_YES"
do
grep -q "^$i" $KCONF
if [ $? != 0 ]; then
if [ "$EXT3" = "yes" ]; then
warn "CONFIG_EXT3_FS is not configured.$PROBLEM"
else
echo "CONFIG_EXT3_FS is not configured.$PROBLEM" >>$ERRLOG
echo " => EXT3=no" >>$ERRLOG
EXT3=no
return
fi
fi
done
fi
PROBLEM="
To use EXT3 a new version of e2fsprogs has to be installed. For example
the file /sbin/mkfs.ext3 must exist."
if [ ! -f "/sbin/mkfs.ext3" ]; then
if [ "$EXT3" = "yes" ]; then
warn "/sbin/mkfs.ext3 not found.$PROBLEM"
else
echo "/sbin/mkfs.ext3 not found.$PROBLEM" >>$ERRLOG
echo " => EXT3=no" >>$ERRLOG
EXT3=no
return
fi
fi
[ "$EXT3" = "auto" ] && EXT3="yes"
}
read_thisboot()
{
# GRUBBOOTDIR is no longer required. (Not needed by grub-install)
[ "$(set | grep ^GRUBBOOTDIR=)" ] || GRUBBOOTDIR=""
# RESTORECMD may be not defined in bootcd2disk.conf
[ "$(set | grep ^RESTORECMD=)" ] || RESTORECMD=""
CREATEVARS="KERNEL INITRD DISABLE_CRON ARCH"
unset $CREATEVARS
[ -f /etc/bootcd/thisbootcd.conf ] && . /etc/bootcd/thisbootcd.conf
[ ! -f /etc/bootcd/thisbootcd.conf ] &&
err "No file /etc/bootcd/thisbootcd.conf"
for i in $CREATEVARS; do
[ "`set | grep ^$i=`" ] || err "$i is not set in /etc/bootcd/thisbootcd.conf"
done
}
# This function calculates a list of disks used in bootcd2disk.conf
# For example if DISK0, DISK1 and DISK2 it will calculate DISKVARS will
# contain 0, 1 and 2
getdiskvars()
{
DISKVARS="$(set | sed -n "s/^DISK\([[:digit:]]\+\)=.*/\1/p")"
}
#DISK0="auto" DISK3="auto" DISK7="auto" getdiskvars
#echo -e "expected: DISKVARS=0\n3\n7"
#echo "result: DISKVARS=$DISKVARS"
#exit 0
# replace parameter DISK to the real disk-device
disk2real()
{
local d h1 h2 p
h1="$1"
for d in $DISKVARS; do
# /dev/hda has partitions /dev/hda1 /dev/hda2 ... => p=""
# /dev/sda has partitions /dev/sda1 /dev/sda2 ... => p=""
# /dev/ida/c0d0 has partitions /dev/ida/c0d0p1 /dev/ida/c0d0p2 ... => p="p"
p=""; [ -b "$(eval "echo \"\${DISK$d}p1\"")" ] && p="p"
h2="$h1"
h1="$(eval "echo \"$h2\" | sed -e \"s|\<DISK$d\>|\$DISK$d|g\" -e \"s|\<DISK${d}P|\${DISK$d}${p}|g\"")"
done
echo "$h1"
}
#echo "Expected Result: /dev/hda /dev/hda1 /dev/hda3"
#DISK0=/dev/hda; getdiskvars
#disk2real "Test Result....: DISK0 DISK0P1 DISK0P3"
#echo
#
#echo "Expected Result: /dev/cciss/p0d0 /dev/cciss/p0d0p1 /dev/cciss/p0d0p3"
#DISK0=/dev/cciss/p0d0 ; getdiskvars
#disk2real "Test Result....: DISK0 DISK0P1 DISK0P3"
#echo
#
#echo "Expected Result: /dev/cciss/p0d0 /dev/cciss/p0d0p1 /dev/cciss/p0d0p2"
#DISK0=/dev/cciss/p0d0; getdiskvars
#disk2real "Test Result....: DISK0 DISK0P1 DISK0P2"
#echo
#
#echo "Expected Result: /dev/hda /dev/hdb1 /dev/hdc2"
#DISK0=/dev/hda; DISK1=/dev/hdb; DISK2=/dev/hdc; getdiskvars
#disk2real "Test Result....: DISK0 DISK1P1 DISK2P2"
#echo
#exit 0
get_disk()
{
local n i
# sfdisk -l does not allways show all disks.
# but cat /proc/partitions shows too much.
# If it is not found automatically it has to be defined in bootcd2disk.conf
AUTODISK="$(sfdisk -l 2>/dev/null |
sed -n "s/^Disk \([^[:space:]]\+\):.*/\1/p")"
echo "AUTODISK=<$AUTODISK>" >>$ERRLOG
n=0
for i in $DISKVARS; do
let n=n+1
eval "DISK$i=\"$(echo $AUTODISK |awk "{print \$$n}")\""
done
for i in $DISKVARS; do eval "echo \"DISK$i=\$DISK$i\""; done >>$ERRLOG
}
#DISK0="auto"; DISK3="auto"; getdiskvars; ERRLOG=/dev/null; get_disk
#echo -e "expected:\nDISK0=/dev/...\nDISK3=/dev/..."
#echo "result:"
#for i in $DISKVARS; do eval "echo \"DISK$i=\$DISK$i\""; done
#exit 0
check_SWAP_MOUNT_UMOUNT_VFAT_OPT_FSTAB()
{
if [ "$SWAP" = "auto" ]; then
[ -b "$DISK0" ] || err "If you define SWAP=auto, please define DISK0 as auto or <block-device>"
SWAP="DISK0P2"
fi
SWAP="$(disk2real "$SWAP")"
echo "SWAP=<$SWAP>" >>$ERRLOG
[ "$VERBOSE" ] && echo "SWAP=<$SWAP>"
if [ "$MOUNT" = "auto" ]; then
[ -b "$DISK0" ] || err "If you define MOUNT=auto, please define DISK0 as auto or <block-device>"
MOUNT="mount DISK0P3 /mnt; mkdir /mnt/boot; mount DISK0P1 /mnt/boot"
fi
MOUNT="$(disk2real "$MOUNT")"
echo "MOUNT=<$MOUNT>" >>$ERRLOG
[ "$VERBOSE" ] && echo "MOUNT=<$MOUNT>"
if [ "$UMOUNT" = "auto" ]; then
[ -b "$DISK0" ] || err "If you define UMOUNT=auto, please define DISK0 as auto or <block-device>"
UMOUNT="umount /mnt/boot; umount /mnt"
echo "auto UMOUNT=<$UMOUNT>" >>$ERRLOG
[ "$VERBOSE" ] && echo "UMOUNT=<$UMOUNT>"
fi
VFAT="$(disk2real "$VFAT")"
echo "VFAT=<$VFAT>" >>$ERRLOG
[ "$VERBOSE" ] && echo "VFAT=<$VFAT>"
OPT="ext2"
[ "$EXT3" = "yes" ] && OPT="ext3"
if [ "$FSTAB" = "auto" ]; then
[ -b "$DISK0" ] || err "If you define FSTAB=auto, please define DISK0 as auto or <block-device>"
DEVFSMOUNT=""
[ -c /dev/.devfsd ] && DEVFSMOUNT="none /dev devfs defaults 0 0"
FSTAB="
DISK0P1 /boot $OPT defaults 0 1
DISK0P2 none swap sw 0 0
DISK0P3 / $OPT defaults,errors=remount-ro 0 1
proc /proc proc defaults 0 0
$DEVFSMOUNT
"
fi
FSTAB="$(disk2real "$FSTAB")"
echo "FSTAB=<$FSTAB>" >>$ERRLOG
[ "$VERBOSE" ] && echo "FSTAB=<$FSTAB>"
}
check_GRUB_LILO()
{
if [ "$GRUB" = "auto" ]; then
GRUB="
default 0
timeout 5
color cyan/blue white/blue
title Debian GNU/Linux
root (hd0,0)
kernel /$(basename $KERNEL) root=DISK0P3 ro
initrd /$(basename $INITRD)
savedefault
boot
"
fi
GRUB="$(disk2real "$GRUB")"
echo "GRUB=<$GRUB>" >>$ERRLOG
[ "$VERBOSE" ] && echo GRUB="<$GRUB>"
if [ "$LILO" = "auto" ]; then
[ -b "$DISK0" ] || err "If you define LILO=auto, please define DISK0 as auto or <block-device>"
LILOINITRD=""
[ "$INITRD" ] && LILOINITRD="initrd=$INITRD"
LILO="
boot=DISK0
delay=20
vga=0
lba32
read-only
image=/vmlinuz
label=linux
root=DISK0P3
$LILOINITRD
"
fi
LILO="$(disk2real "$LILO")"
echo "LILO=<$LILO>" >>$ERRLOG
[ "$VERBOSE" ] && echo LILO="<$LILO>"
ELILO="$(disk2real "$ELILO")"
echo "ELILO=<$ELILO>" >>$ERRLOG
[ "$VERBOSE" ] && echo ELILO="<$ELILO>"
}
check_OPT_LVM()
{
OPT="EXT2FS"
[ "$EXT3" = "yes" ] && OPT="EXT3FS"
if [ "$LVMGRP" -a "$LVMVOL" ]; then
LVMGRP="$(disk2real "$LVMGRP")"
LVMVOL="$(disk2real "$LVMVOL")"
fi
if [ "$USEIMAGESERVER" == "yes" -o "$ENV_IMAGEURL" ]; then
[ "$SWAP" ] || err "If you define USEIMAGESERVER or \"-url\" a swap partition must be defined!"
echo "Please verify the size of the swap partition. It must be greater then the image!" >>$ERRLOG
fi
}
|