Cygwin的安装、配置与调整

原创
2014/03/08 17:27
阅读数 3W

Cygwin是一个在windows平台上运行的unix模拟环境。它对于学习unix/linux操作环境、在Windows上使用GNU工具集进行应用程序开发或移植、系统管理等,都非常有用。

关于Cygwin的安装配置等,其实比较简单,网上也有不少讲解,此处仅以个人使用习惯作一次记录,未必适合所有人。我的大体目标如下:

- 保持Cygwin原汁原味,尽量不改动Cygwin,也尽量不加入自己的东西;

- 尽量做到绿色化,尽量不对现有Windows系统作修改;

- 便携化,可以将Cygwin复制到其它机器上或是新的系统中,并仍能正常运行;

- 方便维护和升级。

1. 安装

上面提到便携化,Cygwin本身其实也可以勉强算是“绿色便携”的,但有一些问题,比如将Cygwin复制到新系统会有文件和目录的权限问题,用户名及SID的映射也要重新设置,还有它运行时会生成一些运行时文件,等等。

有一些现有的项目或工具可以帮助我们实现便携化,比如,可以到 http://portableapps.com 搜索 Cygwin 并下载,或者,参考 https://github.com/CybeSystems/CygwinPortable 或 https://github.com/ntmoe/CygwinPortable,当然还有其它一些类似的开源项目,它们大都是提供了一些脚本、工具和安装指南,以引导你安装Cygwin。

不过,我打算以自己的方式从头构建 Cygwin。

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不会自动生成菜单和快捷方式。如果不考虑便携,那么应该将这几个参数去掉,而且可以略过2、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 下区分文件名大小写

- 参考

-

展开阅读全文
打赏
11
72 收藏
分享
加载中
我的唯一的问题是linux软件不熟 不知那些是需要的 希望指点迷津
2014/03/20 19:34
回复
举报
这是个好东西
2014/03/12 11:31
回复
举报
高大上,win下有这些工具还是很顺手的
2014/03/09 17:27
回复
举报
更多评论
打赏
3 评论
72 收藏
11
分享
返回顶部
顶部