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

前書き

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

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

ブロックストレージは、Linuxカーネルがブロックデバイスと呼ぶものの別名です。 *ブロックデバイス*は、従来の回転ハードディスクドライブ(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ディスクを認識できますが、ドライブをそのまま使用することはできません。 使用するには、フォーマットする必要があります。 *フォーマット*は、ファイルシステムをディスクに書き込み、ファイル操作の準備をするプロセスです。 *ファイルシステム*は、データを構造化し、基盤となるディスクへの情報の書き込みおよび取得方法を制御するシステムです。 ファイルシステムがないと、ファイル関連の操作にストレージデバイスを使用できません。

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

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

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

Note

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

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

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

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

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

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

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

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

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

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

RAIDとは何ですか?

  • RAID *は、冗長 独立ディスクの配列です。 RAIDは、ドライブをグループ化し、追加機能を備えた単一のユニットとして管理できるストレージ管理および仮想化テクノロジーです。

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

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

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

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

  • * RAID 6 *:RAID 6にはRAID 5と同じプロパティがありますが、二重パリティを提供します。 つまり、RAID 6アレイは、2台のドライブの損失に耐えることができます。 アレイの容量は再びパリティ量の影響を受けます。つまり、使用可能な容量は2ディスク分のスペース分減少します。

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

LVMとは何ですか?

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

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

次はどこへ?

Linuxシステムで使用する新しいストレージデバイスがある場合は、https://www.digitalocean.com/community/tutorials/how-to-partition-and-format-storage-devices-in-linux [this記事]では、新しいファイルシステムのパーティション分割、フォーマット、およびマウントの基本プロセスについて説明します。 これは、主に容量の追加に関心があるほとんどのユースケースで十分です。 基本的なストレージ管理タスクの実行方法については、https://www.digitalocean.com/community/tutorials/how-to-perform-b​​asic-administration-tasks-for-storage-devices-in-linux [この記事をご覧ください]。

前の投稿:Ubuntu 16.04でPostgres、Nginx、Gunicornを使用してDjangoをセットアップする方法
次の投稿:Debian 10でPython 3を使用してJupyterノートブックをセットアップする方法