コンテンツにスキップ

5. 高度なストレージ管理

5.1. RAID

RAIDはハードディスクを組み合わせて使用できる技術のこと。 ハードディスクをまとめて扱うことで高い信頼性とパフォーマンスを実現することを目指すものといえる。

5.1.1. LinuxにおけるRAID

LinuxでRAIDを利用する際はソフトウェアRAIDハードウェアRAIDの2種類を利用できる。 Kernel2.4以降ではソフトウェアRAIDが実装されていてハードディスクのパーティションを複数使うことでRAIDアレイを実現する。 ハードウェアRAIDアレイはLinuxからはSCSIデバイスのように見える。

RAIDアレイ

複数のディスクもしくはパーティションを束ねたもののこと

5.1.2. RAIDの種類

RAID0(ストライピング)

RAID0は複数のディスクに分散してデータを書き込み1台のディスクのように扱うRAID構成。

特徴は以下の通り。

  • データ消失が許されない用途には不向き
  • 書き込みのパフォーマンスが高い
  • ディスク容量をフル利用できる

RAID1(ミラーリング)

RAID1は複数のディスクに全く同じ内容を並列して書き込み扱うRAID構成。

特徴は以下の通り。

  • RAIDアレイを構成する1台がクラッシュしても、残りのディスクで復旧が可能
  • ディスクサイズが1台当たりのディスクサイズ以上にはならない

RAID4

RAID4はRAID0のようにストライピングの機能にエラー訂正用のパリティ情報を保存する専用ディスクを用意したRAID構成。 つまり最低3台のディスクが必要

特徴は以下の通り。

  • データが保存されているディスクがクラッシュしてもパリティ情報から復旧できる
  • パリティ情報を保存するためパフォーマンスが良くない

RAID5

RAID5はRAID4と同じようにパリティ情報により冗長性を確保する構成でパリティ専用ディスクを使用しないRAID構成。 パリティ情報はデータと同様に複数のディスクに分散して保存される。 RAID5も最低3台のディスクが必要となる。

その他のRAID構成

RAID 説明
RAID LINEAR ディスクを論理的に結合してサイズの大きな1つのディスクに見せる
RAID0+1 RAID0でストライピング構成を複数作りそれをミラーリングする
RAID1+0 RAID1でミラーリング構成を複数作りそれをストライピングする
RAID6 RAID5に加えてパリティ情報をもう1台余分に2重パリティを行い冗長構成を高める

5.1.3. RAIDの構成と運用

LinuxでRAIDを構成するパーティションを作成する際はパーティションタイプを0xfdに設定する必要がある。 fdisk -l デバイスファイル名で確認可能。

mdadmコマンド

RAIDアレイの制御を行うコマンド。 RAIDアレイの作成はCREATEモードで行う。 /proc/mdstatの確認でも可能。

mdadm [オプション] [デバイス名]
オプション 説明
CREATEモードのオプション -
-C md デバイス名 RAIDアレイを指定して作成する
-a 必要であればデバイスファイルを自動的に作成する
-c サイズ チャンクサイズの指定(KB単位)
-l レベル RAIDレベルの指定
-n 数 アクティブな構成デバイス数を指定する
-x 数 スペアデバイスの数を指定する
MANAGEDモードのオプション -
--manage MANAGEモードにする
-a 構成デバイスの追加
-r 構成デバイスの削除
-f 構成デバイスに不良マークを付ける
MISCモード -
--misc MISCモードにする
-Q RAIDの状態を表示
-D RAIDの詳細情報の表示
-E 構成デバイスの状態表示
--readonly 読み取り専用にする
--readwrite 書き込み可能にする
--stop -S md デバイス名
--stop -scan すべてのRAIDアレイの停止
Assembleモード -

RAIDアレイの状態は/proc/mdstatファイルで確認可能。

使用例は以下の通り。

# RAID1のRAIDアレイmd0を/dev/sdc5~sdc7で構成(アクティブは2つ、1つは予備)
mdadm -C /dev/md0 --level 1 --raid-devices 2 --spare-devices 1 /dev/sdc5 /dev/sdc6 /dev/sdc7
# /dev/md0の状態確認
mdadm --query /dev/md0

RAID構成デバイスに障害が発生した場合は以下手順でディスクを交換する。 例では/dev/sdc5が壊れたとする。

  1. デバイスに障害を通知するために不良マークをつける
  2. mdadm --manage /dev/md0 -f /dev/sdc5
  3. この際 予備デバイスがあれば自動的に予備デバイスに切り替わる(確認はcat /proc/mdSATAで可能)
  4. 構成デバイスをRAIDアレイから削除する
  5. mdadm --manage /dev/md0 -r /dev/sdc5
  6. 予備デバイス(例では/dev/sdc7)を追加する
  7. mdadm --manage /dev/md0 -a /dev/sdc7

またmdadmの設定ファイルは/etc/mdadm/mdadm.confとなる。 このファイルにあらかじめ設定を記述するとRAIDアレイをシステム起動時に自動認識できる。

5.2. LVM

LVM(論理ボリューム管理機能)はディスク管理を柔軟に行える機能のこと。 ディスクのパーティションを直接操作は行わず、仮想的なパーティションの論理ボリュームを動的に管理する。 以下のメリットがLVMにはある。

  • パーティションのサイズを変更できる(通常は一度決めるとできない)
  • 別ディスクにパーティションを移動させることができる
  • ディスクサイズを超える大きさのパーティションを作成できる

LVMでは仮想的なブロックデバイスの機能はデバイスマッパーと呼ばれる機能によって実現されている。 これらの仮想的なデバイスは/dev/mapper/VG名-LV名というデバイス名で扱われる。

まあカーネル内では/dev/dm-*という形で、LVMでは/dev/VG名/LV名というデバイス名も扱われる。

5.2.1. LVMの仕組み

LVMの概要は以下の通り。 ボリュームグループは仮想的ディスク、論理ボリュームは仮想的パーティションといえる。

LVM

  • 1台のハードディスクや1つのパーティションを物理ボリューム(PV)にする
  • 物理ボリュームは一定サイズの物理エクステント(PE)から構成される
  • 1つ以上の物理ボリュームからボリュームグループ(VG)が構成される
  • VG内でPEから論理ボリューム(LV)が構成される
  • 論理ボリュームは従来のパーティション同様ブロックデバイスとして扱える
  • LVのサイズ変更や他ディスクへの移動が可能
  • LVは複数ディスクにまたがって作成できる
  • VGは後からサイズ変更ができる

5.2.2. LVMの作成

LVM利用手順は以下の通り。

  1. パーティションの作成(fdisk)
  2. 物理ボリュームを用意(pvcreate)
  3. 物理ボリュームを束ねてボリュームグループを作成(vgcreate)
  4. ボリュームグループから論理ボリュームを切り出す(lvcreate)
  5. ファイルシステムの作成(mkfs)
  6. マウント(mount)

/dev/sdd1,/dev/sde1を使用した例

  1. LVM用のパーティションの用意 初めにLVMを作成するためのパーティションまたはハードディスクを用意する。 パーティションを利用する場合はタイプを8eに設定する

parted /dev/sdd1
parted /dev/sde1
2. 物理ボリュームを初期化する pvcreateコマンドでデバイスを物理ボリュームとして初期化する

pvcreate /dev/sdd1 /dev/sde1
3. ボリュームグループの作成 vgcreateコマンドでボリュームグループを作成する(例の名称ではgroup1)

vgcreate group1 /dev/sdd1 /dev/sde1

なお-sオプションで物理エクステントのサイズを指定可能(省略した場合デフォルトで4MB) 4. 論理ボリュームの作成 lvcreateコマンドで論理ボリュームを作成する(例の名称ではlv1)

lvcreate -L 500M -n lv1 group1

なおlvscanコマンドで論理ボリュームの状態を確認可能 5. ファイルシステムの作成/マウント ファイルシステムを作成してマウントを行う。例ではext4で/mntにマウントする

mkfs.ext4 /dev/group1/lv1
mount  /dev/group1/lv1 /mnt

なおdf -Tコマンドで確認可能。

5.2.3. LVMの管理

LVM関連のコマンドを記載する。

pvdisplay/pvscanコマンド

物理ボリュームの詳細情報の表示を行うコマンド。

pvdisplay /dev/sda1
pvscan # 簡潔に表示

vgextendコマンド

ボリュームグループに物理ボリュームを追加するコマンド。

vgextend [ボリュームグループ] [物理ボリューム]

pvmoveコマンド

物理ボリュームを別の物理ボリュームに移動させるコマンド。

pvmove [移動元物理ボリューム] [移動先物理ボリューム]

vgreduceコマンド

ボリュームグループから物理ボリュームを削除するコマンド。

vgreduce [ボリュームグループ] [削除する物理ボリューム]

pvremoveコマンド

物理ボリュームを削除するコマンド。

pvremove [物理ボリューム]

vgdisplayコマンド

ボリュームグループの詳細を表示するコマンド。

vgdisplay [ボリュームグループ]

lvdisplayコマンド

論理ボリュームの詳細情報の表示するコマンド。

lvdisplay [論理ボリューム]

lvextendコマンド

論理ボリュームを拡張するコマンド。

lvextend -L +100M [論理ボリューム]

このコマンドだけではファイルシステムまで拡張されない。 そのためresize2fsコマンドやxfs_growfsコマンドでファイルシステムのサイズも拡張する必要がある。

resize2fs/xfs_growsfsコマンド

resize2fsコマンドはext2~ext4ファイルシステムの場合ファイルシステムを広げるコマンド。 xfs_growfsコマンドはXFSの場合にファイルシステムを広げるコマンド。

e2fsck -f /dev/group1/lv1
resize2fs /dev/group1/lv1

lvremoveコマンド

論理ボリュームを削除するコマンド。

lvremove [論理ボリューム]

スナップショット機能

スナップショット機能を使用するとファイルシステムをマウントせずにバックアップすることができる。 具体的にはスナップショットの作成ではファイルシステムを書き込み禁止やアンマウントせずにバックアップができる。

スナップショットをsnap0という名前でとる例

lvcreate -s -L 100M -n snap0 /dev/group1/lv1
dump 0uf /dev/st0 /dev/group1/snap0

スナップショットの特性上、スナップショットの作成後にファイルシステムに変更が加われば加わるほどスナップショット領域は大きくなる。 そのためバックアップ取得後は、スナップショットを削除したほうが良い。

5.2.4. LVMの関連コマンド

物理ボリューム関連コマンド

コマンド 説明
pvcreate PVの作成
pvdisplay PVの情報の表示
pvmove PV内のPEを移動
pvremove PVの削除
pvscan PVの検索
pvs PVの情報出力

ボリュームグループ関連のコマンド

コマンド 説明
vgcreate VGを作成
vgchange VGの属性を変更
vgdisplay VGの情報を表示
vgextend VGの拡張(PVの追加)
vgreduce VGの縮小(PVの削除)
vgremove VGの削除
vgimport VGのインポート
vgexport VGのエクスポート
vgmerge 2つのVGを統合する
vgrename VG名の変更
vgscan VGの検索
vgs VGの情報表示

論理ボリューム関連のコマンド

コマンド 説明
lvcreate LVの作成
lvdisplay LVの情報表示
lvextend LVの拡張(PEの追加)
lvreduce LVの縮小(PEの削除)
lvremove LVを削除
lvrename LV名を変更
lvscan LVの検索
lvs LVの情報表示

5.3. 記憶装置へのアクセス

5.3.1. デバイスファイル

記憶装置のデバイスファイルは以下の通り。

デバイスファイル 説明
/dev/hda IDEプライマリマスタに接続されたドライブ
/dev/hdb IDEプライマリスレーブに接続されたドライブ
/dev/hdc IDEセカンダリマスタに接続されたドライブ
/dev/hdd IDEセカンダリスレーブに接続されたドライブ
/dev/sda 1番目のSCSI/SATA/USB/IEEE1394デバイス
/dev/sdb 2番目のSCSI/SATA/USB/IEEE1394デバイス
/dev/sdc 3番目のSCSI/SATA/USB/IEEE1394デバイス
/dev/sdd 4番目のSCSI/SATA/USB/IEEE1394デバイス
/dev/sr0 1番目のSCSI/SATA/USB CD/DVDドライブ
/dev/sr1 2番目のSCSI/SATA/USB CD/DVDドライブ
/dev/st0 1番目のSCSIテープドライブ
/dev/st1 2番目のSCSIテープドライブ

カーネル2.6.21以降はIDEデバイスもSCSIデバイスと同じ扱いになったため、IDEハードディスクも/dev/sdNといったデバイス名になる。

5.3.2. ハードディスクの管理

ハードディスクは5つのタイプに分かれる。

  • SATA(Serial ATA)
  • SCSI
  • SAS
  • USB
  • IEEE1394

Linuxの場合、SATAハードディスクもSCSIハードディスクとして扱われる。 なおKernel 2.6.21以降では基本的にすべてのハードディスクは/dev/sd*と扱われる。

IDEの転送モードにはメインメモリとハードディスクとの転送方式としてPIOモードDMAモードがある。

  • PIOモード ... CPUがハードディスクに直接命令してデータを転送する方式。欠点はデータ読み書き中はCPUは他の処理を実行できない点がある
  • DMAモード ... CPUとは異なり専用のコントローラがデータの伝送を管理する。現在一般的な手法

Ultra DMA は従来のDMAを拡張した企画で高速転送速度をサポートしている。 なおUltra DMAの利用はハードディスク/マザーボードのチップ/BIOSが対応している必要がある。

hdparmコマンド

DMAモード、IDEハードディスクのパラメータを確認/設定できるコマンド。 オプションなしでは適用されているパラメータを表示する。

hdparm [オプション] [デバイスファイル]
オプション 説明
-i ハードディスクの詳細情報確認
-I ドライブから直接情報を得る
-c数値 32bit I/Oサポート(0:無効化、1:有効化、3:同期シーケンス付きで有効化)
-d数値 DMAモードの使用不使用を指定 (0:無効化,1:有効化)
-W数値 ライトキャッシュのON/OFF(0:無効化,1:有効化)
-t バッファキャッシュを使わずに読み込み速度を計測する
-T バッファキャッシュの読み込み速度をテストする

sdramコマンド

SCSI/SATA/USBディスクに対してDMAモード、IDEハードディスクのパラメータを確認/設定できるコマンド。 オプションなしでは適用されているパラメータを表示する。

sdparm [オプション] [デバイスファイル]

sdparm --conmmand=stop [デバイスファイル] # ディスク回転の停止
sdparm --clear=WCE [デバイスファイル] # ディスクキャッシュの無効化

scsi_idコマンド

SCSI接続の記憶装置のWWIDの確認を行えるコマンド。

scsi_id

5.3.3. SSDの管理

SSDはHDDと異なりフラッシュメモリであるためHDDと削除動作が異なる。 SSDはデータを削除しても削除フラグが付けられるだけでデータは削除されない。 削除した箇所に再度書き込みを行う場合は、データを消去して書き込みを行う必要がある。 そのため長時間SSDを利用すると再利用ブロック(削除フラグが付いたブロック)が増えていくにつれてパフォーマンスが低下する。

なおNVMeという新しい規格がSSDでは利用できる。 またNVMeはPCI Express バスから SSD に接続するための規格である。

Trimという機能を使うことでブロックデータも削除するため速度低下が起こりにくくなる。 Trimの実行にはfstrimコマンドを実行する。 Trimの確認は以下コマンドで行う。

hdparm -I /dev/sda | grep TRIM

また、SSDには書き換え回数の上限があるため頻繁に書き込まないように以下内容に注意する。

  • スワップ領域をSSD上に作成しない
  • noatimeオプションをつけてファイルシステムにマウントする
  • 頻繁に書き込まれる/tmpなどはRAMディスクを利用する

fstrimコマンド

Trimの実行を行うコマンド。 ファイルシステムで使用していない領域を破棄できる。

fstrim -v /

NVMe

NVMeはSSD接続のための PCI Expressベースのインターフェイス規格。 AHCIと比べ、SSDの性能を十分に発揮できる。

AHCI

AHCIは、IDEに比べてはるかに高速なSATAを活かせるインターフェース仕様として登場した規格。 インテルが策定している。 IDEとの互換性を重視したSATAの規格SATA1.0では速度より互換性が重視され、性能は犠牲となったが、SATA2.0でAHCIは規格化され、SATA本来の機能・性能を満たすことができるようになった。

5.3.4. iSCSI

iSCSIはTCP/IP上でSCSIプロトコルを利用できるようにする仕組み。 クライアント/サーバモデルを採用している。 iSCSIによりネットワーク上のストレージをローカルストレージのように利用できる。 SANを構築できる。

LinuxにおいてはIETLIO TargetでiSCSIターゲット(iscSIストレージ)を構築できる。 なおデータの要求端末(クライアント)はiSCSIイニシエータと呼ばれる。

用語 説明
ターゲット iSCSIストレージ
イニシエータ iSCSIクライアント
LUN ストレージ内の論理ドライブ番号(記憶装置の識別番号)
HBA NICに相当するインターフェイスアダプタ
WWID / WWN MACAddressに相当する識別ナンバー

なお設定ファイルはiscsid.confとなる。

iscsiadmコマンド

iscsiadm [オプション]
オプション 説明
-m / --mode [モード] モードの指定(discovery: 接続先のiSCSIターゲットの取得, node: 登録済みisCSIターゲットの取得, session: セッション一覧の取得)
-l / --login iscsiターゲットにログイン
-u / --logout iscsiターゲットからログアウト
-t / --type タイプの指定
-p / --portal=IPアドレス[:ポート] 接続先の指定
-T / --targetname=IQN iSCSIターゲットの指定

SAN

SAN(Storage Area Network)はストレージ専用のネットワークを使用してストレージにアクセスする技術。 物理接続にファイバチャネル、接続にSANスイッチが使用される。