yuu_nkjm blog
2011-12-09(Fri) 編集
[grub][Linux][openSUSE][boot][Troubleshooting][Linuxお引っ越し] Linux(OS)が起動しなくなったときにGRUBを再インストールする
grubの再インストール1回目
grubを復旧する方法 - 悠々自適にを参考にしたのだと思う.
grub-installを使う
- インストールメディアを入れる.Rescue Systemで起動する.プロンプトが表示されたら"root"と入力する.
- ブート対象のデバイスを/mntにマウントする.今回は,/dev/sdbというHDDの/dev/sdb2にルートが存在した.
mount /dev/sdb2 /mnt
- /mnt/boot/grub/device.mapの内容を確認する.トラブルシューティングも参照の事.
(hd0) /dev/sda (hd1) /dev/sdb
- grubを再インストールする.以下では,root-directoryを/mntに設定している./mntを/とみなした時の/boot(つまり/mnt/boot)以下にgrubのステージ2以降(?)をインストールする.最後の引数はgrubのステージ1(?)のインストールデバイスである.以下では,/dev/sdbのMBRにgrubのステージ1(?)をインストールしている.ちなみに,ステージ1.5はステージ1と同一のところ(次のセクタ)にインストールされると思ってほぼ問題なさそう.通常は,BIOSからブートされるデバイスを指定すれば良いと思う.ブートフラグの要不要に関する調査はしていない.
grub-install.unsupported --root-directory=/mnt /dev/sdb
grubコマンドのrootと--root-directoryオプションが混乱しやすいな.--root-directoryは単にgrub(ステージ2以降)の設定の出力先と思って良さそう.
man grub-install --root-directory=DIR install GRUB images under the directory DIR instead of the root directory
grubの再インストール2回目
grubコマンドのみで再インストール
grub-installの代わりに以下を入力する.最後のinstallコマンドが見えるので,結局こちらの方が分かりやすいかもしれない.(以下,しげふみメモ : SLES10を内蔵ディスクから高速インストールより)
# grub --config-file=/mnt/boot/grub/menu.lst --device-map=/mnt/boot/grub/device.map grub> root (hd1,0) (注:--root-directoryとは異なり,書き込み先ではなく,読み込み先?stage2を探すとき,ここが/になるのかな.) Filesystem type is xfs, partition type 0x83 grub> setup (hd1) Checking if "/boot/grub/stage1" exists... yes Checking if "/boot/grub/stage2" exists... yes Checking if "/boot/grub/xfs_stage1_5" exists... yes Running "embed /boot/grub/xfs_stage1_5 (hd1)"... 18 sectors are embedded. succeeded Running "install /boot/grub/stage1 (hd1) (hd1)1+18 p (hd1,0)/boot/grub/stage2 /boot/grub/menu.lst"... succeeded Done.
トラブルシューティング
does not have any corresponding BIOS drive.エラーが出る 上記のエラーは、高確率で出ます。原因は、grubのdevice.mapとデバイス情報が一致しないため。OpenSUSEでは、HDDのデバイス名が製品番号になっていて、一般的なsda、sdb等の名前と合わない。 1./boot/grub/device.mapを開き、HDDの名前を/dev/sda に変更する。HDDとデバイス名の関係をみるには、fdiskコマンドを用いてHDDを調べる。
device.mapでgrubのインストール先が決まるので,下手にいじると,既存のブートローダを上書きしてしまい,大変なことになる.grub-installに--recheckというオプションがあるが,USBの外付けHDDにOSを入れるようなケースでは,原則使わない方が良さそう.内蔵HDDと外付けHDDのどちらがhd0になるかが混乱しやすいので,操作者が良く分かった上で実行すべき.
grubの再インストール3回目
grubの設定
デバイスの対応付け
/boot/grub/device.map (hd0) /dev/sda (hd1) /dev/sdb
これらはgrubのインストールの時に使われる.
grubのsetupの設定
lv /etc/grub.conf setup stage2=/boot/grub/stage2 --force-lba (hd1) (hd1,1) quit
hd1のMBRにstage1が書き込まれ,hd1,1にstage2があるよ(書くよ)というのを教えていることになるのかな.(そもそも,grub-installコマンドの最終引数と重なっている様に思うが,どうなんだろ.印象としては,grub-installコマンドの最終引数がdevice.mapを見て/dev/xxxからhdxに変換されて,setupに渡されているのではないかと思うが.)
menu.listのチェック
lv /boot/grub/menu.list root (hd0,1) kernel /boot/vmlinuz-3.1.9-1.4-desktop root=/dev/sdb2
BIOSから直接USB HDDを起動するとUSB HDDはhd0となる.それでも,USB HDDは/dev/sdbにマウントされる様だ(内蔵HDDが/dev/sdaになっていた).このメニューリストの編集はgrubのインストールより後に行っても良いはず.
grubのインストール
# hdxという表記は使えなかった. # grub-install.unsupporetd --root-directory=/mnt hd1 # no device. grub-install.unsupporetd --root-directory=/mnt /dev/sdb /usr/sbin/grub-install.unsupported: line 444: /usr/sbin/grub-set-default: No such file or directory /usr/sbin/grub-install.unsupported: line 484: 2761 Bus error $grub_shell --batch $no_floppy --device-map=$device_map > $log_file << EOF root $root_drive setup $force_lba --stage2=$grubdir/stage2 --prefix=$grub_prefix $install_drive quit EOF Installation finished. No error reported. This is the contents of the device map /mnt/boot/grub/device.map. Check if this is correct or not. If any of the lines is incorrect, fix it and re-run the script 'grub-install'. (hd0) /dev/sda (hd1) /dev/sdb
紆余曲折を経たまとめ
# パターンA device (hd0) /dev/sdb # /dev/sdbとして認識されている外付けHDDを(hd0)とする. root (hd0,1) # (hd0,1)を/としてstage2がインストールされる. setup (hd0) # (hd0)のMBRにstage1がインストールされる.
# パターンB device (hd1) /dev/sdb # /dev/sdbとして認識されている外付けHDDを(hd1)とする. root (hd1,1) # (hd1,1)を/としてstage2がインストールされる. setup (hd1) # (hd1)のMBRにstage1がインストールされる.
BIOSから外付けHDDをブートデバイスとして起動すると,パターンAでもパターンBでも外付けHDDのMBRからブートがはじまることになるので,stage1は実行される.
パターンAでは,stage1に「stage2は(hd0,1)を/とした時の/boot/grubに格納されている」と書かれている.パターンBでは,stage1に「stage2は(hd0,1)を/とした時の/boot/grubに格納されている」と書かれている.BIOSから外付けHDDをブートデバイスとして起動すると,外付けHDDはhd0として認識されるので,前者の設定をしないとstage2を見失う.stage2をロードするまでは,grubは(hdn,m)という指定で生きていくしかないんだな.ちなみに,(hdn,m)と書いたとき,nをハードドライブ番号,mをパーティション番号と言う.
参考ページ
- ブート全体のお話し.オススメ.grubもstage1.5がない場合の説明だけど分かりやすい.
ブート ストラップ コンピュータの起動手順grub の動作概要 grub のインストール位置を MBR に指定すると、インストーラは /boot/grub/stage1 に次の編集を施して MBR へ書き込む。 ・元々 MBR に記録されていた BPB とパーティション テーブルを反映する。 ・ブート ドライブの種別を記録する。 ・/boot/grub/stage2 の先頭セクタ位置 (LBA) 情報を記録する。
- grubの説明.図があって分かりやすい.grub回りの知識の確認にオススメ.
エンタープライズ:Linux How-To 第3回:「GRUBによるブートのカスタマイズ」 - /etc/grub.confの説明.grubコマンドによりstage2をインストールする場所は,/etc/grub.confに書くか,grubに--boot-deviceや--install-partitionを与える様だ.
openSUSE 12.2: 第7章 ブートローダ GRUB
7.1.3. /etc/grub.conf ファイル menu.lst と device.map に続く 3 番目に重要な GRUB の設定ファイルとして、 /etc/grub.conf ファイルがあります。このファイルには GRUB シェルに対するコマンドとパラメータが含まれていて、ブートローダを 正しくインストールするのに必要なファイルです: setup --stage2=/boot/grub/stage2 --force-lba (hd0,1) (hd0,1) quit 上記の例では GRUB に対し、最初のハードディスクにある 2 番目のパーティション (hd0,1) にブートローダをインストールし、起動イメージが同じパーティション内に 存在していることを示しています。 --stage2=/boot/grub/stage2 パラメータは、マウント済みのファイルシステムから 第 2 ステージ のイメージをインストールするために 必要なパラメータです。また、 BIOS によっては LBA サポートの実装が誤っている 場合があるため、 --force-lba を指定してその間違った実装を 無視するように指定しています。
- 2段階ブートとgrubの説明.
Tips: grub2とgrub1の扱い方(様々な再セットアップ方法等) - disklessfun’s Wiki*2段階ブートの場合、たとえばこのように、 # grub grub> root (hd1,0) ←rootで指定するのはmenu.lst(grub.conf),stage2等の場所 (注:--root-directoryとは異なり,書き込み先ではなく,読み込み先?) grub> setup (hd1,0) ←setupで指定するのはgrub(grubのstage1)の書き込み先 setupで指定するデバイスをハードディスク(の先頭)ではなくパーティション(の先頭)とします。 上は母艦上の作業としてのサンプルですが、 普通にLinuxをブートし、そのOS上でブートの方式を1段階ブートから2段階ブートに変更する場合であれば、たとえば、 # grub grub> root (hd0,0) ←rootで指定するのはmenu.lst(grub.conf),stage2等の場所 grub> setup (hd0,0) ←setupで指定するのはgrub(grubのstage1)の書き込み先 こんな感じになります。もちろん詳細は適宜自身の環境に合わせて下さい。 マルチブート環境の場合、↑このように、grubをPBR(パーティションの先頭セクタ)にセットアップすることを強く推奨します。
- grubの説明
Gentoo Linux ドキュメント -- ブートローダを設定するコード表示 2.8: GRUBをMBRにインストールする grub> root (hd0,0) (/bootパーティションの場所を指定します) grub> setup (hd0) (MBRにGRUBをインストールします) grub> quit (GRUBシェルを終了します) 注意: GRUBをMBRではなく、特定のパーティションにインストールしたいなら、 setupコマンドの部分を編集して、それが正しいパーティションを指すようにします。 例えば、GRUBを/dev/sda3にインストールしたい場合、setup (hd0,2)というコマンドになります。しかしながら、こういうことをしたいユーザはあまりいません。
- grubコマンドの実行例あり.
しげふみメモ : SLES10を内蔵ディスクから高速インストール - USBメモリからブート
めも - Grub曰く"/dev/*d* does not have any corresponding BIOS drive" - openSUSE
grubを復旧する方法 - 悠々自適に - Ubunts
GRUBブートローダの再インストール | Nibelungen Code - device.mapを直せという話し.
grub の corresponding エラーgrub-install /dev/hda Installation finished. No error reported. This is the contents of the device map /boot/grub/device.map. Check if this is correct or not. If any of the lines is incorrect, fix it and re-run the script `grub-install'. (fd0) /dev/fd0 (hd0) /dev/hda (hd1) /dev/hdb
- LinuxRAID1Transition ? アクセンスのおまけ
- GRUB 用語
2.4.3. ルートファイルシステムとGRUB GRUB で言うルートファイルシステムは違う意味の用語になります。GRUB のルートファイルシステムは Linux のルートファイルシステムとは無関係であると覚えておいてください。 GRUB ルートファイルシステムは指定デバイスの最上位部です。例えば、イメージファイル (hd0,0)/grub/splash.xpm.gz は、(hd0,0)パーティション (実際はシステムの/boot/パーティション) の最上位(又はroot)にある /grub/ ディレクトリに格納されます。 次ぎに、オプションとしてカーネルファイルの場所を持ったkernel コマンドが実行されます。Linux カーネルがブートすると、Linux ユーザーに馴染みのルートファイルシステムを設定します。オリジナルの GRUB ルートファイルシステムとそのマウントは無視されます。これらはカーネルファルをブートするためだけに存在します。 詳細については、項2.6のrootコマンドとkernelコマンドを参照してください。
- Windows boot - GNU GRUB Manual 0.97
このページの設定は他のサイトのマルチブートの設定と異なる.分かるような分からないような.mapの効果の範囲がわからん.結局分からん.grubからコマンドを叩く,grub.confに書く,menu.listに書くの場合で,(mapのタイミングなどにより)設定の仕方が異なるのか?map (hd0) (hd1) map (hd1) (hd0) rootnoverify (hd0,0) ← 後者でなく,こっちの設定は納得. # hideしたりしなかったり chainloader +1 boot
title Windows # map (hd0) (hd1) ← この記述は無くても動作する(むしろ,あったら動作しなくない?) map (hd1) (hd0) rootnoverify (hd1,0) ← 上がコメントアウトされていない場合,このhd1ってmapされる前とされた後のどっちや.rootコマンドを叩く位置を変えたら検証できそうだな.mapの効果は,boot以降なのかな. chainloader +1 ← (hd1,0)のチェーンローダが呼ばれるってことだよな.
- 異なるHDDでデュアルブート - ソフトエンジニア現役続行
これは (hd0,0)を書く流儀. - map - GNU GRUB Manual 0.97
"map to_drive from_drive"なことに注意. - DualBoot
よくまとまっている. - openSUSE 12.2: 第7章 ブートローダ GRUB
Windows を 2 台目のハードディスクから起動する方法 Windows のようなオペレーティングシステムでは、 1 台目のハードディスクからのみ 起動することができます。 1 台目以外のハードディスクにそのようなオペレーティング システムをインストールした場合は、関連するメニュー項目を編集することで、論理的な 変更を行なうことができます。 ... title windows map (hd0) (hd1) map (hd1) (hd0) chainloader(hd1,0)+1 ... 上記の例では、 Windows が 2 台目のハードディスクから始まっていることを示して います。ハードディスクの論理的な順序は map コマンドで 変更することができます。この仕組みは、 GRUB のメニューファイルには影響 しません。そのため、 2 台目のハードディスクは chainloader に指定しなければなりません。
最後の1行が重要だと思うけど,意味がはっきりとは分からん.mapコマンド以降に発行されているが,上記のchainloader(hd1,0)+1は(入れ替えとかを考える前の)2台目のHDDの第1パーティションのローダを呼び出しているって事だよな. - In menu option when booting. - Win7PE - reboot.pro, Grub4dos Guide - Map Command grub4dosの"map --hook"みたいなのがあると分かりやすい.腑に落ちない点もあるが,あとはケースバイケースで対応するか.
2012-12-09(Sun) 編集
[WordPress] サイトURL,ホームURLの修正
管理画面から誤ったサイトURL,ホームURLを指定すると,あっさりとWordpressにアクセスできなくすることが出来る.何度かやらかしたなこれ.
サイトURL,ホームURLはDBに記録されているが,wp-config.phpでも設定可能.
define('WP_SITEURL', '正しいアドレス'); define('WP_HOME', '正しいアドレス');
DBの修正はこんな感じ.
use wpdb select option_value from wp_options where option_name = 'home'; select option_value from wp_options where option_name = 'siteurl'; update wp_options set option_value='http://NEW_URL/' where option_name='siteurl'; update wp_options set option_value='http://NEW_URL/' where option_name='home';