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 | #none /cygdrive cygdrive binary,posix=0,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 |