自宅新サーバー候補への CentOS 6.0 のインストール

はじめに

先日予告したインストールの方法についてです。

今回は HP ProLiant MicroServer(以下、MicroServer) に HighPoint RocketRAID 2720(以下、RR2720) を装着し、そこに HGST Deskstar 7K3000 HDS723020BLA642(0S03191) を 4 台接続した構成で、CentOS 6.0 をインストールする手順について説明します。

MicroServer に固有のことはその旨記載していますので、RR2720 に CentOS 6.0(あるいは本家 RedHat Enterprise Linux 6 以降、Fedora 12 以降、Scientific Linux 6.0 以降など) をインストール際には他のマシンにおいても参考になるかと思います。

RAID の BIOS 更新

RR2720 装着して MicroServer を起動したところ、BIOS のバージョンが 1.0 と初期版であったため、最新版である 1.2LS へ書き換えることにしました。その方法ですが、Windows がインストール済みであればその状態でアップデートできるのですが、初期状態の MicroServer に装着しているので、その手が取れません。どうしようかとしばらく考えてから、USB 接続によるフロッピーディスクドライブで MS-DOS をブートし、アップデートを行うことにしました(別に RR2720 を装着して書き換えを実施することができるマシンがあるのであれば、それを使用した方が楽でしょう)。

フロッピーディスクドライブは以前 IBM ThinkPad i Series s30 で使用していたものを使用しました(中身は TEAC 製)。これを接続してブート用の MS-DOS システムを入れたディスクを差し込んでしばらくまつと、無事 MS-DOS が起動します。MS-DOS は、Windows XP では フロッピーディスクのフォーマット時に「MS-DOS の起動ディスクを作成する(M)」にチェックを入れると、そのフロッピーディスクで起動できるようになります。おそらく Windows Vista や Windows 7 でも変わってはいないとは思いますが、今回私は試していません(私の環境では、これらの OS をインストールしたマシンにフロッピーディスクドライブを搭載していないため、試しませんでした)。

こうして作成したフロッピーディスクで起動し、「load rr2720.v12」とコマンドをうち、画面に表示される指示に従って更新を実施します。なお、当然ですが、BIOS のアップデート中に電源が落ちないように配慮をする必要があります。また、誤った BIOS を書き込まないようにしなければなりません。RR2720 シリーズ用の RAID 対応 BIOS としてダウンロードできるファイルには関連する 5 つのモデルの BIOS が含まれます。誤ったものを指定しないように注意しましょう。

RAID の設定

RR2720 に付属のマニュアルを参照しつつ自身で必要とする設定で RAID を構築します。私はここで RAID 5 でボリュームを構成しました。今回は 2TB(2000GB) のハードディスクを使用していますので、6TB(6000GB) の RAID 5 ボリュームを作成したことになります(RAID 5 は 1 ドライブ分を減じた容量が記憶容量となります)。

なお、ここでいくつかオプションを選択することができますが、私は初期化をしないように設定して先へ進みました。これは容量が大きいためにとにかく時間がかかるのと、初期化が終了するまでは、どうもステータスが Normal にならないようで、この状態では RAID ボリュームが使用できないようであるためです(私が作業をした場合にはそうでした)。今回は個人用であることもあり、このような選択をしました。使用中にエラーが出たらそのハードディスクを交換すればいいか、という目論見もあります。

必要な設定をして、認識状態が「Normal」になったことを確認してから次のステップへ進みます。

RHEL/CentOS 6.0 用ドライバー入りディスクを作る

続いて、CentOS 6.0 に対応するドライバー入りのディスクを作成します。というのも、このページを書いている時点では、HighPoint Technologies, Inc は RHEL/CentOS 6.0 用のドライバーを公開していないからです。

ここで作成する「ドライバー入りディスク」のために必要なものは以下のものです:

  • 「Linux Open Source」と記述のあるドライバーアーカイブ(rr272x_1x-linux-src-v1.1-legacy_single-110623-1541.tar.gz
  • 「RHEL/CentOS 5.5 x86-64」と記述のあるドライバーディスクアーカイブ(rr272x_1x-rhel_centos-5u5-x86_64-v1.1.10.1221.tgz
  • 作りたいデバイスドライバーと同じアーキテクチャーを採用した RHEL 系 Linux OS の動作しているパソコン

このページを記述している時点では、上記のうちダウンロードする 2 点のアーカイブファイルはこのページでダウンロードすることができます。上記のファイル名も同じ時点のものです。もしも変更されている場合には適宜読み替えてください。3 点目の「作りたいドライバーと同じアーキテクチャーを採用した RHEL 系 Linux OS の動作しているパソコン」は、別のマシンで Oracle VirtualBox を使用して環境を用意しました(実際には同じアーキテクチャーではなくとも、クロスコンパイル環境を作成すれば作れなくもないのですが、それをするよりは同じ環境を用意した方が私にとって楽であったため、このように作業を行いました)。

RedHat Enterprise Linux 系に詳しい方であれば「ドライバー入りディスク」という言葉に違和感があるかと思います。これは、要するに RHEL/CentOS 6.0 向けのにインストーラーが認識するドライバーディスク(DD)を作成するのではなく、インストールに必要なドライバーの入ったディスクを作る、という意味であるということです。RHEL/CentOS 5.5 向けのディスクに RHEL/CentOS 6.0 向けのドライバーを入れただけでは、うまくドライバーディスク(DD)として認識しなかったためです。何かのファイルの書式あるいは形式が変化しているのでしょう。今回は、ドライバーディスクではなく、ドライバー入りディスクを作りインストールを行いました。ドライバーディスクについて深く追っていません(1 台へのインストールできればよかったので)。

「ドライバー入りディスク」は以下の手順で作成します:

  • 「RHEL/CentOS 5.5 x86-64」のアーカイブファイルの内容を展開する
  • RHEL/CentOS 6.0 用のドライバーを生成する
  • RHEL/CentOS 6.0 における仕様変更に対応するため、インストール時に使用するシェルスクリプトを調整する

まず、「RHEL/CentOS 5.5 x86-64」でダウンロードしたファイルを適当なディレクトリに展開します。続いて、このディレクトリに展開したファイル群に RHEL/CentOS 6.0 用のファイルを差し込みます。差し込むファイルは、「Linux Open Source」でダウンロードしたファイルで作成します。このアーカイブファイルを適当なディレクトリに展開し、その展開先ディレクトリをカレントディレクトリにした状態で以下のコマンドを打ちます(強調部分がタイプする内容です):

$ cd product/rr272x/linux_64mpals/
$ make KERNELDIR=/lib/modules/2.6.32-71.el6.x86_64/build
make[1]: ディレクトリ `/usr/src/kernels/2.6.32-71.el6.x86_64' に入ります
  CC [M]  /home/sakaki/rr2720/drivermaker/product/rr272x/linux_64mpals/.build/os_linux.o
  CC [M]  /home/sakaki/rr2720/drivermaker/product/rr272x/linux_64mpals/.build/osm_linux.o
  CC [M]  /home/sakaki/rr2720/drivermaker/product/rr272x/linux_64mpals/.build/div64.o
  CC [M]  /home/sakaki/rr2720/drivermaker/product/rr272x/linux_64mpals/.build/hptinfo.o
  CC [M]  /home/sakaki/rr2720/drivermaker/product/rr272x/linux_64mpals/.build/config.o
  LD [M]  /home/sakaki/rr2720/drivermaker/product/rr272x/linux_64mpals/.build/rr272x_1x.o
  Building modules, stage 2.
  MODPOST 1 modules
WARNING: could not find /home/sakaki/rr2720/drivermaker/product/rr272x/linux_64mpals/.build/.him_rr272x.o.cmd 
for /home/sakaki/rr2720/drivermaker/product/rr272x/linux_64mpals/.build/him_rr272x.o
  CC      /home/sakaki/rr2720/drivermaker/product/rr272x/linux_64mpals/.build/rr272x_1x.mod.o
  LD [M]  /home/sakaki/rr2720/drivermaker/product/rr272x/linux_64mpals/.build/rr272x_1x.ko.unsigned
  NO SIGN [M] /home/sakaki/rr2720/drivermaker/product/rr272x/linux_64mpals/.build/rr272x_1x.ko
make[1]: ディレクトリ `/usr/src/kernels/2.6.32-71.el6.x86_64' から出ます

エラーが発生する場合にはカーネル開発系のパッケージが足りていません。kernel-develkernel-headersgcc などのパッケージがインストールされているか確認し、存在しなければインストールします。なお、ここで使用するカーネルヘッダーは必ず「2.6.32-71.el6.x86_64」(アーキテクチャーが異なる場合には最後のアーキテクチャー示す部分だけ適宜読み替えてください)でなければなりません。これは RHEL/CentOS 6.0 がインストールする際に最初に使用するカーネルのバージョンと一致していなければならないためです。足りない場合にはインストール用の DVD や CD イメージの中に rpm ファイルがありますので、そちらからインストールするといいでしょう。

上記のようにエラーが発生せずに終了した場合には 「rr272x_1x.ko」というファイルが作成されています。これがドライバーファイル(カーネルモジュール)です。

続いてこのファイルをドライバーディスクで使用する cgz 形式のファイルに変更します:

$ mkdir 2.6.32-71.el6.x86_64
$ mkdir 2.6.32-71.el6.x86_64/x86_64
$ cp rr272x_1x.ko 2.6.32-71.el6.x86_64/x86_64/
$ echo "2.6.32-71.el6.x86_64/x86_64/rr272x_1x.ko"  | cpio -ovH crc | gzip -9 > modules.cgz
2.6.32-71.el6.x86_64/x86_64/rr272x_1x.ko
3056 blocks

これで「modules.cgz」というファイルが作成できますので、これを先程「RHEL/CentOS 5.5 x86-64」を展開したディレクトリの同名のファイルと置き換えます。

続いて、この「ドライバー入りディスク」のディレクトリ内のシェルスクリプトを変更します。まずは、rhel-install-step1.sh の 6 行目の以下の部分:

CWD=`dirname $0`

これを以下のように書き換えます:

CWD=/tmp/hptdd

これは RHEL/CentOS 6.0 のインストール中に使用できるコマンドから dirname が外れたためです。その対応として HighPoint Technologies, Inc が提供するインストールの手順説明で書かれているディレクトリをハードコードしています。当然、ハードコードですから、説明以外のディレクトリに移動することはできなくなります。

さらにもう一方のシェルスクリプトである rhel-install-step2.sh の 9 行目の以下の箇所を

CWD=`dirname $0`

から以下のように変更します:

CWD=/tmp/hptdd

さらに 16 行目の以下の箇所を

INITRD=initrd

から以下のように変更します:

INITRD=initramfs

以上で RHEL/CentOS 6.0 をインストールする際に使用する「ドライバー入りディスク」の中は完成です。これフロッピーディスクなり、USB フラッシュメモリードライブなり、RHEL/CentOS 6.0 のインストーラーが認識可能なメディアに書き込みます。

余談ですが、rhel-install-step2.sh は RHEL/CentOS 6.0 用として考えるともっと変更した方がいいのですが、とりあえずこれでもインストールできているので最小限変更ということで前述の変更にとどめています。

ここでの説明は RHEL/CentOS 6.0 のカーネルバージョンにあわせています。他のディストリビューションあるいは同じディストリビューションでもバージョンが異なる場合には、適宜そのディストリビューションがインストール時に使用するカーネルバージョンに各箇所を読み替えてください。

CentOS 6.0 のインストール

MicroServer + RR2720 の環境に CentOS 6.0 をインストールします。

20110815_0[1]

DVD-ROM から起動して、最初に表示される「Welcome to CentOS 6.0!」画面で「Install system with basic video driver」を選択します。これは、インストール後の CentOS 6.0 の動きからその方が良いと判断しました。もしも、内蔵の Radeon HD 6200 相当を有効にしてインストールしたい場合には、「Install or upgrade an existing system」にカーソルを合わせ TAB キーを押して nomodeset とタイプして Enter キーを押します(このカーネルオプションを指定しないと起動時に真っ黒な表示の状態でハングアップします)。ただ、インストール後の描画が乱れた状態になることがあるのでお勧めしません。前述の選択をすることをお勧めします。

20110815_1[1]

インストーラーの操作を続けて、GUI の最初の「CentOS 6 Community ENTerprise Operation System」というロゴが表示された画面で Alt+Ctrl+F2 キーを押します。するとコマンドラインの画面に切り替わるので、USB 接続のフロッピーディスクに「ドライバー入りディスク」を入れ、以下のコマンドを入力して RR2720 をインストーラーの Linux に認識させます(その他のメディアをお使いの方は /dev/sda の部分をそれぞれのメディアに対応する /dev に置き換えて実行する必要があります):

[anaconda root@localhost /]# mkdir /dd
[anaconda root@localhost /]# mount /dev/sda /dd
[anaconda root@localhost /]# cp -r /dd /tmp/hptdd
[anaconda root@localhost /]# umount /dd
[anaconda root@localhost /]# sh /tmp/hptdd/rhel-install-step1.sh
Driver Installation
Driver Installation step 1 completed.
[anaconda root@localhost /]#

以上でインストーラーが RR2720 の RAID ボリュームを見つけられるようになります。ただ、このままでは MBR モードでフォーマットを行おうとするため、2TB 以上の容量が使用できません。今回の私の環境では 6TB の容量があるため、ハードディスクドライブ(RAID ボリューム)を GPT に切り替えます。切り替えは以下のように行います:

[anaconda root@localhost /]# parted
GNU Parted 2.1
Using /dev/sdb
Wlecome to GNU Parted! Type 'help' to view a list of commands.
(parted) mklabel gpt
(parted) quit
Information: You may need to update /etc/fstab.

[anaconda root@localhost /]#

ここでは表示上 /dev/sdb に対する操作となっていますが、場合によっては他のディスクが選択されていることがあります。どれを選択すべきなのかわからない場合には print all コマンドでディスクの一覧を表示することができます。また選択は select コマンドで行います。例えば、/dev/sdb ではなく /dev/sdc を操作したい場合は select /dev/sdc とコマンドを実行します。上で使用している mklabel コマンドでラベルを設定するとそのディスクの内容はすべて消えるので注意が必要です。内容がある(ラベルがある)ディスクに対して実行すると警告が出るので、本当にそのディスクでよいことを確認し、 yes と打てば実行されます。

このインストールの途中の段階で、このコマンド(parted)でパーティションの確保はしない方がいいでしょう。どういうケースで発生するのか何とも言えませんが、インストーラーがクラッシュするようになることがあります。

設定を終えたら Alt+F6 キーでインストーラーの画面へ戻ってインストールを続けます。

20110815_2[1]

ディスクのラベルを GPT に変換した場合には、「どのタイプのインストールをしますか?」の画面で、絶対に「すべての領域を使用する」を選択してはいけません。インストーラーが MBR でフォーマットしようとします。これでは先ほど設定した GPT の設定が無効になってしまいます。ですので「カスタムレイアウトを作成する」を選択するか、その他の選択をした場合には、念のため「パーティションのレイアウトをレビューまた修正」にチェックを入れてパーティションが思い通りに使用されているか確認するといいでしょう。

今回の 6TB といった巨大なディスク容量の場合にはファイルシステムを作成するのもかなり時間がかかります。途中でスイッチを切ってしまったりしないようにしましょう。

ブートローダーは通常通りの設定で大丈夫です。EFI/UEFI 対応ではないマシンでも、2TB を超えるドライブから問題なくブートすることができます。

20110815_3[1]

「おめでとうございます。CentOS のインストールが完了しました。」という画面まで到達したら、Alt+Ctrl+F2 キーを押してコマンドライン画面へ再度切り替え、以下のようにコマンドを実行します:

[anaconda root@localhost /]# cp -r /tmp/hptdd /mnt/sysimage/tmp/
[anaconda root@localhost /]# chroot /mnt/sysimage/
[anaconda root@localhost /]# sh /tmp/hptdd/rhel-install-step2.sh
Driver Installation
Updating 2.6.32-71.el6.x86_64...
Driver installation step 2 completed.
[anaconda root@localhost /]# rm -rf /tmp/hptdd
[anaconda root@localhost /]#

この作業により、起動対象の Linux に対してドライバーを組み込んでいます。このため、この作業をしないで再起動をしてしまうと、カーネル起動後にディスクが見えなくなり、エラーが発生します。

もしもこの作業を実施しないで再起動してしまった場合には、最初からインストールをやり直すか、レスキューで起動して処置することになります。今回はインストールの方法の説明であり、レスキューについては範囲外のため説明を省略しますが、基本的にはこの 2 回目で実行するはずだったことをレスキューで実行するだけですので、その応用でできるでしょう。

作業を終了したら Alt+F6 キーを押してインストーラー画面へ戻り、「再起動(T)」ボタンを押して、残りのセットアップを通常通り続けていきます。セットアップが終了すれば通常通り使用できます。

カーネル更新時対応

「RHEL/CentOS 6 用ドライバー入りディスクを作る」でも説明したように、カーネルドライバーはその対象のカーネル専用です。このため、カーネルを更新するとドライバーが使用できなくなり、RR2720 にあるボリュームも見えなくなります。これを回避するためには、

  1. カーネルの更新をしない
  2. カーネルの更新後にドライバーを再度組み込む

という 2 種類の方法があります。

カーネルの更新をしない場合には、カーネル由来の不具合やセキュリティホールがあった場合に対応できないという問題があります。そこで、カーネルの更新後にドライバーを再度組み込む方法について説明します。

実は、HighPoint Technologies, Inc ではこの場合に対応するための公式の方法を用意していません。このため、そういった作業を説明するマニュアルもありません。そこで、私は更新用のスクリプトを作成しました。ここではそれを使用してドライバーを更新する方法を説明します。いうまでもありませんが、このスクリプトは無保証です。このスクリプトを使用した結果、何らかの損害を生じたとしても さかきけい は責任を負いません。使用者の責任でのみ使用することができます。更新に失敗すると最悪起動できなくなります。

まず、「Linux Open Source」を適当なディレクトリに展開します。なお、この展開した内容を更新用のディレクトリとして使用するので、長く使用することが見込まれるのであれば、わかりやすいディレクトリに展開しておくことをお勧めします。続いて、その展開したディレクトリの中(直下)に rhel6-kernel-update.sh を置きます。

カーネルの更新後にこのスクリプトを実行すると、インストールされているカーネルに合うドライバーを make し、カーネルの起動イメージに組み込みます。実行は以下のように行います(※ root 権限のあるユーザーで実行する必要があります。また引数から自身のディレクトリを取得しているため、相対パスではなく以下のようにフルパスでスクリプトを実行する必要があります):

[root@localhost ~]# sh /root/rr2720update/rhel6-kernel-update.sh
Driver Installation
kernel found - 2.6.32-71.29.1.el6.x86_64
driver making...
WARNING: could not find /root/rr2720update/product/rr272x/linux_64mpals/.build/.him_rr272x.o.cmd 
for /root/rr2720update/product/rr272x/linux_64mpals/.build/him_rr272x.o
Updating 2.6.32-71.29.1.el6.x86_64...
kernel found - 2.6.32-71.el6.x86_64
driver making...
WARNING: could not find /root/rr2720update/product/rr272x/linux_64mpals/.build/.him_rr272x.o.cmd 
for /root/rr2720update/product/rr272x/linux_64mpals/.build/him_rr272x.o
Updating 2.6.32-71.el6.x86_64...
Driver installation completed.
[root@localhost ~]#

更新時に make を実行する関係で、kernel-develkernel-headersgcc などのパッケージがインストールされている必要があります。なお、kernel-develkernel-headers は、インストール済みの各カーネルごとにそれぞれのバージョンが必要です。

カーネルの更新時にうっかり上記の作業をしなかったために起動できなくなった場合には、1 つ前のバージョンのカーネルで起動して作業を行えば OK です。

これらの作業をカーネルの更新時に自動的に実行したい、というようなニーズは結構あるようで、いくつかそういった機構を提供するソフトウェアがあります。興味があればそれらを使用することを考慮してみるとよいかもしれません(例えば DKMS(Dynamic Kernel Module Support) があります)。

おわりに

ただ単に、HP ProLiant MicroServer と HighPoint RocketRAID 2720 を組み合わせたサーバーに CentOS 6.0 を入れるだけのことですが、かなり手間がかかりました。目的は単純なことだったのですが、どうインストールするのか、どういう仕組みなのかということを調べるのにばかり時間がかかってしまい、本来知ろうと思っていなかった事柄に対して無駄に詳しくなりました。というわけで、せっかくなのでメモにまとめてみました。これを読んでみて、ちょっと躊躇した人は Linux カーネルが標準でサポートする RAID デバイスか、OS からはハードディスクドライブに見えるハードウェア RAID などを検討した方が幸せになれると思います。

このメモがどなたかの役に立てば幸いです。