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してきたインストーラーをダブルクリックしてー」とか記事にならんじゃん?あれくらいにならないとさー…。
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 みたいなチェーンをきちんと書いてますけどね)
