fstab
関連記事
/etc/fstab ファイルはディスクパーティションや様々なブロックデバイス、リモートファイルをどうやってファイルシステムにマウントするかを記述します。
ファイルシステムは一行毎に記述されます。書かれている定義は、起動時やシステムマネージャの設定がリロードされたときに systemd の mount ユニットに動的に変換されます。デフォルトの設定はマウントを必要とするサービスが起動する前にファイルシステムの fsck とマウントを自動的に実行します。例えば、NFS や Samba などのリモートファイルシステムはネットワークが立ち上がった後に systemd によって自動的にマウントされます。そのため、/etc/fstab
に指定するローカル・リモートファイルシステムのマウントに設定は必要ありません。詳しくは systemd.mount(5) を見て下さい。
mount
コマンドはディレクトリやデバイスがひとつだけ指定された場合、他のパラメータの値を取得するために fstab を使います。このとき、fstab に記述されたマウントオプションも使われます。
ファイル例
ファイルシステムの UUID を使用したシンプルな /etc/fstab
/etc/fstab
# <device> <dir> <type> <options> <dump> <fsck> UUID=0a3407de-014b-458b-b5c1-848e92a327a3 / ext4 noatime 0 1 UUID=f9fe0b69-a280-415d-a03a-a32752370dee none swap defaults 0 0 UUID=b411dc99-f0a0-4c87-9e05-184977be8539 /home ext4 noatime 0 2
フィールドの定義
/etc/fstab
ファイルには以下のフィールドが含まれ、スペースかタブで区切ります:
<device> <dir> <type> <options> <dump> <pass>
- <device> - マウントされるパーティションやストレージデバイス。こちらも参照 ファイルシステムの識別
- <dir> - <device> がマウントされるマウントポイント。
- <type> - マウントされるパーティションやストレージデバイスのファイルシステムタイプ。さまざまなファイルシステムがサポートされています:
ext2
,ext3
,ext4
,btrfs
,reiserfs
,xfs
,jfs
,smbfs
,iso9660
,vfat
,ntfs
,swap
,auto
。auto
タイプはどのファイルシステムタイプが使われているかマウントコマンドに推測させます。これはディスクメディア (CD/DVD) に役立ちます。 - <options> - 使用されるファイルシステムのマウントオプション。マウントオプションにはファイルシステム固有のものもあることに気をつけて下さい。最も一般的なオプションは:
auto
- 起動時、またはmount -a
コマンドが実行されたときに自動でマウントします。noauto
- 自動ではマウントしません。exec
- ファイルシステム上のバイナリの実行を許可します。noexec
- ファイルシステム上のバイナリの実行を禁止します。ro
- ファイルシステムを読み込み専用でマウント。rw
- ファイルシステムを読み書き可能でマウント。user
- 全てのユーザーにファイルシステムのマウントを許可します。上書きしないかぎり、自動でnoexec
,nosuid
,nodev
も有効になります。users
- ユーザーグループに入っている全てのユーザーにファイルシステムのマウントを許可します。nouser
- root だけにファイルシステムのマウントを許可します。owner
- デバイスの所有者にマウントを許可します。sync
- I/O は同期的に行なわれます。async
- I/O は非同期で行われます。dev
- ファイルシステム上の特別なデバイスを解釈します。nodev
- ファイルシステム上の特別なデバイスを解釈しません。suid
- suid や sgid ビットの操作を許可します。ほとんどの場合、一時的な権限で特別な作業を行うためにユーザーがバイナリ実行可能ファイルを実行できるようにするため使われます。nosuid
- suid や sgid ビットの操作を禁止します。noatime
- ファイルシステムの inode アクセス日時を更新しません。パフォーマンスの向上に役立ちます (#atime オプション を見て下さい)。nodiratime
- ファイルシステムのディレクトリの inode アクセス日時を更新しません。パフォーマンスの向上に役立ちます (#atime オプション を見て下さい)。relatime
- 変更日時にあわせて inode アクセス日時を更新します。以前のアクセス日時が現在の変更日時よりも前のときだけアクセス日時が更新されます (noatime に似ていますが、変更されたあとファイルが読み込まれたか知る必要がある mutt などのアプリケーションを破壊しません)。パフォーマンスの向上に役立ちます (#atime オプションを見て下さい)。discard
- ブロックがフリーになったときにブロックデバイスに TRIM コマンドを実行します。ファイルシステムが SSD 上にあるときは使うことが推奨されています。flush
- データを頻繁にフラッシュするvfat
のオプション。全てのデータが書き込まれるまではコピーダイアログやプログレスバーは止まったままになります。nofail
- 存在するときはデバイスをマウントし、存在しないときは無視します。起動時にリムーバブルメディアのエラーが報告されるのを防止します。defaults
- 使われるファイルシステムのデフォルトのマウントオプション。ext4
のデフォルトのオプションは:rw
,suid
,dev
,exec
,auto
,nouser
,async
。
- <dump> - バックアップを作る時を決定するために dump ユーティリティによって使われます。Dump はエントリをチェックしその値を使ってファイルシステムがバックアップされるべきかどうか決定します。指定できるエントリは0か1です。0の場合、dumpはファイルシステムを無視します; 1の場合、dump はバックアップを作成します。ほとんどのユーザーは dump をインストールしないので、<dump> エントリには0を入れて下さい。
- <pass> - ファイルシステムをチェックする順番を決めるために fsck によって使われます。指定できるエントリは
0
か1
もしくは2
です。root ファイルシステムには一番優先度の高い1
を設定してください。btrfs の場合は fsck.btrfs(8) にあるように、このフィールドを0
にするべきです。その他のファイルシステムには2を入れて下さい。0
が設定されたファイルシステムは fsck ユーティリティによってチェックされません。
ファイルシステムの識別
/etc/fstab
でパーティションやストレージデバイスを識別する方法は3つあります: カーネルの名前記述子、ファイルシステムのラベルやUUID、GPT パーティションのラベルやUUIDです。UUID や ラベルにはドライブがマシンに(物理的に)接続されている順番と切り離せるという利点があります。これは、BIOS でストレージデバイスの順番を変更したり、ストレージデバイスの配線を変えるときに有用です。また、ときどき BIOS はストレージデバイスの順番を変更してしまうことがあります。なお、UUID はカーネルの名前記述子やラベルよりも優先されます。詳しくは永続的なブロックデバイスの命名の記事を読んで下さい。
パーティションについて基本的な情報を一覧するには、次を実行:
$ lsblk -f
NAME FSTYPE LABEL UUID MOUNTPOINT sda ├─sda1 ext4 Arch_Linux 978e3e81-8048-4ae1-8a06-aa727458e8ff / ├─sda2 ntfs Windows 6C1093E61093B594 └─sda3 ext4 Storage f838b24e-3a66-4d02-86f4-a2e73e454336 /media/Storage sdb ├─sdb1 ntfs Games 9E68F00568EFD9D3 └─sdb2 ext4 Backup 14d50a6c-e083-42f2-b9c4-bc8bae38d274 /media/Backup sdc └─sdc1 vfat Camera 47FA-4071 /media/Camera
カーネルの名前記述子
lsblk -f
を実行してパーティションを一覧し、前に /dev
を付けて下さい。
サンプルを見て下さい。
ラベル
デバイスやパーティションにラベルをつける方法は 永続的なブロックデバイスの命名#by-label を見て下さい。root パーティションのリネームは "ライブ" Linux ディストリビューション (Parted Magic, Ubuntu, etc) から行なって下さい。root パーティションは初めにアンマウントする必要があるからです。
lsblk -f
を実行してパーティションを一覧し、前に LABEL=
を付けて下さい:
/etc/fstab
# <file system> <dir> <type> <options> <dump> <pass> LABEL=Arch_Linux / ext4 defaults,noatime 0 1 LABEL=Arch_Swap none swap defaults 0 0
UUID
全てのパーティションとデバイスは固有の UUID を持っています。UUID はパーティションを作成したりフォーマットするときにファイルシステムユーティリティ (例: mkfs.*
) によって生成されます。詳しくは 永続的なブロックデバイスの命名#by-uuid を見て下さい。
lsblk -f
を実行してパーティションを一覧し、前に UUID=
を付けて下さい:
/etc/fstab
# <file system> <dir> <type> <options> <dump> <pass> UUID=24f28fc6-717e-4bcd-a5f7-32b959024e26 / ext4 defaults,noatime 0 1 UUID=03ec5dd3-45c0-4f95-a363-61ff321a09ff /home ext4 defaults,noatime 0 2 UUID=4209c845-f495-4c43-8a03-5363dd433153 none swap defaults 0 0
GPT ラベル
blkid
を実行してパーティションを確認し、PARTLABEL の値を使って下さい (クォートは要りません):
/etc/fstab
# <file system> <dir> <type> <options> <dump> <pass> PARTLABEL=EFI\040SYSTEM\040PARTITION /boot vfat rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=iso8859-1,shortname=mixed,errors=remount-ro 0 2 PARTLABEL=GNU/LINUX / ext4 rw,relatime,data=ordered 0 1 PARTLABEL=HOME /home ext4 rw,relatime,data=ordered 0 2 PARTLABEL=SWAP none swap defaults 0 0
GPT UUID
blkid
を実行してパーティションを確認し、PARTUUID の値を使って下さい (クォートは要りません):
/etc/fstab
# <file system> <dir> <type> <options> <dump> <pass> PARTUUID=d0d0d110-0a71-4ed6-936a-304969ea36af /boot vfat rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=iso8859-1,shortname=mixed,errors=remount-ro 0 2 PARTUUID=98a81274-10f7-40db-872a-03df048df366 / ext4 rw,relatime,data=ordered 0 1 PARTUUID=7280201c-fc5d-40f2-a9b2-466611d3d49e /home ext4 rw,relatime,data=ordered 0 2 PARTUUID=039b6c1c-7553-4455-9537-1befbc9fbc5b none swap defaults 0 0
ヒントとテクニック
systemd による自動マウント
詳細は systemd.automount(5) にあります。
ローカルパーティション
巨大な /home
パーティションが存在する場合、fsck によって /home
がチェックされている間に、/home
を使わないサービスを起動できるようにすると良いかもしれません。/home
パーティションの /etc/fstab
エントリに以下のオプションを追加することでそのように設定できます:
noauto,x-systemd.automount
/home
に最初にアクセスしたときに fsck とマウントを行うようになり、パーティションの準備が出来るまでカーネルが /home
へのファイルアクセスを全てバッファします。
リモートファイルシステム
同じ設定はリモートファイルシステムのマウントにも適用できます。アクセスしたときにだけリモートファイルシステムをマウントしたい場合、noauto,x-systemd.automount
パラメータを使って下さい。さらに、x-systemd.device-timeout=
オプションを使うことでネットワークに接続できないときのタイムアウトを指定できます。また、_netdev
オプションで systemd がネットワークに依存するマウントであることを認識してネットワークがオンラインになった後に順番を入れ替えます。
noauto,x-systemd.automount,x-systemd.device-timeout=30,_netdev
暗号化ファイルシステム
キーファイルによって暗号化したファイルシステムがある場合も、noauto
パラメータを /etc/crypttab
の適当なエントリに追加することができます。設定することで systemd は起動時に暗号化デバイスを開かないようになり、実際にアクセスされたときになってから指定したキーファイルを使ってファイルシステムを開いてマウントします。デバイスが利用可能になるのを systemd が待機しないようになるので、暗号化 RAID デバイスなどを使っている場合、起動時間が数秒間短くなるかもしれません。例:
/etc/crypttab
data /dev/md0 /root/key noauto
自動マウント解除
x-systemd.idle-timeout
フラグを使うことで一定時間アイドル状態のときにタイムアウトするのを指定できます。例:
noauto,x-systemd.automount,x-systemd.idle-timeout=1min
上記の設定の場合、1分間操作がないと systemd によってアンマウントされます。
スワップの UUID
スワップパーティションが UUID を持っていない場合、手動で追加することが可能です。これは lsblk -f
コマンドでスワップの UUID が表示されないときに発生します。スワップに UUID を指定する手順は以下になります:
スワップパーティションを確認:
# swapon -s
スワップを無効化:
# swapoff /dev/sda7
新しく UUID を指定してスワップを再作成:
# mkswap -U random /dev/sda7
スワップを有効化:
# swapon /dev/sda7
ファイルパスのスペース(空白)
マウントポイントにスペース(空白)が含まれている場合、エスケープ文字 \
と3文字の8進数コード 040
を使ってスペースの代わりにしてください:
/etc/fstab
UUID=47FA-4071 /home/username/Camera\040Pictures vfat defaults,noatime 0 0 /dev/sda7 /media/100\040GB\040(Storage) ext4 defaults,noatime,user 0 2
外部デバイス
存在するときに外部デバイスをマウントして、無い時は無視するには nofail
オプションが必要です。このオプションは起動時にエラーが報告されるのを防止します。
/etc/fstab
/dev/sdg1 /media/backup jfs defaults,nofail,x-systemd.device-timeout=1 0 2
systemd 219 から、nofail
オプションを使う時は x-systemd.device-timeout
オプションも使用することが推奨されます。デフォルトのデバイスタイムアウトが90秒になったため、nofail
しか指定しない場合、外部デバイスを切断したときに起動が90秒伸びることになるからです。上記のようにタイムアウトを再設定して上げて下さい。タイムアウトを0に設定してはいけません。永遠にタイムアウトしなくなります。
また、外部デバイスを扱うのに他の systemd ユニットをロードする必要がある場合 (例えばネットワークで共有する場合など)、x-systemd.requires=x
と x-systemd.automount
を組み合わせて使うことで、ユニットが起動してから自動マウントさせることができます。例:
/etc/fstab
/host/share /net/share cifs noauto,nofail,x-systemd.automount,x-systemd.requires=network-online.target,x-systemd.device-timeout=10,workgroup=workgroup,credentials=/foo/credentials 0 0
また、NetworkManager-wait-online や systemd-networkd-wait-online を有効化する方法もあります。
atime オプション
noatime
, nodiratime
, relatime
を使用するとドライブのパフォーマンスが改善します。Linux は読み込まれるたびに記録する(ドライブに書き込む) atime
をデフォルトで使っています。これは Linux をサーバーに使っている時は理にかなっていますが、デスクトップとして利用する場合はそれほど意味がありません。atime
オプションの最悪な点は、ページキャッシュからファイルを読み込む(ドライブではなくメモリから読み込む)ときでさえ書き込みを行ってしまうことです!noatime
オプションはファイルを読み込むたびにドライブにファイルのアクセス日時を書き込むのを完全に無効にします。これはほとんど全てのアプリケーションでうまくいきますが、そのような情報が必要な Mutt などの例外がわずかに存在します。mutt のために、relatime
オプションを使うほうがいいでしょう。relatime
オプションはファイルが変更されたときだけファイルアクセス日時の書き込みを有効にします (noatime
はアクセス日時が変更日時より古い場合でもアクセス日時を変更しません)。nodiratime
オプションはファイルアクセス日時の書き込みをディレクトリでだけ無効化し、その他のファイルではアクセス日時の書き込みが行われます。Mutt などのプログラムを動作させるために妥協として relatime
を使うのがベストだと思われます。
逆に strictatime
オプションはファイルにアクセスするたびにアクセス日時を更新します。サーバーとして Linux を使っている場合には意味がありますが、デスクトップ用途ではあまり有意義ではありません。strictatime
オプションの欠点として、たとえ (ドライブではなくメモリから読み込む) ページキャッシュからファイルを読み込んだ場合でも、ディスクに書き込みが発生してしまいます。
カーネル 4.0 から lazytime
という新しいオプションが追加されました。lazytime
は inode タイムスタンプ (アクセス・変更・作成日時) の変更をメモリ上に保存することでディスクへの書き込みを減らします。ディスク上のタイムスタンプが更新されるのは次の場合に限られます。(1) ファイルのタイムスタンプとは関係ない変更によってファイルの inode を更新する必要があるとき。(2) ディスクへの同期が発生したとき。(3) 削除されていない inode がメモリから追い出されたとき。(4) メモリ上のコピーがディスクに最後に書き込まれてから24時間以上経ったとき。
lazytime
オプションは前述の *atime
オプションと一緒に使うことが可能です。
FAT32 に標準ユーザーとして書き込み
FAT#FAT32 に標準ユーザーとして書き込みを参照してください。
root パーティションの再マウント
何らかの理由で誤って root パーティションを読み込み専用でマウントしてしまった場合は、次のコマンドで root パーティションを再マウントしてください:
# mount -o remount,rw /
バインドマウント
権限がないために特定のディレクトリにプログラムやユーザーがアクセスできない場合、プログラムがアクセスできる場所にディレクトリをバインドマウントすることでアクセスさせることができます。プログラムがあるディレクトリ bar にはアクセスできるがディレクトリ foo にはアクセスできないとき、/etc/fstab
にエントリを追加することで特にパーミッションを弄らないでもアクセス権限を与えられます:
/etc/fstab
/<path to foo> /<path to bar> none bind 0 0