SSブログ

【Ubuntu 9.10】Grub2 でメニューの表示順序を変える [ubuntu]

Ubuntu 9.10ではGrub2が採用されていますが・・・ちょっと私には不都合な部分があります。

というのも、私は自分で再構築したカーネルを使用しているのですが、アップデートがある度にGrub2のメニューがずれてしまいちょっと困ってます。それに、update-grub2 を入力してもGrub2が勝手に存在するカーネルを探してきて、バージョンの高い方から順に表示します。

バージョンの高い方から選び出す仕組みは、/etc/grub.d/10_linuxのソースから追っかけたら、最後は/usr/lib/grub.grub-mkconfig_lib の中で、

dpkg -- compare-versions "$a" $cmp "$b" ($cmpは gt が設定されてます。$a $b にはバージョン、つまり、2.6.31.20-genericとか入ってます)

を繰り返し呼んで一番高いバージョンのを選び出していました。
と、言うことはKernelを再構築する際に、Makefileの中でEXTRAVERSIONを-90-customとかすれば常に一番上にきます。

それでも、やはり順序は変えたい。。でも、/boot/grub/grub.cfg には "DO NOT EDIT THIS FILE"って書いてあるし・・・
では、grub.cfgをいじらなければいいんでしょ。ということで、改造した/etc/grub.d/10_linuxを用意しました。

カーネル名を羅列したファイル(grub2-menu10.cfg)を/etc/grub.d/のディレクトリに放り込むと、grub2-menu10.cfgに書いた順序で書いてあるものだけgrub2のメニューに表示されるようになります。また、grub2-menu10.cfgを削除してしまえば今まで通りの動作をします。

ただ、記述ミスがあったり、操作ミスをするとOSが起動しなくなるのが面倒なのと、これからもカーネルのアップデートがあると思うので2つほどスクリプトを作成しました。

1つは現在インストールされているカーネルを探し出して、grub2-menu10.cfgのテンプレートを作成するもの。

もう1つは、改造10_linuxを入れたり、grub2-menu10.cfgをチェックしてから/etc/grub.d ディレクトリに放り込むものです。(その他にもいくつか機能が付いてます。)

どんな風にやったか詳しく知りたい方は「続きを読む」をご覧ください。

<< 自分流Grub2メニュー順序変更スクリプト>>

Ubuntu 9.10でアップデートマネージャーを使用している場合、新しいカーネルにアップデートされると自動的にupdate-grub2を行います。また、カーネルを削除したときや再構築した時などにupdate-grub2をシェルから入力することもあると思います。まず、update-grub2が何をやっているかというと・・・

 grub2menu01.jpg

update-grub2はupdate-grubをそのまま呼び出しているだけで、update-grubはgrub-mkconfigに出力ファイル/boot/grub/grub.cfgを指定して起動しています。

grub-mkconfigは、/etc/default/grubから必要な情報を読み込んで、まずgurb.cfgを作成してから、/etc/grub.d内のファイルの中のうち、実行ビットの立っているもので、ファイル名の文字コードの小さい方から実行していきます。実行された00_headerや10_linuxなどは、標準出力にcatコマンドでgrub.cfgに追加していっているだけです。それでgrub.cfgを作成しています。

なので、下記の図のように、青字の部分と緑の部分を用意しました。

grub2menu02.jpg

10_linuxに改造をかけて、/etc/grub.d/grub2-menu10.cfgが存在すると実行時に参照して、その記述の順にメニューを作り出します。

下記の3つのスクリプトを1つのフォルダに放り込んでおくと動く仕組みです。

下記が改造した10_linuxのソースです。スクリプトの都合でXX_linuxというファイル名にします。

orderfile変数にファイル名が入っていて、ファイルが存在すると読み込んでcutコマンドで頭から順に取り出していきます。ただ、grub2-menu.cfgが存在するのに中が空だとメニューが作られないということも発生します。特に厳しくチェックはしてません。

次に、 grub2-menu10.cfgを作成するのにインストールされているカーネル名を正確に記述する必要があるので、mk-grub2menutempというスクリプトで、grub2-menu10.cfgのテンプレートを作成します。

テンプレートファイルを出力するスクリプト

実際に出力された、grub2-menu10.cfgの中身は、下記のようになります。

------

/boot/vmlinuz-2.6.31-17-custom
/boot/vmlinuz-2.6.31-20-generic

------

mk-grub2menutempで作成されたgrub2-menu.cfgを編集するのですが、行を消すか入れ替える以外をすると、一応、次に説明するupdate-grub2menuのチェックでエラーでインストールできないようになってます。(ただ、十分テストしたとは言い難いので、ひょっとしたらチェックをすり抜けてしまうかもしれません。)

編集が済んだら、次のupdate-grub2menu(root権限起動)でgrub2-menu.cfgを/etc/grub.dにコピーします。

ただ、その前に改造10_linuxをコピーしておく必要があるので、10_linuxのインストール&アンインストール機能を付けてあります。それ以外にも、インストールしたらupdate-grub2を起動しないとならないので、そのオプションなんかも用意してあります。

メニューファイルをインストールしたりするスクリプト(メイン部分)

機能はもう少しありますが・・・betaオプション全くテストしてません。

今のところ、このスクリプト需要は皆無だと思いますので、自分しか使用しないと思って載せています。どちらかといえば、自分の為(バックアップみたいなもの)と誰かの参考になればと思って記述しています。その上、十分なテストはしていません。なので、スクリプトを持っていっても構いませんが・・・自己責任でお願いします。

英語はいつもの様にめちゃくちゃです。(自分が分かればいい程度)

それとauthorやバージョンが書いてありますが、消してもらって構いません。スクリプトを持っていかれた方が、どっから持ってきたか分かった方がいいかと思って付けているだけです。

ただ、すごい欠点があって、カーネルのアップデートを自動でGrub2のメニューに組み込まないので、アップデートされたのを見逃すと後になって・・・ (・・∂) アレ?いつの間にか新しいカーネルがある。。。ということになります。


タグ:ubuntu linux grub2
nice!(0)  コメント(0) 
共通テーマ:パソコン・インターネット

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

Facebook コメント

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。