Boot Options

Debianではブート時のboot:プロンプトなりgrub menu.lstのkernel行で、起動時のオプションをいろいろ指定できる。

Debian公式のドキュメントは見つけられなかったが、Ubuntuのドキュメントではこちらに記載があった。
BootOptions - Community Ubuntu Documentation
Ubuntuではkernel自身へのオプション(Kernel Options)とinit実行時にbreak pointが設定できること(Initrd break points)が書かれている。

initrd組み込みのinit実行時に指定できるオプションは他にもあって、これは元になる/usr/share/initramfs-tools/initをみるのが手っ取り早い。
たとえばroot=の指定はrootファイルシステムとしてマウントする対象を判定するために使われる、ということがわかる。

WordPressのアップロード先を「年/月/日/post_id」にしてみる

久しぶりにWordPressを触ってる。
で、画像ファイルのアップロード先を記事別に分類しようと思ったのだが、うまい方法が思いつかない。

Custom Upload Dirプラグインを使えば、
wp-content/uploads/%year%/%month%/%date%/%post_title%/
の形式にはできるのだが、日本語タイトルだとデフォルトのポストスラグがUTF-8にエンコードされた形式になってしまい、アップロードはうまくいくものの画像表示ができなくなってしまう。

wp-content/uploads/%year%/%month%/%date%/%post_id%/
の形式に設定できればいいのにと、以下のパッチをあてて、post_title部分がpost_idになるように強制してしまった。

--- custom_upload_dir.php.orig  2009-01-31 21:19:00.000000000 +0900
+++ custom_upload_dir.php       2009-01-31 22:23:02.437500000 +0900
@@ -161,13 +161,7 @@
        $customdir = '';
        $cur_post = get_post($post_id);
        $postGotDate = ($cur_post->post_date != "0000-00-00 00:00:00" && $cur_post->post_date);
-       $name = $cur_post->post_name;//post_name == slug
-       if(empty($name)){
-               $name = sanitize_title($cur_post->post_title);
-       }
-       if(empty($name)){
-               $name = $cur_post->ID;
-       }
+       $name = $cur_post->ID;
        if($postGotDate) { //only use the post_date if it has been defined (ie. published or manually altered)
                $time = strtotime($cur_post->post_date);
                if($use_yearmonth){ //custom upload dir put stuff according to the post's timestamp. If yearmonth is on, we need to override it.

これでプラグインの設定でpost_titleに設定したフィールドにはpost_idが代入されるようになる。
本当はプラグイン設定でpost_idを選択できるようにするのがよいとは思いつつ、当面これでごまかすつもり。

zillaの意味

某巨大掲示板にて。
zillaってのはアルメニア語でオープンソースって意味。

本当か?、と思いつつzillaと名前のついたオープンソースプロジェクトは、Mozilla、ChatZilla、FileZilla、Clonezillaなどがあるので信憑性高いかも。
Clonezillaは最近知ったのだが、Symantec Ghostのようなディスククローニングツール。

最近はぜんぜんオープンソースとゆかりのないソフトやサービスに"うんちゃらzilla"といった名前がついたりしていて嘆かわしい。

CORESERVER.JPのDrupalをCGIモードで動かす

safe modeの制約で動かないモジュールがあったり不便なので、CGIモードに変更した。

.htaccessに以下を追記。

AddHandler application/x-httpd-phpcgi .php

.htaccessのPHP関連設定はCGIだと効かなくなってしまうので、php.iniを作成して設定。

magic_quotes_gpc              = Off
register_globals              = Off
session.auto_start            = Off
mbstring.http_input           = pass
mbstring.http_output          = pass
mbstring.encoding_translation = Off

最初sites/default/settings.phpにini_set()で設定しようと思ったが、register_globalsは無理だったのでphp.iniにした。

参考:
PHPをCGIとして動かす方法について - CORESERVER.JP:コアサーバー

Debian sidのzabbixでlocalhostがモニタできない

Debian sidにzabbixを一式入れて動かそうと思ったらlocalhostのモニタが開始できない。
Web画面上はConfiguration -> Hostsで以下のErrorが表示されている。

Got empty string from [localhost] IP [127.0.0.1] Parameter [agent.ping]

/etc/zabbix/zabbix_agentd.confをDebugLevel=5に変更してみたところ、/var/log/zabbix-agent/zabbix-agentd.logに以下のエラーメッセージが記録されていた。

Listener error: Connection from [::ffff:127.0.0.1] rejected. Allowed server is [127.0.0.1]

あー、そういうことか。解決策は以下のいずれか。

  • 接続許可のIPアドレスを追加する。
    /etc/zabbix/zabbix_agentd.confで
    Server=127.0.0.1,::ffff:127.0.0.1
    

    のように接続元サーバのIPアドレスを追加する。

  • ListenするIPアドレスをIPv4アドレスに限定する。
    /etc/zabbix/zabbix_agentd.confで
    ListenIP=127.0.0.1
    

    に設定する。

  • IPv6自体を無効化する。

今回は接続許可IPを追加して解決。

CentOS 5.2にmunin-nodeをインストール

CentOS 5.2にmunin-nodeをインストールした際の記録。Muninのサーバー自体は別マシン(Debian)で動作している。
CentOS 5(RHEL5)用のRPMパッケージはRPMforgeで提供されているので、そちらを使う。

OS標準パッケージで導入

前提パッケージのうち、CentOS標準で提供されているものをインストール。

# yum install perl.x86_64 perl-libwww-perl perl-Digest-SHA1 perl-Socket6

RPMforgeからmuni-nodeをインストール

RPMforgeのリポジトリを追加する。

# wget http://dag.wieers.com/rpm/packages/rpmforge-release/rpmforge-release-0.3.6-1.el5.rf.x86_64.rpm
# rpm -Uvh rpmforge-release-0.3.6-1.el5.rf.x86_64.rpm

デフォルトでは使われないように無効化しておく(enabled = 0)。

# vi /etc/yum.repo.d/rpmforge.repo

munin-nodeパッケージをインストールする。

# yum --enablerepo=rpmforge install munin-node

munin-nodeの設定

munin-node.confにMuninが動作するサーバーのIPアドレスを追加(同一ホストで動かす場合は不要)。

# vi /etc/munin/munin-node.conf

サービス有効化、起動。

# chkconfig munin-node on
# service munin-node start
Starting Munin Node:                                       [  OK  ]

CentOS 5.2にOpenNMSをインストール

OpenNMSはJavaで書かれたウェブベースの監視ツール。pingやコネクションベースの死活監視やSNMPノードであれば性能監視もおこなえる。
ApacheのStatusモジュールで得られる情報や、JMXを使ってTomcat等のサーブレットコンテナの情報が収集できるところが特徴的。
データはRRDtoolと同様の方式で累積されるようだ(RRDtoolをJavaで実装してるっぽい)。
OpenNMS自体はJetty同梱版での単独動作させるか、もしくはTomcat等にデプロイして動かす。

今回はJetty同梱版をインストール。こちらのページに従えばおおよそ大丈夫。
Installation:Yum - OpenNMS

ソフトウェアのインストール

  • OpenNMS本体
    # rpm -Uvh http://yum.opennms.org/repofiles/opennms-repo-stable-rhel5.noarch.rpm
    # yum -y install opennms
    
  • PostgreSQL
    # yum -y install postgresql-server
    
  • iplike
    # yum -y install iplike.x86_64
    

    x86_64環境にi386版も導入すると、後述のinstall_iplike.shスクリプトが正しく動作しないので注意(libdirが/usr/lib64ではなく/usr/libになってしまうため)。

PostgreSQLの設定

  • ローカルアカウントでのアクセスを信頼するようにpg_hba.conf修正
     local   all         all                               trust
     host    all         all         127.0.0.1/32          trust
     host    all         all         ::1/128               trust
    

    とりあえずOpenNMSのインストールドキュメントにしたがってやっているが、実際にはもう少し制限したほうがいいと思う(opennmsデータベースだけtrustにするとか)。

  • データベース作成
    # service postgres start
    # su - postgres
    $ createdb -U postgres -E UNICODE opennms
    $ exit
    
  • iplike functionのインストール
    # su - postgres
    $ install_iplike.sh
    $ exit
    
  • Javaのパス設定
    # /opt/opennms/bin/runjava -S /usr/java/jdk1.5.0_15/bin/java
    
  • データベースの中身を作成
    # su - postgres
    $ /opt/opennms/bin/install -dis -l /usr/lib64
    $ exit
    

OpenNMSサービスを開始

# service opennms start
# chkconfig opennms on

管理画面(http://localhost:8980/opennms/)には、user=admin、password=adminでログインできる。

virt-installで仮想マシンをお手軽セットアップ

CentOS 5.2のDomain-0上にCentOS 5.2をインストール。ディスクにイメージファイルを使う場合、virt-installで非常に簡単。

# vitrt-isnstall
Would you like a fully virtualized guest (yes or no)?  This will allow you to run unmodified operating systems. no
What is the name of your virtual machine? centos5
How much RAM should be allocated (in megabytes)? 512
What would you like to use as the disk (file path)? /var/lib/xen/images/centos5-sda.img
How large would you like the disk (/var/lib/xen/images/centos5-sda.img) to be (in gigabytes)? 8
Would you like to enable graphics support? (yes or no) no
What is the install location? http://mirror.centos.org/centos/5/os/x86_64/

ここまで答えればあとはインストーラが起動する。
"Would you like a fully virtualized guest (yes or no)?"にnoを答えれば準仮想化、すなわちXenのDomain-Uになる。
ディスクイメージはSELinuxを有効にしている場合/var/lib/xen/imagesに配置するのが無難らしい。
準仮想化の場合、install location配下のimages/xen/vmlinuzカーネルでブートするようなので、Fedora 9でもいけるかもしれない。

以下はML115 G5でのインストーラ起動までのブートログ。

Starting install...
Retrieving file .treeinfo 100% |=========================|  417 B    00:00
Retrieving file vmlinuz.. 100% |=========================| 1.9 MB    00:03
Retrieving file initrd.im 100% |=========================| 5.7 MB    00:08
Creating storage file...  100% |=========================| 8.0 GB    00:00
Creating domain...                                                 0 B 00:01
Bootdata ok (command line is   method=http://mirror.centos.org/centos/5/os/x86_64/)
Linux version 2.6.18-92.el5xen (mockbuild@builder10.centos.org) (gcc version 4.1.2 20071124 (Red Hat 4.1.2-42)) #1 SMP Tue Jun 10 19:20:18 EDT 2008
BIOS-provided physical RAM map:
Xen: 0000000000000000 - 0000000020800000 (usable)
No mptable found.
Built 1 zonelists.  Total pages: 133120
Kernel command line:   method=http://mirror.centos.org/centos/5/os/x86_64/
Initializing CPU#0
PID hash table entries: 4096 (order: 12, 32768 bytes)
Xen reported: 2299.998 MHz processor.
Console: colour dummy device 80x25
Dentry cache hash table entries: 131072 (order: 8, 1048576 bytes)
Inode-cache hash table entries: 65536 (order: 7, 524288 bytes)
Software IO TLB disabled
Memory: 499968k/532480k available (2414k kernel code, 23744k reserved, 1349k data, 176k init)
Calibrating delay using timer specific routine.. 5756.12 BogoMIPS (lpj=11512251)
Security Framework v1.0.0 initialized
SELinux:  Initializing.
selinux_register_security:  Registering secondary module capability
Capability LSM initialized as secondary
Mount-cache hash table entries: 256
CPU: L1 I Cache: 64K (64 bytes/line), D cache 64K (64 bytes/line)
CPU: L2 Cache: 512K (64 bytes/line)
CPU: Physical Processor ID: 0
CPU: Processor Core ID: 1
(SMP-)alternatives turned off
Brought up 1 CPUs
checking if image is initramfs... it is
Grant table initialized
NET: Registered protocol family 16
ACPI Exception (utmutex-0262): AE_BAD_PARAMETER, Thread 1E7A0 could not acquire Mutex [2] [20060707]
No dock devices found.
ACPI Exception (utmutex-0262): AE_BAD_PARAMETER, Thread 1E7A0 could not acquire Mutex [2] [20060707]
Brought up 1 CPUs
PCI: Fatal: No PCI config space access function found
PCI: setting up Xen PCI frontend stub
ACPI: Interpreter disabled.
Linux Plug and Play Support v0.97 (c) Adam Belay
pnp: PnP ACPI: disabled
xen_mem: Initialising balloon driver.
usbcore: registered new driver usbfs
usbcore: registered new driver hub
PCI: System does not support PCI
PCI: System does not support PCI
NetLabel: Initializing
NetLabel:  domain hash size = 128
NetLabel:  protocols = UNLABELED CIPSOv4
NetLabel:  unlabeled traffic allowed by default
NET: Registered protocol family 2
IP route cache hash table entries: 32768 (order: 6, 262144 bytes)
TCP established hash table entries: 131072 (order: 9, 2097152 bytes)
TCP bind hash table entries: 65536 (order: 8, 1048576 bytes)
TCP: Hash tables configured (established 131072 bind 65536)
TCP reno registered
audit: initializing netlink socket (disabled)
audit(1230701013.253:1): initialized
VFS: Disk quotas dquot_6.5.1
Dquot-cache hash table entries: 512 (order 0, 4096 bytes)
Initializing Cryptographic API
ksign: Installing public key data
Loading keyring
- Added public key 52394A11B61A91
- User ID: CentOS (Kernel Module GPG key)
io scheduler noop registered
io scheduler anticipatory registered
io scheduler deadline registered
io scheduler cfq registered (default)
pci_hotplug: PCI Hot Plug PCI Core version: 0.5
rtc: IRQ 8 is not free.
Non-volatile memory driver v1.2
Linux agpgart interface v0.101 (c) Dave Jones
RAMDISK driver initialized: 16 RAM disks of 16384K size 4096 blocksize
Xen virtual console successfully installed as xvc0
Event-channel device installed.
Uniform Multi-Platform E-IDE driver Revision: 7.00alpha2
ide: Assuming 50MHz system bus speed for PIO modes; override with idebus=xx
ide-floppy driver 0.99.newide
usbcore: registered new driver hiddev
usbcore: registered new driver usbhid
drivers/usb/input/hid-core.c: v2.6:USB HID core driver
PNP: No PS/2 controller found. Probing ports directly.
i8042.c: No controller found.
mice: PS/2 mouse device common for all mice
md: md driver 0.90.3 MAX_MD_DEVS=256, MD_SB_DISKS=27
md: bitmap version 4.39
TCP bic registered
Initializing IPsec netlink socket
NET: Registered protocol family 1
NET: Registered protocol family 17
XENBUS: Device with no driver: device/vbd/51712
XENBUS: Device with no driver: device/vif/0
Write protecting the kernel read-only data: 461k

Greetings.
anaconda installer init version 11.1.2.113 starting
mounting /proc filesystem... done
creating /dev filesystem... done
mounting /dev/pts (unix98 pty) filesystem... done
mounting /sys filesystem... done
anaconda installer init version 11.1.2.113 using /dev/xvc0 as console
trying to remount root filesystem read write... done
mounting /tmp as ramfs... done
running install...
running /sbin/loader

xrdpでグラフィカルログイン

ディスプレイをもたないDebian sidにリモートデスクトップで接続できるようxrdpをセットアップした。
とはいってもxrdpとvncserver、それに実際にデスクトップ環境として使うパッケージをインストールするだけ。

# aptitude install xrdp
# aptitude install vnc4server
# aptitude install gnome-session gnome-terminal metacity
# env -i /etc/init.d/xrdp start

これでWindows PCのリモートデスクトップ接続を使ってDebianに接続できるようになる。
xrdpは裏でsesmanというプログラムを使ってVNCサーバであるXvncを起動しているのだが、接続時の指定に従ってXvncの起動オプション、-geometryや-depthを変えてくれるので便利(デフォルト定義のSesman-Xvncを使う場合)。
また、xrdpはVNCサーバへのProxyのように動作し、xrdpまでの通信はRSAで暗号化されるようになっているため、VNCサーバに素で接続するよりも安全性が高い(たぶん)。

何より、gdm等のディスプレイマネージャやVNC接続をセットアップする方法よりも簡単だと思った。接続用クライアントもWindows標準のもので済むし。

Domain-U DebianをLVMパーティションに作成

CentOS 5.2のXen環境にDomain-U Debian(sid)を構築してみた。
ディスクはイメージファイルではなく、論理ボリューム区画を割り当てている。
論理ボリューム区画にしてみたのは、将来ディスク領域が不足したときDomain0で割り当てを増やし(lvextend)、DomainUでファイルシステムをオンラインリサイズ(ext2online)できないものかと考えたから。

論理ボリュームの割り当てとフォーマット

vg00はCentOSセットアップ時に作成したボリュームグループ。

# lvcreate -L 96M -n debian_boot vg00
# lvcreate -L 1024M -n debian_swap vg00
# lvcreate -L 8192M -n debian_root vg00
# mke2fs -j /dev/vg00/debian_boot
# mke2fs -j /dev/vg00/debian_root
# mkswap /dev/vg00/debian_swap

論理ボリュームをマウント

# mkdir /mnt/debian
# mount /dev/vg00/debian_root /mnt/debian
# mkdir /mnt/debian/boot
# mount /dev/vg00/debian_boot /mnt/debian/boot

debootstrapコマンドの準備

debootstrapコマンドをインストール。rpmパッケージ管理外のファイルが/usr/binや/usr/lib直下に配置されるが良しとする。

# cd /usr/local/src
# wget -N http://ftp.debian.org/debian/pool/main/d/debootstrap/debootstrap_0.3.3.2_all.deb
# yum -y install binutils
# ar -x debootstrap_0.3.3.2_all.deb
# cd /
# zcat /usr/local/src/data.tar.gz | tar xvp

Debianインストール

debootstrapコマンドで論理ボリューム上にDebianをインストール。

# /usr/sbin/debootstrap --arch amd64 sid /mnt/debian http://ftp.jp.debian.org/debian

セットアップ

セットアップのためインストールしたDebianにchrootする。

# chroot /mnt/debian
# mount -t proc proc /proc
  • /etc/fstab作成
    # /etc/fstab: static file system information.
    #
    /dev/sda1    /boot   ext3    ro,nosuid,nodev         0 2
    /dev/sda2    /       ext3    defaults                0 1
    /dev/sda3    none    swap    sw                      0 0
    proc         /proc   proc    defaults                0 0
    
  • kernelイメージインストール
    # aptitude install linux-image-xen-amd64
    
  • /etc/inittabにXen用コンソール定義追加
    以下を追加。ラベルは重複しないものを適当に割り当てた。
    h0:12345:respawn:/sbin/getty 38400 hvc0
    x0:12345:respawn:/sbin/getty 38400 xvc0
    

    ちなみにDebian sidの場合、hvcもxvcも/etc/securettyには定義済み(以下、抜粋)。

    # Standard hypervisor virtual console
    hvc0
    
    # Oldstyle Xen console
    xvc0
    
  • /boot/grub/grub.conf作成
    boot=/dev/sda
    default=0
    timeout=5
    #splashimage=(hd0,0)/grub/splash.xpm.gz
    hiddenmenu
    title Debian (2.6.26-1-xen-amd64)
            root (hd0,0)
            kernel /vmlinuz-2.6.26-1-xen-amd64 ro root=/dev/sda2 xencons=xvc console=xvc0
            initrd /initrd.img-2.6.26-1-xen-amd64
    

    kernelパラメータにXen用コンソール定義、xvcを追加している。

  • /boot/grub/menu.lst作成(grub.confにシンボリックリンク)
    # cd /boot/grub
    # ln -s grub.conf menu.lst
    
  • /boot/grub/device.map作成
    (hd0)   /dev/sda
    
  • DomainU設定ファイル作成

    /etc/xen/debianで作成

    name = "debian"
    uuid = "4917533f-38ac-4650-a342-dd468650b2d3"
    maxmem = 384
    memory = 384
    vcpus = 1
    bootloader = "/usr/bin/pygrub"
    disk = [ 'phy:vg00/debian_boot,sda1,w',
             'phy:vg00/debian_root,sda2,w',
             'phy:vg00/debian_swap,sda3,w' ]
    vif = [ "mac=00:16:3e:27:ea:aa,bridge=xenbr0" ]
    on_poweroff = 'destroy'
    on_reboot   = 'restart'
    on_crash    = 'restart'
    

    uuidはuuidgenを使って生成。
    vifのMACアドレスは『19.22. MAC アドレス生成の為のスクリプト作成』に掲載されているmacgen.pyスクリプトを用意して生成。

    最初の目的であるファイルシステム拡張がおこなえるかどうかは後日。

    参考サイト