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
)を以下の様に修正します。
1 2 3 4 5 6 7 8 9 |
|
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
を
1 2 3 4 5 6 7 |
|
とします。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
を加えますuid
、gid
は/etc/passwd
にあるUSERの列にある
1
|
|
となっている様なところにある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-dev
、libexpat1-dev
、asciidoc
、xmlto
追加。
追記ここまで
取り敢えずの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も考えなきゃいけないかな、とも。
開発的には去年の始め頃から更新がされてないみたいであれですが、他にめぼしいものもなかったので。 ↩
coLinuxは64bitではパッチが出たりしてるものの動かないっぽいのでVMWareにするしかないと言う話も(使ってるPCは32bit時代のもの、、、)。 ↩
Ubuntuも選択肢としてありますが、coLinuxでの最新の12.04はデフォルトがドイツ語キーボードだったりそれ以上に色々面倒な上、 不安定(Ubuntu12.04→Ubuntu9.04に変えたらすこぶる快適になった)。 さらにイメージファイルが4GBでした。9.04の方も入れて見ましたがこちらはgitのインストールが上手く行かなかったので断念。こちらはサイズが1GBでしたがDebianよりさらに古いので色々面倒なのもあってやめました。 ↩
[coLinuxインストール完全マニュアル]ネットワークの設定をする, coLinux(0.7.x)のインストール [TAP-Win32でのNAT接続] ↩
7の場合
ネットワークとインターネット
ネットワークと共有センター
左からアダプターの設定の変更
↩サービスの登録の際に、confファイルをフルパスで@”C:\coLinux\squeeze.conf” 等としないと動かない、と書いてある所もありましたが、一応ファイル名だけで動いています。 また、
Program Files
等、スペースを含む場合、"
で囲ってあってもサービスとして 登録された際にはずされてしまって正しく読み込めません。 自分の環境ではファイル名だけを指定すれば大丈夫なのでこれでも問題ないですが フルパスが必要な場合はどうしようもなくなるので、やはりC:
直下にcoLinux
をインストールしておいた方が良さそうです。 ↩1つはまったのが、上で書いたPuTTYの設定で、
Remote character set
をセットしてなくて、ls
では見れるがvim
では正しく表示できない状態に なったところでした。 暫くvimを疑ってましたが、ふとCygwinからログインしてみたら正しく表示できたので PuTTYが悪かった、ということに気付いた、と。 ↩