CentOSでストレージサーバ(RAID5)を組んでみる – その2 (OS導入・RAID構築編)

前回の記事まででハードウェアの組み立てが完了したので、今回はいよいよOSを導入していきます。

CentOSの入手

まずはUSBメモリから起動するインストールメディアを作成します。CentOS DVDのISOイメージをDLし、USBメモリをFAT32でフォーマットします。その後、Linux ISOイメージをUSBメモリに書き込むためのアプリケーション UNetbootin を使用して書き込みを行いました。Windows環境で作業する場合、Rufusというツールも使いやすくておすすめです。いずれにしても、メディア作成は30分程度で完了します。起動可能なUSBメモリができあがったら、BIOSの設定でUSBからの起動順位を最優先にしておきます。

OSインストールエラーと対応

インストール時のRAIDはOSも冗長化出来るのが強みのようですが、OSは冗長化せずに実施します。

パーティション分割とスワップ (swap) 領域

OSインストールを実施する前に、記憶領域に対してパーティション分割を実施します。ここでブート領域、ルート領域、スワップ領域それぞれに対する割り当て容量を指定します。スワップ領域 (仮想記憶)とは、物理メモリ (DDR, 主記憶) の内容を一時的に退避させる領域です。システムはプロセスをまず主記憶に読みに行き、そこに存在しなければ仮想記憶から物理メモリに書き戻します。こうすることで主記憶以上のメモリ容量が確保でき、物理メモリを使い切ってしまってシステムが不安定に陥るなどのリスクを防ぐことができます。win環境では意識的に扱いませんが、Linux環境ではスワップ領域を明示的に割り当てることができます (OSインストール後であってもコマンドで実施可能なようです) 。

一般的なパーティション分割の目安としては、ブート領域は500MB〜1GB程度、スワップ領域はRAMの1〜2倍程度(ただし大容量RAMの場合は1倍以下でも十分な場合が多い)、残りをルート領域に割り当てるというのが基本的な考え方です。サーバ用途の場合は、ログファイルなどが大量に生成される可能性がある/var/ディレクトリを別パーティションにするという方法もありますが、今回は基本的な構成で進めていきます。

エラー (bootloader install failed……) の発生

OSインストールを進めていたところ「bootloader install failed……」というエラーが発生しました。Win環境で使用していたHDDを流用しているため、ファイルシステムが消しきれていないことが原因でエラーが出たと推測します。このようなエラーが発生した場合、インストール前にHDDを完全に初期化する方法もあります。例えば、LiveUSBからGPartedなどのパーティション管理ツールを使用して、HDDのパーティションテーブルを再作成する方法や、`dd`コマンドを使って先頭部分にゼロを書き込む方法などがあります。

しかし今回は時間の都合もあり、OSはまっさらな工場出荷状態のストレージを別途購入してそこにインストールすることにしました。ストレージ用HDD5台に加えてケース内に配置することになるためコンパクトなものが望ましいです。はじめはSSDが妥当かと考えましたが、CentOSのOS部に必要な容量は16GBで十分なことが判りUSBメモリを用意しました。USBメモリを別途購入してフォーマット後、再実施です。CentOSをUSBメモリにインストールも参考にさせていただきました。

USBメモリにOSをインストールする際の注意点として、通常のHDDやSSDと比べて書き込み回数の制限があることを念頭に置く必要があります。そのため、ログファイルの出力先を変更したり、tmpfsを活用するなどの工夫をするとUSBメモリの寿命を延ばすことができます。ただし、今回はストレージサーバとしての構築が主な目的なので、OSの稼働に必要最低限の設定で進めていきます。

USBメモリインストール:1回目 (失敗)

USBメモリを追加した新しい構成で再チャレンジです。まず、USBメモリ追加後の構成です。

初期状態です。

ブート設定です。

ルート設定です。

スワップ設定です。

完了後、再び以下のエラーが発生しました。自動設定で割り当てられる「EFI」というパーティションを追加して再度トライしてみることにしました。EFIパーティション(EFI System Partition)とは、UEFIファームウェアを搭載したマシンでOSを起動するために必要なパーティションです。従来のBIOS方式と異なり、UEFIではこのパーティションにブートローダーやカーネル、ドライバなどが格納されます。EFIパーティションがないと、UEFIシステムでは正常に起動できないため、現代のシステムでは重要な役割を果たしているようです。

USBメモリインストール:2回目 (成功)

EFI設定です。

ブート設定です。

ルート設定です。

スワップ設定です。

今度はインストールが通りました。その他、ネットワーク設定などを実施してインストール開始となりました。数千個のパッケージをインストールするため、およそ5時間ほどかかりましたが、ついに完了しました。少し感動します。

再起動後にログイン画面が現れましたた。これが見たかったです。

ログイン後、簡単な初期設定を行ってCentOS7の導入は一段落しました。初期設定では、タイムゾーンの設定、SELinuxの設定、不要なサービスの無効化などを行いました。ストレージサーバとして使用する場合、必要なサービスだけを動かすことで、セキュリティリスクとシステムリソースの消費を抑えることができます。

RAIDディスクの確認

次はRAIDが正しく構成できているか確認していきます。はじめはコマンド確認ではなく、一先ず目についたディスク管理を開いてみました。

ディスク1

ディスク2

ディスク3

ディスク4

ディスク5-1

ディスク5-2

RAIDアレイ

RAIDアレイの確認もできました。コンピュータフォルダ設定画面からも確認すると、使用可能領域が9TBになっていることが確認できます。RAID5について簡単に補足しておくと、ディスクの一部をパリティ(誤り訂正符号)として使用することで、1台のディスクが故障しても全体のデータを失わずに済む冗長構成です。n台のディスクがあれば、使用可能な容量は(n-1)台分となり、パリティデータが分散して保存されます。今回は4台のディスクでRAID5を構成しているため、3台分の容量が使用可能です。

RAID構築用コマンドmdadmでも確認します。以下の通り9TBの容量が確認できました。mdadmコマンドの出力で注目したいのは「State : clean」の部分です。これはRAIDアレイが正常に動作していることを示しています。また「Layout : left-symmetric」というのはデータとパリティの配置方法を示しており、RAID5では一般的な方式です。「Chunk Size : 512K」はストライピングの単位で、RAIDの性能に影響する要素の一つです。大きなファイルを扱う場合は大きなチャンクサイズが、小さなファイルを多数扱う場合は小さなチャンクサイズが適しています。

# mdadm --detail /dev/md/root
/dev/md/root:
           Version : 1.2
     Creation Time : Sun Dec 31 22:50:18 2017
        Raid Level : raid5
        Array Size : 8790402048 (8383.18 GiB 9001.37 GB)
     Used Dev Size : 2930134016 (2794.39 GiB 3000.46 GB)
      Raid Devices : 4
     Total Devices : 4
       Persistence : Superblock is persistent

     Intent Bitmap : Internal

       Update Time : Fri Jan  5 19:17:09 2018
             State : clean 
    Active Devices : 4
   Working Devices : 4
    Failed Devices : 0
     Spare Devices : 0

            Layout : left-symmetric
        Chunk Size : 512K

Consistency Policy : bitmap

              Name : #ブログアップ時削除
              UUID : #ブログアップ時削除
            Events : #ブログアップ時削除

    Number   Major   Minor   RaidDevice State
       0       8        1        0      active sync   /dev/sda1
       1       8       17        1      active sync   /dev/sdb1
       2       8       33        2      active sync   /dev/sdc1
       4       8       49        3      active sync   /dev/sdd1

ホットスペアディスクの追加

RAID5にはホットスペアディスクを追加することができます。これはいずれかのHDDが故障した際に自動的にRAID構成を再構築するためのものです。突然のディスク破損に備えることで、システムの可用性をさらに高めることができます。スペアディスクはOSインストール時には追加できないため、CentOSにログイン後にコマンドで実行してます。

ホットスペアの仕組みとしては、RAIDアレイを監視するサービスが常時動作していて、ディスク故障を検知すると、自動的にスペアディスクをアレイに組み込み、復旧処理(リビルド)を開始します。これにより、管理者が手動で介入することなくシステムの冗長性を維持できるわけです。スペアディスクがない場合は故障ディスクを交換して手動でリビルドを実行する必要があるため、システムの保護という観点では大きな違いがあります。

あらかじめ用意していたスペアディスクを接続して再起動したところ、特に手動マウント作業などをしなくてもGUI上でディスクを確認することができました。ただしこのHDDは購入後にWindows環境で初期不良チェックをしていたため、「Microsoft予約済み」というパーティションが既に作成されています。RAIDに組み込む前に、このデバイスファイル「/dev/sde1」を削除しておく必要があります。

削除する領域を上の図のように選択し、 “-” を押してパーティションを削除しました。当然ですが/dev/sde2も消えて無くなり/dev/sdeとなりました。これで下準備は完了です。

パーティショニング

パーティションの作成や削除などに使用する「gdisk」コマンドを使います。従来のfdiskコマンドはMBRパーティションテーブルを扱いますが、gdiskはより新しいGPTパーティションテーブルを扱うためのツールです。GPTは2TB以上の大容量ディスクをサポートし、より多くのパーティションを作成できるなどの利点があります。パーティションの開始セクタと終了セクタの選択では何も入力せずにENTERすることで最大サイズに設定されます。パーティーションのタイプはLinux RAIDにして入力はfd00を選択しました。

# gdisk /dev/sde
GPT fdisk (gdisk) version 0.8.6

Partition table scan:
  MBR: protective
  BSD: not present
  APM: not present
  GPT: present

Found valid GPT with protective MBR; using GPT.

Command (? for help): p
Disk /dev/sde: 5860533168 sectors, 2.7 TiB
Logical sector size: 512 bytes
Disk identifier (GUID): #ブログアップ時削除
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 5860533134
Partitions will be aligned on 2048-sector boundaries
Total free space is 5860533101 sectors (2.7 TiB)

Number  Start (sector)    End (sector)  Size       Code  Name

Command (? for help): n
Partition number (1-128, default 1): 1
First sector (34-5860533134, default = 2048) or {+-}size{KMGTP}: 
Last sector (2048-5860533134, default = 5860533134) or {+-}size{KMGTP}: 
Current type is 'Linux filesystem'
Hex code or GUID (L to show codes, Enter = 8300): L
0700 Microsoft basic data  0c01 Microsoft reserved    2700 Windows RE          
4200 Windows LDM data      4201 Windows LDM metadata  7501 IBM GPFS            
7f00 ChromeOS kernel       7f01 ChromeOS root         7f02 ChromeOS reserved   
8200 Linux swap            8300 Linux filesystem      8301 Linux reserved      
8e00 Linux LVM             a500 FreeBSD disklabel     a501 FreeBSD boot        
a502 FreeBSD swap          a503 FreeBSD UFS           a504 FreeBSD ZFS         
a505 FreeBSD Vinum/RAID    a580 Midnight BSD data     a581 Midnight BSD boot   
a582 Midnight BSD swap     a583 Midnight BSD UFS      a584 Midnight BSD ZFS    
a585 Midnight BSD Vinum    a800 Apple UFS             a901 NetBSD swap         
a902 NetBSD FFS            a903 NetBSD LFS            a904 NetBSD concatenated 
a905 NetBSD encrypted      a906 NetBSD RAID           ab00 Apple boot          
af00 Apple HFS/HFS+        af01 Apple RAID            af02 Apple RAID offline  
af03 Apple label           af04 AppleTV recovery      af05 Apple Core Storage  
be00 Solaris boot          bf00 Solaris root          bf01 Solaris /usr & Mac Z
bf02 Solaris swap          bf03 Solaris backup        bf04 Solaris /var        
bf05 Solaris /home         bf06 Solaris alternate se  bf07 Solaris Reserved 1  
bf08 Solaris Reserved 2    bf09 Solaris Reserved 3    bf0a Solaris Reserved 4  
bf0b Solaris Reserved 5    c001 HP-UX data            c002 HP-UX service       
ed00 Sony system partitio  ef00 EFI System            ef01 MBR partition scheme
ef02 BIOS boot partition   fb00 VMWare VMFS           fb01 VMWare reserved     
fc00 VMWare kcore crash p  fd00 Linux RAID            
Hex code or GUID (L to show codes, Enter = 8300): fd00
Changed type of partition to 'Linux RAID'

Command (? for help): w

Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
PARTITIONS!!

Do you want to proceed? (Y/N): Y
OK; writing new GUID partition table (GPT) to /dev/sde.
The operation has completed successfully.

GUIでも正常に反映されていることを確認しました。

フォーマット

ファイルシステムを作成(フォーマット)するコマンド「mkfs」を使います。今回はファイルシステムとして「xfs」を選択しました。Linuxでよく使われるファイルシステムには「xfs」と「ext」がありますが、xfsはextと比較して大規模データの扱いに適しているといわれています。また、NASなどのストレージシステムでもよく採用されているファイルシステムらしいです。xfsの主な特徴としては以下のようなものがあります。

  1. 大容量ファイルシステムに対応(最大8エクサバイト)
  2. 高速なデータ転送
  3. オンラインでのファイルシステム拡張が可能
  4. 障害復旧能力が高い
  5. フラグメンテーションが発生しにくい構造

一方、ext4はLinuxで最も広く使われているファイルシステムで互換性や安定性に優れています。どちらを選ぶかは用途によりますが、大容量のストレージサーバならxfsが適していると判断しました。

# mkfs.xfs /dev/sde1
meta-data=/dev/sde1              isize=512    agcount=4, agsize=183141597 blks
         =                       sectsz=4096  attr=2, projid32bit=1
         =                       crc=1        finobt=0, sparse=0
data     =                       bsize=4096   blocks=732566385, imaxpct=5
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal log           bsize=4096   blocks=357698, version=2
         =                       sectsz=4096  sunit=1 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0

こちらもGUIで正常にフォーマットされていることを確認しました。

スペアディスク追加前の状態確認

mdadmコマンドで現在のRAID状態を確認します。現在は4台のディスクでRAID5が構成されており、スペアディスクはまだ追加されていないことが確認できます。

# mdadm --detail /dev/md/root
/dev/md/root:
           Version : 1.2
     Creation Time : Sun Dec 31 22:50:18 2017
        Raid Level : raid5
        Array Size : 8790402048 (8383.18 GiB 9001.37 GB)
     Used Dev Size : 2930134016 (2794.39 GiB 3000.46 GB)
      Raid Devices : 4
     Total Devices : 4
       Persistence : Superblock is persistent

     Intent Bitmap : Internal

       Update Time : Sun Jan  7 17:32:01 2018
             State : clean 
    Active Devices : 4
   Working Devices : 4
    Failed Devices : 0
     Spare Devices : 0

            Layout : left-symmetric
        Chunk Size : 512K

Consistency Policy : bitmap

              Name :  #ブログアップ時削除
              UUID :  #ブログアップ時削除
            Events :  #ブログアップ時削除

    Number   Major   Minor   RaidDevice State
       0       8        1        0      active sync   /dev/sda1
       1       8       17        1      active sync   /dev/sdb1
       2       8       33        2      active sync   /dev/sdc1
       4       8       49        3      active sync   /dev/sdd1

スペアディスクの追加

mdadmコマンドの「–add」オプションを使って/dev/sde1をスペアディスクとして追加します。シンプルなコマンドですが、これだけでスペアディスクの追加は完了です。コマンドの「–manage」オプションはRAIDアレイの管理操作を行うためのもので、「–add」と組み合わせることでディスクの追加を指示しています。

# mdadm --manage /dev/md/root --add /dev/sde1
mdadm: added /dev/sde1

スペアディスク追加後の状態確認

再度mdadmコマンドで状態を確認します。

# mdadm --detail /dev/md/root
/dev/md/root:
           Version : 1.2
     Creation Time : Sun Dec 31 22:50:18 2017
        Raid Level : raid5
        Array Size : 8790402048 (8383.18 GiB 9001.37 GB)
     Used Dev Size : 2930134016 (2794.39 GiB 3000.46 GB)
      Raid Devices : 4
     Total Devices : 5
       Persistence : Superblock is persistent

     Intent Bitmap : Internal

       Update Time : Sun Jan  7 17:33:56 2018
             State : clean 
    Active Devices : 4
   Working Devices : 5
    Failed Devices : 0
     Spare Devices : 1

            Layout : left-symmetric
        Chunk Size : 512K

Consistency Policy : bitmap

              Name : #ブログアップ時削除
              UUID : #ブログアップ時削除
            Events : #ブログアップ時削除

    Number   Major   Minor   RaidDevice State
       0       8        1        0      active sync   /dev/sda1
       1       8       17        1      active sync   /dev/sdb1
       2       8       33        2      active sync   /dev/sdc1
       4       8       49        3      active sync   /dev/sdd1

       5       8       65        -      spare   /dev/sde1

「Spare Devices」が「1」になり、/dev/sde1が「Number:5」「state:spare」として追加されていることが確認できました。GUIで確認しても、/dev/sde1の「内容」が「Linux RAIDメンバー」となっていることが分かります。これでスペアディスクの追加も完了し、万が一のディスク故障に備えたRAID5ストレージサーバーの構築が完了しました。今後は実際にデータを保存したり、ネットワーク経由でのアクセス方法を設定したりと、実用的な運用へと進めていきたいと思います。

以上です。次回は実際の運用や細かい設定、ネットワーク共有の設定方法などについて触れていく予定です。