はじめに
マウントとは、ファイルシステムをOSのディレクトリツリーの一か所につなぎ、そのパスから中身を使えるようにする操作です。
クラウドでは、ストレージをサーバーに「アタッチ」することと、OSからファイルとして使えるよう「マウント」することは別の段階です。
対象読者:Linuxやクラウドを触り始めて、「ストレージをマウントする」と言われた人
クラウドの説明を読んでいると「EBSをアタッチして、フォーマットして、マウントする」と作業が並びます。どれもストレージに関する話なのに、なぜ段階が分かれているのか。USBメモリからクラウドまで同じ考え方で整理します。
参考文献
まず「ストレージ」と「ファイルシステム」は別物
ストレージはデータを置く場所です。ファイルシステムは、その場所にあるデータを「ファイル名」や「フォルダ」で整理して読み書きする仕組みです。
空のディスクを思い浮かべてください。ディスクはコンピューターに接続されても、そこにファイル名やフォルダが自動で生まれるわけではありません。ディスク上にファイルシステムがあり、OSがそれを認識し、どこかのパスから見えるようになって、ようやく /data/report.csv のように扱えます。
Linuxの mount マニュアルでは、ファイルシステムをOSの大きなディレクトリツリーに接続する操作として説明されています。ここで言う「接続」はケーブルを挿すことではなく、OSがパスをたどったときに、別のファイルシステムへ進めるようにすることです。
同じ基本説明は、次の記事でも扱われています。ファイルシステムとディレクトリを結び付ける操作として整理されています。
マウントポイントは「中身を見る入口」
マウント先に指定するディレクトリを「マウントポイント」と呼びます。たとえば /data がマウントポイントなら、マウントしたファイルシステムの中身を /data から見ます。
マウント前:/data は、OSにもともとある普通のディレクトリ
マウント後:/data の先に、別のファイルシステムの中身が見える
つまり、マウントでファイルを /data にコピーしているわけではありません。ファイルがある場所は接続先のストレージのままで、OSからたどる道筋ができています。
少し意外なのが、マウントポイントに元からファイルがあった場合、そのファイルはマウント中に見えなくなることです。削除されたわけではありません。接続先のファイルシステムがその場所を覆うため、マウントを解除するまで隠れます。なので、通常は中身が空のディレクトリをマウントポイントに使います。
USBメモリで考えると、段階が見える
USBを挿す行為と、中のファイルを開けることは同じではありません。OSがUSBのデバイスを認識しても、対応するファイルシステムを読み取って、ファイルツリーのどこかに結び付ける必要があります。デスクトップOSでは、ここを自動で行うことが多いため、普段は意識しないだけです。
Linuxでは、接続したデバイス上のファイルシステムを /mnt/usb にマウントすると、/mnt/usb/photo.jpg のようなパスでアクセスできます。この「場所を決めて、そこから中身を見せる」のがマウントです。
Linuxを初めて学ぶ人向けの記事でも、マウントポイントを外部デバイスの内容に入るための入口として説明しています。
クラウドのEBSでは「アタッチ」と「マウント」が別
ここがクラウドで混乱しやすいところです。Amazon EBSはEC2に接続すると、まずEC2からブロックデバイスとして見えるようになります。これは「サーバーにディスクを渡した」段階です。
その後、空のボリュームならファイルシステムを作成し、マウントポイントを用意して、そのファイルシステムをマウントします。EBSの公式手順も、ボリュームのアタッチ後にファイルシステムを確認し、必要なら作成し、最後にマウントする流れです。
概念をコマンドにすると、こうなります。
sudo mount /dev/nvme1n1 /data
/dev/nvme1n1 はマウントする側、/data は中身を見せる場所です。これはNitroベースのEC2で見られるデバイス名の例で、環境によって異なります。実際に作業するときは lsblk で対象を確認してください。また、すでにデータがあるボリュームに mkfs を実行すると内容を消すため、ここではコマンド例だけに留めます。既存データがあるかを確認せずに初期化してはいけません。
ボリュームをパーティション分割している場合は、ディスク全体ではなくファイルシステムがあるパーティション(例: /dev/nvme1n1p1)をマウントします。
この「アタッチしただけでは使える状態にならない」というつまずきは、次の記事でも手順付きで解説されています。
EFSもマウントする。保存場所がネットワークの先にある
Amazon EFSは、複数のサーバーから使えるネットワークファイルシステムです。EBSのようなブロックデバイスをローカルディスクとして渡す方式とは異なりますが、EC2の /shared にEFSをマウントすれば、そのパスからファイルを読み書きできます。
ここで変わるのは、ファイルシステムの実体がどこにあり、どう通信するかです。「ファイルシステムをサーバーのパスにつなぎ、その場所から使う」というマウントの役割は変わりません。AWSのEFSも、LinuxのNFSクライアントやEFS用のマウントヘルパーを使ってEC2からマウントします。
図にすると、ローカルディスク・EBS・EFSは保存場所や接続方式が違っても、OSからはそれぞれ決めたパスを入口にして扱います。
S3もマウントできる。でもファイルシステムと同じではない
前に書いたストレージの解説で、私はS3を「OSからのマウントは直接できない」とまとめました。これは少し大ざっぱでした。現在はMountpoint for Amazon S3を使い、S3バケットをローカルのファイルシステムのようなパスから扱えます。
ただし、そこから見えるからといってEFSと同じ性質になるわけではありません。Mountpointはファイル操作をS3のオブジェクトAPIに変換する仕組みで、通常のファイルシステムが持つ機能をすべて提供するわけではありません。たとえば、既存オブジェクトの編集やディレクトリのリネームなど、対応しない操作があります。アプリが必要とするファイル操作を確認して選ぶ必要があります。
ストレージの種類そのものの違いは、以前の記事にまとめました。今回は「マウント」の意味に絞り、S3はファイルシステムとしての振る舞いに制約がある例として触れています。
アンマウントは接続を外す操作
マウントを解除する操作はアンマウントです。Linuxでは umount コマンドを使います。
sudo umount /data
これはファイルシステムをOSのパスから切り離す操作で、ストレージ内のデータを削除する操作ではありません。アンマウント後は /data から接続先のファイルを見られなくなりますが、データ自体はストレージ側に残っています。
また、コマンドで一度マウントしただけでは、再起動後に同じ状態になるとは限りません。起動時に自動でマウントしたい場合は、Linuxの /etc/fstab などに設定します。EBSではデバイス名が変わる場合があるため、AWSは /etc/fstab にデバイス名ではなくUUIDを使う方法を推奨しています。「マウント」と「次回起動時にもマウントする設定」は別の話です。
まとめ
マウントは、ストレージそのものを移動したり、ファイルをコピーしたりする操作ではありません。ファイルシステムをOSのディレクトリツリーにつなぎ、決めたパスから中身を使えるようにする操作です。
クラウドで「アタッチ」と「マウント」が並んでいたら、前者はストレージをサーバーに接続する段階、後者はOSのファイルツリーから使えるようにする段階、と読めば大丈夫です。
