読者です 読者をやめる 読者になる 読者になる

やっぱり影響あった”消えた/dev/sda事件!” 犯人は"/boot/grub/grub.cfg"

Ubuntu Linux

この前の件ですが、やっぱり影響ありました。orz

au HTC EVOを抜いて起動すると「kernelが見つからん」みたいに怒られました。インストールDVDから起動し"Ubuntuを試す"から端末開いて、man 8 grub-installの通りに

# grub-install --boot-directory=/mnt/boot /dev/sda

grubを復旧させても、やっぱり「kernelが見つからん」と怒られます。

今更、再インストールはしたくないので*1UbuntuTips/Others/RepairMbrWithGrub - Ubuntu Japanese Wikiの方法でとりあえず起動させていろいろ試行錯誤してたら、

root@ubuntu-server:~# cat /boot/grub/grub.cfg 
#
# DO NOT EDIT THIS FILE
#
# It is automatically generated by grub-mkconfig using templates
# from /etc/grub.d and settings from /etc/default/grub
#

### BEGIN /etc/grub.d/00_header ###
if [ -s $prefix/grubenv ]; then
  set have_grubenv=true
  load_env
fi
set default="0"
if [ "${prev_saved_entry}" ]; then
  set saved_entry="${prev_saved_entry}"
  save_env saved_entry
  set prev_saved_entry=
  save_env prev_saved_entry
  set boot_once=true
fi

function savedefault {
  if [ -z "${boot_once}" ]; then
    saved_entry="${chosen}"
    save_env saved_entry
  fi
}

function recordfail {
  set recordfail=1
  if [ -n "${have_grubenv}" ]; then if [ -z "${boot_once}" ]; then save_env recordfail; fi; fi
}

function load_video {
  insmod vbe
  insmod vga
  insmod video_bochs
  insmod video_cirrus
}

insmod part_msdos
insmod xfs
set root='(/dev/sdb,msdos10)'
search --no-floppy --fs-uuid --set=root d0e0a7ac-4154-4b6f-940a-fcb4b2720ffa
if loadfont /usr/share/grub/unicode.pf2 ; then
  set gfxmode=auto
  load_video
  insmod gfxterm
fi
terminal_output gfxterm
insmod part_msdos
insmod xfs
set root='(/dev/sdb,msdos10)'
search --no-floppy --fs-uuid --set=root d0e0a7ac-4154-4b6f-940a-fcb4b2720ffa
set locale_dir=($root)/boot/grub/locale
set lang=ja_JP
insmod gettext
if [ "${recordfail}" = 1 ]; then
  set timeout=-1
else
  set timeout=10
fi
### END /etc/grub.d/00_header ###

### BEGIN /etc/grub.d/05_debian_theme ###
set menu_color_normal=white/black
set menu_color_highlight=black/light-gray
if background_color 44,0,30; then
  clear
fi
### END /etc/grub.d/05_debian_theme ###

### BEGIN /etc/grub.d/10_linux ###
if [ ${recordfail} != 1 ]; then
  if [ -e ${prefix}/gfxblacklist.txt ]; then
    if hwmatch ${prefix}/gfxblacklist.txt 3; then
      if [ ${match} = 0 ]; then
        set linux_gfx_mode=keep
      else
        set linux_gfx_mode=text
      fi
    else
      set linux_gfx_mode=text
    fi
  else
    set linux_gfx_mode=keep
  fi
else
  set linux_gfx_mode=text
fi
export linux_gfx_mode
if [ "$linux_gfx_mode" != "text" ]; then load_video; fi
menuentry 'Ubuntu, with Linux 2.6.38-8-generic' --class ubuntu --class gnu-linux --class gnu --class os {
	recordfail
	set gfxpayload=$linux_gfx_mode
	insmod part_msdos
	insmod xfs
	set root='(/dev/sdb,msdos10)'
	search --no-floppy --fs-uuid --set=root d0e0a7ac-4154-4b6f-940a-fcb4b2720ffa
	linux	/boot/vmlinuz-2.6.38-8-generic root=UUID=d0e0a7ac-4154-4b6f-940a-fcb4b2720ffa ro   quiet splash vt.handoff=7
	initrd	/boot/initrd.img-2.6.38-8-generic
}
menuentry 'Ubuntu, with Linux 2.6.38-8-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os {
	recordfail
	set gfxpayload=$linux_gfx_mode
	insmod part_msdos
	insmod xfs
	set root='(/dev/sdb,msdos10)'
	search --no-floppy --fs-uuid --set=root d0e0a7ac-4154-4b6f-940a-fcb4b2720ffa
	echo	'Loading Linux 2.6.38-8-generic ...'
	linux	/boot/vmlinuz-2.6.38-8-generic root=UUID=d0e0a7ac-4154-4b6f-940a-fcb4b2720ffa ro single 
	echo	'Loading initial ramdisk ...'
	initrd	/boot/initrd.img-2.6.38-8-generic
}
### END /etc/grub.d/10_linux ###

### BEGIN /etc/grub.d/20_linux_xen ###
### END /etc/grub.d/20_linux_xen ###

### BEGIN /etc/grub.d/20_memtest86+ ###
menuentry "Memory test (memtest86+)" {
	insmod part_msdos
	insmod xfs
	set root='(/dev/sdb,msdos10)'
	search --no-floppy --fs-uuid --set=root d0e0a7ac-4154-4b6f-940a-fcb4b2720ffa
	linux16	/boot/memtest86+.bin
}
menuentry "Memory test (memtest86+, serial console 115200)" {
	insmod part_msdos
	insmod xfs
	set root='(/dev/sdb,msdos10)'
	search --no-floppy --fs-uuid --set=root d0e0a7ac-4154-4b6f-940a-fcb4b2720ffa
	linux16	/boot/memtest86+.bin console=ttyS0,115200n8
}
### END /etc/grub.d/20_memtest86+ ###

### BEGIN /etc/grub.d/30_os-prober ###
if [ "x${timeout}" != "x-1" ]; then
  if keystatus; then
    if keystatus --shift; then
      set timeout=-1
    else
      set timeout=0
    fi
  else
    if sleep --interruptible 3 ; then
      set timeout=0
    fi
  fi
fi
### END /etc/grub.d/30_os-prober ###

### BEGIN /etc/grub.d/40_custom ###
# This file provides an easy way to add custom menu entries.  Simply type the
# menu entries you want to add after this comment.  Be careful not to change
# the 'exec tail' line above.
### END /etc/grub.d/40_custom ###

### BEGIN /etc/grub.d/41_custom ###
if [ -f  $prefix/custom.cfg ]; then
  source $prefix/custom.cfg;
fi
### END /etc/grub.d/41_custom ###


ん?「set root='(/dev/sdb,msdos10)'」だと??

しょーがないので、update-grubして復旧。

root@ubuntu-server:~# update-grub
Generating grub.cfg ...
Found linux image: /boot/vmlinuz-2.6.38-8-generic
Found initrd image: /boot/initrd.img-2.6.38-8-generic
Found memtest86+ image: /boot/memtest86+.bin
done
root@ubuntu-server:~# cat /boot/grub/grub.cfg 
#
# DO NOT EDIT THIS FILE
#
# It is automatically generated by grub-mkconfig using templates
# from /etc/grub.d and settings from /etc/default/grub
#

### BEGIN /etc/grub.d/00_header ###
if [ -s $prefix/grubenv ]; then
  set have_grubenv=true
  load_env
fi
set default="0"
if [ "${prev_saved_entry}" ]; then
  set saved_entry="${prev_saved_entry}"
  save_env saved_entry
  set prev_saved_entry=
  save_env prev_saved_entry
  set boot_once=true
fi

function savedefault {
  if [ -z "${boot_once}" ]; then
    saved_entry="${chosen}"
    save_env saved_entry
  fi
}

function recordfail {
  set recordfail=1
  if [ -n "${have_grubenv}" ]; then if [ -z "${boot_once}" ]; then save_env recordfail; fi; fi
}

function load_video {
  insmod vbe
  insmod vga
  insmod video_bochs
  insmod video_cirrus
}

insmod part_msdos
insmod xfs
set root='(/dev/sda,msdos10)'
search --no-floppy --fs-uuid --set=root d0e0a7ac-4154-4b6f-940a-fcb4b2720ffa
if loadfont /usr/share/grub/unicode.pf2 ; then
  set gfxmode=auto
  load_video
  insmod gfxterm
fi
terminal_output gfxterm
insmod part_msdos
insmod xfs
set root='(/dev/sda,msdos10)'
search --no-floppy --fs-uuid --set=root d0e0a7ac-4154-4b6f-940a-fcb4b2720ffa
set locale_dir=($root)/boot/grub/locale
set lang=ja_JP
insmod gettext
if [ "${recordfail}" = 1 ]; then
  set timeout=-1
else
  set timeout=10
fi
### END /etc/grub.d/00_header ###

### BEGIN /etc/grub.d/05_debian_theme ###
set menu_color_normal=white/black
set menu_color_highlight=black/light-gray
if background_color 44,0,30; then
  clear
fi
### END /etc/grub.d/05_debian_theme ###

### BEGIN /etc/grub.d/10_linux ###
if [ ${recordfail} != 1 ]; then
  if [ -e ${prefix}/gfxblacklist.txt ]; then
    if hwmatch ${prefix}/gfxblacklist.txt 3; then
      if [ ${match} = 0 ]; then
        set linux_gfx_mode=keep
      else
        set linux_gfx_mode=text
      fi
    else
      set linux_gfx_mode=text
    fi
  else
    set linux_gfx_mode=keep
  fi
else
  set linux_gfx_mode=text
fi
export linux_gfx_mode
if [ "$linux_gfx_mode" != "text" ]; then load_video; fi
menuentry 'Ubuntu, with Linux 2.6.38-8-generic' --class ubuntu --class gnu-linux --class gnu --class os {
	recordfail
	set gfxpayload=$linux_gfx_mode
	insmod part_msdos
	insmod xfs
	set root='(/dev/sda,msdos10)'
	search --no-floppy --fs-uuid --set=root d0e0a7ac-4154-4b6f-940a-fcb4b2720ffa
	linux	/boot/vmlinuz-2.6.38-8-generic root=UUID=d0e0a7ac-4154-4b6f-940a-fcb4b2720ffa ro   quiet splash vt.handoff=7
	initrd	/boot/initrd.img-2.6.38-8-generic
}
menuentry 'Ubuntu, with Linux 2.6.38-8-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os {
	recordfail
	set gfxpayload=$linux_gfx_mode
	insmod part_msdos
	insmod xfs
	set root='(/dev/sda,msdos10)'
	search --no-floppy --fs-uuid --set=root d0e0a7ac-4154-4b6f-940a-fcb4b2720ffa
	echo	'Loading Linux 2.6.38-8-generic ...'
	linux	/boot/vmlinuz-2.6.38-8-generic root=UUID=d0e0a7ac-4154-4b6f-940a-fcb4b2720ffa ro single 
	echo	'Loading initial ramdisk ...'
	initrd	/boot/initrd.img-2.6.38-8-generic
}
### END /etc/grub.d/10_linux ###

### BEGIN /etc/grub.d/20_linux_xen ###
### END /etc/grub.d/20_linux_xen ###

### BEGIN /etc/grub.d/20_memtest86+ ###
menuentry "Memory test (memtest86+)" {
	insmod part_msdos
	insmod xfs
	set root='(/dev/sda,msdos10)'
	search --no-floppy --fs-uuid --set=root d0e0a7ac-4154-4b6f-940a-fcb4b2720ffa
	linux16	/boot/memtest86+.bin
}
menuentry "Memory test (memtest86+, serial console 115200)" {
	insmod part_msdos
	insmod xfs
	set root='(/dev/sda,msdos10)'
	search --no-floppy --fs-uuid --set=root d0e0a7ac-4154-4b6f-940a-fcb4b2720ffa
	linux16	/boot/memtest86+.bin console=ttyS0,115200n8
}
### END /etc/grub.d/20_memtest86+ ###

### BEGIN /etc/grub.d/30_os-prober ###
if [ "x${timeout}" != "x-1" ]; then
  if keystatus; then
    if keystatus --shift; then
      set timeout=-1
    else
      set timeout=0
    fi
  else
    if sleep --interruptible 3 ; then
      set timeout=0
    fi
  fi
fi
### END /etc/grub.d/30_os-prober ###

### BEGIN /etc/grub.d/40_custom ###
# This file provides an easy way to add custom menu entries.  Simply type the
# menu entries you want to add after this comment.  Be careful not to change
# the 'exec tail' line above.
### END /etc/grub.d/40_custom ###

### BEGIN /etc/grub.d/41_custom ###
if [ -f  $prefix/custom.cfg ]; then
  source $prefix/custom.cfg;
fi
### END /etc/grub.d/41_custom ###
root@ubuntu-server:~# 


それにしても、USB mass-storage class deviceが
SATASASの前に割り込んで認識されるkernelの振る舞いって
仕様のバグと思うのは俺だけか?*2

*1:ChromeやらVirtualBoxやら入れ直すのめんどい。あと何入れたか覚えてない。

*2:FreeBSDは/dev/ad0だし、NetBSDは/dev/wd0なんだよね。