kopug memo

名古屋で働くとあるWebエンジニアの覚書。

CentOS5.5 x86_64 で 最新のnginx を rpmbuildする

EPELで実はnginxのrpmがあるんだけども、versionが0.6で止まっている。
なので、EPELからsrc.rpmを落としてきてそいつに最新のnginxをつっこんでbuildした。

EPELからnginxのsrc.rpmをダウンロードし、インストールする

# wget http://ftp.iij.ad.jp/pub/linux/fedora/epel/5/SRPMS/nginx-0.6.39-5.el5.src.rpm
# rpm -i nginx-0.6.39-5.el5.src.rpm

最新のnginxをDLし、SPECファイルを編集する

# cd /usr/src/redhat/SOURCES
# wget http://nginx.org/download/nginx-0.8.50.tar.gz
# cd ../SPECS/
# vi nginx.spec

versionを変更する

Version:        0.8.50

patchを当てないようにする

#Patch0:     nginx-auto-cc-gcc.patch
#Patch1:     nginx-cve-2009-3555.patch

#%patch0 -p0
#%patch1 -p0

LANG=C だとmakeでこけてしまうので、LANGを上書きする

%build
# nginx does not utilize a standard configure script.  It has its own
# and the standard configure options cause the nginx configure script
# to error out.  This is is also the reason for the DESTDIR environment
# variable.  The configure script(s) have been patched (Patch1 and
# Patch2) in order to support installing into a build environment.
export LANG='ja_JP.UTF-8'                                      <- 追加
export DESTDIR=%{buildroot}

TODO: rpmの仕様なのか、configureする前にLANG=Cにするみたいなので、上書きしているけど対応方法が強引すぎるため要調査

エラー内容は以下

make -f objs/Makefile
make[1]: Entering directory `/usr/src/redhat/BUILD/nginx-0.8.50'
gcc -c -pipe  -O -W -Wall -Wpointer-arith -Wno-unused-parameter -Wunused-function -Wunused-variable -Wunused-value -Werror -g -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic  -I src/core -I src/event -I src/event/modules -I src/os/unix -I objs \
                -o objs/src/core/nginx.o \
                src/core/nginx.c
cc1: warnings being treated as errors
src/core/nginx.c: In function 'ngx_set_user':
src/core/nginx.c:1101: warning: unused parameter 'cmd'
src/core/nginx.c: In function 'ngx_set_env':
src/core/nginx.c:1164: warning: unused parameter 'cmd'
src/core/nginx.c: In function 'ngx_set_priority':
src/core/nginx.c:1194: warning: unused parameter 'cmd'
src/core/nginx.c: In function 'ngx_set_cpu_affinity':
src/core/nginx.c:1234: warning: unused parameter 'cmd'
make[1]: *** [objs/src/core/nginx.o] Error 1
make[1]: Leaving directory `/usr/src/redhat/BUILD/nginx-0.8.50'
make: *** [build] Error 2
+ mv nginx-upstream-fair/README nginx-upstream-fair/README.nginx-upstream-fair
mv: cannot stat `nginx-upstream-fair/README': No such file or directory
+ exit 0

パッケージにファイルが含まれてないといわれるので、無視するようにする

%define _unpackaged_files_terminate_build 0

※ %filesに含めたほうがいいかも。

buildする。src.rpmも作成しておく

# rpmbuild -ba nginx.spec

これで無事rpmが完成するのでインストール

# rpm -i /usr/src/redhat/RPMS/x86_64/nginx-0.8.50-5.x86_64.rpm

よく使うyumリポジトリ

言わずと知れたRPMforge

# rpm --import http://apt.sw.be/RPM-GPG-KEY.dag.txt
# rpm -i rpmforge-release-0.5.1-1.el5.rf.*.rpm

CentOS(RHEL)でもFedoraのパッケージが使いたいときはEPEL

# rpm --import http://ftp.iij.ad.jp/pub/linux/fedora/epel/RPM-GPG-KEY-EPEL
# rpm -i epel-release-5-3.noarch.rpm

PHPMySQLの最新版を使いたい。どこよりも早く、最新のバージョンをパッケージングしてくれるremi

# wget http://rpms.famillecollet.com/enterprise/remi-release-5.rpm
# rpm -i remi-release-5.rpm
# rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-remi

CentOS 5.5 x86_64 に checkinstall を入れてみる

以前はrpmforgeにパッケージがあったと思ったけど、どうやら無くなっている?
仕方が無いので、ソースからインストールし、その後checkinstallを使ってrpmにする。

# cd /usr/local/src
# wget http://www.asic-linux.com.mx/~izto/checkinstall/files/source/checkinstall-1.6.2.tar.gz
# tar zxf checkinstall-1.6.2.tar.gz
# cd checkinstall-1.6.2
# make
# make install

x86_64なので、本来installwatch.so は lib64に入ってほしいんだけど、libに入っている。
makefileを書き直してもいいけど、今回はシンボリックリンクで対応。

# ln -s /usr/local/lib/installwatch.so /usr/local/lib64/installwatch.so
# checkinstall

適当に質問に答えていき、rpmができたらそいつをインストールしておく

# rpm -i /usr/src/redhat/RPMS/x86_64/checkinstall-1.6.2-1.x86_64.rpm
# rpm -qi checkinstall
Name        : checkinstall                 Relocations: (not relocatable)
Version     : 1.6.2                             Vendor: (none)
Release     : 1                             Build Date: 2010年09月18日 18時18分48秒
Install Date: 2010年09月18日 18時19分01秒      Build Host: rpmbuilder
Group       : Applications/System           Source RPM: checkinstall-1.6.2-1.src.rpm
Size        : 457305                           License: GPL
Signature   : (none)
Packager    : checkinstall-1.6.2
Summary     : CheckInstall installations tracker, version 1.6.2
Description :
CheckInstall installations tracker, version 1.6.2

CheckInstall  keeps  track of all the files created  or
modified  by your installation  script  ("make install"
"make install_modules",  "setup",   etc),   builds    a
standard   binary   package and  installs  it  in  your
system giving you the ability to uninstall it with your
distribution's  standard package management  utilities.

これで完成。

VirtualBox で イメージの複製

vboxmanage clonehd D:\vm\centos5\Base.vdi D:\vm\centos5\NewHardDisk02.vdi 

絶対パスでファイルを指定しないとERRORになった。

ERROR: Cannot register the hard disk 'D:\vm\centos5\Base.vdi' with UUID
 {*******-****-****-****-************} because a hard disk 'D:\vm\centos5\Base.vdi'
 with UUID {*******-****-****-****-************} already exists in
 the media registry ('C:\Users\kopug/.VirtualBox\VirtualBox.xml')
Details: code E_INVALIDARG (0x80070057), component VirtualBox, interface IVirtua
lBox, callee IUnknown
Context: "OpenHardDisk(Bstr(szFilenameAbs), AccessMode_ReadWrite, false, Bstr(""
), false, Bstr(""), srcDisk.asOutParam())" at line 633 of file VBoxManageDisk.cp
p

VBoxManage コマンドは デフォルトインストールだとこちらに。
C:\Program Files\Oracle\VirtualBox\

Xenのディスクイメージファイルサイズを増やす

開発環境はxenで構築しているんだけど(kvmに移行を考え中)、そこのディスク容量が少ないから何とかしてーと言われたので何とかした時のメモ

前提条件

※ イメージファイルはSparseじゃない
※ ゲストOSで LVMを利用している

DomainU(ゲストOS)を停止

# xm shutdown <name>

イメージファイルをバックアップ

# cd /var/lib/xen/images/
# mv <name>.img <name>.img.bak

空の20Gのイメージを作成し、結合(ここが重いけど我慢)

# dd if=/dev/zero bs=1M count=0 seek=20480 of=./20G.img
# cat <name>.img.bak 20G.img > <name>.img
# chmod 755 <name>.img

ループバックデバイスを設定

# losetup -f
/dev/loop0

# losetup /dev/loop0 ./<name>.img
# losetup -a
/dev/loop0: [fd00]:61014051 (<name>.img)

マウントしたイメージファイルのoffsetを確認

# fdisk -lu /dev/loop0

Disk /dev/loop0: 10.7 GB, 10737418240 bytes
255 heads, 63 sectors/track, 1305 cylinders, total 20971520 sectors
Units = セクタ数 of 1 * 512 = 512 bytes

デバイス Boot      Start         End      Blocks   Id  System
/dev/loop0p1   *          63      208844      104391   83  Linux
/dev/loop0p2          208845    20964824    10377990   8e  Linux LVM

fdiskで対象のスライスを削除し、シリンダサイズを再設定

# fdisk  /dev/loop0

このディスクのシリンダ数は 1305 に設定されています。
間違いではないのですが、1024 を超えているため、以下の場合
に問題を生じうる事を確認しましょう:
1) ブート時に実行するソフトウェア (例. バージョンが古い LILO)
2) 別の OS のブートやパーティション作成ソフト
   (例. DOS FDISK, OS/2 FDISK)

コマンド (m でヘルプ): d
領域番号 (1-4): 2

コマンド (m でヘルプ): n
コマンドアクション
   e   拡張
   p   基本領域 (1-4)
p
領域番号 (1-4): 2
最初 シリンダ (14-6527, default 14):
Using default value 14
終点 シリンダ または +サイズ または +サイズM または +サイズK (14-1305, default 1305):
Using default value 1305

コマンド (m でヘルプ): t
領域番号 (1-4): 2
16進数コード (L コマンドでコードリスト表示): 8e
領域のシステムタイプを 2 から 8e (Linux LVM) に変更しました

コマンド (m でヘルプ): w
領域テーブルは交換されました!

ioctl() を呼び出して領域テーブルを再読込みします。

警告: 領域テーブルの再読込みがエラー 22 で失敗しました: 無効な引数です。
カーネルはまだ古いテーブルを使っています。
新しいテーブルは次回リブート時に使えるようになるでしょう。
ディスクを同期させます。

ループバックデバイスを削除

# losetup -d /dev/loop0

DomainU(ゲストOS)を起動

# xm create <name>

以下ゲストOS内で

# pvscan
# pvresize /dev/xvda2
# pvscan
# lvscan
# lvresize -L +20G /dev/VolGroup00/LogVol00
# resize2fs /dev/VolGroup00/LogVol00
# df -h

xenが重くなったときに試してみる事

xenに限った事じゃないけど、イメージファイルをSparseにしている場合、
I/O負荷が馬鹿にならない。

そんな時には思い切ってSparseをやめてみる。

cp --sparse=never 元イメージファイル 新イメージファイル

ファイルサイズによっては結構時間がかかるけど。

終わったら ls -s で見ると実ファイルと同じサイズになっているのが分かる。

ServersManとsakura-vps でベンチマークとってみた

phpspeed ってのを見つけたので、これを使ってみた。
# ベンチマークの詳細は上記を参考に

で、結果。

ServersMan@VPS - Standardプランの結果

さくらのVPS の結果

体感速度も結構いいですよ、さくら。
もう自宅サーバとはさようならだなぁ。。