Linuxのストレージ用語と概念の紹介

前書き

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

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

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

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

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

ディスクパーティションは、ストレージドライブを使用可能な小さな単位に分割する方法です。 パーティションは、ドライブ自体とほぼ同じ方法で処理できるストレージドライブのセクションです。

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

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

MBRとGPT

ディスクをパーティション分割するときは、どのパーティション分割formatが使用されるかを知ることが重要です。 これは通常、MBR(マスターブートレコード)とGPT(GUIDパーティションテーブル)の選択に帰着します。

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

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

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

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

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

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

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は、特定のデバイスを永続的に識別するための最良のオプションです。

Note

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

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

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

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

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

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

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

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

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

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

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

RAIDとは何ですか?

RAIDは、independentdisksのredundantarrayを表します。 RAIDは、ドライブをグループ化し、追加機能を備えた単一のユニットとして管理できるストレージ管理および仮想化テクノロジーです。

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

  • RAID 0:このレベルはドライブストライピングを示します。 つまり、データがアレイに書き込まれると、データは分割され、セット内のディスクに分散されます。 これにより、複数のディスクを同時に読み書きできるため、パフォーマンスが向上します。 欠点は、1つのディスクに再構築するコンテンツに関する十分な情報が含まれていないため、1つのドライブの障害でアレイ全体のすべてのデータが失われる可能性があることです。

  • RAID 1:RAID1は基本的にドライブミラーリングです。 RAID 1アレイに書き込まれたものはすべて、複数のディスクに書き込まれます。 主な利点はデータの冗長性です。これにより、ミラーの両側でハードドライブが失われてもデータが生き残ることができます。 複数のドライブに同じデータが含まれるため、使用可能な容量が半分になります。

  • RAID 5:RAID 5は、RAID 0と同様に、複数のドライブにデータをストライプ化します。 ただし、このレベルでは、ドライブ全体に分散パリティも実装されます。 これは基本的に、ドライブに障害が発生した場合、残りのドライブが共有されたパリティ情報を使用してアレイを再構築できることを意味します。 パリティ情報は、1つのディスクを再構築するのに十分です。つまり、アレイは1つのディスクが失われても生き残ることができます。 パリティ情報は、1つのディスクの容量分だけアレイ内の使用可能なスペースを減らします。

  • RAID 6:RAID6はRAID5と同じプロパティを持っていますが、ダブルパリティを提供します。 つまり、RAID 6アレイは、2台のドライブの損失に耐えることができます。 ここでも、アレイの容量はパリティ量の影響を受けます。つまり、使用可能な容量は、2ディスク分のスペース分削減されます。

  • RAID 10:RAID10はレベル1と0の組み合わせです。 最初に、ミラー化されたアレイの2つのセットが作成されます。 次に、データがそれらにわたってストライプされます。 これにより、優れたパフォーマンスを提供しながら、いくつかの冗長特性を持つアレイが作成されます。 ただし、これにはかなりの数のドライブが必要であり、合計容量は合計ディスク容量の半分です。

LVMとは何ですか?

LVM、またはLogicalVolumeManagementは、柔軟性と電力を向上させるために、基盤となるストレージデバイスの物理的特性を抽象化するシステムです。 LVMを使用すると、物理デバイスのグループを作成し、1つのスペースブロックのように管理できます。 その後、必要に応じてスペースを論理ボリュームに分割し、パーティションとして機能させることができます。

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

次はどこへ?

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