Pages

Friday, November 10, 2006

Windows 下的 coLinux 環境設置

前言

coLinux 的全名是 Cooperative Linux,介紹到此結束 (爆)。這篇只是我的記錄,所以不想打太多字啦,簡單的說就是可以把 Linux 當作一般的應用程式來執行,所以是直接執行 Linux,額外的負擔比較少 (要執行 VM 或 cygwin 也是需要額外資源的)。

雖然我自己大部份時間是使用 Linux 作業,但有時候就是很無奈,因為種種原因只能在 Windows 上操作,不過嘗過 Linux 甜頭的人實在是很難適應 Windows 那樣貧乏的環境;有時則是因為臨時需要 Linux 的實驗環境,但主要工作都在 Windows 上,很難完全轉移。我相信這類情況不是只有我遇到,因此就出現了各種解決方案。

過去最常見的方式是執行 Virtual Machine,如 VMWareVirtual PC 等等,或者是透過 cygwin 之類的模擬環境,還有我這次想介紹的 coLinux。這些工具各有優劣,我只就我個人的使用經驗來談:Virtual Machine 太耗資源,cygwin 環境雖然很接近,但有些跟終端機相關的設定又不太一樣,用起來很不順手。而 coLinux 跑的是 User-mode Linux,環境上最接近真正的 Linux (根本就是),大部份操作跟真正的 Linux 環境下是一樣的,設定檔也可以直接搬過來用。所以自從我知道有這種好東西後,就把其他工具丟掉,專心試用 coLinux。

我的目標大概是這些:

  • 可以使用 putty 連線到 coLinux 中進行作業
  • coLinux 可以連線到外面的網路,方便系統更新
  • Windows 與 coLinux 的檔案交換
  • X 環境?
我會記錄如何達到這些目標。但這篇筆記的不包含 Linux 的使用,因此很多東西除非必要,或者是我自己覺得需要特別註解,不然我就不特別解釋了。因此內容主要著重在建立整個環境與設定,主要是方便我自己作業。有其他需求的話請自行調整,設定或操作上的問題也歡迎和我一起討論。網路上可以找到不少介紹 coLinux 的文章,也可以多參考。

安裝

第一步當然是安裝啦。要將 Linux 當作一般的應用程式來執行需要特殊版本的 kernel,coLinux 主要就是在做這件事。因此它不包含 Linux 的其他環境,需要另外下載。我個人習慣的的是 Slackware,但因為沒有現成的 disk image 可以用,所以退而求其次用 Debian image。其他還有 Arch / Fedora / Gentoo 等選擇,挑一個自己習慣的就好。下載點可以參考 wikisf.net

Windows 下的軟體安裝相信不會有問題,這邊就不多說了。接下來用 7-ZipWinRAR 之類的軟體解開下載好的 disk image,放在自己喜歡的地方 (建議不要放在路徑有空白或中文字的地方)。

接下來就是修改一下設定檔了。我習慣把設定檔跟 disk image 放在一起,往後直接指定設定檔路徑就好,比較不會搞混。設定檔只是單純的 XML 格式,通常簡單修改一下預設值就可以了跑了。需要修改的地方大概有 image path、memroy size 和 network:

<block_device index="0" path="DosDevicese:coLinuxfs_root" enabled="true" />
<memory size="256" />
<network index="0" type="tap" />
執行的時候輸入 (路徑請自行代換):
colinux-daemon -t nt -c e:coLinuxcolinux.xml
因為我覺得內附的 fltk cosole 很醜,所以直接用 nt 就好了。如果看得到 boot 過程並到達登入畫面,代表設定無誤,可以試著登入看看。一般都會有 root 帳號,但密碼卻不一定,有的不需要密碼,有的是用 'root' 或 'colinux' 當作密碼,這個只能自己試試看了 (也許 wiki 上有寫)。登入無誤的話,基本安裝就算是完成了,可以進行下一節的設定。

基礎設定(一)

這些現成的 disk image 環境通常不符合自己的習慣,所以通常需要稍微設定一下。以我下載的 Debian image 來說,root 沒有密碼,甚至連 shadow 檔都沒有;網路還沒設定,檔案也有點舊了。幸好 Debian 的升級還算方便,所以整個過程不會太難。

首先是密碼的部份。解決方式很簡單,只要建一個 shadow 檔,執行 pwconv 指令,再透過 passwd 設定 root 密碼就可以了。接著就可以建立一般使用者的帳號作為平常工作使用。我個人習慣透過 sudo 來管理系統,除非需要長時間使用 root 權限,不然很少動用 su。因此還需要設定一下 /etc/sudoers:(執行 visudo)

letoh   ALL=(ALL) ALL
覺得每次要打密碼很煩的話就加個 NOPASSWD 吧。詳細的設定語法可以 man sudoers

印象中還缺了一些重要檔案,例如 /etc/hosts/etc/hostname/etc/resolv.conf 等等,請檢查一下並手動建立。

另外,我習慣把 home 獨立放到一個 disk image 中,這樣的話如果有多個 root image 的話可以共用個人資料,會方便許多;備份時也會很方便,好處多多。做法很簡單,先到 這裡下載空的 fs image,編輯設定檔 colinux.xml

<block_device index="1" path="DosDevicese:coLinuxfs_home" enabled="true" />
這需要重新啟動 coLinux 才會生效。順帶一提,這個 disk image 在 coLinux 中對應的 device 是 /dev/cobd1,最後的數字對應到設定檔中的 index 值。重新進入 coLinux 後可以試著 mount 看看有沒有問題:
mkdir -p /mnt/test
mount -t ext3 /dev/cobd1 /mnt/test
沒問題的話可以寫進 /etc/fstab,往後開機就會自動載入了 (記得 /home 的資料先移到新的 disk image 中):
/dev/cobd1 /home ext3 defaults 0 1
如果覺得需要 swap 的話也可以依此類推建立。

到這裡應該覺得輸入很不方便吧,沒有順手的 editor;尤其是需要 copy&paste 的時候。我的目標是利用 putty 連線進去,但因為網路還沒設定好,系統也未必有裝 sshd,所以暫時擱下系統的更新,先把網路搞好再說。

網路設定(一)

這個小節的目標是搞定 Windows 上的網路設定,讓 Windows 可以連線到 coLinux,而 coLinux 也可以連線到外面的網路。首先是對外網路卡的設定,我選擇了 TAP + NAT 的方式來設置 coLinux 的網路環境。至於 bridge 環境的設定可以參考網路上其他文章的介紹

一般我是把 TAP 設定成 192.168.0.1,至於 default gw 與 name server 請自行參考原本的網路環境來設定。

再來是網路分享設定。找到對外的網路卡後,在進階的設定頁中勾選允許分享連線的選項,請參考下圖。

有些版本的 Windows 還可以選擇要分享給哪一個連線 (我搞不清楚是哪個版本),記得要選擇 TAP 那個網路,不然 coLinux 就不能上網了。

網路設定(二)

搞定 Windows 端的網路後,coLinux 對外的網路已經通了,但設定可能還不完備,可以先用 ifconfig 指令看一下,必要時再手動調整一下 (視使用的 distro image 而異)。

以我使用的 Debian 為例,需要設定的地方在 /etc/network/interfaces,設定內容如下:

auto lo eth0

iface eth0 inet static address 192.168.0.40 gateway 192.168.0.1 netmask 255.255.255.0

iface lo inet loopback

存檔後重新啟動網路即可:
/etc/init.d/networking restart
如果喜歡用 ifocnfig eth0 ... uproute add 來設定也可以,default gw 設成 192.168.0.1 就可以出去了。通通設定好以後就可以用 apt-get 將系統更新到最新的狀態了,我習慣更新到 testing,可以安裝比較多套件,穩定性也不會太差。先修改 apt 的設定檔 /etc/apt/sources.list
deb http://http.us.debian.org/debian testing main contrib non-free
deb http://security.debian.org/ testing/updates main contrib non-free
再進行更新:
apt-get update
apt-get dist-upgrade
詳細操作請自行參考 Debian 的教學文件。一開始的 distro image 很陽春,可能有不少東西需要安裝,我唯一建議安裝的套件是 openssh,這樣我們就可以透過 putty 來連線,或是用 sftp 來進行檔案交換:
apt-get install openssh
至此雙向的網路已經暢通,可以用 putty 連線到 192.168.0.40 看看 ssh 連線有沒有問題,或在 coLinux 連上網頁或 BBS 看看。一般性的操作是沒問題了,接下來比較麻煩的大概就是檔案交換吧,這個留待後面再來解決吧,目前還有其他事要做。

基礎設定(二)

又回到基礎設定了。為什麼還需要這一節呢?雖然前面已經把基本的系統都設定妥當,網路也 OK,但啟動時總覺得不方便,執行中也會留下一個 cmd 視窗。總之就是看不順眼,所以需要設定一下啟動方式。coLinux 目前可以作為 Windows 的 service 來啟動 (需要 NT 以上版本),這樣就可以在開機時自動啟動,也不會留下礙眼的 cmd 視窗。
colinux-daemon --install-service -c e:coLinuxcolinux.xml
執行(Win+R)的對話盒執行 services.msc 可以檢查一下是不是有正確安裝:

網路設定(三)

基本上網路是都好了,這一節只是記錄一下方便的小技巧。

我前面有說過我想使用 putty 連線進去,但每次連線都要打密碼有點煩,所以這邊建議改用 public key auth。這樣只要執行 Pageant (putty 附的小程式),把 private 加進來後,以後就不用一直打密碼了。方法如下:

  1. 執行 puttygen.exe,最下面的 type of key to generat 選擇 SSH2 RSA
  2. 按下 Generate 按鈕後會出現進度條,這時在視窗的範圍內隨意移動滑鼠,直到進度跑完
  3. 在 Key passphrase 的地方輸入一個密碼,同時 comfirm 欄位也要填入一樣的密碼,用來保護 private key。輸入無誤後可以按 Save private key 將私鑰存成檔案,這個檔案不可以亂丟,也不能公開,算是個人身份證
  4. 視窗上的 Public key for authorized_keys2 file 欄位會有一堆跟亂碼一樣的字串,全選後複製起來,加入工作站中 ~/.ssh/authorized_keys2 這個檔案中,別忘了這個檔案必需要 chmod 600
  5. 執行 pagenat 後會在 system tray 上出現一個圖示,按滑鼠右鍵選擇 add key,選擇剛剛儲存的 private key 後,會要你輸入一次 passphrase。

往後只要不關掉 pagenat,就不需要再重新輸入 passphrase,同時透過 putty 登入工作站會自動改用 public key 來認證,而不是密碼認證了

另外,我們可以把設定過的 putty session 存起來,這樣只要在桌面上建立一個新的 putty 捷徑,並在命令列的地方加上 "-load <session name>" 就會自動載入設定,使用起來就更方便了。

檔案交換

有這個需求的理由很單純:資源有限,欲望無窮阿 (喂喂∼不是在上經原吧)。Disk image 的大小有其限制,而且塞太多資料,往後備份很不方便。最理想的方式就是把一般資料都放在 Windows 裡,需要特殊屬性的檔案 (如 script 需要設定為可執行) 就可以放在 disk image 中。

要做到檔案交換的方式有很多種,大致上有 (S)FTP、HTTP、NFSsamba 等方案。目標就是兩點:

  1. 在 Windows 的 File Manager 中存取 coLinux 中的檔案。
  2. 從 coLinux 中簡單存取 Windows 端的檔案

Windows -> coLInux

要設置這些服務應該不難,問題在於我不太熟 Windows 的網路設定,所以我只選擇最簡單的方法。要做到第一點只要簡單設定一下 samba 就可以了。先安裝 samba 套件:
apt-get install samba smbclient smbfs libsmbclient samba-common
Debian 的 samba 的設定檔在 /etc/samba/smb.conf,找到以後需要修改一下幾個設定:
[global]
workgroup = your-087df13f91
server string = Henrietta
unix charset = UTF-8

[homes] browseable = no writable = yes create mask = 0600 directory mask = 0700

沒列出來的選項就按照原檔案中的設定不用改。Server String 請自己取,而 workgroup 則是參考 Windows 上設定的 hostname,以後會方便一些:

存檔以後需要重新載入設定:

/etc/init.d/samba reload
但只是這樣還不夠,還需要新增 samba 的帳號密碼:
smbpasswd -a <user>
設定好以後試試從 Windows 連線網路磁碟機,輸入帳號密碼後就可以順利存取個人目錄了。

coLinux -> Windows

接下來是困擾我最久的部份。Windows 上設定分享目錄並不難,但設定好的目錄老是沒辦法讓其他電腦存取。找了很久的資料才知道,原來要指定 Windows 的 hostname,瞭解以後就很簡單了。首先在 Windows 建立一個帳號給 coLinux 使用,比較保險一點還可以設定成不能本機登入或限制其他權限:

設定好分享的目錄後,一開始可以先用 smbclient 測試看看:

smbclient -U <user> -L <netbios name>
看得到分享出來的目錄就算是成功了,可以把設定檔寫到 /etc/fstab,帳號密碼的部份建議統一存到 /etc/samba 裡方便管理。
//host/share /mnt/share smbfs noauto,credentials=/etc/samba/smbpw.host,
ip=192.168.0.1,charset=utf-8,codepage=950,rw,uid=letoh 0 0
密碼檔格式參考 man smbmount。往後就可以方便存取 host 端的資料了。

事實上 coLinux 還提供了一種叫 cofs 的東西可以使用,我試用的結果是很方便,但彈性不太大,更改的話得修改設定檔並重新啟動 coLinux。而且根據 wiki 上的開示,似乎還不太穩定,所以暫時還是先用安全一點的辦法吧。(想嘗試的勇者請自己參考 其他資料)

X 環境

coLinux 據我所知是沒辦法跑 X Server 的,但是可以跑 X client。其實這樣就夠了,只要使用一些可以在 Win32 上使用的 X Server 就可以執行大部份 X 程式。可以使用的方案很多,我目前使用的是 Xming,使用起來很方便,要顯示中文也沒問題 (需要自己安裝字型)。

安裝上不會有問題,但因為 coLinux 跟 host 算是不同機器,比較有問題的可能是 host access list 的設定,不設定的話 X client 會警告 "can't open display"。一般是執行 xhost 加入就好,而 Xming 沒辦法這樣做。找了半天才知道,在 Xming 安裝目錄下有個 X0.hosts 檔案,把 coLinux 的 IP 加進去就可以了,夠簡單了吧。

然後設定好 DISPLAY 變數就可以了:

export DISPLAY=192.168.0.1:0

列印

雖然列印的需求可能不太高,不過如果需要定時印個報表什麼的還是蠻好用的,所以這邊還是介紹一下。

首先 Windows 端要設定 printer 可以分享,而且可以透過前面提過的 smbclient 指令看到。接下來只要把想列印的資料通過 pipe 丟給 smbclient

cat file | smbclient //192.168.0.1/<printer> -U <user> -c "print -"
資料會自動送給 Windows 的 spooler,然後印出來。有的印表機接受 postscript,有的是 pcl,而大部份都可以直接接受純文字資料,所以可以根據需求自己安裝額外的 filter,例如 a2ps 之類的程式。

備份

偶爾想亂玩系統的時候,coLinux 就非常好用了,可以先備份系統,玩壞再還原就好。關於備份的部份可以參考我以前寫過的 這篇文章

結語

完。(既然是筆記就不要太囉嗦了)

參考網址

  1. Tools
  2. Document


This article was originally posted on this site.

5 comments:

  1. [...] 之前把舊筆記整理了一下,發布了一篇Windows 下的 coLinux 環境設置。在還不會使用 LaTeX 前都是純文字格式的筆記,剛好前陣子也試用了一下 txt2tags 覺得還不錯,因此前一篇文章其實是用 txt2tags 轉成 HTML 後,再透過以前寫的小程式發布到 blog 上。 [...]

    ReplyDelete
  2. 圖好像爛了@@ zooomr 的圖好像掉了不少張...有需要的話請先看 pdf 版,找到原始圖檔再補圖吧XD

    ReplyDelete
  3. 發現這篇文章出現在 csdn

    ReplyDelete
  4. 你好,非常不好意思,我转了你的帖子,但是没有注明转帖。
    我玩了一段colinux,当时找了很多帖子,贴到那,准备后边整理,结果没玩了,就放那里了,真不好意思。

    现在才又玩colinux,看那个帖子,由回复来到这里,才看到你的这个留言。
    其实你给我回复下,我看到肯定会改下的

    ReplyDelete
  5. 樓上的朋友請不用在意,文章寫出來就是打算要分享的,真心希望這篇文章能幫助剛接觸 colinux 的使用者

    ReplyDelete