Hatena::ブログ(Diary)

c/fe

2009-02-22

せっかくだから俺はOpenVZを選ぶぜ!

世の中がVMwareだXenだHyper-Vだというのに、俺はOpenVZをえらんでしまいました(ました(ました)


ちょー簡単

インストール5分(内4:30はDlと再起動)

VM作成1分(内45秒はコマンドを思い出す)

VM起動5秒


これだけでVM環境がつくれるよ!


具体的にどれくらいちょー簡単なのか

詳しい事は調べてもらうとして、

CentOSインストール直後から今までのHistoryをみてもらおうか…。

    1  vi /etc/fstab
    2  system-config-securitylevel-tui 
    3  shutdown -r now
    4  cd /etc/
    5  vi yum.repos.d/
    6  cd yum.repos.d/
    7  wget http://download.openvz.org.openvz.repo
    8  wget http://download.openvz.org/openvz.repo
    9  rpm --import http://download.openvz.org/RPM-GPG-Key-OpenVZ
   10  yum search ovkernel
   11  yum upfsyr
   12  yum update
   13  yum search ovzkernel
   14  cat /proc/cpuinfo 
   15  yum install ovzkernel-PAE.i686
   16  vi /boot/grub/grub.conf 
   17  vi /etc/sysctl.conf 
   18  sysctl -p
   19  vi /etc/sysctl.conf 
   20  sysctl -p
   21  vi /etc/updatedb.conf 
   22  ls /
   23  shutdown -r now
   24  yum install vzctl vzctl-lib vzpkg vzquota vzyum vzrpm43 vzrpm43-python vzrpm44 vzrpm44-python 
   25  yum install ntp
   26  ntpdate ntp.nict.jp
   27  ntpdate ntp.nict.jp
   28  hwclock --systohc
   29  crontab -e
   30  /etc/init.d/vz start
   31  yum search vztmpl
   32  yum install vztmpl-centos-4.i386
   33  vzpkgls
   34  la /
   35  ls /
   36  /etc/init.d/vz top
   37  /etc/init.d/vz stop
   38  cd /
   39  ls
   40  cd vm
   41  ls
   42  cd ..
   43  cd vz
   44  ls
   45  mv * ../vm
   46  cd ..
   47  vi /etc/fstab 
   48  unmount /vm
   49  umount /vm
   50  mount /vz
   51  /etc/init.d/vz start
   52  vzpkgcache
   53  vifconfig
   54  ifconfig
   55  ifconfig|less
   56  vzctl create 120 --ostemplate centos-4-i386-minimal
   57  vzctl set  120 --ipaddr 192.168.2.80  --hostname hellovz --save
   58  vzctl set  120 --ipadd 192.168.2.80  --hostname hellovz --save
   59  cd /etc/sysconfig/vz-scripts/
   60  vi 120.conf 
   61  vzctl -list
   62  vzctl -l
   63  vzctl --list
   64  vzlist -a
   65  vzctl start 120

恥ずかしいミスタイプ大杉ww

整理すると

    1  vi /etc/fstab
    2  system-config-securitylevel-tui 
    3  shutdown -r now
    4  cd /etc/
    6  cd yum.repos.d/
    8  wget http://download.openvz.org/openvz.repo
    9  rpm --import http://download.openvz.org/RPM-GPG-Key-OpenVZ
   12  yum update
   13  yum search ovzkernel
   15  yum install ovzkernel-PAE.i686
   16  vi /boot/grub/grub.conf 
   17  vi /etc/sysctl.conf 
   21  vi /etc/updatedb.conf 
   23  shutdown -r now
   24  yum install vzctl vzctl-lib vzpkg vzquota vzyum vzrpm43 vzrpm43-python vzrpm44 vzrpm44-python 
   30  /etc/init.d/vz start
   31  yum search vztmpl
   32  yum install vztmpl-centos-4.i386
   33  vzpkgls
   52  vzpkgcache
   56  vzctl create 120 --ostemplate centos-4-i386-minimal
   58  vzctl set  120 --ipadd 192.168.2.80  --hostname hellovz --save
   65  vzctl start 120

これくらいかな、どうよ、この楽さ、手抜きの俺にはぴったりじゃないか…。

VMVMっていうけど、chrootもどきだよね

うん、そうだよね。親でpstreeすると、こんなキモい出力がみれるよ。

init─┬─acpid
     ├─init─┬─crond
     │      ├─postgres───5*[postgres]
     │      ├─2*[sendmail]
     │      ├─sshd───bash
     │      ├─sshd───sshd───sshd───bash
     │      ├─syslogd
     │      └─xinetd
     ├─init─┬─sshd
     │      └─syslogd

でもおかげで

vzctl 120 exec passwd root

とかコマンド一発で親機からVMのrootパスワード変更できたりするし、

これは楽でいいじゃん?



実際vzってつかわれてんの?

NTTのWebarenaのVPSはコレみたい(OpenVZの商用版の、Virtuozzoだと思うけど)。


つか、VPS業者でコレ使ってるの結構多いんだけど(XENより多いと思う)、やってみて理由がよくわかる。

Disk容量の変更とか、子機への諸々の反映が全部vzctlコマンドでできるので、すげー簡単だ。

2008-08-01

Linuxが普及するには?

http://www.lifehacker.jp/2008/07/linux.html

ハードのサポートとか、Officeのサポートとか、もちろん最初の一歩を踏み出させるには色々な要素があるとおもうんだけど、俺が思うにLinuxのサイテーさはソフトウェアをインストールしにくい、という所につきると思う。


RPMとかあるけど?

「RPMがあるじゃん、つかyumとか知らないの?よっぽど先進的!」という人もいるけど、逆にyumに入ってないとすげえ面倒くさいのが問題。

yumに登録されていないような物は「おっ!これおもしろそう!Linux対応か!ためそう!」って思っても気軽にできない。

(たとえば?定番のApache+PHP+Mysql(LAMP環境)のホントの最新版を入れるとか、そういうありがちな話だよ)


そして、port等はメジャーバージョンも上がるけど、yumはまったくメジャーバージョンがあがらないので*1OSインストールとセキュリティ対策にしか使い物にならないと思う…。


野良ビルドすればいいじゃん、それが本来なんだし

実際の所、大抵configure make all make installで通る*2。Linuxを使うなんて気概のある人ならこのハードルはそんなに高くないと思う。

でも、これで単純に動かない時は大変。


ありがちなのが数年つかったLinuxは色々なライブラリのバージョンが古く、がんばってググってconfigureがどうだと見つける事ができても、buildできない事が多い。

前述した通りyumやらなんやらでアップデートかけても、メジャーバージョンが上がらないとBuildできない事もあり、そうなるとお手上げ。

じゃあライブラリも野良ビルドでーとうかつにあげると酷い事になりがち。正直ライブラリのバージョンを安全にあげるなら、OSを再インストールしたほうが早い。

これは非常にめんどい

Debianなんかは全部の環境を持ち上げる事ができるよ!というのが売りだったと思うが、でも「野良ビルドしたバイナリ」は動かなくなるんだよね…。これじゃ再インストールと大差無いよ。


そして、野良ビルドできて、動いたとして

「うわーこのフリーソフトクソだわー、消すよ!」

と思ったとき、アンインストールがクソ面倒くさい、というか実質無理じゃね?

このアンインストールの手間を考えると、ホントやる気が無くなる(俺の場合)。


「Prefix変更すればいいんだよ!そしたら大抵大丈夫だよ!」みたいな話はあるんだけど(ある意味Mac的な解決策)、ライブラリとかだと/usr/local以下にはいっててくれないと毎度毎度configure時に指定してあげたりとか…めんどくさい。

ちょっと気をつければ良いことなんだけど、つまりは気軽でない。


とにかく

どっかから拾ってきてソフトを入れるってのがすげえめんどうくさい。

そうなるとOS付属のソフトで全部どうにかしようという現状になり、まったくおもしろみのない、WEB端末みたいな環境になる。


前述した通り、俺が思うにこれがLinuxの一番の問題だと思う。


フリーソフトを拾ってきて入れる文化がないと、フリーソフトをつくって公開する人も生まれないし、そうなるとWinやMacみたいな豊かな環境が整うのはいつになることやら。


「このソフトはPerlスクリプトです、まずはCPANから○○をいれてもらって…」なんてのはWindowsからみたらジョークでしょ?

(俺はいいけどw)


MacとかWindowsだと

このあたりすげえのがご存じの通りWindowsで、Windows98とかの環境でも普通にインストールしてみたら動くとかざら。

Windowsはレジストリが汚れるとかあるけれど、神経質になるような物でもない。


さらに楽なのがMacで、ディレクトリごとすてちゃえばアンインストール完了なので、試す為のハードルが低い。

(ホントは違うけど)



DVD再生ソフトだとか、P2Pソフトだとか、Officeだとか、IMソフトだとか…

最近のLinuxはホントすごくて、星の数ほどソフトがでていて、本当に便利になったと思う。

でも続々出てくるソフトを色々試したりとかできないようなOSじゃ気軽に使い続けるなんて無理でしょ。

OS(というよりディストリビュージョン)標準のソフトウェアをやたら充実させる事でどうにかしている現状だけれど、こんなんじゃ発展しろって方が無理ってものだろうよ。



っつうかね

Linuxに関係する、一番よくあるBlog記事が「○○いれてみました!」だってのがおかしいんだよね。俺も何回も書いてるけどw

入れるだけで記事にする価値がある(と思う)ほどめんどくさい事しないといけないってのはホントおかしいよ。


Windowsで「Dlしてきたインストーラーをダブルクリックしてー」とか記事にならんじゃん?あれくらいにならないとさー…。

*1:仕組み上や目指す所からして仕方ないのかもしれないが

*2:前述のApache+PHPは到底これじゃ使い物にならんが

2008-05-02

ゾンビポート?

Linuxであるアプリケーションで障害が起こったので、再起動をかけようとしたら、再起動できなかった。

アプリが起動中にポートをBindできなかったというので、プロセスをさらったけれど、そのプロセスは確実に殺せていた。

なんなんだーと思い、netstat -napしたら

Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
udp    65504      0 0.0.0.0:8767            0.0.0.0:*                           -

こんな出力。

なんだこれ?Stateが空で、PIDが空?ゾンビかなにか?

/proc/net/udp

をみたり、

[root@sv root]# netstat -l -p -n  -ee
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       User       Inode      PID/Program name
udp    65504      0 0.0.0.0:8767            0.0.0.0:*                           500        3822       -

で、inodeはわかったので

ls /proc/*/fd

とかして開いているヤツを探そうとしたけど、よくわからん。


障害対応に時間を掛けるのも何なので、あきらめて再起動してしまった。

一体全体なんだったんだろう。

2008-03-12

デーモンの起動 ……と終了

http://d.hatena.ne.jp/milk1000cc/20080312/1205275645

/etc/rc.d/rc.localに色々書いてデーモンを起動させておくのは定番です。

できればこのコマンドの標準出力をどっかに繋いでおいた方がいいのではないかと

たとえば >> /tmp/monglog 2>&1 ってお尻に付けて。

それくらいで大丈夫かと思います。


後、rootで実行されちゃうのはいいのかな?とか位?*1


あれ?sysvinitは?って思った人挙手 ノシ

そう、本当はデーモンを起動する由緒正しい方法が有ります。

でもさー、実際、正しくsysvinitに従ってinitscript書いても(後述します)、いまどきランレベルなんて3とか5で固定で、initコマンドなんて使ったことないでしょ?気付かずに0とか6とか、緊急時に1とか使ってるだけで…。


じゃあまったく問題はないのか?

もしかすると、何も考えずにシステムのシャットダウンをすると、問題が発生する可能性が有ります。


具体的には?

デーモンプロセスが起動したままshutdown -h nowを叩いたらどうなるでしょうか?


SystemがHaltする前にはまずsysvinitの仕組みで各デーモンの終了コマンドが呼ばれます。

よく起動時や終了時に

Starting sshd:[ OK ]

とかずらずら出力されますけど、アレです。

裏では

/etc/init.d/hogehoge stop

(またはservice hogehoge stop 相当)

と順番に(後述)実行されてます


で、sysvinitに登録されたプログラムが順番に終了された「後」に、残った全てのプロセスTERMのシグナルが飛び、次にKILLのシグナルが飛び、sysvinitで記載されていないプログラムも無事終了します*2


そう、最後には全部のプログラムは終了される、これは間違いない


でも、もしsysvinitでMysqlが起動されている場合、DBとかが先に終了しちゃうかもしれないんですよね(最初っから入ってるMysqlとかはそうでしょ?)。

コレを気持ち悪いとか、どうかなーとかおもうかおもわないかだと思います。


DB > Rails

って起動したら

Rails > DB

って終了したほうがいいと思いません?

実際RailsでDB操作中にDBが終了したら問題が発生するかも。


railsならDBに接続することが多いと思われるので、DBより前に終了してあげたほうがいいとおもいません?うっかりなにかやってたら面倒な事になりそうですよ?長いクエリが走ってるとか。


後はApacheをフロントに使ってるなら、まあ一応Apacheを先に落としたいですよね。

(まあ一瞬の遅かれ早かれなんだけれども)


そういう要望の為にsysvinitの仕組みで、終了する順番(起動時には起動する順番)がきちんと設定出来るようになっているのです。


終了の順番以外にも

通常どのサーバーも規定の操作で終了することを要求します、Apacheならapachectl stopとか。

実際シグナル送っての終了も(kill hogehogeとか、フォアグラウンドのプロセスをCtrl-Cで終了)、大抵のデーモンでは正しい操作の筈なんで問題はないはずですけどね。

できればちゃんとしたほうがいいことは間違いない。


後は終了処理とかしこめます、テンポラリファイル消すとかね。


じゃあどうやるの?

chkconfigとかinitscriptでググれ、


ググれ厨UZEEEEE!

init.dに入れるinitscriptスクリプト*3を作り、手またはchkconfigコマンドで登録してあげることで実現出来ます。

chkconfigコマンドがない場合には、手で/etc/rc.d/rc3.d等に入れてあげる必要がありますが、ここでは割愛。


じゃあ、initscriptはどう書くの?

これって結構みんなバラバラだと思うんですけど、dovecotがみじかかったんで、それをベースにhogehogeってプログラムを書いてみた、適当に置換とかしてみて。

#!/bin/bash
#
#       /etc/rc.d/init.d/hogehoge
#
# Starts the hogehoge daemon
#
# chkconfig: 35 98 02
#
# description: hogehoge program
# processname: hogehoge
# Source function library.
. /etc/init.d/functions

#この辺りで色々チェックとかやって
test -x /path/to/hogehoge || exit 0
test -x /path/to/hogehoge.conf || exit 0

RETVAL=0
#画面に表示する事書いちゃって
prog="Super Ultra Monster hogehoge server."

start() {
        echo -n $"Starting $prog: "
        #↓この行でプログラム起動させて
        daemon /path/to/hogehoge
        RETVAL=$?
        #↓起動できたらロックファイルをtouch(作成)して
        [ $RETVAL -eq 0 ] && touch /var/lock/subsys/hogehoge
        echo
}

stop() {
        echo -n $"Stopping $prog: "
        #停止して
        killproc /usr/sbin/hogehoge
        RETVAL=$?
        #ちゃんと終了できたらロックファイルを削除して
        [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/hogehoge
        echo
}

#
#       See how we were called.
#
case "$1" in
  start)
        start
        ;;
  stop)
        stop
        ;;
  reload|restart)
        stop
        start
        RETVAL=$?
        ;;
  condrestart)
        if [ -f /var/lock/subsys/hogehoge ]; then
            stop
            start
        fi
        ;;
  status)
        status /path/to/hogehoge
        RETVAL=$?
        ;;
  *)
        echo $"Usage: $0 {condrestart|start|stop|restart|reload|status}"
        exit 1
esac

exit $RETVAL

詳細は解説しませんが、単純なので何やってるのかは一目瞭然だと思います。


まあ、Bashのスクリプトなんですけど、最低startとstopって引数で望む動作(開始と終了)すればなんだっていい(chkconfigはつかえなくなるけど)。


daemonやstatus、killprocってなによ?という人は/etc/rc.d/init.d/functionを参照する。


作った後、

/etc/init.d/hogehoge start

とかで正しく動作する事を確認して、次へ進む。


書いたけど。で、どう登録するの?

chkconfig --add hogehoge

で登録されます。

chkconfig --del hogehoge

で削除できます。

詳しくはchkconfigを引数無しで起動してみる。

またはmanを読む。

initscriptの

# chkconfig: 35 98 02

って部分を弄ると起動順序とか修正できる、コレの意味など詳しくは

man chkconfig

で。


こんなめんどくせーことしたくねーよ、データ破損上等じゃん!

まあ解る、でもこれを設定すると、


service hogehoge stop

とか

/etc/init.d/hogehoge restart

とか

でデーモンを制御できるので、職場の女の子にモテモテになれます*4


じゃーさー、あなたは実際にinitscriptでrailsとか起動させてるの?

いいえwしてませんけど?w

(仕事では Apache-Tomcat-Postgresql みたいなチェーンをきちんと書いてますけどね)

*1:イヤならsudoコマンドとかを指定してあげるとか

*2:たまーにあるけどね、KILLでも死なないとか

*3:頭痛が痛い

*4:何か操作するとき、無駄にたくさんタイプしている方が「くわしそう!」とか思われますけど、実際の所逆だよね…