まだプログラマーですが何か?

プログラマーネタとアスリートネタ中心。たまに作成したウェブサービス関連の話も http://twitter.com/dotnsf

普段のアプリケーション開発コーディングには Eclipse を使っています。

最近、バージョン管理に Subversion(SVN) を使うようになり、 Eclipse 環境にも SVN プラグインを導入していました。が、どうもこれがちと問題(仕様?)で、Eclipse のプロジェクトを壊す原因になってしまうらしい。。
Bug 111368 - project clean & build copies subversion .svn folders to bin tree
 
とはいえ Eclipse を捨てる選択肢はないので設定で回避。プロジェクトのプロパティから Java Build Path - Source を選び、Excluded 欄に **/.svn/* を追加
2013102101


これで svn の同期設定のために生成されるフォルダはコピーの対象外になって、プロジェクトの破壊を回避できるようになった。 
 

Linux を使っているとディスクのパーティショニングに頭を悩ませることがあります。最近の Linux ディストリビューションは賢くできていて、特に何も指定しなくてもデフォルト設定のまま導入をしていく中で全容量などから自動的に最適(と思われる)パーティショニングを特定して、分割した上で導入してくれます。

その自動判断されたパーティションの割り振り方が本当に最適な内容であれば理想なのですが、現実はそうでないことが多いです。ディスク全体ではまだ余裕があるのに、特定のパーティションだけが残り少なくなってしまうケースは珍しいとは思えません。かといって全部をルートパーティションにするというのも万が一の際に全てを失ってしまうことになって・・・ というトレードオフです。

ところで、CentOS は普通に導入すると、そのディスクパーティショニングには標準で LVM(Logical Volume Manager : 論理ボリューム管理) が適用されます。深く考えずにデフォルト設定のまま Enter キー連打で導入すると LVM のパーティションが出来上がるので、導入後に「あ、LVM だった」と気付く人もいると思います(少なくともここに一人・・ σ(^^;)。

この LVM は柔軟な割り当てができるようになっていて、専用ツールなどを使わなくても、パーティション割り当てを導入後でも比較的容易に(開始ポイントや終了ポイントを意識することなく、サイズの指定だけで)変更することができます。 今回はこの LVM のパーティションニングを動的に変更する手順を紹介します。

まず前提として、現在の LVM によるパーティション内容は以下のようになっているものとします:
ファイルシステムサイズ用途
/dev/mapper/VolGroup-lv_root4.0GBルートファイルシステム
tmpfs500MBスワップ領域
/dev/mapper/VolGroup-lv_var4.5GB/var にマウント

これを最終的には以下のようなパーティショニングに変更することを今回の目的とします。もちろんこの変更によって容量の減る /var 以下のディスクが足りなくなることはないものとします:
ファイルシステムサイズ用途
/dev/mapper/VolGroup-lv_root6.5GBルートファイルシステム
tmpfs500MBスワップ領域
/dev/mapper/VolGroup-lv_var2.0GB/var にマウント

以下その手順を紹介しますが、大まかにはこのような手順をとります:
(1) /dev/mapper/VolGroup-lv_var を縮小
(2) /dev/mapper/VolGroup-lv_root を拡大

逆の手順は成立しないことを理解してください。最初にいきなりルートファイルを拡大しようとしてもディスクそのものに未使用の領域がない限りは足りなくなります。まずはどこかを減らして余りを作り、その余りを別のパーティションに追加する、という順序が必要になります。

というわけで、まずは (1) を行います。パーティションの縮小は(そのパーティション先にもよりますが)シングルユーザーモードで起動する必要があります。システムを再起動し、Linux の起動画面になったら何かキーを押してd自動ブートのカウントダウンを止めます:
 lv2013101701

この画面で E キーを押して起動モードの編集画面に移動します。そして "kernel" で始まる行に移動して再度 E キーを押します:
lv2013101702

起動オプションの編集画面になるので、シングルユーザーモードを指定するために最後に " single" という文字を加えて Enter キーを押します:
lv2013101703

1つ前の画面に戻りました。この画面だとわかりにくいのですが、kernel 行の最後には " single" が追加されています。改めてこの kernel 行が選択されている状態で B キーを押して起動します。
lv2013101704

CentOS がシングルユーザーモードで起動しました。パスワードも不要です。
lv2013101705

改めて現在のパーティション状況を確認します。 / に 4.0GB、/var に 4.5GB 割り当てられています。ここから /var の 2GB を / に付け替えるのが今回の目的になります。/var はまだ 309MB しか使っていないので、少なくともこの時点では 2GB 減らしても問題はありません。
lv2013101706

まずはこのパーティションをアンマウントします:
 # umount /var

ファイルシステムのサイズ変更は resize2fs コマンドで行いますが、減らす場合はその前に fsck コマンドでディスクチェックを行う必要があります。今回の /var(/dev/mapper/VolGroup-lv_var) は ext4 フォーマットなので、具体的には以下のコマンドを実行します:
 # fsck.ext4 -f /dev/mapper/VolGroup-lv_var

チェック後に resize2fs コマンドでパーティションサイズを変更します(最後の "2G" が変更後のパーティションサイズです):
 # resize2fs /dev/mapper/VolGroup-lv_var 2G

続けて論理ボリュームのサイズも 2G に変更します。確認メッセージが表示されたら y キーを入力します:
 # lvreduce -L 2G /dev/mapper/VolGroup-lv_var

最後に変更後のパーティションを改めて /var にマウントします:
 # mount -t ext4 /dev/mapper/VolGroup-lv_var /var

ここまでの一連のコマンドのスクリーンショットはこんな感じです:
lv2013101707

試しにこの段階で一度パーティション状態を確認しておきます。確かに 4.6GB あった /var が 2.0GB に減っていることが確認できます:
lv2013101708

では今度は /var で減らした分を /(/dev/mapper/VolGroup-lv_root) に追加割り当てします。増やす場合はアンマウント/マウントの必要がないのでより簡単です。 / は現在の 4.0GB に、追加する 2.5GB を加えるので、パーティションサイズとしては 6.5GB を指定することになります:
 # lvextend -L 6.5G /dev/mapper/VolGroup-lv_root

続けてファイルシステムとしてのサイズも変更します:
 # resize2fs /dev/mapper/VolGroup-lv_root

これで / パーティションのサイズ変更は完了です。確認してみるとたしかに増えています(画面上では 6.4GB になってますが・・)。一連のコマンドのスクリーンショットはこんな感じです:
lv2013101709

LVM を使っていなくても動的なパーティション変更ができないわけではないのですが、専用のツールを使って別システムから起動したり、サイズ調整に必要なパラメータが頻雑だったりと面倒です。その点 LVM だとサイズだけを意識するだけでいいので楽ですね。


仕事柄、開発環境やテスト環境の構築はよく行うのですが、実運用環境を構築する機会はあまりありません。環境構築の作業そのものはあまり変わらないとも言えるけど、信頼性を重視されるような観点での環境構築経験は薄かったといえます。

このたび、とあるサーバーを「RAID1(ミラーリング)環境で」構築することになり、予算の観点から専用のハードウェアを使わずに、単純にハードディスク2台をつなげるソフトウェア RAID で実現することになりました。その構築時の作業のメモです。なおサーバーそのものは Linux(CentOS) で、その Linux の標準機能として持っているソフトウェア RAID を使っています。またハードディスクは同じ容量の SATA ディスクが2台(/dev/sda, /dev/sdb)接続されているものと仮定します。

ではその導入手順の紹介です。普通の CentOS 導入と変わらない点はここでは省略して、RAID 環境を構築する際の要点だけを紹介します。CentOS(バージョン6)の導入手順はこちらを参照ください:
CentOS の導入


インストーラーを実行して、普通に進めていくと、ディスク構成の箇所がやってきます。ここで2台のハードディスクによる RAID を構築していくよう指定していくことになります。まずはインストール先デバイス、ここは普通に「基本ストレージデバイス」を選択します。
sr2013101601

ディスクの中にデータが含まれているかもしれない、という警告です。まあ OS を普通にインストールするので「破棄」を選択。この辺りは普通のインストールとあまり変わらないですね。
sr2013101602

インストールタイプの指定です。RAID 構成にする場合は「カスタムレイアウトを作成する」を選択する必要があります。
sr2013101603

ケースバイケースですが、このタイミング OS をインストールするハードディスクを選択する画面が表示されることがあります。その場合は RAID の構成に使用する2台のハードディスクを指定して、右側の画面に映しておいてください。
sl2013101701


この後に具体的なカスタム構成を指定していきます。まずは2つのハードディスク(sda, sdb)が認識されていることを確認し、またすでに何らかのパーティショニングや LVM(論理ボリュームマネージャ)の設定がされていた場合は「選択して削除ボタン」を繰り返して、論理ボリュームは削除し、2台のディスク全てを「空き」の状態にします。この図のような状態になったことを確認してください。
sr2013101604

言い忘れましたが、今回の目標はミラーリング(同じ内容を複数台のハードディスクに書き込んで障害耐性を強化)を実現することで、具体的には以下のような RAID1 ディスク構成の3パーティションを作成して OS を導入することです:
(1)ブートイメージのパーティション(300MB)
(2)スワップディスクのパーティション(1GB)
(3)ルートパーティション(残り全部)

※実質的なファイルシステムは全て (3) のルートパーティションに構築することになりますが、別パーティションを作成したい場合は (3) と同様の手続きを繰り返すだけなので、さほど違いはないと思っています。

では、まずは1台目のディスク(/dev/sda)に (1) のブート用パーティションを作成します。「作成」ボタンをクリックして、「標準パーティション」を指定します。
sr2013101605

追加パーティションを以下のように指定します:
 マウントポイント: (指定しない)
 ファイルシステムタイプ: software RAID
 使用可能なドライブ: sda のみにチェック
 サイズ: 300
 追加容量オプション: 固定容量
 基本パーティションにする: チェック

注意点としては、このパーティションは最終的には /boot にマウントすることになるのですが、この段階ではマウントポイントを指定しない、ということです。
sr2013101606

ブート用パーティションのサイズは 200MB でも大丈夫だと思いますが、念のため少し大きめに作成しておきます。

最後に「OK」をクリックして、1つ前の画面に戻ります。sda ドライブに sda1 という 300MB のパーティションが作成されたことを確認します。
sr2013101607

再度「作成」ボタンをクリックし、全く同じ手順をもう一度実行して、今度は2台目のディスク(sdb)にも同様のパーティションを作成します。
sr2013101608

この時点でこのようなパーティション構成になっています。2台のディスク両方に software RAID タイプの300MBのパーティションが作られています。この2つを RAID 構成でミラーリングすることになるわけです。
sr2013101609

ここからはその RAID 用デバイスを作ります。「作成」ボタンをクリックし、次の画面では「RAIDデバイス」を選択して「作成」します。
sr2013101610

sda1 と sdb1 をミラーリングする RAID デバイスを以下のように作成します:
 マウントポイント: /boot
 ファイルシステムタイプ: ext4
 RAID デバイス: md1
 RAID レベル: RAID1
 RAID メンバー: sda1 と sdb1 両方にチェック

通常のパーティション作成時に指定するようなマウントポイントやファイルシステムタイプはここで指定することになります。このパーティションはブート用なのでマウントポイントを /boot にしています。ファイルシステムタイプは ext4 である必要はなく、ext3 とかでも構いませんが、特に理由がなければ ext4 をおススメします。そして RAID としてのデバイス名(md1)やそのレベル(RAID1)を指定し、このRAID デバイスに属してミラーリングすることになる物理デバイス(sda1 と sdb1)を指定します。この例であれば /dev/md1 という RAID デバイスを作成して /boot にマウントする、と指定していることになります。そしてデバイスの実体は /dev/sda1 と /dev/sdb1 にミラーリングしていることになります。
sr2013101611

「OK」をクリックするとこの画面に戻り、RAID デバイス md1 が追加されたことが確認できます。これで上記の (1) のパーティショニングが完了したことになります。
sr2013101612

残りの (2) と (3) のパーティショニングについても同様に行います。(2) はスワップ用に用意する 1GB のパーティションですが、こちらもまずは物理的なパーティションを2つ作成します。「作成」をクリックした後に「標準パーティション」を選択し、以下の内容でパーティションを2回追加します:
 マウントポイント: (指定しない)
 ファイルシステムタイプ: software RAID
 使用可能なドライブ: 1つ目は sda のみにチェック、2つ目は sdb のみにチェック
 サイズ: 1024
 追加容量オプション: 固定容量
 基本パーティションにする: チェック
sr2013101613

この手順を2度、 sda と sdb 両方に対して実行すると、このようなパーティション状態になります。
sr2013101614

今作成したスワップパーティションについても RAID 構成にします。再度「作成」をクリックし、「RAID デバイス」を選択した後で、以下の内容で RAID デバイスを定義します:
 マウントポイント: なし
 ファイルシステムタイプ: swap
 RAID デバイス: md2
 RAID レベル: RAID1
 RAID メンバー: sda2 と sdb2 両方にチェック
sr2013101615

スワップディスクなのでファイルシステムタイプを "swap" にする必要があります。またマウントポイントは不要です。

これで RAID 構成になったスワップパーティション md2 が定義されました。後は (3) のルートパーティションについても同様に物理パーティションから作成します。
sr2013101616

「作成」ボタンをクリックして「標準パーティション」を選択し、以下の内容でパーティションを作成します。
 マウントポイント: (指定しない)
 ファイルシステムタイプ: software RAID
 使用可能なドライブ: 1つ目は sda のみにチェック、2つ目は sdb のみにチェック
 サイズ: (残り容量すべて ただし1つ目と2つ目で同じサイズを指定する)
 追加容量オプション: 固定容量
 基本パーティションにする: チェック

sr2013101617

ここでの注意点としてはパーティションのサイズです。全く同じ容量のハードディスク2台で RAID 構成を構築する場合は問題ないのですが、やむを得ず異なるサイズのハードディスク2台で構成する場合は、この時点での「残り容量」が異なるはずです。2つのパーティションは同じサイズにするため、サイズが異なる場合は残り容量の少ない方に合わせて同じサイズを指定する必要がある、ということに注意してください。

sda と sdb 双方でこのルート用のパーティションを追加します。このように sda3, sdb3 が定義されたパーティションになっていることを確認します。
sr2013101618

最後に sda3, sdb3 をミラーリングする RAID デバイスを定義します。「作成」をクリックして「RAID デバイス」を選択した後で、以下の内容で RAID デバイスを定義します。ここはマウントポイント以外は (1) の時と同じです:
 マウントポイント: /
 ファイルシステムタイプ: ext4
 RAID デバイス: md3
 RAID レベル: RAID1
 RAID メンバー: sda3 と sdb3 両方にチェック
sr2013101619

最終的にこのようなパーティション構成になりました。この例ですと実際に使うパーティションは / の1つだけですが、/usr や /opt などに別のパーティションを用意することも(もちろん)可能です。その場合は同様に物理デバイスと RAID デバイスを追加していきます。
sr2013101620

パーティション定義が完了したので「次へ」をクリックして定義内容をディスクに書き込みます。以下の様な警告メッセージが表示された場合は「フォーマット」をクリックします。
sr2013101621

パーティション定義を変更する直前の、最後の確認メッセージです。変更して問題なければ「変更をディスクに書き込む」をクリックします。
sr2013101622

定義内容に従ってパーティショニングが行われ、ファイルシステムも作成されます。
sr2013101623

パーティショニングが終わった直後にブートローダーに関する指定画面が現れます。今のままですとブートローダーは物理デバイスである /dev/sda が指定されていますが、ここも RAID 構成用に変更しておきましょう。「デバイスの変更」ボタンをクリックします。
sr2013101624

ブートローダーの導入先として RAID デバイスの /boot として指定した /dev/md1 を選択し、「OK」をクリックします。
sr2013101625

このような画面になればブートローダーの変更もできました。これで RAID 用のパーティショニングで気をつける点は全てです。後は普通にインストール作業を進めます。
sr2013101626

インストール中は特に違いはなく、普通っぽく進んでいきます。
sr2013101627

インストールが完了したらマシンを再起動するようガイドされます。再起動すると RAID 構成の環境が立ち上がることになります。
sr2013101628

実際に再起動した環境で Terminal を起動し、 "df -h" と "/etc/fstabs" を実行してみた時の様子です。パーティション/マウントの構成では /dev/sda? や /dev/sdb? は使われておらず、これらのミラーリングデバイスである /dev/md? がマウントされていることが分かります。これら /dev/md? は(上記で定義したように)ミラーリングのデバイスなので、これらに書き込まれた内容はソフトウェア RAID によって実際には2台の物理ディスクに反映され、一台に問題や障害が生じた場合でももう一台で運用を続けることができます。
sr2013101629

今回は最初の段階からディスクが2台用意できていて、セットアップ時に RAID 構成を定義できる前提での手順を紹介しました。この前提があれば非常に簡単にソフトウェア RAID が実現できることが分かりました。ソフトウェアでコントロールしているとはいえ、コアの機能になっていて、パフォーマンスもさほど悪いと感じません。安価に冗長構成が作れる、とてもいい時代になりました。


 

このページのトップヘ