2008年初頭まで筆者はCeleron 400MHzという年代物のノートパソコンを使っておりました. このパソコンでは電源とFn+ファンクションキーの制御をOSに依存しないAPMで行っていたため,これらがLinuxからフルに使えたのですが,さすがに処理速度の面で使うのはつらくなってきました. そこで,新しいノートパソコン(頑丈さを売り物にしている某ノートです)を入手してみたら,電源とFn+ファンクションキーの制御がACPIに変わっており,ドライバのないLinuxでは液晶の明るさ調節以外のFn+ファンクションキーがほとんど使えず,プロジェクタへの出力ができないなどと研究者としての常用に耐えない状況でした.
そこで,coLinuxを検討してみたのですが,配布元でディスクイメージが配布されているディストリビュージョンは限られており,新しいディスクイメージを作るのは結構手間がかかるようです. そのため,実マシンの実パーティションにインストールしたネイティブLinuxを,デュアルブートできる設定としたままでcoLinuxからも使う方法について,最近の状況をまとめてみました. このページの情報が非常に参考になったので,最近のcoLinuxとディストリビュージョンに対する情報をまとめてみたというところです.
なお,しばらく使ってみた感想としては,ネイティブのLinuxに比べるとcoLinuxはマルチタスクの処理があまり上手くないようです. ネイティブのLinuxならば,シングルコアのCPUで動いていて裏で重たいプロセスが走っていてもメモリがスワップしない限りシェルのレスポンスはほとんど変化しないのですが,coLinuxではメモリ使用量によらず負荷がかかると途端にシェルのレスポンスが悪くなります.
また,インストールしたハードディスクは以下のパーティションに分割されているとします.
パーティション 種類 使用状況 sda1 基本 WindowsでNTFSとして使用 sda2 基本 Linuxで / にマウント sda3 基本 Linuxでswapに使用 sda4 拡張 使用不可 sda5 論理 Linuxで/optにマウント sda6 論理 Linuxで/homeにマウント
ネイティブLinuxをインストールしたら,Windowsを立ち上げてAdministratorでログオンします.
このインストールの内容は色々なところから情報が得られるので,簡単に書きます.
2008年2月にカーネル2.6.22を使うcoLinux-0.7.2がリリースされ,最近のディストリビュージョンのカーネルからの遅れが小さくなり,必要なデバイスファイルを自動的に作成するudevが普通に動くようになりました. しかし,/dev/nullはudevが起動する前に必要となるので,以下の手順でsda2の/devにこのデバイスファイルを作成しておかなければなりません.
mountコマンドでは表示されませんが,/devはdevfsをマウントしている状態なので,udevが起動したらルートファイルシステムの/devディレクトリにはアクセスできなくなります. この理由のため,以下の作業は/dev/sda2を/としてマウントしたネイティブLinuxからでは行うことができません.
以下に示す手順はcoLinuxのイメージファイルを全く使わない方法です. この環境ではbusyboxが提供する最低限のコマンドしかありません. また,loadkeysもないので英語キーボードを日本語キーボードに変える方法もありません. これらの手順に不安を覚える場合は,普通のイメージファイルを使ってcoLinuxを起動しデバイスファイルを作成することをお勧めします.
まず,C:\coLinuxに以下の設定ファイルを作成します(ここでは,ram0.confという名前で保存したとします).
kernel=vmlinux initrd=initrd.gz root=/dev/ram0 cobd0="\Device\Harddisk0\Partition2"
上記の指定で"Harddisk0"は1番目のハードディスク(0から数える)であり,"Partition2"は2番目のパーティション(1から数える)です.
上記のように作成した設定ファイルでコマンドプロンプト内で以下のようにcoLinuxをブートします.
cd \coLinux colinux-daemon @ram0.conf
すると,coLinuxをブートしたら開くコンソールでは,以下のメッセージが出て入力待ちとなります.
そうしたらEnterキーを押して,以下のコマンドを順に入力します.
mount -t ext3 /dev/cobd0 /mnt mknod /mnt/dev/null c 1 3 -m 666
デバイスファイルが問題なく作成できたら,/mntをアンマウントして,haltコマンドでcoLinuxをシャットダウンします. (なお,cdコマンドはないので代わりにchdirコマンドを使わなければなりません)
coLinuxの設定ファイルの説明では,xmlファイルの書き方を説明していることが多いですが,今は単なるテキストファイルで設定を行っています. 本ページの例で用いているパーティション分割では,coLinuxの設定ファイルは以下のようになります. (最初の青い字は単なる行番号であり,実際には入力しません.)
1: kernel=vmlinux 2: initrd=initrd.gz 3: cobd0="\Device\Harddisk0\Partition2" 4: cobd1="\Device\Harddisk0\Partition3" 5: cobd2="\Device\Harddisk0\Partition4" 6: cobd3="\Device\Harddisk0\Partition5" 7: sda2=:cobd0 8: sda3=:cobd1 9: sda5=:cobd2 10: sda6=:cobd3 11: root=/dev/sda2 12: ro 13: 3 14: mem=256 15: eth0=tuntap 16: selinux=1
上記設定ファイルの2行目は/lib/modules以下にcoLinuxのカーネルモジュールを展開するために必要な設定であり,一度展開してしまえば削除してもOKですが,coLinuxやネイティブLinuxディストリビュージョンをバージョンアップする時に再度必要となりますので残しておいた方が無難です.
3行目から6行目は実際のパーティションとcoLinuxが用いるデバイスファイルの対応です. 先ほど述べたとおり,1番目のハードディスクがHarddisk0となり,1番目のパーティションがPartition1となります. 特にパーティションの方はマウントできるパーティションの順番を示す番号であり,ネイティブLinuxにおける/dev/sda?で存在しない番号やパーティションとして使用できない拡張パーティションの番号は詰めて扱うため,これらがあると/dev/sda?の番号と一致しなくなるので注意が必要です.
7行目から10行目では,coLinuxが使うデバイス名の別名として,ネイティブLinuxから見えるデバイス名に設定しています. /etc/fstabが/dev/sda?のようにデバイス名で指定してあったら必要となるのは当然のことですが,ラベルで指定してあってもLinuxの起動スクリプトは/dev/cobd?をディスクとみなさないためか,起動時に/以外のファイルシステムをマウントできずにエラーが発生するので別名を指定する必要があります. なお,UUIDについては長い名前を打ち込むのが面倒なので筆者は試していません.
11行目は/としてマウントするファイルシステムの指定です. カーネルの起動時にはカーネルパラメータで指定した/だけをマウントし,その後起動スクリプトが/etc/fstabに指定してある/を再マウントして,他のパーティションをマウントします. そのため,これが/etc/fstabの指定と異なっていると,起動スクリプトが/を再マウントする時にパーティションが異なるというエラーが発生するので,/etc/fstabの記述と整合させておく必要があります. /etc/fstabがラベルで指定してある場合にも,coLinuxではラベルを認識せず,また上述のようにLinuxの起動スクリプトは/dev/sda?をマウントするので,ここでは必ず/dev/sda2と指定しなければなりません.
12行目はカーネルが最初に/をマウントするとき,read onlyでマウントするという指定です. これは,coLinuxに限らずLinuxカーネルを起動させる時には必ず指定しますので,忘れずに書いておいてください.
13行目ではデフォルトのランレベルを3,つまりテキストログインに指定しています. Windows自体がX Window Manager相当の機能を持っているため,coLinuxでWindow Managerを使わない設定です.
14行目はcoLinuxに割り当てるメモリ容量の指定です(単位はMB). カーネルパラメータにも単位付きでmem=256Mのような書式がありますが,これはカーネルパラメータではなくcoLinuxによって処理されるので単位は付けません. なお,colinux-daemon.txtによると,メモリ容量を指定しなければ実メモリの1/4が割り当てられるそうです(実メモリが128MB以上あれば).
15行目はTAP-Win32の指定です.
16行目はcoLinuxカーネルのSELINUXを有効にする指定です. 最近のLinuxのディストリビュージョンではSELINUXを有効にしたカーネルを前提としていますので,SELINUXを実際には使っていないとしても,coLinuxカーネルではSELINUXを有効にしておかないと色々なトラブルに見舞われる可能性があります.
以上の設定ファイルをc:\coLinuxに保存して(ここではreal-partitions.confという名前で保存したとします),コマンドプロンプト内で以下のようにcoLinuxを立ち上げます.
cd \coLinux colinux-daemon @real-partitions.conf
ネイティブLinuxとcoLinuxを同一パーティションで共存させる場合でcoLinuxのネットワークにWindowsのネットワークの共有によるNAT接続を使う場合には,この2つでネットワークアドレスが異なるために固定IPを割り振ることができず,必然的にDHCPでアドレスを割り振ってもらうことになります. また,ネイティブLinuxが用いる実際のNICとcoLinuxが用いる仮想NICでMACアドレスが異なるので,coLinuxのブート時のIP割り振り時はいいのですが,シャットダウンするときにエラーメッセージが出ます.
これらの対策として,まずcoLinuxが起動したらコンソール内でrootでログインします. Fedoraでネットワークアダプタの設定をしているのは,/etc/sysconfig/network-scripts/ifcfg-eth0であり,インストール時にDHCPを使うように設定すると以下のようになっています. (HWADDRは実際のNICのMACアドレスが入ります.)
DEVICE=eth0 BOOTPROTO=dhcp HWADDR=01:23:45:67:89:AB IPADDR=dhcp ONBOOT=yes
上記のハードウェアアドレスの部分をコメントアウトし,DHCPサーバに伝えるホスト名(ここではco-linuxとします)をDHCP_HOSTNAMEで指定して,次のように書き換えます.
DEVICE=eth0 BOOTPROTO=dhcp #HWADDR=01:23:45:67:89:AB IPADDR=dhcp ONBOOT=yes DHCP_HOSTNAME=co-linux
こうしておくと,割り当てられるIPアドレスが何であってもホストのWindowsからはco-linux.mshome.netでcoLinuxにアクセスすることができます. ただし,Windowsホストの名前がwinxpである場合,TAP-Win32のIPアドレスに対してwinxp.mshome.netが登録されているため,coLinuxのホスト名はWindowsホストとバッティングしないように違う名前にする必要があります.
上のようにインターフェース"eth0"の設定を行うのですが,このインターフェースの番号はudevによりMACアドレスに対して決定されますので,coLinuxで使うインターフェースがeth1となってしまいます.
この対策として,/etc/udev/rules.d/70-persistent-net.rules
を開き,coLinuxのネットワークインターフェースであるconetの設定行の末尾のeth1をeth0になるように修正します.
(コメント文を読めば,上記のファイルをどのように修正するか分かると思います.)
このように修正すると,パソコンの実ネットワークインターフェースとcoLinuxの仮想ネットワークインターフェースに共にeth0が割り当てられることになりますが,これらのインターフェースが同時に使える状況は発生しませんので,問題は生じません.
coLinuxを起動した後,[スタートメニュー]→ [マイ ネットワーク]→[ネットワーク接続を表示する]とクリックしてゆくと下記のような画面が現れると思います. ここでは,coLinuxが使うTAP-Win32の名前を仮想ネットワーク接続に変更しています.
スクリーンショットではワイヤレスネットワーク接続に既に共有マークがついていますが,ローカルエリア接続とワイヤレスネットワーク接続のどちらをcoLinuxのルータとするかを決めて,そのプロパティ画面を開いて詳細設定のタブで下のスクリーンショットのように,仮想ネットワーク接続からの接続を許可するように設定します. その下のチェックボックスの共有インターネットの制御や無効化の可否はお好みでいいのですが,おそらくcoLinuxからは操作できないので許可しても意味がないと思います. この状態で仮想ネットワーク接続のIPアドレスが192.168.0.xであるときには,coLinuxからの接続に対してWindowsがNAT+DHCPサーバ+Dynamic DNSとして動作します.
最後に,coLinuxからのXの接続を許可するため,C:\Program Files\Xming\X0.hostsのファイルにWindowsから見たときのホスト名を追加します. DHCPサーバに伝えるホスト名がco-linuxの場合,以下の行となります.
co-linux.mshome.net
Administratorで行う作業は以上で終わりです. なお,ログオフする前にはcoLinuxを忘れずにシャットダウンする必要があります.
次は,普段使っているユーザでログオンします.
まず,コマンドプロンプト内でcoLinuxを立ち上げます. coLinuxが無事に起動したら,XmingのXLaunchを立ち上げます. Windowsのホスト名がwinxpで,coLinuxがWindowsのDHCPサーバに伝えるホスト名をco-linuxとした時のXLaunchの設定画面のスクリーンショットを以下に示します.
なお,以前はXの通信をSSHのトンネルで行う方法を説明していましたが,グラフィックがIntel 965GMのノートパソコンにおいてglxgearsでFPS(frames per second)を測ってみたところ以下のように結果に差が結構あるので,直接Xの接続を行う方法に書き直しました.
SSHによるトンネリング : 約14FPS 直接接続 : 約35FPS
参考までに,同じノートパソコンでネイティブのLinuxでは420〜440FPSの結果でした.
上記の手順により起動されるgnome-terminalは必要な日本語入力メソッドのプログラムを立ち上げていませんので,SCIMやIBusは以下の手順で立ち上げます. 日本語入力メソッドを立ち上げた以降では,firefoxなどgtkをリンクしているアプリケーションでも漢字変換を行うことができます.
なお,自力でanthyなどに接続するemacsならば,日本語入力メソッドが立ち上がっていなくても漢字変換が行えます.
gnome-terminalの中でのマウスの右クリックで現れるメニューの入力メソッドで"SCIM Input Method"を選ぶと必要なプログラムが起動して漢字変換を行うことができます.
XIMを使うアプリケーションでは,SCIMを立ち上げた後にgnome-terminal内で以下のコマンドを実行してから立ち上げれば漢字変換を行うことができます.
export XMODIFIERS=@im=SCIM scim -d -f x11
setenv XMODIFIERS @im=SCIM scim -d -f x11
IBusで漢字変換を行うためには以下の手順を行います.
ibus-daemon -d --xim
XIMを使うアプリケーションでは,IBusを立ち上げた後にgnome-terminal内で以下のコマンドを実行してから立ち上げれば漢字変換を行うことができます.
export XMODIFIERS=@im=ibus
setenv XMODIFIERS @im=ibus
SCIMやIBusのプログラムはgnome-terminalを閉じても終了しません. また,SCIMやIBusを立ち上げなくても,Fedora 10以降ではgnome-terminalがdbus-daemonを起動しており,gnome-terminalを閉じてもdbus-daemonは終了しません.
これのどこが問題かというと,gnome-terminalを閉じてもXサーバに接続しているプログラムが存在するためXmingが終了せず,前述のXLaunchによりgnome-terminalを再び立ち上げることができません. Fedora 8ではSCIMだけだったため,Xmingを終了しなくても回避する方法がありましたが,Fedora 10以降では回避する方法がないようです. (コンソールでログインしてプロセスを停止する方法は除く.) そのため,gnome-terminalを全て終了した後,もう一度gnome-terminalを用いてcoLinuxにアクセスしたい場合は,確認/警告のウィンドウが出ますがXmingを終了させなければなりません.
このページで紹介しているWindowsをNAT+DHCPサーバ+Dynamic DNSとして利用する方法では,Windowsを再起動せずにcoLinuxを再度立ち上げようとすると,WindowsがDNSサーバとしてうまく働かない場合があります.
TeraTermやPuttyなどのWindowsのSSHクライアントでcoLinuxに接続して/etc/resolv.confを書き換えDISPLAY環境変数を指定し,Xmingだけを立ち上げれば使えないことはないですが,上記に比べると色々と不便だと思います. そのため,coLinuxを停止した後に再度起動する必要が生じた場合には,なるべくWindowsを再起動した方が良いでしょう.
coLinuxで提供されるconsoleのうちcolinux-console-fltkでは,下のスクリーンショットのようにメニューのMonitorからリブートとシャットダウンを行うことができます. (Power offはいきなり電源を切るのと同じなので,使わない方がよい)
また,Windowsの環境変数でCOLINUX_CONSOLE_EXIT_ON_DETACHに値1を与えておくと,coLinuxがシャットダウンすると自動的にconsoleが閉じます.
コマンドプロンプト内で以下のように行うと,coLinuxをWindowsのサービスとして登録することができます.
colinux-daemon @real-partitions.conf --install-service "Cooperative Linux"
こうしておくと"Cooperative Linux"という名前で登録され,Administrator権限では,コマンドプロンプト内で
net start "Cooperative Linux"
とするか,あるいは[コントロールパネル]→[管理ツール]→[サービス]からcoLinuxを起動することができます. なお,coLinux-0.7.8以降ではサービス名に"@"が使えなくなっているようです.
また,[コントロールパネル]→[管理ツール]→[サービス]からは,coLinuxを自動起動するように設定することも可能です. 自動起動とした場合にはcoLinuxをシャットダウンするのを忘れがちになりますので,WindowsをシャットダウンするときにcoLinuxがどのように停止するかが心配になりますが,ログファイルを見た限りでは正常にcoLinuxに対してシャットダウンコマンドを発行して停止しているようです.
とはいえ,coLinuxの自動起動の設定は自己責任でお願いします. coLinuxを自動起動としてLinuxのファイルシステムに損傷が発生しても筆者は一切関知しません.
coLinuxは基本的にコンソールとハードディスクおよびネットワークアダプタ以外のデバイスを持たないので,設定ファイル内においてcobd?やcofs?で指定したディスクデバイス以外へのアクセスについては全てネットワークを介して行う必要があります. 代表的なデバイスについては以下の方法で対応することができます.
とここまではいいのですが,サウンド機能についてはほとんど全てのパソコンに標準で搭載されているにも関わらず,UNIXでは現在サウンドの通信方法の標準化が行われているところなので,coLinuxの個々のアプリケーションがどの通信プロトコルを使っているかで大きく異なり,標準的な方法はありません. サウンドサーバによって異なる転送方法については,http://wiki.colinux.org/Sound_support_in_Colinuxにまとめられています.
本ページで対象としているFedoraでは,標準的なアプリケーションはPulseAudioを用いるように設定されているので,以下の手順でcoLinuxが出力するサウンドをWindowsのドライバで鳴らすことができます. なお,以下の情報は上記のhttp://wiki.colinux.org/Sound_support_in_Colinuxに書いてある内容をまとめただけのものです.
load-module module-native-protocol-tcp auth-ip-acl=127.0.0.1;192.168.0.0/16 load-module module-esound-protocol-tcp auth-ip-acl=127.0.0.1;192.168.0.0/16 add-autoload-sink output module-waveout sink_name=output set-default-sink output
exec0="C:\Path\To\PulseAudio\pulseaudio.exe"
設定作業は上記で終わりです. 20秒間サウンド出力がなければPulseAudioの出力モジュールがアンロードされるので,ホットプラグしたUSBのサウンドデバイスはモジュールがアンロードして再ロードしたタイミングで使用可能になります.
あとは,coLinuxの端末において環境変数PULSE_SERVERの値にWindowsホストの名前あるいはIPアドレスを設定すれば,coLinuxでPulseAudioに出力したサウンドがWindowsのドライバにより再生されます. Fedoraでalsa-plugins-pulseaudioがインストールされていれば,ALSAは直接ハードウェアを叩くのではなくPulseAudioを呼び出すので,ALSAのサウンド出力もOKです. また,上記のdefault.paから分かるようにEsounDの出力にも対応しているので,環境変数ESPEAKERに同様にWindowsホストの名前あるいはIPアドレスを設定すれば,EsounDに出力したサウンドもWindowsのドライバにより再生されます.
上記の設定をxmmsでのoggファイルの再生で試してみたところ,負荷がかかったときに通信エラーが発生することがあり,音楽再生などでサウンドサーバと通信し続ける用途には向いていないようです. そのため,このような目的ならばsambaによりファイルを共有して,Windows上のWinampを使う方が良いのではないかと思います.
前述のようにRPCポートマッパを使わないNFSv4ならば,以下の手順でcoLinuxから外部のNFSサーバのディスクをマウントすることができます.
/home 192.168.0.0/255.255.0.0(rw,insecure)
[General] Domain = example.org [Mapping] Nobody-User = nobody Nobody-Group = nobody
mount -t nfs4 -o proto=tcp nfsserver:/home /mnt
CIFS/SMBのマウントは以下のコマンドを実行して,SMBサーバのパスワードを入力することにより行ないます. SMBサーバ側の設定はWindowsホストからアクセス出来るようにしておけばOKです. (usernameとsmbserverは,それぞれユーザ名とサーバ名に書き換えてください. また,カンマの前後にスペースを入れてはいけません.)
mount -t cifs -o user=username,iocharset=euc-jp //smbserver/username /mnt
日本語文字コードがUTF-8の場合はオプションが,iocharset=utf8となります.
Last update: 2010.11.22