USBメモリの自動マウント


1.カーネルがUSBデバイスが検出すると、/proc/sys/kernel/hotplugに記述されている動作をする。
  (デフォルトでは/sbin/hotplugと記述されている。/sbin/hotplugはシェルスクリプト

2./sbin/hotplugはデバイスの種類を判別してetc/hotplug/[デバイス].agentを起動する
  (USBの場合は/etc/hotplug/usb.agentを起動する)

3.usb.agentが各種USBデバイスを判別して必要な処理を行う。ただしデフォルトでは
  マウスとキーボードくらいにしか対応していない。
  /etc/hotplug/usb.agentもシェルスクリプト

4.usb.distmap、usb.handmap、usb.usermapからデバイスの種類を判定する。

5.必要なローダブルモジュールをロードする
  (hotplug.functionのload_device)

6.デバイスに応じて/etc/hotplug/usb以下のSubsystemプログラムが実行される。
  プログラムがなければ実行されない。
  USBメモリの場合は/etc/hotplug/usb/usb-storageが実行される。

7.デバイスが切り離された場合には、REMOVERと呼ばれるプログラムが起動
  これは、/etc/hotplug/usb以下のSubsystemプログラムで用意しておく

 PHP+PostgreSQL

PostgreSQLインストール
# apt-get install postgresql postgresql-server postgresql-libs postgresql-devel pgperl
でインストール。他にもインストールするよう言われるのでそれもインストール。
phpと連携させるためのパッケージも必要。
# apt-get install php5-pgsql
でインストール。


・ユーザpostgres(1)作成
# useradd postgres
$ su - postgres
/home/postgres/.bash_profileに以下を追加。
export USERNAME BASH_ENV PATH LESSOPEN
export POSTGRES_HOME=/usr/local/pgsql
export PGLIB=/usr/lib/pgsql
export PGDATA=$POSTGRES_HOME/data
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH":"$PGLIB"

保存したら変更を反映。
$ source /home/postgres/.bash_profile


PostgreSQLディレクトリ作成
# mkdir /usr/local/pgsql
# chown postgres.postgres /usr/local/pgsql
・データベースクラスタ作成
# su - postgres
$ initdb
・設定ファイル編集
$ cd /usr/local/pgsql/data
$ cp pg_hba.conf pg_hba.conf.org
$ vi pg_hba.conf
pg_hba.conf------
host all all 127.0.0.1 255.255.255.255 trust

          • -

を追加(既にあれば追加しなくて良い)
PostgreSQLサーバ起動
$ postmaster -i -D /usr/local/pgsql/data &
(rootから実行する場合は
# su - postgres -c "postmaster -i -D /usr/local/pgsql/data &"



PostgreSQL用ユーザ(2)作成(どこで使うのかよく分からん)
$ createuser hex --encrypted
「データベース作成を許可するか?」にyes、
「ユーザの追加を許可するか?」にnoを選択。
(削除はdropuser


・データベース作成
$ createdb -W -E EUC_JP -O hex hesdb -S
パスワードを設定。
(削除はdropdb

プロファイルの場所を無理矢理変更する
前の日記でプロファイルの場所を変更できると書いたが、実は条件があって、
作成してから一度もログオンしていないユーザのプロファイルの場所は変えられない。


以下が理由。
作成されたユーザアカウントのプロファイルの場所等の情報は、レジストリ
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\ProfileList\
の下に記録されるが、アカウントが作成された時点では記録されず、
初回ログインの時に自動的にレジストリに記録され、ユーザプロファイル用のフォルダが作られる。
レジストリに記録されてなければ当然編集できないので、編集するには一度ログインする必要がある。


ただし、絶対にログインする必要があるかというとそうではなくて、新しいユーザ用の情報を
こちらが勝手にレジストリに書き込むことは可能。


とはいえ適当に書き込んでもうまくいかない。理由はSIDという、ユーザに一意に与えられる数字のせい。
SIDはユーザを識別するための数字で、ユーザアカウントが作成される時点に付けられる。
ユーザのログオン時、Windowsは認証が成功するとそのユーザのSIDと同じ値のキーがレジストリ
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\ProfileList\
にあるかどうか確認し、(S-1-5-21-1236...65543-1034のようなやたら長い値)あればそれを参照し、無ければ新しくキーを作成する。


そこで新しいユーザを作成した時に、新しいユーザに割り当てられるSIDを予測してレジストリに適切な値と共に
新しいユーザ用のユーザプロファイルの場所を追加してやると、新しいユーザの初回ログインの時から
こちらが指定したプロファイルの場所を使用させることができる。
(それだけのためにこんなに手間かける必要があるのか、というツッコミはさておき)


作成した新しいユーザにはどのようなSIDが割り当てられるのかというと、前回作成したユーザのSIDに1足した値。
前回作成したユーザのSIDがS-1-5-21-1236...65543-1034ならば新しいユーザには
S-1-5-21-1236...65543-1035が割り当てられる。


注意点が二つあって、
・SIDが割り当てられるのはユーザ作成時であること。(ユーザの初回ログオン時ではない)
・作成されたユーザには必ずSIDが一つ割り当てられ、たとえそのユーザを一度削除して再び同じ名前で
 ユーザを作成したとしても再び同じSIDが割り当てられることはないこと。


以上の二つに注意しながら、次のような手順で新しいユーザ用にレジストリを書き換える。
1. レジストリエディタを開き、
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\ProfileList\
まで移動する。
2. 既にあるユーザ用のレジストリキーをエクスポートし、適当な名前で保存する。
3. エクスポート元のキーの名前を、新しいユーザに割り当てられるであろうSIDに変更する。
4. その下のSIDの値のどこかに1を足す。(どこに1を足したらいいかは忘れた。)
5. 同じくProfileImagePathの値をこちらの指定するパスに変更する。
6. 最後にエクスポートしたレジストリキーをインポートする。


これで新しいユーザでログオンし、5で指定した場所にユーザと同じ名前のフォルダができていれば成功。

自サーバでCGI
Webサーバの設定ファイル/etc/httpd/conf/httpd.confを編集する。
まず、

#AddHandler cgi-script .cgi

コメントアウトを外す。これでWebサーバ上でCGIが使用可能になる。
安全のため、CGIが使用可能なディレクトリを制限する。


...


の後くらいに


Options Includes FollowSymLinks MultiViews ExecCGI
AllowOverride None
Order allow,deny
Allow from all


を追加。これで/home/httpd/voteディレクトリ以下でCGIが使用可能になる。
他のディレクトリでも使用可能にするにはOptionsでExecCGIを指定すればよい。


31さん提供のCGIを利用するときにつまづいた所

1.FTPCGI用ファイルを転送するときにバイナリモード転送してしまうとその後上手く動かない
 VineLinuxで使えるFTPクライアントlftpはデフォルトがバイナリモードなので、
アスキーモードを指定しないといけない。
> get -aあるいは> mget -aのように-aオプションをつけるとアスキーモードでの転送ができる。

2.perlのパスが違う
 31さん提供のCGI用ファイルにはperlのパスが/usr/local/bin/perlとなっているが、
VineLinuxでは/usr/bin/perlである(# which perlで確認できる)ため、
全ての.cgiファイルの先頭に書かれているパスを

#!/usr/local/bin/perl

から
#!/usr/bin/perl

に直す必要がある。

 IPSecで通信

2つのマシン間でIPSecによる通信を行う。
マシンA 192.168.120.1
マシンB 192.168.120.101


・FreeS/WANをインストール
ここRPMパッケージを(カーネルのバージョンを確認して)ダウンロード
インストールは特に問題なし


・設定
マシンAの/etc/ipsec.conf
#
config setup
 interfaces="ipsec0=eth0"
 klipsdebug=none
 plutodebug=none
 plutoload=%search
 plutostart=%search
#
conn %default
 type=transport
 right=192.168.120.1 /*rightに自分のアドレス*/
 authby=secret  /*事前共有鍵による認証*/
 pfs=no
#
conn sample
 left=192.168.120.101 /*leftに相手のアドレス*/
 auto=start


マシンBの/etc/ipsec.conf
config setup
 interfaces="ipsec0=eth0"
 klipsdebug=none
 plutodebug=none
 plutoload=%search
 plutostart=%search
#
conn %default
 type=transport
 right=192.168.120.101
 authby=secret
 pfs=no
#
conn sample
 left=192.168.120.1
 auto=start


・事前共有鍵ファイルの編集
/etc/ipsec.secrets
: PSK "yokohama"


・起動
/etc/init.d/ipsec start
これ以降暗号化通信