アーカイブ

Archive for 2012年4月

phpのforeachではまった

結論から。phpのforeachのうち、foreach($arr as &$item)は使ってはならない。

もう一度同じ$itemを使って参照ではないforeach($arr as $item)するとどうなるか?
1.まず、$itemは$arrの最後の要素を向いている。
2.foreachは$itemに$arrの最初の要素を代入しようとする。
3.$itemの向いている先、つまり$arrの最後の要素が$arrの最初の要素で上書きされる。
4.以下、同様に続いて最終的に$arrの最後の要素は最後から2番目の要素になる。

広告
カテゴリー:未分類

Fedora16のLXCのバグを踏んだらしい

4/15追記:そんなこといってたらLXCパッケージがupdatesに落ちてきたようです。これでなおってるんだろうか。

lxc.cgroups.devicesを指定するとエラーで起動できなくなる現象。
どうやらcgroupsがまとめてマウントされている(mountコマンドを打った時に1つに見える)状態出ないと駄目らしい。
update-testingリポジトリ内に修正済みのLXCパッケージがあるのでそれをインストールして解決。

# yum install –enablerepo=updates-testing lxc

カテゴリー:未分類

Fedora16のLXC内にSL6.2を入れてみる

まあ、基本的にはうまく行くよね。問題が起こるとすればkernelのバージョンを見ているプログラムとかか。(3系なので。)

・ホストFedoraの/etc/yum.repos.dにsl.repoを突っ込む
 disableにしておきましょう、忘れた頃に事故ると悲惨なことになります。
 あと、GPGKEYがないと怒られるので入れるかチェックを無効に。
 $releaseverは6.2に置換しておきます。
・yum –installrootを使ってLXC用ディレクトリにインストール
 だいたいFedoraといっしょ。Fedoraのリポジトリをdisablerepoするのを忘れずに。
 yumとか入れとくこと。
・chroot
・この状態でSLのrpmを使うとエラーが出る(/var/lib/rpm/Nameが壊れてるとかなんとか)ので、
 該当ファイルを削除してrpm –rebuilddb
・/etc/rc.d/rc.sysinitを適宜修正
– /sbin/start_udevを削除しないとptyが上書きされてrequest failになるっぽい

かんせい。

カテゴリー:GNU/Linux タグ: , ,

/devの制限

とりあえずsshからログインするために必要と思われるやつら
/dev/null
/dev/zero
/dev/urandom
(/dev/randomも?)
/dev/ptmx
/dev/pts/*

カテゴリー:未分類

続・FedoraでLXCためしてみた ネットワーク編

前回はLXCで作成したコンテナをホストと同じネットワークに繋いだので、
今度はホストをゲートウェイとして、仮想的なネットワークに突っ込んでみた。
基本的には物理ネットワーク2本でルータを構築するのと同じ。

コンテナの作成自体は前回と同じなので省略。
ホストのネットワーク構成に違いがあり、eth0をbr0に含めないのがポイント。eth0にはそのままipアドレスを割り当てたままにし、br0にはbr0で別個にipアドレスを割り当てる。
以下、ホストの外側(eth0)ipアドレスが192.168.1.21、ブリッジのipアドレスが192.168.3.1、コンテナが192.168.3.2。
/etc/sysctl.confでipv4フォワードを有効にするのをお忘れなく。

/etc/sysconfig/iptables

*nat
-A POSTROUTING -o eth0 -j MASQUERADE
COMMIT

*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 -i br0 -o eth0 -j ACCEPT
-A FORWARD -p icmp -j ACCEPT
-A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT

コンテナ側でroute add default gw 192.168.3.1を書いて完成。

これだけだと外からアクセスできないので、ホストのポート2222にアクセスするとコンテナのsshに繋がるようにしてみた。
ついでなのでインターフェイス毎にチェインを分離。
複数個のコンテナを動かすならさらにFORWARDを-dでさらに分離してもいいかもしれない。

*nat
-A PREROUTING -p tcp --dport 2222 -i eth0 -j DNAT --to 192.168.3.2:22
-A POSTROUTING -o eth0 -s 192.168.3.0/24 -j MASQUERADE
COMMIT

*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-N HOST_INPUT
-N HOST_FORWARD
-N GW_INPUT
-N GW_FORWARD

-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

-A INPUT -i eth0 -j HOST_INPUT
-A INPUT -i br0 -j GW_INPUT

-A HOST_INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A HOST_INPUT -j REJECT --reject-with icmp-host-prohibited

-A GW_INPUT -j REJECT --reject-with icmp-host-prohibited

-A INPUT -j REJECT --reject-with icmp-host-prohibited

-A FORWARD -p icmp -j ACCEPT
-A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

-A FORWARD -i eth0 -j HOST_FORWARD
-A FORWARD -i br0 -j GW_FORWARD
-A FORWARD -j REJECT --reject-with icmp-host-prohibited

-A HOST_FORWARD -o br0 -p tcp -d 192.168.3.2 --dport 22 -j ACCEPT
-A HOST_FORWARD -j REJECT --reject-with icmp-host-prohibited

-A GW_FORWARD -j ACCEPT

COMMIT

ちなみに、コンテナ用のフィルターはどこに書くの?と思ったらコンテナ内部からiptablesを使えるようです。
これは複数コンテナとブリッジで仮想ネットワーク&ルータを作りたい放題ということか!

/* Fedora17のalphaでやったらどうやってもプロセスが分離されなかったんだがどういうことだろうか・・・
追記:Fedora16の別環境でやっても分離されない・・・何故だ・・・
さらに追記:procをホスト環境からマウントするとこうなるらしい、lxc.mountのfstabに書かれたファイルからprocがマウントされると正常になる。
*/

カテゴリー:GNU/Linux タグ: , ,