fagg

Untitled

May 10th, 2011
170
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 30.47 KB | None | 0 0
  1. root@enterprise:/usr/sbin# cat update-grub
  2. #!/bin/bash
  3. #
  4. # Insert a list of installed kernels in a grub config file
  5. # Copyright 2001 Wichert Akkerman <wichert@linux.com>
  6. # Copyright (C) 2007,2008 Free Software Foundation, Inc.
  7. #
  8. # This file is free software; you can redistribute it and/or modify it
  9. # under the terms of the GNU General Public License as published by
  10. # the Free Software Foundation, either version 3 of the License, or
  11. # (at your option) any later version.
  12. #
  13. # This program is distributed in the hope that it will be useful, but
  14. # WITHOUT ANY WARRANTY; without even the implied warranty of
  15. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  16. # General Public License for more details.
  17. #
  18. # You should have received a copy of the GNU General Public License
  19. # along with GRUB. If not, see <http://www.gnu.org/licenses/>.
  20. #
  21. # Contributors:
  22. # Jason Thomas <jason@debian.org>
  23. # David B.Harris <dbarclay10@yahoo.ca>
  24. # Marc Haber <mh+debian-packages@zugschlus.de>
  25. # Crispin Flowerday <crispin@zeus.com>
  26.  
  27. # Abort on errors
  28. set -e
  29.  
  30. host_os=`uname -s | tr '[A-Z]' '[a-z]'`
  31.  
  32. abort() {
  33. message=$@
  34.  
  35. echo >&2
  36. echo -e "$message" >&2
  37. echo >&2
  38. exit 1
  39. }
  40.  
  41. find_grub_dir ()
  42. {
  43. echo -n "Searching for GRUB installation directory ... " >&2
  44.  
  45. for d in /boot/grub /boot/boot/grub ; do
  46. if [ -d "$d" ] ; then
  47. grub_dir="$d"
  48. break
  49. fi
  50. done
  51.  
  52. if [ -z "$grub_dir" ] ; then
  53. abort "No GRUB directory found.\n To create a template run 'mkdir /boot/grub' first.\n To install grub, install it manually or try the 'grub-install' command.\n ### Warning, grub-install is used to change your MBR. ###"
  54. else
  55. echo "found: $grub_dir" >&2
  56. fi
  57.  
  58. echo $grub_dir
  59. }
  60.  
  61. # This function was borrowed from grub2/util/update-grub_lib.in
  62. make_system_path_relative_to_its_root ()
  63. {
  64. path=$1
  65. # abort if file doesn't exist
  66. if test -e $path ; then : ;else
  67. return 1
  68. fi
  69.  
  70. # canonicalize
  71. if path=`readlink -f $path` ; then : ; else
  72. return 1
  73. fi
  74.  
  75. # if not a directory, climb up to the directory containing it
  76. if test -d $path ; then
  77. dir=$path
  78. else
  79. dir=`echo $path | sed -e "s,/[^/]*$,,g"`
  80. fi
  81.  
  82. num=`stat -c %d $dir`
  83.  
  84. # this loop sets $dir to the root directory of the filesystem we're inspecting
  85. while : ; do
  86. parent=`readlink -f $dir/..`
  87. if [ "x`stat -c %d $parent`" = "x$num" ] ; then : ; else
  88. # $parent is another filesystem; we found it.
  89. break
  90. fi
  91. if [ "x$dir" = "x/" ] ; then
  92. # / is our root.
  93. break
  94. fi
  95. dir=$parent
  96. done
  97.  
  98. # This function never prints trailing slashes (so that its output can be
  99. # appended a slash unconditionally). Each slash in $dir is considered a
  100. # preceding slash, and therefore the root directory is an empty string.
  101. if [ "$dir" = "/" ] ; then
  102. dir=""
  103. fi
  104.  
  105. echo $path | sed -e "s,^$dir,,g"
  106. }
  107.  
  108. # The grub installation directory
  109. grub_dir=$(find_grub_dir)
  110.  
  111. # Full path to the device.map
  112. device_map=$grub_dir/device.map
  113.  
  114. find_device ()
  115. {
  116. if ! test -e ${device_map} ; then
  117. echo quit | grub --batch --no-floppy --device-map=${device_map} > /dev/null
  118. fi
  119. echo /dev/xvda/
  120. #grub-probe --device-map=${device_map} -t device $1 2> /dev/null
  121. }
  122.  
  123. # Usage: convert_raid1 os_device
  124. # Checks if os_device is a software raid1.
  125. # If so, converts to first physical device in array.
  126. convert_raid1 ()
  127. {
  128. case $1 in
  129. /dev/md[0-9] | /dev/md/[0-9])
  130. : ;; # Continue
  131. *)
  132. return 1 ;;
  133. esac
  134.  
  135. [ -x /sbin/mdadm ] || return 1
  136.  
  137. # Check that the raid device is raid1
  138. raidlevel=$(mdadm -D -b $1 | grep "^ARRAY" | \
  139. sed "s/^.*level=//" | cut -d" " -f1)
  140. [ "$raidlevel" = "raid1" ] || return 1
  141.  
  142. # Take only the first device that makes up the raid
  143. raiddev=$(mdadm -D $1 | grep -A1 "Number" | grep "dev" \
  144. | sed "s/^.*\(\/dev\/.*\)$/\1/")
  145. [ -n "$raiddev" ] || return 1
  146.  
  147. echo $raiddev
  148. return 0
  149. }
  150.  
  151. # Usage: convert os_device
  152. # Convert an OS device to the corresponding GRUB drive.
  153. convert () {
  154. if ! test -e ${device_map} ; then
  155. echo quit | grub --batch --no-floppy --device-map=${device_map} > /dev/null
  156. fi
  157. GRUB_LEGACY_0_BASED_PARTITIONS=1 grub-probe --device-map=${device_map} -t drive -d "$1" 2> /dev/null || {
  158. echo "warning: grub-probe can't find drive for $1." >&2
  159. tmp_map=$(mktemp -t device.map.XXXXXXXX)
  160. grub-mkdevicemap --device-map=${tmp_map} --no-floppy >/dev/null 2>&1 || true
  161. GRUB_LEGACY_0_BASED_PARTITIONS=1 grub-probe --device-map=${tmp_map} -t drive -d "$1" || {
  162. rm -f ${tmp_map}
  163. return 1
  164. }
  165. echo "Please check ${device_map}, you might have to regenerate it with grub-mkdevicemap." >&2
  166. rm -f ${tmp_map}
  167. }
  168. }
  169.  
  170. # Usage: convert_default os_device
  171. # Convert an OS device to the corresponding GRUB drive.
  172. convert_default () {
  173. # Check if device is software raid1 array
  174. if tmp_dev=$(convert_raid1 $1 2>/dev/null) ; then
  175. : # Use device returned by convert_raid1
  176. else
  177. tmp_dev=$1
  178. fi
  179.  
  180. convert $tmp_dev
  181. }
  182.  
  183. ## Configuration Options
  184.  
  185. # Full path to the menu.lst
  186. menu_file_basename=menu.lst
  187. menu_file=$grub_dir/$menu_file_basename
  188.  
  189. # Full path to the default file
  190. default_file_basename=default
  191. default_file=$grub_dir/$default_file_basename
  192.  
  193. # the device for the / filesystem
  194. root_device=$(find_device "/")
  195.  
  196. # loop-AES arranges things so that /dev/loop/X can be our root device, but
  197. # the initrds that Linux uses don't like that.
  198. case ${root_device} in
  199. /dev/loop/*|/dev/loop[0-9])
  200. root_device=`losetup ${root_device} | sed -e "s/^[^(]*(\([^)]\+\)).*/\1/"`
  201. ;;
  202. esac
  203.  
  204. # the device for the /boot filesystem
  205. boot_device=$(find_device "/boot")
  206.  
  207. # where grub looks for the kernels at boot time
  208. kernel_dir=`make_system_path_relative_to_its_root /boot`
  209.  
  210. # the "-t abstraction" check is a workaround untill #484297 is fixed
  211. if abstraction=`grub-probe -t abstraction --device ${root_device} 2> /dev/null` && [ "$abstraction" = "" ] && \
  212. root_uuid=`grub-probe --device-map=${device_map} --device ${root_device} --target=fs_uuid 2> /dev/null` && \
  213. test -e "/dev/disk/by-uuid/${root_uuid}" ; then
  214. linux_root_device=UUID=${root_uuid}
  215. else
  216. linux_root_device=${root_device}
  217. fi
  218.  
  219. # Default kernel options, overidden by the kopt statement in the menufile.
  220. kopt="root=$linux_root_device ro"
  221.  
  222. # Title
  223. title="Debian GNU/`uname -s | sed -e s,GNU/,,g`"
  224.  
  225. # should update-grub remember the default entry
  226. updatedefaultentry="false"
  227.  
  228. # Drive(in GRUB terms) where the kernel is located. Overridden by the
  229. # groot statement in menufile.
  230. grub_root_device=$(convert_default "$boot_device")
  231.  
  232. # should grub create the alternative boot options in the menu
  233. alternative="true"
  234.  
  235. # should grub lock the alternative boot options in the menu
  236. lockalternative="false"
  237.  
  238. # additional options to use with the default boot option, but not with the
  239. # alternatives
  240. defoptions=""
  241.  
  242. # should grub lock the old kernels
  243. lockold="false"
  244.  
  245. # Xen hypervisor options to use with the default Xen boot option
  246. xenhopt=""
  247.  
  248. # Xen Linux kernel options to use with the default Xen boot option
  249. xenkopt="console=tty0"
  250.  
  251. # options to use with the alternative boot options
  252. altoptions="(single-user mode) single"
  253.  
  254. # controls howmany kernels are listed in the config file,
  255. # this does not include the alternative kernels
  256. howmany="all"
  257.  
  258. # should grub create a memtest86 entry
  259. memtest86="true"
  260.  
  261. # should grub add "savedefault" to default boot options
  262. savedefault="false"
  263.  
  264. # stores the command line arguments
  265. command_line_arguments=$1
  266.  
  267. # read user configuration
  268. if test -f "/etc/default/grub" ; then
  269. . /etc/default/grub
  270. fi
  271.  
  272. # Default options to use in a new config file. This will only be used if $menu_file
  273. # doesn't already exist. Only edit the lines between the two "EOF"s. The others are
  274. # part of the script.
  275. newtemplate=$(tempfile)
  276. cat > "$newtemplate" <<EOF
  277. # $menu_file_basename - See: grub(8), info grub, update-grub(8)
  278. # grub-install(8), grub-floppy(8),
  279. # grub-md5-crypt, /usr/share/doc/grub
  280. # and /usr/share/doc/grub-legacy-doc/.
  281.  
  282. ## default num
  283. # Set the default entry to the entry number NUM. Numbering starts from 0, and
  284. # the entry number 0 is the default if the command is not used.
  285. #
  286. # You can specify 'saved' instead of a number. In this case, the default entry
  287. # is the entry saved with the command 'savedefault'.
  288. # WARNING: If you are using dmraid do not change this entry to 'saved' or your
  289. # array will desync and will not let you boot your system.
  290. default 0
  291.  
  292. ## timeout sec
  293. # Set a timeout, in SEC seconds, before automatically booting the default entry
  294. # (normally the first entry defined).
  295. timeout 5
  296.  
  297. # Pretty colours
  298. color cyan/blue white/blue
  299.  
  300. ## password ['--md5'] passwd
  301. # If used in the first section of a menu file, disable all interactive editing
  302. # control (menu entry editor and command-line) and entries protected by the
  303. # command 'lock'
  304. # e.g. password topsecret
  305. # password --md5 \$1\$gLhU0/\$aW78kHK1QfV3P2b2znUoe/
  306. # password topsecret
  307.  
  308. #
  309. # examples
  310. #
  311. # title Windows 95/98/NT/2000
  312. # root (hd0,0)
  313. # makeactive
  314. # chainloader +1
  315. #
  316. # title Linux
  317. # root (hd0,1)
  318. # kernel /vmlinuz root=/dev/hda2 ro
  319. #
  320.  
  321. #
  322. # Put static boot stanzas before and/or after AUTOMAGIC KERNEL LIST
  323.  
  324. EOF
  325. ## End Configuration Options
  326.  
  327. echo -n "Searching for default file ... " >&2
  328. if [ -f "$default_file" ] ; then
  329. echo "found: $default_file" >&2
  330. else
  331. echo "Generating $default_file file and setting the default boot entry to 0" >&2
  332. if [ -f /usr/lib/grub-legacy/grub-set-default ] ; then
  333. /usr/lib/grub-legacy/grub-set-default $1
  334. else
  335. grub-set-default $1
  336. fi
  337. fi
  338.  
  339. # Make sure we use the standard sorting order
  340. LC_COLLATE=C
  341. # Magic markers we use
  342. start="### BEGIN AUTOMAGIC KERNELS LIST"
  343. end="### END DEBIAN AUTOMAGIC KERNELS LIST"
  344.  
  345. startopt="## ## Start Default Options ##"
  346. endopt="## ## End Default Options ##"
  347.  
  348. # Extract options from config file
  349. ExtractMenuOpt()
  350. {
  351. opt=$1
  352.  
  353. sed -ne "/^$start\$/,/^$end\$/ {
  354. /^$startopt\$/,/^$endopt\$/ {
  355. /^# $opt=/ {
  356. s/^# $opt=\(.*\)\$/\1/
  357. p
  358. }
  359. }
  360. }" $menu
  361. }
  362.  
  363. GetMenuOpts()
  364. {
  365. opt=$1
  366.  
  367. sed -ne "/^$start\$/,/^$end\$/ {
  368. /^$startopt\$/,/^$endopt\$/ {
  369. /^# $opt=/ {
  370. p
  371. }
  372. }
  373. }" $menu
  374. }
  375.  
  376. ExtractMenuOpts()
  377. {
  378. opt=$1
  379.  
  380. GetMenuOpts $opt | sed "s/^# $opt=\(.*\)\$/\1=\"\2\"/"
  381. }
  382.  
  383. GetMenuOpt()
  384. {
  385. opt=$1
  386. value=$2
  387.  
  388. [ -z "$(GetMenuOpts "$opt")" ] || value=$(ExtractMenuOpt "$opt")
  389.  
  390. echo $value
  391. }
  392.  
  393. # Compares two version strings A and B
  394. # Returns -1 if A<B
  395. # 0 if A==B
  396. # 1 if A>B
  397. # This compares version numbers of the form
  398. # 2.4.14.2 > 2.4.14
  399. # 2.4.14random = 2.4.14-random > 2.4.14-ac10 > 2.4.14 > 2.4.14-pre2 >
  400. # 2.4.14-pre1 > 2.4.13-ac99
  401. CompareVersions()
  402. {
  403. local a=`echo $1 | sed -e "s,.*/vmlinu[zx]-,,g;s/[._-]\(pre\|rc\|test\|git\)/~\1/g"`
  404. local b=`echo $2 | sed -e "s,.*/vmlinu[zx]-,,g;s/[._-]\(pre\|rc\|test\|git\)/~\1/g"`
  405. if [ "$a" = "$b" ] ; then
  406. echo 0
  407. elif dpkg --compare-versions "$a" gt "$b" ; then
  408. echo 1
  409. else
  410. echo -1
  411. fi
  412. }
  413.  
  414. # looks in the directory specified for an initrd image with the version specified
  415. FindInitrdName()
  416. {
  417. # strip trailing slashes
  418. directory=$(echo $1 | sed -e 's#/*$##')
  419. version=$2
  420.  
  421. # initrd
  422. # initrd.img
  423. # initrd-lvm
  424. # .*.gz
  425.  
  426. initrdName=""
  427. names="initrd initrd.img initrd-lvm"
  428. compressed="gz"
  429.  
  430. for n in $names ; do
  431. # make sure we haven't already found it
  432. if [ -z "$initrdName" ] ; then
  433. if [ -f "$directory/$n$version" ] ; then
  434. initrdName="$n$version"
  435. break
  436. else
  437. for c in $compressed ; do
  438. if [ -f "$directory/$n$version.$c" ] ; then
  439. initrdName="$n$version.$c"
  440. break
  441. fi
  442. done
  443. fi
  444. else
  445. break
  446. fi
  447. done
  448.  
  449. # return the result
  450. echo $initrdName
  451. }
  452.  
  453. FindXenHypervisorVersions ()
  454. {
  455. version=$1
  456.  
  457. if [ -f "/var/lib/linux-image-$version/xen-versions" ]; then
  458. ret="$(cat /var/lib/linux-image-$version/xen-versions)"
  459. fi
  460.  
  461. echo $ret
  462. }
  463.  
  464. get_kernel_opt()
  465. {
  466. kernel_version=$1
  467.  
  468. version=$(echo $kernel_version | sed 's/^[^0-9]*//')
  469. version=$(echo $version | sed 's/[-\+\.]/_/g')
  470. if [ -n "$version" ] ; then
  471. while [ -n "$version" ] ; do
  472. currentOpt="$(eval "echo \${kopt_$version}")"
  473. if [ -n "$currentOpt" ] ; then
  474. break
  475. fi
  476. version=$(echo $version | sed 's/_\?[^_]*$//')
  477. done
  478. fi
  479.  
  480. if [ -z "$currentOpt" ] ; then
  481. currentOpt=$kopt
  482. fi
  483.  
  484. echo $currentOpt
  485. }
  486.  
  487. write_kernel_entry()
  488. {
  489. local kernel_version; kernel_version=$1; shift
  490. local recovery_desc; recovery_desc=$1; shift
  491. local lock_alternative; lock_alternative=$1; shift
  492. local grub_root_device; grub_root_device=$1; shift
  493. local kernel; kernel=$1; shift
  494. local kernel_options; kernel_options=$1; shift
  495. local recovery_suffix; recovery_suffix=$1; shift
  496. local initrd; initrd=$1; shift
  497. local savedefault; savedefault=$1; shift
  498. local lockold; lockold=$1; shift
  499. local hypervisor
  500. if [ -n "$1" ]; then
  501. # Hypervisor.
  502. hypervisor=$1; shift
  503. local hypervisor_image; hypervisor_image=$1; shift
  504. local hypervisor_version; hypervisor_version=$1; shift
  505. local hypervisor_options; hypervisor_options=$1; shift
  506. fi
  507.  
  508. echo -n "title " >> $buffer
  509.  
  510. if [ -n "$hypervisor" ]; then
  511. echo -n "$hypervisor $hypervisor_version / " >> $buffer
  512. fi
  513.  
  514. echo -n "$title" >> $buffer
  515. if [ -n "$kernel_version" ]; then
  516. echo -n ", kernel $kernel_version" >> $buffer
  517. fi
  518. if [ -n "$recovery_desc" ]; then
  519. echo -n " $recovery_desc" >> $buffer
  520. fi
  521. echo >> $buffer
  522.  
  523. # lock the alternative options
  524. if test x"$lock_alternative" = x"true" ; then
  525. echo "lock" >> $buffer
  526. fi
  527. # lock the old entries
  528. if test x"$lockold" = x"true" ; then
  529. echo "lock" >> $buffer
  530. fi
  531.  
  532. echo "root $grub_root_device" >> $buffer
  533.  
  534. echo -n "kernel " >> $buffer
  535. if [ -n "$hypervisor" ]; then
  536. echo -n "$hypervisor_image" >> $buffer
  537. if [ -n "$hypervisor_options" ]; then
  538. echo -n " $hypervisor_options" >> $buffer
  539. fi
  540. echo >> $buffer
  541. echo -n "module " >> $buffer
  542. fi
  543. echo -n "$kernel" >> $buffer
  544. if [ -n "$kernel_options" ]; then
  545. echo -n " $kernel_options" >> $buffer
  546. fi
  547. if [ -n "$recovery_desc" ]; then
  548. echo -n " $recovery_suffix" >> $buffer
  549. fi
  550. echo >> $buffer
  551.  
  552. if [ -n "$initrd" ]; then
  553. if [ -n "$hypervisor" ]; then
  554. echo -n "module " >> $buffer
  555. else
  556. echo -n "initrd " >> $buffer
  557. fi
  558. echo "$initrd" >> $buffer
  559. fi
  560.  
  561. if test x"$savedefault" = x"true" ; then
  562. echo "savedefault" >> $buffer
  563. fi
  564. echo >> $buffer
  565. }
  566.  
  567.  
  568. echo -n "Testing for an existing GRUB $menu_file_basename file ... " >&2
  569.  
  570. # Test if our menu file exists
  571. if [ -f "$menu_file" ] ; then
  572. menu="$menu_file"
  573. rm -f $newtemplate
  574. unset newtemplate
  575. echo "found: $menu_file" >&2
  576. cp -f "$menu_file" "$menu_file~"
  577. else
  578. # if not ask user if they want us to create one
  579. menu="$menu_file"
  580. echo >&2
  581. echo >&2
  582. if [ "-y" = "$command_line_arguments" ] ; then
  583. echo "Warning: ignoring deprecated -y option." >&2
  584. fi
  585. echo >&2
  586. echo "Generating $menu_file" >&2
  587. cat "$newtemplate" > $menu_file
  588. rm -f $newtemplate
  589. unset newtemplate
  590. fi
  591.  
  592. # Extract the kernel options to use
  593. kopt=$(GetMenuOpt "kopt" "$kopt")
  594.  
  595. # Set the kernel 2.6 option only for fresh install
  596. test -z "$(GetMenuOpt "kopt" "")" && kopt_2_6="root=$linux_root_device ro"
  597.  
  598. # Extract options for specific kernels
  599. opts="$(ExtractMenuOpts "\(kopt_[[:alnum:]_]\+\)")"
  600. test -z "$opts" || eval "$opts"
  601. CustomKopts=$(GetMenuOpts "\(kopt_[[:alnum:]_]\+\)")
  602.  
  603. # Extract the grub root
  604. grub_root_device=$(GetMenuOpt "groot" "$grub_root_device")
  605.  
  606. # Extract the old recovery value
  607. alternative=$(GetMenuOpt "recovery" "$alternative")
  608.  
  609. # Extract the alternative value
  610. alternative=$(GetMenuOpt "alternative" "$alternative")
  611.  
  612. # Extract the lockalternative value
  613. lockalternative=$(GetMenuOpt "lockalternative" "$lockalternative")
  614.  
  615. # Extract the additional default options
  616. defoptions=$(GetMenuOpt "defoptions" "$defoptions")
  617.  
  618. # Extract the lockold value
  619. lockold=$(GetMenuOpt "lockold" "$lockold")
  620.  
  621. # Extract Xen hypervisor options
  622. xenhopt=$(GetMenuOpt "xenhopt" "$xenhopt")
  623.  
  624. # Extract Xen Linux kernel options
  625. xenkopt=$(GetMenuOpt "xenkopt" "$xenkopt")
  626.  
  627. # Extract the howmany value
  628. howmany=$(GetMenuOpt "howmany" "$howmany")
  629.  
  630. # Extract the memtest86 value
  631. memtest86=$(GetMenuOpt "memtest86" "$memtest86")
  632.  
  633.  
  634. # Extract the updatedefaultentry option
  635. updatedefaultentry=$(GetMenuOpt "updatedefaultentry" "$updatedefaultentry")
  636.  
  637. # Extract the savedefault option
  638. savedefault=$(GetMenuOpt "savedefault" "$savedefault")
  639.  
  640. # Generate the menu options we want to insert
  641. buffer=$(tempfile)
  642. echo $start >> $buffer
  643. echo "## lines between the AUTOMAGIC KERNELS LIST markers will be modified" >> $buffer
  644. echo "## by the debian update-grub script except for the default options below" >> $buffer
  645. echo >> $buffer
  646. echo "## DO NOT UNCOMMENT THEM, Just edit them to your needs" >> $buffer
  647. echo >> $buffer
  648. echo "## ## Start Default Options ##" >> $buffer
  649.  
  650. echo "## default kernel options" >> $buffer
  651. echo "## default kernel options for automagic boot options" >> $buffer
  652. echo "## If you want special options for specific kernels use kopt_x_y_z" >> $buffer
  653. echo "## where x.y.z is kernel version. Minor versions can be omitted." >> $buffer
  654. echo "## e.g. kopt=root=/dev/hda1 ro" >> $buffer
  655. echo "## kopt_2_6_8=root=/dev/hdc1 ro" >> $buffer
  656. echo "## kopt_2_6_8_2_686=root=/dev/hdc2 ro" >> $buffer
  657. echo "# kopt=$kopt" >> $buffer
  658. if [ -n "$CustomKopts" ] ; then
  659. echo "$CustomKopts" >> $buffer
  660. elif [ -n "$kopt_2_6" ] && [ "$kopt" != "$kopt_2_6" ]; then
  661. echo "# kopt_2_6=$kopt_2_6" >> $buffer
  662. fi
  663. echo >> $buffer
  664.  
  665. echo "## default grub root device" >> $buffer
  666. echo "## e.g. groot=(hd0,0)" >> $buffer
  667. echo "# groot=$grub_root_device" >> $buffer
  668. echo >> $buffer
  669.  
  670. echo "## should update-grub create alternative automagic boot options" >> $buffer
  671. echo "## e.g. alternative=true" >> $buffer
  672. echo "## alternative=false" >> $buffer
  673. echo "# alternative=$alternative" >> $buffer
  674. echo >> $buffer
  675.  
  676. echo "## should update-grub lock alternative automagic boot options" >> $buffer
  677. echo "## e.g. lockalternative=true" >> $buffer
  678. echo "## lockalternative=false" >> $buffer
  679. echo "# lockalternative=$lockalternative" >> $buffer
  680. echo >> $buffer
  681.  
  682. echo "## additional options to use with the default boot option, but not with the" >> $buffer
  683. echo "## alternatives" >> $buffer
  684. echo "## e.g. defoptions=vga=791 resume=/dev/hda5" >> $buffer
  685. echo "# defoptions=$defoptions" >> $buffer
  686. echo >> $buffer
  687.  
  688. echo "## should update-grub lock old automagic boot options" >> $buffer
  689. echo "## e.g. lockold=false" >> $buffer
  690. echo "## lockold=true" >> $buffer
  691. echo "# lockold=$lockold" >> $buffer
  692. echo >> $buffer
  693.  
  694. echo "## Xen hypervisor options to use with the default Xen boot option" >> $buffer
  695. echo "# xenhopt=$xenhopt" >> $buffer
  696. echo >> $buffer
  697.  
  698. echo "## Xen Linux kernel options to use with the default Xen boot option" >> $buffer
  699. echo "# xenkopt=$xenkopt" >> $buffer
  700. echo >> $buffer
  701.  
  702. echo "## altoption boot targets option" >> $buffer
  703. echo "## multiple altoptions lines are allowed" >> $buffer
  704. echo "## e.g. altoptions=(extra menu suffix) extra boot options" >> $buffer
  705. echo "## altoptions=(single-user) single" >> $buffer
  706.  
  707. if ! grep -q "^# altoptions" $menu ; then
  708. echo "# altoptions=$altoptions" >> $buffer
  709. else
  710. grep "^# altoptions" $menu >> $buffer
  711. fi
  712. echo >> $buffer
  713.  
  714. echo "## controls how many kernels should be put into the $menu_file_basename" >> $buffer
  715. echo "## only counts the first occurence of a kernel, not the" >> $buffer
  716. echo "## alternative kernel options" >> $buffer
  717. echo "## e.g. howmany=all" >> $buffer
  718. echo "## howmany=7" >> $buffer
  719. echo "# howmany=$howmany" >> $buffer
  720. echo >> $buffer
  721.  
  722.  
  723. echo "## should update-grub create memtest86 boot option" >> $buffer
  724. echo "## e.g. memtest86=true" >> $buffer
  725. echo "## memtest86=false" >> $buffer
  726. echo "# memtest86=$memtest86" >> $buffer
  727. echo >> $buffer
  728.  
  729. echo "## should update-grub adjust the value of the default booted system" >> $buffer
  730. echo "## can be true or false" >> $buffer
  731. echo "# updatedefaultentry=$updatedefaultentry" >> $buffer
  732. echo >> $buffer
  733.  
  734. echo "## should update-grub add savedefault to the default options" >> $buffer
  735. echo "## can be true or false" >> $buffer
  736. echo "# savedefault=$savedefault" >> $buffer
  737. echo >> $buffer
  738.  
  739. echo "## ## End Default Options ##" >> $buffer
  740. echo >> $buffer
  741.  
  742. echo -n "Searching for splash image ... " >&2
  743. current_splash=`grep '^splashimage=' ${menu_file} || true`
  744. grub_dir_rel=`make_system_path_relative_to_its_root $grub_dir`
  745. splashimage_path="splashimage=${grub_root_device}/${grub_dir_rel##${kernel_dir}}/splash.xpm.gz"
  746. if [ `sed -e "/^$start/,/^$end/d" $menu_file | grep -c '^splashimage='` != "0" ] ; then
  747. #checks for splashscreen defined outside the autoupdated part
  748. splashimage=$(grep '^splashimage=' ${menu_file})
  749. echo "found: ${splashimage##*=}" >&2
  750. echo >&2
  751. elif [ -f "${grub_dir}/splash.xpm.gz" ] && [ "$current_splash" = "" ]; then
  752. echo "found: /boot/grub/splash.xpm.gz" >&2
  753. echo "$splashimage_path" >> $buffer
  754. echo >> $buffer
  755. elif [ -f "${grub_dir}/splash.xpm.gz" ] && [ "$current_splash" = "$splashimage_path" ]; then
  756. echo "found: /boot/grub/splash.xpm.gz" >&2
  757. echo "$splashimage_path" >> $buffer
  758. echo >> $buffer
  759. elif [ "$current_splash" != "" ] && [ "$current_splash" != "$splashimage_path" ]; then
  760. echo "found but preserving previous setting: $(grep '^splashimage=' ${menu_file})" >&2
  761. echo "$current_splash" >> $buffer
  762. echo >> $buffer
  763. else
  764. echo "none found, skipping ..." >&2
  765. fi
  766.  
  767. xen0Kernels=""
  768. # First kernels with xen0 support.
  769. for ver in `grep -l CONFIG_XEN=y /boot/config* | sed -e s%/boot/config-%%`; do
  770. if ! grep -q CONFIG_XEN_PRIVILEGED_GUEST=y /boot/config-$ver ; then
  771. continue
  772. fi
  773. # ver is a kernel version
  774. kern="/boot/vmlinuz-$ver"
  775. if [ -r $kern ] ; then
  776. newerKernels=""
  777. for i in $xen0Kernels ; do
  778. res=$(CompareVersions "$kern" "$i")
  779. if [ "$kern" != "" ] && [ "$res" -gt 0 ] ; then
  780. newerKernels="$newerKernels $kern $i"
  781. kern=""
  782. else
  783. newerKernels="$newerKernels $i"
  784. fi
  785. done
  786. if [ "$kern" != "" ] ; then
  787. newerKernels="$newerKernels $kern"
  788. fi
  789. xen0Kernels="$newerKernels"
  790. fi
  791. done
  792.  
  793. sortedKernels=""
  794. for kern in $(/bin/ls -1vr /boot | grep -v "dpkg-*" | grep "^vmlinuz-") ; do
  795. kern="/boot/$kern"
  796. newerKernels=""
  797. for i in $sortedKernels ; do
  798. res=$(CompareVersions "$kern" "$i")
  799. if [ "$kern" != "" ] && [ "$res" -gt 0 ] ; then
  800. newerKernels="$newerKernels $kern $i"
  801. kern=""
  802. else
  803. newerKernels="$newerKernels $i"
  804. fi
  805. done
  806. if [ "$kern" != "" ] ; then
  807. newerKernels="$newerKernels $kern"
  808. fi
  809. sortedKernels="$newerKernels"
  810. done
  811.  
  812. if test -f "/boot/vmlinuz.old" ; then
  813. sortedKernels="/boot/vmlinuz.old $sortedKernels"
  814. fi
  815. if test -f "/boot/vmlinuz" ; then
  816. sortedKernels="/boot/vmlinuz $sortedKernels"
  817. fi
  818.  
  819. hypervisors=""
  820. for hyp in /boot/xen-*.gz; do
  821. if [ ! -h "$hyp" ] && [ -f "$hyp" ]; then
  822. hypervisors="$hypervisors `basename "$hyp"`"
  823. fi
  824. done
  825.  
  826. #Finding the value the default line
  827. use_grub_set_default="false"
  828. if test "$updatedefaultentry" = "true" ; then
  829. defaultEntryNumber=$(sed -ne 's/^[[:blank:]]*default[[:blank:]]*\(.*\).*/\1/p' $menu)
  830.  
  831. if [ "$defaultEntryNumber" = "saved" ] ; then
  832. defaultEntryNumber=$(sed 'q' "$grub_dir/default")
  833. use_grub_set_default="true"
  834. fi
  835.  
  836. if test -n "$defaultEntryNumber"; then
  837. defaultEntryNumberPlusOne=$(expr $defaultEntryNumber \+ 1);
  838. defaultEntry=$(grep "^[[:blank:]]*title" $menu | sed -ne "${defaultEntryNumberPlusOne}p" | sed -ne ";s/^[[:blank:]]*title[[:blank:]]*//p")
  839. defaultEntry=$(echo $defaultEntry | sed -e "s/[[:blank:]]*$//") # don't trust trailing blanks
  840. else
  841. notChangeDefault="yes"
  842. fi
  843. else
  844. notChangeDefault="yes"
  845. fi
  846.  
  847. ## heres where we start writing out the kernel entries
  848. counter=0
  849.  
  850. grub2name="${kernel_dir}/grub/core.img"
  851. if [ "$LET_US_TRY_GRUB_2" = "true" ] \
  852. && test -f /boot/grub/core.img ; then
  853. echo "Found GRUB 2: $grub2name" >&2
  854. cat >> $buffer << EOF
  855. title Chainload into GRUB 2
  856. root $grub_root_device
  857. kernel $grub2name
  858.  
  859. title `echo ───────────────────────────────────────────────────────────────────── | iconv -f utf-8 -t cp437`
  860. root
  861.  
  862. title When you have verified GRUB 2 works, you can use this command to
  863. root
  864.  
  865. title complete the upgrade: upgrade-from-grub-legacy
  866. root
  867.  
  868. title `echo ───────────────────────────────────────────────────────────────────── | iconv -f utf-8 -t cp437`
  869. root
  870.  
  871. EOF
  872. fi
  873.  
  874.  
  875. # Xen entries first.
  876. for kern in $xen0Kernels ; do
  877. if test ! x"$howmany" = x"all" ; then
  878. if [ $counter -gt $howmany ] ; then
  879. break
  880. fi
  881. fi
  882.  
  883. kernelName=$(basename $kern)
  884. kernelVersion=$(echo $kernelName | sed -e 's/vmlinuz//')
  885.  
  886. initrdName=$(FindInitrdName "/boot" "$kernelVersion")
  887. initrd=""
  888.  
  889. kernel=$kernel_dir/$kernelName
  890. if [ -n "$initrdName" ] ; then
  891. initrd=$kernel_dir/$initrdName
  892. fi
  893.  
  894. kernelVersion=$(echo $kernelVersion | sed -e 's/^-//')
  895. currentOpt=$(get_kernel_opt $kernelVersion)
  896.  
  897. hypervisorVersions=$(FindXenHypervisorVersions "$kernelVersion")
  898.  
  899. found=
  900. for hypervisorVersion in $hypervisorVersions; do
  901. hypervisor="$kernel_dir/xen-$hypervisorVersion.gz"
  902. if [ -e "$hypervisor" ]; then
  903. found=1
  904.  
  905. echo "Found Xen hypervisor $hypervisorVersion, kernel: $kernel" >&2
  906.  
  907. write_kernel_entry "$kernelVersion" '' '' "$grub_root_device" \
  908. "$kernel" "$currentOpt $xenkopt" '' "$initrd" "$savedefault" '' \
  909. Xen "$hypervisor" "$hypervisorVersion" "$xenhopt"
  910. counter=$(($counter + 1))
  911. fi
  912. done
  913.  
  914. if [ -z $found ]; then
  915. for hypervisor in $hypervisors; do
  916. hypVersion=`basename "$hypervisor" .gz | sed s%xen-%%`
  917.  
  918. echo "Found Xen hypervisor $hypVersion, kernel: $kernel" >&2
  919.  
  920. write_kernel_entry "$kernelVersion" '' '' "$grub_root_device" \
  921. "$kernel" "$currentOpt $xenkopt" '' "$initrd" "$savedefault" '' \
  922. Xen "$kernel_dir/$hypervisor" "$hypVersion" "$xenhopt"
  923. counter=$(($counter + 1))
  924. done
  925. fi
  926. done
  927.  
  928. for kern in $sortedKernels ; do
  929. counter=$(($counter + 1))
  930. if test ! x"$howmany" = x"all" ; then
  931. if [ $counter -gt $howmany ] ; then
  932. break
  933. fi
  934. fi
  935. kernelName=$(basename $kern)
  936. kernelVersion=$(echo $kernelName | sed -e 's/vmlinuz//')
  937. initrdName=$(FindInitrdName "/boot" "$kernelVersion")
  938. initrd=""
  939.  
  940. kernel=$kernel_dir/$kernelName
  941. if [ -n "$initrdName" ] ; then
  942. initrd=$kernel_dir/$initrdName
  943. fi
  944.  
  945. echo "Found kernel: $kernel" >&2
  946.  
  947. if [ "$kernelName" = "vmlinuz" ]; then
  948. if [ -L "/boot/$kernelName" ]; then
  949. kernelVersion=`readlink -f "/boot/$kernelName"`
  950. kernelVersion=$(echo $kernelVersion | sed -e 's/.*vmlinuz-//')
  951. kernelVersion="$kernelVersion Default"
  952. else
  953. kernelVersion="Default"
  954. fi
  955. fi
  956. if [ "$kernelName" = "vmlinuz.old" ]; then
  957. if [ -L "/boot/$kernelName" ]; then
  958. kernelVersion=`readlink -f "/boot/$kernelName"`
  959. kernelVersion=$(echo $kernelVersion | sed -e 's/.*vmlinuz-//')
  960. kernelVersion="$kernelVersion Previous"
  961. else
  962. kernelVersion="Previous"
  963. fi
  964. fi
  965. kernelVersion=$(echo $kernelVersion | sed -e 's/^-//')
  966.  
  967. currentOpt=$(get_kernel_opt $kernelVersion)
  968.  
  969. do_lockold=$lockold
  970. # do not lockold for the first entry
  971. [ $counter -eq 1 ] && do_lockold=false
  972.  
  973. write_kernel_entry "$kernelVersion" "" "" "$grub_root_device" "$kernel" \
  974. "$currentOpt $defoptions" "" "$initrd" "$savedefault" "$do_lockold"
  975.  
  976. # insert the alternative boot options
  977. if test ! x"$alternative" = x"false" ; then
  978. # for each altoptions line do this stuff
  979. sed -ne 's/# altoptions=\(.*\)/\1/p' $buffer | while read line; do
  980. descr=$(echo $line | sed -ne 's/\(([^)]*)\)[[:space:]]\(.*\)/\1/p')
  981. suffix=$(echo $line | sed -ne 's/\(([^)]*)\)[[:space:]]\(.*\)/\2/p')
  982.  
  983. test x"$lockalternative" = x"true" && do_lockold=false
  984. write_kernel_entry "$kernelVersion" "$descr" "$lockalternative" \
  985. "$grub_root_device" "$kernel" "$currentOpt" "$suffix" "$initrd" \
  986. "$savedefault" "$do_lockold"
  987.  
  988. done
  989. fi
  990. done
  991.  
  992. memtest86names="memtest86 memtest86+"
  993.  
  994. if test ! x"$memtest86" = x"false" ; then
  995. for name in $memtest86names ; do
  996. if test -f "/boot/$name.bin" ; then
  997. kernelVersion="$name"
  998. kernel="$kernel_dir/$name.bin"
  999. currentOpt=
  1000. initrd=
  1001.  
  1002. echo "Found kernel: $kernel" >&2
  1003.  
  1004. write_kernel_entry "$kernelVersion" "" "" "$grub_root_device" \
  1005. "$kernel" "$currentOpt" "" "$initrd" "false" ""
  1006. fi
  1007. done
  1008. fi
  1009.  
  1010. echo $end >> $buffer
  1011.  
  1012. echo -n "Updating $menu ... " >&2
  1013. # Insert the new options into the menu
  1014. if ! grep -q "^$start" $menu ; then
  1015. cat $buffer >> $menu
  1016. rm -f $buffer
  1017. else
  1018. umask 077
  1019. sed -e "/^$start/,/^$end/{
  1020. /^$start/r $buffer
  1021. d
  1022. }
  1023. " $menu > $menu.new
  1024. cat $menu.new > $menu
  1025. rm -f $buffer $menu.new
  1026. fi
  1027.  
  1028. # Function to update the default value
  1029. set_default_value() {
  1030. if [ "$use_grub_set_default" = "true" ] ; then
  1031. if [ -f /usr/lib/grub-legacy/grub-set-default ] ; then
  1032. /usr/lib/grub-legacy/grub-set-default $1
  1033. else
  1034. grub-set-default $1
  1035. fi
  1036. else
  1037. value="$1"
  1038. newmenu=$(tempfile)
  1039. sed -e "s/^[[:blank:]]*default[[:blank:]]*[[:digit:]]*\(.*\)/default ${value}\1/;b" $menu > $newmenu
  1040. cat $newmenu > $menu
  1041. rm -f $newmenu
  1042. unset newmenu
  1043. fi
  1044. }
  1045.  
  1046. #Updating the default number
  1047. if [ "$LET_US_TRY_GRUB_2" = "true" ] && test -f /boot/grub/core.img ; then
  1048. set_default_value "0"
  1049. elif test -z "$notChangeDefault"; then
  1050. newDefaultNumberPlusOne=$(grep "^[[:blank:]]*title[[:blank:]]*" $menu | grep -n "${defaultEntry}" | cut -f1 -d ":" | sed -ne "1p")
  1051. if test -z "$newDefaultNumberPlusOne"; then
  1052. echo "Previous default entry removed, resetting to 0">&2
  1053. set_default_value "0"
  1054. elif test -z "$defaultEntry"; then
  1055. echo "Value of default value matches no entry, resetting to 0" >&2
  1056. set_default_value "0"
  1057. else
  1058. if test "$newDefaultNumberPlusOne" = "1"; then
  1059. newDefaultNumber="0"
  1060. else
  1061. newDefaultNumber=$(expr $newDefaultNumberPlusOne - 1)
  1062. fi
  1063. echo "Updating the default booting kernel">&2
  1064. set_default_value "$newDefaultNumber"
  1065. fi
  1066. fi
  1067.  
  1068. echo "done" >&2
  1069. echo >&2
Add Comment
Please, Sign In to add comment