98/05/19
参考文献は後ろにつけたNET-2-HOWTOの抜粋,「amdのセットアップ例」というホームページ,「Linuxネットワーク」p.235~(こういう本は貴重やけど文章や例が分かりづらいなあ,この本は),「Networking Linux」などなど。
amdというのはオートマウントデーモン,つまり常時マウントするのではなく,そのファイルにアクセスするときだけマウントしてしばらくアクセスしていなかったらアンマウントしてくれる便利なデーモン。これを使って以下のような便利な環境にする。
1.どのマシンでloginしても常にホームディレクトリは決まったマシンのHDD上のホームディレクトリになるようにする(異なるマシン間のホームディレクトリの共有)。
→ 自分のファイルの置き場所がいろんなマシンのホームディレクトリに分散することがない。
2.FD,CD-ROM,ZIPなどを使うときにいちいちmountコマンドを打ち込まなくてもよいようにする。
1.異なるマシン間のホームディレクトリの共有
例としてhostnameがsc209とsc122の2台のマシンがあったとして,ユーザーkakehiがsc209にloginしても,ホームディレクトリがsc122のホームディレクトリ/home/kakehiになるようにする設定を考える。目指す設定は
「sc122の/homeディレクトリをsc209の/net/hogehogeディレクトリにオートでNFSマウントする」
である。
クライアント側でamdを起動するんやけど,これは
/usr/sbin/amd -a /.auntomount -l syslog -c 1000 /net /etc/amd.conf
というオプション・引数で起動しているものとして話を進める。これはRedHat4.2のdefaultでの起動の形(具体的には/etc/rc.d/init.d/amd.initというシェルスクリプトの中で起動されている)。
この場合ユーザーkakehiのsc209でのホームディレクトリは/net/hogehoge/kakehiとすればよい。
ここでhogehogeのところは実際はどのホストのホームディレクトリをmountしているがぱっと分かるようにsc122/home(/はorの意味ではなくディレクトリの区切りの/)としているのだが,それではmapファイル/etc/amd.confの設定例でsc122がhostnameなのかmount pointのディレクトリ名なのか区別がつきにくいのでhogehogeと書いている(だから実際に設定する場合はhogehogeをsc122/homeに読み替えてね)。なお,hogehogeはsc122/homeのように「hostname+/+fumufumu」という形なら/で2つのディレクトリをつなぐ形でいけたのだが,例えばpekepeke/fumufumuの形でpekepekeがhostnameと異なる場合はオートマウントしてくれない。つまり例のhogehogeの部分は「hostname+/+fumufumu」という場合は例外的にいけるが,一般には単一の(/でつながれていない)ディレクトリ名でないといかん,みたい,やってみた限りでは。
なお,netというのも例えばtmp_mntなどと自分勝手な名前のつけ方をしてもよいが,それをするならamdを起動するときに上の例の引数の/netというのを/tmp_mntに変えることを忘れずに。このamdの引数として指定するディレクトリはあらかじめrootになってわざわざ作っておかなくても勝手にamdが作ってくれる。一方amdのオプション-aで指定している/.auntomountはあらかじめ(rootになって)作っとかんといかんのやけど,RedHatでは最初からあった。もちろんこれも自分で好きな名前にしてよい(別に頭に.をつけなくてもよい)。
1-a.関連するdaemonが起動しているかどうかの確認
クライアント(例ではsc209)側でamdが起動しているのは勿論やけど,要はNFSマウントするわけなのでサーバー(例ではsc122),クライアント(例ではsc209)の両方で次の3つのdaemonが起動していることを確認する。
portmap(full pathでは/usr/sbin/portmap,ちなみにSlackwareではrpc.portmapという名前)
rpc.nfsd(full pathでは/usr/sbin/rpc.nfsd)
rpc.mountd(full pathでは/usr/sbin/rpc.mountd)
1-b.サーバー側の設定
サーバーsc122の/etc/exportsにクライアントsc122に対するNFSマウントの許可情報を追加してやる。具体的には以下の行を追加する。
/home/ sc209 (rw,root_squash)
意味は「ホストsc209に俺の/homeディレクトリにアクセスする許可を与えてやるぜ。読み書きどっちもOK(←rw)」てな感じ。この変更を反映させるためサーバーsc122のportmap,rpc.mountd,rpc.nfsdを再起動する。具体的にはrootになって今走っているやつをkillしたあとfull pathでコマンド(=daemon名)を入力してやればよい。重要なのはportmapを他の2つより先に起動すること。詳しくは「Networking Linux」p.178~を参照のこと。
1-c.クライアント側の設定
クライアントsc209のamdの設定ファイル/etc/amd.confで行う。設定ファイルのファイル名は実は自由なのだがamdの起動時のオプションで/etc/amd.confの設定を読み込むようになっているので(上記参照)。具体的にはこう書く(もちろんrootになって編集)。
/defaults fs:=${autodir}/${rhost}/root/${rfs};opts=nosuid,nodev ← これは初めからあった行
* rhost:=${key};type:=host;rfs:=/ ← これは初めからあった行
hogehoge rhost:=sc122;rfs:=/home;type:=nfs ← この行を追加
次に「実際のmount pointのトップエントリ」となるディレクトリ(←1-e参照)をrootになって手で作ってやるのだが,この例の場合/.auntomountというのはRedHatをインストールした時点でできているので作らなくてすむ。
そして現在動いているamdをkillしてから上記1.の項に書いてあるオプションを指定して(RedHat4.2のdefault通りなんやけど)amdを起ち上げ直す。つまりrootになって現在の
/usr/sbin/amd -a /.auntomount -l syslog -c 1000 /net /etc/amd.conf
というjobをkillしてから,
# /usr/sbin/amd -a /.auntomount -l syslog -c 1000 /net /etc/amd.conf
と打ち込んで新たにきどうするわけ。これは
# ps -ax
で確認してjobの表示(?)をコピーしておいて,killしてからペーストすりゃオプションの指定もいちいち手で打ち込まなくてすむので楽チン。
1-d.クライアント側でのユーザーのホームディレクトリの設定
これまでの設定でsc122の/homeがsc209の/net/hogehogeにマウントされることになったわけなのでsc209のユーザーkakehiのホームディレクトリは/net/hogehoge/kakehiとすればよいのだ。ということでRedHatならrootになってコントロールパネルを起動してユーザー設定のところでkakehiのホームディレクトリを変更してやりゃよい。
これでkakehiがsc209にloginするとホームディレクトリが/net/hogehoge/kakehiになっていてどんなファイルがあるか見てみると実際にsc122のホームディレクトリのファイルがそこにあるはず。めでたしめでたし。
ちなみにpwdで今の自分の居場所を表示させると
% pwd
/.auntomount/sc122/root/home/kakehi
となっている。この/.auntomount/sc122/root/homeというのが実際のマウントポイントで/net/hogehogeは見かけ上の(シンボリックリンク)マウントポイントなのでした。一方シェル変数cwdの値を表示させると
% echo $cwd
/net/hogehoge/kakehi
とシンボルの方が出るんやな。詳しくは下記の1-d.を見るべし。
1-e.もう少し詳しい解説。
amdが実際に行うことはちょっとややこしいが,例にそって説明すると以下の通りになる。なんで実体とシンボリックリンクの両方が要るのかは俺には分からない(がシンボリックリンクが使えたほうが便利ではありそう)。
A.ユーザーがsc209の/net/hogehoge/kakehiにアクセスしたときのamdの行うこと
(1)amdがsc122:/homeを/.automount/sc122/root/homeにmountする。このmount pointのトップエントリである/.automountというディレクトリはあらかじめ手で作っておいてやる必要があるが(実はdefaultで作ってあったんやけど),その下の/sc122/root/homeというディレクトリは勝手にamdが作ってくれるのであらかじめ作ったりしないように。
(2)amdが実体mount pointである/.automount/sc122/root/homeへ,シンボリックリンク/net/hogehogeを張る。ここで/netってのはamdの起動の時に指定されているトップエントリポイントで,hogehogeってのがmapファイル(例では/etc/amd.conf)で指定されている(トップエントリポイントの下に作られる)見かけ上のマウントポイント。シンボリックリンク/net/hogehogeは当然amdが作ってくれるのであらかじめ作ったりしないように。
B.ユーザーがsc209の/net/hogehoge/kakehiを離れて1000秒(←amdの -c 1000というオプションがこれ)たつと
(1)amdが実体mount pointである/.automount/sc122/root/homeをアンマウントする。
(2)amdがシンボリックな(見かけ上の)mount pointである/net/hogehogeを削除する。
このあたりHOWTOの説明は実体とシンボルが反対くさい。「Linuxネットワーク」は正しいが実に分かりにくい。大切なのは,ユーザーがシンボリックなmount pointにアクセス(しようと)するのをきっかけにamdが起動するという点。実際にmountされた後に実体mount pointの方をのぞくと実は実体のほうでも(もちろんというべきか)mountされたディレクトリ下のファイルが見える(まああえてそんなことする必要はないけど,単なる好奇心)。けど,いきなり実体mount pointにいってもamdは起動されないのでmountは行われずそこは空っぽやで。実体のマウントポイントをユーザーに意識させないようにamdは実体とシンボルを使い分けとるらしいんやけど,実体のmount pointのトップエントリ名に/.automountのように.を頭につけることが多いのは(別につけんでもええんやで)実体のほうを隠したいという意識の現れなんやろなあ。
2.cdromやzipなどのリムーバブルメディアをいちいちmountせずに使えるようにする(ついでに常時mountしておく必要のないWindows95のパーティションもオートマウントにする)
CD-ROM,DOS(というかWindows95)フォーマットのフロッピー,DOSフォーマット(というかWindows95)のzip,HDDのWindows95のパーティションをオートマウントすることを考える。各々のデバイスファイルは
/dev/cdrom
/dev/fd0
/dev/zip
/dev/hda1
であるとする。実体のmount pointとなるディレクトリをそれぞれ
/mnt/cdrom
/mnt/floppy
/mnt/zip
/mnt/dos
とすることにする。この実際のmount pointは(nfsの場合と違ってトップエントリの/mntだけでなくその下のcdrom,fd0とかも)rootになってあらかじめ作ってやらないといけない(でもmountコマンドでマウントする時のmount pointをそのまま使うことにすれば既に作ってあるはず)。またamdの場合シンボリックなmount pointが必ずいるけど,それは
/rmm/cdrom
/rmm/floppy
/rmm/zip
/rmm/dos
とすることにする。こいつらは(/rmmもその下のディレクトリも)amdが勝手に作ってくれるので自分では作らないように。なお,rmmはReMovable Mediaのつもり。HDDのWindows95のパーティションはremovableではないけど(笑)。
基本はNFSマウントの場合と同じでmapファイルを作ってamdを起動する,とうことをする。NFSマウントの場合とはアンマウントするまでの時間を変えた(つまり違うオプションを使いたい)し,実体のmount pointも違うのを使いたい(つまり違う引数を使いたい)ので,別のmapファイルを用意して別にamdを起動することにしよう。で,mapファイルは例えば/etc/amd.conf.removableという名前にしておいて中身は
# amd map file for automounting removable media
# (by Y. Kakehi on 98/05/20)
cdrom type:=program;fs:=/mnt/cdrom;エ
mount:="/bin/mount mount -rt iso9660 /dev/cdrom /mnt/cdrom";エ
unmount:="/bin/umount umount /mnt/cdrom"
#floppy type:=program;fs:=/mnt/floppy;エ
# mount:="/bin/mount mount -t vfat /dev/fd0 /mnt/floppy";エ
# unmount:="/bin/umount umount /mnt/floppy"
zip type:=program;fs:=/mnt/zip;エ
mount:="/bin/mount mount -t vfat -o quiet /dev/zip /mnt/zip";エ
unmount:="/bin/umount umount /mnt/zip"
dos type:=program;fs:=/mnt/dos;エ
mount:="/bin/mount mount -t vfat /dev/hda1 /mnt/dos";エ
unmount:="/bin/umount umount /mnt/dos"
という風にしておく。Unixのdefaultのファイルシステム(Linuxではext2)とnfs以外のファイルシステム(iso9660やvfatは正にそう)はtype:=をprogramと指定してmount:=やunmout:=のところにmount,umountコマンドのfull path名と実際に行うコマンドを書くようになっている。気を付けんといかんのは
unmount:="/bin/umount umount /mnt/cdrom"
の行で," "の中のumountはコマンド名なので頭のuの次に当然nはつかないが,unmount:=のとこだけnが要るのだ!綴の間違いではないのだ。わしゃこれで1時間以上無駄にしたぞ!
フロッピーはオートマウントはしない方がよいと思う。というのは他のデバイスはマウントしているときに取り出そうと思っても機械的に出てこない仕組みにドライブがなっているが,フロッピーは取り出せてしまうからである。というわけでフロッピーは明示的にmount,umountコマンドを使うことにしよう(それでもumountしなくても取り出せてしまうんやけど)。
zipのところで-o quietというオプションを使っているのは,いらんメッセージを吐き出させないため。一般ユーザーでzipに書き込みをしようとすると「Operation not permitted」とおこられてしまうが,実はおこられているにもかかわらず書き込みはできているのだ(見てみるとちゃんとファイルができている)。そこで実状にあわないメッセージは吐かせない,とするわけ。これも書き込みがなぜできないのだろうとずいぶん悩んだ。ただ,Windows95フォーマットの媒体に書き込むとそのファイルには実行権がついてしまうのはなぜだろう。
でもってamdの起動だが,これは(RedHatなら)/etc/rc.d/init.d/amd.initに←で示した行を付け加えてブート時に起動するようにしておく。ただし,1回目はわざわざブートするのは面倒くさいのでrootになってコマンドを打ち込めばよい。
#!/bin/sh
# Source function library.
. /etc/rc.d/init.d/functions
. /etc/sysconfig/amd
# See how we were called.
case "$1" in
start)
touch /var/lock/subsys/amd
echo -n "Starting amd: "
daemon /usr/sbin/amd -a $ADIR -l syslog $AMDOPTS -c 1000 $MOUNTPTS
echo
# Following 3 lines were added by Y. Kakehi on 98/05/20 ←ここを追加
if [ -f /etc/amd.conf.removable ]; then ←ここを追加
/usr/sbin/amd -l syslog -c 60 /rmm /etc/amd.conf.removable ←ここを追加
fi ←ここを追加
;;
stop)
echo -n "Shutting down amd: "
killall -TERM amd
rm -f /var/lock/subsys/amd
echo amd
;;
*)
echo "Usage: amd {start|stop}"
exit 1
esac
exit 0
これで設定はおしまい。めでたしめでたし。
以下は余談(結構大事かも)。シンボリックなmount pointである/rmm/cdromにアクセスしてCD-0ROMがオートマウントされたあと,実際のmount pointである/mnt/cdromにアクセスすると実はちゃんとCD-ROMの中身が見える。ところが先回りして実際のmount pointである/mnt/cdromにアクセスしてもオートマウントは実行されない,従ってCD-ROMの中身は見えない(これは「Linuxネットワーク」p.240に書いてある)。オートマウントはあくまでもシンボリックなmount pointにアクセスして始めて起動されるのであった。注意せんといかんのは,次のような場合。
% cd /mnt/cdrom
とまず実際のmount pointである/mnt/cdromにアクセスする。当然オートマウントは実行されないので
% ls
で見ても中身はない。ここで「そやそやシンボリックなmount pointの方にアクセスせんと意味ないんや」とばかりに
% cd /rmm/cdrom
としても実は「/dev/cdrom already mounted or /mnt/cdrom busy」とか「Operation not permitted」と怒られてオートマウントしてくれない。なぜか?そらそうや,自分が/mnt/cdromにおるし,正に「/mnt/cdrom busy」なわけ。