yuu_nkjm blog


2011-12-09(Fri) 編集

[grub][Linux][openSUSE][boot][Troubleshooting][Linuxお引っ越し] Linux(OS)が起動しなくなったときにGRUBを再インストールする

grubの再インストール1回目

grubを復旧する方法 - 悠々自適にを参考にしたのだと思う.

grub-installを使う

  1. インストールメディアを入れる.Rescue Systemで起動する.プロンプトが表示されたら"root"と入力する.
  2. ブート対象のデバイスを/mntにマウントする.今回は,/dev/sdbというHDDの/dev/sdb2にルートが存在した.
    mount /dev/sdb2 /mnt 
    
  3. /mnt/boot/grub/device.mapの内容を確認する.トラブルシューティングも参照の事.
    (hd0)   /dev/sda
    (hd1)   /dev/sdb
    
  4. 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';

トップ «前の日(12-08) 最新 次の日(12-10)» 追記 設定
2006|01|06|12|
2007|06|09|
2008|01|03|04|06|07|08|09|10|12|
2009|01|02|05|06|07|08|10|11|12|
2010|03|04|05|06|07|08|09|10|11|
2011|01|02|03|04|05|06|07|08|09|11|12|
2012|01|02|04|06|07|08|10|11|12|
2013|01|02|03|07|08|10|11|12|
2014|01|02|04|05|06|07|08|09|10|11|
2015|01|02|07|11|12|
2016|01|03|05|07|08|09|