summarylogtreecommitdiffstats
path: root/install-grub
blob: 70b06600b20233605fef6f047da814ccc29a6b4d (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
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
#!/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}

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

      for kernel in /boot/vmlinuz-linux* /boot/vmlinuz26-*; do
	if [ ${kernel} == "/boot/vmlinuz-linux*" ] || [ ${kernel} == "/boot/vmlinuz26-*" ] ; then
	  echo > /dev/null
	else
	  VMLINUZ=$( echo ${kernel} | cut -c 7- )

	  if [ "$( echo ${VMLINUZ} | cut -c -13 )" = "vmlinuz-linux" ]; then # new naming scheme for linux > 3.0
	    extension=$( echo ${VMLINUZ} | cut -c 14- )
	    INITRAMFS_BASENAME=initramfs-linux${extension}
	  else # old naming scheme for lts kernel
	    extension=$( echo ${VMLINUZ} | cut -c 10- ) 
	    INITRAMFS_BASENAME=kernel26${extension}
	  fi

	  echo "" >>/boot/grub/menu.lst
	  echo "# (0) Arch Linux" >>/boot/grub/menu.lst
	  echo "title  Arch Linux - ${VMLINUZ}" >>/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
	  echo "initrd ${subdir}/${INITRAMFS_BASENAME}.img" >>/boot/grub/menu.lst
	  echo "" >>/boot/grub/menu.lst
		
	  # adding fallback/full image
	  echo "# (1) Arch Linux" >>/boot/grub/menu.lst
	  echo "title  Arch Linux Fallback - ${VMLINUZ}" >>/boot/grub/menu.lst
	  echo "root   ${grubdev}" >>/boot/grub/menu.lst
	  echo "kernel ${subdir}/${VMLINUZ} root=${PART_ROOT} ro" >>/boot/grub/menu.lst
	  echo "initrd ${subdir}/${INITRAMFS_BASENAME}-fallback.img" >>/boot/grub/menu.lst
	  echo "" >>/boot/grub/menu.lst
	fi
      done
    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
    [ "$(stat -fLc %T /boot)" == "xfs" ] && /usr/sbin/xfs_freeze -f /boot > /dev/null 2>&1
    [ "$(stat -fLc %T /)" == "xfs" ] && /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

  echo ${bootpart}
  echo ${bootdev}
  /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
    [ "$(stat -fLc %T /boot)" == "xfs" ] && /usr/sbin/xfs_freeze -u /boot > /dev/null 2>&1
    [ "$(stat -fLc %T /)" == "xfs" ] && /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