「Fstab」の版間の差分
(→ヒントとテクニック: genfstab を使用して fstab を自動的に生成するを翻訳して追加) |
(関連記事のリンクを追加) |
||
14行目: | 14行目: | ||
{{Related|tmpfs}} |
{{Related|tmpfs}} |
||
{{Related|スワップ}} |
{{Related|スワップ}} |
||
+ | {{Related|genfstab}} |
||
{{Related articles end}} |
{{Related articles end}} |
||
2023年11月24日 (金) 06:42時点における版
fstab(5) ファイルは、ディスクパーティションや様々なブロックデバイス、リモートファイルシステムをどうやってファイルシステムにマウントするかを記述します。
ファイルシステムは一行毎に記述されます。書かれている定義は、起動時やシステムマネージャの設定がリロードされたときに 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 defaults 0 1 UUID=f9fe0b69-a280-415d-a03a-a32752370dee none swap defaults 0 0 UUID=b411dc99-f0a0-4c87-9e05-184977be8539 /home ext4 defaults 0 2
<device>
には、マウントされるべきブロック特殊デバイスやリモートファイルシステムを記述します。#ファイルシステムの識別 を見てください。<dir>
には、マウントディレクトリを記述します。<type>
ファイルシステムの種類。<options>
関連するマウントオプション。mount(8) § FILESYSTEM-INDEPENDENT_MOUNT_OPTIONS と ext4(5) § MOUNT_OPTIONS を見てください。<dump>
は dump(8) ユーティリティによってチェックされます。このフィールドは通常0
にセットします。0
はチェックを無効化します。<fsck>
は、起動時にチェックするファイルシステムの順番を設定します。fsck(8) を見てください。ルートファイルシステムには1
を設定するべきです。他のパーティションには2
を設定するか、チェックを無効化する0
を設定するべきです。
スタートアップ時や、noauto
オプションが指定されていないデバイスに対して mount(8) コマンドを -a
フラグ付きで実行した時に、/etc/fstab
内で指定されたすべてのデバイスは自動的にマウントされます。リストにあるが存在しないデバイスは、nofail
オプションが使用されている場合を除き、エラーとなります。
詳細は fstab(5) § DESCRIPTION を見てください。
ファイルシステムの識別
/etc/fstab
でファイルシステムを識別する方法がいくつか存在します: カーネルの名前記述子、ファイルシステムのラベルや UUID、GPT パーティションのラベルや UUID です。カーネルの名前記述子は使用すべきではありません。ラベルよりも UUID や PARTUUID を優先して使用すべきです。詳細は 永続的なブロックデバイスの命名 を見てください。この記事を読み進める前に、その記事を先に読むことをおすすめします。
このセクションでは、ファイルシステムをマウントするいくつかの方法を例を通して説明します。以下の例で使用されるコマンド lsblk -f
と blkid
の出力は、永続的なブロックデバイスの命名 で見られます。
カーネルの名前記述子を使うには、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 のすべてのマウントオプションは systemd.mount(5) を見てください。
ローカルパーティション
巨大なパーティションが存在する場合、fsck によってそのパーティションがチェックされている間に、そのパーティションに依存しないサービスを起動できるようにすると効率が良くなるかもしれません。パーティションの /etc/fstab
エントリに以下のオプションを追加することでそのように設定できます:
noauto,x-systemd.automount
そのパーティションに最初にアクセスしたときに fsck とマウントを行うようになり、パーティションの準備が出来るまでカーネルがそのパーティションへのファイルアクセスを全てバッファします。
この方法は、巨大な /home
パーティションがある場合などに適用できます。
リモートファイルシステム
同じ設定はリモートファイルシステムのマウントにも適用できます。アクセスしたときにだけリモートファイルシステムをマウントしたい場合、noauto,x-systemd.automount
パラメータを使って下さい。さらに、x-systemd.mount-timeout=
オプションを使うことで、マウントコマンドが完了するまでの制限時間を指定できます。また、_netdev
オプションで systemd がネットワークに依存するマウントであることを認識してネットワークがオンラインになった後に順番を入れ替えます。
noauto,x-systemd.automount,x-systemd.mount-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 によってアンマウントされます。
外部デバイス
外部デバイスが存在する時はマウントし、存在しない場合は無視したい場合、nofail
オプションが必要です。これにより、起動時にエラーが発生するのを防ぐことができます。例えば:
/etc/fstab
/dev/sdg1 /media/backup jfs nofail,x-systemd.device-timeout=5ms 0 2
nofail
オプションは x-systemd.device-timeout
オプションと組み合わせて使うのが最も効果的です。デフォルトのデバイスタイムアウトは 90 秒であるのが理由で、タイムアウトを再設定しなかった場合、nofail
だけが指定されている切断済みの外部デバイスのせいで起動時間が 90 秒長くなってしまいます。タイムアウトを 0 にはしないでください。0 は無限に待つことになります。
ファイルパスのスペース
fstab
ではスペースがフィールドの区切り文字として使用されているため、フィールド (PARTLABEL、LABEL、マウントポイント) にスペースが含まれている場合、これらのスペースをエスケープ文字 \
と3桁の8進数 040
に置き換えなければなりません:
/etc/fstab
UUID=47FA-4071 /home/username/Camera\040Pictures vfat defaults 0 0 /dev/sda7 /media/100\040GB\040(Storage) ext4 defaults,user 0 2
atime オプション
以下の atime オプションはドライブのパフォーマンスに影響を与える可能性があります。
strictatime
オプションは、ファイルにアクセスするたびにアクセス日時を更新します。サーバーとして Linux を使っている場合には意味がありますが、デスクトップ用途ではあまり有意義ではありません。strictatime
オプションの欠点として、たとえ (ドライブではなくメモリから読み込む) ページキャッシュからファイルを読み込んだ場合でも、ディスクに書き込みが発生してしまいます。noatime
オプションは、ファイルを読み込むたびにドライブにファイルのアクセス日時を書き込むのを完全に無効化します。このオプションは、ファイルが最後に変更されてから読まれたかどうかを確認する必要のあるアプリケーションを除いて、ほとんどのアプリケーションでうまく機能します。このオプションを有効にしても、書き込み日時の情報は継続して更新され続けます。nodiratime
オプションはファイルアクセス日時の書き込みをディレクトリでだけ無効化し、その他のファイルではアクセス日時の書き込みが行われます。relatime
は、前回のアクセス日時が現在の変更日時よりも古い場合にのみ、アクセス日時を更新します。加えて、Linux 2.6.30 以降、前回のアクセス日時が 24 時間より古い場合は、アクセス日時は常に更新されます。defaults
オプション (カーネルのデフォルト、つまりrelatime
を使うことを意味します。mount(8) と wikipedia:Stat (system call)#Criticism of atime を参照) やatime
オプションが指定された場合、または何のオプションも指定されなかった場合、このオプションが使用されます。
最後にファイルが変更されてからファイルが読み込まれたかどうかを知る必要のあるアプリケーション (Mutt など) を使う場合、noatime
オプションを使用するべきではありません。relatime
オプションは許容範囲内で、パフォーマンスも改善することができます。
カーネル 4.0 以降、もう一つの関連するオプションが追加されました:
lazytime
は inode タイムスタンプ (アクセス・変更・作成日時) の変更をメモリ上に保存することでディスクへの書き込みを減らします。ディスク上のタイムスタンプが更新されるのは次の場合に限られます。(1) ファイルのタイムスタンプとは関係ない変更によってファイルの inode を更新する必要があるとき。(2) ディスクへの同期が発生したとき。(3) 削除されていない inode がメモリから追い出されたとき。(4) メモリ上のコピーがディスクに最後に書き込まれてから24時間以上経ったとき。
lazytime
オプションは前述の *atime
オプションと 組み合わせて 使うものであり、代替のものではないことに注意してください。それはデフォルトで relatime
ですが、strictatime
とも一緒に使うことができ、ディスクの書き込みコストは relatime
と同じかそれ以下です。
root パーティションの再マウント
何らかの理由で誤って root パーティションを読み込み専用でマウントしてしまった場合は、次のコマンドで root パーティションを再マウントしてください:
# mount -o remount,rw /
GPT パーティションの自動マウント
UEFI/GPT を使用している場合、Discoverable Partitions Specification に従ってパーティショニングすることで、特定のパーティションを /etc/fstab
から省略することができ、systemd-gpt-auto-generator(8) を使ってそのパーティションをマウントすることができます。systemd#GPT パーティションの自動マウント を見てください。
バインドマウント
bind
オプションにより、ディレクトリをリンクさせることができます:
/etc/fstab
# <device> <dir> <type> <options> <dump> <fsck> UUID=94649E22649E06E0 /media/user/OS/ ntfs defaults,rw,errors=remount-ro 0 0 /media/user/OS/Users/user/Music/ /home/user/Music/ none defaults,bind 0 0 /media/user/OS/Users/user/Pictures/ /home/user/Pictures/ none defaults,bind 0 0 /media/user/OS/Users/user/Videos/ /home/user/Videos/ none defaults,bind 0 0 /media/user/OS/Users/user/Downloads/ /home/user/Downloads/ none defaults,bind 0 0 /media/user/OS/Users/user/Documents/ /home/user/Documents/ none defaults,bind 0 0 /media/user/OS/Users/user/projects/ /home/user/projects/windows/ none defaults,bind 0 0
詳細は mount(8) § Bind mount operation を見てください。
genfstab を使用して fstab を自動的に生成する
genfstab ツールを使用して fstab ファイルを作成できます。詳細については、genfstab を参照してください。