イントロダクション
Linuxには、ストレージドライブを含むハードウェアデバイスを管理するための堅牢なシステムとツールがあります。この記事では、Linuxがこれらのデバイスをどのように表現し、サーバー上で生のストレージを利用可能なスペースに変換するのかについて、高レベルで説明します。
ブロックストレージとは何ですか?
ブロックストレージは、Linuxカーネルがブロックデバイスと呼ぶものと同じものです。ブロックデバイスは、従来の回転式ハードディスクドライブ(HDD)、ソリッドステートドライブ(SSD)、フラッシュメモリスティックなど、データを保存するために使用されるハードウェアのことを指します。ブロックデバイスは、カーネルが固定サイズのブロックまたはスペースのチャンクを参照してハードウェアとやり取りするため、ブロックデバイスと呼ばれています。
言い換えると、ブロックストレージはコンピュータ上の通常のディスクストレージと考えることができます。設定が完了すると、現在のファイルシステムツリーの拡張として機能し、各ドライブに対して書き込みや読み取りができるはずです。
ディスクパーティションとは何ですか?
ディスクパーティションは、ストレージドライブをより小さな利用可能な単位に分割する方法です。パーティションは、ドライブそのものと同じように扱うことができるストレージドライブのセクションです。
パーティションを作成することで、利用可能なスペースをセグメント化し、各パーティションを異なる目的に使用することができます。これにより、ユーザーは単一のディスクを複数のオペレーティングシステム、スワップスペース、または専用のファイルシステムにセグメント化することができます。
ディスクはパーティションを作成せずにフォーマットして使用することもできますが、オペレーティングシステムは通常、パーティションテーブルが存在することを期待しています。たとえディスクに単一のパーティションしか書き込まれていない場合でも、一般的には新しいドライブをパーティション分割することが推奨されます。
MBR vs GPT
ディスクをパーティション分割する際には、どのパーティショニング形式を使用するかを知っておくことが重要です。一般的には、MBR(マスターブートレコード)とGPT(GUIDパーティションテーブル)の選択肢から選ぶことになります。
MBRは30年以上前の技術です。そのため、いくつかの重要な制限があります。たとえば、2TBを超えるディスクでは使用できず、最大で4つのプライマリパーティションしか作成できません。
GPTは、MBRに固有のいくつかの問題を解決するより現代的なパーティショニングスキームです。GPTを実行しているシステムは、ディスクごとに非常に多くのパーティションを持つことができます。これは通常、オペレーティングシステム自体が課す制限によってのみ制約されます。さらに、GPTではディスクサイズの制限も存在せず、パーティションテーブル情報は破損に対する保護のために複数の場所に保存されます。GPTはさらに、「保護MBR」を書き込むこともでき、MBRのみをサポートするツールとの互換性を確保します。
ほとんどの場合、オペレーティングシステムが使用を妨げない限り、GPTがより良い選択肢です。
フォーマットとファイルシステム
Linuxカーネルは生のディスクを認識できますが、使用するためにはフォーマットする必要があります。フォーマットは、ファイルシステムをディスクに書き込んで、ファイル操作のために準備するプロセスです。ファイルシステムは、データを構造化し、情報がディスクから書き込まれ、取得される方法を制御するシステムです。ファイルシステムがないと、標準的なファイルシステム操作にストレージデバイスを使用することはできません。
さまざまなファイルシステム形式があり、それぞれにはオペレーティングシステムのサポートを含め、トレードオフがあります。すべてのファイルシステムは、ユーザーにディスクの類似した表現を提供しますが、サポートする機能やプラットフォームは大きく異なる場合があります。
Linuxでよく使用されるいくつかのファイルシステムは次のとおりです:
- Ext4:最も一般的なデフォルトのファイルシステムはExt4で、Ext2とExt3の後継です。Ext4ファイルシステムはジャーナリングされており、レガシーシステムとの互換性があり、安定しており、成熟したサポートとツールがあります。特殊なニーズがない場合は、良い選択肢です。
- XFS:XFSはパフォーマンスと大容量データファイルに特化しています。大きなファイルや大きなディスクを扱う際のスループット特性が良く、フォーマットが迅速で、ライブスナップショット機能も備えています。XFSはメタデータジャーナリングを使用しており、メタデータとデータの両方をジャーナリングするのではなく、高速なパフォーマンスを実現していますが、急な停電の場合にデータの破損を引き起こす可能性があります。
- Btrfs:Btrfsは、モダンで機能豊富なコピー・オン・ライトファイルシステムです。このアーキテクチャでは、スナップショットやクローンなどのボリューム管理機能をファイルシステムレイヤー内に統合することができます。一部のコンシューマーおよび商用NAS(ネットワーク接続型ストレージ)ハードウェアでデフォルトで使用されており、専用の複数ディスクアレイでも人気があります。
- ZFS:ZFSは、堅牢で成熟した機能セットを持つコピー・オン・ライトファイルシステムおよびボリュームマネージャです。Btrfsと直接競合し、データの整合性機能を持ち、大規模なファイルシステムサイズを扱えます。スナップショットやクローニングなどの一般的なボリューム機能も備えており、冗長性とパフォーマンスを目的としたRAIDやRAIDライクなアレイにボリュームを組織化することができます。ZFSはライセンスに関する問題から物議を醸していますが、商業的なサポートを考慮に入れると、Btrfsとほぼ同じくらい人気があります。
さらに、Windowsでは主に*NTFSとExFATが使用され、macOSでは主にHFS+とAPFSが使用されます。これらのファイルシステム形式は異なるプラットフォームで読み取ることが通常であり、場合によっては書き込むこともできますが、追加の互換性ツールが必要な場合もあります。
Linuxのストレージデバイスの管理方法
/dev内のデバイスファイル
Linuxでは、ほとんどのものがファイルとしてファイルシステム階層のどこかに表されます。これにはストレージドライブなどのハードウェアも含まれ、システム上では/dev
ディレクトリ内のファイルとして表されます。通常、ストレージデバイスを表すファイルは、sd
またはhd
で始まり、その後に文字が続きます。たとえば、サーバー上の最初のドライブは通常/dev/sda
のようなものです。
これらのドライブのパーティションも/dev
内にファイルとして存在し、ドライブ名の末尾にパーティション番号を追加して表されます。たとえば、前の例のドライブの最初のパーティションは/dev/sda1
となります。
/dev/sd*
および/dev/hd*
デバイスファイルは、ドライブやパーティションを参照する伝統的な方法を表していますが、これらの値だけを使用することには重大な欠点があります。
この問題を解決するために、/dev/disk
ディレクトリには、システム上のディスクとパーティションをより永続的に識別するためのサブディレクトリが含まれています。これらには、ブート時に正しい/dev/[sh]da*
ファイルに対して作成されるシンボリックリンクが含まれています。リンクの名前は、ディレクトリの識別特性に基づいて命名されます(たとえば、/dev/disk/by-partlabel
ディレクトリではパーティションのラベルに基づいています)。これらのリンクは常に正しいデバイスを指し示すため、ストレージスペースの静的な識別子として使用することができます。
/dev/disk
の下には、以下のサブディレクトリのいくつかまたはすべてが存在する可能性があります:
by-label
:ほとんどのファイルシステムには、ユーザーがディスクやパーティションに任意の名前を割り当てることができるラベリングメカニズムがあります。このディレクトリには、これらのユーザー指定のラベルに基づいて命名されたリンクが含まれています。by-uuid
:UUID(ユニバーサルユニーク識別子)は、ストレージリソースのIDとして使用できる長い一意の文字列です。これらは一般には非常に読みやすくありませんが、ほぼ常に一意であり、システム間でも衝突が起こりにくいです。したがって、システム間で移動する可能性のあるストレージを参照するためには、UUIDを使用することが良いアイデアかもしれません。by-partlabel
とby-partuuid
:GPTテーブルは、識別に使用できる独自のラベルとUUIDを提供します。これは前の2つのディレクトリと同様の方法で機能しますが、GPT固有の識別子を使用します。by-id
:このディレクトリには、ハードウェアの固有のシリアル番号とそれに接続されたハードウェアによって生成されたリンクが含まれています。デバイスがシステムに接続される方法によって、by-id
名が変わる可能性があるため、完全に永続的ではありません。by-path
:by-id
と同様に、このディレクトリはストレージデバイスのシステムへの接続に依存しています。ここにあるリンクは、デバイスへのアクセスに使用されるハードウェアのシステムによる解釈を使用して構築されます。デバイスを別のポートに接続すると、この値が変わる可能性があるため、by-id
と同じ制約があります。
通常、特定のデバイスを永続的に識別するためには、by-label
またはby-uuid
が最適なオプションです。
注意:DigitalOceanブロックストレージボリュームは、オペレーティングシステムに報告されるデバイスのシリアル番号を制御します。これにより、このプラットフォームではby-id
の分類が信頼性のある永続的なものになります。これはDigitalOceanボリュームを参照するための推奨される方法であり、起動時に永続的で予測可能です。
ブロックデバイスのマウント
Linuxや他のUnix系オペレーティングシステムでは、物理デバイスの数に関係なく、システム全体が単一の統合ファイルツリーで表されます。ドライブやパーティション上のファイルシステムを使用する場合、既存のツリーに接続する必要があります。 マウントは、フォーマットされたパーティションやドライブをLinuxファイルシステム内のディレクトリに接続するプロセスです。そのディレクトリからドライブの内容にアクセスできます。
ドライブはほとんどの場合、専用の空のディレクトリにマウントされます。空でないディレクトリにマウントすると、そのディレクトリの通常の内容にアクセスできなくなります(ドライブがアンマウントされるまで)。マウントされたデバイスの動作を変更するために設定できるさまざまなマウントオプションがあります。たとえば、ドライブを読み取り専用モードでマウントして、その内容が変更されないようにすることができます。
ファイルシステム階層標準では、一時的にマウントされたファイルシステムには/mnt
またはそのサブディレクトリを使用することが推奨されています。より永続的なストレージをマウントする場所については推奨がないため、任意の方法を選択できます。多くの場合、/mnt
または/mnt
のサブディレクトリも永続的なストレージに使用されます。
/etc/fstabでマウントを永続化する
Linuxシステムでは、ブートプロセス中にどのファイルシステムをマウントするかを決定するために、/etc/fstab
(ファイルシステムテーブル)というファイルが使用されます。このファイルにエントリがないファイルシステムは、他のソフトウェアによってスクリプト化されない限り、自動的にマウントされません。
/etc/fstab
ファイルの各行は、マウントする異なるファイルシステムを指定します。この行には、ブロックデバイス、アタッチするマウントポイント、ドライブのフォーマット、マウントオプション、およびその他の情報が指定されます。
より複雑なストレージ管理
これらの基本機能によって多くのユースケースが対応されますが、複数のディスクを結合するためのより複雑な管理パラダイムも利用できます。特に、RAIDがあります。
RAIDとは何ですか?
RAIDは、冗長なアレイオブインディペンデントディスクの略です。RAIDは、ドライブをグループ化して追加の機能を備えた単一のユニットとして管理するためのストレージ管理および仮想化技術です。
RAIDアレイの特性は、そのRAIDレベルによって異なります。RAIDレベルは、アレイ内のディスク同士の関係を定義します。よく使われるいくつかのレベルは次のとおりです:
- RAID 0:このレベルはドライブのストライピングを示します。つまり、データがアレイに書き込まれる際に、それが分割され、直線的にセット内のディスクに分散されます。これにより、複数のディスクに同時に書き込みや読み取りが行えるため、パフォーマンスが向上します。欠点は、1つのドライブの障害が発生すると、アレイ全体のデータが失われる可能性があることです。なぜなら、どのディスクにも内容に関する十分な情報が含まれていないため、再構築ができないからです。このため、RAID 0は通常、この理由から本番環境では使用されませんが、比較の基準としては有用です。
- RAID 1:RAID 1はドライブのミラーリングを示します。RAID 1アレイに書き込まれたデータは、複数のディスクに書き込まれます。その主な利点はデータの冗長性であり、ミラーのいずれかの側のハードドライブの損失でもデータが残ることができます。複数のドライブに同じデータが含まれるため、使用可能な容量は少なくとも半分に減少します。
- RAID 5:RAID 5は、RAID 0と同様にデータを複数のドライブにストライプ化します。ただし、このレベルではドライブ間で分散パリティも実装されています。つまり、1つのドライブが故障しても、残りのドライブがパリティ情報を共有してアレイを再構築することができます。通常、これは1つのディスクを再構築するのに十分な容量ですので、アレイは1つのディスクの損失を生き残ることができます。RAID 5は、アレイの利用可能なスペースを1つのディスクの容量分減少させます。
- RAID 6:RAID 6はRAID 5と同じ特性を持ちますが、ダブルパリティを提供します。これはRAID 6アレイが2つのドライブの故障に耐えることができることを意味します。アレイの容量は再びパリティ量に影響を受け、使用可能な容量は2つのディスク分のスペースが減少します。
- RAID 10:RAID 10はレベル1とレベル0の組み合わせです。まず、2つのミラーリングアレイが作成されます。次に、データがそれらにストライプ化されます。これにより、冗長性の特性を持ちながら良好なパフォーマンスが提供されるアレイが作成されます。ただし、かなり多数のドライブが必要であり、総容量は結合されたディスクスペースの半分以下です。
次はどこに進めばよいですか?
Linuxシステムで新しいストレージデバイスを使用したい場合は、この記事が新しいファイルシステムのパーティション分割、フォーマット、マウントのプロセスを案内します。これは、追加の容量を主に気にする多くのユースケースに十分です。ストレージ管理タスクの実行方法を学ぶには、Linuxでストレージデバイスの基本管理タスクを実行する方法をチェックしてください。