Cygwin的安裝、配置與調整

Cygwin是一個在windows平臺上運行的unix模擬環境。它對於學習unix/linux操做環境、在Windows上使用GNU工具集進行應用程序開發或移植、系統管理等,都很是有用。 html

關於Cygwin的安裝配置等,其實比較簡單,網上也有很多講解,此處僅以我的使用習慣做一次記錄,未必適合全部人。個人大致目標以下: python

- 保持Cygwin原汁原味,儘可能不改動Cygwin,也儘可能不加入本身的東西; linux

- 儘可能作到綠色化,儘可能不對現有Windows系統做修改; git

- 便攜化,能夠將Cygwin複製到其它機器上或是新的系統中,並仍能正常運行; github

- 方便維護和升級。 sql

1. 安裝

上面提到便攜化,Cygwin自己其實也能夠勉強算是「綠色便攜」的,但有一些問題,好比將Cygwin複製到新系統會有文件和目錄的權限問題,用戶名及SID的映射也要從新設置,還有它運行時會生成一些運行時文件,等等。 shell

有一些現有的項目或工具能夠幫助咱們實現便攜化,好比,能夠到 http://portableapps.com 搜索 Cygwin 並下載,或者,參考 https://github.com/CybeSystems/CygwinPortable 或 https://github.com/ntmoe/CygwinPortable,固然還有其它一些相似的開源項目,它們大都是提供了一些腳本、工具和安裝指南,以引導你安裝Cygwin。 vim

不過,我打算以本身的方式從頭構建 Cygwin。 windows

1.1 準備

首先,規劃好安裝目錄,好比 C:\Cygwin,下面我用一個環境變量 CYGWIN_ROOT 來表示它。也能夠考慮創建一個 VHD 虛擬硬盤,將 Cygwin 裝入這個 VHD 中,不只方便攜帶,也利於放到虛擬機中共享。 緩存

而後從 http://cygwin.com 下載安裝文件(32位版本的安裝文件爲setup-x86.exe,64位的是setup-x86_64.exe)到安裝目錄。也能夠從 http://www.redhat.com/software/cygwin/ 下載安裝文件,但兩處下載的文件是不一樣的,redhat.com 提供的 cygwin.dll 版本比 cygwin.com 提供的要新,並且,在安裝時,二者所提供的鏡像源不一樣,redhat那裏下載的安裝文件在默認狀況下只提供一個鏡像源(ftp://ftp.ges.redhat.com/cygwin),而二者的安裝鏡像源彷佛並不通用。

通常來講,cygwin.com 和 redhat.com 所提供的安裝文件,隨便選用哪一個均可以。安裝方式以圖形化交互方式最爲簡單,直接運行所下載的文件,按提示進行選擇便可。

1.2 安裝腳本

也可基於 command-line 進行安裝,好比寫個批處理文件放到安裝目錄中:

@echo off
echo Cygwin installer.
echo Copyright (c) 2014 Chen Zhiqiang. Released under the MIT license.
echo The script used to install cygwin in quiet mode. Maybe you should adjust this script first.
echo It's a good idea that set CYGWIN_ROOT and CYGWIN_CACHE before call this script.

::CYGWIN_ROOT: Cygwin will be installed to this path
if not defined CYGWIN_ROOT set CYGWIN_ROOT=%~dp0
if "%CYGWIN_ROOT:~-1%"=="\" set CYGWIN_ROOT=%CYGWIN_ROOT:~0,-1%

::CYGWIN_CACHE: Local package directory
if not defined CYGWIN_CACHE set CYGWIN_CACHE=%CYGWIN_ROOT%\packages

::CYGWIN_MIRROR: Download site
if not defined CYGWIN_MIRROR set CYGWIN_MIRROR=http://mirrors.kernel.org/sourceware/cygwin/

::CYGWIN_SETUP: Cygwin setup program
if defined CYGWIN_SETUP if exist %CYGWIN_SETUP% goto PRE
set CYGWIN_SETUP=
for %%i in (setup*.exe) do (
  set CYGWIN_SETUP=%%~fi
)
if not defined CYGWIN_SETUP set /P CYGWIN_SETUP=Input the path of cygwin setup program:

:PRE
::CATEGORIES: Specify entire categories to install
set CATEGORIES=Base,Admin,System

::PACKAGES: Specify packages to install
::Audio packages
set PACKAGES=sox,sox-fmt-flac,sox-fmt-wavpack
::DB
set PACKAGES=%PACKAGES%,postgresql,postgresql-client
::Devel packages
set PACKAGES=%PACKAGES%,autobuild,autoconf,automake,binutils,make,cmake,gcc-g++,gdb
set PACKAGES=%PACKAGES%,mingw-gcc,mingw64-i686-gcc,mingw64-x86_64-gcc,clang,llvm
set PACKAGES=%PACKAGES%,gendef,git,git-svn,cvs2svn,bzr,cygport,cygwin64,doxygen,indent
set PACKAGES=%PACKAGES%,patch,pkg-config,swig,tcl,tcl-tk,gawk,lua,perl,python,ruby
::Graphics
set PACKAGES=%PACKAGES%,gnuplot,gd,ImageMagick,optipng,pngcrush,popper,popper-data,exif
::Net
set PACKAGES=%PACKAGES%,aria2,curl,openssh,rsync,wget,tftp,tftp-server
::Utils
set PACKAGES=%PACKAGES%,bzip2,cpio,genisoimage,gnupg,mkisofs,upx,vim,hexedit
::X11
set PACKAGES=%PACKAGES%,xorg-server,xinit,XtoW,xauth,xhost

echo Installing Cygwin using these settings: (Press CTRL+C to abord)
echo   CYGWIN_ROOT=%CYGWIN_ROOT%
echo   CYGWIN_CACHE=%CYGWIN_CACHE%
echo   CYGWIN_MIRROR=%CYGWIN_MIRROR%
echo   CATEGORIES=%CATEGORIES%
echo   PACKAGES=%PACKAGES%
echo --

choice /T 8 /D Y /M "Confirm (continue after 8 seconds)"

if ERRORLEVEL 2 goto :EOF
if ERRORLEVEL 1 goto Install
goto :EOF

:Install
%CYGWIN_SETUP% -q -B -N -n -d ^
  -R %CYGWIN_ROOT% ^
  -l %CYGWIN_CACHE% ^
  -s %CYGWIN_MIRROR% ^
  -C %CATEGORIES% ^
  -P %PACKAGES%

根據本身的狀況進行些調整,便可全自動安裝Cygwin了。如想進行一些交互,或者僅以普通用戶運行時遇到權限問題,應從命令參數中去掉 -q,這樣能夠在安裝過程當中進行交互和干涉。另外,若是用的是從 redhat.com 下載的安裝文件,那麼不須要加 -s 參數,由於 redhat.com 提供的那個安裝文件默認只有一個鏡像源,並且我在批處理中所用的那個鏡像源也不適用於它。

至於Cygwin鏡像,我通常使用163,或是國外的 cygwin.osuosl.org 或 mirrors.kernel.org

安裝過程結束後,應該先檢查 %CYGWIN_ROOT%/var/log/setup.log 看看有無錯誤發生。

爲了便攜化的目的,在上面的批處理中我使用了 -N -n -d 這些參數,這使得Cygwin不會自動生成菜單和快捷方式。若是不考慮便攜,那麼應該將這幾個參數去掉,並且能夠略過二、3這兩章節。

若要獲得一個乾淨的便攜化的Cygwin,在安裝完成後必定不要運行Cygwin!由於Cygwin會在運行時生成一些文件(/cygdrive/..., /var/..., /home/...)。

2. 便攜化配置

首先應該說明一點,對 Cygwin 來講,便攜化並不是那麼重要,畢竟,它在運行時須要管理 Windows 的用戶及權限與它自身的 posix 系統之間的映射,還要在運行時生成一些動態信息,等等問題。通常狀況下,使用 Cygwin 的安裝程序安裝和配置 Cygwin 就足夠了。

若是是嫌 setup 程序網絡下載太慢,那麼能夠在安裝完成後,備份 setup 程序以及所下載的包文件目錄(參看上面批處理中的 CYGWIN_CACHE),在新系統中,將這個備份複製過來,運行 setup 時選擇從本地安裝便可。

而我後面所述的操做,在某種程度上實際上是複雜化了,看起來更像是打造我的所使用的 Cygwin,或只是一個小團隊所使用的 Cygwin,但至少對我是有意義的,畢竟,我不想在每一個新系統中都再執行一次 setup。

2.1 文件清理

Cygwin的安裝程序會在它所在的目錄下,以及 $CYGWIN_ROOT/var/log目錄下,留下兩個日誌文件: setup.log 和 setup.log.full,能夠清理它們。

安裝 fontconfig 包時,fontconfig 的 postinstall 腳本會在 $CYGWIN_ROOT/var/cache/fontconfig 目錄下生成緩存文件,由於這些文件很小,並且 Windows 上的字體信息大體上也差很少,我沒有清理它們。若是清理了也不要緊,能夠在之後的使用中調用 /etc/postinstall/fontconfig.sh.done 或者運行 fc-cache -r 從新生成緩存。

安裝程序還會在註冊表中留下安裝信息,不過 Cygwin 的運行並不依賴它,安裝配置完成後能夠將註冊表裏的這些信息刪除。

2.2 修改文件權限

Windows 的權限系統與 posix 標準不一樣,而 Cygwin 試圖在 Windows 上模仿和實現 posix 權限。通常狀況下,Cygwin 作的很棒,但對我如今要打造的這個 Cygwin 來講是個麻煩。Cygwin的安裝程序會將所安裝的文件的屬主設成當前Windows用戶,並把這些文件的屬組設置成 NONE(至少在Win8.1下是這樣)。若是要在一個新的系統中使用 Cygwin,由於用戶信息變了,這些文件的owner id 與 group id都會變成未知。即便新系統的登陸名與原系統同樣也沒用,由於用戶的真正標識是SID。

查看 %CYGWIN_ROOT%\etc 下的 passwd 和 group 這兩個文件,會發現一個名爲Administrators的用戶名,其對應的組名也是 Administrators,uid 和 gid 都是 544,對應的 SID 是 S-1-5-32-544,這個 SID 在各個 Windows 系統中是不變的,它表明內置的管理員組。在Windows上,文件的全部權並不區分組和用戶。

咱們能夠據此重設 Cygwin 目錄的屬主。以管理員身份打開一個 CMD 窗口,cd 到 Cygwin 的安裝目錄,而後運行如下命令:

:: cd /d %CYGWIN_ROOT%
takeown /F cygdrive /A
icacls cygdrive /reset
bin\chown Administrators:Administrators Cygwin*.*
bin\chown Administrators:Administrators home
bin\chown -R Administrators:Administrators usr lib bin sbin etc var tmp dev

注意,上面的命令序列有可能形成現有使用中的 Cygwin 不能正常運行,即使是對於新裝的 Cygwin,我也不做任何擔保。並且,別期望上面這幾行設置能適用於全部的應用場景,不一樣的軟件對權限的要求是不同的,有時你仍是得根據本身要用的軟件對某些目錄作權限修改。

2.3 清除用戶信息

在Cygwin的安裝過程當中會生成 /etc/passwd和/etc/group 這兩個文件,它們把 Windows 的用戶映射到Cygwin的 posix 系統上。然而,當把 Cygwin 複製到另外一個系統中運行時,因 SID 的變化,這兩個文件的有些記錄會無效。

一種粗暴的辦法,刪除這兩個文件。當在新系統中使用 Cygwin 時,以管理員身份啓動 Cygwin 的 bash shell,而後使用 mkpasswd 和 mkgroup 來重建它們:

# if you are a domain user, you should use the "-d" option.
mkpasswd -l > /etc/passwd
mkgroup -l > /etc/group

保守點的辦法,從這兩個文件裏刪除那些 SID 可能會變化的記錄。有些 SID 是固定不變的,好比 SYSTEM 和 Administrators 等,這些記錄能夠保留。能夠參考 Cygwin 的指南  http://cygwin.com/cygwin-ug-net/ntsec.html 以及  Well-known SIDs.  當在新系統中使用 Cygwin 時,只要在使用前先設置好 USERNAME 和 HOME 環境變量,不作其它改動也能夠部分使用 Cygwin。然而,這是有缺陷的,畢竟是少了當前用戶的信息,要想完整地使用 Cygwin,仍須要管理員去從新生成 passwd 和 group。

2.4 修改Cygwin.bat

Cygwin 的運行與它的安裝路徑其實沒什麼關係,然而,Cygwin.bat 這個文件裏卻寫死了它的運行路徑。我不清楚是什麼人基於什麼樣的理由把它寫成那樣,我對它作了下修改:

@echo off
%~dp0\bin\bash --login -i


3. 便攜化包裝與移動

3.1 方案

至此,所獲得這個 Cygwin 已是一個與本機環境無關的系統了,如今到了關鍵的一步:如何方便地將它部署到新系統上呢?

常規方式,將這個 Cygwin 壓縮爲文件,在新系統中解壓到某目錄,便可正常運行其中的 Cygwin.bat 了。

個人想法,將 Cygwin 封裝到一個映像文件中去,每一個系統都以此爲基礎,使用它的一個差分映像。要實現這個想法,有兩種方法:差分VHD 和 WIM。

3.2 差分VHD方式

首先準備一個VHD虛擬硬盤,將 Cygwin 灌裝其中。若是一開始就是在一個VHD上進行安裝的,那要省事很多,不然就要再將 Cygwin 複製到這個 VHD 中,複製時要注意權限問題。

以後,能夠給該VHD創建一個差分VHD,之後就掛載這個差分VHD來使用Cygwin,母VHD中始終是與具體機器環境無關的乾淨的Cygwin。

使用 VirtualBox 時,則能夠直接以「多重掛載」方式掛載母VHD,每一個虛擬系統都會在其上創建一個Snapshot,以後的使用會沿着各自的分支走下去。

3.3 WIM 映像

WIM 映像能夠包含多個卷,多個卷之間能夠共享相同的文件,並且 WIM 映像能夠掛載,所以把 Cygwin 裝到 WIM 中也是個選擇。在 Win8 以上版本,可使用 dism,其它版本的 Windows 可使用 imagex。

首先,Capture 第一個WIM卷。假設 CYG_HOME 表明安裝目錄,如 X:\Cygwin,CYG_WIM 表明WIM映像,如 X:\Cygwin.wim。使用 dism 進行 capture:

DISM /Capture-Image /ImageFile:%CYG_WIM% /CaptureDir:%CYG_HOME% /Name:Cygwin /Compress:fast

或者使用 ImageX:

imagex /capture %CYG_HOME% %CYG_WIM% "Cygwin"

而後,Append 第二個卷:

DISM /Append-Image /ImageFile:%CYG_WIM% /CaptureDir:%CYG_HOME% /Name:Cygwin-2

或者:

imagex /append %CYG_HOME% %CYG_WIM% "Cygwin-2"

使用時,掛載第二個卷,第一個卷保持是與機器環境無關的乾淨的映像。好比把Cygwin掛載到X:\Cygwin:

DISM.exe /Mount-Image /ImageFile:%CYG_WIM% /Index:2 /MountDir:X:\Cygwin

或:

imagex /mountrw %CYG_WIM% 2 X:\Cygwin

要保存時,不要忘記最後卸載時候進行commit:

DISM.exe /Unmount-Image /MountDir:X:\Cygwin /Commit

或:

imagex /unmount /commit X:\Cygwin

不過,掛載WIM的時候也許耗時較長,至少在我這裏是這樣的。所以,實際上我只是用 WIM 對 Cygwin 作備份。從備份角度來講,WIM 要比 VHD 好一些,某些場合下比打包成壓縮文件要好。

4. 使用

4.1 權限修復

又一次,提到了權限問題,夠囉嗦!但若是你常常在幾個系統間使用同一份Cygwin,或者重裝了系統而直接使用原先使用過的Cygwin,或者其它什麼緣由致使SID變化、權限變化等,Cygwin的一些文件可能會沒法寫入或沒法刪除,用管理員操做都不行,那該怎麼辦?

這時,能夠先用takeown取得文件的全部權,好比:takeown /F %CYGWIN_ROOT% /R /D Y,或者,若是要把文件屬主改成 Administrators 組,那麼使用 takeown 時再加個 /A 參數。以後,可使用管理員身份按照2.2所述修改文件權限,或者使用icacls對文件權限進行重置。

不過,這些操做是有必定危險性的,要當心。還有,有些軟件或文件須要一些特別設置。

另外,有些文章提到了關閉cygwin的Linux權限模擬,這能夠經過修改etc/fstab文件來實現,在其中加上noacl參數,好比:none /cygdrive cygdrive binary,noacl,posix=0,user 0 0

不過,我不建議你這麼作,我對此也瞭解很少。

4.2 PATH, cygstart, 以及更好的 Cygwin.bat

通過以上的步驟,Cygwin已經能夠在新系統中使用。執行 Cygwin.bat 能夠以當前Windows用戶的身份登陸Cygwin系統並得到一個交互式Shell。另外,還能夠將Cygwin的 bin 和 sbin 的路徑加入到Windows的PATH環境變量中,這樣,在Windows的命令行中或批處理中,也可使用Cygwin的工具。不過要注意的是,Cygwin的有些程式與Windows的同名,好比find和date。

除了把Cygwin加入PATH,進一步,有沒有辦法能夠用一個命令打開任何能夠在 Cygwin 裏打開的東西?在Linux中,有個 xdg-open 工具,能夠打開或運行任何它所能識別的東西,在 Windows 中也有個相似的東西,叫作 start。好比,若是運行 start notepad,那麼會打開notepad這個程序,若是運行 start some.txt,那麼會調用一個編輯器來打開some.txt (取決於你給txt類型註冊了什麼編輯器,默認是notepad.exe)。然而,通常狀況下 start 並不會識別 Cygwin 的腳本文件、軟連接等等東西,在 Cygwin 中,有沒有相似於 xdg-open 和 start 這樣的東西呢?有,它就是 cygstart。

cygstart至關有用,你沒必要理會什麼文件須要調用哪一個程序來打開,只管把這文件傳遞給cygstart便可。若是你願意,可使用 cygstart 給 Windows 加個右鍵菜單:「Run in cygwin」。

若是把cygstart加入到Cygwin.bat會怎樣?那個原生的Cygwin.bat太簡陋了,我想讓它複雜點:

- 若是無參數運行,其行爲與原生Cygwin.bat一致,即,打開一個交互式Shell;

- 若是傳參數給它,其行爲與cygstart一致,即,調用cygstart,它會嘗試接收全部傳給它的參數並執行。

這樣,我能夠將Cygwin.bat固定到任務欄上,而後,點它便是打開一個Shell,而把任何文件拖到它上面,它則會調用cygstart來打開這些文件,好比,把一個shell腳本拖到它上面來運行。

要實現這些目標並不複雜,咱們再次對Cygwin.bat進行改寫:

@echo off
if not defined CYGWIN_ROOT set CYGWIN_ROOT=%~dp0
if "%CYGWIN_ROOT:~-1%"=="\" set CYGWIN_ROOT=%CYGWIN_ROOT:~0,-1%
::Append Cygwin PATH
echo ;%PATH%; | findstr /I /C:";%CYGWIN_ROOT%\bin" >nul || PATH %CYGWIN_ROOT%\bin;%CYGWIN_ROOT%\sbin;%PATH%

if defined %1 goto CYG_START

:CYG_SHELL
%CYGWIN_ROOT%\bin\bash --login -i
goto :EOF

:CYG_START
%CYGWIN_ROOT%\bin\cygstart %*


4.3 用戶名映射

在新環境下,應該先讓管理員使用mkpasswd和mkgroup從新生成/etc/passwd和/etc/group。

默認狀況下,Cygwin會使用Windows的登陸名做爲用戶名。Cygwin會先讀取/etc/passwd文件,根據當前Windows用戶的SID找到對應的記錄,該記錄中的用戶名不必定和Windows的相同。若是Cygwin在passwd文件中找不到對應的SID,那麼它會讀取USERNAME這個環境變量並以其值做爲用戶名。

瞭解了Cygwin的用戶名映射的原理,就能夠對它做一些特殊的改動和設置:

(1) 使用Cygwin以前設置USERNAME環境變量,Cygwin將以其值做爲用戶名;

(2) 修改/etc/passwd,能夠更改用戶名、家目錄等信息,但要記住,passwd文件是使用Windows用戶的SID來做關係對應的;

(3) 映射root用戶。修改/etc/passwd,將某用戶名修改成root,但關鍵的是,須要將id(不是SID)改成0。好比:

root:unused:0:513:U-FOO\SA,S-1-5-21-...:/home/SA:/bin/bash

能夠參考官方的用戶指南以瞭解更多:http://cygwin.com/cygwin-ug-net/ntsec.html#ntsec-setuid

4.4 用戶家目錄(HOME)

缺省狀況下,HOME=/home/用戶名,並在用戶第一次登陸時生成該目錄。有一些方法能夠對HOME進行調整。

(1) 在/etc/passwd文件中指定用戶家目錄;

(2) 設置HOME環境變量。一旦設置了HOME環境變量,無論/etc/passwd文件中有無指定用戶的家目錄,Cygwin都將優先使用HOME環境變量的值做爲用戶家目錄。

好比,咱們想將Cygwin的用戶家目錄設爲Windows的用戶家目錄,使得二者一致,那麼咱們能夠在Windows的用戶環境變量表中設置HOME=%USERPROFILE%,Cygwin會自動完成Windows路徑到Cygwin路徑的轉換。

你也能夠在命令行中或是在批處理中,在調用Cygwin工具以前,設置HOME變量,而不用永久地改變環境變量表。

4.5 sudo?

Cygwin中彷佛沒有sudo命令,不過可使用cygstart來部分地模擬它: cygstart --action runas your_command_and_parameters

能夠把它寫成一個腳本:

#!/bin/sh
cygstart --action runas "$@"


4.6 中文環境

新版本的Cygwin自己對中文的支持已經很好了,在Windows 8.1 中文版下,不用任何設置便可正確處理和顯示中文。

- 控制檯亂碼

若是出現亂碼,可編輯~/.inputrc:

set meta-flag on
set convert-meta off
set output-meta on
set input-meta on

上面的設置可能已存在於.inputrc文件中但被註釋了,那麼去掉相應行的註釋便可。

並編輯~/.bashrc:
alias ls='ls --show-control-chars --color=auto'

若是還不能解決問題,試試看在~/.bash_profile文件的末尾加入:

export LANG=C.UTF-8
export LC_CTYPE=C.UTF-8
export XMODIFIERS=@im=Chinput3
stty cs8 -istrip
stty pass8
export LESSCHARSET=latin1

或者從網上找找解決方案,我是不想弄了,我這裏不修改任何東西也沒亂碼,能不修改系統就不要修改系統。若是你還在用老版本的Cygwin,升級是個好主意。

- vim中文

在 ~/.vimrc 文件中加入下面設置:

set fileencoding=utf-8
set fileencodings=ucs-bom,utf-8,cp936,gb18030,big5,euc-jp,euc-kr,latin1
fileencoding 和 fileencodings 分別是缺省文件編碼和自動識別文件編碼順序。

4.7 Shell命令自動補全忽略大小寫

修改~/.inputrc文件:

set completion-ignore-case on

另外,若是想讓命令行在匹配文件時忽略文件名的大小寫,那麼還能夠這樣修改~/.bashrc:

shopt -s nocaseglob


4.8 系統更新與包管理

Cygwin的安裝程序並不只用於安裝Cygwin,它同時也是系統更新工具和包管理工具,可使用它更新系統、刪除老舊的包,安裝新的軟件包。

安裝程序還可使用命令行的方式進行包管理工做。假設安裝程序名爲 setup-x86.exe,咱們想像使用apt-get 那樣安裝 git 和 wget,那麼可使用管理員的身份這樣執行:

setup-x86.exe -q -P git,wget

實際操做中你可能還須要-s、-R、-l等參數,若是那樣的話你能夠寫個腳本把那些參數值固定下來。事實上咱們只須要不多的操做便可像使用 apt 或 yum 那樣使用 Cygwin 的 setup,不須要第三方的那些模仿 apt 或 yum 的工具。並不是說那些工具很差,但它們大多更新不及時,再也不適用於新版本的 Cygwin,或者早就再也不更新,使用它們時要謹慎。

許多文章提到了 apt-cyg:

## cygwin下命令行安裝軟件
wget http://apt-cyg.googlecode.com/svn/trunk/apt-cyg
chmod +x apt-cyg
mv apt-cyg /usr/local/bin/
apt-cyg install 軟件名字

我查看了它的源碼,還算不錯。它僅僅是一個 shell 腳本,不須要其它依賴,可做爲一個參考。不過,老老實實用官方的 setup 也許是最好的選擇。

我寫了一個批處理文件 cyg-setup.bat,它能夠將命令行參數傳遞給 Cygwin 的 setup 程序,但它會自動補上 -R, -l, -s 參數。將這個批處理及 Cygwin 的 setup 程序一塊兒放到 Cygwin 的安裝目錄下,能夠在CMD裏這樣使用它:

:: 安裝軟件包
cyg-setup -q -P wget,ocaml-llvm,guile

::刪除軟件包
cyg-setup -q -x guile,tcl-tk

下面是這個批處理的源碼:

@echo off && goto main
:Info
echo cyg-setup - Cygwin setup wrapper.
echo Copyright (c) 2014 Chen Zhiqiang. Released under the MIT license.
echo Usage is same to the cygwin setup program, but it will try to resolve these options if they omited: -R, -l, -s.
echo -R, use %%CYGWIN_ROOT%%, or, use the directory path of this program.
echo -l, use %%CYGWIN_CACHE%%, or, use %%CYGWIN_ROOT%%\packages.
echo -s, use %%CYGWIN_MIRROR%%, or, pass a default mirror site to the setup.
echo And, you can use the "acl" option (%0 acl) to reset ACL.
goto :EOF

:main
set P= %*
::CYGWIN_ROOT: Cygwin will be installed to this path
if not defined CYGWIN_ROOT set CYGWIN_ROOT=%~dp0
if "%CYGWIN_ROOT:~-1%"=="\" set CYGWIN_ROOT=%CYGWIN_ROOT:~0,-1%
::CYGWIN_CACHE: Local package directory
if not defined CYGWIN_CACHE set CYGWIN_CACHE=%CYGWIN_ROOT%\packages
::CYGWIN_MIRROR: Download site
if not defined CYGWIN_MIRROR set CYGWIN_MIRROR=http://mirrors.kernel.org/sourceware/cygwin/

if /i "%1"=="info" goto Info
if /i "%1"=="acl" goto ACL

::CYGWIN_SETUP: Cygwin setup program
if defined CYGWIN_SETUP if exist %CYGWIN_SETUP% goto PRE
set CYGWIN_SETUP=
for %%i in (setup*.exe) do (
  set CYGWIN_SETUP=%%~fi
)
if not defined CYGWIN_SETUP set /P CYGWIN_SETUP=Input the path of cygwin setup program:

:PRE
(echo %P% | findstr /C:" -R " >nul) || (echo %P% | findstr /C:" --root ">nul) || set P=%P% -R %CYGWIN_ROOT%
(echo %P% | findstr /C:" -l " >nul) || (echo %P% | findstr /C:" --local-package-dir " >nul) || set P=%P% -l %CYGWIN_CACHE%
(echo %P% | findstr /C:" -s " >nul) || (echo %P% | findstr /C:" --site " >nul) || set P=%P% -s %CYGWIN_MIRROR%

:Setup
%CYGWIN_SETUP% %P%
goto :EOF

:ACL
takeown /F %CYGWIN_ROOT% /A
icacls %CYGWIN_ROOT% /reset
takeown /F cygdrive /A
icacls cygdrive /reset
set CHOWN=%CYGWIN_ROOT%\bin\chown.exe
%CHOWN% Administrators:Administrators home
%CHOWN% -R Administrators:Administrators usr lib bin sbin etc var tmp dev
goto :EOF

這個腳本使用了幾個變量:

  • CYGWIN_ROOT,Cygwin的安裝目錄,默認值爲該腳本所在的目錄;
  • CYGWIN_CACHE,Cygwin的軟件包下載路徑,默認值爲 %CYGWIN_ROOT%\packages;
  • CYGWIN_MIRROR,Cygwin的安裝鏡像源,默認使用 mirrors.kernel.org。

這三個變量均可以經過設置環境變量來改變它們的位置。

4.9 VHD和WIM映像的更新

若是是將Cygwin安裝到VHD或WIM映像文件中,若是想將大量的更新應用於基映像,那麼應該先刪除差分映像或是附加的分卷,掛載基映像,而後進行 Cygwin 的更新。

更新完成後,可能須要從新進行一些權限和用戶方面的設置。以後,基於此映像能夠從新創建差分映像或附加分卷。

5. 其它

- CYGWIN_ROOT,  HOME, TERM 環境變量

我的習慣,設置CYGWIN_ROOT環境變量,並將 %CYGWIN_ROOT%\bin 和 %CYGWIN_ROOT%\sbin 加入到PATH的後面,這樣能夠隨處調用Cygwin的工具;

關於這個CYGWIN_ROOT,我通常是將Cygwin安裝到某個盤的Cygwin目錄下,不使用其它路徑,可少帶來一些麻煩(好比,Cygwin的startxdmcp.bat等文件使用了硬編碼路徑);

設置HOME環境變量以覆蓋Cygwin在passwd中的設置,我把它設置爲%USERPROFILE%,與Windows的用戶家目錄相同;

TERM可不設,或設爲xterm。

- CYGWIN環境變量

許多文章都提到這個環境變量,然而,其中大部分都已通過時,請謹慎設置這個環境變量。

- 卸載Cygwin

除了菜單和快捷方式,Cygwin並不會在系統其它位置安裝文件,將 Cygwin 目錄刪除便可。

若是將 Cygwin 裝在了映像文件中,刪除映像文件便可,不然就刪 Cygwin 目錄。

若是 Cygwin 目錄遇到權限問題刪除不了,請以管理員身份調用 takeown 和 icacls 重設文件權限。

最後,不要忘了刪除Cygwin的註冊表。

- 文件名大小寫

Windows 的文件名通常是不區分大小寫的,而 UNIX 類的系統基本上都區分文件名的大小寫。Cygwin 能夠實現文件名大小寫的區別,其原因是由於 Windows NT 以上版本的 kernel 事實上是支持文件名大小寫區別的。能夠參看這篇文章:cygwin 下區分文件名大小寫

- 參考

-

相關文章
相關標籤/搜索