2012年11月25日日曜日

KVM (Kernel-based Virtual Machine) の migration を行う際に、開ける必要のあるファイアウォールのポート番号

一番初めに答えから言いますと、KVM (Kernel-based Virtual Machine) の migration を行う際に、開ける必要のあるファイアウォールのポート番号は、「49152-49215」です。

この投稿では、CentOS 6.3 (x86_64) + GNOME (GUI) にて、ファイアウォールのポートを開ける手順を説明します。

GNOME (GUI) ではなく、iptables を CUI で手作業で設定されている方は、「49125-49215」を空けるように CUI で手作業設定を変更して下さい。(この投稿では、主に GUI の設定手順を説明します。CUI の設定手順はこの文章の補足をご参照ください)

  1. GNOME でファイアウォール設定画面を起動します。

    「(GNOME の) システム」→「設定」→「ファイアウォール」

    図1.「ファイアウォール設定(GUI) を起動する」

  2. GNOME でファイアウォール設定画面の起動時に、警告メッセージが表示されます。

    「CUI で手作業でファイアウォール (iptables) の設定をしている場合は、この GUI のファイアウォールの設定画面は使わずに、手作業で設定を行なって下さい。」という意味です。

    図2.「ファイアウォール設定(GUI)画面起動時の警告メッセージ」

    ここでは、「閉じる」を押します。

  3. 左側で「その他のポート」をクリックします。右側にポートが「49152-49215」でプロトコルが「TCP」の行が存在するどうかを探します。

    以下の画面の例ではすでに存在しているので、「49152-49215」の「TCP」のポートはすでに開かれている状態です。これ以下の作業は不要です。

    図3.「ファイアウォール設定(GUI)画面」

  4. 左側で「その他のポート」をクリックします。右側にポートが「49152-49215」でプロトコルが「TCP」の行が存在しない場合は、ポートが「49152-49215」でプロトコルが「TCP」の行を追加する必要があります。
    1. 「追加」ボタン (※ 図3を参照) をクリックします。
    2. 「ユーザー定義」のチェックボックスをオンにします (※ 図4を参照)。
    3. 「ポート」の欄には「49152-49215」と入力します (※ 図4を参照)。
    4. 「プロトコル」は「TCP」を選択します (※ 図4を参照)。

    図4.ファイアウォールの空きポート追加の画面

    「OK (※ 図4を参照)」→「適用 (※ 図3を参照)」→「(警告画面の) はい」の順番にクリックします。

補足 その1 「/etc/sysconfig/iptables」を直接手動で編集する場合

手作業で修正を行う場合は、「vi /etc/sysconfig/iptables」などで iptables のファイルを開き、

-A INPUT -m state --state NEW -m tcp -p tcp --dport 49152:49215 -j ACCEPT

という行を追加します。以下、追加した例です。

# Firewall configuration written by system-config-firewall
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 49152:49215 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT

追加し終えたら、保存して vi を終了します。

iptables ファイルに加えた変更を有効にするために、iptables サービスを一旦停止して、再起動します。

[root@pc111 ~]# service iptables stop
iptables: ファイアウォールルールを消去中: [ OK ]
iptables: チェインをポリシー ACCEPT へ設定中filter [ OK ]
iptables: モジュールを取り外し中: [ OK ]
[root@pc111 ~]# service iptables start
iptables: ファイアウォールルールを適用中: [ OK ]
iptables: 追加のモジュールを読み込み中:nf_conntrack_netbios[ OK ]
[root@pc111 ~]#

以上で、手動で iptables ファイルを編集する方法は終了です。

参考

2012年11月11日日曜日

KVM (Kernel-based Virtual Machine) のゲストOS (guest OS) を、仮想マシンマネージャーでマイグレーションを実行すると「No such file or directory」のエラーが発生する場合の対処

質問

KVM (Kernel-based Virtual Machine) のゲストOS (guest OS) を、仮想マシンマネージャーでマイグレーションを実行すると「No such file or directory」のエラーが発生する場合があります。その場合の対処はどのようになっていますか?

回答

このファイルは、仮想ハードディスクのファイルです。

dd コマンドにて、そのファイルをダミーで作成します (= 内容は全く無関係のファイルを作成)。

ここでは、pc111(ホストOS)上の「pc162」というゲストOS(仮想マシン) を、pc121(ホストOS) にマイグレーションする場合を例に説明します。

具体的には、「pc111というホストOS上の、『pc162』というゲストOSの仮想ハードディスクファイルの『pc162.img』を、pc121というホストOSに作成する」場合を例に説明します。

  1. 「コピー『元』ホストOSのマシン」にて、コピー元のオリジナルの仮想ハードディスクファイルのファイルサイズを確認します。

    KVM (Kernel-based Virtual Machine) の仮想ハードディスクファイルはデフォルトでは、「/var/lib/libvirt/images/」ディレクトリ内に存在します。

    [root@pc111 ~]# cd /var/lib/libvirt/images

    「ls -al」を実行して、ファイルサイズを確認します。ここでは例として「pc162.img」のファイルサイズを確認します。

    [root@pc111 images]# ls -al
    合計 608174148
    drwx--x--x. 2 root root 4096 8月 24 03:31 2012 .
    drwxr-xr-x. 9 root root 4096 9月 19 07:07 2012 ..
    -rwxr-xr-x. 1 qemu qemu 128849018880 11月 11 21:21 2012 pc154.img
    -rwxr-xr-x. 1 qemu qemu 128849018880 11月 11 21:19 2012 pc155.img
    -rwxr-xr-x. 1 qemu qemu 128849018880 11月 11 21:21 2012 pc156.img
    -rwxr-xr-x. 1 qemu qemu 128849018880 11月 11 21:20 2012 pc157.img
    -rw-------. 1 qemu qemu 42949672960 11月 11 21:21 2012 pc162.img
    -rw-------. 1 root root 42949672960 9月 6 14:11 2012 pc163.img
    -rw-r--r--. 1 root root 21474836480 9月 6 23:17 2012 pc171.img
    [root@pc111 images]#

    「pc162.img」のファイルサイズは「42949672960」バイトです。これは「40」GB と同じ意味です。

  2. 「コピー『先』ホストOSのマシン」にて、dd コマンドを利用して、ダミーのファイルを作成します。「/var/lib/libvirt/images/pc162.img」というファイルを、40GB のファイルサイズで作成する場合の例は以下の通りです。

    まずは、「/var/lib/libvirt/images/pc162.img」というファイルが既に存在しているかを確認します。

    [root@pc121 ~]# cd /var/lib/libvirt/images
    [root@pc121 images]# ls
    [root@pc121 images]#

    ls コマンドを実行しても、「pc162.img」というファイルは表示されませんでした。

    次に、dd コマンドで「pc162.img」というファイルを作成します。

    [root@pc121 images]# dd if=/dev/zero of=/var/lib/libvirt/images/pc162.img bs=1G count=40

    上のとおりに入力して「Enter」キーを押すと、dd コマンドが実行されます。時間がかかるので待ちます。

  3. dd コマンドの実行が終了した時の画面表示の例です。

    以下の画面では 40GB ではなく、43GB と表示されていますが、正しく 40GB のファイルが作成されているので心配する必要はありません。

    [root@pc121 images]# dd if=/dev/zero of=/var/lib/libvirt/images/pc162.img bs=1G count=40
    40+0 records in
    40+0 records out
    42949672960 bytes (43 GB) copied, 444.256 s, 96.7 MB/s
    [root@pc121 images]#
  4. これで、仮想マシンマネージャーで「オフラインでマイグレーション」を実行すると、(時間はかかりますが) マイグレーションが実行できるようになります。

KVM(Kernel-based Virtual Machine) のゲストOS (guest OS) を仮想マシンマネージャーで起動する手順

1.はじめに

KVM(Kernel-based Virtual Machine) のゲストOS (guest OS) を仮想マシンマネージャーで起動する手順をここでは説明します。

手順の説明の際に利用した環境は以下のとおりです。

ホスト OS (host OS)CentOS 6.3 (x86_64)
ホスト OS (host OS) の hostnamepc111
ホスト OS (host OS) の X-Window の種類GNOME
ゲスト OS (guest OS)Windows 7 Professional (64bit)
ゲスト OS (guest OS) の hostnamepc157

このブログの投稿では、「pc111」上で、仮想マシンの「pc157」を起動する場合を例に説明します。

2.準備

以下の手順を実行する前に、あらかじめ、pc111 の CentOS を起動してログインをしておきます。

3.実際の手順

  1. CentOS にログイン済みの状態で、仮想マシンマネージャーを起動します。

    「アプリケーション」→「システムツール」→「仮想マシンマネージャ」

  2. 以下は、仮想マシンマネージャーが起動した直後の画面です。
  3. ここでは例として、「pc157」という仮想マシン (ゲストOS、guest OS) を起動します。

    「pc157」を右クリックして、「実行」を左クリックします。

  4. 「pc157」という仮想マシン (ゲストOS、guest OS) の電源がオンになりました。

    仮想マシンマネージャーの画面上は「pc157」は「停止中」から「実行中」に表示が変わっています。

  5. 「pc157」という仮想マシン (ゲストOS、guest OS) の画面を表示したい場合は、「pc157」を右クリックして「開く」を左クリックします。
  6. 「pc157」という仮想マシン (ゲストOS、guest OS) の画面が表示されます。以下はその表示例です。

    「pc157」起動中の画面(その1)

  7. 「pc157」起動中の画面(その2)です。
  8. 「pc157」起動中の画面(その3)です。

2012年9月12日水曜日

fstab をいじっていたら CentOS が起動しなくなったときの対処 (RAID1を組んでいる場合)

CentOS 6.3 (x86_64) にて /etc/fstab を修正して CentOS を再起動した時に起動途中で止まってしまったことがありました。

対処として、「fstabをいじっていたら起動しなくなったときの対処」を、ほぼそのまま実行して、CentOS が起動するようになりました。

自分の環境では RAID1 を組んでいて、mount のコマンドの引数が上の URL のページと異なったため、メモとしてここに残します。

「『mount -o remount,rw /dev/VolGroup00/LogVol00 /』
を実行しようとしたけれども、/etc/fstab には『/dev/VolGroup00/LogVol00』というデバイスがない・・・」とお困りの方へ。以下の手順が役に立つかもしれません。

  1. まずシングルユーザーモードで起動します。
  2. /etc/fstab で「/」に対応するデバイス名、あるいは UUID を調べる
    vi /etc/fstab

    以下の /etc/fstab を見ると「/」に対応する UUID は「3ffe40ba-4259-48ee-9f04-64a4ad4bbfa7」であることが分かります。

    #
    # /etc/fstab
    # Created by anaconda on Tue Sep 4 19:25:32 2012
    #
    # Accessible filesystems, by reference, are maintained under '/dev/disk'
    # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
    #
    UUID=3ffe40ba-4259-48ee-9f04-64a4ad4bbfa7 / ext4 defaults 1 1
    UUID=b1ec5276-7cbc-495b-a291-327b052d27c5 /boot ext4 defaults 1 2
    /dev/mapper/sil_biajaecfafccp2 swap swap defaults 0 0
    tmpfs /dev/shm tmpfs defaults 0 0
    devpts /dev/pts devpts gid=5,mode=620 0 0
    sysfs /sys sysfs defaults 0 0
    proc /proc proc defaults 0 0

    (余談) ちなみに・・・この vi を実行している時に、自分が間違えて変更した箇所を修正してなおかつ上書き保存が出来れば何も問題はありませんが、残念ながら読み取り専用モードでのみ開ける状態です。

    試しに、「chmod 777 /etc/fstab」を実行してから vi /etc/fstab を実行したものの、やはり読み取り専用のままでした

  3. vi を終了します。

    vi を終了した時点でも、/etc/fstab の内容が画面に表示されたままなので、UUID をメモに取る必要はありません。

    もし、/etc/fstab の内容が画面に表示されない場合は、vi /etc/fstab を実行して、UUID を紙に手書きで書き写しておく必要があります。

  4. mount を実行する。

    mount を実行します。上で出てきた UUID あるいはデバイス名をキーボードで手入力する必要があります。

    mount -o remount,rw 3ffe40ba-4259-48ee-9f04-64a4ad4bbfa7 /

    これで、/etc/fstab が読み書き可能な状態で開けるようになりました。

  5. vi /etc/fstab

    vi にて、/etc/fstab を開きます。

    読み書き可能な状態になっているはずです。

    必要に応じて修正を行い、保存して vi を終了します。

  6. exit を実行

    exit を実行します。

    exit
  7. exit 実行後、PC が再起動します。CentOS が正常に起動するのを確認します。

2012年8月10日金曜日

CentOS 6.3 (x86_64) に TigerVNC Server をインストールする手順

CentOS 6.3 (x86_64) に TigerVNC Server をインストールしたときの手順を記録のためにここに記す。

参考: 2009年09月19日 vncサーバー構築(CentOS5)

  1. TigerVNCServer をインストール
    yum -y install vnc-server
  2. 「/etc/sysconfig/vncservers」(VNC 用設定ファイルのうちの一つ) をバックアップ
    cp /etc/sysconfig/vncservers /etc/sysconfig/vncservers.bak
  3. 「/etc/sysconfig/vncservers」を vi で編集する。
    # VNCSERVERS="2:myusername"
    # VNCSERVERARGS[2]="-geometry 800x600 -nolisten tcp -localhost"


    VNCSERVERS="3:hachitaro"
    VNCSERVERARGS[3]="-geometry 1024x768 -nolisten tcp"
  4. VNC Viewer で VNC 接続するユーザーのパスワードをセットする。

    su コマンドを実行して、hachitaro ユーザーに切り替える。

    [root@pc101 ~]# su - hachitaro
    [hachitaro@pc101 ~]$
  5. VNC Viewer で VNC 接続するユーザーのパスワードをセットする。

    su コマンドを実行して、hachitaro ユーザーに切り替える。

    [hachitaro@pc101 ~]$ vncpasswd
    Password:
    Verify:
    [hachitaro@pc101 ~]$

    exit コマンドを実行して、元のユーザーに戻る。

    [hachitaro@pc101 ~]$ exit
    logout
    [root@pc101 ~]#
  6. いったん、vncserver サービスを起動して、その後 stop する。

    vncserver サービスを起動する。

    [root@pc101 ~]# service vncserver start
    VNC サーバー を起動中: 3:hachitaro xauth: creating new authority file /home/hachitaro/.Xauthority
    xauth: (stdin):1: bad display name "pc101:3" in "add" command

    New 'pc101:3 (hachitaro)' desktop is pc101:3

    Creating default startup script /home/hachitaro/.vnc/xstartup
    Starting applications specified in /home/hachitaro/.vnc/xstartup
    Log file is /home/hachitaro/.vnc/pc101:3.log

    [ OK ]
    [root@pc101 ~]#

    vncserver サービスを stop する。

    [root@pc101 ~]# service vncserver stop
    VNC サーバー を停止中: 3:hachitaro [ OK ]
    [root@pc101 ~]#
  7. VNC利用ユーザーの、「xstartup」ファイルを編集する。
    vi /home/hachitaro/.vnc/xstartup

    「/home/hachitaro/.vnc/xstartup」のファイル内容 (変更前)

    #!/bin/sh

    [ -r /etc/sysconfig/i18n ] && . /etc/sysconfig/i18n
    export LANG
    export SYSFONT
    vncconfig -iconic &
    unset SESSION_MANAGER
    unset DBUS_SESSION_BUS_ADDRESS
    OS=`uname -s`
    if [ $OS = 'Linux' ]; then
    case "$WINDOWMANAGER" in
    *gnome*)
    if [ -e /etc/SuSE-release ]; then
    PATH=$PATH:/opt/gnome/bin
    export PATH
    fi
    ;;
    esac
    fi
    if [ -x /etc/X11/xinit/xinitrc ]; then
    exec /etc/X11/xinit/xinitrc
    fi
    if [ -f /etc/X11/xinit/xinitrc ]; then
    exec sh /etc/X11/xinit/xinitrc
    fi
    [ -r $HOME/.Xresources ] && xrdb $HOME/.Xresources
    xsetroot -solid grey
    xterm -geometry 80x24+10+10 -ls -title "$VNCDESKTOP Desktop" &
    twm &

    「/home/hachitaro/.vnc/xstartup」のファイルの一番下の2行を変更して、ファイルを保存する。

    「/home/hachitaro/.vnc/xstartup」のファイル内容 (変更後)

    #!/bin/sh

    [ -r /etc/sysconfig/i18n ] && . /etc/sysconfig/i18n
    export LANG
    export SYSFONT
    vncconfig -iconic &
    unset SESSION_MANAGER
    unset DBUS_SESSION_BUS_ADDRESS
    OS=`uname -s`
    if [ $OS = 'Linux' ]; then
    case "$WINDOWMANAGER" in
    *gnome*)
    if [ -e /etc/SuSE-release ]; then
    PATH=$PATH:/opt/gnome/bin
    export PATH
    fi
    ;;
    esac
    fi
    if [ -x /etc/X11/xinit/xinitrc ]; then
    exec /etc/X11/xinit/xinitrc
    fi
    if [ -f /etc/X11/xinit/xinitrc ]; then
    exec sh /etc/X11/xinit/xinitrc
    fi
    [ -r $HOME/.Xresources ] && xrdb $HOME/.Xresources
    xsetroot -solid grey
    # xterm -geometry 80x24+10+10 -ls -title "$VNCDESKTOP Desktop" &
    gnome-session &
  8. vncserver サービスを起動する。

    vncserver サービスを起動する。

    [root@pc101 ~]# service vncserver start
    VNC サーバー を起動中: 3:hachitaro xauth: (stdin):1: bad display name "pc101:3" in "add" command

    New 'pc101:3 (hachitaro)' desktop is pc101:3

    Starting applications specified in /home/hachitaro/.vnc/xstartup
    Log file is /home/hachitaro/.vnc/pc101:3.log

    [ OK ]
    [root@pc101 ~]#
  9. iptables の設定を変更 (VNC Server の利用する 5900-5910 のポートを開ける)
    [root@pc101 ~]# vi /etc/sysconfig/iptables
  10. 「/etc/sysconfig/iptables」の、「COMMIT」よりも上の場所に、以下の内容を追加する。追加した後はファイルを保存する。
    -A INPUT -p tcp -m tcp --dport 5900:5910 -j ACCEPT

    (変更前の例)

    # Firewall configuration written by system-config-firewall
    # Manual customization of this file is not recommended.
    *filter
    :INPUT ACCEPT [0:0]
    :FORWARD ACCEPT [0:0]
    :OUTPUT ACCEPT [0:0]
    -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
    -A INPUT -p icmp -j ACCEPT
    -A INPUT -i lo -j ACCEPT
    -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
    -A INPUT -j REJECT --reject-with icmp-host-prohibited
    -A FORWARD -j REJECT --reject-with icmp-host-prohibited
    COMMIT

    (変更後の例)

    # Firewall configuration written by system-config-firewall
    # Manual customization of this file is not recommended.
    *filter
    :INPUT ACCEPT [0:0]
    :FORWARD ACCEPT [0:0]
    :OUTPUT ACCEPT [0:0]
    -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
    -A INPUT -p icmp -j ACCEPT
    -A INPUT -i lo -j ACCEPT
    -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
    -A INPUT -p tcp -m tcp --dport 5900:5910 -j ACCEPT
    -A INPUT -j REJECT --reject-with icmp-host-prohibited
    -A FORWARD -j REJECT --reject-with icmp-host-prohibited
    COMMIT
  11. 「/etc/sysconfig/iptables」に加えた変更を有効にするために、iptables サービスを再起動する。
    [root@pc101 ~]# service iptables restart
    iptables: ファイアウォールルールを消去中: [ OK ]
    iptables: チェインをポリシー ACCEPT へ設定中filter [ OK ]
    iptables: モジュールを取り外し中: [ OK ]
    iptables: ファイアウォールルールを適用中: [ OK ]
    [root@pc101 ~]#
  12. VNC Viewer (RealVNC など) で、VNC Server へ接続する。
    設定項目名称設定値備考
    IPアドレスとポート番号192.168.1.101::5903VNC Viewer の種類によっては「IPアドレス::ポート番号」「IPアドレス:ポート番号」など記述の方法が異なる場合がある。つながらない場合は記述を変更して試してみる。
    ユーザー名hachitaroVNC Viewer の種類によっては指定が不要な場合がある
    パスワード(上の vncpasswd でセットしたパスワードを入力する)

2012年6月25日月曜日

Linux CentOS 6.2 (x86_64) にて、KVM (Kernel-based Virtual Machine) の xml ファイルと仮想imgファイルをバックアップするスクリプト

1.「kvm-bkonevm.sh」スクリプト概要

Linux CentOS 6.2 (x86_64) にて、KVM (Kernel-based Virtual Machine) の xml ファイルフルパスを指定すると、その KVM の xml ファイル自体と仮想imgファイルをバックアップするスクリプトを作成しました。

  • 「指定された仮想マシンの電源を自動的にシャットダウン、仮想マシンの xml ファイルと仮想 HDD ファイルのバックアップ、バックアップ終了後に仮想マシンの電源をオン」という機能をひと通り備えています。

もちろん事前の動作確認や設定は必要ですが、「毎晩、とある重要な仮想マシン1台を、自動的にシャットダウン、バックアップ、電源をオンにする」という利用方法も可能です。

2.前準備

事前に、cpulimit というソフトをインストールしておく必要があります。

(参考) Linux (CentOS 6.2 x86_64) に、「cpulimit」をインストールして、実行する (= 絶対的な優先度を下げる) 手順

http://hachitaro.blogspot.jp/2012/06/linux-centos-62-x8664-cpulimit.html

3.「kvm-bkonevm.sh」スクリプト利用方法

「kvm-bkonevm.sh」スクリプトの利用方法は以下の通りです。

書式

(this scriptfile) (kvm xml file fullpath) (copy destination directory for copying kvm xml file and hd image file)

利用例

./kvm-bkonevm.sh /etc/libvirt/qemu/pc014.xml /mnt/pc079/d/bak/0101_phasedbak

上のとおりに実行すると、以下の処理を実行します。

  1. スクリプトは、「/etc/libvirt/qemu/pc014.xml」で指定されている仮想マシンの電源がオン(ON) の場合は、シャットダウン処理を開始します。

    kvm-bkonevm.sh を実行した後で「仮想マシンの電源がオンになっている」場合は、この kvm-bkonevm.sh スクリプトが仮想マシンに対してシャットダウン命令 (virsh shutdown) を発行します。

    仮想マシンが何らかの理由で自動的にシャットダウンしない場合は、手作業で仮想マシンをシャットダウン操作をする必要があります。

  2. スクリプトは、シャットダウン処理が完全に終了して、仮想マシンの電源がオフ(OFF) になるまで待機します。
  3. スクリプトは、xml ファイルと、仮想 HDD イメージファイルをバックアップ (コピー) します。

    xml ファイル、仮想 HDD イメージファイルいずれとも、できるかぎり元のディレクトリ構成を保ったままバックアップします。

    • xmlファイルのバックアップ先の例

      「/etc/libvirt/qemu/pc014.xml」

    • 仮想 HDD イメージファイルのバックアップ先の例

      「/var/lib/libvirt/images/pc014.img」

  4. スクリプトは、バックアップ終了後に仮想マシンの電源をオンにします。

4.「kvm-bkonevm.sh」スクリプト本体

スクリプトご利用上の注意」をよくお読みの上、ご了承いただいた方はご利用下さい。

「kvm-bkonevm.sh」スクリプトは以下の通りです。

#!/bin/sh

# usage
# (this scriptfile) (kvm xml file fullpath) (copy destination directory for copying kvm xml file and hd image file)
# example
# ./kvm-bkonevm.sh /etc/libvirt/qemu/pc014.xml /mnt/pc079/d/bak/0101_phasedbak


function funcCPULimit() {
curdttm=`date +%Y%m%d%H%M%S`
msg="cpulimit -e qemu-kvm -l 5 &"
echo "${quotstr}${curdttm}${quotstr} ${quotstr}${msg}${quotstr}" | tee -a ${logdirfilename}
cpulimit -e qemu-kvm -l 10 &

curdttm=`date +%Y%m%d%H%M%S`
msg="cpulimit -e rsync -l 10 &"
echo "${quotstr}${curdttm}${quotstr} ${quotstr}${msg}${quotstr}" | tee -a ${logdirfilename}
cpulimit -e rsync -l 20 &

curdttm=`date +%Y%m%d%H%M%S`
msg="cpulimit -e mysqldump -l 5 &"
echo "${quotstr}${curdttm}${quotstr} ${quotstr}${msg}${quotstr}" | tee -a ${logdirfilename}
cpulimit -e qemu-kvm -l 10 &

return 11
}


# パスの文字列に「//」のように不要な「/ (スラッシュ)」が入っている場合は
# 「//」を「/」へ置き換える。
function FuncReplaceDoubleSlashtoSingle() {
wstr=$1
retstr=`echo "${wstr}" | sed -e 's/\/\//\//g'`
echo ${retstr}
}

function FuncRemoveRightSlash() {
wstr=$1

# wstr の最後の一文字を抜き出す。
wstrlenall=`echo $((${#wstr}))`
lastchar=${wstr:${wstrlenall}:${wstrlenall}}

if [[ ${lastchar} = "/" ]]
then
# 一番右端の一文字が「/」なら
# 「/」を削除する。
retstr=${wstr##*/}
else
# 一番右端の一文字が「/」以外なら
# 削除処理は不要
retstr=${wstr}
fi

echo ${retstr}

}

function FuncAddRightSlash() {
wstr=$1

# wstr の最後の一文字を抜き出す。
wstrlenall=`echo $((${#wstr}))`
lastchar=${wstr:${wstrlenall}:${wstrlenall}}

if [[ ${lastchar} = "/" ]]
then
# 一番右端の一文字が「/」なら
# 「/」を追加する必要はない。
retstr=${wstr}
else
# 一番右端の一文字が「/」以外なら
# 「/」を追加する。
retstr=${wstr}'/'
fi

echo ${retstr}

}

function FuncGetStrQuotedWithDifferentStr() {

# getting kvm sv251.xml information
# wallstr=`virsh domxml-to-native qemu-argv /etc/libvirt/qemu/sv251.xml`

# 第1引数は、
# 「virsh domxml-to-native qemu-argv (kvm の xml ファイルフルパス)」
# の値。
# wallstr=$1
# wallstr=`virsh domxml-to-native qemu-argv /etc/libvirt/qemu/sv251.xml`

# echo '${1}..........'$1
wallstr=$1
# echo '${wallstr}..........'${wallstr}

wallstrlen=`echo ${#wallstr}`

# echo 'wallstrlen is '${wallstrlen}

# searchtarget_leftstr='-drive file='
searchtarget_leftstr=$2
searchtarget_leftstrlen=`echo ${#searchtarget_leftstr}`
# searchtarget_rightstr=','
searchtarget_rightstr=$3


tempstr[0]=`echo "${wallstr##*${searchtarget_leftstr}}"`
# echo '${tempstr[0]} is '${tempstr[0]}
tempstrlen[0]=`echo ${#tempstr[0]}`
# echo '${tempstrlen[0]} is '${tempstrlen[0]}

targetstr_startpos=`expr ${wallstrlen} - ${tempstrlen[0]}`
# echo '${targetstr_startpos} is '${targetstr_startpos}
targetstr_startpos_fixed=`expr ${targetstr_startpos} + 1`

tempstr[1]=`echo "${tempstr[0]#*${searchtarget_rightstr}}"`
# echo '${tempstr[1]} is '${tempstr[1]}
tempstrlen[1]=`echo ${#tempstr[1]}`
# echo '${tempstrlen[1} is '${tempstrlen[1]}

targetstr_endpos=`expr ${wallstrlen} - ${tempstrlen[1]}`
# echo '${targetstr_endpos} is '${targetstr_endpos}
targetstr_endpos_fixed=`expr ${targetstr_endpos} - 1`
# echo '${targetstr_endpos_fixed} is '${targetstr_endpos_fixed}


# retstr=`echo ${wallstr} | cut -c ${targetstr_startpos}-${targetstr_endpos_fixed}`
retstr=`echo ${wallstr} | cut -c ${targetstr_startpos_fixed}-${targetstr_endpos_fixed}`

echo ${retstr}


}


function funcGetKVMInfo() {
# getting KVM xml file copy source, destination,
# and getting KVM hd file copy source, destination

# getting KVM HDD information
# wstr=`virsh domxml-to-native qemu-argv /etc/libvirt/qemu/sv251.xml`


wstr=`virsh domxml-to-native qemu-argv ${kvmxml_fullpath_src}`

# KVM の 仮想マシン名を取得する。
# 左側が「'-name '」で、(一番右端に半角スペースを含める)
leftstr='-name '
# 右側が「' -uuid'」で、(一番左端に半角スペースを含める)
# rightstr=' -uuid'
rightstr=' '
# 囲まれた文字列を、${wstr} から探し出して、
# kvm_hd_fullpath_src に代入する。
# 引数 ${wstr} の内容が半角スペースを含むため、"" でくくる。
targetvmname=`FuncGetStrQuotedWithDifferentStr "${wstr}" "${leftstr}" "${rightstr}"`
# echo '${targetvmname} is "'${targetvmname}'"'

curdttm=`date +%Y%m%d%H%M%S`
msg='${targetvmname} is "'${targetvmname}'"'
echo "${quotstr}${curdttm}${quotstr} ${quotstr}${msg}${quotstr}" | tee -a ${logdirfilename}


# KVM の 仮想 HDD のフルパスを取得する。
# 左側が「'-drive file='」で、
leftstr='-drive file='
# 右側が「','」で、
rightstr=','
# 囲まれた文字列を、${wstr} から探し出して、
# kvm_hd_fullpath_src に代入する。
# 引数 ${wstr} の内容が半角スペースを含むため、"" でくくる。
kvm_hd_fullpath_src=`FuncGetStrQuotedWithDifferentStr "${wstr}" "${leftstr}" "${rightstr}"`
# echo '${kvm_hd_fullpath_src} is '${kvm_hd_fullpath_src}
curdttm=`date +%Y%m%d%H%M%S`
msg='${kvm_hd_fullpath_src} is '${kvm_hd_fullpath_src}
echo "${quotstr}${curdttm}${quotstr} ${quotstr}${msg}${quotstr}" | tee -a ${logdirfilename}

# kvm_hd_dir_src=`echo ${kvm_hd_fullpath_src%/*}`
kvm_hd_dir_src=${kvm_hd_fullpath_src%/*}
# echo '${kvm_hd_dir_src} is '${kvm_hd_dir_src}
curdttm=`date +%Y%m%d%H%M%S`
msg='${kvm_hd_dir_src} is '${kvm_hd_dir_src}
echo "${quotstr}${curdttm}${quotstr} ${quotstr}${msg}${quotstr}" | tee -a ${logdirfilename}

# echo '${kvmxml_fullpath_src} is '${kvmxml_fullpath_src}
curdttm=`date +%Y%m%d%H%M%S`
msg='${kvmxml_fullpath_src} is '${kvmxml_fullpath_src}
echo "${quotstr}${curdttm}${quotstr} ${quotstr}${msg}${quotstr}" | tee -a ${logdirfilename}

kvm_xml_dir_src=${kvmxml_fullpath_src%/*}
# echo '${kvm_xml_dir_src} is '${kvm_xml_dir_src}
curdttm=`date +%Y%m%d%H%M%S`
msg='${kvm_xml_dir_src} is '${kvm_xml_dir_src}
echo "${quotstr}${curdttm}${quotstr} ${quotstr}${msg}${quotstr}" | tee -a ${logdirfilename}

# echo '${copybasedir_dest} is '${copybasedir_dest}
curdttm=`date +%Y%m%d%H%M%S`
msg='${copybasedir_dest} is '${copybasedir_dest}
echo "${quotstr}${curdttm}${quotstr} ${quotstr}${msg}${quotstr}" | tee -a ${logdirfilename}

curdttm=`date +%Y%m%d%H%M%S`
curdt=`date +%Y%m%d`

thispchostname=`hostname -s`

kvmxml_copydir_dest=`FuncAddRightSlash ${copybasedir_dest}`
# kvmxml_copydir_dest=${kvmxml_copydir_dest}`FuncAddRightSlash ${curdt}`
kvmxml_copydir_dest=${kvmxml_copydir_dest}`FuncAddRightSlash ${curdttm}`
kvmxml_copydir_dest=${kvmxml_copydir_dest}`FuncAddRightSlash ${thispchostname}`
kvmxml_copydir_dest=${kvmxml_copydir_dest}`FuncRemoveRightSlash ${kvm_xml_dir_src}`
kvmxml_copydir_dest=`FuncReplaceDoubleSlashtoSingle ${kvmxml_copydir_dest}`
curdttm=`date +%Y%m%d%H%M%S`
msg='${kvmxml_copydir_dest} is '${kvmxml_copydir_dest}
echo "${quotstr}${curdttm}${quotstr} ${quotstr}${msg}${quotstr}" | tee -a ${logdirfilename}
kvmhd_copydir_dest=`FuncAddRightSlash ${copybasedir_dest}`
# kvmhd_copydir_dest=${kvmhd_copydir_dest}`FuncAddRightSlash ${curdt}`
kvmhd_copydir_dest=${kvmhd_copydir_dest}`FuncAddRightSlash ${curdttm}`
kvmhd_copydir_dest=${kvmhd_copydir_dest}`FuncAddRightSlash ${thispchostname}`
kvmhd_copydir_dest=${kvmhd_copydir_dest}`FuncRemoveRightSlash ${kvm_hd_dir_src}`
kvmhd_copydir_dest=`FuncReplaceDoubleSlashtoSingle ${kvmhd_copydir_dest}`
# echo '${kvmhd_copydir_dest} is '${kvmhd_copydir_dest}
curdttm=`date +%Y%m%d%H%M%S`
msg='${kvmhd_copydir_dest} is '${kvmhd_copydir_dest}
echo "${quotstr}${curdttm}${quotstr} ${quotstr}${msg}${quotstr}" | tee -a ${logdirfilename}

}

function funcWaitWithCountDown() {
wWaitSecCount=$1
wBaseMsg=$2
curdttm=`date +%Y%m%d%H%M%S`
msg="${wWaitSecCount} ${wBaseMsg}"
echo "${quotstr}${curdttm}${quotstr} ${quotstr}${msg}${quotstr}" | tee -a ${logdirfilename}
until [ ${wWaitSecCount} -eq 0 ]
do
curdttm=`date +%Y%m%d%H%M%S`
msg="${wWaitSecCount}"
echo "${quotstr}${curdttm}${quotstr} ${quotstr}${msg}${quotstr}" | tee -a ${logdirfilename}
wWaitSecCount=`expr ${wWaitSecCount} - 1`
sleep 1
done

}

function funcKVM_VM_PowerOnProcStart() {
# echo "now start vm "${targetvmname}
curdttm=`date +%Y%m%d%H%M%S`
msg="Now PowerOn the vm "${targetvmname}
echo "${quotstr}${curdttm}${quotstr} ${quotstr}${msg}${quotstr}" | tee -a ${logdirfilename}

curdttm=`date +%Y%m%d%H%M%S`
msg=`virsh start ${targetvmname}`
echo "${quotstr}${curdttm}${quotstr} ${quotstr}${msg}${quotstr}" | tee -a ${logdirfilename}

curdttm=`date +%Y%m%d%H%M%S`
msg="The PowerOn Process has finished. Please wait for OS to start."${targetvmname}
echo "${quotstr}${curdttm}${quotstr} ${quotstr}${msg}${quotstr}" | tee -a ${logdirfilename}

}

function funcKVM_VM_ShutdownStart() {
curdttm=`date +%Y%m%d%H%M%S`
msg="starting to shutdown ${targetvmname}..."
echo "${quotstr}${curdttm}${quotstr} ${quotstr}${msg}${quotstr}" | tee -a ${logdirfilename}
# echo ${targetvmname}"shutdown starting..."
# ssh -t -t root@${targetvmname} shutdown -h now
curdttm=`date +%Y%m%d%H%M%S`
# msg=`ssh -t -t root@${targetvmname} shutdown -h now`
msg=`virsh shutdown ${targetvmname}`
echo "${quotstr}${curdttm}${quotstr} ${quotstr}${msg}${quotstr}" | tee -a ${logdirfilename}

curdttm=`date +%Y%m%d%H%M%S`
msg="shutdown process of ${targetvmname} has started..."
echo "${quotstr}${curdttm}${quotstr} ${quotstr}${msg}${quotstr}" | tee -a ${logdirfilename}
}

function funcKVM_VM_ShutdownFinishWait() {
while [ 1 -eq 1 ]
do
curvmdomstat=`virsh domstate ${targetvmname}`
# echo "curent ${targetvmname} status is ${curvmdomstat}"
curdttm=`date +%Y%m%d%H%M%S`
msg="curent ${targetvmname} status is ${curvmdomstat}. Now waiting for shut off..."
echo "${quotstr}${curdttm}${quotstr} ${quotstr}${msg}${quotstr}" | tee -a ${logdirfilename}
sleep 1
if [ `echo ${curvmdomstat} | grep シャットオフ` ]; then
break
fi
if [ `echo ${curvmdomstat} | grep "shut off"` ]; then
break
fi
done

curdttm=`date +%Y%m%d%H%M%S`
msg="curent ${targetvmname} status is ${curvmdomstat}"
echo "${quotstr}${curdttm}${quotstr} ${quotstr}${msg}${quotstr}" | tee -a ${logdirfilename}
curdttm=`date +%Y%m%d%H%M%S`
msg="Now ${targetvmname} is confirmed to be ${curvmdomstat}"
echo "${quotstr}${curdttm}${quotstr} ${quotstr}${msg}${quotstr}" | tee -a ${logdirfilename}

}


function funcKVM_VM_XML_backup() {
curdttm=`date +%Y%m%d%H%M%S`
msg=`mkdir -p -m +w ${kvmxml_copydir_dest} 2>&1`
echo "${quotstr}${curdttm}${quotstr} ${quotstr}${msg}${quotstr}" | tee -a ${logdirfilename}

curdttm=`date +%Y%m%d%H%M%S`
msg=`rsync -avvv --delete --timeout=3600 --bwlimit=8192 ${kvmxml_fullpath_src} ${kvmxml_copydir_dest} 2>&1`
echo "${quotstr}${curdttm}${quotstr} ${quotstr}${msg}${quotstr}" | tee -a ${logdirfilename}
return 11
}

# rsync option
# --bwlimit=8192 --timeout=3600
# is added to avoid the following error
# rsync: connection unexpectedly closed
#
# reference
# http://kawama.jp/archives/2007/12/rsyncssh.html
function funcKVM_VM_HDImgFile_backup() {
curdttm=`date +%Y%m%d%H%M%S`
msg=`mkdir -p -m +w ${kvmhd_copydir_dest} 2>&1`
echo "${quotstr}${curdttm}${quotstr} ${quotstr}${msg}${quotstr}" | tee -a ${logdirfilename}

curdttm=`date +%Y%m%d%H%M%S`
msg=`rsync -avvv --delete --timeout=3600 --bwlimit=8192 ${kvm_hd_fullpath_src} ${kvmhd_copydir_dest} 2>&1`
echo "${quotstr}${curdttm}${quotstr} ${quotstr}${msg}${quotstr}" | tee -a ${logdirfilename}


return 11
}

function funcDispFinishedMessage() {
curdttm=`date +%Y%m%d%H%M%S`
msg="${targetvmname} backup process has finished. Thank you for your cooperation."
echo "${quotstr}${curdttm}${quotstr} ${quotstr}${msg}${quotstr}" | tee -a ${logdirfilename}
return 11
}

function funcMainProc() {
# funcWaitWithCountDown 30 " now waiting for starting a process of KVM xml and hd file backup... If you want to stop, Ctrl+C"
funcCPULimit
funcGetKVMInfo
funcWaitWithCountDown 30 " now waiting for shutdown ${targetvmname}... If you want to stop, Ctrl+C"
funcKVM_VM_ShutdownStart
funcKVM_VM_ShutdownFinishWait
funcWaitWithCountDown 30 " now waiting for staring file copy of ${targetvmname} files... If you want to stop, Ctrl+C"
funcKVM_VM_XML_backup
funcKVM_VM_HDImgFile_backup
funcKVM_VM_PowerOnProcStart
funcDispFinishedMessage
}

function funcMain() {
funcMainProc
}


curdttm=`date +%Y%m%d%H%M%S`
curdt=`date +%Y%m%d`
# ログファイル名を決定する。
curdttmforlogfilename=${curdttm}
logdir='/var/log/1050/'
mkdir -p -m +w ${logdir} 2>&1
logfilename_suffix='_log_'
shfilename=`basename $0`
logfilename_ext='.txt'
quotstr='"'
logdirfilename=${logdir}${curdttmforlogfilename}${logfilename_suffix}${shfilename}${logfilename_ext}


kvmxml_fullpath_src=$1
copybasedir_dest=$2
# funcMain ${kvmxml_fullpath_src} ${copydir_dest}
funcMain ${kvmxml_fullpath_src} ${copydir_dest}

Linux (CentOS 6.2 x86_64 用) スクリプトご利用上の注意点、免責事項

このブログで公開されている、Linux (CentOS 6.2 x86_64 用) スクリプトをご利用になる場合の注意点、免責事項を以下のとおりお伝えいたします。

  • Linux (CentOS 6.2 x86_64 含む) で利用される場合は、以下のスクリプトをコピーしてテキストエディタに貼り付けて、「UTF-8(BOM無)」「改行コード(LFのみ)」でファイル名は「mybackup01.sh」と、拡張子は「.sh」にする点にご留意下さい。
  • 私のマシンでは特に問題なく動作していることを確認していますが、他のマシンでも必ず意図通りに動作するという保証はいたしかねます。
  • 以下のスクリプトを利用したことによるあらゆる障害 (データの消失、破損、時間的損害、金銭的損害につながる障害を含めた障害) が発生した場合、私は一切の責任を負いかねます。その点をご了承の上でご利用をお願い致します。
  • もし誤りやお気づきの点がありましたらお知らせくださると幸いです。
  • 恐れ入りますが、このスクリプトに関してのサポートは控えさせて頂きます。
  • 商用、非商用に限らずご利用はご自由にどうぞ。

linux (CentOS 6.2 x86_64) で、「cpulimit」と --bwlimit を使って、マシン負荷を減らしネットワーク負荷を減らして rsync を実行する方法

1.rsync の高負荷を減らすには

Linux の rsync (Windows の robocopy に相当) は非常に便利です。ただしマシンやネットワークにとって高い負荷がかかって困る場合もあります。

  • rsync を実行すると、マシンに高い負荷がかかりの動作が重たくなる
  • rsync を実行すると、ネットワークに高い負荷がかかり、Web サイトの読み込みが遅くなる、あるいはエラーが発生する。

ここでは、「Linux (CentOS 6.2 x86_64 ディストリビューション)」の場合を例に、「マシンにとって低負荷、ネットワークにとっても低負荷」な rsync を実行する手順を説明します。

2.前準備

事前に、cpulimit というソフトをインストールしておきます。

(参考) Linux (CentOS 6.2 x86_64) に、「cpulimit」をインストールして、実行する (= 絶対的な優先度を下げる) 手順

http://hachitaro.blogspot.jp/2012/06/linux-centos-62-x8664-cpulimit.html

3.rsync スクリプトの例

私が作成した、「マシンとネットワークに低負荷の rsync」スクリプトを以下に記します。

スクリプトご利用上の注意」をよくお読みの上、ご了承いただいた方はご利用下さい。

「mybackup01.sh」

#!/bin/sh

# clamproc1501

# 実行中のスクリプトのディレクトリを取得
# CURDIR=`pwd`
CURDIR=`dirname $0`
# echo ${CURDIR}
thispchostname=`hostname -s`
echo ${thispchostname}


curdttmforlogfilename=`date +%Y%m%d%H%M%S`

logfilesdir='/var/log/1050/'
rsynclogdir='/var/log/1050/'
rsynclogfilename_suffix='rsynclog'

mkdir -m 777 -p ${logfilesdir}
mkdir -m 777 -p ${rsynclogdir}

shfilename=`basename $0`
logfilename_ext='.txt'
quotstr=



rsynclogdirfilename=${rsynclogdir}${curdttmforlogfilename}_${thispchostname}_${shfilename}_${rsynclogfilename_suffix}${logfilename_ext}


# 関数の戻り値
RETNOTSET=1
RETTRUE=11
RETFALSE=12

popd
wScriptDir=$(cd $(dirname $0) && pwd)
pushd

. ${wScriptDir}'/../0000_com/'com_proc.sh

PATH=/usr/bin:/bin


# syncing nas252 to nas253

func_check_other_proc() {
func_check_other_highload_process_running
rtn=$?
if [ "$rtn" -ne 11 ]
then
return ${rtn}
fi

return 11
}

func_rsync() {
# コピー元ディレクトリの指定
#
# 「hachitaro」ディレクトリごと、rsync するので、
# 「/mnt/nas123/usr/hachitaro/」
# ではなく
# 「/mnt/nas123/usr/hachitaro」
# を指定する。
rsync_sourcedir_file="mnt/nas123/usr/hachitaro"

# コピー先ディレクトリの指定
# rsync_dest_dir="/mnt/nas456/bk/server1001/pc/usr/"
rsync_dest_dir="/mnt/nas456/bk/server1001/pc/usr/"

# rsync の CPU 最大使用率を50%に制限。(CPUの優先度ではない)
cpulimit -e rsync -l 50 &

# rsync 実行
# rsync -avvv --stats ${rsync_sourcedir_file} ${rsync_dest_dir} | tee -a ${rsynclogdirfilename}

# rsync 実行
# --bwlimit=()KBytes
# 「 --bwlimit=1000」は、 1000KB/s (= 1MB/s) の意味
# 「 --bwlimit=10000」は、 10000KB/s (= 10MB/s) の意味
# 「 --bwlimit=50000」は、 20000KB/s (= 20MB/s) の意味
# 「 --bwlimit=50000」は、 50000KB/s (= 50MB/s) の意味
# 「--bwlimit=100000」は、100000KB/s (=100MB/s) の意味
rsync -avvv --stats --bwlimit=20000 ${rsync_sourcedir_file} ${rsync_dest_dir} | tee -a ${rsynclogdirfilename}


return 11
}


func_main() {
local -i rtn
rtn=1

func_check_other_proc
func_check_other_proc
rtn=$?
if [ "$rtn" -ne 11 ]; then return ${rtn}; fi


# rcync
func_rsync
rtn=$?
if [ "$rtn" -ne 11 ]; then return ${rtn}; fi

# すべての処理が終了して、ここまで処理がすすんだ場合、「処理はすべて正常終了」
# とみなす。

rtn=11
return ${rtn}


}



func_main
rtn=$?

curdttm=`date +%Y%m%d%H%M%S`
if [ "$rtn" -ne 11 ]
then
# 処理で以上が発生したため、これより以下の処理は続行はしない。
curdttm=`date +%Y%m%d%H%M%S`
msg="処理途中で異常が発生したため、処理を途中で中断しました。"' 2>&1'
echo "${quotstr}${curdttm}${quotstr} ${quotstr}${thispchostname}${quotstr} ${quotstr}${msg}${quotstr}" | tee -a ${clamproclogdirfilename}
else
# 処理が正常終了したため、次の処理へ進む
curdttm=`date +%Y%m%d%H%M%S`
msg="処理がすべて正常に終了しました。"' 2>&1'
echo "${quotstr}${curdttm}${quotstr} ${quotstr}${thispchostname}${quotstr} ${quotstr}${msg}${quotstr}" | tee -a ${clamproclogdirfilename}
fi


Linux (CentOS 6.2 x86_64) に、「cpulimit」をインストールして、実行する (= 絶対的な優先度を下げる) 手順

1.「cpulimit」概要 nice コマンドとは別の方法で優先度を強制的に下げるソフト

Linux には、nice コマンドを使って相対優先度を変更することができます。Windows 7 ではタスクマネージャーの「プロセス」タブの「基本優先度」 に相当するものです。(低、通常以下、通常、通常以上、高、リアルタイム)

Linux で 「nice コマンドを利用して、とあるプロセス (例えば rsync や FaHCore_a4.exe など) の優先度を可能な限り下げたけれども、マシンの動作が重たくて、kill をすると軽くなる」という場合があります。

この場合は、「cpulimit」というソフトをインストールすることで、その重たいプロセスの絶対的な優先度を下げることができます。

原理は単純で、cpulimit がそのプロセスを定期的に頻繁に sleep させるというものです。

Linux (CentOS などの Redhat Enterprise Linux 系ディストリビューション) で「nice コマンドをつかってもマシンが重たくて困っている」という方は、「cpulimit」をインストールする手順を説明します。

ちなみに、Ubuntu は、別のインストール手順があります。そちらは恐れ入りますが、別の Web ページをご参照をお願い致します。

2.「cpulimit」インストール

cpulimit インストールの手順です。インストールとは言ってもソースコードをダウンロードして make します。難しくはないかと思います。

ここでは「cpulimit-1.1」のバージョンを例に上げて説明します。もしバージョンの数値が変わったら数値を読み替えて実行して下さい。

# wget http://downloads.sourceforge.net/cpulimit/cpulimit-1.1.tar.gz
# tar zxvf cpulimit-1.1.tar.gz
# cd cpulimit-1.1
# make
# cp cpulimit /usr/bin/

以上でインストールが完了です。

3.「cpulimit」ごく簡単な実行例

rsync の CPU 最大使用率を 50% に制限する例です。

一番最後に「&」をつけるのをお忘れなく。

cpulimit -e rsync -l 50 &

2012年6月20日水曜日

ウィルコム WX01 キーロック ON/OFF (オン/オフ) の切替手順、利用するボタンはどれ

「ウィルコム WX01 キーロック ON/OFF (オン/オフ)の切替手順、利用するボタンはどれかわからない」と、お困りの方もいらっしゃるかと思います。

理由は 2 つです。

  1. 本体の箱に取扱説明書が入っていなかった。
  2. 説明書を、メーカーのサイトからダウンロードして説明書通りに「* ロック」キーを押しても、ロックされない

    まずは「*」キーに「ロック」と書かれていません。それならばと他のキーを探しても「ロック」と書かれてあるキーは見当たりません。「安全運転モード」キーは見つかりますが、キーロックとは別の機能です。

ボタンの表記と、実際の製品の表記が異なっています。表記だけではなく機能や手順も異なっているということです。

WX01 の出荷時期によって、仕様変更が行われているのかもしれません。

「WX01 を、取扱手順書通りに操作をしてもキーロックできない」方は、以下のいずれかでキーロックが出来ると思われます。一つずつ試すことをおすすめします。

  • 「* ロック」と書かれたボタンを長押しする

    操作手順書の 27 ページには、「* ロック」キーを長押しするようにと、説明が書かれています。

  • 「OK」と書かれたボタンを長押しする

    ウィルコムのページで紹介されている、WX01 には「OK」と書かれたボタンがあります。筆者の手元にある WX01 には、同じ位置にボタンはありますが「OK」とは書かれていません。

    出荷時期によって、ボタンの表記などに差異があるかもしれません。

  • 「(OKという文字が書かれていないが、上下左右を操作するキーの中央にあるキー)」を長押しする

    以下のキーです

以下、画面例です。

  1. 画面例その1.キーロックOFF (オフ) の状態の画面

    「キー」のアイコンが画面に表示されていない

    アイコンが、3つ表示されています。

    なお、「メールアイコン」、「『MENU』アイコン」、「電話帳アイコン」は、筆者が作成したいわゆる造語です。取扱説明書には特に説明が書かれていなかったため、説明の便宜上、名前を付けさせて頂きました。

  2. 画面例その2.キーロックON (オン) の状態の画面

    「キー」のアイコンが画面に表示されている

    以下は、上の拡大画像です。

ウィルコム WX01 マナーモード ON/OFF の切替手順、利用するボタンはどれ

ウィルコム WX01 マナーモード ON/OFF の切替手順、利用するボタンはどれか?

WX01UT の取扱説明書 (参照: ) 27ページの「マナーモード」の項目によると、以下のように説明されています。

「0(数字のゼロ) わ マナー」のボタンを長押しすれば、マナーモードに入ります。
(中略)
マナーモードを解除するには、もう一度「0(数字のゼロ) わ マナー」を押します。

これは、皆様が実際にお手持ちの WX01 の種類によって、若干異なる可能性があります。(私は WX01NX です)

「* マナー」というように、「とにかく『マナーと書かれたボタンを長押し』」すれば、マナーモードの ON/OFF を切り替えることができます。

2012年6月19日火曜日

ウィルコム WX01 製品情報、取扱説明書ダウンロードの URL

Google の検索のテキストボックスに「ウィルコム」と入力をすると「ウィルコム 解約」という検索候補が一番先頭に来るようになってどれくらいの時間がたったでしょうか・・・

このブログでは、ウィルコムの1ユーザーとして筆者が淡々とウィルコム(willcom) についても書いていきます。

ウィルコムの「もう1台無料」キャンペーンで「WX01 (機種名)」を入手された方もいらっしゃるかと思います。

「取扱説明書が同梱されていると外箱には記載されているのに同梱されていない」とお困りの方、ウィルコム WX01 製品情報、取扱説明書ダウンロードの URL は、以下の通りです。

2012年6月14日木曜日

自分のブログ、Webページを Google にクロールしてもらうには

Google 社の人が、カメラを搭載した車であちこち出かけて風景を撮影するなど必要な作業を行います。すると、Google map のストリートビューでその風景が見えるようになります。

Google 社のクローラーが、ブログ、Web ページを自動的にクロールしてなおかつプログラムが「この ブログ、Web ページは、ブログ読者、Webページ読者にとってどれだけ有益か」なども自動的に判断して、検索用のインデックスをつくります。

そして、Google で検索をすると、ブログや Web ページが表示されるようになります。

基本的にはブログや Web ページを作ると、(よほどのことが無い限り) しばらく待つだけで、Google で検索できるようになります。

  • 「自分でブログを書いた。きっと他の人にも役に立つ内容だと思う。Google で検索をしたら、自分のブログが検索結果に出るようにして欲しい」
  • 「自分では無いが、知人がブログ、Web ページを書いた。きっと他の人にも役に立つ内容だと思う。Google で検索をしたら、自分のブログが検索結果に出るようにして欲しい」
  • 「自分では無いが、Google 検索ではなく別の方法で、非常に有用な Web ページを見つけた。きっと他の人にも役に立つ内容だと思う。Google で検索をしたら、自分のブログが検索結果に出るようにして欲しい」

という場合、普通はしばらく待てば Google の検索結果に表示される (= ヒットする) ようになります。 google 社のクローラーが自動的にクロールしてくれます。

人間が、Google に「クロール依頼」を出すこともできます。

「Web ページを見に来て、Google 検索をした時に、検索できるようにして欲しい」と、クローラ (クロールするプログラム) に依頼を出すということです。

「クロールの依頼を出すと、google 社のクローラが Web ページ、ブログをクロールしてくれる」のは確かです。ただし、クロール依頼を出してもGoogle で検索して検索できるようになるとは限りません。あくまで Google 社が有用だと認めた Web ページなりブログが、検索できるようになります。

逆に、「クロール依頼を出してもいつまでたっても Google で検索できるようにならない」ページもあります。一言で言うと「内容がない」ページです。

今、この文章を書いていて何か胸が痛いような気がするのですが・・・。

例を挙げると・・・

  • 背景の色と同じ色の文字色で、人間の目で見て一見してわかりづらいが、検索エンジンでヒットするような単語をたくさん書いてある。しかも Web サイトの内容に無関係。
  • リンク集

    「リンク集」自体は特に悪くないです。Google で検索してもヒットしにくい傾向があるというだけのことです。

本題に戻ります。

もし「google 社のクローラーにクロールして欲しい」と言う方は、まず以下をご覧の上で・・

Google へのクロールのリクエスト (ヘルプ)

http://support.google.com/webmasters/bin/answer.py?hl=ja&answer=1352276

以下のページでクロールのリクエストを依頼できます。

ウェブマスタツール (クロールのリクエスト依頼の Web ページ)

https://www.google.com/webmasters/tools/submit-url

Linux CentOS 6.2 x86_64 にて、rpm で epel リポジトリをインストールする手順

Linux CentOS 6.2 x86_64 にて、rpm で epel リポジトリをインストールする手順のメモです。

epel リポジトリは、CentOS をどの方法でインストールしても、自動的にはインストールされません。(自動的にインストールする方法があったらぜひ教えて下さい) これは、CentOS インストーラーに epel リポジトリが含まれていないためと思われます。詳しい方、教えて下さると幸いです。

CentOS インストール後に、手作業で rpm で epel リポジトリをインストールする必要があります。

rpm で epel リポジトリをインストールしておくと、「yum で ClamAV (無料オープンソースのウィルススキャンソフト) をインストールできるようになる」などの利点があります。

筆者がインストールするときにお恥ずかしながら手こずりました。自戒の念を込めつつ、備忘録としてこの投稿を書いています。

  1. (前準備) yum-priorities のインストール

    epel をインストールする前に、yum-prioritiesインストールを行います。

    yum -y install yum-plugin-priorities
  2. (前準備) 標準リポジトリ設定ファイル (CentOS-Base.repo) 編集

    標準リポジトリ設定ファイル (.repo) の編集を行います。

    「/etc/yum.repos.d/CentOS-Base.repo」を vi などのテキストエディタで開いて、「priority=1」という行を 3 箇所に追加します。

    見て予想がつくかとは思いますが、「#」で始まる行はコメントです。以下はあくまでも例なのでご自身にわかりやすいようにしてもらえればとおもいます。例えば「# added」の代わりに「# 追加した」にする。あるいは「# #######」の代わりに「# ------」とするなど。

    vi /etc/yum.repos.d/CentOS-Base.repo
    [base]
    name=CentOS-$releasever - Base
    mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os
    #baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/
    gpgcheck=1

    gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-CentOS-6
    # ###########################################
    # added
    priority=1
    # ###########################################


    #released updates
    [updates]
    name=CentOS-$releasever - Updates
    mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=updates
    #baseurl=http://mirror.centos.org/centos/$releasever/updates/$basearch/
    gpgcheck=1

    gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-CentOS-6
    # ###########################################
    # added
    priority=1
    # ###########################################


    #additional packages that may be useful
    [extras]
    name=CentOS-$releasever - Extras
    mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=extras
    #baseurl=http://mirror.centos.org/centos/$releasever/extras/$basearch/
    gpgcheck=1

    gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-CentOS-6
    # ###########################################
    # added
    priority=1
    # ###########################################
  3. EPELリポジトリインストール

    ようやく前準備が終わりました。epel リポジトリをインストールします。・・・がその前に、epel の URL を確認します。重要です。

    Web ブラウザで、以下の URL を開きます (x86_64版の場合)

    http://ftp.riken.jp/Linux/fedora/epel/6/x86_64/

    「epel-release-6-x.noarch.rpm」

    を含んでいるファイル名を Webページ内で検索します。

    xはバージョン、リビジョンの数字です。

    時期によって、バージョン、リビジョンの数字が上がっている場合があります。

    rpm 実行前に、バージョン、リビジョン番号の確認を必ず確認することをおすすめします。

    筆者は、rpm 実行時にエラーが発生して、お恥ずかしながら解決するまでに非常に手こずりました。

    なので、自戒を込めて、ここで一句。

        rpm(あーるぴーえむ)?
        ちょっと待て
        その URL 大丈夫?
    
    
    

    上の一句で、網羅はしているのですが、範囲が広めです。

    自分のように、rpmを使い始めて間もない人にとってはあまり役に立ちません。

    漠然としていて、言われた方は「なら、どうすればいいのさ?」と、途方に暮れるだけです。

        rpm(あーるぴーえむ)?
        ちょっと待て
        バージョン、リビジョン番号は?
    
    
    
        rpm(あーるぴーえむ)?
        ちょっと待て
        その URL 古くない?
    
    
    
        ちょっと待て
        それは PowerPC 版だ。
    
    
    
        64(※)が、
        欲しい時には x86_64 だ。
    
    
    

    ※「64」 この場合「ろくよん」と読みます。ここでは 64bit版の意味です。「64bit」だと、どうしても一句を作れないのでこの場合のみ便宜上「ろくよん」と呼んで下さるとありがたいです。

        i686?
        それは32bit版だ。
    
    
    

    稚拙な句をつらつらと並べましたが、私だけではなく皆様が rpm 実行する時にも「ああ、そういえば気をつけなければ」と、留意していただけると rpm のエラー、トラブルをより回避しやすくなるかと思います。

    上の句を見ていると、「Alpha版? ほんとにそれで合ってるの?」などの句も思い浮かんだりしますが、きりがないので句の話はここで終わりにします。

    検索の話に戻ります。

    実際に検索する時は

    「epel-release-6」

    で Web ページ内の検索をします。

    2012/05/17 時点では、

    「epel-release-6-6.norach.rpm」

    がファイル名です。

    6-6が、バージョン、リビジョン番号を表しています。

    「epel-release-6-6.norach.rpm」

    を右クリックして、「URL をクリップボードにコピー」を実行します。

    (参考) 上記の場合、クリップボードにコピーされた URL は以下のとおりとなります。

    http://ftp.riken.jp/Linux/fedora/epel/6/x86_64/epel-release-6-6.noarch.rpm

    rpm -Uvh を実行します。

    キーボードで「rpm -Uvh 」と入力します。最後の一文字、半角スペースを忘れずに。

    引き続き、先ほどクリップボードにコピーしておいた URL を貼り付けます

    実行例

    rpm -Uvh http://ftp.riken.jp/Linux/fedora/epel/6/x86_64/epel-release-6-6.noarch.rpm
  4. epel-release アップデート

    epel-release をインストールしたあとで、アップデートを行います。

    yum -y update epel-release

以上で、rpm で epel リポジトリをインストール完了です。

(参考)

http://centossrv.com/epel.shtml

2012年6月13日水曜日

KVM (Kernel-based Virtual Machine) の仮想PC、仮想マシン (仮想PC の OS は CentOS 6.2 x86_64) をコピーして、新しい仮想PCを作る手順


KVM (Kernel-based Virtual Machine) の仮想PC、仮想マシン (仮想PC の OS は CentOS 6.2 x86_64) をコピーして、新しい仮想PCを作る手順


ここでは、pc100 を pc200 にコピーする場合を例に説明します。


◆手順1.仮想HD ファイルのコピー

仮想HD ファイルをコピーします。
cp コマンドでも、GNOME のファイルブラウザを利用してコピーしても
どちらでも構いません。
必要に応じてリネームします。

コピー元
/var/lib/libvirt/images/pc100.img

コピー先
/var/lib/libvirt/images/

コピー終了後、以下の 2 つのファイルが存在する状態が正しい状態です。
/var/lib/libvirt/images/pc100.img
/var/lib/libvirt/images/pc200.img


◆手順2.xml ファイルのコピー
cp コマンドでも、GNOME のファイルブラウザを利用してコピーしても
どちらでも構いません。
必要に応じてリネームします。


コピー終了後、以下の 2 つのファイルが存在する状態が正しい状態です。
/etc/libvirt/qemu/pc100.xml
/etc/libvirt/qemu/pc200.xml


◆手順3.pc200.xml の編集
vi や gedit などのテキストエディタで「pc200.xml」を編集します。


変更1箇所目...name
変更前
 <name>pc100</name>
変更後
 <name>pc200</name>


変更2箇所目...uuid (コメント化する)
変更前(例)
 <uuid>dc182d1a-44f2-bc49-5b0e-xxxxxxxxxxxx</uuid>

変更後
<!--
 <uuid>dc182d1a-44f2-bc49-5b0e-xxxxxxxxxxxx</uuid>
-->

変更3箇所目...仮想HD イメージファイルのフルパスの修正
変更前
     <source file='/var/lib/libvirt/images/pc100.img'/>
変更前
     <source file='/var/lib/libvirt/images/pc200.img'/>


変更3箇所目...MACアドレスの修正
変更前
     <mac address='52:54:xx:xx:xx:a5'/>
変更後 (例)
     <mac address='52:54:xx:xx:xx:a6'/>

他のPCのMACアドレスと重複しないMACアドレスを指定します。
具体的には、一番右側の2桁の16進数を修正します。
上の説明の例ではa5に+1して、a6に変更しています。


上の修正が終了したら、ファイルを保存します。

◆手順4.「virsh define」
コンソールを起動します。

以下のように入力します。
virsh define /etc/libvirt/qemu/pc200.xml


◆手順5.仮想マシンマネージャーを一旦終了して、再度起動する

仮想マシンマネージャーを起動します。
もし仮想マシンマネージャーを実行中の場合はいったん終了してから、もう一度起動します。


仮想マシンの一覧に、pc200 が存在することを確認します。





◆手順6.仮想マシン(pc200) の起動
仮想マシンを起動します。

◆手順7.仮想マシン(pc200) のホスト名 (Linuxの場合。Windows の場合はコンピュータ名に相当)、IPアドレスの変更

ホスト名と、IP アドレスを変更します。



# vi /etc/sysconfig/network

変更前
HOSTNAME=pc100

変更後
HOSTNAME=pc100



# vi /etc/sysconfig/network-scripts/ifcfg-eth0

変更前
IPADDR=192.168.1.100

変更後
IPADDR=192.168.1.200



◆手順8.同仮想PCの再起動
ホスト名の変更を有効にするために、PC200を再起動します。

# shutdown -r now

◆手順9.再起動後の動作確認
再起動後、必要に応じて動作確認を行います。

ファイルサーバー(CIFS、NFS) を利用している場合は、そのファイルサーバーをマウントできていること
Webブラウザで、www.google.co.jp や www.yahoo.co.jp へ接続して、ページが表示されること

2012年1月9日月曜日

CentOS 6.2 (64bit) apache 2 mod_ssl インストールの手順

CentOS 6.2 (64bit) apache 2 mod_ssl インストールの手順のメモです。

こちらは、あくまでも私的なメモです (再インストールの際などに役立てるため)

■重要■

  • このページは「http://kajuhome.com/apache_ssl.shtml」から手順を参考に (というよりもそっくりそのまま真似て) インストールを行なっています。
  • まるっきり Web ページをそのままコピーペーストでは、著作権侵害であり、上のページの製作者の方へ大変失礼になりますし、私自身のメモとしては役に立ちません。
  • このページでは、実際に自分が行った作業をそのまま記録して、自分自身で今後の参考にする目的で載せていますが、手順自体は上のページとほとんど同じです。
  • Apache2 mod_ssl インストールをされる方は、このページよりも、ぜひ上のページをご参考にするようお願いします。手順ごとに説明がついていてわかりやすいです。
  • 「CentOS 6 apache2 mod_ssl」のインストール手順書を Web で検索しましたが、(私が探した中では) 上のページの手順書が最もわかりやすいと思っています。ページ製作者の方に感謝を申し上げます。
  • 上のページとこのページが違うのは、このページでは「私自身が行った作業の結果を載せている」点と、「★特定のディレクトリでのみ SSL を利用する (他のディレクトリでは通常の http で通信を行う)」という項目を追加したことです。

yum にて、mod_ssl をインストール

yum -y install mod_ssl

[root@pc101 ~]# yum -y install mod_ssl
Loaded plugins: downloadonly, fastestmirror, priorities, refresh-packagekit
Determining fastest mirrors
epel/metalink                                                    | 3.6 kB     00:00
 * base: www.ftp.ne.jp
 * epel: ftp.iij.ad.jp
 * extras: www.ftp.ne.jp
 * rpmforge: fr2.rpmfind.net
 * updates: www.ftp.ne.jp
base                                                             | 3.7 kB     00:00
extras                                                           | 3.5 kB     00:00
google-chrome                                                    |  951 B     00:00
rpmforge                                                         | 1.1 kB     00:00
updates                                                          | 3.5 kB     00:00
2683 packages excluded due to repository priority protections
Setting up Install Process
Resolving Dependencies
--> Running transaction check
---> Package mod_ssl.x86_64 1:2.2.15-15.el6.centos will be installed
--> Finished Dependency Resolution

Dependencies Resolved

========================================================================================
 Package          Arch            Version                           Repository     Size
========================================================================================
Installing:
 mod_ssl          x86_64          1:2.2.15-15.el6.centos            base           87 k

Transaction Summary
========================================================================================
Install       1 Package(s)

Total download size: 87 k
Installed size: 183 k
Downloading Packages:
mod_ssl-2.2.15-15.el6.centos.x86_64.rpm                          |  87 kB     00:00
Running rpm_check_debug
Running Transaction Test
Transaction Test Succeeded
Running Transaction
  Installing : 1:mod_ssl-2.2.15-15.el6.centos.x86_64                                1/1

Installed:
  mod_ssl.x86_64 1:2.2.15-15.el6.centos

Complete!
[root@pc101 ~]#

CA用秘密鍵(ca.key)の作成

[root@pc161 ~]# openssl genrsa -des3 -out /etc/httpd/conf/ca.key -rand rand.dat 1024
0 semi-random bytes loaded
Generating RSA private key, 1024 bit long modulus
........................................................++++++
.......++++++
e is 65537 (0x10001)
Enter pass phrase for /etc/httpd/conf/ca.key:
Verifying - Enter pass phrase for /etc/httpd/conf/ca.key:
[root@pc161 ~]#

CA用証明書(ca.crt)の作成

[root@pc101 ~]# openssl genrsa -des3 -out /etc/httpd/conf/ca.key -rand rand.dat 1024
0 semi-random bytes loaded
Generating RSA private key, 1024 bit long modulus
........................................................++++++
.......++++++
e is 65537 (0x10001)
Enter pass phrase for /etc/httpd/conf/ca.key:
Verifying - Enter pass phrase for /etc/httpd/conf/ca.key:
[root@pc101 ~]# openssl req -new -x509 -days 365 -key /etc/httpd/conf/ca.key -out /etc/httpd/conf/ca.crt
Enter pass phrase for /etc/httpd/conf/ca.key:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:JP
State or Province Name (full name) []:Tokyo
Locality Name (eg, city) [Default City]:Chiyoda
Organization Name (eg, company) [Default Company Ltd]:Private_CA
Organizational Unit Name (eg, section) []:Admin
Common Name (eg, your name or your server's hostname) []:www123456.dyndns.info
Email Address []:xxx@yyyy.zz.jp
[root@pc101 ~]# 

サーバ用秘密鍵(server.key)の作成

[root@pc101 ~]# openssl genrsa -des3 -out /etc/httpd/conf/server.key -rand rand.dat 1024 0 semi-random bytes loaded Generating RSA private key, 1024 bit long modulus ..++++++ ..........................................................++++++ e is 65537 (0x10001) Enter pass phrase for /etc/httpd/conf/server.key: Verifying - Enter pass phrase for /etc/httpd/conf/server.key: [root@pc101 ~]#

署名要求書(server.csr)の作成

[root@pc101 ~]# openssl genrsa -des3 -out /etc/httpd/conf/server.key -rand rand.dat 1024
0 semi-random bytes loaded
Generating RSA private key, 1024 bit long modulus
..++++++
..........................................................++++++
e is 65537 (0x10001)
Enter pass phrase for /etc/httpd/conf/server.key:
Verifying - Enter pass phrase for /etc/httpd/conf/server.key:
[root@pc101 ~]# openssl req -new -key /etc/httpd/conf/server.key -out /etc/httpd/conf/server.csr
Enter pass phrase for /etc/httpd/conf/server.key:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:JP
State or Province Name (full name) []:Tokyo
Locality Name (eg, city) [Default City]:Shinjuku
Organization Name (eg, company) [Default Company Ltd]:abcdefg_company
Organizational Unit Name (eg, section) []:it_dept
Common Name (eg, your name or your server's hostname) []:www123456.dyndns.info
Email Address []:xxx@yyyy.zz.jp

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
[root@pc101 ~]#

サーバ用秘密鍵(server.key)からのパスフレーズ削除

[root@pc101 ~]# openssl rsa -in /etc/httpd/conf/server.key.bak -out /etc/httpd/conf/server.key
Enter pass phrase for /etc/httpd/conf/server.key.bak:
writing RSA key
[root@pc101 ~]#

★特定のディレクトリでのみ SSL を利用する (他のディレクトリでは通常の http で通信を行う)

[root@pc161 ssl]# mkdir ssl
[root@pc101 ssl]# vi /etc/httpd/conf/httpd.conf

以下のように変更する

変更前

# ===== changed 2011/01/09 =====
<Directory "/var/www/html">

(中略)

</Directory>

# ===== changed 2011/01/09 =====

変更後

<Directory "/var/www/html">

(中略)

</Directory>



# ===== changed 2011/01/09 =====
<Location "/ssl">
  SSLRequireSSL
</Location>
# ===== changed 2011/01/09 =====

参考文献

2012年1月3日火曜日

PostgrSQL のユーザー作成と DB 作成

PostgreSQL インストール (CentOS 6.2、yum)」が完了したら、次は、PostgrSQL のユーザー作成と DB 作成を行います。

  1. ユーザー作成

    先に、CentOS (Linux) にて、ユーザーを追加しておきます。

    [root@pc101 ~]# adduser testuser
    [root@pc101 ~]# passwd testuser
    ユーザー testuser のパスワードを変更。
    新しいパスワード:
    新しいパスワードを再入力してください:
    passwd: 全ての認証トークンが正しく更新できました。
    

    つぎに、postgres にログインします。

    [root@pc101 ~]# su - postgres
    -bash-4.1$ psql
    psql (8.4.9)
    "help" でヘルプを表示します.
    
    postgres=# 
    

    次に、ユーザー作成を実行します。

    postgres=# CREATE USER "testuser" CREATEDB PASSWORD 'thisisthepassword' LOGIN;
    CREATE ROLE
    postgres=#
    
    postgres=# \q
    -bash-4.1$ 
    
    
    -bash-4.1$ exit
    logout
    [root@pc101 ~]#
    
  2. DB 作成
    [root@pc101 ~]# su - testuser
    [testuser@pc101 ~]$ createdb testdb01
    [testuser@pc101 ~]$
    
  3. DB が作成されていることを確認します。
    [root@pc101 ~]# su - postgres
    
    -bash-4.1$ psql -l
                                             データベース一覧
       名前    |  所有者  | エンコーディング |  照合順序   | Ctype(変換演算子) |      アクセ
    ス権
    -----------+----------+------------------+-------------+-------------------+------------
    -----------
     postgres  | postgres | UTF8             | ja_JP.UTF-8 | ja_JP.UTF-8       |
     template0 | postgres | UTF8             | ja_JP.UTF-8 | ja_JP.UTF-8       | =c/postgres
                                                                               : postgres=CT
    c/postgres
     template1 | postgres | UTF8             | ja_JP.UTF-8 | ja_JP.UTF-8       | =c/postgres
                                                                               : postgres=CT
    c/postgres
     testdb01  | testuser | UTF8             | ja_JP.UTF-8 | ja_JP.UTF-8       |
    (4 行)
    
    -bash-4.1$
    

    「testdb01」という名前のデータベースが作成されていることが確認できました。

PostgreSQL インストール (CentOS 6.2、yum)

CentOS 6.2 にて、PostgreSQL を yum でインストールする手順。



  1. yum でインストール
    以下を実行する
    yum -y install postgresql postgresql-libs postgresql-server

    以下、実行例です。
    [root@testpc101 ~]# yum -y install postgresql postgresql-libs postgresql-server
    Loaded plugins: downloadonly, fastestmirror, refresh-packagekit
    Loading mirror speeds from cached hostfile
     * base: ftp.iij.ad.jp
     * extras: ftp.iij.ad.jp
     * updates: ftp.iij.ad.jp
    base                                                             | 3.7 kB     00:00
    extras                                                           | 3.5 kB     00:00
    google-chrome                                                    |  951 B     00:00
    updates                                                          | 3.5 kB     00:00
    updates/primary_db                                               | 654 kB     00:00
    Setting up Install Process
    Package postgresql-8.4.9-1.el6_1.1.x86_64 already installed and latest version
    Package postgresql-libs-8.4.9-1.el6_1.1.x86_64 already installed and latest version
    Resolving Dependencies
    --> Running transaction check
    ---> Package postgresql-server.x86_64 0:8.4.9-1.el6_1.1 will be installed
    --> Finished Dependency Resolution
    
    Dependencies Resolved
    
    ========================================================================================
     Package                   Arch           Version                    Repository    Size
    ========================================================================================
    Installing:
     postgresql-server         x86_64         8.4.9-1.el6_1.1            base         3.3 M
    
    Transaction Summary
    ========================================================================================
    Install       1 Package(s)
    
    Total download size: 3.3 M
    Installed size: 14 M
    Downloading Packages:
    postgresql-server-8.4.9-1.el6_1.1.x86_64.rpm                     | 3.3 MB     00:00
    Running rpm_check_debug
    Running Transaction Test
    Transaction Test Succeeded
    Running Transaction
      Installing : postgresql-server-8.4.9-1.el6_1.1.x86_64                             1/1
    
    Installed:
      postgresql-server.x86_64 0:8.4.9-1.el6_1.1
    
    Complete!
    [root@testpc101 ~]#
    



  2. PostgreSQL 初期設定

    PostgreSQL インストール直後、SELinux が enabled になっている状態で、
    「service postgresql start」
    を実行すると、エラーメッセージが表示されます。


    [root@testpc101 ~]# service postgresql start
    
    /var/lib/pgsql/data is missing. Use "service postgresql initdb" to initialize the cluster first.
    
                                                               [失敗]
    [root@testpc101 ~]# 
    

  3. エラーメッセージを読んでみると、親切にもエラーの対処方法を教えてくれています。
    "Use "service postgresql initdb" to initialize the cluster first."



  4. その通りに入力して、Enter キーを押下します。
    [root@testpc101 ~]# service postgresql initdb



  5. Enter キーを押下した後、「データベースを初期化中」と表示されます。フリーズしているかのように見えますが、そのまま待ちます。
    [root@testpc101 ~]# service postgresql initdb
    データベースを初期化中:
    
    




  6. しばらく待つと [ OK ] のメッセージが表示されます。(私が実行した環境では 30 秒程度でした)

    [root@testpc101 ~]# service postgresql initdb
    データベースを初期化中:                                    [  OK  ]
    [root@testpc101 ~]#
    




  7. poqstgresql のサービスを開始します。
    [root@testpc101 ~]# service postgresql start
    postgresql サービスを開始中:                               [  OK  ]
    





  8. PostgreSQL が動作しているかを確認するため、PostgreSQL にログインします。
    [root@testpc101 ~]# su - postgres
    -bash-4.1$
    




  9. 同じく、動作確認のために、データベースの一覧を表示してみます。
    -bash-4.1$ psql -l
                                             データベース一覧
       名前    |  所有者  | エンコーディング |  照合順序   | Ctype(変換演算子) |      アクセ
    ス権
    -----------+----------+------------------+-------------+-------------------+------------
    -----------
     postgres  | postgres | UTF8             | ja_JP.UTF-8 | ja_JP.UTF-8       |
     template0 | postgres | UTF8             | ja_JP.UTF-8 | ja_JP.UTF-8       | =c/postgres
                                                                               : postgres=CT
    c/postgres
     template1 | postgres | UTF8             | ja_JP.UTF-8 | ja_JP.UTF-8       | =c/postgres
                                                                               : postgres=CT
    c/postgres
    (3 行)
    -bash-4.1$ 
    



  10. PostgreSQL からログアウトします。
    -bash-4.1$ logout
    [root@testpc101 ~]#
    






  11. OS起動時に、PostgreSQL サービスも自動起動 (自動的に開始) するように設定します。
    [root@testpc101 ~]# chkconfig postgresql on
    [root@testpc101 ~]# chkconfig --list postgresql
    postgresql      0:off   1:off   2:on    3:on    4:on    5:on    6:off
    [root@testpc101 ~]#
    








参考