summaryrefslogtreecommitdiff
path: root/libre/mksyslinux/mksyslinux
blob: 96ad451337fb9ef6909ca2b1b331d92679882140 (plain)
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
#! /bin/sh
# Created by Tobias Powalowski <tpowa@archlinux.org>
# Settings
APPNAME=$(basename "${0}")
CONFIG="/etc/mksyslinux.conf"
export TEMPDIR=$(mktemp /tmp/mksyslinux.XXX)
TMPDIR=$(mktemp -d /tmp/mksyslinux-image.XXX)
BOOTDIRNAME=boot/syslinux

usage ()
{
    echo "${APPNAME}: usage"
    echo "WRITING TO DEVICE:"
    echo "- PREPARATION: Your device must have a bootable first partition in FAT16 format!"
    echo "- ATTENTION: The MBR of your DEVICE will be overwritten! You have been warned!"
    echo ""
    echo "CREATING AN IMAGE FILE:"
    echo "- For creating an image file use the -i=IMAGEFILE switch"
    echo "- use 'dd if=<yourimage> of=<yourdevice>' to write to your device afterwards."
    echo ""
    echo "PARAMETERS:"
    echo "  -d=DEVICE        Your DEVICE first partition from /dev/xxx tree to install"
    echo "  -i=IMAGENAME     Your IMAGENAME"
    echo "  -c=CONFIG        Use CONFIG file. default: /etc/mksyslinux.conf"
    echo "  -h               This message."
    exit 1
}

[ "$1" == "" ] && usage && exit 1


while [ $# -gt 0 ]; do
	case $1 in
		-c=*|--c=*) CONFIG="$(echo $1 | awk -F= '{print $2;}')" ;;
		-d=*|--d=*) DEVICE="$(echo $1 | awk -F= '{print $2;}')" ;;
		-i=*|--i=*) IMAGENAME="$(echo $1 | awk -F= '{print $2;}')" ;;
		-h|--h|?) usage ;; 
		*) usage ;;
		esac
	shift
done

if [ ! -f "${CONFIG}" ]; then
	echo "config file '${CONFIG}' cannot be found, aborting..."
    exit 1
fi

if [ "${IMAGENAME}" = "" ]; then
	if [ "${DEVICE}" = "" ]; then 
		echo "ERROR: No DEVICE name specified, please use the -d option"
	 	exit 1
	fi
fi

if ! [ $UID -eq 0 ]; then 
	echo "ERROR: only works when run as root!"
	exit 1
fi

. "${CONFIG}"
# export for mkinitcpio
[ -n "${APPENDBOOTMESSAGE}" ] && export APPENDBOOTMESSAGE
[ -n "${APPENDBOOTMESSAGE_SYSLINUX}" ] && export APPENDBOOTMESSAGE_SYSLINUX
[ -n "${APPENDOPTIONSBOOTMESSAGE}" ] && export APPENDOPTIONSBOOTMESSAGE

MBRDEVICE="$(echo ${DEVICE} | sed -e 's/[0-9]//g')"

export RUNPROGRAM="${APPNAME}"
[ "${BOOTMESSAGE}" = "" ] && export BOOTMESSAGE=$(mktemp /tmp/bootmessage.XXXX)
[ "${OPTIONSBOOTMESSAGE}" = "" ] && export OPTIONSBOOTMESSAGE=$(mktemp /tmp/optionsbootmessage.XXXX)
export USEKERNEL=${VERSION}
# begin script
[ -e ${TEMPDIR} ] && rm -r ${TEMPDIR}
mkdir -p ${TEMPDIR}
echo ":: Mounting ${DEVICE} ..."
if ! [ "${IMAGENAME}" = "" ]; then
	modprobe loop
else
	mount ${DEVICE} ${TEMPDIR} || exit 1
fi
mkdir -p ${TEMPDIR}/${BOOTDIRNAME}
# prepare syslinux bootloader
install -m755 /usr/lib/syslinux/isolinux.bin ${TEMPDIR}/${BOOTDIRNAME}/isolinux.bin
for i in /usr/lib/syslinux/*.c32; do
    install -m644 $i ${TEMPDIR}/${BOOTDIRNAME}/$(basename $i)
done
install -m644 /usr/share/hwdata/pci.ids ${TEMPDIR}/${BOOTDIRNAME}/pci.ids

# create syslinux.cfg
echo ":: Creating syslinux.cfg ..."
if [ "${SYSLINUXCFG}" = "" ]; then
	[ -e ${TEMPDIR}/${BOOTDIRNAME}/syslinux.cfg ] && rm ${TEMPDIR}/${BOOTDIRNAME}/syslinux.cfg
	echo "prompt ${PROMPT}" >> ${TEMPDIR}/${BOOTDIRNAME}/syslinux.cfg
	echo "timeout ${TIMEOUT}" >> ${TEMPDIR}/${BOOTDIRNAME}/syslinux.cfg
	echo "display boot.msg" >> ${TEMPDIR}/${BOOTDIRNAME}/syslinux.cfg
	echo "F1 boot.msg" >>  ${TEMPDIR}/${BOOTDIRNAME}/syslinux.cfg
	echo "F2 options.msg" >>  ${TEMPDIR}/${BOOTDIRNAME}/syslinux.cfg
	echo "default parabola"  >> ${TEMPDIR}/${BOOTDIRNAME}/syslinux.cfg
	echo "label parabola" >> ${TEMPDIR}/${BOOTDIRNAME}/syslinux.cfg
	echo "kernel /boot/vmlinuz" >> ${TEMPDIR}/${BOOTDIRNAME}/syslinux.cfg
	echo "append initrd=/boot/initrd.img ${KERNEL_BOOT_OPTIONS}" >> ${TEMPDIR}/${BOOTDIRNAME}/syslinux.cfg
else
	sed "s|@@PROMPT@@|${PROMPT}|g;s|@@TIMEOUT@@|${TIMEOUT}|g;s|@@KERNEL_BOOT_OPTIONS@@|${KERNEL_BOOT_OPTIONS}|g" \
		${SYSLINUXCFG} > ${TEMPDIR}/${BOOTDIRNAME}/syslinux.cfg
fi
[ ! -s ${TEMPDIR}/${BOOTDIRNAME}/syslinux.cfg ] && echo "No syslinux.cfg found" && exit 1
echo ":: Calling mkinitcpio CONFIG=${MKINITCPIO_CONFIG} KERNEL=${VERSION} ..." 
# generate initramdisk
echo ":: Creating initramdisk ..."
	mkinitcpio -c ${MKINITCPIO_CONFIG} -k ${VERSION} -g ${TEMPDIR}/boot/initrd.img
echo ":: Using ${KERNEL} as image kernel ..."
	install -m644 ${KERNEL} ${TEMPDIR}/boot/vmlinuz
	install -m644 ${BOOTMESSAGE} ${TEMPDIR}/${BOOTDIRNAME}/boot.msg
	install -m644 ${OPTIONSBOOTMESSAGE} ${TEMPDIR}/${BOOTDIRNAME}/options.msg
	[ ! -s ${TEMPDIR}/${BOOTDIRNAME}/boot.msg ] && echo 'ERROR:no boot.msg found, aborting!' && exit 1
	[ ! -s ${TEMPDIR}/${BOOTDIRNAME}/options.msg ] && echo 'ERROR:no options.msg found, aborting!' && exit 1
if ! [ "${IMAGENAME}" = "" ]; then
	# ext2 overhead's upper bound is 6%
	# empirically tested up to 1GB
	rootsize=$(du -bs ${TEMPDIR}|cut -f1)
	IMGSZ=$(( (${rootsize}*106)/100/512 + 1)) # image size in sectors
	# create the filesystem image file
	dd if=/dev/zero of="${IMAGENAME}" bs=512 count="${IMGSZ}"
	# create a filesystem on the image
	mkfs.vfat "${IMAGENAME}"
	mount -o loop ${IMAGENAME} ${TMPDIR} || exit 1
	cp -r "${TEMPDIR}"/* "$TMPDIR"
	umount ${TMPDIR}
else
	echo ":: Unmounting ${DEVICE} ..."
	umount ${TEMPDIR} || exit 1
fi
if ! [ "${IMAGENAME}" = "" ]; then
	echo ":: Installing SYSLINUX on ${IMAGENAME} ..."
	syslinux ${IMAGENAME} && echo "Installation completed."
else
	echo ":: Installing MBR on ${MBRDEVICE} ..."
	cat ${MBR} > ${MBRDEVICE}
	echo ":: Installing SYSLINUX on ${DEVICE} ..."
	syslinux -t offset ${DEVICE} && echo "Installation completed."
fi
# clean /tmp
rm -r ${TEMPDIR}
! [ ${IMAGENAME} = "" ] && rm -r ${TMPDIR}