ウェブサイト検索

現代のLinuxディストリビューションでのファイルシステムのマウント順序を設定する方法


前回のチュートリアルでは、/etc/fstabファイルについて、ブート時にマウントされるべきファイルシステムを宣言する方法を説明しました。Systemd以前の時代では、ファイルシステムは/etc/fstabファイルに指定された順序でマウントされていました。しかし、現代のLinuxディストリビューションでは、より速いブートのために、ファイルシステムは並行してマウントされます。Systemdは、/etc/fstabのエントリから自動的に生成された特別に設計されたユニットを介してファイルシステムのマウントを管理します。これらの理由から、2つのファイルシステム間の依存関係を確立し、それにより正しいマウント順序を設定するために異なる戦略を採用する必要があります。

このチュートリアルでは、2つのファイルシステム間に明示的な依存関係を確立し、現代のLinuxディストリビューションでのマウント順序を設定する方法を見ていきます。

このチュートリアルでは、あなたは学びます:

  • /etc/fstabファイルのエントリがSystemdマウントユニットに変換される方法
  • Systemdの「マウント」ユニットの構造
  • どのようにして/etc/fstabの2つのファイルシステム間に依存関係を確立するか

systemd「マウント」ユニット

systemdは、実質的にすべての主要なLinuxディストリビューションで採用されている初期化システムです。systemdは、従来の意味でのシステム初期化を管理するだけでなく、現代のLinuxディストリビューションではファイルシステムのマウントも管理します。これは「マウント」ユニットと呼ばれ、サービスを管理するために使用される「サービス」ユニットに似ています。ブート時にどのファイルシステムをマウントするかを設定する従来の方法は、fstabファイルを使用することでした。この方法はまだ機能しますが、裏ではfstabエントリがsystemd-fstab-generatorによって「マウント」ユニットに変換され、/run/systemd/generatorディレクトリに「保存」されます。

マウントユニットの解剖

マウントユニットには「.mount」という接尾辞が付いており、制御するマウントポイントにちなんで名前が付けられなければなりません。たとえば、/home ディレクトリにマウントされるファイルシステムをマウントするために使用されるユニットは、「home.mount」という名前でなければなりません。では、fstabのエントリからマウントユニットがどのように生成されるかの例を見てみましょう。/etc/fstabファイルには、/homeにマウントされるようにファイルシステムを設定しました。

/dev/sda3 /home ext4 defaults 1 2

この例のために、ファイルシステムは /dev/sda3 パーティションに作成されました。それは「ext4」ファイルシステムで、/home に「デフォルト」のオプションでマウントするように構成されています。以下に、systemd-fstab-generator によって生成された対応する「.mount」ユニット /run/systemd/generator/home.mount を示します:

Automatically generated by systemd-fstab-generator

[Unit]
Documentation=man:fstab(5) man:systemd-fstab-generator(8)
SourcePath=/etc/fstab
Before=local-fs.target
Requires=systemd-fsck@dev-sda3.service
After=systemd-fsck@dev-sda3.service
After=blockdev@dev-sda3.target

[Mount]
What=/dev/sda3
Where=/home
Type=ext4

ファイルで最初に見るのは、ユニットがsystemd-fstab-generatorによって自動的に生成されたことを示すコメントです。このユニットには、[Unit]と[Mount]の2つのセクションがあることがわかります。

[Unit]スタンザは、ユニットに関する一般的な情報を含んでいます:これはすべてのタイプのsystemdユニットに共通しています。Documentationキーワードは、ユニットに関連するドキュメント(この場合はfstabのマニュアルページとsystem-fstab-generator)を参照するために使用されます。

代わりに、SourcePath キーワードは、ユニットが生成されたソースを参照するために使用されます。この場合、そのソースは /etc/fstab ファイルです。

Before、After、およびRequiresキーワードは、ユニットの依存関係とその順序を確立するために使用されます。たとえば、Before=local-fs.targetを使用することで、システムが「local-fs.target」に到達する前に、そのユニットを実行しなければならないことが確立されます(Afterキーワードは逆の方式で機能します:ユニットを開始するためには、言及されたユニットが完全に開始されている必要があります)。

[Mount]スタンザは「.mount」ユニットに特有のものです。この場合、3つのキーワードが含まれています:What、Where、およびType。最初のキーワードはマウントすべきリソースのフルパスを参照するために使用され、2番目はリソースがマウントされるべきマウントポイントの絶対パスを値として取ります。3番目はファイルシステムの種類を指定するために使用されます。

/etc/fstab で依存関係とマウント順序を確立する

どのような場合に二つのファイルシステムの間に依存関係を確立したいと思うでしょうか? /home ディレクトリにマウントするファイルシステムと、特定のユーザーデータを含む別のファイルシステムがあると仮定しましょう。このファイルシステムはそのユーザーのホームのサブディレクトリ(例: /home/egdoc/data)にマウントしたいとします。この設定により二つのファイルシステムの間に「依存関係」が確立されます。なぜなら、二つ目のファイルシステムが正常にマウントされるためには、最初のファイルシステムがすでにマウントされている必要があるからです。

この場合、二つ目のマウントポイントが一つ目の下にあるので、特別なことをする必要はありません。systemdは両方のファイルシステムの間に依存関係を確立するのに十分な賢さを持っているため、fstabファイルには単にこう書くだけです:

/dev/sda3 /home ext4 defaults 1 2
/dev/sda4 /home/egdoc/data ext4 defaults 1 2

もし、関連性のないマウントポイントを持つ二つのファイルシステム間に明示的に依存関係を確立したい場合はどうすればよいでしょうか?このタスクを達成するためには、x-systemd.requires-mounts-for オプションを使用する必要があります。このオプションは絶対パスを値として取り、使用されているファイルシステムと、値として渡されたマウントポイントに使用されるファイルシステムとの間に依存関係を確立します。

例を見てみましょう。何らかの理由で、/homeにマウントされたファイルシステムを、/bootにマウントされたファイルシステム(ここでは、/dev/sda2パーティションにあると仮定します)の後にマウントしたいとします。その場合、/etc/fstabには次のように書きます:

/dev/sda2 /boot   ext4 defaults 1 2
/dev/sda3 /home ext4 defaults,x-systemd.requires-mounts-for=/boot 1 2

systemd マウントユニットを即座に再生成するには、次のコマンドを実行できます:

sudo systemctl daemon-reload

この時点で、/run/systemd/generator/home.mountユニットを見てみると、[Unit]スタンザにRequiresMountsFor=/bootオプションが含まれていることがわかります:

Automatically generated by systemd-fstab-generator 

[Unit] 
Documentation=man:fstab(5) man:systemd-fstab-generator(8) 
SourcePath=/etc/fstab 
RequiresMountsFor=/boot 
Before=local-fs.target 
Requires=systemd-fsck@dev-sda3.service 
After=systemd-fsck@dev-sda3.service 
After=blockdev@dev-sda3.target 

[Mount]
What=/dev/sda3
Where=/home
Type=ext4
Options=defaults,x-systemd.requires-mounts-for=/boot

結論

最近、ほぼすべての主要なLinuxディストリビューションは(いくつかの論争なしには)、initシステムとしてSystemdを採用しています。Systemdに対する最大の批判の一つは、システムの初期化を管理する以上のことを多くこなすということです。この場合、私たちは、特定のユニットを通じてブート時にファイルシステムのマウントをどのように処理するかを見ました。これらのユニットは、ゼロから作成することも、従来の/etc/fstabファイルから自動的に生成することもできます。ブート時にファイルシステムのマウントが逐次的に行われないため、このチュートリアルでは、2つのファイルシステム間の依存関係を宣言し、x-systemd.requires-mounts-forオプションを使用して正しいマウント順序を設定する方法を見ました。

関連記事: