マウントとアンマウント
Linuxではファイルシステムを使う前に、ディレクトリツリーのどこかに接続する「マウント」が必要です。接続先のディレクトリを「マウントポイント」と呼び、mount /dev/sda1 /mnt のように指定します。引数なしの mount や findmnt で現在の接続状況を確認できます。取り外す前には umount でアンマウントしてバッファを書き込み切る必要があり、使用中だと外せないため lsof などで利用プロセスを確認します。
ファイルシステムを作った。なのに、その中身にまだ普段のようにはアクセスできない。
Windowsのように「Dドライブ」といったドライブレターでディスクが独立して見える仕組みとは違い、Linuxではすべてのファイルが / を頂点とするただ1本のディレクトリツリーに統合されているからだ。
新しく用意したファイルシステムを使うには、この1本のツリーのどこかに枝として接ぎ木する操作が必要だ。これをマウントと呼ぶ。
接ぎ木する先のディレクトリのことをマウントポイントといい、マウントするとそのファイルシステムの中身が、指定したマウントポイント以下に見えるようになる。Linuxにドライブレターという概念がなく、すべてが1つのツリーに収まるのは、この「マウントしてツリーに繋ぐ」という考え方があるからだ。
では、その接ぎ木は、どのコマンドで行うのか。
🔌 mount は、何と何を繋ぐのか
マウントを行うのが mount コマンドだ。書式は mount デバイス マウントポイント である。
たとえば mount /dev/sda1 /mnt とすると、/dev/sda1 のファイルシステムが /mnt ディレクトリ以下に接続され、以後 /mnt の中を見ればそのファイルシステムの中身が見えるようになる。
マウントポイントには通常、あらかじめ用意した空のディレクトリを使い、無ければ mkdir /mnt/data のように先に作っておく。一時的な作業には /mnt がよく使われ、USBメモリなどのリムーバブルメディアには /media 以下が慣例だ。
ファイルシステムの種類は mount が自動判別してくれることがほとんどだが、明示したいときは mount -t ext4 /dev/sda1 /mnt のように -t で指定する。
デバイス名の代わりに、blkid で調べた UUID を使って mount UUID=xxxx-xxxx /mnt のように指定することもできる。こちらのほうが取り違えが起きにくく安全だ。
ここで一つ、引っかかりやすい落とし穴がある。すでに何かファイルが入っているディレクトリをマウントポイントにすると、マウントしている間は元の中身が見えなくなる(隠される)のだ。
元のファイルが消えるわけではなく、アンマウントすればまた現れる。だが混乱のもとなので、マウントポイントには空のディレクトリを使うのが安全だ。
⚙ マウントの挙動は、どこまで変えられるのか
mount には -o に続けてマウントオプションを指定でき、ファイルシステムの扱われ方を細かく制御できる。
よく使うのは、書き込みを禁止して読み取り専用にする ro(逆に読み書き可は rw)、実行ファイルの実行を禁じる noexec、そのファイルシステム上のファイルへのアクセス時刻の記録を省いて性能を上げる noatime などだ。
たとえば mount -o ro /dev/sda1 /mnt とすると、誤って書き換える心配なく中身を確認できる。複数指定するときは mount -o ro,noexec /dev/sda1 /mnt のようにカンマで区切る。
これらのオプションは、次のトピックで扱う /etc/fstab の第4フィールドにそのまま書く値でもあるので、ここで意味を押さえておくと後がスムーズだ。
👀 いまの状態は、どこを見れば分かるのか
いまどのファイルシステムがどこにマウントされているかは、引数なしの mount を実行すると一覧で確認できる。
ただし出力が多く読みにくいため、より見やすい findmnt コマンドがおすすめだ。findmnt はマウントの状態をツリー形式で整然と表示してくれ、findmnt /mnt のように対象を指定して個別に確認することもできる。
また、これまで使ってきた lsblk も、各ブロックデバイスのMOUNTPOINT列でマウント先を示してくれるので、「このパーティションはどこに繋がっているか」を確認するのに役立つ。マウントポイントの空き容量を知りたいときは、後のトピックで扱う df コマンドが使える。
繋いだものは、外すときにも作法がある。
🔻 なぜ、いきなり引き抜いてはいけないのか
マウントしたファイルシステムを切り離すにはアンマウントを行い、コマンドは umount だ(unmount ではなく n が1つ少ない綴りに注意してほしい)。umount /mnt のようにマウントポイントを指定するか、umount /dev/sda1 のようにデバイス名を指定する。
アンマウントが重要なのは、Linuxが書き込みの効率を上げるために、データを一度メモリ上のバッファに溜めてからまとめてディスクへ書く仕組みを持っているからだ。
umount はこの溜まった未書き込みのデータをすべてディスクへ書き切って(フラッシュして)から接続を解除する。この手順を踏まずにUSBメモリをいきなり引き抜くと、バッファ内のデータが書かれないまま失われ、ファイルが壊れる原因になる。
リムーバブルメディアを抜く前には必ず umount する、というのは安全運用の基本だ。
🚧 「使用中で外せない」とき、どこを疑うのか
アンマウントしようとすると「target is busy(デバイスがビジー状態です)」というエラーで失敗することがある。
原因は、そのファイルシステムの中のファイルを開いているプロセスがあったり、そのディレクトリをカレントディレクトリにしているシェルがあったりするためだ。
よくあるのは、自分自身が cd でマウントポイントの中に入ったままアンマウントしようとしているケースで、この場合は cd / などで外へ出てから umount し直せば解決する。
誰がそのファイルシステムを使っているのかを突き止めるには lsof +D /mnt(指定ディレクトリ以下で開かれているファイルを一覧する)や fuser -m /mnt といったコマンドが役立つ。原因のプロセスを終了させてから、改めてアンマウントしてほしい。
どうしても外せず、かつ安全が確認できる場合に限り、遅延アンマウントの umount -l という手段もあるが、これは中途半端な状態を生むこともあるため、まずは使用中のプロセスを正しく止めるのが本筋だ。
なお、mount コマンドでの接続はあくまで一時的なもので、システムを再起動すると消えてしまう。起動のたびに自動で繋ぎたい場合は、次のトピックで扱う /etc/fstab を使う。