hnakamur’s blog

ものすごい勢いで忘れる私のために未整理でもいいからとりあえずメモ

2010-12-29

ddでbs=1Mとbs=1Gの速度比較

$ time dd if=/dev/zero of=20G_by_1M.img bs=1M count=20480
20480+0 records in
20480+0 records out
21474836480 bytes (21 GB) copied, 533.695 seconds, 40.2 MB/s

real 8m56.525s
user 0m0.097s
sys 2m26.717s

$ time dd if=/dev/zero of=20G_by_1G.img bs=1G count=20
20+0 records in
20+0 records out
21474836480 bytes (21 GB) copied, 682.891 seconds, 31.4 MB/s

real 11m31.144s
user 0m0.001s
sys 2m53.768s

$ ls -l *.img
-rw-rw-r-- 1 hnakamur hnakamur 21474836480 Dec 29 19:01 20G_by_1G.img
-rw-rw-r-- 1 hnakamur hnakamur 21474836480 Dec 29 18:50 20G_by_1M.img

bs=1Gは大きすぎなんですかね。
仮想イメージのようにGB単位のときはbs=1Gのほうがわかりやすいので、多少遅くても我慢するか悩むところです。

sshのauthorized_keysでのアクセス元IP制限

Manual Pages: sshd(8)
http://www.openbsd.org/cgi-bin/man.cgi?query=sshd&sektion=8

行頭にfrom="pattern-list"をつけておけばよい。
・ホスト名またはIPアドレス
・192.168.0.*などのパターン
・192.168.0.0/24などのCIDR表記(OpenSSH5.1以降 www.openssh.org/txt/release-5.1

CentOS5.5のopensshは4.3p2-41.el5_5.1であるため、CIDR記法で書いてもログインできませんでした。
CentOS5.5で試したところホスト名では
Permission denied (publickey,gssapi-with-mic).
が出てしまいました。IPアドレスならOKでした。実運用でもIPアドレスを指定するほうが確実そうなので放置することにします。

chkconfig --addを忘れて/etc/rc0.d/K*が作られずはまった件のメモ

例としてfooというサービスの場合、chkconfig --add fooをしなくてもchkconfig foo onだけで起動時に実行されてしまうが、/etc/rc0.d/K*fooは作られないためシャットダウン時には実行されない。忘れずにchkconfig --add fooを実行すること。

2010-12-22

CentOS x86_64で*.i386をインストール対象外にする

/etc/yum.confの[main]に以下の行を追加。
exclude=*.i?86

既にインストールされてしまっているパッケージは以下のコマンドで削除。
yum remove \*.i386

2010-12-19

CentOSのKVMのゲストOSに2枚目のネットワークカードを追加

ゲストOSが1枚のネットワークカードでブリッジで動いていることとホスト側では2枚のネットワークカードの両方をブリッジに設定済みであることを前提とします。
なお、この方法は試しにやってみたらできたという手順なので、もっとよい手順があるかもしれません。

ゲストOSで/etc/sysconfig/network-scripts/ifcfg-eth0をコピーしてifcfg-eth1を作成し、適宜編集。MACアドレスを適当に変更(但し頭の54:52:00:は変えずに下3オクテットのみを変えます。上3オクテットはKVMで決まっている値のため(ソース失念))。
また/etc/sysconfig/networkのGATEWAYも編集(hnakamur’s blog: CentOSでネットワークカード2枚挿しの場合のゲートウェイの設定を参照)。

ゲストOSをシャットダウン。

ホストOSでドメインのxml(/etc/libvirt/qemu/<ドメイン名>.xml)を編集。interfaceのタグをコピペして、mac addressを先程ゲストOSでeth1に割り当てた値にし、bridgeをホストのもう一つのブリッジデバイス(br1)にします。
<domain type='kvm'>
  …(略)…
  <devices>
    …(略)…
    <interface type='bridge'>
      <mac address='54:52:00:4f:0a:85'/>
      <source bridge='br0'/>
    </interface>
    <interface type='bridge'>
      <mac address='54:52:00:4f:0a:86'/>
      <source bridge='br1'/>
    </interface>
    …(略)…
  </devices>
</domain>

以下のコマンドで設定を反映。
# virsh define /etc/libvirt/qemu/<ドメイン名>.xml

CentOSでネットワークカード2枚挿しの場合のゲートウェイの設定

この説明ではeth0をLAN側、eth1をWAN側とします。
GATEWAYの設定は/etc/sysconfig/network-scripts/のifcfg-eth0とifcfg-eth1ではコメントアウトして/etc/sysconfig/networkにeth1のGATEWAYを書く(GATEWAYDEVは書かなくても大丈夫でした)。
DNS1、DNS2の設定は/etc/sysconfig/network-scripts/のifcfg-eth0ではコメントアウトしてifcfg-eth1では有効にする。

その後以下のコマンドで設定を反映。
# /etc/init.d/network reload

参考:
Reference Guide
ルータにするための基本設定

CentOSでネットワークをブリッジにする手順

bridge-utilsのインストール

bridge-utilsをインストールするのを忘れずに。
# yum install bridge-utils

設定ファイルの編集

以下の説明のMACアドレスとIPアドレスは実際の環境に合わせて適宜読み替えてください。
/etc/sysconfig/network-scripts/以下のifcfg-eth0を修正し、ifcfg-br0を作成します。

修正前

/etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
TYPE=Ethernet
HWADDR=00:01:02:03:04:05
ONBOOT=yes
BOOTPROTO=static
IPADDR=192.168.0.100
NETMASK=255.255.255.0
GATEWAY=192.168.0.1
DNS1=192.168.0.1


修正後

/etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
TYPE=Ethernet
HWADDR=00:01:02:03:04:05
ONBOOT=yes
BRIDGE=br0
#BOOTPROTO=static
#IPADDR=192.168.0.100
#NETMASK=255.255.255.0
#DNS1=192.168.0.1
#GATEWAY=192.168.0.1

/etc/sysconfig/network-scripts/ifcfg-br0
DEVICE=br0
TYPE=Bridge
ONBOOT=yes
BRIDGE=br0
BOOTPROTO=static
IPADDR=192.168.0.100
NETMASK=255.255.255.0
DNS1=192.168.0.1
#HWADDR=00:01:02:03:04:05


設定を反映

# /etc/init.d/network reload
リモートから操作している場合は端末の接続が切れるので、端末を閉じて別途開きなおします。
ただしすぐには繋がりませんでした。20~30秒待ってから接続すると大丈夫でした。

"Shutting down interface br0:"で表示が10秒程度止まりますが、その後"Bringing up interface br0:"も表示されて元の端末で引き続き作業可能でした。

2010-12-18

CentOS x86_64でphpをソースからビルド

Apacheもソースからビルドして/usr/local/apache2に入れた場合の話です。

sudo yum install mysql-devel.x86_64
tar jxf php-5.3.4.tar.bz2
cd php-5.3.4
./configure --with-apxs2=/usr/local/apache2/bin/apxs --enable-mbstring --with-libdir=lib64 --with-mysql --with-pdo-mysql

2010-12-16

LVMを使用しているKVMのゲストのディスクイメージ拡張

参考:
あやの日常あるいは平穏な日々: 【CI鯖】LVM拡張を試みる
CentOS で LVM 物理/論理ボリュームサイズを縮小する - maruko2 Note.
2010-12-29追記:こちら↑を参考にスワップパーティションは一旦削除してから拡張してその後スワップパーティションを作り直すほうがよいです。そうしない場合system-config-lvmで見るとLogVol00の物理領域がLogVol01を挟んで2つに分かれてしまいました。

イメージファイルの拡張


まずイメージファイルのフォーマットを確認します。
# qemu-img info /var/lib/libvirt/images/vm1.img
実行結果はこんな感じ。
image: /var/lib/libvirt/images/vm1.img
file format: raw
virtual size: 10G (10737418240 bytes)
disk size: 7.5G
もしfile format: rawとなっていなければ、qemu-img convertでrawに変換します。

10Gに6G追加する場合は以下のようにします。イメージファイルのバックアップをとった上で、ddのseekを使って末尾に6Gの領域を追加します。
# cd /var/lib/libvirt/images
# cp vm1.img vm1.img.bak
# dd if=/dev/zero of=vm1.img bs=1G count=6 seek=10


# cd /var/lib/libvirt/images
# mv vm1.img vm1.img.bak
# dd if=/dev/zero of=zero6G.img bs=1G count=6
# cat vm1.img.bak zero6G.img > vm1.img



hnakamur’s blog: KVMのゲストのHDDをマウントしてLive CDからブートの手順でLive CDからブートします。

テキストモード「Boot (text mode)」を選択し、ログインプロンプトが出たらrootでパスワード無しでログインします。

fdisk /dev/hda
Linux LVMのパーティションを一旦削除して、サイズを拡大して作り直し、パーティションタイプをLinux LVM(8e)にします。
/dev/hda2がLinux LVMの場合は、p、d、2、n、p、2、Enter、Enter、t、2、8e、w、qとなります。

再起動します。
# reboot

物理ボリュームの拡張


テキストモード「Boot (text mode)」を選択し、ログインプロンプトが出たらrootでパスワード無しでログインします。

現在の物理ボリュームの状態を確認します。
# pvs

/dev/hda2を拡張します。
# pvresize /dev/hda2

変更後の物理ボリュームの状態を確認します。
# pvs

論理ボリュームの拡張


ここではVolGroup00/LogVol00を拡張します。私の環境ではこれがルートパーティションになっています。

現在の論理ボリュームの状態を確認します。
# lvs

論理ボリュームを拡張します。
# lvextend -L+6G /dev/VolGroup00/LogVol00

変更後の論理ボリュームの状態を確認します。
# lvs

ファイルシステムの拡張


マウント解除。
# umount /dev/VolGroup00/LogVol00

ファイルシステムチェック。
# e2fsck -f /dev/VolGroup00/LogVol00

ファイルシステムのリサイズ。
# resize2fs /dev/VolGroup00/LogVol00

Live CDをシャットダウン

# shutdown -h now

KVMのゲストのHDDをマウントしてLive CDからブート

Live CDの入手と配備

CentOS-5.5-x86_64-LiveCD.isoをCentOSミラーサイトからダウンロードして/var/lib/libvirt/images/に置きます(場所はどこでも可)。

KVMでゲストを起動

libvirtで起動しようと試みましたが失敗(後述)したので、qemu-kvmコマンドで起動します。
/usr/libexec/qemu-kvm -m 1024 -smp 1 -boot d \
-drive file=/var/lib/libvirt/images/vm1.img,if=ide \
-cdrom /var/lib/libvirt/images/CentOS-5.5-x86_64-LiveCD.iso \
-vnc localhost:1

この後UltraVNCなどのvncviewerで接続します。

(失敗メモ) libvirtでCD-ROMからブートを試みるも失敗


/etc/libvirt/qemu/vm1.xmlを以下のように書き換えます。
<domain type='kvm'>
  <name>ora1</name>
  <uuid>97f129e6-9b87-9998-0247-d573d774be81</uuid>
  <memory>2097152</memory>
  <currentMemory>2097152</currentMemory>
  <vcpu>1</vcpu>
  <os>
    <type arch='x86_64' machine='rhel5.4.0'>hvm</type>
    <boot dev='cdrom'/>
    <boot dev='hd'/>
  </os>
  <features>
    <acpi/>
    <apic/>
    <pae/>
  </features>
  <clock offset='utc'/>
  <on_poweroff>destroy</on_poweroff>
  <on_reboot>restart</on_reboot>
  <on_crash>restart</on_crash>
  <devices>
    <emulator>/usr/libexec/qemu-kvm</emulator>
    <disk type='file' device='disk'>
      <driver name='qemu' cache='none'/>
      <source file='/var/lib/libvirt/images/vm1.img'/>
      <target dev='hda' bus='ide'/>
    </disk>
    <disk type='file' device='cdrom'>
      <driver name='qemu'/>
      <source file='/var/lib/libvirt/images/CentOS-5.5-x86_64-LiveCD.iso'/>
      <target dev='hdc' bus='ide'/>
      <readonly/>
    </disk>
    <interface type='network'>
      <mac address='54:52:00:54:37:df'/>
      <source network='default'/>
    </interface>
    <serial type='pty'>
      <target port='0'/>
    </serial>
    <console type='pty'>
      <target port='0'/>
    </console>
    <input type='mouse' bus='ps2'/>
    <graphics type='vnc' port='5901' autoport='no'/>
  </devices>
</domain>
変更内容は
<boot dev='cdrom'/>

<disk type='file' device='cdrom'>
      <driver name='qemu'/>
      <source file='/var/lib/libvirt/images/CentOS-5.5-x86_64-LiveCD.iso'/>
      <target dev='hdc' bus='ide'/>
      <readonly/>
    </disk>
の追加です。


上記の定義を反映。
# virsh define /etc/libvirt/qemu/vm1.xml

起動してコンソールに接続
# virsh start vm1; virsh console vm1

gparted-live-0.7.1-1.isoもダウンロードして/var/lib/libvirt/images/に配置し、
<source file='/var/lib/libvirt/images/CentOS-5.5-x86_64-LiveCD.iso'/>

<source file='/var/lib/libvirt/images/gparted-live-0.7.1-1.iso'/>
に変えてみても同じでした。

おそらくCentOS-5.5-x86_64-LiveCD.isoとgparted-live-0.7.1-1.isoはシリアルコンソールで繋がるように作られていないということなのかと思います。

2010-12-15

Oracleのデータベースをsysアカウントでエクスポートするときのコマンド

単にシングルクォートで囲むのはエラーになりました。Linux x86環境での話。
exp \"SYS/oraAdmin AS SYSDBA\" full=y file=db1.dmp log=exp_db1.log

2010-12-13

CentOSでheartbeatでVIP引き継ぎ(その2)

hnakamur’s blog: CentOSでheartbeatでVIP引き継ぎをまたやってみて少し知識が増えたので追記。

heartbeatのインストール時エラーの回避方法


heartbeatのインストール時にエラーになる件は、一旦heartbeat-pilsとheartbeat-stonithを入れてからheartbeatを入れれば回避できるとのこと。
sudo yum install heartbeat-pils heartbeat-stonith
sudo yum install heartbeat

参考:ベリラボ - wiki - CentOS52_heardbeatインストール、初期設定


/etc/ha.d/haresources

以下のようにネットワークアドレスのビット数やデバイスも指定可能。詳しくはサンプルファイル(/usr/share/doc/heartbeat-2.1.3/haresources)参照。
vm1 IPaddr::192.168.101.20/24/eth0

なお、このIPaddrは/etc/ha.d/resource.d/に置かれているスクリプト名で、手動でも実行可能です。

手動VIP追加
sudo /etc/ha.d/resource.d/IPaddr 192.168.101.20/24/eth0 start
手動VIP削除
sudo /etc/ha.d/resource.d/IPaddr 192.168.101.20/24/eth0 stop

ERROR: Setup problem: Couldn't find utility /bin/gawkの対処法

CentOSをインストール時にBaseのチェックもはずして最小構成にした場合の話です。

heartbeatの実行中に/var/log/ha-logに以下のエラーが発生しました。
ResourceManager[2873][2943]: 2010/12/13_16:08:00 info: Running /etc/ha.d/resource.d/IPaddr 192.168.101.20 start
IPaddr[2962][2976]: 2010/12/13_16:08:00 ERROR: Setup problem: Couldn't find utility /bin/gawk
IPaddr[2945][2977]: 2010/12/13_16:08:00 ERROR:  Program is not installed
R

gawkが無いとインストールしようとしましたが、すでに入っていました。

ググるとこちらに対処法が載ってました。
VIP not appearing when heartbeat starts | Linux-HA | Users

whichをインストールすれば解決します。
sudo yum install which

実験用監視スクリプト


#!/bin/sh

url=http://192.168.101.20/
timeout=2

while :
do
  response=`curl -s -S --connect-timeout $timeout $url`
  if [ $? -ne 0 ]
  then
    break
  fi

  echo "`date +%Y-%m-%dT%k:%M:%S` $response"

  sleep 1
done

2010-12-07

手動でVIP切り替え実験

192.168.0.0/24のネットワークで
192.168.0.11 host1
192.168.0.12 host2
192.168.0.12 host3
で192.168.0.10をVIPとして使う場合。
(実際は他のネットワークで実験したのを読み替えてこの記事を書いているので間違っている可能性もあります)

まず、host1にVIPを追加。
host1# ip addr add 192.168.0.10/24 dev eth0

確認。
host1# ip addr show

host3$ curl http://192.168.0.10/
# ⇒host1のページが表示される

VIPをhost1で削除して、host2に追加。
host1# ip addr del 192.168.0.10/24 dev eth0
host2# ip addr add 192.168.0.10/24 dev eth0
host2# arping -q -A -I eth0 -c 1 192.168.0.10
arpingでGratuitous ARPをうつ方法は
http://linux-ip.net/html/ether-arp.html
の"Example 2.2. Gratuitous ARP reply frames"を参考にしました。
send_arpというコマンドもあるそうですが標準ではインストールされていないのに対して、arpingはインストールされているのでこちらを使うほうがいいです。

確認。
host3$ curl http://192.168.0.10/
# ⇒host2のページが表示される

2010-12-04

CentOS5.5でext3ファイルシステムをext4に変換

参考:
[1] FractalizeR’s WebSite » CentOS: Migrating root (and any other) filesystem from ext3 to ext4
[2] Ext4 Howto - Ext4

# yum update
# yum install e4fsprogs

まずはrootパーティション以外で実験。/etc/fstabを編集し対象パーティションのファイルシステムタイプをext3からext4に修正。ext3のファイルシステムはext4としてもマウントできる。ext4 - Wikipedia参照。
# vi /etc/fstab

ext4対応のinitrdを作成。
# mv /boot/initrd-`uname -r`.img /boot/initrd-`uname -r`.img.old
# mkinitrd -v --with=ext4 /boot/initrd-`uname -r`.img `uname -r`

作成したinitrdを使うため再起動。
# reboot

再起動したら対象のパーティション(ここでは/dev/sdc2とします)をアンマウントして、ext4に変換。tune2fsではなくtune4fsを使用していることに注意。オプションの意味は[1]参照。
# umount /dev/sdc2
# tune4fs -O extents,uninit_bg,dir_index,flex_bg -m 1 /dev/sdc2
"Please run e4fsck on the filesystem."と言われるので実行します。[1]ではe4fsckではなくfsckにしていますが、ここではe4fsckにしてみます。オプションは[1]を真似します。
# e4fsck -pvfDC0 /dev/sdc1
/dev/sdc1: One or more block group descriptor checksums are invalid.  FIXED.
/dev/sdc1: Group descriptor 0 checksum is invalid.

/dev/sdc1: UNEXPECTED INCONSISTENCY; RUN fsck MANUALLY.
        (i.e., without -a or -p options)
すると[1]に書かれていた通り、-pオプションを外すように言われるので外して再実行。
# e4fsck -vfDC0 /dev/sdc1
すると
e4fsck 1.41.9 (22-Aug-2009)
One or more block group descriptor checksums are invalid.  Fix?
と聞かれるのでyを押します。あとはしばらく待ちます。
無事変換が終わったらマウントします。
# mount /dev/sdc1

TeraTermでの操作ログを接続先・日付毎に保存する

Tera Termでの自動ログインのように接続先毎にショートカットを作るのが前提です。あとは、接続先毎にログファイルの設定を変えたiniファイルを作っておいてtterm.exeの/Fオプションで指定すればOKです。

以下はsunshine11というホスト名用の設定です。

[Setup]/[Additional Settings]
[Log]タブ
Default log file name:tterm_sunshine11-%Y-%m-%d.log
Default log save folder:C:\Users\hnakamur\Documents\TeraTerm
Auto start logging:チェックオン
[Setup]/[Save setup]でC:\Users\hnakamur\Documents\TeraTerm\tterm_sunshine11.iniに保存します。

tterm.exeのショートカットは以下のようにします。
"C:\Program Files (x86)\teraterm\ttermpro.exe" /M=C:\Users\hnakamur\Documents\TeraTerm\sunshine11_local.ttl /F=C:\Users\hnakamur\Documents\TeraTerm\tterm_sunshine11.ini

tterm_sunshine11.iniの内容は以下の通りです。
connect '192.168.11.101:22 /ssh /2 /auth=pageant /user=hnakamur'

Linuxのscreenのログと違って、色つきlsのエスケープシーケンスは省いてログ出力されるので後から参照する際に便利そうです。

ブログ アーカイブ