MOUNT(2) | Linux Programmer's Manual | MOUNT(2) |
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 ビットにマウントフラグを指定する。
mountflags のうち MS_RDONLY, MS_SYNCHRONOUS, MS_MANDLOCK は変更可能である。 カーネル 2.6.16 より前では、 MS_NOATIME, MS_NODIRATIME も変更可能であった。 カーネル 2.4.10 より前では、上記に加えて、 MS_NOSUID, MS_NODEV, MS_NOEXEC も変更可能であった。
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 カーネルのソースを見て欲しい。
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/ に書かれている。
2014-09-21 | Linux |