序章

Linuxには、ストレージドライブを含むハードウェアデバイスを管理するための堅牢なシステムとツールがあります。 この記事では、Linuxがこれらのデバイスをどのように表現するか、およびrawストレージがサーバー上の使用可能なスペースにどのように作成されるかを大まかに説明します。

ブロックストレージとは何ですか?

ブロックストレージは、Linuxカーネルがブロックデバイスと呼ぶものの別名です。 ブロックデバイスは、従来の回転式ハードディスクドライブ(HDD)、ソリッドステートドライブ(SSD)、フラッシュメモリスティックなど、データの保存に使用できるハードウェアです。 カーネルが固定サイズのブロックまたはスペースのチャンクを参照することによってハードウェアとインターフェイスするため、これはブロックデバイスと呼ばれます。

つまり、基本的に、ブロックストレージは、コンピューター上の通常のディスクストレージと考えるものです。 一度設定すると、基本的に現在のファイルシステムツリーの拡張として機能し、ドライブへの情報の書き込みまたはドライブからの情報の読み取りをシームレスに行うことができます。

ディスクパーティションとは何ですか?

ディスクパーティションは、ストレージドライブをより小さな使用可能なユニットに分割する方法です。 パーティションは、ドライブ自体とほとんど同じように扱うことができるストレージドライブのセクションです。

パーティション化により、使用可能なスペースをセグメント化し、各パーティションを異なる目的に使用できます。 これにより、ユーザーは多くの柔軟性を得ることができ、インストールをセグメント化して、簡単なアップグレード、複数のオペレーティングシステム、スワップスペース、または特殊なファイルシステムを実現できます。

ディスクはパーティションを作成せずにフォーマットして使用できますが、一部のオペレーティングシステムは、ディスクに書き込まれるパーティションが1つしかない場合でも、パーティションテーブルを見つけることを期待しています。 将来の柔軟性を高めるために、新しいドライブをパーティション分割することをお勧めします。

MBRとGPT

ディスクをパーティション分割するときは、どのパーティション分割形式が使用されるかを知っておくことが重要です。 これは通常、MBR(マスターブートレコード)とGPT(GUIDパーティションテーブル)のどちらかを選択することになります。

MBR は、30年以上使用されている従来のパーティションシステムです。 その年齢のために、それはいくつかの深刻な制限があります。 たとえば、サイズが2TBを超えるディスクには使用できず、最大4つのプライマリパーティションしか持つことができません。 このため、4番目のパーティションは通常「拡張パーティション」として設定され、「論理パーティション」を作成できます。 これにより、最後のパーティションを細分化して、追加のパーティションを効果的に許可できます。

GPT は、MBRに固有の問題のいくつかを解決しようとする最新のパーティションスキームです。 GPTを実行しているシステムは、ディスクごとにさらに多くのパーティションを持つことができます。 これは通常、オペレーティングシステム自体によって課せられる制限によってのみ制限されます。 さらに、ディスクサイズの制限はGPTには存在せず、パーティションテーブル情報は破損を防ぐために複数の場所で利用できます。 GPTは、ディスクが使用されていることをMBR専用ツールに通知する「保護MBR」を作成することもできます。

ほとんどの場合、オペレーティングシステムまたはツールによってGPTの使用が妨げられない限り、GPTの方が適しています。

フォーマットとファイルシステム

Linuxカーネルはrawディスクを認識できますが、ドライブをそのまま使用することはできません。 使用するには、フォーマットする必要があります。 Formatting は、ファイルシステムをディスクに書き込み、ファイル操作の準備をするプロセスです。 ファイルシステムは、データを構造化し、基になるディスクへの情報の書き込み方法とディスクからの情報の取得方法を制御するシステムです。 ファイルシステムがないと、ストレージデバイスをファイル関連の操作に使用できませんでした。

多くの異なるファイルシステム形式があり、それぞれがオペレーティングシステムのサポートを含む多くの異なる次元にわたるトレードオフを持っています。 基本的なレベルでは、これらはすべてユーザーにディスクの同様の表現を提示しますが、それぞれがサポートする機能と、ユーザーおよび保守操作を可能にするために使用されるメカニズムは大きく異なる可能性があります。

Linuxで最も人気のあるファイルシステムのいくつかは次のとおりです。

  • Ext4 :最も一般的なデフォルトのファイルシステムはExt4、または拡張ファイルシステムの4番目のバージョンです。 Ext4ファイルシステムはジャーナル化されており、レガシーシステムとの下位互換性があり、非常に安定しており、成熟したサポートとツールを備えています。 特別なニーズがない場合に適しています。
  • XFS :XFSは、パフォーマンスと大きなデータファイルを専門としています。 大きなファイルを処理するときや大きなディスクを操作するときに、すばやくフォーマットされ、優れたスループット特性を備えています。 また、ライブスナップショット機能もあります。 XFSは、メタデータとデータの両方をジャーナリングするのではなく、メタデータジャーナリングを使用します。 これによりパフォーマンスが高速になりますが、突然の電力損失が発生した場合にデータが破損する可能性があります。
  • Btrfs :Btrfsは、最新の機能豊富なコピーオンライトファイルシステムです。 このアーキテクチャにより、スナップショット、クローン作成、ボリュームなど、一部のボリューム管理機能をファイルシステムレイヤーに統合できます。 フルディスクを処理する場合、Btrfsはまだいくつかの問題に遭遇します。 実稼働ワークロードの準備についてはいくつかの議論があり、多くのシステム管理者はファイルシステムがより成熟するのを待っています。
  • ZFS :ZFSは、コピーオンライトファイルシステムおよびボリュームマネージャーであり、堅牢で成熟した機能セットを備えています。 優れたデータ整合性機能を備え、大きなファイルシステムサイズを処理でき、スナップショットやクローン作成などの一般的なボリューム機能を備え、冗長性とパフォーマンスの目的でボリュームをRAIDおよびRAIDのようなアレイに編成できます。 Linuxでの使用に関して、ZFSには、ライセンスに関する懸念から物議を醸す歴史があります。 ただし、Ubuntuは現在バイナリカーネルモジュールを出荷しており、Debianのリポジトリにはソースコードが含まれています。 他のディストリビューションでのサポートはまだ決定されていません。

Linuxがストレージデバイスを管理する方法

/dev内のデバイスファイル

Linuxでは、ほとんどすべてがファイルで表されます。 これには、/devディレクトリ内のファイルとしてシステム上に表されるストレージドライブなどのハードウェアが含まれます。 通常、ストレージデバイスを表すファイルは、sdまたはhdで始まり、その後に文字が続きます。 たとえば、サーバーの最初のドライブは通常、/dev/sdaのようなものです。

これらのドライブのパーティションには、/dev内にファイルがあり、ドライブ名の末尾にパーティション番号を追加することで表されます。 たとえば、前の例のドライブの最初のパーティションは/dev/sda1になります。

/dev/sd*および/dev/hd*デバイスファイルは、ドライブとパーティションを参照する従来の方法を表していますが、これらの値を単独で使用することには大きな欠点があります。 Linuxカーネルは、起動のたびにどのデバイスがどの名前を取得するかを決定するため、デバイスがデバイスノードを変更するという混乱を招くシナリオにつながる可能性があります。

この問題を回避するために、/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-pathby-idと同様に、このディレクトリはシステム自体へのストレージデバイス接続に依存しています。 ここでのリンクは、デバイスへのアクセスに使用されるハードウェアのシステムの解釈を使用して構築されます。 これには、by-idと同じ欠点があります。これは、デバイスを別のポートに接続すると、この値が変わる可能性があるためです。

通常、by-labelまたはby-uuidは、特定のデバイスを永続的に識別するための最良のオプションです。

ノート

DigitalOceanブロックストレージボリュームは、オペレーティングシステムに報告されるデバイスのシリアル番号を制御します。 これにより、by-idの分類をこのプラットフォームで確実に永続化できます。 これは、永続的であり、最初の起動時に予測可能であるため、DigitalOceanボリュームを参照するための推奨される方法です。

取り付けブロックデバイス

/dev内のデバイスファイルは、問題のデバイスのカーネルドライバーと通信するために使用されます。 ただし、デバイスを使用可能なスペースのセグメントとして扱うには、より有用な抽象化が必要です。

Linuxおよびその他のUnixライクなオペレーティングシステムでは、関係する物理デバイスの数に関係なく、システム全体が単一の統合ファイルツリーで表されます。 そのため、ドライブまたはパーティション上のファイルシステムを使用する場合は、既存のツリーにフックする必要があります。 マウントは、フォーマットされたパーティションまたはドライブをLinuxファイルシステム内のディレクトリに接続するプロセスです。 その後、ドライブの内容にそのディレクトリからアクセスできます。

ドライブは、ほとんどの場合、専用の空のディレクトリにマウントされます(空でないディレクトリにマウントすると、ドライブがマウント解除されるまで、ディレクトリの通常の内容にアクセスできなくなります)。 マウントされたデバイスの動作を変更するために設定できるさまざまなマウントオプションがあります。 たとえば、ドライブを読み取り専用モードでマウントして、その内容が変更されないようにすることができます。

Filesystem Hierarchy Standard は、一時的にマウントされたファイルシステムには、/mntまたはその下のサブディレクトリを使用することをお勧めします。 これがユースケースに一致する場合、これはおそらくそれをマウントするのに最適な場所です。 より永続的なストレージをどこにマウントするかについては推奨されていないため、任意のスキームを選択できます。 多くの場合、/mntまたは/mntサブディレクトリは、より永続的なストレージにも使用されます。

/ etc/fstabを使用してマウントを永続化する

Linuxシステムは、/etc/fstab(ファイルシステムテーブル)というファイルを調べて、起動プロセス中にマウントするファイルシステムを決定します。 このファイルにエントリがないファイルシステムは自動的にマウントされません(systemd .mountユニットファイルで定義されているものは例外ですが、現時点では一般的ではありません)。

/etc/fstabファイルはかなり単純です。 各行は、マウントする必要のある異なるファイルシステムを表しています。 この行は、ブロックデバイス、それを接続するマウントポイント、ドライブの形式、マウントオプション、およびその他のいくつかの情報を指定します。

より複雑なストレージ管理

ほとんどの単純なユースケースでは追加の管理構造は必要ありませんが、より複雑な管理パラダイムによって、パフォーマンス、冗長性、または柔軟性を高めることができます。

RAIDとは何ですか?

RAID は、iに依存しないdリスクのr冗長aレイの略です。 RAIDは、ストレージ管理および仮想化テクノロジーであり、ドライブをグループ化して、追加機能を備えた単一のユニットとして管理できます。

RAIDアレイの特性は、RAIDレベルに依存します。これは、基本的に、アレイ内のディスクが相互にどのように関係するかを定義します。 選択したレベルは、セットのパフォーマンスと冗長性に影響を与えます。 より一般的なレベルのいくつかは次のとおりです。

  • RAID 0 :このレベルはドライブストライピングを示します。 これは、データがアレイに書き込まれるときに、データが分割され、セット内のディスクに分散されることを意味します。 これにより、複数のディスクに同時に書き込みまたは読み取りができるため、パフォーマンスが向上します。 欠点は、1つのディスクに再構築する内容に関する十分な情報が含まれていないため、単一のドライブに障害が発生すると、アレイ全体のすべてのデータが失われる可能性があることです。
  • RAID 1 :RAID1は基本的にドライブミラーリングです。 RAID 1アレイに書き込まれるものはすべて、複数のディスクに書き込まれます。 主な利点はデータの冗長性です。これにより、ミラーのいずれかの側でハードドライブが失われた場合でもデータを存続させることができます。 複数のドライブに同じデータが含まれているため、使用可能な容量が半分になります。
  • RAID 5 :RAID 5は、RAID 0と同様に、複数のドライブにデータをストライプ化します。 ただし、このレベルでは、ドライブ全体に分散パリティも実装されます。 これは基本的に、ドライブに障害が発生した場合、残りのドライブがそれらの間で共有されるパリティ情報を使用してアレイを再構築できることを意味します。 パリティ情報は、任意の1つのディスクを再構築するのに十分です。つまり、アレイは、任意の1つのディスクの損失に耐えることができます。 パリティ情報により、アレイ内の使用可能なスペースが1つのディスクの容量だけ減少します。
  • RAID 6 :RAID6はRAID5と同じプロパティを備えていますが、ダブルパリティを提供します。 これは、RAID6アレイが2台のドライブの損失に耐えることができることを意味します。 アレイの容量は、パリティの量の影響を受けます。つまり、使用可能な容量は、2ディスク分のスペースによって減少します。
  • RAID 10 :RAID10はレベル1と0の組み合わせです。 最初に、2セットのミラーリングされたアレイが作成されます。 次に、データがそれらにストライピングされます。 これにより、優れたパフォーマンスを提供しながら、いくつかの冗長性を備えたアレイが作成されます。 ただし、これにはかなりの数のドライブが必要であり、合計容量は合計ディスク容量の半分です。

LVMとは何ですか?

LVM、または L ogical V olume M anagementは、基盤となるストレージデバイスの物理的特性を抽象化して、柔軟性とパワーを向上させるシステムです。 LVMを使用すると、物理デバイスのグループを作成し、それを1つのスペースブロックであるかのように管理できます。 次に、必要に応じて、パーティションとして機能する論理ボリュームにスペースをセグメント化できます。

LVMは通常のパーティションの上に実装され、従来のパーティションに固有の制限の多くを回避します。 たとえば、LVMボリュームを使用すると、パーティションを簡単に拡張したり、複数のドライブにまたがるパーティションを作成したり、パーティションのライブスナップショットを作成したり、ボリュームを別の物理ディスクに移動したりできます。 LVMをRAIDと組み合わせて使用すると、従来のRAIDパフォーマンス特性を備えた柔軟な管理を提供できます。

次はどこへ?

Linuxシステムで使用する新しいストレージデバイスがある場合は、この記事で、新しいファイルシステムのパーティション分割、フォーマット、およびマウントの基本的なプロセスについて説明します。 これは、主に容量の追加に関心があるほとんどのユースケースで十分です。 基本的なストレージ管理タスクの実行方法については、この記事をご覧ください。