謎の掃き溜め

Cygwinの不安定さに耐えられなくなったので coLinux に乗り変えることにした。
とりあえずバージョンは、coLinux-0.6.4。

そもそも使うLinuxがLFSなので、普通の人にはあまり役に立たないと思われるが、 備忘録も兼ねてログっておく。

ちなみにあとででてくるが、 ネットワークは TAP + NAT で、TAPのIPが、192.168.123.1、 coLinuxのIPが、192.168.123.40である。

インストール

適当にやる。TAPを使う。

起動は、

colinux-daemon.exe -c config.xml -t NT

とやる。-t NTとやると、 colinux-console-nt の方を使ってくれるので、 余計なウィンドウが出なくてよい。

Linuxイメージの設定

イメージをどっかに作ってやる、というのが一般的らしいが、 ノートパソコンに

WindowsXP + Linuxデュアルブート + coLinuxイメージ

なんてことしたら容量的にマズいので、 デュアルブート用のLinuxと共用で coLinux することになる。 (これぞまさに Cooperative Linux だぜ!)

Windows上のイメージファイルを使う場合は、

<block_device index="0" path="\DosDevices\C:\hoge.img" enabled="true" />

とすれば /dev/cobd0 にマッピングされてくれるわけだが、 物理パーティションは、

<block_device index="0" path="\Device\Harddisk0\Partition1" enabled="true" alias="hda1" />

という感じに書く。 Harddisk0\Partition1 というのは何番目のハードディスクの何番目のパーティションを使うか、 というを指定している。Harddiskはゼロオリジンで、Partitionは1オリジン。 Partitionは、Linuxの/dev/hdaX とかとは番号が異なるので注意。 多分「ディスク管理」の所に出てくるパーティション領域の絵を見て、左から順に、1,2,3,,,ってなるんだと思う。

coLinuxでは、/dev/cobdX というデバイスをmountして使うわけだが、 普通のLinuxではもちろん /dev/hdaX というのを使うわけで、 /etc/fstab の中身が変わってしまうので、上の例みたいに、

alias="hda1"

みたいな記述を付けないと上手くいかん。

ちなみに、fstabでrootfsをfsckする設定になっているとなぜかエラーで起動してくれないので、 とりあえず外してみたが、いいんだろうか?

ネットワークの設定

TAPを使って、Windows内にNATを作ることにする。

最近の世の中では TAP + XPのブリッジ を使ったのが流行りらしいが、 普段はDHCPで繋ぐノートパソコンでそうしちゃうと、 ネットワークが無いときに、わざわざ自分でIP振ったりしないと いけないはずので(だよね?)、めどす、ってんで、 外界の影響のない NAT にしちまおう、という話。

TAPじゃない方のネットワーク接続のプロパティを開いて、 TAPに大して、インターネット接続を共有させる。

TAPのIPアドレスが勝手に、192.168.0.1 になりやがる。 これだと外が192.168.0.0/24だったりすると全くもって動かないので、 TAPの方のプロパティを開いて 192.168.123.1 に変更する。

これで、あとは coLinux の eth0 の IP を、192.168.123.xxx な感じにすれば動く。 (今回は、192.168.123.40にした)

起動の設定

まあ普通に起動すればいいんだが、普通LinuxとcoLinuxでは、 上げたいデーモンとか、ネットワークの設定とか微妙に変わるので、 挙動を変えたい。

というわけで、普段は、ランレベルがだいたい3か5なので、 あまり使われない4を coLinux 用にすることにする。

とりあえず、オーディオ系の初期化とかいらないものは 4の時は実行しないようにする。

で、ネットワークは、以下のようなものをランレベル4に追加すればOK

#!/bin/sh
ifconfig eth0 192.168.123.40 netmask 255.255.255.0 broadcast 192.168.123.255
route add -net default gw 192.168.123.1 dev eth0
echo "nameserver 192.168.123.1" >| /etc/resolv.conf

普段DHCPしないから、resolv.confが書き変えられと困るんですが、って人は、 自分でどうにかしてください。

で、あとは、config.xml の bootparams を以下のようにする。

<bootparams>root=/dev/cobd0 init=/root/colinux/init 4</bootparams>

最後の4がランレベルの指定なわけだが、その前の、

init=/root/colinux/init

を指定しておくことで、init時に他の処理ができるようにしておく。

と言っても今のところ特にやることもないので、ただ単に、

#!/bin/sh
exec /sbin/init "$@"

に書いてあるだけだったりする。

カーネル再構築

特に難しくないが、gccのバージョンに注意。
coLinux-0.6.4だと、gcc-3.4系のみ。
3.3でも4.0でもだめ(ToT

とりあえずkernel.orgからゲッツしてきて解凍したら、 coLinux-src の patch ディレクトリの linux-2.6.11.diff をパッチ当てする。

で、confディレクトリの linux-2.6l.11-config で、 make oldconfig して普通にmake。 デフォルトgccが、3.4系じゃなければ、

make HOSTCC=gcc-3.4 HOSTCXX=gcc-3.4 CC=gcc-3.4 CXX=gcc-3.4 vmlinux modules

という感じで指定しなきゃだめポ。

普通にmodules_installもしてしまって、 あとはできたvmlinuxをWindowsの方に持ってくればOK。 initrcは変更してないがとりあえず動いているようだ。

Windowsディスクのマウント

選択肢としてはcofsかsamba。 sambaは、TAPがボトルネックになってるんだかで遅いし、 じゃあcofsは速いかというと、まだまだ実装がアレで遅いので、 速度的にはどっちも微妙であまり変わらない気がする。

多少cofsの方が速いし手軽なのだが、 日本語が上手くいかないので今回はsambaにすることにした。

cygwinでは、/cygdrive/c とかでアクセスしていたので同じ感じにしたい。

/cygdriveを掘って、そこに各々のドライブをsmbmountするという手もあるが、 各ドライブに共有の設定しなきゃいけなかったりしてテラメドスなので却下。

Windows側に、C:\cygdrive というディレクトリを作って、 そこに各ドライブへのジャンクション(Windows版シンボリックリンクみたいなもの) を貼って、それをsmbmountしちゃおう、ということにした。

Windows側の設定

まずジャンクションを貼るらなきゃいかん。

あたりから、ジャンクション作成ソフトをDLしてきて、

ln.exe -j C:\ C:\cygdrive\c
ln.exe -j D:\ C:\cygdrive\d
ln.exe -j E:\ C:\cygdrive\e

という感じにひたすら貼る。

で、C:\cygdriveを共有に設定する。

さすがにこれが外部からアクセスし放題だとあれなので、ユーザーに制限をかける。

XP使っていて、共有するかしないかしか設定できなくて、 ユーザーごとの制限のかけかたがわかんねーYo!
という場合は、フォルダオプションの

「簡易ファイルの共有を使用する(推奨)」

のチェックを外すと、設定できるようになる。 んなもん推奨すんなって話ですよ。

ユーザー制限だけでも、ちと不安なので、 ついでに、許可するユーザ数を1にしてしまう。 これでcoLinuxがsmbmountしちゃえばどこからもアクセスできなくなるはず。

coLinux側の設定

こっちは /cygdrive ディレクトリを掘って smbmount するだけ。 起動時に自動でやりたいところだが、password入れないといけないので手動でやるようにする。

というわけで、以下のようなファイルを用意して、

#!/bin/sh
sudo smbmount //192.168.123.1/cygdrive /cygdrive \
  -o username=yo,codepage=cp932,iocharset=euc-jp,uid=yo,fmask=755,dmask=755

適当に実行することにする。

同時に利用できるユーザー数が1だから、 Everyoneフルコントロール設定にして、 Windows起動時にcoLinuxサービスを起動させちゃって、 パスワードなしでさっさとmountしちゃった方が安全なんだろうか? んーわからん。

日本語がちゃんとEUC-JPに変換されない場合は、 kernelを再構築すると治るかも?

File Systems -> Native Language Support -> Japanese charsets(Shift-JIS, EUC-JP)

をとりあえずチェックしておく。

あとはあまり関係ないが、

ln -s /cygdrive/c/Documents and Settings/yo/デスクトップ ~/desktop

という感じに貼っておく便利

ちなみにジャンクション機能は便利だがいろいろ悪名が高いようなので、 チェックしてみたが、とりあえず、coLinux側で、

rmdir /drv/c

とすると、ジャンクションのみが消えて、中身は無事な感じ。(on WindowsXP) ゴミ箱さえ介さなければ問題ないのかな?

追記;なんか共有できん!!!

  • まずファイル、フォルダ自身のアクセス権と、ネットワークアクセス権の両方を確認。
  • ファイヤーウォールとかがなってないか確認
    • telnet host 139

それでもだめでおかしいなぁと思ったら、Windows側のユーザにパスワードが設定されてなかった!!!
(いや、Windowsを入れ直したばっかだったんですよ、これがまた)

サービスへの登録

以下のコマンドで登録したり消したり。

colinux-daemon -c default.colinux.xml --install-service
colinux-daemon -c default.colinux.xml --remove-service

登録したらあとはコントロールパネルで適当に設定。

サービスで開始するとコンソールが出てこないわけだが、 colinux-console-nt.exe とか colinux-console-fltk.exe を起動すると、 コンソールが見れる。 閉じちゃっても良い。

サービスを停止しようとすると、勝手に、init 0 が実行されるらしい。 すごいね、これは。

coLinux内からWindowsコマンドを実行する

Cygwinの良いところは、気にせずWindowsコマンドを実行できるところと、 Windows用gcc(MinGW)が手軽に入ることである。

coLinux内からWindowsコマンドが叩ければ便利だし、 cygwinのgccも走らせられるのでよさそうである。

Cygwin sshd の設定

いろいろ考えてみたが簡単そうなのが、 cygwin の sshd を上げておいて、そいつにアクセスして、

ssh <WindowsのIP> notepad poem.txt

とかやればメモ帳が起動できる、という寸法である。

ここで問題なのが、よく解説されているような感じで sshd をWindowsのサービスとして起動してしまうと、 CUIのアプリはともかく、GUIアプリは実行できなくなってしまうのだ。

おそらくサービスって画面を持たなくても実行できちゃうから、 プロセスに画面が割りあてられないんじゃないかと思われるが、 今画面開いてるユーザーだったら使わしてくれたってイイジャン! とか思うわけよ、ゲイツ君。

というわけで今回は、サービスではなくそのまま sshd を動かすことにする。

まず、普通に設定をする

ssh-host-config

いろいろ聞かれるが適当に答えておく。

/etc/sshd_config の以下を編集。

Port 21
ListenAddress 192.168.123.1

ListenAddress?をTAPのアドレスにして、coLinuxからしかアクセスできないようにする。 Port 21というのはFTPだが、どうせWindowsでFTP鯖なんて絶対立てないからこれで良しとする。 (なぜ22にしないかは後述)

で、設定が終われば起動する。と言っても、

/usr/sbin/sshd

とやるだけ。最初は -d オプション付けてテストしてみるのもよい。

Windows側のコマンド実行スクリプト

で、sshのコマンド実行アクセスが来たら、コマンドを自動で実行してくれるような スクリプトを作る。 と言っても簡単で、カレントディレクトリと、コマンド文字列がわかればよいので、

./winexec-executer.sh <dir> <command> <args> ....

と実行すると <dir> で、コマンドを実行してくれるようなものを作ればよい。

これは簡単で、

#!/bin/sh
x=$1
shift
cd "$x" || exit 1
exec "$@"

というモノを、 ~/winexec-executer.sh として保存しておけば良いだけである。

ここで、coLinux側で、

ssh <WindowsのIP> ./winexec-executer.sh /etc notepad sshd_config

とやって、Cygwin の /etc/sshd_config がnotepadで開かれれば成功だ。

coLinux側

上記のようにすればWindowsコマンドを実行できるわけだが、これだけではメドイので、 もうちょっと簡単にしたい。

そこで、現在の(coLinuxの)カレントディレクトリを、./winexec-executer.sh に渡したい。 が、coLinuxのディレクトリを渡しても、Windowsのディレクトリとは違うので、 ダメぽ。

と思いきや、実は、/cygdrive以下のディレクトリは、coLinux でも cygwin でも同じなわけなので、 そのまま渡せば良いわけですよ。

というわけで、以下のようなファイル coLinux 側に作成する。

#!/bin/sh
PWD=$(/bin/pwd) || exit 1
if echo "$PWD" | grep '^/cygdrive' > /dev/null 2>&1; then
        exec ssh -p 21 yo@192.168.123.1 ./winexec-executer.sh "$PWD" "$@"
else
        echo "$(pwd): cannot map to Windows directory"
fi

これを、winexecとして保存すれば、

cd /cygdrive/c/cygwin/etc
winexec notepad sshd_config

とやるとめでたくメモ帳が使えるようになった。

ちなみに、たとえば cygwin-gcc が使いたければ、

cd /cygdrive/e/work
echo 'int main() { printf("cygwin daze!\n"); }' > test.c
winexec gcc test.c
winexec ./a.exe

とかやるとできちゃう。

ちなみに、sshのパスワードを毎回入力するなんてことになったらめどいので、 カラの鍵を使うとか、ssh-agent使うとかして適当にごまかしてください。

多少もたつきがあるけど気にしない方向で。

X Windows system

coLinux使う時によく問題となるのが X である。 cygwinが入ってるなら、cygwinのX使えばイイジャンという話もあるが、 あまりcygwinのものは使いたくない。

わざわざwindowsにKDEとか飛ばす必要全くもってないので、 マルチウィンドウがなるべくよい。

VNCはいろいろメドそうだし、あまり早くない気がするし、 マルチウィンドウできなさそうなので却下。

でみつけたのが、Xming

インストールはとてつもなく簡単だった。

使い心地は、cygwin-X と同じ感じ。 マルチウィンドウも簡単にできるし 容量的にも軽くていい感じだ。

おまけ: sshd

とりあえずいろいろできるようになったものの、 やっぱり外部からsshで入りたくなるのが人情というもの。

それだったら cygwin の sshd でいいじゃんという話なのだが、 なんとなくイヤなので、やっぱりLinux側のsshdに入りたいと思うのが、 これまた人情というものだ。

しかし、ネットワークが、ブリッジではなくて NATなので、 NAT内部のcoLinuxには、そのままではアクセスできないわけなので、 ポートフォワーディングを使う。

使うのは、stone というやつで、以下からダウンロードできる。

で、これを、Windows上で、

stone.exe <coLinuxのIP>:22 22

とすると、22番をフォワーディングしてくれる。 (このために22番を空けおいたのよ)

Windowsコマンド実行 rsh 編

.rhosts とか使えて速そうなので rsh でやってみた。

cygwinでのinetdの設定

iu-config
適当に yes を答える

あとは適当に /etc/inetd.conf を変えて

inetd -d

と起動

あとは、

rsh <host> command

で実行できるようになるので、 試してみたが、sshより遅い。。。 なぜに?

というわけでやめ。

mingw

そのうちやるかも

テスト用のイメージ

役に立たないQ&A

なんかネットワークがつながらないんですけど

なんかemacsが立ち上がるのが超遅いんですけど

NICが二つあって(ワイヤレスと有線、みたいな)、coLinuxネットワークがNATの設定になってると、 ネットワークつなぐNICによって、ネットワークの共有設定を変えなきゃいけません。(まあ当然ですが)

で、なんで、emacsの起動が遅くなるかというと、起動時になにやら DNS への問い合わせをしていて、 それがなかなか返ってこないもんだから遅くなるわけですな

参考文献