2007年10月アーカイブ

CentOS5.0でIPマスカレード

Linuxサーバでインターネットに繋げるので、プライベートLAN上のPCからインターネットに出て行くパケットをIPマスカレードしなければいけない。

[root@ml115 ~]# iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
[root@ml115 ~]# iptables -A RH-Firewall-1-INPUT -i eth0 -j ACCEPT
[root@ml115 ~]# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
RH-Firewall-1-INPUT all -- anywhere anywhere

Chain FORWARD (policy ACCEPT)
target prot opt source destination
RH-Firewall-1-INPUT all -- anywhere anywhere

Chain OUTPUT (policy ACCEPT)
target prot opt source destination

Chain RH-Firewall-1-INPUT (2 references)
target prot opt source destination
ACCEPT all -- anywhere anywhere
ACCEPT icmp -- anywhere anywhere icmp any
ACCEPT esp -- anywhere anywhere
ACCEPT ah -- anywhere anywhere
ACCEPT udp -- anywhere 224.0.0.251 udp dpt:mdns
ACCEPT udp -- anywhere anywhere udp dpt:ipp
ACCEPT tcp -- anywhere anywhere tcp dpt:ipp
ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:ssh
REJECT all -- anywhere anywhere reject-with icmp-host-prohibited
ACCEPT all -- anywhere anywhere
[root@ml115 ~]#
[root@ml115 ~]# service iptables save
Saving firewall rules to /etc/sysconfig/iptables: [ OK ]
[root@ml115 ~]#
[root@ml115 ~]# cat /etc/sysconfig/iptables
# Generated by iptables-save v1.3.5 on Mon Oct 29 04:52:14 2007
*nat
:PREROUTING ACCEPT [641:202508]
:POSTROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [1:70]
-A POSTROUTING -o ppp0 -j MASQUERADE
COMMIT
# Completed on Mon Oct 29 04:52:14 2007
# Generated by iptables-save v1.3.5 on Mon Oct 29 04:52:14 2007
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [718:77534]
:RH-Firewall-1-INPUT - [0:0]
-A INPUT -j RH-Firewall-1-INPUT
-A FORWARD -j RH-Firewall-1-INPUT
-A RH-Firewall-1-INPUT -i lo -j ACCEPT
-A RH-Firewall-1-INPUT -p icmp -m icmp --icmp-type any -j ACCEPT
-A RH-Firewall-1-INPUT -p esp -j ACCEPT
-A RH-Firewall-1-INPUT -p ah -j ACCEPT
-A RH-Firewall-1-INPUT -d 224.0.0.251 -p udp -m udp --dport 5353 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport 10022 -j ACCEPT
-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited
-A RH-Firewall-1-INPUT -i eth0 -j ACCEPT
COMMIT
# Completed on Mon Oct 29 04:52:14 2007
[root@ml115 ~]#

CentOS5.0でPPPoEを終端する

Bフレッツに接続するためにATerm WR6650Sを使っているが、いろいろ不満がある。普段扱っているCiscoと比較するのも酷な話ではあるが、設定を変更するたびに再起動しなければいけないのは許せない。当サイトはダイナミックDNSを使っているので、そのたびにIPが変ってしまうのだ。またフィルタやポートマッピングの機能はあるのだが設定がさっぱり判らない。ここははるかに高機能なLinuxで直接繋いでしまうのがいいだろう。

まずはPPPoEを終端する設定をする。使用しているML115は(そして普通のPCはたいてい)Ethernetは1ポートしかないので、WAN接続用にもう1ポート増設しなければいけない。いまどきのネットワークインターフェースカード(NIC)はたいていLinuxで利用可能なのだが、ML115の方がPCIスロットが3.3V駆動専用という制限がある。それでも秋葉原に行けばいくらでも安いバルク品が手に入るのだが、近くのPCショップでコレガのCG-LAPCIGTRを買った。普通に起動したら認識をした。

①インターフェースの設定

[root@ml115 ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth1
DEVICE=eth1
HWADDR=00:0a:79:98:ad:b2

デフォルトでDHCPが有効になっていたので、これをはずす。

②PPPoEの設定スクリプトを使って設定をする。

[root@ml115 ~]# adsl-setup

Welcome to the ADSL client setup. First, I will run some checks on
your system to make sure the PPPoE client is installed properly...


LOGIN NAME

Enter your Login Name (default root): ABC01234@nifty.com

INTERFACE

Enter the Ethernet interface connected to the ADSL modem
For Solaris, this is likely to be something like /dev/hme0.
For Linux, it will be ethX, where 'X' is a number.
(default eth0): eth1

Do you want the link to come up on demand, or stay up continuously?
If you want it to come up on demand, enter the idle time in seconds
after which the link should be dropped. If you want the link to
stay up permanently, enter 'no' (two letters, lower-case.)
NOTE: Demand-activated links do not interact well with dynamic IP
addresses. You may have some problems with demand-activated links.
Enter the demand value (default no): no

DNS

Please enter the IP address of your ISP's primary DNS server.
If your ISP claims that 'the server will provide dynamic DNS addresses',
enter 'server' (all lower-case) here.
If you just press enter, I will assume you know what you are
doing and not modify your DNS setup.
Enter the DNS information here: server

PASSWORD

Please enter your Password:
Please re-enter your Password:

USERCTRL

Please enter 'yes' (three letters, lower-case.) if you want to allow
normal user to start or stop DSL connection (default yes): no

FIREWALLING

Please choose the firewall rules to use. Note that these rules are
very basic. You are strongly encouraged to use a more sophisticated
firewall setup; however, these will provide basic security. If you
are running any servers on your machine, you must choose 'NONE' and
set up firewalling yourself. Otherwise, the firewall rules will deny
access to all standard servers like Web, e-mail, ftp, etc. If you
are using SSH, the rules will block outgoing SSH connections which
allocate a privileged source port.

The firewall choices are:
0 - NONE: This script will not set any firewall rules. You are responsible
for ensuring the security of your machine. You are STRONGLY
recommended to use some kind of firewall rules.
1 - STANDALONE: Appropriate for a basic stand-alone web-surfing workstation
2 - MASQUERADE: Appropriate for a machine acting as an Internet gateway
for a LAN
Choose a type of firewall (0-2): 0

Start this connection at boot time

Do you want to start this connection at boot time?
Please enter no or yes (default no):yes

** Summary of what you entered **

Ethernet Interface: eth1
User name: GEF06466@nifty.com
Activate-on-demand: No
DNS addresses: Supplied by ISP's server
Firewalling: NONE
User Control: no
Accept these settings and adjust configuration files (y/n)? y
Adjusting /etc/sysconfig/network-scripts/ifcfg-ppp0
Adjusting /etc/ppp/chap-secrets and /etc/ppp/pap-secrets
(But first backing it up to /etc/ppp/chap-secrets.bak)
(But first backing it up to /etc/ppp/pap-secrets.bak)

Congratulations, it should be all set up!

Type '/sbin/ifup ppp0' to bring up your xDSL link and '/sbin/ifdown ppp0'
to bring it down.
Type '/sbin/adsl-status /etc/sysconfig/network-scripts/ifcfg-ppp0'
to see the link status.

[root@ml115 ~]#

出来上がった設定ファイルは以下のとおり。

[root@ml115 ~]# cat /etc/sysconfig/network-scripts/ifcfg-ppp0
USERCTL=no
BOOTPROTO=dialup
NAME=DSLppp0
DEVICE=ppp0
TYPE=xDSL
ONBOOT=yes
PIDFILE=/var/run/pppoe-adsl.pid
FIREWALL=MASQUERADE
PING=.
PPPOE_TIMEOUT=80
LCP_FAILURE=3
LCP_INTERVAL=20
CLAMPMSS=1412
CONNECT_POLL=6
CONNECT_TIMEOUT=60
DEFROUTE=yes
SYNCHRONOUS=no
ETH=eth1
PROVIDER=DSLppp0
USER=ABC01234@nifty.com
PEERDNS=yes
DEMAND=no

パスワードは平文で保存されている。
[root@ml115 ~]# cat /etc/ppp/chap-secrets
# Secrets for authentication using CHAP
# client server secret IP addresses
####### redhat-config-network will overwrite this part!!! (begin) ##########
####### redhat-config-network will overwrite this part!!! (end) ############
"ABC01234@nifty.com" * "PASSWORD"

[root@ml115 ~]# cat /etc/ppp/pap-secrets
# Secrets for authentication using PAP
# client server secret IP addresses
####### redhat-config-network will overwrite this part!!! (begin) ##########
####### redhat-config-network will overwrite this part!!! (end) ############
"ABC01234@nifty.com" * "PASSWORD"
[root@ml115 ~]#

③eth1にVDSL(もしくはADSL)モデルからのEthernetをさして、PPP0を上げる。

[root@ml115 ~]# ifup ppp0

なお、Atermから差し替えてすぐにppp0を上げると認証に失敗をしていた。数分程度待ってからやると一発で接続が成功する。想像だがプロバイダ側で前のPPPoEセッションが残っていて、二重接続とみなして失敗させているのだと思う。数分たって前のセッションがタイムアウトして切れたら、新しいセッションがつながる。

[root@ml115 ~]# ifconfig ppp0
ppp0 Link encap:Point-to-Point Protocol
inet addr:121.92.64.61 P-t-P:133.160.133.14 Mask:255.255.255.255
UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1454 Metric:1
RX packets:3 errors:0 dropped:0 overruns:0 frame:0
TX packets:3 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:3
RX bytes:54 (54.0 b) TX bytes:54 (54.0 b)

[root@ml115 ~]# tail -f /var/log/messages Oct 29 04:10:41 ml115 pppd[6671]: pppd 2.4.4 started by root, uid 0 Oct 29 04:10:41 ml115 pppd[6671]: Using interface ppp0 Oct 29 04:10:41 ml115 pppd[6671]: Connect: ppp0 <--> /dev/pts/6 Oct 29 04:10:42 ml115 pppoe[6672]: PPP session is 57280 Oct 29 04:10:44 ml115 pppd[6671]: CHAP authentication succeeded Oct 29 04:10:44 ml115 pppd[6671]: CHAP authentication succeeded Oct 29 04:10:44 ml115 pppd[6671]: local IP address 121.92.64.61 Oct 29 04:10:44 ml115 pppd[6671]: remote IP address 133.160.133.14 Oct 29 04:10:44 ml115 pppd[6671]: primary DNS address 202.248.0.42 Oct 29 04:10:44 ml115 pppd[6671]: secondary DNS address 210.131.113.126 Oct 29 04:10:44 ml115 NET[6717]: /etc/sysconfig/network-scripts/ifup-post : updated /etc/resolv.conf
[root@ml115 ~]# cat /etc/resolv.conf nameserver 202.248.0.42 nameserver 210.131.113.126
[root@ml115 ~]# route Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 133.160.133.14 * 255.255.255.255 UH 0 0 0 ppp0 192.168.0.0 * 255.255.255.0 U 0 0 0 eth0 169.254.0.0 * 255.255.0.0 U 0 0 0 eth0 default * 0.0.0.0 U 0 0 0 ppp0
[root@ml115 ~]# ping www.asahi.com PING www.gslb.asahi.com (210.173.169.217) 56(84) bytes of data. From 210.173.162.220 icmp_seq=2 Packet filtered From 210.173.162.220 icmp_seq=3 Packet filtered

--- www.gslb.asahi.com ping statistics ---
3 packets transmitted, 0 received, +2 errors, 100% packet loss, time 1998ms


せっかくXenでサーバを仮想化しているのに、各仮想サーバにディスク容量を多めに割り当てておくのはもったいない。Xenはファイルをディスクとして扱えるので、新しいファイルを作ればディスクとして使うことができる。

①イメージファイルを作成

[root@ml115 ~]# dd if=/dev/zero of=/var/lib/xen/images/storage1-1 bs=1M count=4096
4096+0 records in
4096+0 records out
4294967296 bytes (4.3 GB) copied, 88.3003 seconds, 48.6 MB/s

②イメージファイルにファイルシステムを作成

[root@ml115 ~]# mke2fs -j -F /var/lib/xen/images/storage1-1
mke2fs 1.39 (29-May-2006)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
524288 inodes, 1048576 blocks
52428 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=1073741824
32 block groups
32768 blocks per group, 32768 fragments per group
16384 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736

Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 21 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
[root@ml115 ~]#

③イメージファイルを仮想サーバに繋げる

[root@ml115 ~]# xm block-attach storage1 file://var/lib/xen/images/storage1-1 /dev/hda w

これは仮想サーバを再起動すると外れてしまうので、上手く動いたら設定ファイル(/etc/xen/storage1)に設定を追加する。
disk = [ 'tap:aio:/opt/xen/centos5,xvda,w', 'file:/var/lib/xen/images/storage1-1,hda,w']


④仮想サーバでマウントする

[root@storage1 ~]# mount /dev/hda /home

⑤確認する

[root@storage1 ~]# ls /home
lost+found This_is_New_Disk.txt

ちなみに『This_is_New_Disk.txt』は私がわかりやすいように作ったファイルで、自動生成されるものではない。

⑥仮想サーバのfstabを編集

[root@storage1 ~]# vi /etc/fstab
...
/dev/hda /home ext3 default 0 0
...

CentOS5.0でNFSv4の設定

LDAPでユーザ認証を統合したが、ホームディレクトリも統合しないと意味がない。NFSは従来(バージョン3までは)udpの不定ポートを使っていてファイやウォールやiptablesがらみの設定が厄介だったが、NFSバージョン4からは2049/tcpのみでよい。

CentOS5.0でLDAP認証の設定

Xenで仮想サーバをたくさん立ち上げる予定なので、それぞれにユーザ管理などをしていられない。LDAPを使って統合認証をする。

Xen運用の基礎知識

Xenの運用をするために知っておくべき基礎知識をまとめておこう。

◆仮想マシンの状態確認

[root@ml115 xen]# xm list
Name ID Mem(MiB) VCPUs State Time(s)
Domain-0 0 3012 2 r----- 81.2
www1 2 511 1 -b---- 53.6

◆仮想マシンへのコンソール接続方法

[root@ml115 xen]# xm console www1

CentOS release 5 (Final)
Kernel 2.6.18-8.el5xen on an x86_64

www1.grandarbre.net login:

◆仮想マシンのコンソールからDomain-0への戻りかた

[root@www1 ~]#
[root@www1 ~]#  ←CTL + ]を押す
[root@ml115 xen]#
[root@ml115 xen]#
[root@ml115 xen]#

◆仮想マシンの起動方法

[root@ml115 xen]# xm create /etc/xen/www1
Using config file "/etc/xen/www1".
Going to boot CentOS (2.6.18-8.el5xen)
kernel: /vmlinuz-2.6.18-8.el5xen
initrd: /initrd-2.6.18-8.el5xen.img

Started domain www1
[root@ml115 xen]#


xm create -c /etc/xen/www1とすると起動後にそのままコンソールにつながるが、エラーが起きて起動しないことがある。そんなときは-cを付けずに起動してあとからxm connectやsshで入る。

◆仮想マシンのシャットダウン

[root@ml115 ~]# xm shutdown www1

仮想マシンの中でshutdown -h nowとしてもよい。

◆仮想マシンの強制シャットダウン

[root@ml115 ~]# xm destroy www1

ただしシステムが壊れてしまう場合があるので注意。

◆Domain-0起動時にDomain-Uも自動的に起動する

/etc/xen/autoに設定ファイルへのシンボリックリンクを置く
[root@ml115 xen]# ls -l /etc/xen/auto/
total 4
lrwxrwxrwx 1 root root 13 Oct 27 20:52 www1 -> /etc/xen/www1

CLIでひととおり何でもやれるようになろうとXを入れていなかったのだが、XenのDomain-U(仮想マシン)のインストールが上手くいかない。具体的には、仮想マシンを作ってxm create -c <設定ファイル>として仮想マシンを起動しようとすると、

VFS: Cannot open root device "dev/sda1" or unknown-block(0,0)
Please append a correct "root=" boot option
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)

として失敗してしまう。

マニュアルを見てもネットで調べても情報が見つからず、普通に成功した人の話ばかり。Xを使ったインストール方法ならいくらでも情報があるので、Xを入れて試してみることにした。

yum groupinstall "X Window System"で一括してX関係のプログラムを一括インストール。init 5でXを起動したらvir-managerコマンドでVirtual Machine Managerを起動する。後はGUIで見たまんまに操作をすれば、簡単に仮想マシンが動いてしまった。これまでの苦労は何だったのだ...。

設定ファイルを見比べてみると、自動生成されたものとWebで調べてへいこら書いたものとはだいぶ内容が違う。やはり発展途上の技術はまずは標準の方法で試すべきか。

なお、自動生成された内容は以下のとおり。

[root@ml115 ~]# cat /etc/xen/centos5
# Automatically generated xen config file
name = "centos5"
memory = "256"
disk = [ 'tap:aio:/opt/xen/centos5,xvda,w', ]
vif = [ 'mac=00:16:3e:2b:7f:db, bridge=xenbr0', ]
vfb = ["type=vnc,vncunused=1"]
uuid = "f83c4a0b-4831-f424-d341-ccf824e91481"
bootloader="/usr/bin/pygrub"
vcpus=1
on_reboot = 'restart'
on_crash = 'restart'

/opt/xen/centos5という2GBのファイルが出来ており、この中に仮想マシンのファイルシステムが作られている。今回は最小限のインストールで入れたが、Fedora7などはフルインストールをすると4GBを超えていたので普通は6GB~8GBくらいで作るといいと思う。

CentOS5.0の基本設定

CentOS5.0をセットアップして再起動が成功したら、いろいろ基本設定をしなければいけない。もちろんすべてCLIでやる。

購入したML115にCD-ROMドライブしかないので、手元のCentOS(DVD)でセットアップができない。CentOSはCD用のISOファイルも公開されているのでこれをCD-Rに焼いて使ってもいいのだが、CD-Rが7枚もできてしまうと邪魔なので無理やりDVDを使うことにした。

ML115はUSBメモリからブートできる。そこでDVDに入っているdiskboot.imgというファイルをUSBに書き込んで起動ディスクとする。USBに書き込むとき普通にファイルとして書き込んでは駄目で、他のLinuxマシンにUSBメモリを挿して
dd if=diskboot.img of=/dev/sdb
としてディスクイメージを書き込む。ここで/dev/sdbはUSBのデバイスファイルで、環境によってかわる。

これをML115に挿し、BIOSセットアップ(起動画面でF10)でブート順序をかえてリブートするとUSBから起動してインストーラが立ち上がる。インストール手順の途中でどこからOSをインストールするか聞かれるのでFTPを選んで、自分のIPアドレス、FTPサーバのIPアドレス等を入力する。

うちでDVDドライブを持つのはWindows XPのThinkPadだけなので、War FTP Daemonを使ってDVDをFTPで公開する。Windowsのファイアウォールを解除したり、上手く動かないWar FTP Daemonを再インストールしたり、一連のセットアップ作業でここが一番手間取ってしまった...。

ネットワーク経由のセットアップは時間がかかるが、それ以外は何の問題もなくセットアップ終了。さすがRedHatを正式サポートしているサーバだけあって、全くのノートラブルだった。

HP ProLiant ML115購入

Cerelon 500MHzのWebサーバでMovable Typeを使うと、更新処理のあまりの遅さに気が遠くなる。数十行のテキストを書いて更新ボタンを押すと1分くらい待たされるのだ。それ以外にもいろいろやってみたいことがあり、サーバH/Wを更新することにした。

はじめは小型静音省電力にこだわって中古のノートを買うか、Mini-ITXで自作するかといろいろ妄想を膨らませていたが、なんとHPのタワー型サーバが約1.5万ということを知り、通販で購入してしまった。(実際にはCPUをレベルアップして2.5万円+送料3千円)

それから今とてもメモリが安いので、秋葉原で1GBで3千円のメモリを4枚購入。合計で約4万円の出費でWebサーバとしてはかなりハイスペックなマシンが出来上がった。けっこうファンがうるさいのとOpteronが電気を喰うので当初のコンセプトは全く失われてしまったが...。

◆CPU: AMD Opteron1210 (デュアルコア、1.8GHz)
◆HDD: Serial ATA 80GB
◆Memory: PC2-6400 4GB
◆Video: On Board
◆Optical: CD-ROM
◆Sound: なし!!

ハイスペックなのはあくまでWebサーバとしてであり、HDDはいまどき80GBが1本。これはいずれRAIDを組んでみたい。ビデオはオンボードでかなりチープらしいが、X Windowは入れない予定なので問題なし。また音はBeep音のみ。ちょっと困るのがCD-ROMで、DVDで提供されるOSをいれるとき別途ドライブを用意する必要がある。

これを一般的なマルチメディアPCに変身させようとすると、ビデオカード、サウンドカード、DVDドライブ、ハードディスクと足していって普通のマシンが買えてしまう。よってそういう欲は抑え込むが吉。なおメモリを4GBいれると後付けのビデオカードに問題がでるという話や、CPUファンが大きくて裏側に出っ張りのあるビデオカードは入らないなど、改造用PCとしては扱いにくいらしい。

OSはRedHat Enterprise Linux互換のCentOS5.0で行く。コンセプトはCLI主義と仮想化。

普通の人はグローバルIPを1個しか持っていないので、ブロードバンドルータで1:1 NATをすると外部に公開できるWebサーバはひとつになる。普通はそれでいいが、ローカルLAN上の別の機器にもHTTPでアクセスしたい場合もある。ネットワークカメラとかインターネット家電とか。また静的なHTMLとCGIを別のサーバに分けたいこともあるだろう。

ネットワーク屋的にはL7スイッチを入れたりしたくなるが、もっと簡単にWebサーバのApacheでリバースプロキシ設定をすれば実現できる。

/etc/httpd/conf/httpd.confに以下の設定を追加する。

ProxyRequests Off Order deny,allow Deny from all Allow from 123.123.123.0/24

ProxyPass /nwcamera http://192.168.0.1/
ProxyPassReverse /nwcamera http://192.168.0.1/
ProxyPass /intraserver http://192.168.0.2/
ProxyPassReverse /intraserver http://192.168.0.2/

そしてservice httpd configtest、service httpd reloadをする。

そうすると外部から/bbrouterなどにアクセスしたときに、Apacheがリバースプロキシとして動作して192.168.0.1のページが見られる。

ただし内部のサーバページに絶対パスのリンクがある場合、そのリンク先はProxy対象とならない。結果として元のWebサーバ上でそんなファイルはないと怒られる。これはちょっと厄介で、ちゃんと解決するには本格的なProxyソフトを入れないと駄目だと思う。

なんか時計がずれると思っていたら、ntpdが自動起動になっていなかった。ntpはnetwork time protocolの略でネットワーク越しに正確な時刻同期を実現するためのプロトコルで、世界中に時刻を提供するサーバが立っている。ntpdの設定はデフォルトのままではRedHatのタイムサーバが記述されているので、より近いサーバや自分のISPが提供しているサーバに変えた方がいいかもしれない。

[root@ml115 ~]# cat /etc/ntp.conf
...
server 0.rhel.pool.ntp.org
server 1.rhel.pool.ntp.org
server 2.rhel.pool.ntp.org
...
...
server ntp1.jst.mfeed.ad.jp
server ntp2.jst.mfeed.ad.jp
server ntp3.jst.mfeed.ad.jp
...

ntpでは、タイムサーバの時刻と自サーバ上の時刻が違いすぎると、うまく同期できなかったり同期に時間がかかることがある。なので最初はntpdateコマンドで強制的に時刻を合わせるとよい。

[root@ml115 ~]# ntpdate ntp1.jst.mfeed.ad.jp
26 Nov 22:55:39 ntpdate[7371]: adjust time server 210.173.160.27 offset -0.034191 sec

また、デフォルトではntpで取得した時刻はサーバ内のハードウェアクロックを更新させない。これを更新させるように変更する。

[root@ml115 ~]# vi /etc/sysconfig/ntpd 
# Drop root to id 'ntp:ntp' by default.
OPTIONS="-u ntp:ntp -p /var/run/ntpd.pid"
# Set to 'yes' to sync hw clock after successful ntpdate
SYNC_HWCLOCK=no
# Drop root to id 'ntp:ntp' by default.
OPTIONS="-u ntp:ntp -p /var/run/ntpd.pid"
# Set to 'yes' to sync hw clock after successful ntpdate
SYNC_HWCLOCK=yes

そしてntpdを起動する。

[root@ml115 ~]# service ntpd start
Starting ntpd:                                             [  OK  ]

ntpdを自動起動するように設定する。

[root@ml115 ~]# chkconfig ntpd on

ntpの同期状態を確認する。

[root@ml115 ~]# ntpq -p
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
 ntp1.jst.mfeed. 210.173.160.86   2 u    7   64    1    6.880  -20.108   0.001
 ntp2.jst.mfeed. 210.173.160.86   2 u    6   64    1    7.355  -20.016   0.001
 ntp3.jst.mfeed. 210.173.160.86   2 u    5   64    1    6.685  -19.913   0.001
 LOCAL(0)        .LOCL.          10 l    4   64    1    0.000    0.000   0.001

システムの時刻を確認する。

[root@ml115 ~]# date
Mon Nov 26 23:07:33 JST 2007

CPUの使用する時刻を確認する。

[root@ml115 ~]# clock
Mon 26 Nov 2007 11:07:40 PM JST  -0.064814 seconds

ハードウェアクロックを確認する。

[root@ml115 ~]# hwclock 
Mon 26 Nov 2007 11:09:15 PM JST  -0.201409 seconds

ちなみにタイムゾーンは/etc/localtimeにて設定される。このファイルはバイナリなので直接編集することは出来ず、/usr/share/zoneinfo/Japanへのリンクもしくはコピーとして作成する。

アトピーと海外旅行

8月以降ひどい炎症はなくなったが、痒みやガサガサ感はいつも消えない。食事などはあまり気にせず、嗜好品や菓子などは避けて日々過ごしてきた。薬は飲んでも飲まなくてもあまりかわらないので止めていた。

そんな中1週間ほどイタリアへ海外旅行に。旅行中に悪化するとまさに悪夢なので、医者にいって切らしていた薬をもらた。いざというときの頼み、虎の子のステロイド錠のこり3粒ももって成田に向かった。

イタリアは車の排気ガスがとても多くて、空気が汚い。シャワーに浄水器なんて当然ついていない。食事も添加物など気にしていられず何でも食べた。忙しくて空腹のときなどは普段避けていたチョコレートバーなども食べた。普段あまりあたらない紫外線(日光)にも結構あたった。それでも、渡航して数日後には顔も首も手足もほとんど炎症や痒みがきれいに消えてしまったのである。

海外に行くとよくなるという話はネットで見聞きしていたし、医者にもかえってよくなるんじゃないっていわれ(自分としては不安だったので内心むすっとした)のだが、あきれてしまうことにそのとおりになった。しかも、帰国したら1週間そこそこで、もとの痒い状態に戻ってしまった。

やれやれ、ここまではっきりと環境要因とわかるとそれさえ断てばすぐに治るんじゃないかと期待も持てるが、逆にそれがわからないと治らないってことかな。ステロイド外用薬とかに逃げないで、また地道に探さなければいけないなぁ。

今年の夏は暑かった。ファンが不調な当サイトサーバはいつ壊れるかとヒヤヒヤしていた。こんなとき内部温度がグラフ表示できれば、少しだけ安心できるかもしれない。

linuxでPCの内部温度を取得するには、lm_sensorを使う方法とacpiを使う方法がある。lm_sensorの方がいろんな情報がとれそうなので試してみたが、センサの検出中に必ずサーバがクラッシュするので断念。もうひとつの方法は、単純に/proc/acpi/thermal_zone/THRM/temperatureを読む。acpiはFedora7インスト時にはじめから有効になっていた。

mrtgは1つのグラフに2つの値を表示する必要があるので、ついでにPICNICで測定した気温も表示しよう。mrtgで任意の値を表示させたい場合、値の取得方法はmrtgからスクリプトを呼び出す方法と、net-snmpでスクリプトを呼び出して、mrtgからはSNMP経由で値を取得する方法がある。今回は前者を使う。

mrtgから呼び出すスクリプトは、一行目に値1(緑グラフ)、二行目に値2(青グラフ)、三行目に監視対象のアップタイム、四行目に監視対象のホスト名を返す必要がある。今回は三行目と四行目は省略する。できたスクリプトは以下のとおり。

[root@www bin]# vi gettemp.pl

#!/usr/bin/perl -w
use strict;
my $str;
$str = `cat /proc/acpi/thermal_zone/THRM/temperature`;
$str =~ /[0-9]+/;
print $&."\n";

$str = `wget -q -O - http://192.168.0.200`;
$str =~ /[0-9]+ Celsius/;
$& =~ /[0-9]+/;
print $&."\n";

print "\n\n";


これを呼び出してグラフにするmrtg設定は以下のとおり。これを/etc/mrtg/mrtg.confに追記する。

# Temperature

Target[temp]: `/usr/bin/perl /usr/local/bin/gettemp.pl`
Options[temp]: gauge,nopercent,growright
Title[temp]: Temperature
PageTop[temp]: Temperature
MaxBytes[temp]: 100
LegendI[temp]: Internal
LegendO[temp]: External
YLegend[temp]: Temperature
ShortLegend[temp]: °C


@niftyのダイナミックDNSを利用している。クライアントとしてはDiCE for Linuxを使用していたが、デーモンとして常時起動していてCPU負荷常に消費している。また設定する時の文字コードがいまどきEUC固定で不満があった。

niftyのダイナミックDNSサービスはそもそもブラウザで指定ページを認証するだけで更新できるので、perlで簡単にクライアントを作れそうだ。

動きを追ってみる。https://www.atnifty.com/ddns/p13.phpにアクセスするとIPアドレスとvalidというコードを渡される。validはたぶんIPアドレスのハッシュか何かかな。このIPアドレスを以前に更新した際に記録しておいた手元のアドレスと比較して、違っていた場合にhttps://gateway.nifty.com/service/g-way/ddns/nifty/secure/config/update.phpに上記のIPアドレスとvalidを渡すことによってダイナミックDNSを更新する。その際に@nifty IDとパスワードによるベーシック認証が行われる。

これを元にperlスクリプトを作る。はじめはHTTPクライアント機能もperlで作るつもりだったが、wgetを呼び出して簡単に済ますことにした。出来たのがこちら

このスクリプトを好きな場所(ここでは/usr/local/bin/ddns4nifty/)に置く。IPアドレスを記録しておくファイルは、フルパスでスクリプト内に記述する。@nifty IDとパスワードもハードコーディングする。

次にこれを、cronで定期的に実行するようにする。実行間隔は10分くらいがいいかな。

[root@www ~]# vi /etc/cron.d/ddns4nifty
*/10 * * * * root /usr/bin/perl /usr/local/bin/ddns4nifty/ddns4nifty.pl

何度かルータを再起動したりしてIPを強制的に変えてみたが、ちゃんと切り替わるようだ。ただcronが回るのに最大で10分。ダイナミックDNSを更新しても数分はキャッシュが残っているみたいなので、最悪20分くらいはサーバにアクセスできないこともありうる。これはダイナミックDNSの宿命か。

このスクリプトは使用、改変、再配布など自由に行っていただいてかまわないが、一切の動作保障や発生した損失の補償をしない。なお、私のプログラミング技術は入門者レベルなので、利用を検討される方はその点も十分にご注意いただきたい。

ページのヘッダ部分にリンクを表示したい。

①メニューから、デザイン→テンプレートを選択
②右側のクイックフィルタから、テンプレートモジュールをクリック
③ヘッダーをクリック
④好きな場所にリンクを挿入

<div id="header-menu"><a href="/index.html">[メイン]</a> <a href="/mrtg.html">[リソース]</a> <a href="/profile.html">[プロファイル]</a> <a href="/old/index.html">[旧サイト]</a></div>

⑤保存ボタンをクリック
⑥クイックフィルタから、インデックステンプレートをクリック
⑦スタイルシート(ベーステーマ)をクリック
⑧/* Header */あたりに下記のスタイル定義を追加
#header-menu {
float: right;
margin-bottom: 0;
}

⑨保存ボタンをクリック
⑩サイトを再構築する