起動時のファイルの自動マウントについて

Linuxをブートしたした時にISOイメージファイルやHDDイメージファイルを自動的にマウントして利用する方法をメモしておく。(超小技程度の話なのだが、どうもautomountの設定をしようとすると毎回、基本的なところから調べなおしているので、ちょっとメモっておく。)

なお、ここではOSとしてFedora 8を使っているが、ベーシックなところなので大体のLinuxで同様に設定になると思う。(しかし、未だにFedora 9へアップグレードしようという“動機”が湧かない。)

ISOファイルをマウントしておく

“/home/Opticals/Fedora-8-x86_64-DVD.iso”というISOイメージファイルを、OSの起動時に自動的に“/mnt/F8-DVD”というディレクトリへマウントするようにしておく。

まず、/etc/fstabに次の一行を加える

/home/Opticals/Fedora-8-x86_64-DVD.iso	/mnt/F8-DVD	iso9660	ro,loop	0 0

ファイルのパスやマウント・オプションは利用している環境に合わせて適宜変更する。
これでリブートすれば起動時にマウントしてくれると思ったが、Fedora-8ではもう一つ、SELinuxの設定が必要だった。ローカルポリシを作る方法もあるが(後述)、ここでは“allow_mount_anyfile”という論理フラグを有効にしておく。論理フラグを変更するには“SELinux Management”ツールを使ってチェエクする、

か、setseboolコマンドを使って設定する。

[root@fedora-8 ~]# getsebool allow_mount_anyfile
allow_mount_anyfile --> off
[root@fedora-8 ~]# setsebool -P allow_mount_anyfile=on
[root@fedora-8 ~]# getsebool allow_mount_anyfile
allow_mount_anyfile --> on
[root@fedora-8 ~]# 

これでブート時にISOファイルを特定のディレクトリにマウントできる。

HDDイメージファイルをマウントしておく

次にHDDのイメージファイルをマウントする方法。これはディスクレスのクライアント用ルートファイルシステムを1つのファイルに格納しておいて、サーバでサービスする時にマウントして使う、といった利用方法である(PXEによるディスクレス・クライアント(総集編)/ クライアント用のファイルシステムの作成を参照)。ただし、ここで検証に使ったのは1つのファイルが1つのパーティション・イメージとなっているもの(つまりファイルを直接mkfsでフォーマットしたもの)で、1つのファイルが1つのHDDイメージのもの(つまり複数のパーティションを持つ仮想ディスクのようなイメージ、「HDDイメージファイルをマウントして使う方法」参照)ではない。複数のパーティションを持つHDDイメージタイプのものでもoffsetを指定すればマウントできる筈だが、ここではパーティション・イメージのファイルを使った。

“/home/ClientImages/Fedora-8.img”というパーティション・イメージのファイルを“/mnt/F-8.IMG”というディレクトリへマウントする。ただし、Fedora-8.imgはext3でフォーマットされているとする。これも次のような1行を/etc/fstabへ追加すればいい。

/home/ClientImages/Fedora-8.img         /mnt/F8-IMG     ext3    loop    0 0

ただし、Fedora 8等の環境ではやはりSELinuxがマウントを阻害する。今度は論理フラグの設定だけでは回避できないのでローカルポリシーを設定する必要がある。
一旦、SELinuxのモードをPermissiveにしてリブート、audit2allowコマンドでポリシーのひな形をつくる。まず、“SELinux Management”ツールでSELinuxをPermissiveにしてリーブし、リブート直後に次の要領でローカルポリシを設定する。(なお、先ほどのallow_mount_anyfile論理フラグがonになっているとreadパーミッションは通ってしまうのでwriteのみのひな形が出来る。allow_mount_anyfile論理フラグを一旦offにしてからリブートし、read/writeをまとめてローカルポリシとして設定した方が(設定があちこちに分散しないので)良いだろう。

[root@fedora-8 ~]# mkdir tmp
[root@fedora-8 ~]# cd tmp
[root@fedora-8 tmp]# audit2allow -a -l -m LocalMount > LocalMount.te
[root@fedora-8 tmp]# ls
LocalMount.te
[root@fedora-8 tmp]# cat LocalMount.te 

module LocalMount 1.0;

require {
        type home_root_t;
        type mount_t;
        class file { read write };
}

#============= mount_t ==============
allow mount_t home_root_t:file { read write };
[root@fedora-8 tmp]# make -f /usr/share/selinux/devel/Makefile
Compiling targeted LocalMount module
/usr/bin/checkmodule:  loading policy configuration from tmp/LocalMount.tmp
/usr/bin/checkmodule:  policy configuration loaded
/usr/bin/checkmodule:  writing binary representation (version 6) to tmp/LocalMount.mod
Creating targeted LocalMount.pp policy package
rm tmp/LocalMount.mod tmp/LocalMount.mod.fc
[root@fedora-8 tmp]# ls
LocalMount.fc  LocalMount.if  LocalMount.pp  LocalMount.te  tmp
[root@fedora-8 tmp]# semodule -l | grep Local
[root@fedora-8 tmp]# semodule -i LocalMount.pp
[root@fedora-8 tmp]# semodule -l | grep Local
LocalMount      1.0
[root@fedora-8 tmp]# 

automountを使う

/etc/fstabに記述することによって起動時から定常的にマウントできるが、普段あまり使わないファイルシステムであれば、定常的にマウントするよりは必要な時に“自動的に”マウントできる方がいい。(mountコマンドで通常使わないファイルがマウントされている情報が出るのも気分的には良くなし、まして、マウントしている状態でイメージファイルを消してしまうと言うことも考えられる。)その場合に利用するできるのはaoutomountの機能となる。(元々はローカルなデバイスをマウントすると言うより、NFSの環境で必要に応じてサーバにマウントするために開発された機能だが。)

オートマウントを利用するためには、マスタ・マップ・ファイルの/etc/auto.masterと、マスタマップで指定されるマップファイル/etc/auto.*というファイルを設定する。上の例のISOファイルだが、このファイルはどこにマウントしても構わないので、automountが一般的に使かう“/misc”の下にマウントするようにする。その場合はマスタマップは変更することなしに、/etc/auto.miscというマップファイルを変更する。ここでは“Fedora-8-x86_64-DVD.iso”というファイルを“/misc/F8-DVD”というディレクトリにマウントするようにする。/etc/auto.miscに次の一行を加える。

F8-DVD	-fstype=iso9660,loop,ro,nosuid,nodev		:/home/Opticals/Fedora-8-x86_64-DVD.iso

(先程の/etc/fstabでマウントしているのであれば、fstabをコメントして、ファイルをアンマウントしておいた方がいい。)
次に、autofsサービスを再起動する。

[root@fedora-8 ~]# service autofs restart
Stopping automount:                                        [  OK  ]
Starting automount:                                        [  OK  ]
[root@fedora-8 ~]# 

これで自動マウントの設定が有効になる。普段、/miscの下は空だが、/misc/F8-DVD というディレクトリにアクセスしようとすると、自動的に“/misc/F8-DVD”というディレクトリが作られ、さらに auto.miscで指定したファイル(やデバイス)をマウントする。

[root@fedora-8 ~]# ls /misc
[root@fedora-8 ~]# ls /misc/F8-DVD
fedora.css                     RPM-GPG-KEY
GPL                            RPM-GPG-KEY-beta
images                         RPM-GPG-KEY-fedora
isolinux                       RPM-GPG-KEY-fedora-rawhide
Packages                       RPM-GPG-KEY-fedora-test
README-BURNING-ISOS-en_US.txt  RPM-GPG-KEY-rawhide
RELEASE-NOTES-en_US.html       stylesheet-images
repodata                       TRANS.TBL
[root@fedora-8 ~]# ls /misc
F8-DVD
[root@fedora-8 ~]# 

標準設定ではマウントしたディレクトリがビジーでなく、5分間アクセスが無ければ、自動的にアンマウントされディレクトリも削除される。

次に“/home/ClientImages/Fedora-8.img”を自動マウントするようにする。このHDDイメージも/miscの下にマウントするのであれば、上の例と同様に/etc/auto.miscに追加すればいい。

F8-IMG	-fstype=ext3,loop		:/home/ClientImages/Fedora-8.img

しかし、このファイルはディスクレス・クライアントのルートファイルシステムが格納されているという想定であり、/tftpboot等の下のディレクトリにマウントしたい。そこでautomountのマスタマップに次の1行を追加する。

/tftpboot/dlroots		/etc/auto.dlroots

(“dlroots”の名前は何でも構わない。ここではDiskless rootという意味でdlrootsにした。ちなみに余談だがNISを使っていない環境ではマスタマップの“+auto.master”の行は“#”でコメントアウトしておく。autofsサービスが起動する度にログに警告メッセージが残るので。)
次のこのエントリに対応するマップファイル/etc/auto.dlrootsを作成する。

[root@fedora-8 ~]# vi /etc/auto.dlroots

	:

[root@fedora-8 ~]# cat /etc/auto.dlroots
#
# This is an automounter map and it has the following format
# key [ -mount-options-separated-by-comma ] location
# Details may be found in the autofs(5) manpage

f8	-fstype=ext3,loop		:/home/ClientImages/Fedora-8.img
[root@fedora-8 ~]# 

以上で、ディスクレス・クライアントのルートファイルシステムを/tftpboot/dlroots/f8へ自動マウントするような設定にした。
最後に、Fedora 8等の環境ではSELinuxのローカルポリシが必要なる。SELinuxの標準設定ではautomountは/tftpbootの下にはアクセスできないらしい。ローカルポリシの設定の仕方は上の方法と同じで、一旦 permissiveにしておいて起動いしてaudit2allowコマンドを使って雛型を作成、ポリシを更新する。

[root@fedora-8 ~]# mkdir tmp2
[root@fedora-8 ~]# cd tmp2
[root@fedora-8 tmp2]# audit2allow -a -l -m LocalAutofs > LocalAutofs.te
[root@fedora-8 tmp2]# cat LocalAutofs.te 

module LocalAutofs 1.0;

require {
        type automount_t;
        type tftpdir_t;
        class dir mounton;
}

#============= automount_t ==============
allow automount_t tftpdir_t:dir mounton;
[root@fedora-8 tmp2]# make -f /usr/share/selinux/devel/Makefile
Compiling targeted LocalAutofs module
/usr/bin/checkmodule:  loading policy configuration from tmp/LocalAutofs.tmp
/usr/bin/checkmodule:  policy configuration loaded
/usr/bin/checkmodule:  writing binary representation (version 6) to tmp/LocalAutofs.mod
Creating targeted LocalAutofs.pp policy package
rm tmp/LocalAutofs.mod.fc tmp/LocalAutofs.mod
[root@fedora-8 tmp2]# ls
LocalAutofs.fc  LocalAutofs.if  LocalAutofs.pp  LocalAutofs.te  tmp
[root@fedora-8 tmp2]# semodule -i LocalAutofs.pp
[root@fedora-8 tmp2]# semodule -l | grep Local
LocalAutofs     1.0
LocalMount      1.0
[root@fedora-8 tmp2]# 

これでautofsサービスを再起動してアクセスすると次のようになる。

[root@fedora-8 ~]# ls /tftpboot/dlroots/
[root@fedora-8 ~]# ls /tftpboot/dlroots/f8
lost+found  root  snapshot
[root@fedora-8 ~]# ls /tftpboot/dlroots/
f8
[root@fedora-8 ~]# 

これで実際にディスクレス・クライアントを立ち上げると、自動的に/tftpboot/dlroots/f8をマウントして問題なくクライアントが立ち上がる。ただし、クライアントを1回起動するとマウントポイント以下がビジーとなりアンマウントされなくなる。NFSのデーモンが/tftpboot/dlroots以下のリソースを掴んだままになるらしい。別にマウントされたまま使い続けても問題はないが、気分的にすっきりしたいのであればNFSのサービスを再起動すれば、そのうち自動的にアンマウントされる。

SELinuxのローカルポリシのまとめ

ローカルポリシは2つになる。1つはmountコマンドに関するもの。もう一つはautomountに関するもの。mount関連のポリシではいくつかのファイルコンテキストに対して読み書きができないので、それを許可するように設定する。私の環境ではmountするファイルがあちらこちらのディレクトリに分散しているので幾つかのコンテキストに対して許可をする必要があった。(いまのところhome_root_t、tftpdir_t、samba_share_tである。)最終的に次のようなローカルポリシを追加した。

[root@fedora-8 LocalMount]# cat LocalMount.te

module LocalMount 1.0;

require {
        type home_root_t;
        type tftpdir_t;
        type samba_share_t;
        type mount_t;
        class file { read write };
}

#============= mount_t ==============
allow mount_t home_root_t:file { read write };

#============= mount_t ==============
allow mount_t tftpdir_t:file { read write };

#============= mount_t ==============
allow mount_t samba_share_t:file { read write };
[root@fedora-8 LocalMount]#

これらのポリシのreadに関しては論理フラグ allow_mount_anyfile を on にすることで対応できるが、writeに関してはallow_mount_anyfileでは対応できないので、ローカルポリシを設定する必要ある。(ファイルをroでマウントする場合、つまりISOファイル等をマウントする場合はallow_mount_anyfileの設定だけでも良い。)

automountに関しては先ほどの通り、tftpdir_tに対してマウントできるようにしておく。

[root@fedora-8 LocalAutofs]# cat LocalAutofs.te

module LocalAutofs 1.0;

require {
        type automount_t;
        type tftpdir_t;
        class dir mounton;
}

#============= automount_t ==============
allow automount_t tftpdir_t:dir mounton;
[root@fedora-8 LocalAutofs]#