fstab

提供: ArchWiki
2022年9月13日 (火) 18:15時点におけるAshMyzk (トーク | 投稿記録)による版 (→‎ファイルシステムの識別: 同期)
ナビゲーションに移動 検索に移動

関連記事

fstab(5) ファイルは、ディスクパーティションや様々なブロックデバイス、リモートファイルシステムをどうやってファイルシステムにマウントするかを記述します。

ファイルシステムは一行毎に記述されます。書かれている定義は、起動時やシステムマネージャの設定がリロードされたときに systemd の mount ユニットに動的に変換されます。デフォルトの設定では、マウントを必要とするサービスが起動する前にファイルシステムの fsck とマウントを自動的に実行します。例えば、NFSSamba などのリモートファイルシステムはネットワークが立ち上がった後に 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
  • <device> には、マウントされるべきブロック特殊デバイスやリモートファイルシステムを記述します。#ファイルシステムの識別 を見てください。
  • <dir> には、マウントディレクトリを記述します。
  • <type> ファイルシステムの種類。
  • <options> 関連するマウントオプション。mount(8) § FILESYSTEM-INDEPENDENT_MOUNT_OPTIONSext4(5) § MOUNT_OPTIONS を見てください。
  • <dump>dump(8) ユーティリティによってチェックされます。このフィールドは通常 0 にセットします。0 はチェックを無効化します。
  • <fsck> は、起動時にチェックするファイルシステムの順番を設定します。fsck(8) を見てください。ルートファイルシステムには 1 を設定するべきです。他のパーティションには 2 を設定するか、チェックを無効化する 0 を設定するべきです。
ヒント:
  • タイプ auto は、使用されているファイルシステムの種類をマウントコマンドに推測させます。このオプションは、光学メディア (CD/DVD/Blu-ray) の場合に便利です。
  • ルートファイルシステムが btrfsXFS の場合、fsck の順番は 1 ではなく 0 に設定するべきです。fsck.btrfs(8)fsck.xfs(8) を見てください。

スタートアップ時や、noauto オプションが指定されていないデバイスに対して mount(8) コマンドを -a フラグ付きで実行した時に、/etc/fstab 内で指定されたすべてのデバイスは自動的にマウントされます。リストにあるが存在しないデバイスは、nofail オプションが使用されている場合を除き、エラーとなります。

詳細は fstab(5) § DESCRIPTION を見てください。

ファイルシステムの識別

/etc/fstab でファイルシステムを識別する方法がいくつか存在します: カーネルの名前記述子、ファイルシステムのラベルや UUID、GPT パーティションのラベルや UUID です。カーネルの名前記述子は使用すべきではありません。ラベルよりも UUID や PARTUUID を優先して使用すべきです。詳細は 永続的なブロックデバイスの命名 を見てください。この記事を読み進める前に、その記事を先に読むことをおすすめします。

このセクションでは、ファイルシステムをマウントするいくつかの方法を例を通して説明します。以下の例で使用されるコマンド lsblk -fblkid の出力は、永続的なブロックデバイスの命名 で見られます。

カーネルの名前記述子を使うには、fstab の最初の列で /dev/sdxy を使ってください。

カーネルの名前記述子

lsblk -f を実行してパーティションの一覧を出力し、NAME 列の値の前に /dev/ を付け加えてください。

/etc/fstab
# <device>        <dir>        <type>        <options>        <dump> <fsck>
/dev/sda1         /boot        vfat          defaults         0      2
/dev/sda2         /            ext4          defaults         0      1
/dev/sda3         /home        ext4          defaults         0      2
/dev/sda4         none         swap          defaults         0      0
警告: カーネルの名前記述子は永続的ではなく、起動するたびに変化する可能性があります。なので、これを設定ファイルで使用すべきではありません。

ファイルシステムラベル

lsblk -f を実行してパーティションの一覧を出力し、LABEL 列の値の前に LABEL= を付け加えてください。あるいは、blkid を実行し、LABEL の値を引用符無しで使ってください:

/etc/fstab
# <device>        <dir>        <type>        <options>        <dump> <fsck>
LABEL=ESP         /boot        vfat          defaults         0      2
LABEL=System      /            ext4          defaults         0      1
LABEL=Data        /home        ext4          defaults         0      2
LABEL=Swap        none         swap          defaults         0      0
ノート: 任意のフィールドにスペースが含まれる場合、#ファイルパスのスペース を見てください。

ファイルシステム UUID

lsblk -f を実行してパーティションの一覧を出力し、UUID 列の値の前に UUID= を付け加えてください。あるいは、blkid を実行し、UUID の値を引用符無しで使ってください:

/etc/fstab
# <device>                                <dir> <type> <options> <dump> <fsck>
UUID=CBB6-24F2                            /boot vfat   defaults  0      2
UUID=0a3407de-014b-458b-b5c1-848e92a327a3 /     ext4   defaults  0      1
UUID=b411dc99-f0a0-4c87-9e05-184977be8539 /home ext4   defaults  0      2
UUID=f9fe0b69-a280-415d-a03a-a32752370dee none  swap   defaults  0      0

GPT パーティションラベル

blkid を実行してパーティションの一覧を出力し、PARTLABEL の値を引用符無しで使ってください:

/etc/fstab
# <device>                           <dir> <type> <options> <dump> <fsck>
PARTLABEL=EFI\040system\040partition /boot vfat   defaults  0      2
PARTLABEL=GNU/Linux                  /     ext4   defaults  0      1
PARTLABEL=Home                       /home ext4   defaults  0      2
PARTLABEL=Swap                       none  swap   defaults  0      0
ノート: 任意のフィールドにスペースが含まれる場合、#ファイルパスのスペース を見てください。

GPT パーティション UUID

blkid を実行してパーティションの一覧を出力し、PARTUUID の値を引用符無しで使ってください:

/etc/fstab
# <device>                                    <dir> <type> <options> <dump> <fsck>
PARTUUID=d0d0d110-0a71-4ed6-936a-304969ea36af /boot vfat   defaults  0      2
PARTUUID=98a81274-10f7-40db-872a-03df048df366 /     ext4   defaults  0      1
PARTUUID=7280201c-fc5d-40f2-a9b2-466611d3d49e /home ext4   defaults  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 へのファイルアクセスを全てバッファします。

ノート: この設定を使うと /home ファイルシステムのタイプが autofs になり、デフォルトで mlocate から無視されるようになります。/home の自動マウントによる高速化はせいぜい1〜2秒がいいとこなので、環境によっては、この設定はあまり意味がないかもしれません。

リモートファイルシステム

同じ設定はリモートファイルシステムのマウントにも適用できます。アクセスしたときにだけリモートファイルシステムをマウントしたい場合、noauto,x-systemd.automount パラメータを使って下さい。さらに、x-systemd.device-timeout= オプションを使うことでネットワークに接続できないときのタイムアウトを指定できます。また、_netdev オプションで systemd がネットワークに依存するマウントであることを認識してネットワークがオンラインになった後に順番を入れ替えます。

noauto,x-systemd.automount,x-systemd.device-timeout=30,_netdev
ノート: automount と一緒に exec フラグを使う場合、user フラグを削除するようにしてください。詳しくは Fedora Bug Report を参照。

暗号化ファイルシステム

キーファイルによって暗号化したファイルシステムがある場合も、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=xx-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-onlinesystemd-networkd-wait-online を有効化する方法もあります。

atime オプション

noatime, nodiratime, relatime を使用するとドライブのパフォーマンスが改善します。Linux は読み込まれるたびに記録する(ドライブに書き込む) atime をデフォルトで使っています。これは Linux をサーバーに使っている時は理にかなっていますが、デスクトップとして利用する場合はそれほど意味がありません。atime オプションの最悪な点は、ページキャッシュからファイルを読み込む(ドライブではなくメモリから読み込む)ときでさえ書き込みを行ってしまうことです!noatime オプションはファイルを読み込むたびにドライブにファイルのアクセス日時を書き込むのを完全に無効にします。これはほとんど全てのアプリケーションでうまくいきますが、そのような情報が必要な Mutt などの例外がわずかに存在します。mutt のために、relatime オプションを使うほうがいいでしょう。relatime オプションはファイルが変更されたときだけファイルアクセス日時の書き込みを有効にします (noatime はアクセス日時が変更日時より古い場合でもアクセス日時を変更しません)。nodiratime オプションはファイルアクセス日時の書き込みをディレクトリでだけ無効化し、その他のファイルではアクセス日時の書き込みが行われます。Mutt などのプログラムを動作させるために妥協として relatime を使うのがベストだと思われます。

逆に strictatime オプションはファイルにアクセスするたびにアクセス日時を更新します。サーバーとして Linux を使っている場合には意味がありますが、デスクトップ用途ではあまり有意義ではありません。strictatime オプションの欠点として、たとえ (ドライブではなくメモリから読み込む) ページキャッシュからファイルを読み込んだ場合でも、ディスクに書き込みが発生してしまいます。

ノート: noatimenodiratime を含んでいます。両方を指定する必要はありません。[1]

カーネル 4.0 から lazytime という新しいオプションが追加されました。lazytime は inode タイムスタンプ (アクセス・変更・作成日時) の変更をメモリ上に保存することでディスクへの書き込みを減らします。ディスク上のタイムスタンプが更新されるのは次の場合に限られます。(1) ファイルのタイムスタンプとは関係ない変更によってファイルの inode を更新する必要があるとき。(2) ディスクへの同期が発生したとき。(3) 削除されていない inode がメモリから追い出されたとき。(4) メモリ上のコピーがディスクに最後に書き込まれてから24時間以上経ったとき。

警告: システムがクラッシュした場合、ディスク上のアクセス時間や最終変更日時は最大で24時間ずれる可能性があります。

lazytime オプションは前述の *atime オプションと一緒に使うことが可能です。

FAT32 に標準ユーザーとして書き込み

FAT#FAT32 に標準ユーザーとして書き込みを参照してください。

root パーティションの再マウント

何らかの理由で誤って root パーティションを読み込み専用でマウントしてしまった場合は、次のコマンドで root パーティションを再マウントしてください:

# mount -o remount,rw /

バインドマウント

ノート: ディレクトリを別の場所にバインドしていることはプログラムからはわからないため、rm -r * のようなコマンドを実行してしまうと元の場所のファイルも消去されてしまいます。そのため、通常はソフトリンクを使うことが推奨されます。Btrfs 上のディレクトリにアクセスする必要がありソフトリンクは使えない場合、サブボリューム機能でマウントオプションのようにケーパビリティを拡張できます。

権限がないために特定のディレクトリにプログラムやユーザーがアクセスできない場合、プログラムがアクセスできる場所にディレクトリをバインドマウントすることでアクセスさせることができます。プログラムがあるディレクトリ bar にはアクセスできるがディレクトリ foo にはアクセスできないとき、/etc/fstab にエントリを追加することで特にパーミッションを弄らないでもアクセス権限を与えられます:

/etc/fstab
/<path to foo>         /<path to bar>     none     bind     0 0

参照