←EB/CDROM辞書編 ↑おもちゃ箱 →SSI/CGI編

¶ マウントは面倒くさいから amd 編

いちいちスーパユーザになって mount/umount の操作をするのが面倒臭くなっ たときには、amd (SunOSでいう automount) を使うと便利です。 NFS 専用と思いがちですが、フロッピーディスク、 CDROM, MO などのリムー バブルメディアでも使えます。 FreeBSD では msdosfs にも使っています し、私は試したことはありませんが UNIONFS にも使えるらしいです。
  1. amdとは?
  2. amd のオプションと動作
  3. 起動のテスト
  4. マップファイルの形式
  5. マップファイルの書き方
  6. マップファイルの例
  1. amdとは?

    ファイルシステムがアクセスされたときに自動的に mount/umount 操作を行なっ てくれるデーモン(daemon) のことです。本来 UFS, NFS を自動的にマウント するために使いますが、それ以外のファイルシステムでも使えます。 amd は 4.4BSD の他いろいろなシステムをサポートしています。
  2. amd のオプションと動作

    amd は、FreeBSD では /etc/rc.conf の amd_enable の行を
    amd_enable="YES"
    とすると起動時に有効になります。 amd に与えるオプションは、同じ rc.conf 内で
    amd_flags="-a mount_point -w interval -k i386 -d domain -l logfile directory mapname"
    のように指定します。mount_point は実際にマウントされるポイントですが、 directory 以下へのアクセスが amd が動作するトリガーとなり、マウント動 作が行なわれます。interval はアクセスがない場合に、自動的にアン マウントされるまでの時間で、 logfile はログが記録されるファイル ですが、syslog とした場合だけは syslog(system log daemon)にログ が記録されます。-d はローカルドメイン名ですが、hostname コマンド でドメイン名が含まれるホスト名が出る場合は普通不要です。
    スタンドアローンもしくは NIS を使っていない数台程度の小さな LAN では、このくらいのオプションで足りますが、amd には沢山のオプショ ンがあるので、マニュアルをよく読んで使って下さい。
    (
    amd の日本語マニュアルもあります)
    -a [directory]実際のマウント位置
    -c [duration]ディレクトリ名をキャッシュする秒数 (デフォルトは 300)
    -dドメイン名
    -k [kernel-arch]カーネルアーキテクチャ (PC-AT互換機なら i386)
    -l [logfile]ログファイル名
    -nホスト名の正規化
    -p起動時プロセス ID を標準出力に出す
    -r既にマウントしているものを再マウントする
    -t [interval.interval]NFS/カーネルRPC/UDPのタイムアウト
    -vバージョン情報
    -w [interval]キャッシュする時間を秒で指定 (デフォルトは 120)
    -x [logoption]ログオプション [fatal|error|user|warn|info|map|stats|all]
    -y [domain]NIS ドメイン
    -C [clustername]クラスタ名
    -D [option]デバッグオプション[all | no]
    例えば私の自宅の環境では、
    amd_flags="-a /net -c 1800 -w 300 -k i386 -x error -l syslog /mnt /etc/amd.map"

    のように起動時オプションを指定しています。FreeBSD-2.2.6 では、 /etc/newsyslog.conf に
    /var/log/amd.log                        664  7     100  *     Z
    
    などと書かれているはずなので、syslog のための設定は要りませんが、 スーパユーザで touch /var/log/amd.log としてログファイルを作って おく必要があります。通常オーナは root 、グループは bin で良いと 思います。
  3. 起動のテスト

    では、最初のテストとしてフロッピーディスクをオートマウントしてみ ましょう。 su - としてスーパユーザになって、 3.5インチ 1.44MBのフロッピー ディスクをドライブに入れ、以下のように ufs のファイルシステムを 作っておきます。 # disklabel -w -r /dev/fd0c fd1440
    # newfs /dev/rfd0c

    次に、以下を記述したファイルを作って、/etc/amd.map として置いて みて下さい。
    /defaults       type:=host;fs:=${autodir}/${rhost};rhost:=${key}
    *               opts:=rw,grpid,resvport,nosuid,nodev
    localhost       type:=link;fs:=${host}
    
    fd              type:=program;fs:=/${key};\
                    mount:="/sbin/mount mount /dev/fd0c ${fs}";\
                    unmount:="/sbin/umount umount ${fs}"
    dosfd		type:=program;fs:=/${key};\
    		mount:="/sbin/mount_msdos mount_msdos \
    		/dev/fd0c ${fs}";\
    		unmount:="/sbin/umount umount ${fs}"
    
    その後、
    # amd -p -a /net -c 1800 -d マシンのドメイン名 -k i386 -l syslog -x warn /mnt /etc/amd.map > /var/run/amd.pid
    とすれば、 amd を手動で起動することができます。
    それでは、テストです。ufs または DOS でフォーマットしたフロッピー ディスクを用意して下さい。ufs のフロッピーなら、
    # ls /mnt/fd

    DOSのフロッピーなら、 # ls /mnt/dosfd

    としてみましょう。
    (DOSのフロッピーの場合、/mnt/fd を /mnt/dosfd に読み替えて下さい)
    何もメッセージが出ずにコマンドラインプロンプト が出れば、うまくいったはずです。試しに
    # cp 小さなファイル /mnt/fd
    # ls -l /mnt/fd/*
    などとして確認してみましょう。時間が経てば umount されるはずなの で、それも確認すべきですが、急ぐなら
    # amq -u /mnt/fd
    として強制的にアンマウントさせることができます。 それでは、
    # kill `cat /var/run/amd.pid`
    として、この amd デーモンを殺しておいて、amd.map に自分に必要な だけの記述を追加しましょう。 例えば、 ls /mnt/cdrom として CDROM をオートマウントしておいて、 # ln -s /mnt/cdrom /cd
    としておけば、次回から /cd をアクセスするだけで CD がマウント されるようになり、便利ではありますが、df コマンドなどの実行の 際にもマウントしようとすることになるので、このやり方はデメリット も考慮した上で使った方が良いと思います。
  4. マップファイルの形式

    どこをアクセスすると、どのファイルシステムがマウントされるかとい う設定をあらかじめマップファイルに書いておかなければ amd は使え ません。 マップファイルの文法は、原則として以下の通りです。
    • 行先頭の '#' はコメント行と見なされる。
    • 定義は一行で行なわれ
      location definition
      となる。
    • definition には ';' で区切った複数の項目を書くことが でき、行末に '\' を入れると、改行が無視されて、次の行も definition の続きと見なされる。(ただし、'\'の前に空白を 入れないように注意すること。空白が入ると意味が変わる)
    • location はマウントされるディレクトリ名だが、ワイルドカー ドが使える。例えば、 home/ryo2/doc をアクセスした場合、マップ ファイルにある以下のすべてのキーエントリがマッチするため、 いずれのエントリも有効になる。
      home/ryo2/doc
      home/ryo2/*
      home/*
      *
    • location に '/default' を指定すると、グローバルマップと認 識されすべてのエントリに対して有効となる。
    • value には、更に
      parameter:=value
      parameter==value
      parameter!=value
      のように ':=', '==', '!=' でつないで値を指定できる。 ':=' は代入を意味し、'==' は等価であるかどうかを、 '!=' は否定を意味する。
    • 自分のホスト名などが、${変数名} で置換されます。例えば、 ${host} はローカルホスト名に、${key} は そのエントリの名前 (location) で置換されます。
    このパラメータ部分がまた柔軟性に富んでおり、 いろいろな使い方ができます。
    ここでは最低限の入門的な使い方だけ を挙げておきますので、バリバリ使いこなしたい方は、FreeBSD では是非
    jman amdinfo -f /usr/share/info/amdref.info.gz をじっくり読んでからトライしてみて下さい。
  5. マップファイルの書き方

    ファイルシステムの型を指定するパラメータ type には ufs, nfs の他、 link, program, auto, direct を指定することができます。
    ■NFS の場合
    • rhost
      リモートファイルサーバのホスト名。これは DNS や NIS で名前 が引けるか、/etc/hosts に記述されたものでなければな らず、IP アドレスは受け付けません。デフォルトは ${host} であり、これはローカルホスト名で置換されます。
    • rfs
      リモートファイルシステム。
    NFS のエントリの例を挙げてみます。
    	    jsp    host!=charm;type:=nfs;rhost:=charm;rfs:=/home/charm;sublink:=jsp
    	    
    この例では charm というホスト以外では jsp というディレクト リに、NFSファイルサーバ cham 内の /home/charm をマウントし ます。
    この amd が走っているホストの名前が、foo とすると、 foo:/(マウントポイント)/jsp をアクセスしたときに ホスト charm 内の /home/charm が見えることになります。
    ■type:=nfs の例
    例えば、私のところでは
    quill/home	host!=quill;type:=nfs;rhost:=quill;rfs:=/home \
    		host==quill;type:=ufs;dev:=/dev/sd0s2f
    quill/usr	host!=quill;type:=nfs;rhost:=quill;rfs:=/usr \
    		host==quill;type:=ufs;dev:=/dev/sd0s2g
    quill/var	host!=quill;type:=nfs;rhost:=quill;rfs:=/var \
    		host==quill;type:=ufs;dev:=/dev/sd0s2e
    
    などとしています。この quill というマシンは自宅のデスクトップマ シンですが、全く同じエントリをノートPCの側にも入れています。 ノートPCの amdでは "host!=quill" が該当するため、リモートホスト quill の /var を NFS で参照することになるわけで、マシン毎に書き 換えたりせずに同じ amd.map で済むのが便利なところです。
    ■program の場合
    mount
    cdrom		type:=program;fs:=/${key};\
                    mount:="/sbin/mount_cd9660 mount_cd9660 -o nosuid \
                    /dev/wcd0c ${fs}";\
                    opts:=r;unmount:="/sbin/umount umount ${fs}"
    
    のようにして CDROMも amd でマウントできます。MO も同様です。 これは IDE接続(ATAPI)の CDROM の場合なので、SCSI CDROM や他の CDを使って いる場合は、/etc/fstab のデバイス名を参考に、自分のシステムに合わせて 設定して下さい。
    type:=link, type:=auto, type:=direct に関しては、私は使ったこと がないので止めておきます。嘘を書くといけませんし (^^;