2013年1月20日日曜日

Shared Object 入門

2013年1月10日木曜日

GitHub 覚え書き

2013年1月9日水曜日

perl の eval 〜 if 0 ってなんだ?

perl で書かれたスクリプトの先頭によくある、以下のようなもの。
最初、いったいなんだろう?と思った。
#! /usr/bin/perl -w

eval 'case $# in 0) exec /usr/bin/perl -S "$0";; *) exec /usr/bin/perl -S "$0" "$@";; esac'
    if 0;
ここでの eval というのは perl の関数ではなくて、シェルのコマンドであるというのがポイント。
どうもこれは #! を解釈してくれないような環境用の回避策らしい。

もし、このスクリプトが perl で実行されているのなら、
〜 if 0; という形なので(後置のif)
eval 'case $# in 0) exec /usr/bin/perl -S "$0";; *) exec /usr/bin/perl -S "$0" "$@";; esac'
の部分はまるまる無視され、何も起きない。そのまま残りのスクリプトを実行します。

一方、このスクリプトがシェルで実行されているのなら、
eval 'case $# in 0) exec /usr/bin/perl -S "$0";; *) exec /usr/bin/perl -S "$0" "$@";; esac'
がシェルによって実行されて、 /usr/bin/perl でこのスクリプトを実行し直すことになる。
    if 0;
にはたどり着きません。

perl の文は「;」区切り、シェルスクリプトは「改行」区切りというのをうまく利用しています。
よくもまあこんなことを考えた人がいたもんだ。

2012年12月19日水曜日

zfs のNFS機能を使ってみた

ZFS は NFS をサポートしているので、一応使えることを確認しました。

zfs-fuse ではなくて、以前 「zfsを使ってみた」で説明したように ZFS on Linux をインストールしています。

NFSサーバー側の設定

例えば、 tank/home パーティションを作り、 /export/home にマウントし、さらに NFS で共有という例でやってみます。

パーティションを作る。
# zfs create tank/home

マウントポイントを変更
# zfs set mountpoint=/export/home tank/home

RHEL/CentOS の場合、NFS server は標準でインストールされていると思いますが、もしインストールされていなければ、
# yum install nfs-utils
でインストールします。

nfs サービスが起動していることを確認しておきます。

ただし、設定自体は ZFS のプロパティで行うので、 /etc/exports の編集は不要です。

あとは、以下のような感じで sharenfs オプションを指定します。
# zfs set sharenfs="rw=@192.168.11.2,root_squash"

192.1681.11.2 の部分はクライアント側のIPアドレスに置きかえてください。/etc/hostsのホスト名でもOKです。
どうも no_root_squash がデフォルトになっているらしく、
root_squash の指定をしておかないと、クライアントのroot が サーバー側でもroot扱いになってしまう。
したがって sharenfs=on はセキュリティ上脆弱なので、やめておいた方がよいでしょう。


あとはクライアント側からは、以下のような感じでマウントできます。
# mount -t nfs 192.168.11.1:/export/home /mnt/

一応やってはみましたが、自分は NFSv4 を使いたいので、zfs の NFS機能は使わないかも。

Kerberos の ticket lifetime を変更する

Kerberos のチケットのlifetime を短くするのは簡単にできるのに、長くするのはできないなぁと思っていたら、チケットの有効期限は以下の4つの minimum 値で決まるらしい。

(1) サーバー側(KDC) のkdc.conf
RHEL/CentOSなら
/var/kerberos/krb5kdc/kdc.conf の
[realms]セクションのmax_life 設定。
Ubuntuなら
/etc/krb5kdc/kdc.conf にあります。

(2)クライアント側 の /etc/krb5.conf
[libdefaults] セクションの ticket_lifetime 設定

(3)ユーザープリンシパル の maxlife
kadmin: modprinc -maxlife 3day user01
などで変更

(4)サービスプリンシパルの maxlife
kadmin: modpronc -maxlife 3day krbtgt/MYDOMAIN.COM
などで変更します。



なお、addprinc で新しくプリンシパルを作成した時の maxlife の初期値は
kdc.conf の max_life 設定で決まるようです。

NFSv4 + Kerberos で セキュリティとユーザーマッピングを解決

Kerberos を使ってみる (RHEL/CentOS/Ubuntu編)