michihide's blog

技術メモおよび雑感

GPG鍵の作成

m-hotta@gaia:~$ gpg --gen-key
(後は指示に従う)
十分な長さの乱数が得られません。OSがもっと乱雑さを収集
できるよう、何かしてください! (あと281バイトいります)
(ここで処理が止まるので、別の端末から以下のように重い処理を動かす)
m-hotta@gaia:~$ dd if=/dev/random of=/dev/null bs=100000
(2-3分後に処理が進んで完了する)
【破棄証明書の生成】
m-hotta@gaia:~$ gpg -o /naisho/revcert.asc --gen-revoke 'HOTTA Michihide'
【公開鍵のエクスポート】
m-hotta@gaia:~$ gpg -o .gnupg/pubkey.asc -a --export 'HOTTA Michihide'

pscpしたファイルがどこかへ行った

Windows7 上の pscpLinux からファイルをコピーする。コピー自体は正常終了するが、

PS C:\Program Files\PuTTY> pscp celsior:/tmp/samba-settings.tar.gz .
samba-settings.tar.gz     | 3 kB |   3.8 kB/s | ETA: 00:00:00 | 100%
PS C:\Program Files\PuTTY> dir *gz

。。。ファイルが見つからない(汗)
最初は PowerShell が原因かと思ったが、コマンドプロンプト(cmd.exe)上でやっても同じだった。
今度は置き場所(target dir)を変えてみる。

PS C:\Program Files\PuTTY> pscp celsior:/tmp/samba-settings.tar.gz \
C:\Users\hotta\Desktop
samba-settings.tar.gz     | 3 kB |   3.8 kB/s | ETA: 00:00:00 | 100%
PS C:\Program Files\PuTTY> dir C:\Users\hotta\Desktop\*gz
 Mode         LastWriteTime      Length Name
 ----         -----------------  ------ ----
 -a---        2010/01/20 9:09   3904 samba-settings.tar.gz

デスクトップ上には置けた。ドットの扱いが何か違うのかな?

検索してみたら、

C:\Users\
 hotta\
  AppData\
   Local\
    VirtualStore\
     Program Files\
      PuTTY

というところに入っていた。どうやってアクセスしろと?

Sambaドキュメント翻訳環境

経緯

Samba Document 翻訳の際、xml レベルの文法チェックのために必要な環境を構築した
時のメモです。例によって環境は Cent OS 5.x です。標準の CentOS-Base.repoの
範囲で入るものについては言及していません。
m-hotta@gaia:~/rpm/BUILD/samba-3.4.3/docs-xml$ ./configure
(前略)
Summary:
                          • -
Building the LaTeX versions requires : inkscape makeindex Building the PDF versions requires : inkscape pdflatex epstopdf thumbpdf inkscape makeindex Building the PostScript versions requires : inkscape pngtopnm pnmtops latex dvips inkscape makeindex Building the HTML versions requires : inkscape Building the HTML Help versions requires : inkscape Building the pearson-compatible XML requires : inkscape Building the plucker versions requires : inkscape plucker-build inkscape Building the PDF versions thru FO requires : inkscape fop Building the TexInfo versions requires : docbook2x-texi Building the TexInfo Info versions requires : makeinfo Building the list of undocumented options requires : SAMBASOURCEDIR Building the text versions requires : html2text inkscape You will be able to build: htmlman3 manpages3 configure: creating ./config.status config.status: creating Makefile.settings config.status: creating build/catalog.xml この環境では manpages までしかビルドできないようです。

rpmforge からパッケージを持ってこれるようにする

RPMforgeリポジトリ導入(RPMforge)の手順にしたがって rpmforge-release 
パッケージを導入します。rpmforge.repo では enabled=0 になっているので、
rpmforge のパッケージを指定するには yum コマンドで --enablerepo=rpmforge 
オプションが必要です。

必要なツールを導入

# yum --enablerepo=rpmforge install inkscape
(これはうまくインストールできました)
# yum --enablerepo=rpmforge install docbook2x-texi
517 packages excluded due to repository priority protections
これ以外のパッケージについても、ことごとくこのメッセージ。
さすがに 517 個も入れ替えると、もはやそれは Cent OS とは呼べないかも?
m-hotta@gaia:~/rpm/BUILD/samba-3.4.3/docs-xml$ ./configure
Summary:
                          • -
Building the LaTeX versions requires : makeindex Building the PDF versions requires : pdflatex epstopdf thumbpdf makeindex Building the PostScript versions requires : pngtopnm pnmtops latex dvips makeindex Building the plucker versions requires : plucker-build Building the PDF versions thru FO requires : fop Building the TexInfo versions requires : docbook2x-texi Building the TexInfo Info versions requires : makeinfo Building the list of undocumented options requires : SAMBASOURCEDIR Building the text versions requires : html2text You will be able to build: html htmlhelp htmlman3 manpages3 pearson configure: creating ./config.status config.status: creating Makefile.settings config.status: creating build/catalog.xml html まではビルドできるようになったみたいなので、とりあえずこれで妥協。

XML Catalog のチューニング

これだけでもとりあえず動きはしますが、ビルド中に個々のコマンドがインターネット上の
大量のファイルを参照しますので、遅くて使い物になりません。これらのファイルをローカルに
キャッシュするようにします。詳細は docs-xml/README の中の
 Help! Building the docs generates a lot of HTTP traffic...というところに書いてあります。
$ wget -m -np http://docbook.sourceforge.net/release/xsl/current/
$ wget -m -nd http://www.samba.org/samba/DTD/passdb
$ wget -m -nd http://www.samba.org/samba/DTD/samba-doc
$ wget -m -nd http://www.samba.org/samba/DTD/samba.entities
$ ls
docbook.sourceforge.net www.samba.org 
これらのディレクトリを /etc/xml/catalog で指定します。
# vi /etc/xml/catalog
(以下の行を挿入)
  <rewriteURI uriStartString="http://docbook.sourceforge.net/release/xsl/current/"
    rewritePrefix="/home/m-hotta/docbook.sourceforge.net/release/xsl/current/"/>
  <rewriteURI uriStartString="http://www.samba.org/samba/DTD"
    rewritePrefix="file:///home/m-hotta/www.samba.org/samba/DTD"/>

確認

m-hotta@gaia:~/rpm/BUILD/samba-3.4.3/docs-xml$ make html
inkscape -z -f Samba3-ByExample/images/Charity-Network.svg --export-png=Samba3-ByExample/images/Charity-Network.png

(inkscape:16233): Gdk-CRITICAL **: gdk_display_list_devices: assertion `GDK_IS_DISPLAY (display)' failed
Background RRGGBBAA: ffffff00
Area 0:0:420.945:336.083 exported to 421 x 336 pixels (90 dpi)
Bitmap saved as: Samba3-ByExample/images/Charity-Network.png
png ファイルを作る際にエラーが出ますが、これはX 環境でないからだろうと勝手に判断して無視
(中略)
Writing output/htmldocs/Samba3-HOWTO/install.html for chapter(install)
(中略)
cp htmldocs.html output/htmldocs/index.html
こんなメッセージが出ているので、少なくとも xml のパースだけは通っているんでしょう。
文法チェックだけならこれでOKそう。

samba 3.4.3 を試してみる

ビルド

Cent OS 5.4 相当の環境で、Samba の安定最新版を試してみるテストです。
tar ball を開いてもよくわからない状態で、configure スクリプトも直下にはない。
どうしたものかと思ってたのですが、中を探ってみると
samba-3.4.3/packaging/RHEL/samba.spec
というのを発見。ダメ元で
$ rpm -ba samba.spec
とかやってみたら、見事に一発でビルド完了。楽になったものです。

導入

できたバイナリをテスト用の別ホストにコピーして
$ sudo yum localinstall samba*
とかやってみたら、
Package samba-common-3.4.3-1.i386.rpm is not signed
と怒られた。man yum と相談する。
$ sudo yum --nogpgcheck localinstall samba*
で無事に導入完了。

MS-DFSを試してみる

せっかくなので、以前から一度試してみたいと思っていた MS-DFS(分散ファイルシステム)
を試してみました。要は、Samba サーバ間のシンボリックリンクを実現するもの、という理解
でも、あながち間違いではなさそうです。もっとも、元々は Windows Server の機能です。
青字のところが DFS 固有の設定となります。
DFS サーバ(trueno)の設定
root@trueno:/etc/samba# cat smb.conf
[global]
include = /etc/samba/smb.conf.common
include = /etc/samba/smb.conf.bdc
netbios name = fs
host msdfs = yes

[dfs]
path = /export/dfsroot
msdfs root = yes

root@trueno:/export/dfsroot# ln -s msdfs:celsior\\share celsior_share

root@trueno:/export/dfsroot# ls -l
total 0
lrwxrwxrwx 1 root root 19 Nov 17 15:53 celsior_share -> msdfs:celsior\share
リンク先サーバ(celsior)の設定 - DFS固有の設定は不要
root@celsior:/etc/samba# cat smb.conf
[global]
include = /etc/samba/smb.conf.common
include = /etc/samba/smb.conf.bdc
netbios name = celsior

[share]
path = /var/samba/celsior

m-hotta@celsior:~$ ls -l /var/samba/celsior
合計 0
 -rw-r--r-- 1 root root 0 11月 17 17:11 新しいファイル
CIFSクライアント(sprinter)から確認 - Windowsからの確認でももちろんOK
m-hotta@sprinter:~$ host fs
fs.example.com is an alias for trueno.int.example.com.
trueno.int.example.com has address 10.27.4.21

m-hotta@sprinter:~$ smbclient -U hotta //fs/dfs
Password:
Domain=[LUNA] OS=[Unix] Server=[Samba 3.4.3]
smb: \> ls
  .                                   D        0  Tue Nov 17 15:53:45 2009
  ..                                  D        0  Tue Nov 17 15:46:53 2009
  celsior_share                       D        0  Tue Nov 17 15:53:45 2009

                50340 blocks of size 131072. 29609 blocks available
smb: \> cd celsior_share
smb: \celsior_share\> ls
  .                                   D        0  Tue Nov 17 17:11:57 2009
  ..                                  D        0  Tue Nov 17 14:13:32 2009
  新しいファイル                        0  Tue Nov 17 17:11:57 2009

                37382 blocks of size 524288. 28646 blocks available
おまけ
Windows でも同じですが)cd するときに最初重くなるので、リダイレクト&
認証処理は、結構重たい処理なのかもしれない。

phpでセッションの情報が消える

【概要】

  • 現象
    • PHPで書いた申請フォームで、ユーザIDによる認証を行っているが、時々申請者のメールアドレスが""@example.comとなることがある。
  • 原因
    • 入力に時間がかかりすぎたためにセッションがタイムアウトし、セッション情報(ここではユーザID)が削除されてしまっていた。
  • 対策
    • セッションの有効期限を長くする。

【セッションの有効期限とガーベッジ・コレクション

  • セッションの有効期限は、session.gc_maxlifetime パラメータで制御されている。デフォルトは24分。
    • - GCはGarbage Collection(ごみ掃除)の略。
    • - GC とは、不要になったメモリ領域やファイルを削除すること。
    • - ほとんどのプログラム言語の実行部分において、自動的に行われることが多い。
    • - C 言語など一部の GC 機構のない言語では、プログラマが自分で領域の確保/解放を行わなければならない。
  • このパラメータは、セッション情報をサーバ上で残すべき時間を指定する
  • これを超えると、消される「可能性」が生じる(必ず消えるとは限らない)
  • セッション情報は、デフォルト(session.save_handler=files)ではファイルに格納されている

【セッションが消される契機(トリガー)】

  • 同じAache+PHPのバイナリを共有する、いずれかのページ/アプリケーションに誰かがアクセスした時
    • 問題が起きたのと同じアプリケーションとは限らない
  • アクセスごとに毎回 GC をやらせるとシステムに負荷がかかるため、毎回 GC を行うかどうかの判定(確率計算)が行われる
    • - session.gc_probability ÷ session.gc_divisor の値が 1 になったら削除
    • - デフォルトでは 1 ÷ 1000 =1000分の1の確率で、期限切れのセッションファイルが削除される

【問題点】

  • 現象
    • Apache の VirtualHost の設定で session.gc_maxlifetime を延ばしても効かないことがある
  • 原因
    • 同じホスト(かつ、同じセッション保持用ディレクトリ)を共有するすべての VirtualHost のうち一つでもこの設定がなされていないと、その設定していない VirtualHost にアクセスがあった場合、php.ini のデフォルト 値が有効となってしまうため。

【対策(1)】

  • 対策
    • /etc/php.ini を修正し、session.gc_maxlifetime を延ばす
  • 利点
    • 簡単
  • 欠点
    1. 1.影響が全 VirtualHost に及ぶ
    2. 2.yum updateによりphpのバージョンが上がると、php.iniが上書きされてしまう可能性あり

【対策(2) - 公式マニュアルではこちらを推奨】

  • 対策
    • セッションの格納位置(session.save_path)の設定を、各 VirtualHost ごとに別々にする
  • 利点
    • VirtualHost間の相互影響範囲を限定できる
  • 欠点
    • あらかじめそれぞれのディレクトリを用意する必要がある

【備考】

  • 多くのセッション情報(セッションファイル)の中でどのセッション情報を使うかは、クライアントが送りつけてくるクッキー(Set-cookie:ヘッダ)で決まる。
  • たとえセッション情報の有効期限が session.gc_maxlifetime に達していなくても、クライアントがクッキーを送ってこない(もしくは別のクッキーを送って来た)場合、別セッション扱いとなり、セッション情報は引き継がれない。
  • クライアントが(ブラウザで保持している)クッキーを送るかどうかは、以下のパラメータで決まる。
    • session.cookie_lifetime : クッキーの有効期限(単位:秒、デフォルト180)

【参考資料】
以下のサイトを参考にさせていただきました:
セッションの有効期間とか設定とか挙動とかを調べました