summaryrefslogtreecommitdiffstats
path: root/abs/core/grub-gfx/install-grub
blob: 3eb7ce5938a195ffb103b30d83fbd3cd9a9d4a85 (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
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
#!/bin/bash

#
# This is a little helper script that tries to convert linux-style device
# names to grub-style.  It's not very smart, so it
# probably won't work for more complicated setups.
#
# If it doesn't work for you, try installing grub manually:
#
#    # mkdir -p /boot/grub
#    # cp /usr/lib/grub/i386-pc/* /boot/grub/
#
# Then start up the 'grub' shell and run something like the following:
#
#    grub> root(hd0,0)
#    grub> setup(hd0)
#
# The "root" line should point to the partition your kernel is located on,
# /boot if you have a separate boot partition, otherwise your root (/).
#
# The "setup" line tells grub which disc/partition to install the
# bootloader to.  In the example above, it will install to the MBR of the
# primary master hard drive.
#

usage() {
	echo "usage: install-grub <install_device> [boot_device]"
	echo
	echo "where <install_device> is the device where Grub will be installed"
	echo "and [boot_device] is the partition that contains the /boot"
	echo "directory (auto-detected if omitted)"
	echo
	echo "examples: install-grub /dev/hda"
	echo "          install-grub /dev/hda /dev/hda1"
	echo
	exit 0
}

## new install-grub, code was taken from setup script
ROOTDEV=$1
PART_ROOT=$2
VMLINUZ=vmlinuz26

if [ "$ROOTDEV" = "" ]; then
	usage
fi
if [ "$PART_ROOT" = "" ]; then
	PART_ROOT=$(mount | grep "on /boot type" | cut -d' ' -f 1)
fi
if [ "$PART_ROOT" = "" ]; then
	PART_ROOT=$(mount | grep "on / type" | cut -d' ' -f 1)
fi
if [ "$PART_ROOT" = "" ]; then
	echo "error: could not determine BOOT_DEVICE, please specify manually" >&2
	exit 1
fi


get_grub_map() {
	[ -e /tmp/dev.map ]  && rm /tmp/dev.map	
	/sbin/grub --no-floppy --device-map /tmp/dev.map >/tmp/grub.log 2>&1 <<EOF
quit
EOF
}

mapdev() {
	partition_flag=0
	device_found=0
	devs=$(cat /tmp/dev.map | grep -v fd | sed 's/ *\t/ /' | sed ':a;$!N;$!ba;s/\n/ /g')
	linuxdevice=$(echo $1 | cut -b1-8)
	if [ "$(echo $1 | egrep '[0-9]$')" ]; then
		# /dev/hdXY
		pnum=$(echo $1 | cut -b9-)
		pnum=$(($pnum-1))
		partition_flag=1
	fi
	for  dev in $devs
	do
	    if [ "(" = $(echo $dev | cut -b1) ]; then
		grubdevice="$dev"
	    else
		if [ "$dev" = "$linuxdevice" ]; then
			device_found=1
			break   
		fi
	   fi
	done	
	if [ "$device_found" = "1" ]; then
		if [ "$partition_flag" = "0" ]; then
			echo "$grubdevice"
		else
			grubdevice_stringlen=${#grubdevice}
			let grubdevice_stringlen--
			grubdevice=$(echo $grubdevice | cut -b1-$grubdevice_stringlen)
			echo "$grubdevice,$pnum)"
		fi
	else
		echo " DEVICE NOT FOUND"
	fi
}

dogrub() {
	get_grub_map	
	if [ ! -f /boot/grub/menu.lst ]; then
		echo "Error: Couldn't find /boot/grub/menu.lst.  Is GRUB installed?"
		exit 1
	fi
	# try to auto-configure GRUB...
	if [ "$PART_ROOT" != "" -a "$S_GRUB" != "1" ]; then
		grubdev=$(mapdev $PART_ROOT)
		# look for a separately-mounted /boot partition
		bootdev=$(mount | grep /boot | cut -d' ' -f 1)
		if [ "$grubdev" != "" -o "$bootdev" != "" ]; then
			cp /boot/grub/menu.lst /tmp/.menu.lst
			# remove the default entries by truncating the file at our little tag (#-*)
			head -n $(cat /tmp/.menu.lst | grep -n '#-\*' | cut -d: -f 1) /tmp/.menu.lst >/boot/grub/menu.lst
			rm -f /tmp/.menu.lst
			echo "" >>/boot/grub/menu.lst
			echo "# (0) Arch Linux" >>/boot/grub/menu.lst
			echo "title  Arch Linux" >>/boot/grub/menu.lst
			subdir=
			if [ "$bootdev" != "" ]; then
				grubdev=$(mapdev $bootdev)
			else
				subdir="/boot"
			fi
			echo "root   $grubdev" >>/boot/grub/menu.lst
			echo "kernel $subdir/$VMLINUZ root=$PART_ROOT ro" >>/boot/grub/menu.lst
			if [ "$VMLINUZ" = "vmlinuz26" ]; then
				echo "initrd $subdir/kernel26.img" >>/boot/grub/menu.lst
			fi
			echo "" >>/boot/grub/menu.lst
			# adding fallback/full image
			echo "# (1) Arch Linux" >>/boot/grub/menu.lst
			echo "title  Arch Linux Fallback" >>/boot/grub/menu.lst
			echo "root   $grubdev" >>/boot/grub/menu.lst
			echo "kernel $subdir/$VMLINUZ root=$PART_ROOT ro" >>/boot/grub/menu.lst
			if [ "$VMLINUZ" = "vmlinuz26" ]; then
				echo "initrd $subdir/kernel26-fallback.img" >>/boot/grub/menu.lst
			fi
			echo "" >>/boot/grub/menu.lst
		fi
	fi

	echo "Installing the GRUB bootloader..."
	cp -a /usr/lib/grub/i386-pc/* /boot/grub/
	sync
	# freeze xfs filesystems to enable grub installation on xfs filesystems
	if [ -x /usr/sbin/xfs_freeze ]; then
		/usr/sbin/xfs_freeze -f /boot > /dev/null 2>&1
		/usr/sbin/xfs_freeze -f / > /dev/null 2>&1
	fi
	# look for a separately-mounted /boot partition
	bootpart=$(mount | grep /boot | cut -d' ' -f 1)
	if [ "$bootpart" = "" ]; then
			bootpart=$PART_ROOT
	fi
	bootpart=$(mapdev $bootpart)
	bootdev=$(mapdev $ROOTDEV)
	if [ "$bootpart" = "" ]; then
		echo "Error: Missing/Invalid root device: $bootpart"
		exit 1
	fi
	/sbin/grub --no-floppy --batch >/tmp/grub.log 2>&1 <<EOF
root $bootpart
setup $bootdev
quit
EOF
cat /tmp/grub.log
	# unfreeze xfs filesystems
	if [ -x /usr/sbin/xfs_freeze ]; then
		/usr/sbin/xfs_freeze -u /boot > /dev/null 2>&1
		/usr/sbin/xfs_freeze -u / > /dev/null 2>&1
	fi

	if grep "Error [0-9]*: " /tmp/grub.log >/dev/null; then
		echo "Error installing GRUB. (see /tmp/grub.log for output)"
		exit 1
	fi
	echo "GRUB was successfully installed."

rm -f /tmp/grub.log

exit 0
}

dogrub