MOUNT(2)

名称
mount, nmount, unmount - ファイルシステムをマウントまたはマウント解除する

ライブラリ
libc

書式
<sys/param.h> <sys/mount.h> int mount(const char *type, const char *dir, int flags, void *data) int unmount(const char *dir, int flags) <sys/uio.h> int nmount(struct iovec *iov, u_int niov, int flags)

解説
mount() システムコールは、ファイルシステムオブジェクトをシステムファイルツリーの マウントポイント dir に付けます。 引数 data はマウントされるファイルシステムオブジェクトを記述します。 引数 type は data をどのように解釈するかをカーネルに通知します (後述の type を参照)。 ファイルシステムの内容は、新しいマウントポイント dir を通して利用できるようになります。 マウントが成功すると dir にあるすべてのファイルが覆い隠された状態になり、 ファイルシステムがマウント解除されるまで利用できなくなります。

nmount() システムコールは、マウントオプション (ファイルシステムタイプ名称、 マウントされるデバイス、マウントポイントなど) が、 niov 個の要素を持つ iov 配列によって名前と値の組の配列として渡されることを除いては、 mount() と同様に動作します。 以下のオプションは全てのファイルシステムで要求されます:
fstype | ファイルシステムタイプ名称 (例えば “procfs”)
fspath | マウントポイントのパス名 (例えば “/proc”)

ファイルシステムタイプに依存して、その他のオプションが認識あるいは要求 されます。 例えば、殆どのディスクベースのファイルシステムは、上記のオプションに加えて スペシャルデバイスのパス名を格納する “from” オプションを要求します。

デフォルトではスーパユーザのみが mount() システムコールを呼び出すことができます。 この制約は sysctl(8) の vfs.usermount 変数を 0 ではない値に設定することで解除することが可能です。

次の flags は、ファイルシステムアクセスに影響のあるデフォルト値を抑制するように 指定できます。

MNT_RDONLY
    ファイルシステムを読取り専用として取り扱います。 スーパユーザでさえこれに書き込むことはできません。 このオプションなしに MNT_UPDATE を指定すると、 読取り専用ファイルシステムが読取り / 書込みにアップグレードされます。

MNT_NOEXEC
    そのファイルシステムからファイルを実行できないようにします。

MNT_NOSUID
    実行するときに、ファイルについての setuid ビットまたは setgid ビットを 尊重しません。 このフラグは、呼び出し側がスーパユーザでないときに、自動的に設定されます。

MNT_NOATIME
    ファイルアクセス時刻の更新を行いません。

MNT_NODEV
    ファイルシステム上の特殊ファイルを解釈しません。 このフラグは、呼び出し側がスーパユーザでないときに、自動的に設定されます。

MNT_SNAPSHOT
    ファイルシステムのスナップショットを作成します。 これは現状では UFS2 ファイルシステムのみをサポートします。 詳細については mksnap_ffs(8) を参照して下さい。

MNT_SUIDDIR
    SUID ビットが設定されたディレクトリは、新しいファイルの所有者を ディレクトリと同じに設定します。 このフラグに効果を持たせるためには、カーネルが SUIDDIR オプションを 付けてコンパイルされていることが必要です。 より多くの情報のため mount(8) および chmod(2) のマニュアルページを参照してください。

MNT_SYNCHRONOUS
    ファイルシステムへの入出力はすべて同期的に行われます。

MNT_ASYNC
    ファイルシステムへの入出力はすべて非同期的に行われます。

MNT_FORCE
    ファイルシステムがクリーンでないように見えても、読み書き可でマウントを 強行します。 危険です。 MNT_UPDATE および MNT_RDONLY と一緒に指定することで、たとえ幾つかのファイルが書込みのためにオープンされて いたとしても、ファイルシステムは強制的に読込み専用にダウングレードされます。

MNT_NOCLUSTERR
    クラスタ読取りを無効にします。

MNT_NOCLUSTERW
    クラスタ書込みを無効にします。

フラグ MNT_UPDATE は、マウントコマンドがすでにマウントされたファイルシステムに 適用されていることを示します。 これによって、ファイルシステムをマウント解除および再マウントする必要なしに、 マウントフラグを変更できます。 ファイルシステムによっては、すべてのフラグの変更を許容しない場合もあります。 たとえば多くのファイルシステムが、 読み書き可から読取り専用への変更を許容しません。

vfs サブシステムは、フラグ MNT_RELOAD によってすでにマウントされているファイルシステムに 関係するデータ構造体を更新します。

type 引数でファイルシステムを指定します。 システム上で既知なファイルシステムのタイプは lsvfs(1) で得ることができます。

data 引数は、マウントするタイプに固有の引数が入った構造体を指すポインタです。 これらの引数構造体についての形式は各ファイルシステムに ついてのマニュアルページに記載されています。 慣習によりファイルシステムのマニュアルページは、 lsvfs(1) によって返されたファイルシステム名に ``mount_'' の接頭辞を付けて 命名されます。 それゆえ、 NFS ファイルシステムは mount_nfs(8) マニュアルページに記述されています。

unmount() システムコールは、ファイルシステムを指定のマウントポイント dir から対応付け解除します。

flags 引数が MNT_FORCE を含むことで、ファイルがアクティブであっても、 ファイルシステムが強制的にマウント解除される必要があることを示します。 アクティブな特殊デバイスは機能し続けますが、 他のアクティブなファイルへのそれ以降のアクセスは、 たとえファイルシステムが後に再マウントされたとしてもエラーを引き起こします。

MNT_BYFSID フラグが指定されている場合には、 dir は “FSID:val0:val1” としてエンコードされたファイルシステム ID に置き換えられるべきです。 ここで val0 および val1 は fsid_t val[] 配列の内容の 10 進数表現です。 明示されたファイルシステム ID を持っているファイルシステムは、 マウント解除されます。

戻り値

エラー
mount() および nmount() システムコールは、次のうちの 1 つでも起きたときには処理を失敗します:

[EPERM]
    呼び出し側がスーパユーザでも dir の所有者でもありません。

[ENAMETOOLONG]
    パス名の構成要素が 255 文字を越えているか、 またはパス名全体が 1023 文字を越えています。

[ELOOP]
    パス名を変換するときに検出されたシンボリックリンクが多すぎます。

[ENOENT]
    dir の構成要素が存在しません。

[ENOTDIR]
    name の構成要素がディレクトリでないか、または special のパスの構成要素中にディレクトリ以外のものが含まれています。

[EBUSY]
    別のプロセスが現時点で dir 引数への参照を保持しています。

[EFAULT]
    dir はプロセスに割り当てられたアドレス空間の範囲外を指しています。

次のエラーは、 ufs ファイルシステムのマウントについて発生する可能性があります。

[ENODEV]
    ufs_args の構成要素 fspec が存在しません。

[ENOTBLK]
    fspec 引数はブロックデバイスではありません。

[ENXIO]
    fspec のメジャーデバイス番号が範囲外です (これはハードウェアに 対応するデバイスドライバが存在しないことを示します)。

[EBUSY]
    fspec は既にマウントされています。

[EMFILE]
    マウントテーブル空間が枯渇しました。

[EINVAL]
    ファイルシステムのスーパブロックに 不都合なマジック番号または範囲外のブロックサイズがありました。

[ENOMEM]
    ファイルシステムについてのシリンダグループ情報を読み取るのに十分な メモリがありませんでした。

[EIO]
    スーパブロックまたはシリンダグループの情報を読み取る間に 入出力エラーが発生しました。

[EFAULT]
    fspec がプロセスに割り当てられたアドレス空間の範囲外を指しています。

次のエラーは nfs ファイルシステムマウントについて起きる可能性があります:

[ETIMEDOUT]
    nfs がサーバと接触しようとして時間切れになりました。

[EFAULT]
    nfs_args によって記述された情報の一部が、 プロセスに割り当てられたアドレス空間の範囲外を指しています

unmount() システムコールは、次のエラーの 1 つでも起きたときには処理を失敗します:

[EPERM]
    呼び出し側がスーパユーザでも該当する mount() の呼び出しを実行したユーザでもありません。

[ENAMETOOLONG]
    パス名の長さが 1023 文字を越えていました。

[EINVAL]
    指定されたディレクトリがマウントテーブル内にありません。

[ENOENT]
    MNT_BYFSID を使用して指定されたファイルシステム ID がマウントテーブルの中に 見つかりませんでした。

[EINVAL]
    MNT_BYFSID を使用して指定されたファイルシステム ID がデコードされることが できませんでした。

[EINVAL]
    指定されたファイルシステムがルートファイルシステムではありません。

[EBUSY]
    プロセスがファイルシステム上にあるファイルへの参照を保持しています。

[EIO]
    キャッシュされたファイルシステム情報を書き込んでいる間に 入出力エラーが起きました。

[EFAULT]
    dir 引数がプロセスに割り当てられたアドレス空間の範囲外を指しています。

ufs マウントは、最大数のファイルシステムが現時点でマウントされている場合にも 処理を失敗します。

関連項目
lsvfs(1), mksnap_ffs(8), mount(8), umount(8)

バグ
エラーコードには、明瞭なメッセージにするために変更が必要なものがあります。

歴史
mount() 関数と unmount() 関数は AT&T UNIX で登場しました。