tanke25616429のアウトプット

IT技術の基本を勉強したことをアウトプットします。Linux、Kubernetes、クラウド中心です。百番煎じくらいだけど誰かの役に立てばそれはそれでうれしい。

Autofs

Autofsの動機

動機は一言で言うとマウントすることにかかるリソースの効率化である。

ファイルシステムをマウントする方法はいくつかある。1つはmountコマンドを用いてシェル上で対話的に行う方法である。以下はxfsでフォーマットされたデバイス/dev/sda1を、/mntというマウントポイント(アクセスするディレクトリのパス)にマウントする例である。

# mount -t xfs /dev/sda1 /mnt

これだと再起動した場合はマウントが解除されるので、マウントが永続するようにするように/etc/fstabというファイルに記載する*1

# cat /etc/fstab
(略)
/dev/sda1                                 /mnt           xfs     defaults        0 0

上記いずれのやり方でも、マウントされたファイルシステムはアクセス有無によらずマウントされた状態である。これだとマウントを維持するにかかるリソースを常に消費する。アクセスがあったときだけ自動的に(オンデマンドで)マウントすることができればマウント維持にかかるリソースを効率化できる。これがAutofsの動機で、実現することである。

使い方

Autofsは、autofsをインストール・有効化し、マウントに関する設定ファイルを記載することで利用できる。

# yum install autofs
(略)
# systemctl enable autofs --now
(略)

マウントに関する設定ファイルではマウントポイントに関する指定をする。/etc/auto.masterというファイルに基本の設定を記載しつつ、他の設定ファイルを組み合わせる。設定ファイルでは一行に1エントリを記載する。書き方は直接マップと間接マップという2通りがある。これについては各々節を分けて後述する。

Autofsの利用例を示す。mountコマンドで表示されないし、umountしても「マウントされていないよ」とメッセージが出るがアクセスはできる*2

# mkdir /test
# mkfs.xfs /dev/sdc
meta-data=/dev/sdc               isize=512    agcount=4, agsize=66993 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0, sparse=0
data     =                       bsize=4096   blocks=267969, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal log           bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
# vi /etc/auto.master

/  /etc/auto.test

# vi /etc/auto.test

/test -fstype=xfs /dev/sdc

# systemctl restart autofs
# cd /test/
# touch hogehoge
# ls
hogehoge
# umount /test
umount: /test: not mounted
# mount |grep test
# mount |grep sdc
# cd /test/
# ls
hogehoge

直接マップ

直接マップは/-で始まる行で記載する。/-の後にある/etc/auto.directも設定ファイルであり、ここで指定したファイルにマウントポイントとデバイスの設定を記載する。

# cat /etc/auto.master
(略)
/-      /etc/auto.direct
(略)

マウントポイント/mnt/synologyにnas1:/volume1/dir1をNFSマウントする設定が記載されている。

# cat /etc/auto.direct
/mnt/synology -rw,sync nas1:/volume1/dir1

間接マップ

間接マップでは、/etc/auto.masterにマウントポイントと追加の設定ファイルの情報を記載する。以下はマウントポイント/mntに関する設定を/etc/auto.mntに記載する例である(直接マップで示した例と同じことを間接マップで実現した例である)。

# cat /etc/auto.master
(略)
/mnt     /etc/auto.mnt
(略)

以下のsynologyは/mntからの相対パスを示す。すなわち、この/etc/auto.masterと/etc/auto.mntを組み合わせることで、/mnt/synologyにnas1:/volume1/dir1をマウントすることができる。

# cat /etc/auto.mnt
synology -rw,sync nas1:/volume1/dir1

間接マップでのワイルドカードの利用

マウント設定のエントリ数が多い場合、一行一行書くのは大変なのでワイルドカードを用いて簡略化することができる。

# cat /etc/auto.master
(略)
/mnt     /etc/auto.mnt
(略)

*はマウントポイントに関するワイルドカード、&はマウント元に関するワイルドカードである。これによって/mnt/dir1にアクセスしたらnas1:/volume1/dir1が、/mnt/dir2にアクセスしたらnas1:/volume1/dir2が自動マウントされる(もちろんnas1:/volume1/dir1やnas1:/volume1/dir2が存在する前提である)。

# cat /etc/auto.mnt
* -rw,sync nas1:/volume1/&

参考にしたもの

access.redhat.com

www.8wave.net

access.redhat.com

kazmax.zpp.jp

kazmax.zpp.jp

documentation.suse.com

https://docs.oracle.com/cd/E19504-01/805-0673/6j0msjnjf/index.html

kirifue.hatenadiary.org

*1:この例ではデバイスファイル名/dev/sda1で指定しているが、同じデバイスでもデバイスファイル名は変わり得るので、本来は/dev/sda1ではなくUUID="/dev/sda1のUUID"と書いたほうがよい。

*2:この辺りの挙動は一概に言えないようである。後述のNFSで試した場合、自動マウントされている間はmountコマンドで表示された。したがって「autofsだからmountコマンで表示されない」と断言はできない。