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 下区分文件名大小写

- 参考

-

相关文章
相关标签/搜索