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"みたいなのがあると分かりやすい.腑に落ちない点もあるが,あとはケースバイケースで対応するか.

2011-12-08(Thu) [長年日記] 編集

[ssh][openSUSE] ssh(sshd)のトラブルシューティング

localhostから接続できるか確認する

localhostから繋がるかを確認する.つながらなかったら,ネットワークではなく,sshdの方が原因の可能性が高い.つながったら,ネットワークの方が怪しい.

ネットワークの疎通を確認する

ネットワークに接続出来ているか確認する.ネットワークに接続できない - yuu_nkjm blog(2012-02-03).また,tsharkを使って22番ポートにパケットが到達しているかを調べる.TCP/UDPパケットをtshark(Wireshark)でキャプチャ - yuu_nkjm blog(2008-08-19)

ssh hoge@localhost

ファイヤウォールやパケットフィルタソフト(iptables,suse firewall,fail2banなど)の設定を確認する

こいつらが蹴ってることも多い.

sshdをデバッグモードで起動する

SSHD の詳細なデバッグ情報を表示させる方法 - WebOS Goodiesを参考にした.openSUSEの場合では,yast->/etc/sysconfigエディタ->Network/Remote access/SSHの$SSHD_OPTSに"-d"を与える.より詳細なデバッグログを見れるデバッグモードで起動したい場合は"-d -d"のように重ねる.最大で-dを三つまで並べられる.

デバッグモードで起動するとsshdはforkされない(複数の端末からログインできない)ことに注意する.ログレベルをdebugにするとは違うことに注意する.SSHD (8)

sshdのログレベルを変更するには,sshd_configのLogLevelを変更する.SSHD_CONFIG (5)

#LogLevel INFO   デフォルトはINFO
LogLevel DEBUG
tail -f /var/log/messages

tailなどを使って,sshdログを監視する.

sshdをIPv4のみで使う

上述の$SSHD_OPTSに"-4"を与える.sshdをv4のみしか扱わないように設定する必要があったことがあったんだけど,なんでだったかな….

鍵でしかログインさせない場合でも,パスワードの設定は必要

Ship of Fools: sshの鍵ファイル認証にてハデにハマる.これか?と思ったけど,関係なかった.結局,ログインしようとしているユーザにpasswordが設定されていないだけだった.

SSH+X11

SSH+X11接続をする場合,X Window Systemが参考になった.

Failed to allocate internet-domain X11 display socket.

というエラーが出た.対策はこちら.X11フォーワディングをしようとしたとき,DISPLAY変数に値が設定されない - yuu_nkjm blog(2011-08-01)


2011-12-07(Wed) [長年日記] 編集

[openSUSE][Apache][Tomcat] ApacheとTomacatの連携(jk版)

注記

jkをいれたけど,mod_proxy_ajpの方が良かった気がする.mod_proxy_ajpというパッケージがzypperで見つからないけど,mod_proxy_ajpは標準モジュールだから,apache2.2のインストールと共にインストールされるんだな.

インストール

yastでapache2とtomcat6をインストールする. (yast-> ソフトウェアインストール -> yast-http-serverをインストールした.これはやってもやらなくても良い.)

apacheモジュールのインストール

/etc/sysconfigエディタ-> Network/WWW/Apache2 -> APACHE_MODULESでjkを追加する.

/usr/sbin/httpd2 -M

として,apacheがロードしたモジュールを確認.

設定ファイルの編集

$CATALINA_HOME/conf以下にworkers.propertiesを作る.

# lv $CATALINA_HOME/conf/workers.properties
worker.list=worker1
 
worker.worker1.port=8009
worker.worker1.host=localhost
worker.worker1.type=ajp13

/usr/share/doc/packages/apache2-mod_jk/jk.confにjk.confの雛形があるので,/etc/apache2/conf.dにコピーする.

# lv /usr/share/doc/packages/apache2-mod_jk/jk.conf
# simple configuration for apache (for AJP connector, modul mod_jk.so)
<IfModule mod_jk.c>
     JkWorkersFile /etc/tomcat5/base/workers.properties
    JkLogFile /var/log/tomcat5/base/mod_jk.log
 
    # Log level to be used by mod_jk
    JkLogLevel error
 
    # The following line makes apache aware of the location of
    # the /servlets-examples context
    Alias /servlets-examples "/srv/www/tomcat5/base/webapps/servlets-examples"
    <Directory "/srv/www/tomcat5/base/webapps/servlets-examples">
        Options Indexes FollowSymLinks
        allow from all
    </Directory>
 
    # The following line makes apache aware of the location of
    # the /jsp-examples context
    Alias /jsp-examples "/srv/www/tomcat5/base/webapps/jsp-examples"
    <Directory "/srv/www/tomcat5/base/webapps/jsp-examples">
        Options Indexes FollowSymLinks
        allow from all
    </Directory>
 
    # The following line mounts all JSP files and the /servlet/ uri to tomcat
    JkMount /servlets-examples/servlet/* ajp13
    JkMount /jsp-examples/*.jsp ajp13
 
    # The following line prohibits users from directly accessing WEB-INF
    <Location "/jsp-examples/WEB-INF/">
        AllowOverride None
        deny from all
    </Location>
    <Location "/servlets-examples/WEB-INF/">
        AllowOverride None
        deny from all
    </Location>
</IfModule>

上記設定ファイルの"Alias /servlets-examples"あたりを参考に,自分の呼び出したいサーブレットを呼び出すような設定を書けばOK.

トラブルシューティング

バーチャルホストの扱いに注意する.

 Re: Apache2.2 / Tomcat6 / mod_jk / Suse 11.1
I figured out what was wrong: VirtualHosts. 
 
I configured two virtual hosts in apache. The tomcat connector (mod_jk) was included in httpd.conf in the top level, outside of a virtual host definition. I was assuming that calls to http://localhost/ would NOT be handled by a virtual host if there was no name-matching virtual host. 
 
That was wrong, ALL requests are handled by virtual hosts if you define them. If no matching host is found, the first one listed is used. 
 
Hence, moving the jk config inside a virtual host element solved the problem. So, I included the following in a VirtualHost element.

トップ 最新 追記 設定
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|