mount − ファイルシステムをマウント/アンマウントする
#include <sys/mount.h>
int mount(const char *source, const char *target,
const char *filesystemtype, unsigned long mountflags,
const void *data);
mount() は source で指定されたファイルシステム (デバイス名であることが多いが、 ディレクトリ名やダミーの場合もある) を target で指定されたディレクトリに結びつける。
ファイルシステムのマウントを行うには、 適切な権限 (Linux では CAP_SYS_ADMIN ケーパビリティ) が必要である。
Linux 2.4 以降、ひとつのファイルシステムを複数のマウントポイントに 結びつけることができ、同じマウントポイントに複数のマウントをスタック させることもできる。
引き数 filesystemtype としてカーネルが対応している値は、 /proc/filesystems で参照できる (例えば "minix", "ext2", "ext3", "jfs", "xfs", "reiserfs", "msdos", "proc", "nfs", "iso9660" 等)。 適切なモジュールが読み込まれると、さらに別の値が利用可能になるかもしれない。
引き数 mountflags の上位 16 ビットには、マジックナンバー 0xC0ED (MS_MGC_VAL) を指定することができる (マジックナンバーは、 カーネルバージョン 2.4 より前では必須であったが、 現在は必要なく、指定されても無視される)。 mountflags の下位 16 ビットにマウントフラグを指定する。
MS_BIND (Linux 2.4 以降)
バインドマウントを行う。これはファイルやディレクトリの部分木を ファイルシス テム内部の別の場所で見えるようにするものである。 バインドマウントを使うと、 ファイルシステムをまたいで chroot(2) jail を構成することが可能になる。 引き数 filesystemtype と data は無視される。 Linux 2.6.26 より前では mountflags も無視されていた (バインドマウントでは、マウントポイントとなる ファイルシステムと同じマウントオプションが使用される)。
MS_DIRSYNC (Linux 2.5.19 以降)
このファイルシステムへのディレクトリ変更を同期的に行う。 (この特性は個々のディレクトリ、または chattr(1) を使った部分木毎に設定できる。)
MS_MANDLOCK
このファイルシステムのファイルに対して強制ロックを認める。 (強制ロックを有効にするには、 fcntl(2) で述べられている方法でファイル単位で許可をしなければならない)
MS_MOVE
部分木を移動する。 source にはすでに存在するマウントポイントを指定し、 target には新しい場所を指定する。 移動はアトミックである。 操作の実行中、部分ツリーがアンマウントされることはない。 filesystemtype, mountflags, data 引き数は無視される。
MS_NOATIME
このファイルシステムの (全ての種類の) ファイルのアクセス時刻を更新しない。
MS_NODEV
このファイルシステムのデバイス (スペシャルファイル) へのアクセスを許可しない。
MS_NODIRATIME
このファイルシステムのディレクトリのアクセス時刻を更新しない。 このフラグは MS_NOATIME で提供される機能のサブセットを提供する。つまり、 MS_NOATIME では MS_NODIRATIME が暗黙のうち設定される。
MS_NOEXEC
このファイルシステムにあるプログラムの実行を許可しない。
MS_NOSUID
このファイルシステムのプログラムを実行するときに、 set−user−ID ビットと set−group−ID ビットを無視する。
MS_RDONLY
ファイルシステムを読み込み専用でマウントする。
MS_RELATIME (Linux 2.6.20 以降)
このファイルシステム上のファイルがアクセスされた際、 そのファイルの最終アクセス時刻 (atime) の現在値が 最終修正時刻 (mtime) や最終状態変更時刻 (ctime) と 等しいか小さい場合にのみ、atime を更新する。 このオプションは、 mutt(1) のように、最後の内容修正以降にファイルがいつ読み出されたかを知る 必要があるプログラムで有用である。 Linux 2.6.30 以降では、 MS_NOATIME が指定されていない場合には、このフラグの動作が カーネルのデフォルト動作となっており、 Linux 2.6.30 より前の動作をさせるためには MS_STRICTATIME フラグを指定する必要がある。 これに加えて、Linux 2.6.30 以降では、 ファイルの最終アクセス時刻が 1 日以上前の場合、 ファイルの最終アクセス時刻は常に更新される。
MS_REMOUNT
すでに存在するマウントを再マウントする。これにより、すでに存在するマウントの mountflags と data を、一度アンマウントしてから再マウントするという作業をせずに 変更できる。 target は最初の mount() 呼び出しと同じ値を指定する必要がある。 source と filesystemtype は無視される。 引き数 mountflags と data は、意図的に変更するもの以外は、 元の mount() の呼び出しで使用した値と一致するようにすべきである。
mountflags のうち MS_RDONLY, MS_SYNCHRONOUS, MS_MANDLOCK は変更可能である。 カーネル 2.6.16 より前では、 MS_NOATIME, MS_NODIRATIME も変更可能であった。 カーネル 2.4.10 より前では、上記に加えて、 MS_NOSUID, MS_NODEV, MS_NOEXEC も変更可能であった。
MS_SILENT (Linux 2.6.17 以降)
カーネルのログ内のある種の (printk()) 警告メッセージの表示を抑制する。 このフラグは、名前が不適切で廃止された MS_VERBOSE フラグ (Linux 2.4.12 以降で利用可能) を置き換えるもので、同じ意味を持つ。
MS_STRICTATIME (Linux 2.6.30 以降)
このファイルシステムがアクセスされた際に最終アクセス時刻 (atime) を常に更新する (Linux 2.6.30 より前では、これがデフォルトの動作 であった)。 このフラグを指定することで、 MS_NOATIME と MS_RELATIME の両フラグを設定した際の影響を上書きすることができる。
MS_SYNCHRONOUS
ファイルシステムに対して同期的に書き込みを行う。 (このファイルシステムの全てのオープンされたファイルに対して、 open(2) のフラグに O_SYNC を指定したような動作となる)
Linux 2.4 以降では、 MS_NODEV, MS_NOEXEC, MS_NOSUID はマウントポイント単位で指定できる。 カーネル 2.6.16 以降では、 MS_NOATIME と MS_NODIRATIME もマウントポイント単位で指定できる。 また、 MS_RELATIME フラグもマウントポイント単位で設定できる。
引き数 data がどのように解釈されるかは、ファイルシステムによって異なる。 たいていは、指定されたファイルシステムで利用可能なオプションが コンマ区切りで並べられた文字列である。 各ファイルシステムに対して指定可能なオプションの詳細については mount(8) を参照のこと。
成功した場合、0 が返される。 失敗した場合、 −1 が返され、 errno に適切な値がセットされる。
以下に示すエラーは、ファイルシステムに依存しないものである。 それぞれのファイルシステムタイプには固有のエラーが存在する場合があり、 独自の動作をすることもある。詳しくは Linux カーネルのソースを見て欲しい。
EACCES |
パスに含まれるディレクトリに検索 (実行) 許可がない (path_resolution(7) も参照)。 または、 MS_RONLY フラグを指定せずに読み込み専用のファイルシステムを マウントしようとした。 または、ブロックデバイス source が MS_NODEV オプションでマウントされたファイルシステム上にある。 |
||
EBUSY |
source は既にマウントされている。 または、書き込み用にオープンされたファイルがあり、 読み込み専用で再マウントすることができない。 または、 target が使用中 (busy) のため、 target にマウントできない。 target が使用中の例としては、あるスレッドの動作ディレクトリ (working directory) であるとか、別のデバイスのマウントポイントであるとか、 オープンされたファイルが存在する、などがある。 |
||
EFAULT |
場所を示す引き数のひとつがユーザーのアドレス空間の外を指している。 |
||
EINVAL |
source に不正なスーパーブロックがある。 または、 source が target にマウントされていないのに、再マウント (MS_REMOUNT) が要求された。 または、 source がマウントポイントではないか、'/' なのに、移動 (MS_MOVE) が要求された。 |
||
ELOOP |
パス名の解決中に登場したリンクが多すぎた。 または、 target が source の子孫なのに移動が要求された。 |
||
EMFILE |
(ブロックデバイスが必要でない場合) ダミーデバイスのテーブルが一杯になった。 |
ENAMETOOLONG
パス名の長さが MAXPATHLEN より長かった。
ENODEV |
filesystemtype がカーネル中で定義 (config) されていない。 |
||
ENOENT |
パス名が空である。もしくは指定されたパスが存在しない。 |
||
ENOMEM |
カーネルがファイル名やデータをコピーするための空きページを確保できなかった。 |
ENOTBLK
(ブロックデバイスが必要だが) source がブロックデバイスではない。
ENOTDIR
target か、 source のプレフィックスがディレクトリではない。
ENXIO |
ブロックデバイス source のメジャー番号が範囲外である。 |
||
EPERM |
呼び出し元が必要な権限を持っていない。 |
MS_DIRSYNC, MS_MOVE, MS_REC, MS_RELATIME, MS_STRICTATIME の定義が glibc のヘッダーに追加されたのは バージョン 2.12 においてである。
この関数は Linux 固有の関数であり、移植を考慮したプログラムでは 使用すべきでない。
元の MS_SYNC フラグは、別の MS_SYNC が <mman.h> に追加されたので 1.1.69 から MS_SYNCHRONOUS に名前が変わった。
Linux 2.4 より前のバージョンでは、 MS_NOSUID オプション付きでマウントされたファイルシステム上の set−UID や set−GID のプログラムを実行しようとすると、 EPERM エラーとなった。 Linux 2.4 以降では、このような場合は set−UID ビットや set−GID ビットが 無視されるだけである。
プロセス単位の名前空間
カーネル 2.4.19 以降の Linux では、プロセス単位のマウント名前空間 (mount namespace) が提供されている。マウント名前空間とは、 あるプロセスに見えているファイルシステムのマウントの集合である。 マウントポイントの名前空間は複数のプロセスで共有することができ、 普通は共有されている。 一つのプロセスによる名前空間の変更 (すなわち、マウントやアンマウント) は 同じ名前空間を共有する他の全てのプロセスにも見える。 (2.4.19 より前の Linux は、一つの名前空間がシステム上の全プロセスで 共有される状況とみなすことができる。)
fork(2) 経由で作成された子プロセスは親プロセスのマウント名前空間を共有する。 execve(2) の前後でマウント名前空間は保持される。
プロセスは自分用 (private) のマウント名前空間を持つことができる。 自分用の名前空間を持つことができるのは、 そのプロセスが clone(2) CLONE_NEWNS フラグを使って作成された場合と、 そのプロセスが CLONE_NEWNS フラグ付きで unshare(2) を呼び出した場合である。 前者の場合、作成されたプロセスの新しい名前空間は clone(2) を呼び出したプロセスの名前空間の「コピー」で初期化される。 後者の場合、 unshare(2) を呼び出すと、呼び出し元のプロセスのマウント名前空間が、 それまでは他のプロセスと共有していた名前空間の自分用のコピーとなる。 これにより、呼び出し元のプロセスがこれ以後に行うマウント/アンマウントは 他のプロセスから見えなくなる (ただし、呼び出し元のプロセスが unshare(2) の呼び出し以降に作成した子プロセスには見える)。 また、その逆の、他のプロセスが行ったマウント/アンマウントも呼び出し元のプロセスには 見えなくなる。
Linux 独自のファイル /proc/PID/mounts では、指定された ID を持つプロセスのマウント名前空間における マウントポイントのリストが公開されている。詳細は proc(5) を参照のこと。
umount(2), namespaces(7), path_resolution(7), lsblk(8), mount(8), umount(8)
この man ページは Linux man−pages プロジェクトのリリース 3.79 の一部 である。プロジェクトの説明とバグ報告に関する情報は http://www.kernel.org/doc/man−pages/ に書かれている。