简介:cgminer 3.1.1 Windows 版是一款面向比特币及衍生币种挖矿的多线程、多矿池 GPU、FPGA 与 ASIC 挖矿软件,支持 ATI 显卡状态监控、频率调节和风扇转速控制,适合需要搭建、复现或调试旧版挖矿环境的中高级用户参考。压缩包共 43 个文件,整体约 6.83MB,包含 12 个 txt 说明文档、8 个 dll 运行库、5 个 bit 与 5 个 cl 内核文件,另有 2 个 exe 主程序、2 个 php 接口示例,以及 Java、C、conf 配置和 FPGA 相关文件,覆盖程序启动、算法内核、接口调用与依赖库等主要组成部分。已有 560 人学习下载。读者可据此了解 Windows 下 cgminer 的目录组织、OpenCL 内核示例、API 调用样例与配置模板,进而梳理多线程挖矿调度、GPU 与 FPGA 设备支持及显卡驱动、运行库等依赖关系,也可对照说明文档定位依赖缺失、参数配置异常等常见问题,作为旧版挖矿工具的代码阅读和排错参考,但需留意该版本不适合同时连接多条区块链使用。
1. 从一台老工控机说起:cgminer 3.1.1 windows 到底难在哪
前阵子有人搬来一台还跑着 Windows 7 的老工控机,让我把 cgminer 3.1.1 windows 这套环境重新装回去。压缩包解开就能跑,听起来比装数据库省事,真上手才发现是个连环套:显卡驱动、OpenCL 运行时、USB 设备驱动,三样缺一样程序就出问题:要么窗口一闪而过,要么设备数显示 0,要么连上了矿池却一直拿不到任务。这套东西适合手里有老机器、老显卡,或者要在内网里固定跑一台算力节点的人。照着官方 README 一步步来反而容易失败,因为那份文档默认你的运行时环境是完整的,而现实里十有八九不是。
2. 环境准备:cgminer 3.1.1 在 Windows 上要先备齐四样
装 cgminer 之前,我一般会把机器当成一台“干净的 Windows”来处理:先确认系统版本和位数,再逐个确认运行时组件。顺序不能乱,因为每一步的检查结果都依赖上一步。比如你没装完整显卡驱动,就查不到 OpenCL 平台;查不到 OpenCL 平台,cgminer 启动后设备列表就是空的,而它给的报错信息往往含糊,你会误以为是配置文件写错了,白白在参数上折腾半天。
这套准备流程大概二十分钟,比起装完再回头逐个排查要省得多。
2.1 版本取舍:3.1.1、3.7.2 和 4.x 的差别具体在哪
cgminer 的版本线里有一个明显分界:3.x 和 4.x 面向的硬件不是一类。
3.x 这一支保留了 OpenCL 挖矿路径,也就是能用显卡算。这条线上大家最常提到的两个点是 3.1.1 和 3.7.2——前者是早期版本,参数集相对精简,配置项少、启动快,在老机器和老驱动上更兼容;后者是 3.x 的收尾版本,参数更全,支持面更宽。3.1.1 时期主要面向 SHA-256d 这类算法,后来才并入的算法分支它并不认,所以在选它之前先想清楚你手上的设备跑的是什么算法。
4.x 之后,OpenCL 挖矿路径被彻底移除,只保留 ASIC/FPGA 设备支持。这意味着如果你拿一份 4.x 的配置模板套到 3.1.1 上,会看到一堆Unrecognised option或者JSON decode failed,因为字段名和结构都变了。
我一般按这个思路选:
| 场景 | 建议版本 | 理由 |
|---|---|---|
| 老显卡、老驱动、Win7 环境 | 3.1.1 | 参数少,兼容性好,出问题容易定位 |
| 需要更多参数微调、稳定性优先 | 3.7.2 | 3.x 收尾版本,参数全 |
| 纯 USB ASIC 设备、无显卡 | 4.x | 移除了 OpenCL 路径,启动更干净 |
选 3.1.1 的代价要提前知道:它不认识后来新增的设备型号,也不支持后来才并入的算法,配置项里没有的那些字段写了也没用,写了反而会让程序在解析配置时直接退出。
2.2 显卡驱动与 OpenCL 运行时:算力的地基
如果你要用显卡跑,OpenCL 运行时是最容易漏的一环。它通常由显卡厂商的完整驱动包一起安装,而不是单独一个组件。很多人图省事装了精简版驱动或者系统自动推送的驱动,设备管理器里看着显卡正常,但 OpenCL ICD 是缺的,cgminer 启动后直接告诉你找不到平台。
验证办法很简单,装个clinfo跑一下:
clinfo正常输出里会列出Platform Name、Device Name、Device Version这几行。如果只打印一句 “Number of platforms: 0”,那就是运行时没装到位,跟 cgminer 一点关系都没有,别再去改配置文件了。这一步我遇到过好几次,都是同一个原因:机器重装过系统,驱动是 Windows 自动匹配的通用版本。
装完驱动后建议重启一次。OpenCL 的 ICD 注册表项在驱动安装过程中写入,不重启有时候不生效,这就是那种说不清原因的“玄学”问题。
2.3 USB 设备驱动:WinUSB 替换这一步别省
用 USB 接口的矿机时,Windows 默认会把设备识别成一个未知设备或者厂商自定义设备,cgminer 里就会显示No devices found (or driver not installed)。原因是 cgminer 走的是 libusb/WinUSB 通道,需要给这个设备绑定通用驱动。
常见做法是用一个通用的驱动替换工具(Zadig 一类),步骤是:
- 插上设备,打开设备管理器,确认那个带感叹号的未知设备。
- 打开驱动替换工具,菜单里勾选 “List All Devices”。
- 在下拉列表里选中目标设备,仔细核对 VID/PID,别选错。
- 右侧驱动目标选 WinUSB,点替换,等进度条走完。
- 拔插一次设备,重新打开 cgminer 看设备列表。
注意:这一步只对目标设备操作,不要把键盘、鼠标、USB 网卡当成目标。选错设备会让外设直接失效,得进安全模式恢复,属于典型的给自己添麻烦。
2.4 系统位数与运行库:32 位和 64 位不要随便假设
Windows 包通常分 32 位和 64 位两种构建,选错了不一定立刻报错,但会出现奇怪的崩溃。判断办法是看系统属性里的“系统类型”,或者命令行:
wmic os get osarchitecture输出64-bit就用 64 位构建,32-bit就用 32 位构建。别用“我的 CPU 是 64 位”来判断,32 位系统跑不了 64 位程序,这个错犯一次能排查一小时。
运行库方面,Windows 构建一般会把 pthread、libcurl、libusb 这些依赖 DLL 一起打进去,所以解压即用;如果启动时报“找不到 xxx.dll”,说明包不完整或者被杀毒软件删了文件,重新解压一次并加排除目录,比装一堆运行库更快。
3. 安装落地:把 cgminer-3.1.1-windows 解压到能跑起来
准备工作做完,安装本身其实只有三步:放到合适的路径、写好启动脚本、跑第一次。但每一步都有细节,尤其是路径和启动方式,出问题最多的就是这两处。
3.1 目录规划:路径、权限和杀毒排除
解压路径不要有中文、不要有空格。cgminer 对路径的处理比较糙,遇到空格或者非 ASCII 字符时,读取配置文件可能失败,表现得像是配置写错了。我一般用:
D:\cg\或者C:\miners\cg311\这种全英文短路径。放在桌面或者“下载”文件夹里不是不行,但路径长、含空格、还容易被清理工具扫到。
解压后先做两件事:
第一,把整个目录加进杀毒软件和系统防护的排除列表。这类程序被误报是常事,文件被静默删掉之后你只会看到“程序无法启动”,查半天查不出原因。
第二,确认目录不在 OneDrive 或者其他同步盘里。同步盘会锁定文件,程序读写日志的时候可能报权限错误。
3.2 启动脚本:把参数固化成 bat
直接双击cgminer.exe是最容易失败的方式——它读不到参数就直接退出,窗口一闪而过,你连报错都看不见。正确做法是写一个 bat:
@echo off cd /d D:\cg cgminer.exe --config cgminer.conf pausecd /d把工作目录切到程序所在目录,因为 cgminer 默认按相对路径找配置文件和日志文件,工作目录不对就找不到;pause让窗口停住,报错信息才能留在屏幕上。这两行加起来是我踩过最多次的坑换来的。
如果你不想用配置文件,也可以把参数全写进 bat:
@echo off cd /d D:\cg cgminer.exe -o stratum+tcp://pool.example.com:3333 -u worker1 -p x ^ --api-listen --api-port 4028 --api-allow W:127.0.0.1 ^ -I 13 -w 128 --temp-target 72 --auto-fan pause注意^是 cmd 的续行符,后面不能有空格,否则会把空格也当成参数的一部分传进去。
3.3 首次运行的预期输出
第一次跑,正常的话屏幕上会依次出现这些内容(时间戳会变):
[时间] Started cgminer 3.1.1 [时间] Probing for an alive pool [时间] Pool 0 difficulty changed to 1 [时间] Network diff set to ... [时间] Init GPU thread 0 GPU 0 ...如果卡在Probing for an alive pool不动,那是网络或者矿池地址的问题,不是本地环境问题;如果根本没走到这一行就退出,那才是本地环境或参数问题。这两类问题排查方向完全不同,先看清楚卡在哪一行,能省掉一半时间。
设备识别成功之后,界面会进入 TUI,显示每个设备的算力和温度。第一次运行不用追求算力多高,先确认设备被识别、能拿到任务、状态不是Dead,这三件事成立再谈优化。
4. 配置详解:cgminer.conf 与命令行参数怎么配
配置是整个安装里最容易被过度复杂化的一环。网上流传的配置文件动辄上百行,抄过来一堆不认识的字段,反而让程序启动失败。我一般从一个最小可用配置开始,跑通了再逐个加参数。
4.1 最小可用 cgminer.conf
{ "pools": [ { "url": "stratum+tcp://pool.example.com:3333", "user": "worker1", "pass": "x" }, { "url": "stratum+tcp://backup.example.com:3333", "user": "worker1", "pass": "x" } ], "api-listen": true, "api-port": "4028", "api-allow": "W:127.0.0.1", "intensity": "13", "worksize": "128", "gpu-threads": "2", "kernel": "poclbm", "temp-target": "72", "temp-overheat": "80", "temp-cutoff": "85", "auto-fan": true, "scan-time": "60", "expiry": "120", "queue": "1", "log": "5" }逐项说明一下:pools是数组,第一个为主池,后面的是备用池,主池掉线会自动切;url必须带协议前缀stratum+tcp://,写成http://或者干脆不带前缀都会连不上;user一般是“账号.矿工名”或者矿池分配的 worker 名,具体格式看矿池说明,写错会一直提示Pool 0 not providing work;pass很多矿池随便填,但不能留空。
api-listen和api-port是本地查询接口,不开的话出问题只能靠肉眼看屏幕,相当于自己断了黑匣子。api-allow里的W:前缀表示允许写操作,只查询的话可以只写127.0.0.1。
kernel在 3.1.1 里常见取值是poclbm(默认)和diakgcn,换了内核等于换了算法实现,算力差异可能有百分之十几,值得两个都试一下。intensity控制单线程的并行度,调太高会掉算力甚至驱动重置,13 是个稳的起点。
temp-cutoff到温就停,temp-overheat降频,temp-target配合auto-fan做风扇自动调节,这三个值建议按设备实际情况设,别照搬。
4.2 命令行参数与配置文件的优先级
同时存在命令行参数和配置文件时,命令行优先。这条规则很重要,因为调试的时候经常出现“我明明改了配置怎么没生效”,结果是 bat 里还留着旧参数。
常用参数对照:
| 参数 | 作用 | 典型值 |
|---|---|---|
-o | 矿池地址 | stratum+tcp://pool.example.com:3333 |
-u/-p | 用户名 / 密码 | worker1/x |
--config | 指定配置文件路径 | cgminer.conf |
-d | 只启用指定编号的设备 | -d 0 |
-I | 强度 | 9到20 |
-w | worksize | 128/256 |
--api-listen | 开启 API | 无值 |
--api-port | API 端口 | 4028 |
--api-allow | 允许访问的地址 | W:127.0.0.1 |
-T | 文本界面,不进入 TUI | 无值 |
--log | 日志级别 | 5 |
--verbose | 输出详细日志 | 无值 |
另外,cgminer 在 TUI 里按S会把当前运行参数写回cgminer.conf,退出时也会保存一次。这意味着你手动改的配置可能被运行时的状态覆盖。调试阶段我一般用--config指向一个单独的文件,跑通之后再合并。
4.3 API 端口:不开等于丢掉了排查信息
API 基于 JSON-RPC,开了之后本地能直接查状态,长时间运行的时候不用一直盯着屏幕。Windows 上没有nc,用 PowerShell 发一条就行:
$client = New-Object System.Net.Sockets.TcpClient("127.0.0.1", 4028) $stream = $client.GetStream() $writer = New-Object System.IO.StreamWriter($stream) $writer.WriteLine('{"command":"summary"}') $writer.Flush() $reader = New-Object System.IO.StreamReader($stream) $reader.ReadLine() $client.Close()返回的是一个 JSON,里面有MHS av(平均算力)、Accepted、Rejected、Hardware Errors这几个关键字段。把这些字段记下来,比看屏幕上的瞬时值可靠得多——瞬时值波动大,容易误判。
端口只监听本机就行,api-allow写W:127.0.0.1,不要图方便开成任意地址,那等于把控制接口暴露出去。
5. 避坑与排查:cgminer 3.1.1 装完最常见的五个失败点
下面这几条是我在不同机器上反复遇到的,按“现象 → 原因 → 解决”记下来,遇到时对照着查比重新读文档快。
5.1 双击 exe 窗口一闪而过
现象:双击cgminer.exe,黑窗口出现又消失,什么信息都没留下。
原因:没有传任何参数,程序读不到矿池配置,打印完版本信息就退出了;另一种可能是缺 DLL,加载阶段直接失败。
解决:改用 bat 启动并加pause,先看清报错。如果是缺 DLL,把包的目录结构截图对着看,重新完整解压一次;如果是参数问题,按 3.2 的写法补上--config或者-o/-u/-p。
5.2 提示 No OpenCL platforms found
现象:启动后一行No OpenCL platforms found,设备列表为空。
原因:显卡驱动不完整,OpenCL ICD 缺失。系统自动装的通用驱动、或者只装了显示驱动没装计算组件,都会这样。
解决:先跑clinfo确认平台数为 0,然后卸掉现有驱动,从显卡厂商渠道装完整驱动包,重启,再跑一次clinfo。这一步做完设备列表通常就有了。
5.3 USB 设备识别不出来
现象:设备插上后 cgminer 提示No devices found (or driver not installed),设备管理器里带感叹号。
原因:Windows 把这个设备当成了厂商自定义设备,没有绑定 WinUSB 驱动。
解决:用驱动替换工具给目标设备换成 WinUSB,操作前核对 VID/PID,只动目标设备。替换完成后拔插一次,再启动程序。如果还是不行,换个 USB 口试试,有些前置面板的供电不足会导致枚举失败。
5.4 连上矿池但一直拿不到任务
现象:日志停在Probing for an alive pool或者反复出现Pool 0 not providing work。
原因:地址协议前缀写错(写成http://或者不带前缀)、端口不对、worker 名格式不符合矿池要求。
解决:逐个核对url、user的格式,先把备用池去掉只留一个主池,排除切换干扰;再看矿池侧的 worker 是否存在、是否绑定了正确的账号。这一步用错配置模板的居多,从别处抄来的配置文件里地址常常是占位的。
5.5 运行几分钟后程序消失
现象:跑了三五分钟,窗口直接关掉,没有任何报错。
原因:多半是被杀毒软件或系统防护静默拦截并删除了可执行文件;也可能是温度保护触发但没写日志。
解决:把整个目录加入排除列表,并在配置文件里把log打开、确认日志文件确实在写入。日志文件是我判断“到底是它自己退出还是被杀掉”的唯一依据,没有日志的时候只能靠猜。
6. 验证跑通:三个动作确认这台机器真的在出算力
装完不等于跑通,跑通不等于稳定。最后一章说说怎么验证,这套流程我现在每次装完都会走一遍,能省掉后面好几轮返工。
6.1 TUI 里该看哪几个数
进入 TUI 之后,别盯着瞬时算力看,那个数字跳得厉害。看三处:5 秒平均和平均算力是否在同一个量级;A:(Accepted)是否在持续增长;HW:(硬件错误)是不是一直停在 0。硬件错误持续增长说明强度或频率设得太高,先降下来,别硬扛。
温度也要看,temp-target设 72 而实际长期贴着 80 以上,说明散热不行,把强度或者频率压一档。
6.2 API 与日志交叉验证
用 4.3 的 PowerShell 命令查summary,把MHS av、Accepted、Rejected三个值记下来,间隔十分钟再查一次,对比差值。Accepted 增长、Rejected 比例低于百分之二,基本就算健康。
同时打开日志文件,确认里面没有反复出现重连、认证失败、Stratum from pool 0 detected new block之外的异常条目。日志和 API 两个来源对得上,才说明程序内部状态是一致的。
| 检查项 | 正常表现 | 异常时先查 |
|---|---|---|
| 设备列表 | 数量与物理设备一致 | 驱动、USB 绑定 |
| Accepted | 持续增长 | 矿池地址、worker 格式 |
| Rejected 比例 | 低于 2% | 网络延迟、expiry设置 |
| Hardware Errors | 长期为 0 | 强度、频率、散热 |
| 温度 | 稳定在 target 附近 | 风扇、风道、auto-fan |
6.3 一次至少跑满三十分钟
最后一步最容易被跳过:让它连续跑三十分钟以上。很多问题在前三分钟看不出来——驱动重置、温度爬升到阈值、内存泄漏导致的算力缓慢下降,都要时间才暴露。三十分钟里算力曲线平稳、没有断连、温度不持续上升,才算这台机器装好了。
从那以后我每次装完 cgminer,都会先让它挂满半小时、把 API 数据存档,再去做别的优化。这套习惯救过我好几次,尤其是那种“装完当天正常、第二天早上发现停了”的情况,日志里往往能看到第一次异常发生的时间点。希望帮到你。
本文还有配套的精品资源,点击获取