Cygwin使用笔记

最近为了在Windows上用rsync,又折腾了下多年没更新的Cygwin。

Cygwin / MinGW / MSYS

在知乎上有一篇讨论,把这几个软件的来龙去脉讲的很清晰。结合我自己的使用经验复述一遍。

Cygwin

Cygwin官网介绍:

Cygwin is:

  • a large collection of GNU and Open Source tools which provide functionality similar to a Linux distribution on Windows.
  • a DLL (cygwin1.dll) which provides substantial POSIX API functionality.

Cygwin is not:

  • a way to run native Linux apps on Windows. You must rebuild your application from source if you want it to run on Windows.
  • a way to magically make native Windows apps aware of UNIX® functionality like signals, ptys, etc. Again, you need to build your apps from source if you want to take advantage of Cygwin functionality.

Cygwin旨在Windows上提供一个类UNIX环境,并提供了大量开源工具。不过这些工具依赖Cygwin环境,不能直接在Windows环境下运行(非原生Windows应用)。

MinGW / MinGW-w64

如果需要编译Windows原生应用,就需要MinGW / MinGW-w64了。MinGW早期的项目,只支持32位。而MinGW-w64是它的升级项目,支持32/64位。以后提到MinGW基本是指MinGW-w64。

MinGW是用于进行Windows应用开发的GNU工具链(开发环境)。MinGW可运行于很多地方,Windows上,Cygwin中,甚至是Linux中。在Linux上用MinGW可以不用调整开发环境,直接在Linux系统中编译出Windows应用。许多开源工具都是通过这种方式编译发行的Windows二进制文件的,例如x264,ffmpeg等。

为了方便在Windows系统中使用MinGW,开发者以一个旧的Cygwin为基础fork出了MSYS。MSYS仅仅是为了给MinGW提供一个趁手的环境来替换掉不靠谱的cmd,所以MSYS中的工具要比Cygwin少得多,体积也小得多。

MSYS2

由于MinGW/MSYS开发不活跃,于是就有了MSYS2。MSYS2是fork了较新版本的Cygwin,并增加了许多自己的特色。其中亮点之一就是引入了ArchLinux的软件包管理器pacman。虽然MSYS2的开发者在他们的文档How does MSYS2 differ from Cygwin中声称,MSYS2与Cygwin的目标明显不同,但在实际应用方面两者是绝对功能重复的。MSYS2提供了3种软件仓库

  • msys2: 有MSYS2依赖的应用(类似于Cygwin中的应用)
  • mingw64: MinGW-w64 x86_64工具链编译出的Windows 64位原生应用
  • mingw32: MinGW-w64 i686工具链编译出的Windows 32位原生应用

MSYS2实际上不仅提供了适合编译Windows原生应用的环境(msys2应用),还提供了大量以编译好的Windows原生应用(mingw64/mingw32应用)。

选择Cygwin放弃MSYS2

早期我是用MSYS2的,因为它用了pacman,而我有长期使用ArchLinux的经验,这个转换时无痛的。但是随着使用时间的增长,我发现这货的应用仓库实在是太有限了,而又不像ArchLinux那样提供一个AUR。向他们的仓库提pr大多数都是不明使用途径或使用频率不高而驳回了。编译一个稍微复杂一点的应用,又需要从很多依赖编译起。感觉这货的理念很矛盾,如果说是提供一个Windows原生应用编译环境,那么维护好一个msys2应用仓库就足够了。如果说是要提供类Cygwin的使用环境,那么为何又不愿意扩充它的应用仓库?总之,感觉它是浪费了pacman这么优秀的包管理器功能。

而我个人的使用目的主要是为了应用,所以选Cygwin要方便很多。

Cygwin的安装

Cygwin的安装器也是它的包管理器,下完了不要删,留着以后还要用。Cygwin的安装还是比较简单的,安装时要选镜像,国内可选163镜像。

使用过程中可能遇到的小问题

HOME目录问题

由于我的git是单独安装的,会给系统加个HOME环境变量。我的HOME环境变量设置为D:\ENIGMAZ。启动Cygwin时,默认使用这个HOME路径。但是Cygwin中有些应用不认这路径,例如ssh。为了方便统一管理我的ssh密匙,我希望它也继承这个HOME路径。解决方案是,在/etc/nsswitch.conf文件中设置

1
db_home:  /cygdrive/d/ENIGMAZ

另外在运行前用which命令检查一下ssh是不是Cygwin提供的。一开始我没在Cygwin中安装openssh,导致一直使用的ssh是Windows提供的,一直把配置文件定位在Windows用户目录下,让我郁闷了好久。

文件权限问题

我在试用ssh实际过程中又遇到密匙文件权限不对的问题,通过ls -al检查,发现文件权限系统一片混乱。
调查后知道Cygwin通过/etc/fstab挂载Windows文件系统,默认的权限可能不够用,换成下面的

1
2
#none /cygdrive cygdrive binary,posix=0,user 0 0
none /cygdrive cygdrive binary,posix=0,noacl,user 0 0

这与git-bash的默认设置一致,这样Cygwin能与git-bash和谐共用HOME目录了。

rsync试用

由于rsync是依赖于ssh的,所以前面ssh一定要调好。

1
rsync -avP enigmaz@my.server.xyz:/mnt/foo.bar.gz /cygdrive/d/downloads