cygwin=构建最小系统

上一级页面:index-windows

Cygwin是什么

Cygwin是一个可原生运行于Windows系统上的POSIX兼容环境

本文将带你一步一步搭建Cygwin最小系统环境。

主流os内核通常是C语言写成,系统函数库通常以一个或多个链接库文件的形式提供,

其中最重要的是C标准库,其他的链接库往往调用C标准库而实现,当然也可能直接调用系统内核函数,甚至混合。不同系统平台有多种主流的C标准库(libc)共存:

  • BSD libc,由BSD系统发布;
  • GNU C Library (glibc),由GNU项目发布,可在Linux、多种UNIX系统上运行;
  • Microsoft C run-time library(MSVCRT.DLL),由微软随Windows发布,给Visual C++编辑器链接使用的;
  • Newlib,由Cygnus Solution公司开发,Cygwin环境中的libc.a正是此版本,目前广泛用在嵌入式系统中;
  • dietlibcμClibc等,功能经过适度裁剪的C标准库,主要用在嵌入式系统。

Cygwin的组成

Cygwin就是在Windows中增加了一个中间层——兼容POSIX的模拟层,并在此基础上构建了大量Linux-like的软件工具。

再来解释本文开头的回答,如下图,POSXI兼容环境包括以下两部分:

  • cygwin1.dll,作为实现POSIX系统调用的模拟层,可原生运行在Windows中;
  • 在cygwin1.dll之上构建的大量函数库、应用程序,如libc、zlib、bash、gcc、vim、awk、sed、git等等,与UNIX/Linux几乎等同*。

*注:Cygwin的libc是Newlib,Linux的libc是GNU libc,UNIX有的是BSD libc。

软件包和包管理器

UNIX/Linux系统上,二进制程序文件、函数库、文档、源代码等通常是按照软件包(Package)的形式组织,一个软件包是一个或多个应用程序、函数库、帮助手册页、文档组成的压缩档。

Cygwin继承了先辈UNIX/Linux系统的优良传统,也采用这种方式。

Cygwin由核心的Cygwin DLL(被包装在cygwin包中)和基于Cygwin DLL移植GNU、BSD等开源项目的海量软件包组成。

2000年4月,Cygwin项目宣布了新的发布方式:额外提供一个不依赖于Cygwin的Windows原生程序——setup.exe,与Cygwin DLL独立,用于安装、更新、卸载软件包。

setup.exe从功能角度讲,setup有点“名不符实”,或许叫包管理器(“Package Manager”)更恰当。

Cygwin发展到支持64位,包管理器、软件包也自然分成32位和64位两套。

32位的包管理器程序为setup-x86.exe,64位的为setup-x86_64.exe,x86和x86_64分别是32位和64位指令集代称。以下未明确32/64位硬件平台时,setup泛指其中一个

为特别区别于Windows程序安装卸载习惯,在此再强调,setup不是一次性的安装卸载程序,而是可用于安装、更新、卸载软件包的包管理器,负责软件包在本地从生到死!后期对软件包的所有管理操作都可以通过setup完成。

Step 0:事前准备工作

进入Cygwin官网找到“Installing Cygwin”,下方文字介绍中有setup-x86.exe和setup-x86_64.exe链接,按自己需求选择其中一个下载即可,建议选择64位版本。

为使文件不显得杂乱,在d盘新建一个文件夹Cygwin64,把setup-x86_64.exe也放入其中,

当然你也可以把文件放在任何其他的地方,路径最好不含空格,不含中文。为方便描述,以下称“d:\Cygwin64”为CYG_ROOT$CYG_ROOT表示对字符串“d:\Cygwin64”的引用。

Step 1:选择安装方式

双击运行setup,可以看到setup自身的版本是“2.895(64 bit)”。

点击“下一步”,如图显示3种安装方式:

①“Install from Internet”是指从Internet下载并安装,下载的安装包同时也保留在硬盘中并不删除;

②“Download Without Installing”意思是仅下载,供后期再安装;

③“Install Local Directory”是指从本地安装,如果前期选择了②,现在选择③即可。

把②和③两步合并,效果就是①;此处由于是从零开始,选择①。

Step 2:路径设置

点击“下一步”之后进入Step2,选择安装顶层路径——Root Directory。setup可以探测到自己所处的路径,即$CYG_ROOT,一般不用再更改;默认勾选为所有用户安装(Install for All Users)。

点击下一步,选择本地软件包存放路径,同样可按照默认设置为$CYG_ROOT。

Step 3:选择网络连接方式

点击“下一步”之后进入Step3,网络连接类型按默认选择,即直接连接(Direct Connection)即可。

Step 4:添加/选择下载站点

点击“下一步”之后进入Step4,选择下载站点,除了Cygwin官方网站,还有很多站点提供了软件仓库(repository)的镜像,分布于世界各地,

setup内部记录了很多已有的站点,用户还可以自行添加,下面的Add按钮就是用来添加新站点的。仅列出国内几个比较常用、速度较快、连接较稳定的Cygwin镜像站点:

将镜像站点URL地址填入编辑框,点击“Add”按钮,镜像站名称即出现在选择列表中,下一次再来直接选择就行,

注意到列表显示内容移除了URL路径,只保留了协议和主机名。此时发现,setup建立了$CYG_ROOT\var\log路径,用于记录本次安装过程相关日志。

点击“下一步”,setup开始下载站点的setup.ini文件,这个文件最终保存在$CYG_ROOT\https%3a%2f%2fmirrors.aliyun.com%2fcygwin%2f\x86_64路径下,其中https%3a%2f%2fmirrors.aliyun.com%2fcygwin%2f是按照站点主机名建立的路径。

每个站点上同时有x86(32位)和x86_64(64位)两套软件仓库,所以在站点名后面有继续建立x86_64文件夹。setup.ini记录着软件包功能描述、版本、依赖等信息,可看做是一个软件包索引数据库。

Step 5:筛选软件包及操作

点击“下一步”之后进入Step5,筛选软件包及操作。Cygwin软件包被按照用分类组织,点击“View”旁边下来框,选择“Category”,

看到有Accessibility、Admin、Base、Devel、Doc等多个类别,一个软件包可以属于一个或多个类别。点击类别前的“+”,可展开查看下面的各个软件包。

为构建最小系统,这里选中Base(基本)类别

软件包信息分成了几栏展示:

  • Package栏是软件包名称;
  • Current栏是软件包版本;
  • New栏表示要执行的动作,包括Install(安装)、Reinstall(重新安装和升级)、Uninstall(卸载)、Skip(忽略)、Keep(保持不变)、特定版本号,动作可以针对整个类别,也可以针对单个软件包进行;对于未安装的软件包,setup默认动作是Skip,对于已安装过的软件包,默认动作是keep;老版本的setup将Current、New两栏合并在一起,通过单击双箭头图标切换要执行的动作
  • Bin栏表示二进制文件、Src栏表示源代码,老版本的setup界面上Bin和Src栏中间“x”表示选中、空表示不选、“n/a”表示没有(not available),新版本setup不用管这两栏;
  • Categories栏描述软件包所属功能类别;
  • Size栏是软件包文件大小;
  • Description是对软件包的简要描述。

为构建最小系统,这里选中Base(基本)类别

执行动作选择Install,看到Base类别中包含了alternatives、base-cygwin、base-files、bash、coreutils、cygwin、mintty、util-linux等等最36个软件包。

点击“下一步”,setup开始针对软件包进行依赖解析(这些信息就存储在setup.ini文件中),并把软件包依赖的所有软件包也全部添加进来,可以看到“依赖”中有大量以“lib”开头的库文件。

Step 6:执行安装

点击“下一步”之后进入Step6,执行安装。setup开始下载软件包,并在左上角显示整体进度百分比。

可以看到$CYG_ROOT \ https%3a%2f%2fmirrors.aliyun.com%2fcygwin%2f\x86_64\release\目录下多了很多子目录,子目录按照软件包独立组织,里面就存放着软件包的压缩文件。

setup自动进行下载、安装,安装完成后自动跳转至最后一步,选择是否创建快捷方式和添加到开始菜单,可以都勾选上,最小系统的整个安装过程就此结束。

安装结束后,可以看到在$CYG_ROOT目录下,增加了bin、dev、etc、home、lib、tmp、usr子目录,软件包主要安装到bin、lib、usr中,配置文件安装到dev、etc中,home存放用户个人文件。

让系统跑起来

安装完成后,桌面上多了一个名为“Cygwin Terminal”的快捷方式,双击运行,看到一个黑色框框里面输出一些已创建文件的信息,并打印提示符,等待用户键入命令。

这个黑框框便是终端模拟器——mintty,mintty启动了shell与用户交互。输入“help”并回车看看得到什么,再输入“ls /”并回车看看得到什么,如果没有报错说明最小系统已经能跑起来。

第一次使用时,home目录下创建了一个以Windows登陆用户命名的文件夹,被称为用户个人目录($HOME),个人文件都默认放在这里,Cygwin的shell启动后默认进入的工作路径也是这里。

牛刀初试–安装apt-cyg

利用setup安装完最小系统后,setup在桌面上建立了一个名为“Cygwin Terminal”的快捷方式。

双击运行,弹出一个黑框框,初次运行还会自动帮用户做一些配置工作,如建立用户目录等。最后,打印一个形式如“xxx@yyy ~ $”的提示符,紧跟着是闪烁的光标,等待用户输入。如果直接按回车,黑框框里就换行继续打印出同样的提示符,同样跟着是闪烁的光标,继续等待用户输入。

接下来安装命令行软件包管理器apt-cyg命令行软件包管理器apt-cyg

首先安装lynx,打开setup.exe

Pasted image 20220521172334

在下拉列表选择最新版

Pasted image 20220521172425

之后安装apt-cyg

1
2
lynx -source rawgit.com/transcode-open/apt-cyg/master/apt-cyg > apt-cyg
install apt-cyg /bin

第1行是使用lynx命令将apt-cyg脚本从网站下载保存至当前目录的apt-cyg文件,

第2行是使用install命令将apt-cyg文件安装至/bin目录下,

可选:给apt-cyg创建一个别名apt

创建一个软链接

1
ln -s /usr/bin/apt-cyg /usr/bin/apt

安装常用软件包

注意到cygwin是一个仿linux的系统,在cygwin中保存的文件换行符都是LF格式的,同时需要兼容兼容POSIX,这意味着许多在Windows下可用的包需要在cygwin中重新安装,例如vim、git等

安装依赖,注意需要使用cygwin专版的git

1
apt-cyg install wget curl git

安装cyg-vim,

1
apt-cyg install vim

以防万一,等待安装结束,再安装一次wget

1
apt-cyg install wget

创建passwd文件

由于Cgywin提高了安全性能,没有导入window用户的信息,而是默认以Administrator的普通用户来登陆的,

如果你有需要,可以手动导入windows的用户信息来自己创建passwd文件:

执行如下命令创建passwd文件

1
mkpasswd -l > /etc/passwd

后记

从整个安装过程也看出,setup本质是一个软件包的管理工具,亦即“包管理器”,用户通过图形界面可以方便地进行安装、卸载、重装、升级等工作。setup也支持在命令行中运行。

最小系统跑起来以后,后期还想安装其他的软件包,重复Step 1至6的过程,中间注意选择要安装的软件包即可。

最小系统经过压缩,其大小不过约几十MB。Cygwin技术交流群(374791536)共享文件中同时提供64位和32位最小系统,解压即可用。

UNIX/Linux/Cygwin上的逻辑、操作习惯与Windows有着巨大差异,在Cygwin中要培养以shell命令行为中心的操作习惯,暂时抛开Windows下的惯性思维。

参考、引用、致谢

Cygwin系列(一):Cygwin是什么 - 知乎 (zhihu.com)

Cygwin系列(四):一步一步搭建Cygwin最小系统 - 知乎 (zhihu.com)

Cygwin系列(五):Shell命令行初体验 - 知乎 (zhihu.com)

Cygwin系列(八):命令行软件包管理器apt-cyg - 知乎 (zhihu.com)

cygwin安装完成后获取root权限没有passwd文件之解决方法 (360doc.com)