EN JA
MOUNT(2)
MOUNT(2) FreeBSD System Calls Manual MOUNT(2)

名称

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

ライブラリ

Standard C Library (libc, -lc)

書式

#include < sys/param.h>
#include < sys/mount.h>

int
mount( const char *type, const char *dir, int flags, void *data);

int
unmount( const char *dir, int flags);

#include < 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 ファイルシステムタイプ名称 (例えば、 Ns Dq Li procfs)
  • fspath マウントポイントのパス名 (例えば、 Ns Dq Li /proc)

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

デフォルトでは、スーパユーザのみが mount() システムコールを呼び出すことができます。この制約は、 sysctl(8)vfs.usermount 変数を 0 ではない値に設定することで解除することが可能です。詳しい情報については、「バグ」セクションンを参照してください。

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

MNT_RDONLY
ファイルシステムを読み込み専用として取り扱います。スーパユーザでさえこれに書き込むことはできません。このオプションなしに MNT_UPDATE を指定すると、読み込み専用ファイルシステムが読み込み/書き込みにアップグレードされます。
MNT_NOEXEC
そのファイルシステムからファイルを実行できないようにします。
MNT_NOSUID
実行するときに、ファイルについての setuid ビットまたは setgid ビットを尊重しません。このフラグは、呼び出し側がスーパユーザでないときに、自動的に設定されます。
MNT_NOATIME
ファイルアクセス時刻の更新を行いません。
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) マニュアルページに記述されています。 UFS と UFS2 として知られているデフォルトのファイルシステムのためのマニュアルページが存在しないことに注意しなくてはなりません。

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

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

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

戻り値

Upon successful completion, the value 0 is returned; otherwise the value -1 is returned and the global variable errno is set to indicate the error.

エラー

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

歴史

mount() と unmount() 関数は、 Version 6 AT&T UNIX で登場しました。 nmount() システムコールは、 FreeBSD 5.0 ではじめて登場しました。

バグ

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

例えば、 vfs.usermount を有効にすることによって、任意のメディアを信頼されていないユーザがマウントすることを許可することは、安全であると考えるべきではありません。 FreeBSD のほとんどのファイルシステムは、悪質なデバイスに備えて安全となるように構築されませんでした。

January 26, 2010 FreeBSD