fstab
/etc/fstab ファイルはディスクパーティションや様々なブロックデバイス、リモートファイルをどうやってファイルシステムにマウントするかを記述します。
ファイルシステムは一行毎に記述されます。書かれている定義は、起動時やシステムマネージャの設定がリロードされたときに systemd の mount ユニットに動的に変換されます。デフォルトの設定はマウントを必要とするサービスが起動する前にファイルシステムの fsck とマウントを自動的に実行します。例えば、NFS や Samba などのリモートファイルシステムはネットワークが立ち上がった後に systemd によって自動的にマウントされます。そのため、/etc/fstab
に指定するローカル・リモートファイルシステムのマウントに設定は必要ありません。詳しくは man 5 systemd.mount
を見て下さい。
mount
コマンドはディレクトリやデバイスがひとつだけ指定された場合、他のパラメータの値を取得するために fstab を使います。このとき、fstab に記述されたマウントオプションも使われます。
目次
ファイル例
シンプルな /etc/fstab
はカーネルの名前記述子を使います:
/etc/fstab
# <file system> <dir> <type> <options> <dump> <pass> /dev/sda1 / ext4 defaults,noatime 0 1 /dev/sda2 none swap defaults 0 0 /dev/sda3 /home ext4 defaults,noatime 0 2
フィールドの定義
/etc/fstab
ファイルには以下のフィールドが含まれ、スペースかタブで区切ります:
<file system> <dir> <type> <options> <dump> <pass>
- <file system> - マウントされるパーティションやストレージデバイス。
- <dir> - <file system> がマウントされるマウントポイント。
- <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 の場合は、このフィールドは0にするべきです) - その他のファイルシステムには2を入れて下さい。0のファイルシステムは fsck ユーティリティによってチェックされません。
ファイルシステムの識別
/etc/fstab
でパーティションやストレージデバイスを識別する方法は3つあります: カーネルの名前記述子、ラベル、UUID です。UUID やラベルにはドライブがマシンに(物理的に)接続されている順番と切り離せるという利点があります。これは、BIOS でストレージデバイスの順番を変更したり、ストレージデバイスの配線を変えるときに有用です。また、ときどき BIOS はストレージデバイスの順番を変更してしまうことがあります。詳しくは Persistent block device naming の記事を読んで下さい。
パーティションについて基本的な情報を一覧するには、次を実行:
$ 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
を付けて下さい。
サンプルを見て下さい。
ラベル
デバイスやパーティションにラベルをつける方法は Persistent block device naming#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.*
) によって生成されます。詳しくは Persistent block device naming#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
Tips and tricks
スワップの 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 0 2
atime オプション
noatime
, nodiratime
, relatime
を使用するとドライブのパフォーマンスが改善します。Linux は読み込まれるたびに記録する(ドライブに書き込む) atime
をデフォルトで使っています。これは Linux をサーバーに使っている時は理にかなっていますが、デスクトップとして利用する場合はそれほど意味がありません。atime
オプションの最悪な点は、ページキャッシュからファイルを読み込む(ドライブではなくメモリから読み込む)ときでさえ書き込みを行ってしまうことです!noatime
オプションはファイルを読み込むたびにドライブにファイルのアクセス日時を書き込むのを完全に無効にします。これはほとんど全てのアプリケーションでうまくいきますが、そのような情報が必要な Mutt などの例外がわずかに存在します。mutt のために、relatime
オプションを使うほうがいいでしょう。relatime
オプションはファイルが変更されたときだけファイルアクセス日時の書き込みを有効にします (noatime
はアクセス日時が変更日時より古い場合でもアクセス日時を変更しません)。nodiratime
オプションはファイルアクセス日時の書き込みをディレクトリでだけ無効化し、その他のファイルではアクセス日時の書き込みが行われます。Mutt などのプログラムを動作させるために妥協として relatime
を使うのがベストだと思われます。
tmpfs
tmpfs は、メモリの使用量によって、メモリやスワップパーティション上に作られる一時ファイルシステムです。ディレクトリを tmpfs としてマウントすることでファイルのアクセス速度を上げることができ、再起動時には中身が自動で消失するようになります。
一般的に tmpfs が使われるディレクトリは /tmp, /var/lock, /var/run です。tmpfs を /var/tmp で使ってはいけません。このフォルダは再起動後も保存される一時ファイルのためにあります。Arch では tmpfs の /run
ディレクトリを使っています。また、互換性のためにシンボリックリンクとして /var/run
と /var/lock
が存在します。デフォルトの /etc/fstab
の /tmp
でも tmpfs は使われています。
デフォルトでは、tmpfs パーティションの最大容量は総 RAM の半分に設定されますが、カスタマイズすることが可能です。実際のメモリ・スワップの消費はあなたがどれだけ使うかによることに注意してください、tmpfs パーティションは実際に必要になるまではメモリを消費しません。
tmpfs を /tmp
で使うには、次の行を /etc/fstab
に追加してください:
/etc/fstab
tmpfs /tmp tmpfs nodev,nosuid 0 0
You may or may not want to specify the size here, but you should leave the mode
option alone in these cases to ensure that they have the correct permissions (1777). In the example above, /tmp
will be set to use up to half of your total RAM. To explicitly set a maximum size, use the size
mount option:
/etc/fstab
tmpfs /tmp tmpfs nodev,nosuid,size=2G 0 0
Here is a more advanced example showing how to add tmpfs mounts for users. This is useful for websites, mysql tmp files, ~/.vim/
, and more. It's important to try and get the ideal mount options for what you are trying to accomplish. The goal is to have as secure settings as possible to prevent abuse. Limiting the size, and specifying uid and gid + mode is very secure. For more information on this subject, follow the links listed in the #See also section.
/etc/fstab
tmpfs /www/cache tmpfs rw,size=1G,nr_inodes=5k,noexec,nodev,nosuid,uid=648,gid=648,mode=1700 0 0
See the mount
command man page for more information. One useful mount option in the man page is the default
option. At least understand that.
Reboot for the changes to take effect. Note that although it may be tempting to simply run mount -a
to make the changes effective immediately, this will make any files currently residing in these directories inaccessible (this is especially problematic for running programs with lockfiles, for example). However, if all of them are empty, it should be safe to run mount -a
instead of rebooting (or mount them individually).
After applying changes, you may want to verify that they took effect by looking at /proc/mounts
and using findmnt
:
$ findmnt --target /tmp
TARGET SOURCE FSTYPE OPTIONS /tmp tmpfs tmpfs rw,nosuid,nodev,relatime
使用方法
一般的に、読み書き操作を頻繁に行なって I/O に負担をかける処理やプログラムで tmpfs フォルダを使う意味があります。アプリケーションによってはデータの一部(もしくは全て)を共有メモリにオフロードすることで大きな効果を得られるかもしれません。例えば、Firefox のプロファイルを RAM に配置すること はパフォーマンスを著しく向上させます。
コンパイル時間の短縮
tmpfs フォルダをビルドディレクトリとして使って makepkg を実行できます (/etc/makepkg.conf
でも設定可能です):
$ BUILDDIR=/tmp/makepkg makepkg
FAT32 に標準ユーザーとして書き込み
FAT32 パーティションに書き込みを行うには、/etc/fstab
ファイルに修正を加える必要があります。
/etc/fstab
/dev/sdxY /mnt/some_folder vfat user,rw,umask=000 0 0
user
フラグは全てのユーザーが (つまり root でなくても) /dev/sdX
パーティションをマウント・アンマウントできることを意味しています。rw
は読み書きの許可を与えます; umask
オプションは選択した権利を削除します - 例えば umask=111
は実行権限を削除します。問題は、このエントリはディレクトリからも実行権限を削除してしまうことであり、それを dmask=000
で修正しなくてはなりません。Umask を参照。
これらのオプションがないと、全てのファイルは実行可能になります。umask や dmask オプションの代わりに showexec
オプションを使うことができ、全ての Windows の実行可能ファイル (com, exe, bat) を実行可能な色で表示します。
例えば、FAT32 パーティションが /dev/sda9
にあって、/mnt/fat32
にマウントしたい場合、次のようにします:
/etc/fstab
/dev/sda9 /mnt/fat32 vfat user,rw,umask=111,dmask=000 0 0
root パーティションの再マウント
何らかの理由で誤って root パーティションを読み込み専用でマウントしてしまった場合は、次のコマンドで root パーティションを再マウントしてください:
# mount -o remount,rw /