名前
mount, umount, umount2 - ファイルシステムをマウント/アンマウントする
書式
#include <sys/mount.h>
int mount(const char *source, const char *target,
const char *filesystemtype, unsigned long mountflags,
const void *data);
int umount(const char *target);
説明
mount() は source で指定されたファイルシステム (デバイス名であることが多いが、 ディレクトリ名やダミーの場合もある) を target で指定されたディレクトリに結びつける。
umount() と umount2() は target にマウントされている (最上位の) ファイルシステムを外す。
ファイルシステムのマウント/アンマウントを行うには、 適切な権限 (Linux では CAP_SYS_ADMIN ケーパビリティ) が必要である。
Linux 2.4 以降、ひとつのファイルシステムを複数のマウントポイントに 結びつけることができ、同じマウントポイントに複数のマウントをスタック させることもできる。
引き数 filesystemtype としてカーネルが対応している値は、 /proc/filesystems で参照できる (例えば "minix", "ext2", "msdos", "proc", "nfs", "iso9660" 等)。 適切なモジュールが読み込まれると、さらに別の値が利用可能になるかもしれない。
引き数 mountflags は、先頭 16 ビットはマジックナンバー 0xC0ED (MS_MGC_VAL) で、 残りの 16 ビットがマウントフラグである。 マジックナンバーは、カーネルバージョン 2.4 より前では必須であったが、 現在は必要なく、指定されても無視される。 マウントフラグは libc4 と libc5 では <linux/fs.h> 、 glibc2 では <sys/mount.h> で定義されており、以下の通りである:
MS_BIND | |
(Linux 2.4 以降) バインドマウントを行う。これはファイルやディレクトリの部分木を ファイルシステム内部の別の場所で見えるようにするものである。 バインドマウントを使うと、ファイルシステムをまたいで chroot(2) jail を構成することが可能になる。 filesystemtype, mountflags, data 引き数は無視される。 | |
MS_DIRSYNC (Linux 2.5.19 以降) | |
このファイルシステムへのディレクトリ変更を同期的に行う。 (この特性は個々のディレクトリ、または chattr(8) を使った部分木毎に設定できる。) | |
MS_MANDLOCK | |
このファイルシステムのファイルに対して強制ロックを認める。 (強制ロックを有効にするには、 fcntl(2) で述べられている方法でファイル単位で許可をしなければならない) | |
MS_MOVE | |
部分木を移動する。 source にはすでに存在するマウントポイントを指定し、 target には新しい場所を指定する。 移動はアトミックである。 操作の実行中、部分ツリーがアンマウントされることはない。 filesystemtype, mountflags, data 引き数は無視される。 | |
MS_NOATIME | |
このファイルシステムの (全ての種類の) ファイルのアクセス時刻を更新しない。 | |
MS_NODEV | |
このファイルシステムのデバイス (スペシャルファイル) へのアクセスを許可しない。 | |
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) のように、最後の内容修正以降にファイルがいつ読み出されたかを知る 必要があるプログラムで有用である。 | |
MS_REMOUNT | |
すでに存在するマウントを再マウントする。
これにより、すでに存在するマウントの
mountflags と
data を、一度アンマウントしてから再マウントするという作業をせずに
変更できる。
source と
target は最初の
mount() 呼び出しと同じ値を指定する必要がある。
filesystemtype は無視される。
mountflags のうち MS_RDONLY, MS_SYNCHRONOUS, MS_MANDLOCK は変更可能である。 カーネル 2.6.16 より前では、 MS_NOATIME, MS_NODIRATIME も変更可能であった。 カーネル 2.4 より前では、上記に加えて、 MS_NOSUID, MS_NODEV, MS_NOEXEC も変更可能であった。 | |
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) を参照のこと。 | |
Linux 2.1.116 から、 umount2() システムコールが追加された。これは umount() と同様に target をアンマウントするが、 flags が追加されており、操作の際の振る舞いを制御できる。 | |
MNT_FORCE (2.1.116 以降) | |
使用中 (busy) でも強制的にアンマウントを実行する。 これを行うとデータを失う可能性がある。 (NFS マウント専用) | |
MNT_DETACH (2.4.11 以降) | |
遅延アンマウントを行う。マウントポイントに対する新規のアクセスは 不可能となり、実際のアンマウントはマウントポイントがビジーで なくなった時点で行う。 | |
MNT_EXPIRE (Linux 2.6.8 以降) | |
マウントポイントに期限切れの印をつける。 マウントポイントが現在使用中でない場合、このフラグをつけて umount2() を初めて呼び出すと EAGAIN エラーで失敗するが、マウントポイントには期限切れ (expire) の印がつけられる。 そのマウントポイントはいずれかのプロセスがアクセスしない限り 期限切れの印がついたままとなる。 もう一度 MNT_EXPIRE をつけて umount2() を呼び出すと、期限切れの印のついたマウントポイントが アンマウントされる。 このフラグを MNT_FORCE もしくは MNT_DETACH と同時に指定することはできない。 | |
返り値
成功した場合 0 が返る。失敗した場合 -1 が返り、 errno がエラーの内容に従って設定される。
エラー
以下に示すエラーは、ファイルシステムに依存しないものである。 それぞれのファイルシステムタイプには固有のエラーが存在する場合があり、 独自の動作をすることもある。詳しくはカーネルのソースを見て欲しい。
EACCES | パスに含まれるディレクトリに検索 (実行) 許可がない (path_resolution(7) も参照)。 または、 MS_RONLY フラグを指定せずに読み込み専用のファイルシステムを マウントしようとした。 または、ブロックデバイス source が MS_NODEV オプションでマウントされたファイルシステム上にある。 |
EAGAIN | MNT_EXPIRE を指定した umount2() の呼び出しで、正常に未使用のファイルシステムに期限切れの印を つけることができた。 |
EBUSY | source は既にマウントされている。 または、書き込み用にオープンされたファイルがあり、 読み込み専用で再マウントすることができない。 または、 target が使用中 (busy) のため、 target にマウント/アンマウントできない。 target が使用中の例としては、あるタスクが動作しているディレクトリ (working directory) であるとか、別のデバイスのマウントポイントであるとか、 オープンされたファイルが存在する、などがある。 |
EFAULT | 場所を示す引き数のひとつがユーザーのアドレス空間の外を指している。 |
EINVAL | source に不正なスーパーブロックがある。 または、 source が target にマウントされていないのに、再マウント (MS_REMOUNT) が要求された。 または、 source がマウントポイントではないか、/ なのに、移動 (MS_MOVE) が要求された。 または、 target がマウントポイントではないのにアンマウントが要求された。 または、 MNT_EXPIRE を指定した umount2() に対して MNT_DETACH か MNT_FORCE が同時に指定された。 |
ELOOP | パス名の解決中に登場したリンクが多すぎた。 または、 target が source の子孫なのに移動が要求された。 |
EMFILE | (ブロックデバイスが必要でない場合) ダミーデバイスのテーブルが一杯になった。 |
ENAMETOOLONG | |
パス名の長さが MAXPATHLEN を越えた。 | |
ENODEV | filesystemtype がカーネル中で定義 (config) されていない。 |
ENOENT | パス名が空である。もしくは指定されたパスが存在しない。 |
ENOMEM | カーネルがファイル名やデータをコピーするための空きページを確保できない。 |
ENOTBLK | |
(ブロックデバイスが必要だが) source がブロックデバイスではない。 | |
ENOTDIR | |
2 番目の引き数、もしくは 1 番目の引き数の接頭辞がディレクトリではない。 | |
ENXIO | ブロックデバイス source のメジャー番号が範囲外である。 |
EPERM | 呼び出し元に必要な権限がない。 |
準拠
この関数は Linux 固有の関数であり、移植を考慮したプログラムでは 使用すべきでない。
注意
Linux での注意
元々の umount() 関数は umount(device) の形で呼び出され、 ブロックデバイス以外を指定して呼び出すと ENOTBLK を返した。 Linux 0.98p4 で、無名デバイス (anonymous device) に対応するために umount(dir) の形での呼び出しが加えられた。 Linux 2.3.99-pre7 で、umount(device) は削除され、 umount(dir) だけが残された (一つのデバイスを複数の位置にマウント出来るようになったため、 デバイスを指定しただけでは不十分だからである)。
元の 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 ビットが 無視されるだけである。