久しぶりに Linux サーバーの構築をやることになり、ローレベルなところでハマってしまったので備忘録。
SSD と HDD を積んだ計算機で、SSD にはサービスで使うデータを置いて、HDD には OS その他の比較的速度を求めないものを置きたい。したがって HDD に OS をインストールし、SSD を丸ごと特定ディレクトリにマウントする形を採用しようとした。で、その通りにパーティションを定義してフォーマットして Ubuntu Server 16.04.3 のセットアップを完了したところ、「OS が起動しない」という始末になった。
実機を前に結構な時間を費やして悩んだのだけれど時間切れとなったので、帰宅後に 2 台の HDD を持つ仮想マシンを VirtualBox で作成して問題を再現し、いちおう解決した。どうやら、SSD と HDD の認識順序がポイントのようだった(なお構築するサーバーの中身を開けることはできず、SSD と HDD を接続するポートを交換して物理的に認識順序を逆転させることはできない)。再現したことの中で重要なポイントは以下 4 つ:
- BIOS 上では 2 台の HDD が認識されている(認識順に HDD1、HDD2 とする)
- HDD2 に OS をインストールするよう指定(Ubuntu オススメにしたがってパーティションを定義)
- HDD1 は全体を一つのパーティションにして
/srv
にマウントするよう指定 - HDD2 の MBR にブートローダー (GRUB) をインストール
こうしたところ、めでたく問題が再現して OS が起動しない状態になった。
少し試行錯誤したところ、起動時にブートメニューを開いて HDD2 を指定すると普通に起動することが分かった。そういえば VirtualBox の設定画面ではブートシーケンスをデバイス単位でなく機器種別の単位でしか指定できない。すると、HDD (ここではSSDを含む) を複数搭載した仮想マシンで 2 台目以降の HDD にインストールした OS を起動可能にするには、最初に認識される HDD の MBR にブートローダーを入れておく必要があるのだろうか?であれば、自分の理解が正しいか怪しいけれど、次のコマンドを HDD2 にインストールした Linux で実行すれば HDD1 の MBR に「HDD2 上の /boot
以下のファイルを使用してブートする」ような情報が書き込まれ、普通に起動可能になるはずだ:
sudo grub-install /dev/sda
理解が正しいかどうかはさておき、これを実行したところ、ブートメニューで HDD2 を毎回指定せずとも自動的に HDD2 にインストールした Linux が起動するようになった。とりあえず VirtualBox での再現環境では、この手順で問題はクリアできたもよう。
明日、実際のサーバーでも試してみるとしよう。上手くいくといいなぁ。