「Fstab」の版間の差分

提供: ArchWiki
ナビゲーションに移動 検索に移動
(→‎ファイル例: →‎フィールドの定義: 英語版と同期、若干加筆)
(→‎自動マウント解除: セクションとして分離)
157行目: 157行目:
   
 
=== systemd による自動マウント ===
 
=== systemd による自動マウント ===
  +
  +
詳細は {{man|5|systemd.automount}} にあります。
   
 
==== ローカルパーティション ====
 
==== ローカルパーティション ====
182行目: 184行目:
 
{{hc|/etc/crypttab|
 
{{hc|/etc/crypttab|
 
data /dev/md0 /root/key noauto}}
 
data /dev/md0 /root/key noauto}}
  +
  +
==== 自動マウント解除 ====
   
 
{{ic|x-systemd.idle-timeout}} フラグを使うことで一定時間アイドル状態のときにタイムアウトするのを指定できます。例:
 
{{ic|x-systemd.idle-timeout}} フラグを使うことで一定時間アイドル状態のときにタイムアウトするのを指定できます。例:

2020年8月19日 (水) 22:58時点における版

関連記事

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

ファイルシステムは一行毎に記述されます。書かれている定義は、起動時やシステムマネージャの設定がリロードされたときに systemd の mount ユニットに動的に変換されます。デフォルトの設定はマウントを必要とするサービスが起動する前にファイルシステムの fsck とマウントを自動的に実行します。例えば、NFSSamba などのリモートファイルシステムはネットワークが立ち上がった後に systemd によって自動的にマウントされます。そのため、/etc/fstab に指定するローカル・リモートファイルシステムのマウントに設定は必要ありません。詳しくは systemd.mount(5) を見て下さい。

mount コマンドはディレクトリやデバイスがひとつだけ指定された場合、他のパラメータの値を取得するために fstab を使います。このとき、fstab に記述されたマウントオプションも使われます。

ファイル例

シンプルな /etc/fstab はカーネルの名前記述子を使います:

/etc/fstab
# <device>        <dir>    <type>      <options>      <dump> <fsck>
/dev/sda1         /             ext4          noatime         0      1
/dev/sda2         none       swap          defaults         0      0
/dev/sda3         /home     ext4          noatime          0      2

フィールドの定義

/etc/fstab ファイルには以下のフィールドが含まれ、スペースかタブで区切ります:

<device>        <dir>        <type>        <options>        <dump>  <fsck>
  • <device> - マウントされるパーティションやストレージデバイス。
  • <dir> - <device> がマウントされるマウントポイント。
  • <type> - マウントされるパーティションやストレージデバイスのファイルシステムタイプ。さまざまなファイルシステムがサポートされています: ext2, ext3, ext4, btrfs, reiserfs, xfs, jfs, smbfs, iso9660, vfat, ntfs, swap, autoauto タイプはどのファイルシステムタイプが使われているかマウントコマンドに推測させます。これはディスクメディア (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 によって使われます。指定できるエントリは 01 もしくは 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= を付けて下さい:

ヒント: 特定のパーティションの UUID だけを表示したい場合: $ lsblk -no UUID /dev/sda2
/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 へのファイルアクセスを全てバッファします。

ノート: この設定を使うと /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

参照