rcmdnk's blog
Last update

coLinux入門―Windows上でLinuxを使う

Octopressで記事が増えるに連れてCygwinの中でrake generateにかかる時間が 馬鹿にならなくなって来たのでなんとかならないものかと思い、 今更ながらCooperative Linux (coLinux)を入れてみました。

Cygwinの遅さ

Cygwinは立ち上げ時やTab補完時に異常に遅いな、と思っていましたが、これは bash_completionが遅いせいでした。 これは /etc/profile.d/bash_completion.shを消してしまうか、もしくは 最初の行にreturnを追加して実際にbash_completion部分を読み込ませない様に することで避ける事が出来ます。 これで立ち上げ時と、Tab補完の時の待ち時間が劇的に早くなります。

Cygwinを使う場合は少なくともbash_completionは読み込まないようにしておいた 方が良いと思います。 (使っているのが古いPCなせいもありますが…Linux使っている時に それなりに新しいマシンでも結構遅くするのでなるべく切ってます。)

上記の事は回避出来るのですが、 さらにCygwinはfork()が古い形式のfork()の様に動作するために makeで子プロセスを沢山生むような場合に異常に遅くなる、とのことです 1 2

実際、ちょっとした作業を行う分にはbash_completionを除くだけでかなり快適に 使えますが、Octopressの記事をrake generateした時など、記事がこのブログほどでも 結構な時間がかかる様になってきました。

スペックが違うとはいえ、Macで行うときの数倍かかってちょっと見過ごせなくなって来たので なんとかならないものかということでcoLinuxを入れてみました。

coLinux

coLinux はWindows上で動かす事が出来るLinuxカーネルで coLinuxはCygwinと違い「本物」のLinuxです。

VMWareも同じようにLinuxを動かす事が出来ますが、 coLinuxの方が軽い様なのと、Windowsサービスへの登録が 最初からサポートされてるのでcoLinuxにしました 3 4 5

他にも

等も考えましたが、 MinGWはもともとCygwinからフォークしたものですが、 色々やろうとして出来ないことが多かったので駄目。

andLinuxはcoLinuxのインストールを簡単にしたバージョン(と思ってる)なので 取り敢えずcoLinuxを入れれば良いか、と。

Atratusに関しては新しい物なので今後に期待ですが、まだあまり使える物ではありませんでした。

ということで以下、今回のcoLinuxをインストールした手順です(インストールしたのは 共に32bitのvistaと7)。

coLinuxのインストール

必要パッケージのインストール

coLinuxのページから Downloadsページへ行き 一番新しいインストーラーをダウンロード (この時は0.7.9-linux-2.6.33.7/coLinux-0.7.9.exe)。

インストーラーを実行して

  • Choose Componentsのところでは初期状態のママ全てチェック付けた状態
  • Destination Folderは空白があるとやっかいなのでC:\coLinuxに変更
  • Obtain a coLinux root file system imageでは古いものしか選べないため、 後で別にダウンロードするのでNo downloadのまま

これで一旦ウェブページに戻り、先ほどの Downloadsページへ行き、 Images 2.6.x Debian からDebian 6.0 Squeeze(Debian-6.0.1-squeeze.7z)をダウンロード 6

この7zファイルを解凍するためのソフトがない場合は7-Zip などをインストールしてファイルを解凍します。

出てきたファイルを先ほどcoLinuxをインストールしたディレクトリに移動します。

Debianのこのバージョンだと2GB程のシステムイメージ(rootfs_2gb.img)になります。

confファイル

起動用のconfファイル(解凍したときに出てきたsqueeze.conf)を以下の様に修正します。

squeeze.conf
1
2
3
4
5
6
7
8
9
kernel=vmlinux
cobd0="rootfs_2gb.img"
cobd1="swap_128.img"
root=/dev/cobd0
ro
initrd=initrd.gz
mem=128
eth0=tuntap
cofs0=C:\

eth0=slirpだったところをtuntapへ、最後にWindows領域をマウントするために cofs0の値をを設定しておきます。

最初のテスト起動

ここで一回立ち上げて見ます。 先ほど解凍した中にあった、squeeze.batをダブルクリックで立ち上げます。

もしくはコマンドプロンプトから

> cd C:\coLinux
> colinux-daemon -t nt @squeeze.conf

とするか、coLinuxフォルダにあるcolinux-daemon.exeのショートカットを作り、 colinux-daemon-debian.exe等と名前を変更して、 プロパティからリンク先の欄を

C:\coLinux\colinux-daemon.exe -t nt @squeeze.conf

として起動してみます(全てやってることは一緒です)(-t ntは余計なコマンドプロンプトを立ち上げないオプション)。

上手く立ち上がらない時はimgのパスや名前が間違ってる可能性があります。

立ち上がってloginを聞かれたらrootでログインします。 初期状態はパスワード無しで、ユーザー名にrootを入れるだけでログインできます。

ユーザー設定

取り敢えずrootのパスワードを変更

# passwd

続いてユーザーを作成

# adduser USER

Windowsと同じ名前のユーザーを1つ作っておきました。

ネットワーク設定

まず、一旦Windows側でネットワークの設定を行います 7

コントロールパネルからネットワーク接続のページヘ行きます 8。 ここまで行っているとネットワーク接続のページにローカルエリア接続3 (数字はこれまで作ったローカルエリア接続の数による), TAP-Win32 Adapter V8 (coLinux) と言う項目があるはずです。 これを扱いやすいように名前をtap等と変更しておきます。

次に、普段使っているネットワーク接続(ローカルエリア接続orワイヤレスネットワーク接続、等) のプロパティ開き、共有タブへ行き、 ネットワークのほかのユーザーに、このコンピューターのインターネットをとおして接続を許可する の項目にチェックし、下のホームネットワーク接続の項目から先ほど名前を変更した tapを選択します。

今度はtapのプロパティを開き、TCP/IPv4を開きます。 先ほどの共有設定がちゃんと行われていると、次のIPアドレスを使うにチェックが入り、

  • IPアドレス: 192.168.137.1
  • サブネットマスク: 255.255.255.0

の様になってるかと思います。(IPアドレスの137の部分はネットワーク環境によります。 ここで他のネットワークで使われている値以外の物を使用しなくてはいけないので、 もし値が他で使われているようなら適時変更します。) このIPアドレスの値はメモしておきます。

ここまで来たらcoLinuxに戻り、 /etc/network/interfaces

`/etc/network/interfaces`
1
2
3
4
5
6
7
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet static
address 192.168.137.2
netmask 255.255.255.0
gateway 192.168.137.1

とします。137の部分は先ほどメモしたものと同じ様に。

設定が終わったらネットワークを再起動します。

# /etc/init.d/networking restart

これで

# ping google.com

などして反応がありそうならOKです。

色々パッケージをインストール

ネットワークが繋がる様になったので、apt-getでパッケージをインストールしていきます。

# apt-get update
# apt-get upgrade

でローカルにあるリストと既にインストールされているパッケージを最新に。

差し当たり必要そうなものとして

# apt-get install ssh sudo less bc apt-file

vim等はapt-getだと古いので別途後でインストール。

sudoerに登録

sudoを入れたので、自分をsudoerに登録しておきます。

# /usr/sbin/visudo
USER ALL=(ALL) ALL

と、自分(USERを自分のアカウントへ)へ全権を使えるようにしておきました。

sshの確認

上でsshを入れたのでsshサーバーが走っているはずです。 試しに

# ssh localhost

で自分のところへssh出来る事を確認。 出来たら、 PuTTYから接続してみます。 coLinuxを動かしたままでPuTTY(cygwinからでも良いですが)から 先ほどのaddressと同じ192.168.137.2へ接続してみます。

上で加えたユーザーとしてログインできればOKです。

coLinuxをサービスへ登録

ここまで来たらcoLinuxのプロンプトは邪魔なので、サービスへ登録して 毎回Windows起動時に自動的にバックグラウンドで走る様にします。

ここで一度PuTTYやcoLinuxを止めておきます。

coLinuxは

# shutdown -h now

などとして止めます。

コマンドプロンプトを開いて

> cd \coLinux
> colinux-daemon.exe @squeeze.conf --install-service debian

登録ができたら、コンピュータを右クリックなどしてコンピューターの管理を開き、 サービスの項目にdebianがあることを確認します 9

これをダブルクリックで開いてスタートアップの種類自動もしくは 他の立ち上げの妨げにしたくなければ自動(遅延開始)にします。 これで適用して、開始ボタンを押して開始してみます。

開始出来たらもう一度PuTTYで接続してみます。sshでログインできれば バックグラウンドでcoLinuxが正常に動いていまうす。 今後はcoLinuxを直接立ち上げずにバックグラウンドで起動して PuTTY等でsshログインして使う事になります。

Windows領域をマウント

今の状態だと、Windowsから見れる領域とcoLinux内で見れる領域が完全に分かれていて 共有が出来ていません。 共有する方法はcofsを使うかsambaを使うかがありますが、ここではcofsを使います。

最初の設定でconfigファイルの中で

cofs0=C:\

としてあるのでこれをマウントします。 面倒なのでrootになって作業

$ su
# mkdir /mnt/c
# mount -t cofs cofs0 /mnt/c

とすると、/mnt/c以下にC:\以下の領域が見える様になります。

このままだと、/mnt/c以下はrootでしか変更出来ないので、 USERに管理権限を与えてあげます。 /etc/fstabを編集して

cofs0 /mnt/c cofs defaults,uid=1000,gid=1000,noatime 0 0

を加えますuidgid/etc/passwdにあるUSERの列にある

1
USER:x:1000:1000:,,:/home/USER:/bin/sh

となっている様なところにある3番目と4番目の値です。

設定を変えたら

# umount /mnt/c
# mount -a

でマウントし直して

# ls -l /mnt/c

などして、/mnt/c以下がユーザー所有になっていたらOK。

ここで一旦rootは終了。

# exit

ssh鍵生成

毎回ログインでパスワードを入れるのは面倒なので鍵認証にします。 PuTTYでログインしてユーザーの状態で

$ ssh-keygen -N "" -t rsa
$ cd .ssh
$ cat id_rsa.pub >> authorized_keys
$ chmod 600 authorized_keys
$ cp id_rsa /mnt/c/Users/USER/

としてパスフレーズ無しで鍵を生成し公開鍵を登録しておきます。 さらに秘密鍵をWindows領域にコピーします。

ここで、PuttyGenを立ち上げ、Loadから先ほどコピーした秘密鍵id_rsaを読み込みます。 (拡張子を付けてないので種類をAll Files(*.*)にして検索。)

読み込めたらSave private keyを押して適当な名前(debian.ppkなど)で 適当なフォルダに保存します。

PuTTYの設定

先ほど登録した鍵などを使ってログインする設定を作ります。

  • Host Name: 192.168.137.2 (coLinuxのaddressの値)
  • WindowTranslation: Remote character setをUTF-8へ
  • ConnectionData: Auto-login username: USER
  • ConnectionSSH: Auto-login username: Preferred SSH protocol version: 2
  • ConnectionSSHAuth: Private key file for authenticatioへ先ほど保存したファイルを

これでパスワードを聞かれずにログインできればOK。

一通り済んだらXmingやCygwinのXwinサーバー等を立ち上げてみて、 PuTTY+coLinuxでもXサーバーが動いているかチェック。 (テスト用にapt-get install emacsしてemacsで試したり。)

vimインストール

vimをインストールするため、Mercurialをインストール(以下rootで)。

# apt-get install python-setuptools python-dev build-essential
# easy_install -U mercurial

その他vimに必要なパッケージをインストール。

# apt-get install ncurses-dev

この前インストールした時の様にインストール。 ただし、以下のインストールも含め、基本的にrootで/usr/local以下にインストール。

gitインストール

gitに必要なパッケージをインストール:

$ sudo apt-get install autoconf tcl8.5 gettext libcurl4-gnutls-dev libexpat1-dev asciidoc xmlto

追記: 2014/06/14

libcurl4-gnutls-devlibexpat1-devasciidocxmlto追加。

追記ここまで

取り敢えずのgitは入っているので 後はCygwinにgit-1.8.3.1をインストールに従い最新版をインストール。

GNU screenインストール

Macでの文字化け対策用のGNU screenのインストール に従いGNU screenをインストール。 (GNU screenアップデートに書いた バグは治っている様です。)

日本語対策

取り敢えず最初に入っている言語パックを調べてみると

$ locale -a
C
POSIX

しか入ってないのでloacles-allを入れる、

$ sudo apt-get install locales-all
$ locale -a
...
en_GB.utf8
...
ja_JP.utf8
...

これで下にあるように共通の.bashrcを入れて

LANG=en_GB.UTF-8
LC_ALL=en_GB.UTF-8
alias ls='ls --color=auto --show-control-char'

辺りの設定で日本語ファイルがlsで見れる様になります。

.vimrcの設定で

set encoding=utf8
set fileencodings=utf-8,iso-2022-jp,cp932,euc-jp,default,latin

辺りがあればvimでも日本語が扱えます 10

Octopressのためセットアップ: Rubyのインストールなど

GitHub pages + Octopressの導入に従いruby等をインストール。

まずユーザーでログインしてruby1.9.3を以下のようにインストール。 この時に、スクリプトの中でsudoを使うので上にあるようにsudoerに登録してある必要があります。

$ \curl -L https://get.rvm.io | bash -s stable --ruby=1.9.3

rvmディレクトリ等については共通の.bashrcに既に記述があるのでOK。 オプションによってrvmへのPATHが.bashrcの最後にが書き加えられてた りする場合もあるので必要がない場合は削除します。

先ほどリンクしたDropbox内にあるoctopressのディレクトリへ行って

$ gem install bundler
$ bundle install

ここでbundle installでgemが見当たらない、と言うエラーが出ましたが、 一度ログアウトしてログインし直したら通る様になりました。 (ログアウト前に.bashrcを再度読み込んでも駄目でした。 なんか変なPATHが入っていたみたい…?)

間違ってもここでrake install等しないようにして、 (現在の/sass//sourceが元のclassicテーマで置き換えられてしまう…) rake generate等試してみます。

目次を入れてるので、 Octopress Tips: 見出し目次の追加 にある様にmarkdown.rbを書き換える必要がありました。

加えて、先ほど作った公開鍵~/.ssh/id_rsa.pubの内容を GitHub、及びBitBucketへ登録しておきます。

rake generateにかかる時間

ここまででrake generate出来る様になたので時間を測って比べてみました。 sass内に変更が無い状態で

Cygwin:

$rake generate
...
real    5m39.245s
user    1m13.412s
sys     4m2.110s

coLinux+Debian

$rake generate
...
real    1m20.220s
user    0m53.520s
sys     0m26.580s

ということで圧倒的に速くなっています。何回か見てみましたが大体同じくらい。 特にCygwinの時はカーネルモードの時間が以上に長いです。 vista 32bitが載ってる古いPCなのであれですが 少なくともCygwinに比べて圧倒的に速いです。

一方、Mac(lionが載ってるこれももう古いMBA)だと

$rake generate
...
real    0m32.040s
user    0m24.341s
sys     0m4.184s

こんなもんでした。

ファイルシステム

coLinux/Cygwin/Windowsそれぞれから見たパーミッション

以前ちょっと調べた 様に、Windowsで作ったファイルとCygwinで作ったファイルのパーミッションの 違いが結構面倒でしたが、 新たに違うシステムが入ったので再度見てみました。

基本的に、WindowsもしくはCygwinで作った物はcoLinuxでcofsを使って接続して 見るとファイルは644, ディレクトリは755、所有者は上で mountした時にfstabで設定したUSERになっています。 ですので、基本、USERが全てそのまま操作できるのでCygwinよりより感じです。

Cygwin/Windows側から見たcoLinuxで作ったファイルのパーミッションはそれぞれ Cygwinから見たWindowsで作ったファイル、 Windowsから見たCygwinで作ったファイル、と同じです。

coLinux/Cygwin/Windowsそれぞれのショートカット、シンボリックリンクなど

Windowsで作ったショートカットはcoLinuxでは判別出来ません。これはCygwinと同じです。

また、CygwinのlnやWindowsで作ったハードリンクはcoLinuxを含めどのシステムからでも 同じように見えます(ただの実体だから当たり前か)。

Windowsで作ったシンボリックリンクやジャンクション(ジャンクションはフォルダだけ) はCygwinからは認識できます。 (またここで書いたように CygwinでWindowsのシンボリックリンクを作ったりも出来ます。)

これらはcoLinuxからは、フォルダだと辿れるのですが、 ファイルへ作ったシンボリックリンクについてはたどれません。

また、Cygwin lnで作ったシンボリックリンクはcoLinuxからはたどれません。

逆にcoLinuxで作った場合は、と見てみたいのですが、 coLinuxでマウントしたWindows領域でlnコマンドを打つと

$ ln -s a.txt b.txt
ln: creating symbolic link \`a.txt' to \`b.txt': Function not implemented

などと言われて作れません。通常のcoLinux内ではlnは正しく動いていますし、 Windows領域でもtouchでファイルを作ったりvimで編集して保存したり、 rmでファイルを消したりすることは出来ます。

どうもこれは今のところ解決する手段がないようなので、 共有領域にはリンクとかは作らない様にするしかありません。

これに関連して、最初、CygwinとHomeを共通にしてあげようと思って、

# usermod -d /mnt/c/cygwin/home/USER USER

等としてみましたが、今、dotfile系を全てDropboxに入れて そこからのリンクになっているのでCygwin側で作ったリンクが見れず駄目でした。

しかたがないので素直に元に戻してcoLinux内にリンクを貼っています。

# usermod -d /home/USER USER
# exit
$ cd
$ ln -s /mnt/c/Users/USER
$ ln -s /mnt/c/Users/USER/Documents/My\ Dropbox Dropbox
$ cd Dropbox/08_Settings/git/dotfiles
$ chmod 755 install.sh
$ ./install.sh
$ cd ../scripts
$ chmod 755 *.sh
$ ./install.sh

これでDropboxのディレクトリ経由でdotfiles等を共有できます。

その他coLinuxを使う上での注意点

この問題を探している時に、perl -pi -e 's/(.)/$1/' a.txt コマンドをすると中身が空になる、と言う話もセットで出てきたので 11、 自分ではあまりperlは使わないのであれですが、これもcoLinuxを使う上で注意するべき所の様です。

Cygwin V.S. coLinux

  • パフォーマンス的には圧倒的にcoLinuxの方が良い事が分かりました。 特に古いPCではCygwinでmake等をするとちょっと辛い感じです。
  • インストールはCygwinの方が圧倒的に簡単。
  • coLinuxはCygwinと違って本体が先に走っている必要がありますが、 サービスとして登録しておくことでWindows起動時に自動的に起動させ、 PuTTYからパスワードレスでログインすることで Cygwinのターミナルを開くのと同じ感じで作業を始められます。
  • Cygwinの方が便利な点としてはcmd.exeが使えるので、 Windowsのコマンドプロンプトで使えるコマンドが全て使えます。 これによってWindowsのシンボリックリンク等が扱えたり、 Windows本来の仕事を行う事も出来ます。 一方、coLinuxはリンク操作など、いくつかWindows領域での操作に制限があります。
  • Cygwinの場合は$HOMEがWindowsの環境変数で決まるので、 Windowsでこの変数を使うvimやfirefox-vimperatorが影響を受けます。 coLinuxの方はこの辺りは完全にcoLinux内で閉じています。
  • ここでは触れてませんが、Windows自体でsshサーバーをたてて外から ログインしたりする場合はCygwinからサービス登録する方が余計なネットワーク設定を しなくて済むので簡単です。

とりとめない感じですが、取り敢えず通常作業はcoLinuxで、 Windows関連の作業が必要な時はCygwinで、のような感じで、 しばらくは両方使っていくと思います。

もし次Windows買って64bitマシンとなったらVMWareも考えなきゃいけないかな、とも。

Sponsored Links
  1. Cygwin について頻繁に尋ねられる質問と回答: 3. 質問と回答集

  2. Cygwinでmakeやconfigureが遅いのはforkのせい

  3. 開発的には去年の始め頃から更新がされてないみたいであれですが、他にめぼしいものもなかったので。

  4. coLinuxは64bitではパッチが出たりしてるものの動かないっぽいのでVMWareにするしかないと言う話も(使ってるPCは32bit時代のもの、、、)。

  5. VMWareもsexeと言うソフトを使ってサービスへ登録することが出来るようです。

  6. Ubuntuも選択肢としてありますが、coLinuxでの最新の12.04はデフォルトがドイツ語キーボードだったりそれ以上に色々面倒な上、 不安定(Ubuntu12.04→Ubuntu9.04に変えたらすこぶる快適になった)。 さらにイメージファイルが4GBでした。9.04の方も入れて見ましたがこちらはgitのインストールが上手く行かなかったので断念。こちらはサイズが1GBでしたがDebianよりさらに古いので色々面倒なのもあってやめました。

  7. [coLinuxインストール完全マニュアル]ネットワークの設定をする, coLinux(0.7.x)のインストール [TAP-Win32でのNAT接続]

  8. 7の場合ネットワークとインターネット ネットワークと共有センター 左からアダプターの設定の変更

  9. サービスの登録の際に、confファイルをフルパスで@”C:\coLinux\squeeze.conf” 等としないと動かない、と書いてある所もありましたが、一応ファイル名だけで動いています。 また、Program Files等、スペースを含む場合、"で囲ってあってもサービスとして 登録された際にはずされてしまって正しく読み込めません。 自分の環境ではファイル名だけを指定すれば大丈夫なのでこれでも問題ないですが フルパスが必要な場合はどうしようもなくなるので、やはりC:直下にcoLinuxをインストールしておいた方が良さそうです。

  10. 1つはまったのが、上で書いたPuTTYの設定で、Remote character set をセットしてなくて、lsでは見れるがvimでは正しく表示できない状態に なったところでした。 暫くvimを疑ってましたが、ふとCygwinからログインしてみたら正しく表示できたので PuTTYが悪かった、ということに気付いた、と。

  11. coLinuxのcofs環境下で開発する場合の注意点Add Star

Sponsored Links

« ソースコードの表示色 Vim_emu for KeyRemap4MacBookのアップデート »

}