お知らせ

  • 利用規約を守って投稿してください。また、よくある質問および投稿の手引きも参照してください。
  • メッセージの投稿にはアカウントが必要です。未登録の方は、ユーザ登録ページからアカウントを作成することができます。

#1 2010-02-28 08:29:39

goldengriffin
メンバ
登録日: 2009-11-08

GRUB2 のメニューを出すには?

マシンを新調して Win7 専用にしたので,古いマシンを PC-UNIX 専用にすることにしました.Ubuntu 9.10 (x86) を以下のようなパーティション構成でインストールしました.

/dev/sda1 /boot
/dev/sda5 /
/dev/sda6 /home
/dev/sda7 /var
/dev/sda8 swap

ここで,GRUB2 を /boot にインストールしたのですが,起動時にメニューが出てきません.Windows などの他の OS が入っていないので当然か?とも思ったのですが,カーネルをアップデートして,/boot に複数のカーネルファイルがある状態で update-grub を実行した後でもメニューが出てきません.

どの設定ファイルを修正すれば良いのでしょう?memtest も実行させたいので,ちょっと不便.

オフライン

 

#2 2010-02-28 09:09:24

hmatsue
アドバイザ
登録日: 2009-03-10

Re: GRUB2 のメニューを出すには?

この辺を参照下さい。
https://forums.ubuntulinux.jp/viewtopic.php?id=6092

私は、/etc/default/grubの最初の部分を以下のように書き換えました。

コード:

# If you change this file, run 'update-grub' afterwards to update
# /boot/grub/grub.cfg.

GRUB_DEFAULT=0
#GRUB_HIDDEN_TIMEOUT="3"
#GRUB_HIDDEN_TIMEOUT_QUIET=false
GRUB_TIMEOUT="3"

これでメニューはでています。
適切な設定かどうかはさておき。。

オフライン

 

#3 2010-02-28 10:37:08

goldengriffin
メンバ
登録日: 2009-11-08

Re: GRUB2 のメニューを出すには?

hmatsue さん

ご回答ありがとうございます./etc/dafaults/grub を書き換えるのですね.やってみます.

GRUB2 では,このあたりの設定や,他の OS が見つからない場合の挙動が GRUB のころとだいぶ変わってしまったので,戸惑っています.フロッピーにもインストールできなくなったし.

オフライン

 

#4 2010-02-28 14:38:16

goldengriffin
メンバ
登録日: 2009-11-08

Re: GRUB2 のメニューを出すには?

hmatsue さん

おかげさまでメニューが出るようになりました.複数のカーネルファイルも選択できるようになりました.

しかし,memtest86+ はメニューに出てくるし /boot に memtest86+.bin というファイルがあるにもかかわらず,メニューで選択してもそういうファイルは見つからないといって起動できません.なぜでしょう?

オフライン

 

#5 2010-02-28 15:22:07

hmatsue
アドバイザ
登録日: 2009-03-10

Re: GRUB2 のメニューを出すには?

おかしいですね。試しに自分の環境でmemtest86+を実行してみましたが、こちらでは問題無く実行できました。
/boot/grub/grub.cfgの中に下記の記述があります。

コード:

### BEGIN /etc/grub.d/20_memtest86+ ###
menuentry "Memory test (memtest86+)" {
        linux16 /boot/memtest86+.bin
}

同様の記述がありますでしょうか。ある場合は、端末で、
$ file /boot/memtest86+.bin
などとして、
/boot/memtest86+.bin: Linux x86 kernel
のような出力がでるか確認してみて下さい。
記述が無い場合は、なんでしょう。すんません。今のところアイデアがないです。。

オフライン

 

#6 2010-02-28 16:42:32

goldengriffin
メンバ
登録日: 2009-11-08

Re: GRUB2 のメニューを出すには?

hmatsueさん,いろいろご教示いただき,ありがとうございます.

試してみました.まず /boot において sudo update-grub を実行した時に出てくるメッセージがおかしい.

コード:

Found memtest86+ image: /memtest86+.bin

とでてきますが,これは正しくは

コード:

Found memtest86+ image: /boot/memtest86+.bin

であるべきでしょう.それでは?と思い,次に /etc/grub.d/20_memtest86+ を疑いました.

コード:

if test -e /boot/memtest86+.bin ; then
  MEMTESTPATH=$( make_system_path_relative_to_its_root "/boot/memtest86+.bin" )
  echo "Found memtest86+ image: $MEMTESTPATH" >&2
  cat << EOF
menuentry "Memory test (memtest86+)" {
        linux16 $MEMTESTPATH
}
menuentry "Memory test (memtest86+, serial console 115200)" {
        linux16 $MEMTESTPATH console=ttyS0,115200n8
}
EOF
fi

となっているうち,make_system_path_relative_to_its_root が正しく働いていないように見えます.これを無理やり変更して,

コード:

MEMTESTPATH="/boot/memtest86+.bin"

と決め打ちして,update-grub を実行すると,

コード:

Found memtest86+ image: /boot/memtest86+.bin

と正しくメッセージが出ます./boot/grub/grub.cfg を見ると,

コード:

### BEGIN /etc/grub.d/20_memtest86+ ###
menuentry "Memory test (memtest86+)" {
        linux16 /boot/memtest86+.bin
}
menuentry "Memory test (memtest86+, serial console 115200)" {
        linux16 /boot/memtest86+.bin console=ttyS0,115200n8
}
### END /etc/grub.d/20_memtest86+ ###

と正しく出ているので,目出度し目出度しと思ってリブートしますが,メニューで memtest86+ を選んでも,ファイルが無いというエラーが出ます./boot/memtest86+.bin は存在し,file コマンドで調べると,Linux x86 kernel と出てきますので,間違ってはいないと思うのですが・・・

オフライン

 

#7 2010-02-28 17:22:07

hmatsue
アドバイザ
登録日: 2009-03-10

Re: GRUB2 のメニューを出すには?

/dev/sda1 /boot
/dev/sda5 /
/dev/sda6 /home
/dev/sda7 /var
/dev/sda8 swap

この辺のパーティションの切り方の問題でうまく動かないのでしょうか。

試してみました.まず /boot において sudo update-grub を実行した時に出てくるメッセージがおかしい.

コード:

Found memtest86+ image: /memtest86+.bin

Ubuntuが起動する前は、/dev/sda1がどこにマウントされるか判らないので、grubからは/dev/sda1の「/」がgrub領域になっているように見えます。そのためわざわざ/memtest86+.binとして出力されているのではないかと思います。
が、元々の状態で/memtest86+.binになっていて、それでも起動しないのでしたっけ。

オフライン

 

#8 2010-02-28 17:51:21

chinajunk
メンバ
From: 越中
登録日: 2009-06-15

Re: GRUB2 のメニューを出すには?

パーティション決め打ちでよければ /etc/grub.d/20_memtest86+ で

menuentry "Memory test (memtest86+)" {
    set root=(hd0,1)          # 各自の環境に合わせて
    linux16 $MEMTESTPATH
}

でどうでしょう

オフライン

 

#9 2010-02-28 20:43:13

hir0
メンバ
登録日: 2008-09-28

Re: GRUB2 のメニューを出すには?

しかし,memtest86+ はメニューに出てくるし /boot に memtest86+.bin というファイルがあるにもかかわらず,メニューで選択してもそういうファイルは見つからないといって起動できません.なぜでしょう?

bootを分けているので/dev/sda5にあるbootディレクトリはマウント用で中身は空です。

menuentry "Memory test (memtest86+)" {
    insmod ext2
    set root=(hd0,1)
    search --no-floppy --fs-uuid --set ****-****-****
    linux /boot/memtest86+.bin

****-****-****は/dev/sda1のUUID

オフライン

 

#10 2010-02-28 21:30:25

goldengriffin
メンバ
登録日: 2009-11-08

Re: GRUB2 のメニューを出すには?

皆様,

皆様のおかげでだいぶ分かってきました.最後の hir0 さんのコメントがどうやら核心をついているような気がします.やはり UUID を指定しなければならないのでしょうか?このあたりは GRUB2 の改善項目であるような気がします.

今日は,事情があって確認することができませんが,明日以降,試してみてご報告したいと思います.

どうもありがとうございました.

オフライン

 

#11 2010-02-28 21:52:18

einundzwanzighundertsechs
メンバ
登録日: 2008-12-28

Re: GRUB2 のメニューを出すには?

/boot が別のパーティションなので,memtest86+.bin をロードする時のパスは/boot無し

コード:

        linux16 /memtest86+.bin

が正しいのです.ですから私は「grub 変数 root の設定がおかしい」のではと疑いました.
私の grub.cfg では

コード:

menuentry "Ubuntu, Linux 2.6.31-19-generic" {
        recordfail=1
        if [ -n ${have_grubenv} ]; then save_env recordfail; fi
        set quiet=1
        insmod ext2
        set root=(hd1,1)
        search --no-floppy --fs-uuid --set …
        linux   /boot/vmlinuz-2.6.31-19-generic root=UUID=… ro   quiet splash
        initrd  /boot/initrd.img-2.6.31-19-generic
}
...中略...
menuentry "Memory test (memtest86+)" {
        linux16 /boot/memtest86+.bin
}

となっています.Memory test のエントリにはカーネルのエントリに有る set root=… とかが有りません.
ですから,逆に何故私の環境では memtest86+ が起動可能なのかを考えました.

grub.cfg のずっと前の部分に

コード:

insmod ext2
set root=(hd1,1)
search --no-floppy --fs-uuid --set …
if loadfont /usr/share/grub/unicode.pf2 ; then

とがありここで 変数 root が設定されています.これらの行の由来は /etc/grub.d/00_header の

コード:

case x${GRUB_TERMINAL_OUTPUT} in
 xgfxterm)
    # Make the font accessible
    prepare_grub_to_access_device `${grub_probe} --target=device ${GRUB_FONT_PATH}`

    cat << EOF
if loadfont `make_system_path_relative_to_its_root ${GRUB_FONT_PATH}` ; then

の部分です.つまりここでの insmod …,set root=… と search は loadfont コマンドがフォントを見つけるようにするために挿入されていて,決してデフォルト値の設定などでは無いと解りました.
私の環境の様に /boot と / が同じパーティションであれば memtest86+.bin の存在するパーティションが 変数 root のデフォルト値であるかの様に設定され,問題に気づきません.

goldengriffin さんの場合 /boot → (hd0,1) と / → (hd0,5) ですから,/usr/share/ 以下のフォントファイルをロードするためには loadfont の前には,

コード:

set root=(hd0,5)
search --no-floppy --fs-uuid --set …

とあるはずです.

私の結論では,update-grub は /boot が別パーティションであることを考慮して,Memory test のエントリについても

コード:

menuentry "Memory test (memtest86+)" {
        insmod ext2
        set root=…
        search --no-floppy --fs-uuid --set …
        linux16 /boot/memtest86+.bin
}

の様なコードを生成するべきだと思います.これは /etc/grub.d/20_memtest86+ のバグだと思います.

オフライン

 

#12 2010-03-01 23:03:53

goldengriffin
メンバ
登録日: 2009-11-08

Re: GRUB2 のメニューを出すには?

einundzwanzighundertsechs さま,他の皆様

おかげさまで,とりあえず動くようになりました.決め手となったのは,やはり einundzwanzighundertsechs さんが最後に示唆していただいた部分です.これを生成するように,/etc/grub.d/20_memtest86+ を以下のように書き直しました.

コード:

if test -e /boot/memtest86+.bin ; then
  MEMTESTPATH=$( make_system_path_relative_to_its_root "/boot/memtest86+.bin" )
  echo "Found memtest86+ image: $MEMTESTPATH" >&2
  cat << EOF
menuentry "Memory test (memtest86+)" {
        # -- insertion start --
        insmod ext2
        set root=(hd0,1)
        search --no-floppy --fs-uuid --set ...
        # -- insertion end --
        linux16 $MEMTESTPATH
}

本当は,UUID を自動生成するようなコードを書かなければならないのでしょうが,10_linux を読んでもよく理解できなかったので,/boot/grub/grub.cfg からコピーして決め打ちしてあります.

これはやはり 20_memtest86+ のバグと思ってよいのでしょうね.いずれにせよ,大変ありがとうございました.勉強になりました.

オフライン

 

Board footer

Powered by FluxBB