Cygwin


駭客任務當中, 電腦獨裁者佈置了舒適的虛擬環境, 讓被豢養在培養基當中的人們以為他們真正地在生活。 生活在自由世界的一群人, 努力地想要告訴大家: 從培養基裡面醒過來以後, 外面才是真實的, 自由的世界。

現實生活當中, 也有一群人致力於喚醒被電腦獨裁者所控制的大眾, 企圖協助社會革除微軟帝國的奴役。 它對資訊人權的侵犯行為日益加重, 已經讓很多朋友感受到痛苦; 無奈系統不可能一日轉換成完全自由的 Linux 或 *BSD。 沒有關係, 只要您有心爭取自己的資訊人權與自由, 就一定有方法逐步擺脫微軟的束縛。 如果你暫時還是必須經常使用 Windows, 現在至少有四條緩和地邁向自由的路徑:

  1. 免安裝的 LiveCD -- 其中最有名, 衍生版本最多的是 knoppix [4]
  2. 只安裝一部, 可以透過網路在好幾部只有 Windows 或完全沒有硬碟的 機器上使用 Linux (thin client 架構) -- 例如 penguinzilla [5] 或 ltsp [6]
  3. 在 windows 上安裝自由應用軟體 [1]
  4. 透過模擬機制, 在 Windows 底下執行 Linux, 例如 qemucolinux

其中第三案 Windows 下的自由軟體又可分為 GUI 類, 如 Firefox 與 OO.o, 及模擬 unix 命令列環境的 cygwin 環境。 後者就是這篇文章的主題。 嚴格地說, cygwin 是模擬 GNU ( [革奴] , 沒錯, 這裡的 g 要發音) 的環境, 而不是 unix 的環境 (對啦, 這正是 "Gnu's Not Unix" 要表達的意思 : -)。 Cygnus Solutions 公司 (後來為 redhat 所併購) 以自由軟體基金會的 gnu 工具為基礎, 將它移植到 windows 上, 就成了 cygwin; 它一直都是自由軟體。 初期只有命令列視窗 bash, 及編譯器 gcc 等等開發工具可以使用; 現在則連 X 視窗系統都已移植成功; 未來 X 視窗系統下的應用軟體也將逐漸移植過來。

為什麼要用 cygwin? 因為 組合學習 比較有效率。 cygwin 提供 regexpgnu 命令列環境 等等組合式工具。

何處下載? 原始站: http://sources.redhat.com/cygwin/; 但比較簡單的方式是下載 印地安那大學製作的免安裝光碟版 cygwin, 叫做 XLiveCD 其餘套件可至 交大其他映射站臺 下載。 又, Shelley Yen 製作了一片 cygnuwin 光碟: ftp://ftp.tceb.edu.tw/pub/free_software/cygnuwin/ftp://ftp.tcc.edu.tw/iso/cygwin 是 cygwin 與 gnuwin 的合成版。 (抱歉, 檔名/大小/md5sum 不統一, 下次改進...) 優點是二合一, 包含 gnuwin 的相對應中文版軟體, 及 cygwin; 缺點是沒有後續維護。

基本操作

Cygwin 裝好之後 (或是一進入 XLiveCD 之後), 立即可用的工具就是 bash。 它的操作方式, 則和一般的 UNIX 環境一樣, 因為它根本就只是 GNU 命令列環境。 命令列學一次, 可以在許多不同的作業平臺上使用, 長遠看來不是有 比較高的學習投資價值 嗎?

假設你在 gnu.stu.edu.tw 有一個 Linux 帳號叫做 ckhung。 你可以用 cygwin 連線過去, 執行 Linux 的指令, 甚至是 GUI 介面軟體, 它會顯示在本機 Windows 上。 這樣可以不必離開 Windows, 卻還是可以享用 Linux 下的 GUI 軟體。 (這當然不是最佳解, 只是筆者為了在沒有 Linux 的環境下生存的權宜之計)

  1. 先確認已經有一個 x-server 在執行。 然後開啟一個 xterm 視窗 (視窗上面會寫 X 和 Bash) 。 如果是直接跑 XLiveCD, 應該兩者皆已具備。
  2. 字太小, 看起來不舒服。 另外開一個大字形, 黑底綠字的 xterm: xterm -fn 12x24 -fg green -bg black &
  3. xlsfonts | less 可以查看有那些字形可以用。
  4. 連線過去: ssh ckhung@gnu.stu.edu.tw 第一次連線, 會問你是否信認對方主機。 打 yes (三個字母) 之後就可以打密碼登入。

現在可以開始享用 Linux 下的應用軟體了。 由於透過網路傳送圖形介面, 圖形視窗的反應可能稍慢。

如何存取原本在 Windows 下的檔案? 磁碟片 a:\ 在 cygwin 底下叫做 /cygdrive/a/ ; 檔案夾 c:\abc\xyz 在 cygwin 底下叫做 /cygdrive/c/abc/xyz ... 等等。

新增套件

用久了之後, 一定會覺得 cygwin 比真正的 Linux 環境不方便, 少了很多工具。 這時候就需要選擇將 XLiveCD 植入硬碟, 才能安裝額外的軟體; 或是自己將額外軟體裝在隨身碟上, 與原本的 XLiveCD 互補使用。 可執行檔並不是隨便放在那裡都可以使用。 可執行檔的搜尋路徑記錄在 PATH 環境變數內; 動態連結函式庫 (就是 windows 下的 *.dll 或是 unix 下的 *.so ) 的搜尋路徑記錄在 LD_LIBRARY_PATH 環境變數內。

先講簡單的情況: XLiveCD 已植入硬碟。 那麼只需要到前述的 交大其他映射站臺 下載個別的套件。 以安裝類似記事本的文字檔案編輯器 nano 為例:

  1. 找到 nano-*.tar.bz2 (檔案名稱當中不含 src 的那一個), 例如抓回硬碟放在 c:\download\ 目錄底下。
  2. 檢查一下內容: tar tjf /cygdrive/c/download/nano-xxxx.tar.bz2
  3. 先移駕到根目錄底下, 再解壓縮完成安裝: cd / ; tar xjf /cygdrive/c/download/nano-xxxx.tar.bz2

安裝完畢後不需要重新開機, 最多只需要關掉 bash 再打開一次。

如果新指令還是不能用, 有可能是需要用到其他的套件。 請回去 ftp 站檢查 setup.hint 這個檔案裡面的 requires 那一句, 這裡列出它所需要的所有套件。 這些套件是否都已安裝在你的系統上? (如何得知系統已安裝那些套件? 待補充)。 如果沒有, 就必須再上網抓相關的套件。

如果已安裝所有需要的套件, 卻還是出現 "找不到 xxx.dll" 之類的訊息, 可能是 setup.hint 列出的資料不完整。 可以到 這裡 搜尋, 看看到底那個套件內含有你要的 dll。 又或者 /etc/setup 底下, 有許多已安裝及未安裝套件所含檔案列表。

如果想要將額外的套件裝在隨身碟上呢? 裝完之後, 記得設定上述兩個環境變數就對了。 待續...


我有幾組專題同學在重製 XLiveCD。 以下是給他們看的。 對其他讀者而言, 缺乏當面的討論, 以下說明可能太過簡要, 不一定知道在說什麼。


想安裝 xxx, 請問還需要其他那些套件?

首先建立套件相依列表。

  1. 用 lftp 把所有的 setup.hints 抓回來。 我當初下指令: cd /x/cygwin ; lftp ftp://ftp.nctu.edu.tw/Windows/cygwin/release/ 然後在 lftp 裡面下 mirror -I setup.hint .
  2. 退出 lftp, 把所有相依關係放在一個文字檔裡面: find . -iname setup.hint | xargs grep '^requires:' > dependency.txt
  3. 使用 cygdep 列出需要的套件。 例如想知道 perl 需要那些套件, 就執行 ./cygdep perl

以下過時


以下解釋我離線安裝 cygwin 所做的動作。 如果您只是要使用 cygwin, 不想知道細節, 其實不必讀本文, 可以直接下載 "windows 下的自由軟體資源" [1] 裡面所提到的 cygnuwin 光碟。

cygwin 的所有套件都以 .tar.gz 或 .tar.bz2 格式打包。 這種檔案, 在 unix (或 cygwin) 環境底下分別可以用 tar xzf ... 或 tar xjf ... 解開。 問題是 ... 解壓縮時要用到的 tar, gunzip, bunzip2 等指令的執行檔, 也壓縮起來了, 真不知該叫雞生蛋, 還是叫蛋生雞才好。 所以我們把所有最基本的執行檔先在其他系統解開, 事先就放在光碟的 00core\ 目錄下。 這其中除了上述各指令外, 也包含其他重要指令如 cp, rm 等等, 還有讓你手動下命令的文字視窗 bash。 如果你不想使用 CD 上的 setup.sh 而是希望瞭解所有細節, 可以執行 bash 然後同時參考下文與 setup.sh, 自行手動逐步安裝。

例如我們想將 cygwin 裝在 d:\cygwin 底下, 那麼根據前兩個規則, PATH 就要設定成 /cygdrive/d/cygwin/bin:/cygdrive/d/cygwin/usr/bin 也就是在 unix 環境下的 /bin:/usr/bin 前面加上一長串。 這很不方便, 所以最好用 mount 指令將 windows 下的 d:\cygwin "掛" 在根目錄 / 這樣從此以後稱呼 /cygdrive/d/cygwin/bin 就可以簡單地用 /bin 就好了。 這裡的 mount 與 unix 下的 mount 略有不同, 實際上會寫資訊入 windows 的 registry 當中, 所以即使重新開機過, 也不必再下一次。 所以拷貝檔案的動作就很簡單, 不必多解釋了。

再來是解開所有最重要的套件 (記錄在 tmp/must.lst 裡面)。 /usr/bin/instpkg 這個簡單的 script 做的就是解壓縮的動作。 除此之外, 它還將套件內容記錄在 /var/log/packages 底下 (我學 slackware 的) 如果以後要提供刪除套件的功能, 可以查看這裡。

每個套件可能有數個版本, 所以如果手動安裝還需要仔細挑選一下。 更麻煩的是套件之間有相依順序, 例如 vim 要用到 libncurses6 與 terminfo 等等。 雖然這些資訊可以從各套件目錄內的 setup.hint 內查到, 但有時候相依的關係可以深達數層, 以人工檢閱還真是辛苦。 /usr/bin/tcypkg 這個 perl script 負責讀入想安裝的套件名稱, 並印出所有需要安裝的套件檔案名稱, 主要執行挑選版本及遞迴解決相依問題兩項工作。 當然在 perl 本身安裝好之前, 這個 script 無法執行, 所以我們先在 linux 下用 tcypkg 將 must.lst 轉出成 must_x.lst, 直接放入 CD 中。 等 setup.sh 執行完畢之後, perl 也安裝完成, 你就可以在 bash 視窗內使用 tcypkg 安裝更多套件了。 詳見 perldoc tcypkg。 抱歉, 目前的版本還沒有考慮到 x window。

未來我們希望將其他 windows 上的自由軟體 (不在官方版 cygwin 上面, 甚至不需要 cygwin 而可以獨立安裝的套件) [1] 也一起燒進這片 CD。 目前收錄的有 gnuplot, rlab [8] 等軟體。 這些跨平臺的軟體雖然不是很花俏, 但是很值得高中生與大學生做長遠的學習投資 [9], 同學們不妨建議學校數學相關科目的老師們試用一下。 我們希望透過 cygwin 環境下的自由軟體, 讓更多的微軟帝國使用者體驗自由的感受。 畢竟真正能令使用者們感受到實際用途的, 是應用軟體, 而不是作業系統。

以下亂七八糟


  1. Get XLiveCD.
  2. From one of cygwin mirror sites, download and install all of the following packages into your cygwin: binutils, gcc-core, gcc-g++, make, w32api, pkgconfig, glib2, glib2-devel, gtk+, gtk2-x11, gtk2-x11-devel, libxml2, xorg-x11-devel, libglade2, GConf2, ...
  3. The following packages need to be compiled from source:
    1. xrender
    2. freetype: somehow cygwin's package search service says there is a libfreetype package for download, but it is nowhere to be found in the archive mirrors.
    3. fontconfig: it requires a file ft2build.h missing from the XLiveCD distribution, which belongs to the libfreetype package according to the cygwin's package search service.

參考資料

  1. http://www.cyut.edu.tw/~ckhung/a/c034.php#fs4win
  2. http://www.gnu.org/
  3. http://www.knopper.net/knoppix/index-en.html
  4. http://opensource.nchc.gov.tw/diskless/
  5. http://www.ltsp.org/
  6. 在 CD 上的 01docs/ 目錄下, 或上原始網站看最新版: http://cygwin.com/faq/
    http://cygwin.com/cygwin-ug-net/cygwin-ug-net.html
  7. http://www.cyut.edu.tw/~ckhung//~ckhung/b/ma/
  8. http://www.cyut.edu.tw/~ckhung//~ckhung/a/c013.php
  9. http://cygwin.com/ported.html 已移植至 cygwin 的軟體列表