Web Analytics

Technically Impossible

Lets look at the weak link in your statement. Anything "Technically Impossible" basically means we haven't figured out how yet.

fstabあるいはsystemdによる自動マウント、遅延マウント

90年代後半から2000年代ごろのアプリケーションの中には、その起動に際し、CD-ROMの挿入を求められるものがある。Microsoft Bookshelfのような辞書、百科事典は、そのようなアプリケーションの典型例だ。

現在ならば、CD-ROMをISOファイル化し、マウントして対応することだろう。PC起動時に、目的のISOファイルを自動マウントするのだ。よりこだわるなら、遅延マウントでもよいだろう。あらかじめ定義しておいたISOマウント設定を、マウントが必要になった時点で呼び出し、自動的にマウントするのだ。

いずれにせよfstab、あるいはsystemdを活用することになる。このタイミングで、それぞれ、おさらいしておくことにした。

比較:fstab、systemdのマウント

最初に、fstabを用いる場合、systemdを用いる場合の違いについて触れておく。

起動時の自動マウント 遅延マウント 実行タイミング
fstab 対応 不可 起動時のみ
systemd 対応 対応 調整可能

PCにログインすれば、必要なデバイスがマウントされている、そのような状態を端的に実現したいのであれば、fstabを用いればよい。ファイルの記述も簡単だし、何より余計なことを考えずに済む。
バイスを参照する必要のあるタイミングで、自動的にマウントされる状態、いわゆる遅延マウントを実現したいのであれば、systemdで対応する必要がある。

あるいは、マウントポイントとなるディレクトリを、マウントのタイミングで自動生成する必要があるならば、systemdで対応する必要がある。もし存在しないディレクトリをマウントポイントとして指定した場合、fstabではマウントに失敗する。

fstab

/etc/fstab

fstabは、マウントするファイル・システムの情報を定義するファイルだ。PC起動時、デバイスはこの定義に従ってマウントされる。ただしClear Linuxのように、fstabを参照しない場合もある。*1
Clear Linuxのstateless OS architectureの前提では、fstabを必要としていないのだ。ただし、fstabを参照しないからと言って、ユーザーがfstabを作ることを禁じているわけではない。必要があれば、作成すればよい。作成したからと言って、statelessの前提を損なうわけでもない。

fstab中の1行に、次の情報を空白(半角スペース、あるいはTAB)区切りで記述する。

バイス 絶対パスで記述
ISOファイルの場合、ファイル名までの絶対パス
マウントポイント 絶対パスで記述
既存のディレクトリを指定
ファイル・システム ISOファイルの場合→iso9660
オプション mountコマンドのオプション
dump可否 0: 不可
1: dump可能
起動時のfsck要否 0: 不要
1: rootファイルシステムのみ実施
2:rootファイルシステム以外で実施

存在しないパスをマウントポイントに指定すると、マウントに失敗する。パスに該当するディレクトリが自動的に生成されることはない。

オプション

特にISOファイルのマウントに関連するオプションに限定すると、

auto
noauto
自動マウント
手動マウント
defaults "auto,exec,nouser,rw,suid"と同義
dev
nodev
バイス・ファイルのマウントを可否
exec
noexec
実行ファイルの実行可否
ro
読み取り専用、読み書き可能
user
nouser
ユーザー・アカウントでマウント可能
rootアカウントのみマウント可能
suid SetUID、SetGIDを許可

オプションに"noauto"を指定すると、起動時にマウントされない。任意のタイミングで手動マウントする必要があるのだが、fstabに記載したデバイスをマウントする際、コマンド入力を簡略化できる。*2

起動時にマウントされずとも、必要な瞬間に自動的にマウントされるよう、遅延マウントとして定義するならば、systemdに頼ることになる。

systemd.mount, automount

systemdにデバイスをマウントさせるために、2つのユニット・ファイルを作成する。mountファイルと、automountファイルだ。
PCの起動時にデバイスをマウントさせるだけならば、mountファイルを作成するだけで済む。これはfstabを作成するのと、本質的に変わりがない。特徴的な違いを挙げるとすれば、どのサービスの後に実行するなど、実行タイミングの調整が可能なことだ。
さらに、遅延マウントを実現したい場合に、automountファイルも作成する。

ユニット・ファイルは、次のディレクトリに格納する。ユニット・ファイルの格納場所についての詳細を確認する必要があれば、投稿末尾に掲載している参照先を訪問してほしい。

/etc/systemd/system/

ここでは、次の前提でマウント・ファイルを作成することにする。ちなみに、ここで指定しているISOファイルは、Microsoft BookshelfというWindowsアプリケーションのインストール・メディアだ。

バイス /home/▯▯▯▯/sdcard/software/Microsoft Bookshelf Basic/BSBASIC2.ISO
マウントポイント /run/media/▯▯▯▯/BSBASIC2
オプション 遅延マウント
読み取り専用
suid許可
ユーザーによるマウント可

まずmountファイルのファイル名は、マウントポイントのパスと同名にする必要がある。ディレクトリの区切りは"-"を用いる。今回の場合、ファイル名は次のようになる。

run-media-▯▯▯▯-BSBASIC2.mount

このmountファイルの内容は次のようになる。UnitセクションのDescriptionには、任意の情報を定義する。

[Unit]
Description=Microsoft Bookshelf

[Mount]
What=/home/▯▯▯▯/sdcard/software/Microsoft Bookshelf Basic/BSBASIC2.ISO
Where=/run/media/▯▯▯▯/BSBASIC2
Type=iso9660
Options=noauto,ro,suid,user

今回は遅延マウントを前提としているため、Optionsへnoautoを指定した。PC起動時にマウントを済ませておくならば、代わってautoを設定する。

遅延マウントを前提としているため、mountファイルに対応するautomountファイルを用意する。ファイル名は、mountファイルと同名にする必要がある。つまり、

run-media-▯▯▯▯-BSBASIC2.automount

その内容は次のようになる。mountファイル同様、UnitセクションのDescriptionには、任意の情報を定義する。

[Unit]
Description=Microsoft Bookshelf

[Automount]
Where=/run/media/▯▯▯▯/BSBASIC2

[Install]
WantedBy=multi-user.target

以上の準備が整ったら、systemdへ登録し、設定を有効にする。次のコマンドを実行する。

systemctl daemon-reload
systemctl enable --now run-media-▯▯▯▯-BSBASIC2.automount

この状態では、まだBSBASIC2.ISOはマウントされていない。このISOファイルを参照する必要性が生じれば、自動的にマウントされる。例えば、次のコマンドを実行する。

ls -la /run/media/▯▯▯▯/BSBASIC2

左の画像がコマンド実行前の状態を示している。コマンド実行後、右の画像が示すように、BSBASIC2がマウントされているのが分かる。コマンドの実行結果も、マウント後の状態を反映した情報が出力される。