简介:这是一套适用于比特币及衍生币挖矿的知名开源工具 cgminer 3.1.1 的 Windows 版本,面向对 GPU、FPGA、ASIC 矿机调试、超频监控以及矿池接入有需求的中高级矿工与开发者。软件支持多线程与多矿池,具备 ATI GPU 监控、超频和风扇速度控制能力;资源包附带 scrypt 等多种内核的 cl 脚本、dll 运行库、配置示例及 PHP/Java/API 示例,方便二次开发或对照学习。压缩包共 43 个文件,大小仅 6.83MB,其中以 txt 说明文档、dll 依赖库、bit 位流文件、cl 内核脚本和 exe 可执行程序为主;dll 负责依赖运行,cl 对应不同算法内核,bit 可用于 FPGA 加载,txt 提供构建与配置说明,另有 conf 模板与 API 示例,目录结构紧凑,便于快速部署和研究。目前已有 555 人学习下载。对于想深入理解矿机软件架构、扩展币种支持或自行编译调试挖矿程序的读者,这份资源提供了难得的实测环境与完整文件样本,可减少配置弯路,快速上手 cgminer。 大前天整理移动硬盘,翻出十几年前下载的cgminer-3.1.1-windows源码目录,点开一看,编译脚本、依赖说明、还有当年的笔记都在。索性花了半个下午在Windows 10上把它重新编译跑通。cgminer是老牌矿工软件,3.1.1这个版本恰好卡在GPU挖矿成熟和FPGA/ASIC矿机兴起的交接点,既保留了对OpenCL显卡的完整支持,也开始通过libusb驱动部分早期FPGA设备。这篇文章就围绕cgminer 3.1.1在Windows平台上的编译、配置、运行和排错来写,对两类人最有用:想从源码层面了解矿工软件到底怎么和矿池、显卡打交道的技术爱好者;或者是手头还有老设备、需要在Windows上复现经典工具链的运维玩家。
顺便说明一下,我并不是在推荐大家现在去挖矿——这个领域早就不是当年随便一台显卡机就能参与的玩法了。我感兴趣的是这套软件本身的设计思路:它是怎么把GPU计算、网络通信、实时监控界面揉在一起,以及当我在Windows上编译一个十几年前的C项目时,会遇到哪些今天看起来已经陌生了的坑。
1. 从3.1.1说起:这个版本卡在什么历史节点上
1.1 cgminer在挖矿软件里的生态位
说起矿工软件,很多新玩家只知道后来的PhoenixMiner、lolMiner这些。而在我接触这个领域的年代,cgminer就是事实上的标准。它的作者Con Kolivas是Linux内核开发者出身,写代码非常讲究工程规范,cgminer的代码质量在同类开源项目里属于第一梯队。这个软件最初是从CPU矿工cpuminer(原minerd)演化来的,作者转向GPU平台后重写了OpenCL后端,于是有了cgminer这条线。再往后,随着FPGA和ASIC矿机出现,项目里的设备支持越来越多,最终又拆出了bfgminer分支。
所以从版本脉络看,3.1.1正好是cgminer在设备多样化之前的一个相对干净的版本。源码量适中,依赖不算多,特别适合拿来当学习样本。如果你想理解"矿机软件到底在干什么",这个版本的代码读起来不会有现代版本那么大的负担。
1.2 3.1.1版本的特殊之处
具体到3.1.1这个版本号,它在当时的定位属于修补型发布。3.1.0刚引入了scrypt算法支持,让矿工软件从只认比特币SHA-256扩展到可以挖莱特币这类基于scrypt的币种。3.1.1在3.1.0的基础上修了一批矿池连接和OpenCL相关的bug,稳定性上了一个台阶。对Windows用户来说,这个版本还有一个标志性意义:官方开始提供相对完整的Windows预编译包,下载解压就能跑,不需要人人自己折腾编译环境。
不过预编译包毕竟不等同于开箱即用。下载下来缺dll、杀毒软件误报、OpenCL驱动不匹配,这些都是当年论坛上的高频话题。所以如果你真想把它用起来,自己编译一遍反而更可控——这也是我这次重新折腾的核心目的。
2. Windows下编译cgminer 3.1.1:依赖链与工具链的完整梳理
2.1 工具链怎么选:MSYS2/MinGW是首选
编译这个老版本,第一关是选工具链。当年官方在Windows上用的就是MinGW环境,所以最稳妥的路线是MSYS2加mingw-w64工具链。为什么不用Cygwin?因为Cygwin提供的POSIX模拟层会引入额外的运行时依赖,而cgminer的官方构建历史上也没走过这条路。为什么不用Visual Studio?因为项目里的configure脚本和大量GNU风格代码在MSVC下处理起来非常麻烦,除非你愿意花大把时间改源码。
MSYS2的好处是自带包管理器,pdcurses、libusb这些依赖可以直接用pacman装,省去手工下载一堆源码再交叉编译的体力活。我这次用的环境是Windows 10加MSYS2最新版,装的时候建议把完整版装好,避免后续缺基础包。
2.2 依赖清单:每一样都是干什么的
cgminer 3.1.1要正常编译和运行,大概需要下面这么几类东西:
| 依赖 | 作用 | 说明 |
|---|---|---|
| pdcurses | 终端交互界面 | cgminer的实时监控界面依赖它,不装的话必须用--disable-pdcurses,但会丢失TUI |
| libusb | USB设备通信 | 用于驱动FPGA类设备,如果只挖GPU可以禁用,但部分功能会受影响 |
| jansson | JSON解析 | 矿池配置和API响应都靠它,没有它整个程序起不来 |
| curl | 网络通信 | 与矿池之间走HTTP和stratum协议 |
| OpenCL SDK | GPU计算 | 由显卡厂商SDK或GPU驱动提供,是Windows下最容易出问题的一环 |
这里要特别提醒一句:libusb和pdcurses在MSYS2仓库里的版本相对较新,和2013年的代码存在API兼容性风险。我实际编译时,pdcurses的新版本报过PAIR_NUMBER宏相关的冲突,后面是通过调整编译选项绕过的。这种问题在老项目上太常见了,遇到别慌,先看报错是在哪个头文件,再判断是版本问题还是代码问题。
2.3 实际编译命令与踩坑处理
在MSYS2的MinGW64终端里,按顺序执行:
pacman -Syu pacman -S --needed base-devel mingw-w64-x86_64-toolchain pacman -S --needed mingw-w64-x86_64-pdcurses mingw-w64-x86_64-libusb pacman -S --needed mingw-w64-x86_64-curl mingw-w64-x86_64-jansson然后下载cgminer 3.1.1源码,解开进入目录。先看一下configure的帮助,确认当年有哪些编译选项:
./configure --help | grep -E "opencl|scrypt|pdcurses|libusb"常见编译参数如下:
./configure --enable-opencl --enable-scrypt make -j4如果你手头没有OpenCL SDK,也不打算挖显卡,可以把--enable-opencl去掉。但这里有个矛盾点:3.1.1的代码里OpenCL和TUI界面耦合得比较紧,完全禁掉OpenCL会连实时监控信息一起砍掉。所以我的建议还是装上SDK,以完整形态编译。
我踩过的第一个坑,是链接时一直报undefined reference to clGetPlatformIDs。原因是configure脚本没能在默认路径下找到OpenCL库。解决方式很直接,在configure时显式指定路径:
./configure --enable-opencl --enable-scrypt \ CPPFLAGS="-I/c/Program Files/AMD APP SDK/2.8/include" \ LDFLAGS="-L/c/Program Files/AMD APP SDK/2.8/lib/x86_64"这里用AMD APP SDK 2.8举例,主要是因为当年的教程里它出镜率最高。换到今天,用Intel OpenCL SDK或者直接从GPU驱动目录里找OpenCL.lib来链接也可以,核心思路就是让configure找到头文件和库文件。
编译完成后,如果你用的是动态链接,还要把MSYS2的bin目录下libpdcurses.dll、libusb-1.0.dll、libcurl-4.dll、libjansson-4.dll、zlib1.dll、libwinpthread-1.dll等一堆dll拷到exe同目录,否则双击只会看到"找不到dll"的弹窗。更省事的办法是静态编译,但需要先把依赖库都编成.a,工作量会大一圈。我个人建议直接拷dll,简单直接,反正运行目录里本来就要放一堆ctail文件。
3. 让cgminer真正工作起来:矿池接入与配置参数解读
3.1 从命令行参数到配置文件
编译产物拿到手,接下来是让它真正跑起来。cgminer 3.1.1支持两种传参方式:一是在命令行里直接指定,二是写一个JSON格式的配置文件。命令行方式适合临时测试,配置文件适合生产场景。
先看一个最简命令行:
cgminer.exe --scrypt -o stratum+tcp://pool.example.com:3333 -u yourusername.worker -p yourpassword -I 13 -w 256这段命令的含义是:以scrypt算法模式启动,接入stratum协议矿池地址的3333端口,用户名填写"矿池账号.矿机编号",密码一般填x作为占位符,-I 13是显卡计算强度,-w 256是OpenCL工作组大小。强度这个数字不是越大越好,后面在排错章节我会细说。
如果使用配置文件,默认文件名是cgminer.conf,放在exe同目录。一个典型配置长这样:
{ "pools": [ { "url": "stratum+tcp://pool.example.com:3333", "user": "yourusername.worker", "pass": "x" } ], "intensity": "13", "worksize": "256", "gpu-engine": "850-900", "gpu-memclock": "1250", "api-listen": true, "api-port": "4028", "log": "5", "no-pool-disable": true }启动时用:
cgminer.exe --config cgminer.conf这里有几个配置项需要特别说明。3.1.1版本的"log": "5"表示日志级别,数字越大输出越详细。gpu-engine和gpu-memclock分别管GPU核心频率和显存频率,这个时代的cgminer是直接通过OpenCL写入显卡的,一旦设置不当很可能黑屏或死机。我建议刚开始先不设置这两个参数,让显卡跑默认频率,等确认温度、功耗都正常了再慢慢加压。
3.2 多矿池故障切换的配置思路
矿池宕机是常事,一个稳健的挖矿配置至少要准备两个以上的矿池。cgminer 3.1.1支持在pools数组里按优先级排列矿池,当一个矿池连续出现任务超时会自动切到下一个。有一点一定要记住:把"no-pool-disable": true加上。如果不加,当一个矿池在短时间内频繁失败,cgminer会把它临时禁用,如果所有矿池都被禁用,程序会进入空闲等待状态,需要人工干预。
加上这个配置之后,程序会对失败矿池做轻量降权而不是完全禁用,整体的容错性会好很多。这个思路放到今天做服务降级、熔断设计也一样成立:完全禁用是最后的手段,优先选择的是降级和重试。
3.3 Windows下的后台运行与开机自启
很多朋友以为cgminer只能开着终端窗口跑,其实Windows下可以把它转成后台任务。最省事的方法是用任务计划程序,在系统登录时以"无论用户是否登录都要运行"的方式启动一个批处理:
@echo off cd /d C:\miner cgminer.exe --config cgminer.conf --log-file C:\miner\miner.log如果你更习惯服务化的方式,也可以用nssm把cgminer注册成Windows服务。不过我的实际经验是,cgminer这种带交互界面的程序被注册成服务后,有时候会在注销或锁屏时出现OpenCL上下文异常,反而不如计划任务稳定。如果只是个人机器自己用,计划任务就是性价比最高的方案。
4. 架起来以后:稳定性、兼容性与排错实录
4.1 硬件识别失败的排查路径
老版本cgminer在Windows上最容易出的问题就是识别不到设备。如果你插了一张NVIDIA显卡,运行后界面显示0 GPU,那先怀疑两件事:一是OpenCL驱动没装好,二是编译时指定的OpenCL SDK架构和驱动的架构不一致,比如32位库配了64位驱动。
NVIDIA从某个驱动版本开始改过OpenCL的ICD注册表路径,部分老代码会扫描不到。这时候可以手动检查注册表HKEY_LOCAL_MACHINE\SOFTWARE\Khronos\OpenCL\Vendors下面是否还有对应的dll路径。没有的话,要么重装带OpenCL支持的驱动,要么手动把这个键值补上。
如果是USB连接的FPGA设备,Windows下还要解决驱动问题。3.1.1通过libusb直接访问USB设备,标准的做法是用Zadig工具把设备驱动替换成WinUSB。这一步做完,Windows设备管理器里会看到设备名称变成WinUSB设备,cgminer的--icarus等参数才能正常识别。
4.2 掉算力、卡死、温度异常的一次现场排查
我自己重新编译跑通后,遇到过算力周期性掉到几乎为零的情况。当时的排查链路大概是这样的:
- 先开API看实时状态,确认是不是所有GPU都掉算力,还是只有个别卡掉。
- 日志里看到GPU热度数据,发现有一张卡的温度明显偏高,核心温度到了90度以上。
- 进一步对比发现,这张卡的温度异常正好出现在我把intensity调到14之后。降回默认的13,算力恢复,温度也回到了80度附近。
这个案例揭示了一个通用的排查原则:算力异常先看温度,温度异常先看强度,强度没问题再看供电。很多老版本矿工软件没有现代软件的降频保护,GPU过热时不是自动降频,而是直接算错或者卡死。所以intensity一定要根据显卡的实际散热条件来调,不要照抄网上的通用配置。同一张卡,在机箱风道好的机器和闷罐机箱里的安全强度完全不一样。
4.3 日志与API:远程运维的基础
cgminer 3.1.1的API功能其实相当成熟。启用"api-listen": true之后,程序会在4028端口监听HTTP请求,你可以用浏览器或curl直接查询状态:
curl http://127.0.0.1:4028/summary curl http://127.0.0.1:4028/statssummary返回的是整体算力、运行时长、提交的份额数,stats返回更细的GPU级别数据。在批处理里定时抓一下这个接口,再配上日志轮转,基本就能当一个小型矿机监控系统用了。这个思路放到今天依然不过时:任何后台程序,只要暴露了状态接口,后续做监控告警都会省很多事。
日志方面,"log": "5"这种级别在排错时可以临时调到7到9,确认问题后再调回日常级别。日志输出到stderr,配合--log-file参数可以落盘。Windows下特别要注意日志文件占满磁盘的问题,建议定期轮转或限制大小。
5. 这轮老软件移植带来的工程方法论
5.1 老版本依赖锁定比想象中更重要
编译老项目,最重要的教训就是别轻易用最新版本的依赖。pdcurses这种维护不频繁的库还好,libusb和curl的API一直在变,3.1.1的代码对新版本的兼容性其实没有保证。我这次编译时,主要工作量其实不在cgminer本身,而是在跟各依赖库的版本打交道。
如果你想复现这个项目,建议先在configure脚本和README里确认当年推荐的依赖版本,再按那个版本去找对应的MSYS2包,或者用源码编译的方式把版本锁住。依赖锁定这个原则,放到今天的CI/CD体系里同样适用——很多线上事故的根因,就是"顺手升级了一个小版本"。
5.2 把构建产物当成能够重复交付的资产
编译完不是终点。一个能反复交付的挖矿运行目录,至少应该包括cgminer.exe、全套依赖dll、cgminer.conf示例、启动脚本、日志目录和README说明。正因为重新编译一次可能要折腾一两个小时,把成果整理成标准目录结构才显得重要。我最后整理出来的目录大概是这个样子的:
C:\miner\ ├─ cgminer.exe ├─ *.dll ├─ cgminer.conf ├─ start.bat ├─ log\ └─ README.md这样无论换机器还是换系统,拷贝整个目录就能在新的Windows环境里跑起来,完全不依赖当初的编译现场。以后你编译任何开源工具,都可以沿用这个思路:产物目录比源码目录更有长期价值。
5.3 从3.1.1看矿机协议与软件的演化逻辑
最后说一点个人体会。cgminer 3.1.1虽然老,但它内部做的事——算法执行、矿池通信、设备管理、状态监控——依然是今天所有矿机软件的基本框架。变化的只是算法从OpenCL扩展到了更多加速方式,矿池协议从getwork进化到了stratum,再到带扩展参数的stratum 2。理解了这套框架之后,再看任何新一代矿机工具都不会觉得陌生。
折腾老软件这件事,最迷人的地方也正在这里:代码像琥珀一样封存了那个时代的硬件形态、网络协议和工程师的解决问题方式。读懂了它,你就读懂了这十几年矿机软件演化的半部历史。
本文还有配套的精品资源,点击获取