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/
に書かれている。