документация · fearminer 1.15.2
Начни майнить с FearMiner
Настрой первый риг, а за дополнительными возможностями обращайся к справочнику.
опции · Найди ошибку · HiveOS · mmpOS
На этой странице Настрой первый риг
Начни здесь
Управляй ригами
Выбирай и настраивай майнинг
Автоматизируй
Разбирайся и устраняй неполадки
Полный справочник
Разверни справочник для поиска в браузере или печати.
Начни здесь
Настрой первый риг #
Подключи компьютер и начни майнинг из кокпита по этим шагам.
Риг это компьютер для майнинга. Лист майнинга хранит монету, адрес кошелька и настройки пула.
Проверь компьютер и подготовь данные
Проверь поддержку своей ОС и выбранного алгоритма. Подготовь публичный адрес кошелька и данные подключения к пулу. Никогда не вводи фразу восстановления кошелька.
Что получится: У тебя есть подходящее оборудование, публичный адрес, хост и порт пула.
Что мы собираем и что для этого нужноСоздай кокпит
Открой веб-приложение и сохрани 12 слов восстановления. Они восстанавливают кокпит, а не криптовалютный кошелёк.
Что получится: Кокпит открыт, слова восстановления сохранены.
Начни с кокпитаУстанови майнер и подключи риг
Выбери Добавить риг, укажи ОС рига и выполни полученную команду на нём.
В «Добавить риг» выбери ОС рига: Linux, Windows или macOS на Apple silicon. Для HiveOS и mmpOS используй отдельные инструкции.
Что получится: FearMiner установлен и привязан к твоему кокпиту.
Настройка HiveOS и mmpOSПроверь, что риг появился
Найди риг в кокпите. Подключённый риг может ждать настроек майнинга.
Что получится: Риг подключён, даже если ещё не майнит.
Добавить ригПримени лист майнинга
Выбери монету, добавь адрес кошелька и пул, затем примени лист к ригу.
Что получится: Риг получает и проверяет настройки майнинга.
Листы майнингаУбедись, что майнинг начался
Проверь активность майнинга и принятые шары. Принятая шара ещё не выплата: расписание выплат задаёт пул.
Что получится: Отображается хэшрейт, пул принимает твою работу.
Куда идут деньгиНаучись ставить на паузу и возвращаться
Ставь на паузу и продолжай из кокпита. Храни слова восстановления там, где найдёшь их при входе с другого устройства.
Что получится: Ты можешь приостановить майнинг и вернуться к тем же ригам.
Подключение и удалённый канал
Начни с командной строки #
Проверь поддержку оборудования, подготовь публичный адрес кошелька, хост и порт пула.
Что нужно сначала: адрес кошелька #
YOUR_WALLET это публичный адрес для получения из кошелька или аккаунта на бирже. Никогда не приватный ключ, не seed-фраза и не пароль.
Сеть читается по адресу, поэтому кошелёк определяет алгоритм; пул выбираешь ты (Подключись к своему пулу). Вид каждого адреса в Алгоритмы, комиссии и требования, проверки в Приватность, загрузки и локальные файлы.
Скачай и проверь архив для ОС рига, распакуй его и открой терминал в этой папке. Ниже есть инструкции ручной загрузки для всех трёх платформ. Хочешь скачать сам?
Пример для Quantus. Замени POOL:PORT и YOUR_WALLET данными пула и публичным адресом получения. rig1 это имя воркера. В Windows используй .\fearminer.exe, в Linux и macOS ./fearminer.
./fearminer -a quantus -o stratum+ssl://POOL:PORT -u YOUR_WALLET -w rig1
first share accepted after 12.3 s hashrate 588.5 MH/s
Пример вывода. Хэшрейт и принятая шара подтверждают, что майнинг начался и пул принял твою работу.
Ctrl+C корректно останавливает запуск в терминале. Для установленного сервиса используй fearminer service stop: закрытие терминала не останавливает сервис.
fearminer service stop
Установка и ручная загрузка #
Подробности и поведение
Одна строка устанавливает FearMiner, проверяет его ключом релиза и держит запущенным как службу. Он майнит то, что задаёт кокпит, или на твой кошелёк на выбранном тобой пуле. Ручной способ, скачать, проверить, запустить, сразу ниже.
Эти общие команды устанавливают FearMiner. Для подключения к кокпиту используй команду из «Добавить риг». Без кошелька или листа майнинга майнер ждёт настройки.
Одна строка
Одна строка #
В кокпите «Добавить риг» даёт точную строку, уже с твоим кодом. На HiveOS майнер запускает flight sheet: нужно добавить одну опцию.
Открыть кокпит ↗$ curl -fsSL https://get.fearminer.com | sh| с кодом твоего кокпита | curl -fsSL https://get.fearminer.com | sh -s -- fm1_... |
|---|---|
| без кокпита: твой кошелёк на твоём пуле | curl -fsSL https://get.fearminer.com | sh -s -- --wallet YOUR_WALLET --pool stratum+ssl://POOL:PORT --worker rig1 |
| служба всей машины (sudo) | curl -fsSL https://get.fearminer.com | sh -s -- --system |
| только бинарник, без службы | curl -fsSL https://get.fearminer.com | sh -s -- --no-service |
PS> irm https://get.fearminer.com/win | iex| с кодом твоего кокпита | $env:FEARMINER_ENROLL='fm1_...'; irm https://get.fearminer.com/win | iex |
|---|---|
| без кокпита: твой кошелёк на твоём пуле | $env:FEARMINER_WALLET='YOUR_WALLET'; $env:FEARMINER_POOL='stratum+ssl://POOL:PORT'; $env:FEARMINER_WORKER='rig1'; irm https://get.fearminer.com/win | iex |
$ curl -fsSL https://get.fearminer.com | sh| с кодом твоего кокпита | curl -fsSL https://get.fearminer.com | sh -s -- fm1_... |
|---|---|
| без кокпита: твой кошелёк на твоём пуле | curl -fsSL https://get.fearminer.com | sh -s -- --wallet YOUR_WALLET --pool stratum+ssl://POOL:PORT --worker rig1 |
| служба всей машины (sudo) | curl -fsSL https://get.fearminer.com | sh -s -- --system |
| только бинарник, без службы | curl -fsSL https://get.fearminer.com | sh -s -- --no-service |
Extra config arguments: --enroll fm1_...Остальной flight sheet как в Настрой FearMiner в HiveOS. Кокпит затем следит за ригом, ставит на паузу, продолжает или перезапускает его; что майнить, по-прежнему решает flight sheet.
| проверяет | SHA256SUMS ключом релиза (minisign или OpenSSL 3), затем архив по SHA256SUMS; без этих инструментов download.fearminer.com и GitHub должны совпасть. На Windows должны совпасть два хоста, а fearminer verify затем проверяет подпись. До этого ничего не запускается |
|---|---|
| устанавливает | службу твоей учётной записи, без пароля: стартует вместе с машиной (на Windows при входе в систему) и перезапускается после сбоя; --system для службы всей машины, через sudo |
| майнит | по листу майнинга из твоего кокпита или на --wallet с --pool; без того и другого следит за картами и ждёт |
| затем | fearminer service status, fearminer service logs (Служба) |
Хочешь скачать сам?
Хочешь скачать сам? #
Одни и те же файлы на обоих хостах:
| download.fearminer.com | fearminer-linux-x86_64.tar.gz, fearminer-windows-x86_64.zip, fearminer-macos-arm64.tar.gz, SHA256SUMS, SHA256SUMS.minisig |
|---|---|
| GitHub ↗ | то же самое и все прежние версии |
Затем проверь, распакуй и запусти вручную:
Предупреждение при первом запуске
Проверьте скачанное инструментом, который не наш: команда выше сверяет архив с SHA256SUMS. minisign -Vm SHA256SUMS -P <ключ релиза> проверяет подпись тем же способом. Когда бинарнику уже можно доверять, fearminer verify SHA256SUMS делает и то и другое офлайн (Приватность, загрузки и локальные файлы).
$ curl -LO https://github.com/fearminer/fearminer/releases/latest/download/fearminer-linux-x86_64.tar.gz $ curl -LO https://github.com/fearminer/fearminer/releases/latest/download/SHA256SUMS $ grep ' fearminer-linux-x86_64.tar.gz$' SHA256SUMS | sha256sum -c - $ tar xzf fearminer-linux-x86_64.tar.gz && cd fearminer-*-linux-x86_64 $ ./fearminer -o stratum+ssl://POOL:PORT -u YOUR_WALLET -w rig1
Linux
Проверь загрузку перед первым запуском по инструкции для своей ОС. Проверить загрузку
На Linux и в HiveOS ничего подобного не происходит: ни SmartScreen, ни Gatekeeper, ни флага карантина. Распаковать, выполнить fearminer verify, майнить.
PS> Invoke-WebRequest https://github.com/fearminer/fearminer/releases/latest/download/fearminer-windows-x86_64.zip -OutFile fearminer-windows-x86_64.zip PS> Invoke-WebRequest https://github.com/fearminer/fearminer/releases/latest/download/SHA256SUMS -OutFile SHA256SUMS PS> (Get-FileHash .\fearminer-windows-x86_64.zip -Algorithm SHA256).Hash.ToLower() PS> Select-String windows-x86_64 SHA256SUMS PS> Expand-Archive fearminer-windows-x86_64.zip -DestinationPath . ; cd fearminer-*-windows-x86_64 PS> .\fearminer.exe -o stratum+ssl://POOL:PORT -u YOUR_WALLET -w rig1
Windows
Проверь загрузку перед первым запуском по инструкции для своей ОС. Проверить загрузку
«Система Windows защитила ваш компьютер» от Microsoft Defender SmartScreen, ниже неизвестный издатель. Кнопка запуска спрятана за маленькой ссылкой: Подробнее, затем Выполнить в любом случае. SmartScreen спрашивает один раз про каждый файл, то есть новый релиз спросит снова.
Microsoft Defender может ещё и отправить майнер в карантин как потенциально нежелательную программу, обычно под именем HackTool или CoinMiner: так майнер выглядит для любого сканера, кем бы он ни был написан. Чтобы оставить его: Безопасность Windows, Защита от вирусов и угроз, Управление настройками, Исключения, Добавление или удаление исключений, Добавить исключение, Папка, и указать папку, в которую распакован архив. В PowerShell с правами администратора то же самое: Add-MpPreference -ExclusionPath C:\Users\you\fearminer-windows-x86_64. Исключай одну эту папку, а не целый диск, и только после того, как проверка выше прошла.
$ curl -LO https://github.com/fearminer/fearminer/releases/latest/download/fearminer-macos-arm64.tar.gz $ curl -LO https://github.com/fearminer/fearminer/releases/latest/download/SHA256SUMS $ grep ' fearminer-macos-arm64.tar.gz$' SHA256SUMS | shasum -a 256 -c - $ tar xzf fearminer-macos-arm64.tar.gz && cd fearminer-*-macos-arm64 $ xattr -dr com.apple.quarantine . $ ./fearminer -o stratum+ssl://POOL:PORT -u YOUR_WALLET -w rig1
macOS
Проверь загрузку перед первым запуском по инструкции для своей ОС. Проверить загрузку
«fearminer cannot be opened because the developer cannot be verified» от Gatekeeper. Всё, что скачано браузером, получает флаг com.apple.quarantine, а бинарник, который не подписан и не нотаризован, при первом запуске не вызывает вопрос, а запрещается.
Два выхода, оба один раз на релиз. Системные настройки, Конфиденциальность и безопасность, прокрутить до раздела Безопасность, где назван заблокированный бинарник, Всё равно открыть, затем Открыть в следующем окне. Или снять флаг в терминале, находясь в распакованной папке, что лаунчеры start_<algo>.sh делают за тебя: xattr -dr com.apple.quarantine .
Flight sheet: майнер custom URL установки: ассет fearminer_custom-<version>.tar.gz последнего релиза, https://github.com/fearminer/fearminer/releases/download/v1.15.2/fearminer_custom-1.15.2.tar.gz Алгоритм: qpow · Шаблон кошелька: %WAL%.%WORKER_NAME% URL пула: stratum+ssl://POOL:PORT · Пароль: x Extra config arguments: любая опция, например -d 0,2 --tls-fingerprint SHA256
Пул выбираешь ты: хост и порт указаны на странице самого пула. FearMiner никогда не выбирает пул за тебя, а кошелёк без пула отклоняется (E224).
Flight sheet: custom miner. Полный лист и имя каждого алгоритма в HiveOS в Настрой FearMiner в HiveOS.
Windows и macOS останавливают неподписанный бинарник при первом запуске; антивирус может отнести любой майнер к HackTool. Что они говорят и куда нажимать, ниже. Приватность, загрузки и локальные файлы: как проверить, что скачанное наше.
Работает, когда видишь это
Работает, когда видишь это #
job 9dd830e6 diff 18.25G ✔ 1/1 · GPU0 · 18.25G · 24 ms hashrate 618.4 MH/s (10m 611.9, session 609.8, eff 598.2 / 97.8 %) job 4b1c77a2 diff 40.0K ✔ 1/1 · CPU · 40.0K · 31 ms hashrate 7.1 kH/s (10m -, session -, eff -)
Задача, принятая шара, хэшрейт: майнинг идёт. Первый блок это риг с GPU, второй с CPU.
eff и средние показывают -, пока в окне не принято десять шар. Читай терминальную панель и журналы разбирает весь стартовый блок построчно.
Остановка: q в терминальной панели или Ctrl+C. Любой из двух останавливает чисто, код выхода 0.
Куда идут деньги
Куда идут деньги #
Принятая шара это не выплата. Пул засчитывает её и платит позже.
| какой пул | тот, что ты указал в -o; строка pool при старте называет его |
|---|---|
| твой баланс | на панели самого пула, под тем адресом, который ты дал |
| когда платят | по порогу выплаты и расписанию этого пула, за вычетом его собственной комиссии |
Порог выплаты, расписание и комиссия пула принадлежат пулу, а не FearMiner. Собственная комиссия FearMiner отдельная и показана в заголовке терминальной панели (Алгоритмы, комиссии и требования).
Управляй ригами
веб-кокпит
Управляй ригами из кокпита #
Проверяй риги и отправляй команды с телефона или ПК. Кокпит бесплатный и использует сквозное шифрование.
Подробности и поведение
Кокпит на app.fearminer.com бесплатный, без аккаунта и со сквозным шифрованием: ретранслятор между ним и ригами передаёт запечатанные сообщения, которые не может прочитать. Он показывает хэшрейт фермы и его историю, задаёт, что майнит каждый риг, ставит риг на паузу, продолжает или перезапускает его.
Добавить риг
Добавить риг #
| 1 | Открой app.fearminer.com, «Создать мой кокпит», запиши 12 слов. Это и есть твоя ферма: ни аккаунта, ни пароля, и единственный способ вернуться на другом устройстве. |
|---|---|
| 2 | «Добавить риг» даёт одну строку с твоим кодом (fm1_...). Запусти её на риге (Настрой первый риг). |
| 3 | Риг появляется за секунды. Назначь ему лист майнинга, и он майнит. |
FearMiner уже установлен: fearminer enroll fm1_... на риге, без перезапуска. Команда печатает имя рига (XXXX-XXXX-XXXX-XXXX) и имя фермы; кокпит показывает те же имена: сравни их.
$ fearminer enroll fm1_... $ fearminer remote status
Листы майнинга
Листы майнинга #
| что | что майнит риг: алгоритм, кошелёк и его пулы (хотя бы один, на твой выбор); flight sheet кокпита |
|---|---|
| проверка | риг проверяет лист как при старте: кошелёк по сети, пулы, опции. Плохой лист отклоняется с причиной; майнинг продолжается как был |
| применение | тот же алгоритм перезагружается без остановки; другой алгоритм или риг, который только наблюдал, перезапускает майнер, но никогда не службу |
| хранение | переживает перезагрузки и перезапуски, поверх собственной конфигурации рига (remote-sheet.json в каталоге состояния); предыдущий лист хранится для отката одним действием |
| TensorCash | лист с пулом wss:// требует на риге FearMiner 1.7.1 или новее; более старый риг кокпит пропускает и говорит почему. Токена пула в листе нет: он остаётся на риге, запущенном с -p token-file=<путь> |
| листа ещё нет | риг, установленный без кошелька, следит за картами и ждёт лист |
Обновление из кокпита доступно подходящим Linux-сервисам. HiveOS управляет обновлениями сам, mmpOS нужен URL нового выпуска. В Windows и macOS запусти установщик снова.
Ожидание перед сменой кошелька #
По умолчанию новый кошелёк применяется сразу. Задай --remote-wallet-delay на риге, чтобы он ждал; отмени ожидающую смену из кокпита или командой fearminer remote cancel на риге.
Подробности и поведение
| когда | лист с другим кошельком, чем тот, на который идёт майнинг |
|---|---|
| ожидание | --remote-wallet-delay минут, по умолчанию 0 (применяется сразу); при ожидании всё это время риг майнит на прежний кошелёк |
| оповещение | с обоими адресами, в оповещения (Настрой оповещения) и в журнал рига |
| отмена | из любого кокпита или fearminer remote cancel на риге |
С ожиданием тот, кто пробрался в твой кокпит, не перенаправит твой хэш незаметно: у тебя есть это время, чтобы увидеть это и остановить.
HiveOS · mmpOS #
В HiveOS майнинг задаёт полётный лист, в mmpOS профиль. Кокпит показывает состояние, ставит на паузу, продолжает и перезапускает риги. mmpOS в бете и ещё не проверен на реальном риге.
Подробности интеграции и дополнительные аргументы
| подключение | --enroll fm1_... в Extra config arguments flight sheet (Настрой FearMiner в HiveOS) или в Arguments профиля майнера mmpOS (Настрой FearMiner в mmpOS, бета) |
|---|---|
| кокпит | показывает риг, ставит на паузу, продолжает и перезапускает его |
| что майнить | решает flight sheet; риг отклоняет лист майнинга и объясняет почему. Так же на mmpOS |
| служба | не нужна и отклоняется (E802): майнер запускает HiveOS или mmpOS |
Подключение и удалённый канал
Подключение и удалённый канал #
| команда | что делает |
|---|---|
fearminer enroll CODE | Подключиться к ферме по коду. Та же ферма повторно ничего не меняет; другая ферма отклоняется до --leave. |
fearminer enroll --status | К какой ферме принадлежит риг, его имя, канал. |
fearminer enroll --leave | Сразу выйти из фермы: её команды с этого момента отклоняются. Майнинг продолжается. |
fearminer remote status | Риг, его ферма, канал, связь, лист и ожидающий лист, последние десять команд. --json. |
fearminer remote off · on | off отклоняет любую удалённую команду на этой машине, кто бы её ни подписал, до on. Майнинг продолжается. |
fearminer remote cancel | Отменить лист, ждущий истечения уведомления: кошелёк остаётся прежним. |
Служба #
Запуск, ставший постоянным: те же опции, что и у запуска, после service install. Одна строка из Настрой первый риг делает это за тебя. Ничего не устанавливается, пока не пройдёт проверка, которую делает старт.
| Linux | юнит systemd твоей учётной записи, стартует при загрузке (lingering включён) |
|---|---|
| macOS | LaunchAgent твоей учётной записи |
| Windows | задание при входе в систему, майнер в своём окне |
| контейнер | Linux без systemd (Vast.ai, RunPod, Docker): фоновый процесс твоей учётной записи, там от root с --allow-root. Добавь ~/.local/bin/fearminer service start в стартовый скрипт машины (Vast.ai: On-start script шаблона), чтобы он запускался снова после перезапуска |
--system | служба всей машины, через sudo, на Linux и macOS; на Linux под отдельной учётной записью fearminer |
| перезапуск | после сбоя; не после остановки, которую ты запросил, и не после выхода с кодом 2, 4 или 12 |
| HiveOS, mmpOS | отклоняется, ничего не записывается (E802): майнер запускает flight sheet |
$ fearminer service install -o stratum+ssl://POOL:PORT -u YOUR_WALLET -w rig1 $ fearminer service status $ fearminer service logs
| команда | что делает |
|---|---|
fearminer service install [OPTIONS] | Проверить опции как при старте, скопировать бинарник в постоянное место, записать настройки, затем объявить, включить и запустить службу. Повторно: заменяет настройки; без опций: обновляет бинарник. |
fearminer service status | Установлена или нет, mining, monitoring или stopped, с какого момента, pid, учётная запись, бинарник, настройки, где журнал, хэшрейт. --json. |
fearminer service logs | Последние 50 строк, затем следит дальше (Ctrl+C). --no-follow останавливается на этом. |
fearminer service stop · start · restart | Остановить чисто, карты возвращены в исходное состояние; служба снова стартует с машиной. start и restart делают то, что написано. |
fearminer service uninstall | Остановить и удалить службу, установленный ею бинарник и service.json. Настройки, история и ключи остаются, каждый назван. |
| бинарник | ~/.local/bin/fearminer · ~/Library/Application Support/fearminer/bin/ · %LOCALAPPDATA%\Programs\FearMiner\; /usr/local/bin/fearminer с --system |
|---|---|
| настройки | service.toml в каталоге конфигурации, читается только твоей учётной записью; сохранённое изменение применяется в течение секунды |
| журнал | journal на Linux, собственный ротируемый файл журнала майнера на macOS и Windows; fearminer service logs показывает его везде |
Коды с E801 по E808 относятся к службе, с E809 по E812 к удалённому каналу, с E813 по E819 к обновлениям, E820 к отклонённому бенчмарку (Разберись в ошибке). Майнер, запущенный вручную при работающей службе, останавливается на блокировке (E210) и называет службу.
что меняют на деле
Меняй основные настройки #
Задай кошелёк, пул, алгоритм, GPU и число потоков CPU. Остальное сначала оставь по умолчанию.
Подробности и поведение
У всего остального есть рабочее значение по умолчанию.
| кошелёк | -u WALLET.rig1 | Адрес выплат, при желании с .worker. Без -a он определяет сеть; всегда задаётся вместе с пулом (-o). |
|---|---|---|
| пул | -o stratum+ssl://host:port | stratum+ssl:// это порт TLS, stratum+tcp:// или голый host:port простой. Повтори -o для резервного пула, он работает, пока первый лежит. TensorCash берёт пул wss://host/v1/ws, сессию с которым держит его движок. |
| алгоритм | -a quantus | quantus (GPU и CPU), randomx (CPU), pearl (NVIDIA sm_86, sm_89, sm_120), tensorcash (NVIDIA, 11.1 GB свободно). Без него читается по кошельку. |
| карты | -d 0,2 | Индексы, PCI id или UUID через запятую; !1 исключает карту 1. --list-devices печатает их. По умолчанию все дискретные карты; --igpu добавляет встроенные. |
| потоки CPU | -t 8 | Число, процент (50%) или +N. По одному на физическое ядро на randomx; рядом с GPU на quantus выключены до -t. |
$ ./fearminer -o stratum+ssl://pool.example.com:3335 -u YOUR_WALLET.rig1 $ ./fearminer -o stratum+ssl://pool.example.com:3335 -o stratum+tcp://backup.example.com:3333 -u YOUR_WALLET.rig1 $ ./fearminer -a randomx -o stratum+ssl://pool.example.com:3335 -u YOUR_WALLET.rig1 -t 50% $ ./fearminer -a pearl -o stratum+ssl://POOL:PORT -u YOUR_WALLET -w rig1 $ ./fearminer -a tensorcash -o wss://POOL/v1/ws -u YOUR_WALLET.rig1 -p token-file=TOKEN_FILE $ ./fearminer -o pool.example.com:3333 -u YOUR_WALLET -w rig1 -d 0,2
-u это кошелёк с необязательным .worker, -o пул, -a алгоритм, -d карты, -t потоки CPU.
fearminer -o stratum+ssl://POOL:PORT -u WALLET
Без командной строки #
Открой start_quantus.sh (или start_randomx, start_pearl; .bat на Windows) в текстовом редакторе, впиши кошелёк в WALLET, пул в POOL и имя в WORKER, запусти. Он отказывается работать с заглушками и перезапускает майнер после остановки, которую можно повторить (Разберись в ошибке).
HiveOS
Настрой FearMiner в HiveOS #
Добавь пакет custom miner в полётный лист. HiveOS задаёт майнинг, кокпит следит за ригом и управляет им.
Подробности и поведение
Ассет fearminer_custom-<version>.tar.gz релиза это custom miner для HiveOS: бинарник и четыре скрипта h-*.sh в папке fearminer_custom. HiveOS показывает его как fearminer_custom. Статистика идёт с собственного /hive-stats майнера, как есть.
| Flight sheet | значение |
|---|---|
| Miner | custom |
| Installation URL | https://github.com/fearminer/fearminer/releases/download/v1.15.2/fearminer_custom-1.15.2.tar.gz |
| Hash algorithm | qpow (Quantus) · randomx (Monero, CPU) · pearlhash (Pearl, NVIDIA sm_86, sm_89, sm_120) · tensorcash (TensorCash, NVIDIA) |
| Wallet and worker template | %WAL%.%WORKER_NAME% |
| Pool URL | stratum+ssl://host:port · host:port |
| Pass | x |
| Extra config arguments | Дополнительные аргументыЛюбая опция: --enroll fm1_... (кокпит, Управляй ригами из кокпита), --tls, -d 0,2, -t 0, --tls-fingerprint <sha256>, --no-supervisor, --notify-telegram ... |
Скрипты пакета
Пакет собирает командную строку из этих полей:
-a | из алгоритма (quantus, если пусто) |
|---|---|
-o | из URL пула |
-u | из шаблона |
-p | из пароля (x, если пусто) |
--api-bind 127.0.0.1:4300 | чтобы h-stats.sh читал статистику |
| дополнительные аргументы | последними |
FEARMINER_NO_TUI=1 | поскольку терминала нет |
h-run.sh передаёт --allow-root, поскольку HiveOS запускает каждый майнер от root, а бинарник иначе отказывается стартовать от root.
В flight sheet ничего добавлять не нужно.
Подробности интеграции и дополнительные аргументы
Сбой или зависшая карта перезапускают процесс майнинга после задержки.
/hive-stats возвращается на том же порту, сбои по картам и перезапуски на нём есть.
Watchdog HiveOS покрывает случай, когда супервизор сдаётся (код выхода 12).
--no-supervisor в дополнительных аргументах запускает один процесс и оставляет все перезапуски HiveOS.
Контракт статистики:
khs | итог рига в kH/s, собственный total_khs объекта |
|---|---|
hs | по записи на карту в kH/s, или по строке CPU на алгоритме CPU (randomx) с нулевыми fan и bus |
bus_numbers | сопоставляет их картам |
ar | [accepted, rejected, invalid, "invalid per row"]: два вердикта пула, затем решения GPU, отвергнутые перепроверкой CPU до отправки, суммой, затем по цифре на строку hs, 0 на строке CPU |
Разгон остаётся за flight sheet: без опции разгона майнер не трогает ни одного регистра частоты, лимита мощности или вентилятора.
--no-oc в дополнительных аргументах делает это явным.
HiveOS запускает майнер от root, так что опции разгона работают там без помощника.
mmpOS · бета
Настрой FearMiner в mmpOS #
Добавь FearMiner в профиль custom miner. Интеграция в бете и ещё не проверена на реальном риге mmpOS.
Подробности и поведение
Бета, начиная с 1.5.3: сделано по опубликованному руководству mmpOS для custom miner и сверено с ним, на настоящем риге с mmpOS ещё не запускалось. Сообщай, что не работает, в Telegram-канале или в issue. Ассет fearminer_mmpos-<version>.tar.gz релиза это custom miner для mmpOS; в панели mmpOS:
| панель mmpOS | значение |
|---|---|
| Wallets | адрес монеты, которую ты майнишь |
| Pools | твой пул для этой монеты, галочка SSL для SSL-порта, имя пользователя, которое предлагает mmpOS (%wallet_address%.%rig_name%%miner_id%), и пароль x |
| Miner profiles, Basics | монета (PRL для Pearl, QTC для Quantus, XMR для Monero, TSC для TensorCash), платформа Linux / mmpOS, майнер Custom miner и пул из строки выше |
| Custom miner download url | https://github.com/fearminer/fearminer/releases/download/v1.15.2/fearminer_mmpos-1.15.2.tar.gz, или тот же файл по адресу https://download.fearminer.com/v<version>/ |
| Advanced: Api port | 4444 или любой свободный порт |
| Advanced: Arguments | Используй строку аргументов ниже.Дополнительные аргументыстрока, которую mmpOS подставляет для custom miner (ниже), затем любая опция: --enroll fm1_..., чтобы подключиться к кокпиту (Управляй ригами из кокпита), -d 0,2 для части карт, -t 0, чтобы не занимать потоки CPU на Quantus |
./mmp-launch.sh --coin %coin% %pool_protocol% --pool %pool_server%:%pool_port% --user %user% --password %password% --api-port %api_port%
Сохрани профиль и выбери его на риге. Для SSL-пула оставь %pool_protocol% в строке или добавь после неё --tls.
mmpOS скачивает URL один раз и хранит полученное, поэтому новая версия это новый URL: чтобы обновиться, укажи в профиле URL нового релиза.
Майнер пишет в собственный журнал mmpOS, его статистика попадает в mmpOS через /mmpos, а кокпит показывает риг как управляемый mmpOS: что майнить, решает профиль.
Выбирай и настраивай майнинг
алгоритмы
Алгоритмы, комиссии и требования #
Найди алгоритм для своего оборудования, проверь предел комиссии и скопируй команду запуска.
Подробности и поведение
Тот же список печатает fearminer --list-algorithms, по строке на алгоритм с однострочным описанием; с --json один массив из {name, coin, class, fee_bps, aliases, unit, hive, requirements, refused}.
Список это подписанный индекс движков: новый алгоритм становится новой строкой здесь при следующей сборке страницы и новым движком на ригах без нового релиза майнера (Движки, ниже).
| алгоритм | монета | Оборудование | комиссия | псевдонимы | HiveOS | единица |
|---|---|---|---|---|---|---|
commonfoundry | CMFD | NVIDIA CUDA; без движка CPU; 8192 MiB оперативной памяти; 7200 MiB свободной памяти GPU | 3 % | cmfd, common-foundry, productionv4 | commonfoundry | FW/s |
pearl | PRL | NVIDIA CUDA, только sm_86, sm_89, sm_120; без движка CPU; 4514 MiB свободной памяти GPU | 2 % | pearlhash, prl | pearlhash | MAC/s |
quantus | QTC | NVIDIA CUDA, Vulkan (другие GPU); CPU | 2 % | qpow, qtc, quan, qpow-poseidon2 | qpow | H/s |
randomx | XMR | только CPU; 2080 MiB оперативной памяти | 0.85 % | rx, rx/0, monero, xmr | randomx | H/s |
tensorcash | TSC | NVIDIA CUDA; без движка CPU; 16384 MiB оперативной памяти; 11319 MiB свободной памяти GPU | 2 % | tsc, poi, proof-of-inference | tensorcash | PoI/s |
Комиссии указаны как верхний предел. Pearl не берёт комиссию, пока подписанные условия не зададут её адрес. Примеры скорости измерены на указанном оборудовании и не гарантируют результат.
Раунды комиссии и журнал
Ставка в таблице задана на алгоритм, добывается минутными раундами на отдельном соединении, никогда на твоей сессии, и показана в шапке терминальной панели.
Это потолок из подписанного индекса движков, никогда выше 5 %: подписанные условия с cfg.fearminer.com могут её снизить, но не поднять. Алгоритм, для которого условия не называют пул комиссии, майнится бесплатно, сказано один раз при старте.
fee window даёт, когда наступит первый раунд; каждый раунд пишет fee round started (1 min) и fee round ended с числом шар.
Совместимые новые алгоритмы и обновления движков загружаются и проверяются автоматически.
Загрузка, обновление и откат движков
Загрузка, обновление и откат движков #
Майнер сам ничего не хэширует: каждый алгоритм это отдельный движок, fearminer-engine-<algo>, подписанная программа, которую майнер скачивает, запускает и обновляет. Сессия пула, комиссия, супервизор, датчики, API и терминальная панель остаются в майнере.
| откуда | download.fearminer.com/algos/, перечислены в index.json: каждый алгоритм с именами, монетой, единицей, потолком комиссии, требованиями и версиями, каждая сборка со своим SHA-256 |
|---|---|
| проверка | индекс по ключу алгоритмов, встроенному в майнер (E321, если подпись не сходится), каждый движок по SHA-256 из индекса (E323), перед каждым запуском |
| сборки | Linux x86_64 (CPU; CUDA 12.9 для драйверов 575 и новее; CUDA 12.4 для драйвера 550 в HiveOS 0.6), Windows x86_64 (CPU, CUDA), macOS arm64. Сначала сборка CUDA под линейку драйвера, сборка CPU последней |
| кэш | <каталог состояния>/engines/: индекс и две последние версии каждого алгоритма |
| без сети | индекс не скачать (E322): берётся закэшированный, иначе запас, который архив релиза несёт в engines/ рядом с бинарником, так что первый запуск, в том числе с USB-образа HiveOS, может использовать локальные движки; для майнинга всё равно нужно соединение с пулом |
| обновления | каждый час: более новый движок скачивается, проверяется, запускается рядом с работающим, проходит самотест и получает текущую задачу; старый останавливается между двумя задачами (E326) |
| откат | новый движок, который не прошёл самотест или майнит на 5 % медленнее за десять минут, откатывается и не пробуется до следующего индекса (E327) |
| закрепление | --engine quantus=<VERSION>, можно повторять, или FEARMINER_ENGINE, или ключ engine файла конфигурации: работает эта версия, и никакое обновление её не сдвигает |
| нет движка | нигде нет индекса или нет сборки для этой машины (E324), или алгоритм семейства входа, которое этот майнер не знает (E325): майнер ничего не майнит и следит за картами |
| требования | машина ниже требований алгоритма получает об этом сообщение (E329) |
| сбой | упавший движок перезапускается после паузы, текущие задачи передаются ему снова (E320) |
| комиссия | потолок комиссии берётся из индекса, никогда выше 5 %; комиссия на другом алгоритме держит его движок в памяти на паузе или запускает его на каждый раунд, если памяти мало (E328) |
| API | engines[] в /api/v1/summary: каждый работающий движок, его алгоритм, роль, версия, сборка и происхождение |
Новый алгоритм знакомого майнеру семейства входа майнится без нового релиза майнера.
Кошелёк каждой сети
Кошелёк каждой сети #
Сеть читается по кошельку, поэтому одного адреса хватает, чтобы выбрать алгоритм. Контрольная сумма каждого проверяется при старте; --ignore-wallet-check отправляет то, что ты набрал.
| QTC | SS58-адрес сети Quantus, префикс 189. Суффикс +diff или префикс solo: уходит пулу как набран |
|---|---|
| XMR | 95 символов с 4 (обычный) или 8 (субадрес), 106 с 4 (интегрированный). Адрес testnet или stagenet отклоняется по имени |
| PRL | prl1..., bech32m, контрольная сумма проверяется. Адреса тестовых сетей tprl1... и rprl1... отклоняются |
| TSC | tc1q..., адрес segwit (bech32), или адрес base58check этой сети, контрольная сумма проверяется |
Что мы собираем и что для этого нужно #
Три сборки, ничего другого не публикуется.
| Linux | x86_64, собран под glibc 2.35 (Ubuntu 22.04), то есть glibc 2.35 или новее. Сборки под ARM нет |
|---|---|
| Windows | x86_64, кросс-сборка через mingw-w64. 32-битной сборки нет |
| macOS | только Apple silicon, собрано с macOS 15.5 SDK. Сборки под Intel нет |
GPU, для Quantus: карта NVIDIA с compute capability 7.0 или новее и 256 MB свободной памяти, на драйвере серии 550 или новее (570 для RTX 50). Карта ниже любого из порогов исключается из запуска со своим кодом (E310 по памяти, E308 по драйверу).
Другие GPU работают на Vulkan на долю скорости. RandomX не требует GPU вовсе. Pearl работает только на картах NVIDIA sm_86, sm_89 и sm_120 (серии RTX 30, 40 и 50) с 4,7 GB свободной памяти. TensorCash работает только на картах NVIDIA с 11.1 GB свободной памяти, движка CPU у него нет.
Vulkan и Metal не дают датчиков: на них нет ни температуры, ни вентилятора, ни мощности, и тепловая отсечка не может сработать. Она охватывает карты NVIDIA через NVML и больше ничего (Выбирай устройства и управляй ими).
Настройка производительности CPU
Движок CPU: потоки и их размещение #
Одни и те же правила под каждым алгоритмом.
| по умолчанию | по одному потоку на физическое ядро, закреплены по одному на ядро, распределены по узлам NUMA |
|---|---|
-t | число 8, процент от этого выбора 50%, сдвиг -2 или +2, либо значение для каждого алгоритма randomx:16 |
--cpu-affinity | вместо этого закрепляет рабочие потоки за маской или списком CPU |
--cpu-priority 0..5 | их приоритет по шкале XMRig |
| потолок | -t больше того, что машина может выделить (все потоки кроме двух и по одному на карту), понижается до него со строкой об этом |
| гибридные Intel | энергоэффективные ядра считаются, каждое примерно вдвое медленнее производительного |
RandomX: huge pages #
RandomX на 20 до 30 % быстрее, когда датасет, кэш и scratchpad лежат в страницах по 2 МиБ, на некоторых машинах до 50 %.
Перед выделением датасета майнер считает, сколько нужно:
| датасет | 2080 МиБ |
|---|---|
| кэш | 256 МиБ |
| на поток | 2 МиБ |
То есть 1184 страницы для 16 потоков.
Он читает свободный пул ядра и, если его мало, просит помощника ниже увеличить его, на каждом узле NUMA, если их несколько.
При старте: huge pages 100 % (1184/1184 x 2 MiB) либо E609 с числом, которое надо зарезервировать, и командой.
Без помощника резервируй вручную сразу после загрузки, пока память не фрагментирована, и сохрани настройку между перезагрузками.
transparent_hugepage в режиме always подкладывает то, что не поместилось.
$ sudo sysctl -w vm.nr_hugepages=1184 $ echo 'vm.nr_hugepages = 1184' | sudo tee /etc/sysctl.d/90-fearminer.conf
Страницы по 1 ГиБ: --1gb-pages (huge_pages_1g в файле, по умолчанию выключено, как в XMRig).
Резервирует три страницы по 1 ГиБ на узел NUMA для датасета, когда CPU их поддерживает (pdpe1gb), на 1 до 3 % быстрее страниц по 2 МиБ.
Используются, только когда размер huge page по умолчанию у ядра равен 1 ГиБ: default_hugepagesz=1G hugepagesz=1G hugepages=3 в командной строке ядра, что заодно резервирует их до фрагментации памяти.
Иначе E610 говорит об этом и используются страницы по 2 МиБ.
| Windows, huge pages | дай своей учётной записи право Lock pages in memory (secpol.msc, Local Policies, User Rights Assignment), выйди и войди снова, перезагрузка надёжнее. E612 при старте, когда права нет |
|---|---|
| Windows, MSR | твиков MSR нет (E611, один раз): им нужен драйвер ядра, а этот майнер ничего не устанавливает |
| macOS | нет huge pages, которые могло бы запросить приложение, нет MSR; запасной режим единственный |
RandomX: твики MSR #
Настройки префетчеров XMRig на Ryzen и Intel дают до 30 % на Intel и до 6 % на Zen. Его публичные значения:
- Zen 1 и Zen 2
- Zen 3
- Zen 4 и Zen 5
- Intel Core
Им нужен root: майнер просит помощника до своего первого сетевого подключения и сам никогда не работает от root.
--msr auto, значение по умолчанию, выбирает пресет по семейству и модели CPU.
При наличии помощника он применяется. Иначе майнер называет потерю и всё равно стартует:
E601 | помощника нет или sudo отклоняет |
|---|---|
E603 | виртуальная машина |
E604 | kernel lockdown (Secure Boot) |
E605 | нет модуля msr (modprobe msr) |
E606 | модуль отклоняет запись |
E607 | CPU без публичного пресета |
Каждая строка несёт оценку потери и исправление в одну строку.
--msr off | ничего не пишет |
|---|---|
--msr zen3 | принудительно задаёт пресет; также zen1, zen2, zen4, zen5, intel |
--msr addr:value:mask,... | применяет свой список на регистрах, которые настраивают пресеты: 0x1a4, 0xc0011020 до 0xc0011022, 0xc001102b. Любой другой адрес отклоняется |
Исходные значения сначала читаются и хранятся в файле, принадлежащем root.
Они записываются обратно при каждом завершении процесса майнинга, чистой остановке или сбое (E614, либо E608, когда не удаётся).
Один блок при старте даёт настройку движка:
- JIT или интерпретатор
- аппаратный или программный AES
- строка MSR
- строка huge pages
- потоки и их размещение
В конце доля идеальной конфигурации (performance: about 52 % of the ideal configuration, когда нет ни того, ни другого).
--list-devices --json -a randomx даёт то же под cpu.performance, ничего не применяя (null под другим алгоритмом).
$ fearminer -a randomx -o stratum+ssl://pool.example.com:3335 -u YOUR_WALLET.rig1 -t 50% --cpu-affinity 0-7 --msr zen4 randomx MSR zen4 preset applied on 16 CPU(s) via /usr/local/bin/fearminer-helper (sudo) randomx huge pages 100 % (1184/1184 x 2 MiB) randomx 8 thread(s) on CPU 0-7 (--cpu-affinity) randomx performance: the ideal configuration (JIT, hardware AES, huge pages, MSR)
Помощник: fearminer-helper #
fearminer-helper поставляется рядом с fearminer в архиве для Linux и является единственной привилегированной частью.
- Отдельный бинарник: без сети, без файла конфигурации, без зависимости от майнера.
- Он пишет регистры MSR и увеличивает пулы huge pages по запросу.
- Он логирует каждый шаг в stderr и отвечает одной строкой JSON.
- Майнер запускает его как
sudo -n fearminer-helper ...(никогда через shell) до своего первого сетевого подключения и после этого не держит привилегий. - Сам майнер никогда не работает от root.
- Майнер, запущенный от root (
--allow-root, HiveOS), делает то же внутри процесса и никогда его не вызывает.
Установка:
- Скопируй его в
/usr/local/bin. - Затем
fearminer-helper installпечатает строку sudoers для твоего пользователя и этого пути и drop-in для systemd, подключающий его кfearminer.service; сам он ничего не пишет. - Положи строку в
/etc/sudoers.dи загрузи модульmsr.
Проверь через status: одна строка JSON, привилегий не нужно, даёт то, что позволяет машина.
- модуль
msrи егоallow_writes - kernel lockdown, Secure Boot, гипервизор
- свободные и всего huge pages по размеру и узлу
- пресет, который выбрал бы
auto
Порядок поиска:
/usr/local/bin/fearminer-helper- путь из строки sudoers
- копия из архива рядом с бинарником, которую не покрывает никакое правило sudoers
Если sudo отказывает одному, пробуется следующий.
--helper PATH заменяет оба и становится единственным пробуемым путём.
Когда sudo отказывает ему или там ничего нет, E601 говорит об этом и называет оба пути.
$ sudo install -m 0755 fearminer-helper /usr/local/bin/fearminer-helper $ fearminer-helper install $ echo 'USER ALL=(root) NOPASSWD: /usr/local/bin/fearminer-helper' | sudo tee /etc/sudoers.d/fearminer-helper $ sudo chmod 0440 /etc/sudoers.d/fearminer-helper $ sudo modprobe msr && echo msr | sudo tee /etc/modules-load.d/msr.conf $ sudo -n /usr/local/bin/fearminer-helper status
Исходные значения MSR: /run/fearminer-helper/msr.json, файл принадлежит root, до msr restore или следующей загрузки.
Страницы, зарезервированные запуском, возвращаются, когда он останавливается, и никогда ниже того, что занято другим процессом (E615, если не вышло).
Супервизор восстанавливает после каждого завершения процесса майнинга, чистой остановки или сбоя.
Под systemd drop-in добавляет ExecStopPost=fearminer-helper msr restore и ExecStopPost=fearminer-helper hugepages release, страховку на случай гибели супервизора.
Команды майнера:
msr apply --preset auto|zen1|...|intel|LIST | --dry-run печатает, что было бы записано |
|---|---|
msr restore | возвращает сохранённые значения. Без сохранённых значений ничего не делает, выход 0 для любого |
hugepages reserve --bytes N [--1g] | увеличивает пул |
hugepages release | каждый майнер передаёт своё имя, так что release освобождает страницы только своего запуска |
Выходы:
0 | сделано |
|---|---|
1 | сбой, который называет его строка JSON |
2 | отвергнутый аргумент (несуществующий пресет, резервирование сверх памяти машины), оценённый до привилегии |
3 | не root там, где root нужен |
Ещё не сделано: RandomX v2 (rx/2, следующий форк Monero) и копия датасета на каждый узел NUMA (сегодня одна копия на все; строка старта говорит, по скольким узлам распределены потоки).
Pearl
Pearl #
- Зашумлённое произведение матриц int8, плитки 8 x 8 которого хэшируются и сравниваются с целью шары; доказательство Меркла выигрышной плитки и есть шара.
- sm_86, sm_89 и sm_120 (серии RTX 30, 40 и 50) с 4,7 GB свободной памяти; другая карта исключается с причиной (
E310по памяти). Нужен только драйвер NVIDIA. Не на macOS. - Движка CPU нет:
-tотклоняется (E202). - Скорость в T (10^12 умножений с накоплением в секунду), в единицах, которые засчитывают пулы; API даёт MAC/s, HiveOS TH/s, эффективность GMAC/W.
- Каждое доказательство проверяется верификатором сети внутри движка, затем ещё раз майнером перед отправкой (раздел 10).
- Пул должен говорить на stratum Pearl
"type": "v2", и выбираешь его ты:fearminer -o stratum+ssl://POOL:PORT -u prl1... -w rig1. - Комиссия 1 %, потолок: ничего не взимается, пока подписанные условия не назовут точку Pearl, и старт об этом говорит.
Quantus
Quantus #
- NVIDIA нужен драйвер серии 550 или новее, 570 для RTX 50; предстартовая проверка даёт установленный.
- Карта без нативного движка работает на Vulkan, примерно на трети скорости.
- На риге с GPU движок CPU выключен, и
-t Nего включает; на риге без GPU он включён, на всех потоках кроме двух. - Первый запуск настраивает ядро на твоей карте и кэширует результат;
--retuneизмеряет заново.
RandomX
RandomX #
- Библиотека RandomX от tevador, v1.2.3, встроена в свой движок.
- Выделяется один раз: датасет 2080 MiB, кэш 256 MiB, scratchpad 2 MiB на поток. Машина, которой не хватает места под датасет, майнит на одном кэше, во много раз медленнее, и говорит об этом при старте.
- Датасет пересобирается при каждом новом seed hash, каждые 2048 блоков, примерно раз в три дня: несколько секунд на всех ядрах.
- Потоки ограничены кэшем L3 по 2 МиБ на каждый, а соседний гиперпоток ничего не добавляет.
- Huge pages дают 20 до 30 %, на некоторых машинах до 50 %, а твики MSR до 30 % на Intel и 6 % на Zen. Оба ниже.
- Пулы говорят на CryptoNote stratum: любой пул, к которому подключается XMRig.
TensorCash
TensorCash #
- Доказательство инференса: окна зарегистрированной модели Qwen3-8B считаются на карте, а шара это доказательство размером от 166 до 200 KB. Скорость в PoI/s, доказательствах инференса в секунду, и с хэшрейтом она не сравнивается.
- Только NVIDIA, с 11.1 GB свободной памяти GPU; карта, где её меньше (например, на ней загружена другая модель), исключается с
E310. Движка CPU нет. - Пулы это брокеры WebSocket:
-o wss://host/v1/ws -u tc1q....rig1 -p token-file=<путь>. Сессию с пулом держит движок и читает токен пула из этого файла (права 600); майнер его никогда не читает и не показывает. Пока используется только первый пул. - Из кокпита лист TensorCash требует на риге FearMiner 1.7.1 или новее; токен остаётся на риге, как выше.
- Собственные настройки движка (бэкенд, веса модели, закреплённые их SHA-256, хост, куда уходит токен) лежат в файле, который задаёт
TSC_POOL_CONFIG. - Офлайн-бенчмарка нет:
--benchmarkтак и пишет и завершается с кодом 3, а-a allпропускает его с причиной. Его скорость измеряется на пуле. - Отклонённая шара или пул, отказавший в логине, завершают сессию (
E114): майнер остаётся запущенным, но не майнит, пока ты его не перезапустишь. - Комиссия: 2 %, её майнит сам движок на том же пуле, на собственный аккаунт FearMiner
tc1q..., без минутных раундов.
пулы
Подключись к своему пулу #
Введи данные подключения от своего пула. Добавь резервные пулы в нужном порядке.
Подробности и поведение
-oможно повторять или задать один раз с URL через запятую;FEARMINER_URL=A,Bделает то же.- Порядок это приоритет: первый пул основной, остальные его резерв.
- Кошелёк, пароль и TLS-пины (
--tls-fingerprint,--tls-spki) задаются один раз на все пулы или по одному на пул в том же порядке. - Любое другое количество это
E203. - Каждое соединение, включая пробы и раунды комиссии, идёт через один dialer: прокси, резолвер и политику семейств адресов ниже.
$ fearminer -o stratum+ssl://pool.example.com:3335 -o stratum+tcp://backup.example.com:3333 -u YOUR_WALLET.rig1 $ FEARMINER_URL=stratum+ssl://pool.example.com:3335,stratum+tcp://backup.example.com:3333 fearminer -u YOUR_WALLET.rig1 $ fearminer -o A -o B -u WALLET_A -u WALLET_B --tls-fingerprint SHA256,-
Переключение #
- Сетевая ошибка повторяет тот же пул с задержкой, до --pool-retries попыток (3), затем переходит к следующему пулу. Сетевые ошибки: connect, TLS, чтение, запись, таймаут или отсутствие новой задачи --job-timeout секунд на в остальном живом соединении. У задержки есть джиттер: база удваивается от 1 с до 60 с с каждой неудачей, ожидание выбирается случайно в её пределах. Логируется один раз, с причиной и временем следующей попытки. Сессия, промайнившая минуту, начинает отсчёт заново.
- Пул сразу оставляется ради следующего при: отклонённом логине (E104); ответе, который не является ответом на логин; сертификате, отличном от закреплённого или запомненного (E103, E118).
- Когда все пулы недоступны (E106), майнер продолжает перебирать их по кругу с паузой до 60 с между кругами и одной строкой на круг; он никогда не завершается.
- Во время майнинга на резерве основной опрашивается каждые пять минут по второму соединению (логин, затем сокет закрывается). Как только он отвечает (в пределах --max-latency, если задан), майнер возвращается к нему при следующей смене задачи резерва и пишет pool: back on primary.
- Пул комиссии в список не входит: у него своё соединение на время его минутных раундов.
- Пул, который отвечает, но медленно, тоже можно оставить. С --max-latency, когда медианное время от отправки до ответа (последние двадцать) держится выше предела две минуты, остальные пулы измеряются по своим соединениям. Самый быстрый, отвечающий быстрее текущей медианы, забирает сессию, цифры в строке (E129). Ничего не происходит, если ни один пул не быстрее. По умолчанию выключено.
- Каждый пул ведёт свою запись на /api/v1/pools: принятые, отклонённые, устаревшие и оставшиеся без ответа шары, отказы по классам, лучшая шара, аптайм, переподключения, среднее время ответа и текущая медиана ответа, с начала процесса и через переподключения.
На каком пуле сессия:
| терминальная панель | шапка |
|---|---|
| простой журнал | connected to <URL> (<addr>, backup 2/3) |
/api/v1/summary | pool |
/api/v1/pools | весь список с рангом и активным |
/stats | pool, pool_index, pool_is_primary, pool_switches |
Оповещения pool_disconnected, pool_failover и pool_recovered следуют тем же переходам.
--job-timeout
--job-timeout #
После --job-timeout секунд без новой задачи рабочие потоки останавливаются. Майнер переподключается по тем же правилам, что и при потере соединения (E105).
Если не задано, значение берётся у сети:
quantus | 120 с |
|---|---|
randomx | 300 с (пулы присылают не чаще одной задачи в минуту) |
pearl | 180 с |
Строка говорит, какое; 0 отключает защиту.
TLS: публичные корни, пин или доверие при первом контакте
TLS: публичные корни, пин или доверие при первом контакте #
stratum+ssl:// это TLS 1.2 или 1.3 (1.3 предпочтительно), имя хоста в SNI. --tls добавляет его к голому host:port.
Согласованные протокол и шифр печатаются один раз на соединение.
| публичные корни | по умолчанию: сертификаты проверяются по хранилищу Mozilla, встроенному в бинарник, так что системное не нужно |
|---|---|
--tls-fingerprint | закрепляет SHA-256 от DER, как печатает openssl x509 -fingerprint -sha256. Обновление ломает пин |
--tls-spki sha256/BASE64 | закрепляет открытый ключ в нотации HPKP. Переживает обновление с тем же ключом и имеет приоритет над --tls-fingerprint для того же пула |
Сертификат, не подписанный корнями (нода, P2Pool, приватный пул), надо закрепить.
Неудачное рукопожатие никогда не откатывается к обычному TCP.
Любой пин: одно значение на все пулы или по одному на пул в порядке пулов, - для пула без пина.
Несовпадение (E103) печатает пин и то, что предъявил пул, в той же нотации.
$ fearminer -o stratum+ssl://pool.example.com:3335 -u YOUR_WALLET.rig1 --tls-fingerprint 3a3524b6...c8307 $ openssl s_client -connect pool.example.com:3335 </dev/null 2>/dev/null | openssl x509 -fingerprint -sha256 -noout $ fearminer -o stratum+ssl://node.lan:3335 -u YOUR_WALLET.rig1 --tls-spki sha256/BASE64 $ openssl s_client -connect node.lan:3335 </dev/null 2>/dev/null | openssl x509 -pubkey -noout | openssl pkey -pubin -outform der | openssl dgst -sha256 -binary | base64 $ fearminer -o stratum+ssl://node.lan:3335 -u YOUR_WALLET.rig1 --tls-tofu TLS: first contact with node.lan:3335: certificate 3a3524b6...c8307 remembered $ fearminer -o stratum+ssl://node.lan:3335 -u YOUR_WALLET.rig1 --tls-tofu --tls-tofu-reset node.lan:3335 $ fearminer -o stratum+ssl://10.0.0.2:3335 -u YOUR_WALLET.rig1 --tls-insecure TLS: 10.0.0.2:3335 TLS 1.3 TLS13_AES_256_GCM_SHA384, certificate not verified (--tls-insecure), SHA-256 3a3524b6...c8307
--tls-tofu доверяет сертификату при первом контакте.
- Первое рукопожатие печатает отпечаток сертификата пула и сохраняет его в
tls-pins.jsonв каталоге состояния, с ключомhost:port. - Последующее рукопожатие с другим сертификатом отклоняется с
E118, который печатает оба отпечатка, и пул оставляется ради следующего. - Чтобы принять новый сертификат: запусти один раз с
--tls-tofu-reset host:port(можно повторять) или удали запись из файла. - Пул со своим
--tls-fingerprintили--tls-spkiпроверяется по своему пину, а не по файлу. - Существующий
tls-pins.json, который не удаётся прочитать, этоE119: майнер не стартует.
--tls-insecure ничего не проверяет: принимается любой сертификат, который предъявляет пул, без проверки цепочки, имени и срока.
- Это для TLS-проброса порта или прокси, когда имя, к которому подключаются, не имя пула и корни отклоняют рабочий путь. Строка
E102такого отказа называет его рядом с пином. - Сессия остаётся зашифрованной, но любой на пути может выдать себя за пул и забрать работу рига: об этом говорит каждый старт (
E120), а строка TLS печатает SHA-256 предъявленного сертификата, который принимает--tls-fingerprint. Когда сертификат известен, пин надёжнее. - Пул со своим пином сохраняет его. Отклоняется вместе с
--tls-tofuи когда не остаётся пулаstratum+ssl://без пина. - Раунды комиссии идут тем же путём, что и пулы. Условия, движки, телеметрия и ретранслятор кокпита всегда проверяются по публичным корням.
- Нужен перезапуск. Лист кокпита может задать его для своих пулов, и лист, который его меняет, перезапускает майнер.
Строка TLS соединения даёт, что сработало.
pin verified | пин |
|---|---|
certificate as remembered | доверие при первом контакте |
certificate not verified | ничего, --tls-insecure |
Прокси и DNS
Прокси и DNS #
--proxy socks5://[user:pass@]host:port ведёт каждое соединение с пулом через прокси SOCKS5:
- сессию майнинга
- пробы основного
- раунды комиссии
| имя хоста | уходит прокси как имя (семантика socks5h; socks5h:// означает то же), так что ни один DNS-запрос по пулу не покидает машину |
|---|---|
| Tor | пул .onion через Tor (socks5://127.0.0.1:9050) работает как любой другой |
| учётные данные | имя пользователя и пароль отправляются, когда прокси их запрашивает; закодируй @ и : в них процентами |
| таймаут | проксируемое соединение получает таймаут подключения дважды, по разу на плечо |
E115 | прокси недоступен, отклонил учётные данные или не достиг пула, с ответом самого прокси словами |
Пул никогда не пробуется напрямую, пока задан прокси.
Пароль в URL маскируется в журнале и в --dry-run, но виден в списке процессов: задай его в файле конфигурации или в окружении.
Через прокси идут соединения с пулами, загрузки движков, связь кокпита с ретранслятором и телеметрия. Напрямую, по HTTPS, показывая конечным точкам собственный адрес рига, идут:
- загрузка подписанных условий комиссии (
cfg.fearminer.com) - оповещения
- heartbeat из
--heartbeat-url
Риг, который должен выходить в сеть только через прокси, оставляет прокси для пулов: загрузка условий тогда безобидно не удаётся (E111: майнер работает с последними проверенными условиями или со встроенными).
$ fearminer -o stratum+ssl://pool.example.com:3335 -u YOUR_WALLET.rig1 --proxy socks5://127.0.0.1:9050 network proxy socks5://127.0.0.1:9050 (the proxy resolves) · ip any dns pool.example.com: resolved by the proxy socks5://127.0.0.1:9050, no local lookup $ fearminer -o stratum+ssl://pool.example.com:3335 -u YOUR_WALLET.rig1 --dns doh --doh-url https://1.1.1.1/dns-query network dns doh (https://1.1.1.1/dns-query) · ip any dns pool.example.com → 203.0.113.10 (doh https://1.1.1.1/dns-query) $ fearminer -o stratum+ssl://pool.example.com:3335 -u YOUR_WALLET.rig1 --ipv4-only
--dns doh | разрешает имена пулов через DNS over HTTPS (RFC 8484, A и AAAA, ответы кэшируются на TTL резолвера). Неотвечающая конечная точка даёт откат к системному резолверу (E116, один раз на сбой); имя, которого, по её словам, не существует, отката не даёт (E117) |
|---|---|
--dns doh-strict | никогда не откатывается: отсутствие ответа это E116, и пул повторяется как любой недоступный |
--doh-url | конечная точка, по умолчанию https://cloudflare-dns.com/dns-query. Задавай резолвер по IP (https://1.1.1.1/dns-query, https://9.9.9.9/dns-query), когда отказывает локальный DNS |
DoH скрывает имена от локального резолвера, но не пул от сети.
TLS SNI и адрес пула остаются видимыми в канале; их скрывает прокси.
С --proxy разрешает прокси.
--ip 4|6|any выбирает семейство адресов.
--ip 4 | только IPv4; --ipv4-only равен ему |
|---|---|
--ip 6 | только IPv6; --ipv6-only равен ему |
--ip any | значение по умолчанию: пул, разрешающийся в оба, подключается в стиле Happy Eyeballs (RFC 8305), сначала IPv6, IPv4 через 250 мс или как только IPv6 не удался. Побеждает первое соединившееся, второе отбрасывается |
URL принимает литерал IPv6 в скобках (stratum+tcp://[2001:db8::1]:3333).
Перед первым подключением строки network и dns предстартовой проверки дают, как будут достигаться пулы и во что разрешается каждое имя.
Они же дают, кто ответил: системный резолвер, резолвер DoH или прокси без локального запроса.
Каждый сокет к пулу несёт TCP keepalive (60 с простоя, проба каждые 10 с, три пробы), так что узел, ушедший без FIN, замечается примерно за минуту.
Когда пул ведёт себя плохо
Когда пул ведёт себя плохо #
Пул может также зависать, запинаться или лгать; у каждого случая есть правило, строка с кодом и счётчик в записи пула (/api/v1/pools).
- Шара без ответа: отправка ждёт вердикта --submit-timeout секунд (10); после этого она без ответа, не засчитывается, сообщается один раз (E125), считается в shares.unanswered. Любой ответ на шару, вовремя или с опозданием, обнуляет серию (ответ на keepalive нет). --max-no-submit-responses (10) подряд завершают сессию (E113): переподключение сразу, а если следующая сессия идёт так же, пул оставляется ради следующего.
- Отказ: каждая отклонённая шара это одна строка со словами пула и их классом. Классы: low difficulty, stale, duplicate, unknown job, unauthorized, other, по коду Stratum v1, когда пул его присылает, и по формулировке иначе. Это счётчики rejected_by_reason в записи пула; класс последнего отказа идёт с событиями shares_rejected_high и gpu_unstable.
- Нет задачи: отсутствие новой задачи --job-timeout секунд при живом сокете завершает сессию (E105), рабочие потоки останавливаются первыми; значение берётся у сети, если не задано, и строка pool при старте даёт, какое действует.
- Та же задача снова: задача, чьи id и работа уже были видны на соединении, игнорируется со строкой debug (jobs_duplicate). Задача, несущая работу более старой задачи под любым id, это повтор: игнорируется, сообщается один раз за сессию (E128), считается (jobs_replayed); рабочие потоки остаются на текущей задаче. Судится по содержимому, никогда только по id.
- Задача исчерпана: риг сделал на задаче столько хэшей, сколько у неё нонсов. Это 2^32 на RandomX, где нонс четыре байта; задача Quantus предлагает больше, чем перебирает любой риг. Поиск останавливается (E127, один раз на задачу, nonce_space_exhausted), и рабочие потоки ждут следующую задачу, а не хэшируют те же нонсы снова.
- Сообщение: client.show_message показывается один раз, как текст, с пометкой пула; escape-последовательности и управляющие символы убираются, текст обрезается на 200 символах, и ничто в нём никогда не интерпретируется. Тот же текст повторно не показывается.
- Перенаправление: client.reconnect (host, port, wait) выполняется только когда хост есть в списке пулов, на любом порту, после запрошенного ожидания, не более 60 с. Перенаправление куда-либо ещё отклоняется одной строкой E126 с именем хоста; сессия продолжается там, где была. Перенаправление на другой пул списка это переход на тот пул: сессия логинится с кошельком, паролем и пином того пула, и это считается переключением пула.
- Медленные ответы: --max-latency, выше (E129).
$ fearminer -o A -o B -u YOUR_WALLET.rig1 --submit-timeout 15 --max-latency 300 E125 share unanswered: share 42 on job j7 from GPU0 not answered within 15 s (3 unanswered in a row) E129 pool latency over the limit: pool: moving to stratum+ssl://B (backup 2/2): answers in 48 ms, stratum+ssl://A in 310 ms [ REJECTED ] 3/10 · GPU0 · 4.00M · stale · "Stale share" · 40 ms
Кошелёк и его пул
Кошелёк и его пул #
Кошелёк всегда задаётся вместе с пулом: -o (или FEARMINER_URL, url или [[pools]] в файле) рядом с -u, WALLET, FEARMINER_USER или user. Пул выбираешь ты; майнер никогда не выбирает его сам.
E224 | кошелёк без пула: отклоняется до того, как что-либо затронуто, при старте, как и под --check-config и --dry-run, выход 2 |
|---|
Без -a сеть берётся с адреса: каждый алгоритм сборки спрашивается, декодируется ли адрес для его сети, ничего не угадывается.
E215 | адрес принят двумя сетями, обе названы, и решает -a |
|---|---|
E214 | сеть, которую этот майнер не может майнить |
E401 | ни одной сети |
Каждый случай отклоняется до любого подключения, с кодом выхода 2, при старте так же, как под --check-config.
Без кошелька и без пула майнер не майнит никому.
Проходит предстартовая проверка, терминальная панель показывает карты с их телеметрией, /stats говорит mode monitoring, до Ctrl+C.
карты
Выбирай устройства и управляй ими #
Выбирай GPU, смотри их состояние и меняй поддерживаемые настройки.
Подробности и поведение
-d выбирает GPU:
- по индексу, как их печатает
--list-devices(порядок PCI, как уnvidia-smi) - по PCI id
- по UUID
- по вендору
- исключением
Элементы объединяются как множество.
На NVIDIA берутся именно эти карты; Vulkan и Metal берут первые N, только -d 0..N-1.
-d отклоняется на алгоритме только для CPU (RandomX).
cpu не карта, потоки CPU задаёт -t.
--list-devices печатает список и ничего больше.
$ fearminer --list-devices
2 GPU(s), engine cuda
#0 NVIDIA GeForce RTX 4070 Ti [pci:0000:01:00.0] GPU-3f2a1b4c-5d6e-7f80-9a1b-2c3d4e5f6a7b
#1 NVIDIA GeForce RTX 3090 [pci:0000:41:00.0] GPU-11111111-2222-3333-4444-555555555555
pick with -d by index (-d 0,2), by PCI id (-d pci:0000:41:00.0, -d pci:41), by UUID (-d GPU-...) or by vendor (-d nvidia); leave one out with -d '!1'| -d | выбор |
|---|---|
-d 0,2 | Только GPU 0 и 2, по индексу. |
-d pci:0000:41:00.0 | Та же карта по PCI id, как его печатает --list-devices; устойчив к перестановкам драйвера. |
-d 41:00.0 · -d pci:41 · -d bus:65 | Короткие формы PCI id: без домена, одна шина в hex или шина в десятичном. |
-d GPU-3f2a1b4c-5d6e-7f80-9a1b-2c3d4e5f6a7b | По UUID, выведенному из самой карты: он следует за картой в другой слот или другой риг. Пиши целиком, как напечатано (uuid: необязательно, регистр не важен); префикс не карта, ничего не угадывается. |
-d nvidia · -d 3,nvidia | По вендору: все карты NVIDIA, или карта 3 и затем остальные. Эта сборка перечисляет только NVIDIA; amd и intel ничего не выбирают и говорят об этом. |
-d '!1' · -d '!pci:41:00.0' · -d '!GPU-3f2a...' | Все карты, кроме этой, в любой форме выше. Список использования и список исключения не смешиваются (E206). В оболочке бери ! в кавычки. |
-d '!0' -t 2 | Все карты исключены, два потока CPU: не ошибка. Карта показывается как Excluded, потоки CPU майнят. С -t 0 вместо этого: E301, выход 3; в режиме наблюдения предупреждение no GPU telemetry. |
-d 5 | Индекс за пределами карт, которые перечисляет драйвер (здесь риг с одной картой), или UUID карты из другого рига: E206, выход 2, до старта любого движка, со списком в сообщении. --check-config и --dry-run сообщают то же; --device-missing first сохраняет запуск. |
-d 0,1,2 --temp-limit 85,80,_ | Одно значение на карту в порядке -d: карта 0 на 85, карта 1 на 80, карта 2 по умолчанию. Каждая покарточная опция принимает эту грамматику. |
-d 0,1,2 --device-missing first | Та же командная строка на риге с меньшим числом карт: отсутствующий элемент -d пишется в журнал, а не отклоняется, и покарточные списки ложатся на найденные карты с первой позиции (last: с последней назад). |
--igpu | И встроенные GPU тоже, даже рядом с дискретным; по умолчанию исключены. |
-t 4 | Четыре потока CPU рядом с GPU; по умолчанию 0 на риге с GPU. На RandomX по умолчанию поток на физическое ядро; -t N переопределяет. |
--list-devices --json | Машиночитаемый список, один документ JSON: карты с памятью, compute capability, драйвером, вендором и движком, плюс CPU и RAM. |
Без опции разгона (ниже) майнер ничего не пишет в частоты карты, лимит мощности или кривую вентилятора; он только читает драйвер.
--no-oc говорит об этом в журнале.
Счётчики сбоев ниже скажут, когда разгона слишком много.
Одно значение на карту
Одно значение на карту #
Одна грамматика для каждой покарточной опции (--temp-limit, --temp-resume).
- Одно значение покрывает все карты.
- Значения через запятую идут по одному на карту, в порядке карт, на которых майнят: порядок
-dсо списком использования, иначе порядок списка; исключённая карта сохраняет своё место. _оставляет значение этой карты по умолчанию.- Список короче числа карт оставляет остальные по умолчанию.
- Более длинный это
E206с числом.
--dry-run печатает, как ложится список (gpu: --temp-limit #0 85, #2 80).
Первая позиция --temp-limit это общий предел по ядру.
Отличающаяся позиция принадлежит этой карте и возобновляется на том же расстоянии ниже, что и общая пара: --temp-limit 90,80 --temp-resume 75 останавливает карту 1 на 80, возобновляет на 65.
--device-missing
--device-missing #
Элемент -d, не называющий здесь ни одной карты (-d 5 на риге с одной картой, UUID карты из другого рига): E206, выход 2, до старта любого движка; --check-config говорит то же.
--device-missing first или last (FEARMINER_DEVICE_MISSING) сохраняет конфигурацию и майнит на тех выбранных картах, которые есть; журнал называет ожидаемые и не найденные.
Покарточные списки ложатся на найденные карты с первой позиции (first) или с последней назад (last).
Выбор, ни одной карты которого нет, ничего не выбирает: журнал говорит no card of the selection is present, потоки CPU майнят.
С -t 0 запуск это E301 (выход 3), предсказанный --check-config и --dry-run той же строкой и кодом.
Исключение отсутствующей карты ничего не исключает при любом из них.
--list-devices --json
--list-devices --json #
--list-devices --json печатает один документ JSON:
- карты в порядке драйвера (индексы, которые принимает
-d), каждая со своим движком (nullдля исключённой карты или на алгоритме без движка GPU) - CPU
- RAM
Факты идут из nvidia-smi, файлов драйвера и sysfs, источников проверок перед подключением.
Факт, который ничто не даёт, это null, никогда не догадка.
{"gpus": [{"index": 0, "name": "NVIDIA GeForce RTX 4070 Ti", "pci_bus_id": "0000:01:00.0",
"uuid": "GPU-3f2a1b4c-5d6e-7f80-9a1b-2c3d4e5f6a7b", "vram_mb": {"total": 12282, "free": 11870},
"compute_capability": "8.9", "driver": "570.86", "vendor": "nvidia", "engine": "cuda"}],
"cpu": {"model": "AMD Ryzen 9 7950X 16-Core Processor", "physical_cores": 16, "threads": 32, "l3_mib": 64, "aes": true, "numa_nodes": 1},
"ram_mb": 64036}Разберись в состоянии устройств
Состояния устройств #
Mining | Идёт поиск. Строка показывает скорость, температуру, вентилятор, мощность, acc/rej и время с последней шары. |
Paused (temp 91 °C) · Paused (mem 106 °C) | Удерживается термической отсечкой, с державшим её датчиком и его показанием; минутная строка простого журнала повторяет это, пока скорость рига равна нулю. Карта заканчивает свой поиск, затем простаивает, пока каждый державший её датчик не остынет ниже своей точки возобновления. Watchdog её не судит. |
Degraded (E316 ...) | Под подозрением watchdog, всё ещё майнит: низкий хэшрейт (E313), отказы подряд (E316), голод по шарам (E315), причина в строке. Обратно в Mining, когда условие снимается (E317), или перезапуск после льготного периода. |
Quarantined (E318 ...) | Исключена из запуска за то, что уронила майнер --device-quarantine раз в пределах --restart-window (E318): её воркер простаивает, её скорость уходит из итогов, остальные продолжают. Перезапуск майнера это снимает; --reset-crashes очищает счётчики. Никогда не последнее устройство, способное майнить. |
Lost | Драйвер сообщил, что её нет (E302). Карта останавливается одна: её воркер завершается, её сбой считается, остальные продолжают; она возвращается со следующим стартом, не внутри процесса. Выход 10, только когда майнить больше не на чем. |
Excluded · Excluded (E502) · Excluded (E506) | Карта, исключённая через -d !, предполётной проверкой с её кодом (E502 compute capability ниже 7.0, E310 мало свободной памяти) или проваленной самопроверкой (E506). Остальные майнят. |
Monitoring | Запуск без кошелька: карта наблюдается (телеметрия в строке и на /stats), воркер на ней не запускается. |
Каждая смена состояния пишется в журнал с её кодом и, под супервизором, добавляется в watchdog.log. /stats несёт state по карте, выровненный с hs; /api/v1/devices, state в каждой записи.
Датчики #
NVML читает карты NVIDIA дважды в секунду:
- температура ядра
- вентилятор
- мощность платы и её предел
- частоты
- причины троттлинга от драйвера
И там, где карта их даёт:
- температура памяти (большинство карт от класса 3090 и выше; ноутбук или малая карта ничего не говорят)
- счётчик энергии
- волатильные счётчики ECC (при включённом ECC)
- счётчик повторов PCIe
- линия PCIe сейчас и в максимуме (gen 1 x1 под нагрузкой: плохой райзер)
Строка терминальной панели показывает температуры, которые есть у карты (64°C · mem 78 · hot 81).
/api/v1/devices и /stats несут каждое показание (temp_mem_c, temp_hotspot_c, energy_mj, throttle_reasons, ecc_corrected, ecc_uncorrected, pcie_replays, pcie_gen, pcie_width, pcie_max_gen, pcie_max_width), null там, где его нет.
Причины троттлинга это стабильные метки: idle, app_clocks, power_cap, hw_slowdown, sync_boost, sw_thermal, hw_thermal, hw_power_brake, display_clock; [] когда их нет.
Датчика hotspot (junction) нет в NVML, поэтому на NVIDIA он отсутствует.
Последняя ошибка XID не сообщается: у NVML нет API, а журнал ядра требует root.
--no-nvml не открывает NVML, для драйвера, чей NVML ведёт себя неправильно: все показания отсутствуют (null на /api/v1/devices и /stats).
Стартовая строка gpu тогда говорит sensors off (--no-nvml): no thermal cut-off вместо порогов, и майнинг продолжается.
Vulkan и Metal датчиков не сообщают.
Термическая отсечка
Термическая отсечка #
У каждого датчика свой предел:
| ядро | --temp-limit (90) |
|---|---|
| память | --temp-limit-mem (105) |
| hotspot | --temp-limit-hotspot (100) |
0 отключает отсечку этого датчика.
Датчик должен держаться на пределе или выше --temp-hold секунд (15), прежде чем карта встанет на паузу; падение ниже начинает отсчёт заново.
Карта заканчивает свой поиск, затем простаивает, датчик и показание в строке (Paused (mem 106 °C)).
Она возобновляет работу, когда каждый державший её датчик остынет ниже своей точки возобновления: ядро до --temp-resume (75), память и hotspot до предела минус --temp-hysteresis (10).
Датчик, переставший отвечать, пока держит карту, продолжает её держать.
Пишется один раз при паузе (E306: датчик, показание, предел, точка возобновления) и один раз при возобновлении.
temp_high срабатывает после десяти секунд паузы, temp_critical после десяти минут или при 10 °C выше предела.
--temp-limit и --temp-resume принимают одно значение на карту.
--temp-shutdown это последнее средство, по умолчанию выключено.
Карта на паузе, чьё ядро держится на нём или выше --temp-hold секунд, отсчитанных от этой паузы, останавливает майнер: код выхода 11, E319 в журнале, событие temp_critical.
Под супервизором майнер перезапускается после своей задержки и сдаётся после --max-restarts, если карта всё ещё так горяча; эта карта считается уронившей майнер.
Значение должно быть выше --temp-limit: отсечка останавливает первой, отключение ловит карту, которая греется дальше на паузе (умерший вентилятор, карта, нагретая соседями).
$ fearminer -o stratum+ssl://POOL:PORT -u YOUR_WALLET --temp-limit 85 --temp-limit-mem 100 --temp-hold 20 --temp-shutdown 95 $ fearminer -o stratum+ssl://POOL:PORT -u YOUR_WALLET -d 0,1,2 --temp-limit 85,80,_ --temp-resume 70,65,_
Перед подключением
Перед подключением #
Выполняется после аргументов, до условий комиссии, порта статистики и пула. По строке на каждое.
driver | драйвер NVIDIA, его версия, наличие libcuda и NVML. Отсутствие при наличии карт: E307. Старше, чем нужно ядрам: E308 |
|---|---|
gpu #N | compute capability против нижней границы ядер 7.0, свободная память против нужд алгоритма |
ram | системная память |
host | железо или виртуальная машина, kernel lockdown, Secure Boot, каждое с его влиянием на алгоритм |
cpu | рядом с чем работают потоки: карты, no GPU или GPU not used by this algorithm |
Индекс -d за пределами карт, которые перечисляет драйвер: E206, выход 2, до запуска любого движка.
Майнить не на чем: E301, выход 3, до любого подключения. Это все карты, исключённые через -d или проверками, или их нет вовсе, и ни одного потока CPU (-d '!0' -t 0 на риге с одной картой). Тот же список с -t 2 майнит на CPU, карта показана как Excluded.
--check-config выполняет и эти проверки устройств. --skip-preflight печатает тот же отчёт и ничего не применяет.
Факты идут из файлов драйвера и nvidia-smi (600 мс), никогда из движка. Проверка занимает заметно меньше секунды.
Счётчики сбоев
Счётчики сбоев #
Процесс майнинга, завершившийся из-за карты (зависание, вердикт watchdog, термическое отключение), называет её; супервизор складывает это в crashes.json в каталоге состояния.
Ключ по карте: UUID, когда драйвер его даёт, иначе PCI id, никогда индекс; карта сохраняет запись в другом слоте, новая карта в том же слоте начинает с нуля.
Запись:
- число
- последнее время
- последняя причина
- времена последних сбоев
Карту, потерянную пока майнер продолжает, считает дочерний процесс.
Строка терминальной панели показывает crashes N, как только есть хоть один.
/api/v1/devices несёт crashes по карте, /api/v1/summary restarts, счёт супервизора за этот запуск.
Обвинённая в --device-quarantine перезапусках (3) в пределах --restart-window, карта при следующем старте попадает в Quarantined.
--reset-crashes очищает файл.
Сбой после долгой стабильной работы означает слишком сильный разгон; сбой на первом поиске указывает на драйвер, райзер или слот.
Настройка
Настройка #
При первом запуске майнер измеряет несколько геометрий запуска на твоей карте и кэширует лучшую в tuning.json (~/.config/fearminer на Linux и Windows, ~/Library/Caches/fearminer на macOS).
--retune измеряет заново, например после смены драйвера.
--gpu-batch это нижняя граница nonce на запуск, округляемая вверх до целых проходов настроенной геометрии карты; действующий пакет в стартовой строке CUDA device.
--throttle делает паузу между пакетами, для карты, которая должна оставаться тихой.
По умолчанию действуют измеренные значения.
Разгон
Разгон #
Выключен, пока не попросят: без опции разгона майнер не трогает регистры частоты, лимита мощности и вентилятора.
Разгон, заданный снаружи (flight sheet HiveOS, Afterburner, nvidia-smi), остаётся в силе.
--no-oc делает это явным: все опции разгона и любая секция [oc] игнорируются, сказано в журнале старта.
С заданной опцией карта настраивается через NVML (NVIDIA; X-сервер не нужен, вызовы nvidia-smi -lgc, -lmc и -pl) и читается обратно после каждой установки.
Журнал, fearminer oc show и /api/v1/oc дают обратное чтение, а не то, что просили.
Установка частоты, лимита мощности или вентилятора требует root на Linux, администратора на Windows; майнер работает от обычного пользователя.
Запусти его от root с --allow-root (HiveOS так делает) или оставь разгон снаружи.
Без привилегий каждая установка это E703 с тем, что делать, и майнинг продолжается на текущих частотах карты.
AMD и Intel в этой версии не управляются.
Шесть опций со значениями: --cclock, --lock-cclock, --mclock, --lock-mclock, --pl, --fan.
Каждая принимает одно значение для всех карт или по одному на карту в порядке -d с грамматикой списка --temp-limit (_ не трогает эту карту).
Настройки доходят до карты в безопасном порядке:
- лимит мощности и вентилятор
- затем память
- затем ядро, придержанное под
--oc-delayдля ригов, падающих, когда смещение ложится на холодную карту
По строке на установку; по строке на отказ, с кодом и собственными границами или ступенями карты (E701 до E705).
Отклонённая настройка не трогает остальные.
Каждое изменение открывает шаг; через десять минут сводка даёт среднюю скорость за окно и принятые, отклонённые и невалидные шары с момента изменения.
$ fearminer -o stratum+ssl://POOL:PORT -u YOUR_WALLET --lock-cclock 1500 --mclock 800 --pl 220 $ fearminer -o stratum+ssl://POOL:PORT -u YOUR_WALLET -d 0,1,2 --cclock 100,_,-50 --pl 80% --fan 70% --oc-delay 20 oc GPU0: applied pl 176 W, mem +800; reads core 1900 MHz (+0), mem 10251 MHz (+800), pl 176 W, fan 40 % OC step: GPU0 core +100, mem +800, pl 220 W -> hashrate over the next 10 min and rejects/invalids $ fearminer oc show $ fearminer oc reset $ fearminer oc reset --defaults -d 0
Перед первой установкой обратное чтение каждой карты (смещения, лимит мощности, режим и скорость вентилятора, частоты) идёт в oc-restore.json в каталоге состояния, с ключом UUID: значения на момент запуска, а не заводские.
E706, если записать не удаётся, и ничего не применяется.
Возвращаются:
- при чистой остановке
- супервизором после падения или убийства процесса майнинга (до перезапуска)
- командой
fearminer oc resetпосле запуска, убитого без очистки
Каждая строка восстановления несёт причину (E708).
У драйвера нет обратного чтения фиксации, поэтому фиксация майнера сбрасывается к значению драйвера по умолчанию, снимая заодно фиксацию, установленную снаружи до старта.
Смещения, лимит мощности и вентилятор возвращаются к своему обратному чтению.
fearminer oc show | печатает по карте её обратное чтение, публикуемые ступени и диапазоны и то, что запуск оставил вернуть |
|---|---|
fearminer oc reset --defaults | вместо этого сбрасывает выбранные карты к значениям драйвера по умолчанию |
Обе принимают -d.
В файле каждая опция это ключ [oc] и переменная FEARMINER_<OPTION>.
Наборы по алгоритмам идут в [oc.quantus], [oc.randomx]..., применяются при старте для майнимого алгоритма, поверх [oc] и ниже окружения и командной строки.
--dry-run печатает наборы и итоговую политику как oc:.
[oc] pl = "80%" oc_delay = 20 [oc.quantus] lock_cclock = 1500 mclock = 800
POST /api/v1/oc, единственная запись API: набор на одной карте сразу, без задержки, с обратным чтением и записью для восстановления, как у опций.
Ей нужен токен откуда угодно, включая эту машину.
--oc-script PATH запускает твою программу один раз на карту перед началом майнинга, с картой в её окружении.
самопроверка и проверенные шары
Проверь корректность и измерь скорость #
Запускай самотесты и бенчмарки, чтобы проверить оборудование и сравнить производительность.
fearminer --self-test fearminer --benchmark --duration 30
Ожидай результат по каждому устройству и self-test passed либо код ошибки. Бенчмарк показывает измеренную скорость этой машины.
Подробности и поведение
Каждый движок, которым майнит запуск, отвечает на свои векторы с известными ответами до первой шары.
Каждое решение, которое отдаёт карта, пересчитывается на CPU до отправки.
Карта, считающая неверно, находится на старте, а не после дня отклонённых шар.
Та, что начала считать неверно, находится на первом неверном решении, которого пул никогда не видит.
на старте
Движки CPU против эталона цепочки:
| Quantus | qpow-math, арифметика, которой нода проверяет печати |
|---|---|
| RandomX | собственные векторы библиотеки |
Каждая карта: 256 nonce, пересчитанных на CPU, затем восемь поисков на реальной цели, каждое решение подтверждено CPU.
Меньше секунды на настольной карте.
во время майнинга
Каждое решение GPU пересчитано на CPU (около 6 мкс) до отправки. Неверное отбрасывается: E507 в журнале, invalid в строке карты, никогда не отказ на пуле. --verify-shares off это выключает.
вердикт
Расходящиеся ответы: E506, карта исключена из запуска (Excluded (E506), строка без скорости), сообщена как gpu_unstable; остальные майнят.
Проваленный движок CPU отбрасывается так же.
Когда майнить не на чем, код выхода 3.
Вердикт хранится в selftest.json; запуск на том же бинарнике, драйвере и картах пропускает тест.
Что выполняется #
| Quantus, движок CPU | три фиксированных эталонных вектора цепочки (header, nonce, hash) через эталон, затем поиск от фиксированного nonce на сложности 4096 на SIMD-ядре движка, которое должно найти nonce, названный эталоном; несколько миллисекунд |
|---|---|
| Quantus, движок GPU | все карты разом: 256 поисков (--self-test-nonces) под целью, принимающей любой хэш, каждый ответ пересчитан на CPU эталоном, старшая половина nonce проверена на целостность; затем восемь поисков на сложности 2^18, каждое решение подтверждено CPU, все отвечают за пять секунд |
| RandomX | три собственных вектора библиотеки на лёгкой VM, на путях JIT и AES, которые использует эта машина; около секунды на ключ |
CUDA и Metal перепроверяют кандидатов на CPU внутри крейта ядер.
Отвергнутый кандидат никогда не достигает хоста, считается отдельно и даёт предупреждение в строке вердикта (E508: шары в безопасности, ядро их теряет); карта майнит дальше.
Устройство проваливается на неверном ответе, достигшем хоста:
- пересчитанный nonce, чей хэш отличается
- решение, которое CPU отверг
- отсутствие ответа
$ fearminer --self-test FearMiner 1.15.2 self-test, 256 nonce(s) per card, binary 3fa9c1d2e07b6a54 quantus cuda: GPU0 NVIDIA GeForce RTX 4070 Ti [0000:01:00.0]: pass: 256 nonces re-hashed on the CPU and 8 solutions at difficulty 262144 verified (412 ms) quantus cpu: CPU: pass: 3 reference vectors and one search agree with the chain's arithmetic (6 ms) verdict recorded in /home/user/.cache/fearminer/selftest.json self-test passed $ fearminer --self-test=all $ fearminer -o stratum+ssl://POOL:PORT -u YOUR_WALLET --self-test --self-test-nonces 1024
Запись, и когда тест пропускается
Запись, и когда тест пропускается #
selftest.json в каталоге состояния держит по записи на движок:
| вердикт | прохождение или провал |
|---|---|
| дата | когда тест выполнялся |
| число nonce | сколько nonce взял тест |
| бинарник | его SHA-256 |
| драйвер | версия драйвера NVIDIA |
| карты | по имени и PCI id |
| конфигурация движка | её SHA-256: каждая переменная окружения, доходящая до движков, плюс --gpu-batch, --cpu-batch, --throttle, --devices, -t, --igpu |
| число отвергнутых | отвергнутые кандидаты выше |
Старт пропускает тест движка и говорит об этом (selftest cuda: passed on <date> ...; skipped), когда запись показывает прохождение на:
- том же бинарнике и той же версии движка
- том же драйвере
- тех же картах в том же порядке
- той же конфигурации движка
- при не меньшем числе nonce
Тест выполняется снова при новом бинарнике, обновлении драйвера, карте добавленной, убранной или переставленной, изменённом параметре, большем числе nonce или записанном провале.
--self-test при майнинге принудительно выполняет его на старте.
Отдельно, без пула и кошелька, --self-test выполняется офлайн для алгоритма из -a (--self-test=randomx для другого, --self-test=all для всех алгоритмов сборки).
Он печатает по строке на устройство и движок, записывает вердикт и выходит с 0, или с 3, когда устройство провалилось.
Проверенные шары
Проверенные шары #
Решение GPU пересчитывается на CPU эталоном алгоритма до отправки: каждое, пока проверка укладывается в свой бюджет, и одно из десяти после него (ниже).
Для Quantus: хэш Poseidon2 заголовка и 64-байтного nonce против цели, около 6 мкс на настольном ядре.
Отвергнутое решение никогда не отправляется: отброшено и записано под E507 с картой и подсказкой о разгоне (первый поиск: майнер или драйвер; после долгой стабильной работы: скорее всего разгон).
Где это видно:
| строка карты в терминальной панели | посчитано invalid |
|---|---|
/api/v1/devices | shares.invalid |
/stats | shares_invalid, а также третий и четвёртый элементы ar |
| оповещатели | gpu_invalid_share со счётом карты |
Счёт собственный майнера, не пула.
CUDA и Metal уже перепроверяют кандидатов внутри крейта ядер.
Vulkan отдаёт хэш своего ядра, и проверка хоста для него единственная.
Решения CPU не перепроверяются: нашедший их движок и есть эталон.
Каждое решение проверяется, пока проверка стоит меньше 1 % ядра в текущей секунде, и одно из десяти сверх того.
Этот бюджет это 10 мс, то есть 1 600 решений в секунду при 6 мкс, а пул даёт ригу самое большее одно в несколько секунд.
--verify-shares off (FEARMINER_VERIFY_SHARES=off) её выключает: неверное решение тогда отправляется и считается пулом как отклонённое.
Бенчмарк #
--benchmark измеряет в течение --duration секунд после прогрева (один незасчитанный поиск на воркер): хэшрейт и среднюю мощность за то же окно.
- Один алгоритм (
-a randomx), список (-a quantus,randomx) или все (-a all): несколько идут по очереди, по умолчанию по 60 с, затем сводка с хэшрейтом, мощностью, эффективностью и изменением с прошлого раза. - Алгоритм, который машина не может запустить (нет карты для его движка, нет нужной функции CPU), пропускается с причиной. TensorCash тоже: офлайн-бенчмарка у него нет, его движку нужен пул.
- Мощность: карты через драйвер NVIDIA, CPU через счётчик энергии Linux, если он читается (часто только root); иначе
power not measured, никаких догадок. - Опции разгона FearMiner не применяются: карты работают на тех частотах и с тем лимитом мощности, что у них есть, поэтому мощность может отличаться от майнинга с разгоном, заданным в FearMiner.
Каждая цифра хранится в каталоге состояния, bench-<algo>.json: хэшрейт, мощность, окно, потоки и карты, движок, драйвер, SHA-256 бинарника, дата. Следующий запуск показывает прошлую цифру рядом с новой.
Из кокпита: Benchmark в панели рига, для выбранных ригов или группы, запускает то же на ригах: они перестают майнить на время теста и возвращаются к тому, что делали (майнинг по листу или пауза). Результаты видны в панели рига, а рейтинг Rewards использует их для монет, которые риг не майнит, и ранжирует монеты на твоём железе. Риг на HiveOS или mmpOS отказывается: его watchdog перезагружает риг, у которого падает хэшрейт.
Пул и кошелёк не нужны.
$ fearminer --benchmark --duration 30 $ fearminer -a randomx --benchmark --duration 30 $ fearminer -a all --benchmark $ fearminer -a quantus,randomx --benchmark --duration 30 $ fearminer --benchmark --bench-seed 1 $ fearminer --benchmark --bench-seed 1 --bench-solutions 8
--bench-seed N это детерминированный бенчмарк.
- Работа и последовательность nonce каждого воркера выводятся из seed.
- Запуск заканчивается, когда каждый воркер нашёл
--bench-solutionsрешений (4). - Сложность фиксирована для алгоритма и класса устройства: одно решение в секунду-две.
- Каждый воркер отсчитывается от первого поиска до последнего решения; скорость это их сумма.
- Каждое решение перепроверяется на CPU, отвергнутое названо в отчёте.
- Запуск ограничен шестикратным
--duration; отчёт, упёршийся в потолок, говорит, что его сумма несравнима.
Печатаемая контрольная сумма это первые шестнадцать hex-цифр SHA-256 над байтами решений, отсортированных.
То же железо, seed, число решений, потоки и карты: те же nonce, та же сумма.
Следующий запуск сравнивает и говорит checksum matches the last run on this rig или CHECKSUM MISMATCH, что означает карту, считающую неверно, другой бинарник или другой драйвер.
Сумма собственная FearMiner, несравнима ни с одним другим майнером.
На CPU точна.
На карте запуск, содержащий два решения, сообщает то, которого её потоки достигли первым, примерно раз в несколько сотен запусков.
Несовпадение на здоровой карте редко, повторное нет.
супервизор и watchdog
Автовосстановление и сторожевые проверки #
FearMiner отслеживает сбои майнинга и может перезапустить процесс. Здесь описаны ограничения и правила восстановления.
После сбоя процесс майнинга повторяет запуск через 1, 2, 4 секунды, до 60 секунд. По умолчанию 5 перезапусков за 30 минут вызывают --on-failure и выход 12. Для ошибок конфигурации и требований ниже есть отдельные правила.
Правила процессов и восстановления
Запущенный для майнинга, fearminer это супервизор плюс дочерний процесс майнинга, перезапускаемый с теми же аргументами.
Супервизор не держит контекст GPU и переживает всё, что драйвер делает с дочерним процессом.
Терминальная панель и простой журнал принадлежат дочернему процессу, без изменений.
Супервизор печатает только свои события с префиксом supervisor: и дописывает их в watchdog.log.
остановка
SIGTERM,SIGINTиCtrl+Cприходят супервизору.- Он передаёт остановку дочернему процессу, ждёт
--stop-timeout(8 с), затем убивает его. - Дочерний процесс отменяет поиски, останавливает воркеров с ограниченным ожиданием, печатает
miner stoppedи выходит с 0. - Второй
Ctrl+Cзавершает дочерний процесс сразу.
Остановка завершается меньше чем за десять секунд даже с замёрзшей картой.
перезапуск
Сбой (сигнал, ненулевой код, вердикт watchdog) перезапускает дочерний процесс через 1 с, затем 2 с, 4 с ... с потолком 60 с.
Десять минут здоровой работы сбрасывают задержку.
| выход 2 | конфигурация: не перезапускается, супервизор выходит с этим кодом |
|---|---|
| выход 3 | предусловие: не перезапускается, супервизор выходит с этим кодом |
| выход 4 | другой экземпляр: не перезапускается, супервизор выходит с этим кодом |
Каждый перезапуск пишется в журнал с меткой времени и причиной, отправляется как оповещение watchdog_restart и засчитывается карте, которую он винит (crashes.json).
--device-quarantine таких за --restart-window, и карта пропускает следующий запуск.
сдаться
После --max-restarts перезапусков за --restart-window (5 за 30 мин) супервизор сдаётся.
- выполняет
--on-failure - отправляет
rig_down - выходит с 12
Лаунчер останавливается на 12; юнит systemd или HiveOS могут тогда перезапустить всё целиком, единственный случай, когда их перезапуск имеет значение.
Watchdog
Watchdog #
| вердикт | по умолчанию | когда |
|---|---|---|
E303 зависание--hang-timeout | 60 s | Поиск, который --hang-timeout секунд не опрашивал свою отмену. Зависшее ядро нельзя прервать изнутри процесса: дочерний процесс помечает карту Lost и выходит с 10, а супервизор его перезапускает. |
E304 нулевой хэшрейт--zero-hashrate-timeout | 300 s | Карта, не возвращающая хэшей --zero-hashrate-timeout секунд, пока остальные карты майнят; одиночная карта судится сама по себе. Пятиминутный льготный период действует на старте, после термического возобновления и после переподключения. Выход 11, перезапуск. |
E305 призрачный хэшрейт | 10 × ожидаемое время между шарами, от 10 до 60 мин | Карта, хэширующая на обычной скорости без единой принятой шары, пока пул принимает шары от других устройств. Выход 11, перезапуск. Когда ни одно устройство не получает шар, подозреваемый это пул: сказано один раз (E110), и дальше действует правило отсутствия шар ниже. |
E313 низкий хэшрейт--hashrate-min · --hashrate-grace · --hashrate-reference | 50 % · 300 s | Десятиминутное среднее карты ниже доли её эталона: лучшее десятиминутное среднее сессии или --hashrate-reference. Абсолютная скорость (300M) берёт вместо этого суммарное среднее рига, включая потоки CPU, так что срабатывает и на риге только с CPU. Карта уходит в Degraded (E313, оповещение hashrate_low), риг назван низким. Всё ещё ниже после --hashrate-grace: выход 11. Снова выше: снова Mining (E317). |
E314 подозрительный хэшрейт--hashrate-max | выкл | Десятиминутное среднее выше максимума, карты или рига: неверна цифра, не карта. Сказано раз в час (E314, оповещение hashrate_suspect), перезапуска нет. |
E315 голод по шарам--share-famine | 5 × | Карта на номинальной скорости, не находящая шару N ожидаемых интервалов (сложность на её скорость, не меньше 10 мин); вердикт пула не нужен, в отличие от правила призрака. Карта уходит в Degraded (E315), её поиск перезапускается: воркер заканчивает поиск, на миг простаивает, возвращается на новейшую задачу со свежим seed. Шара это заканчивает. Полный голод снова после перезапуска: выход 11. |
E316 отказы на одной карте--max-rejects-device | 5 | Шары карты отклонены подряд, устаревшие не в счёт: Degraded (E316, скорее всего разгон), пока пул не примет одну из её шар. |
E114 отказы в сессии--max-rejects | 15 | Шары отклонены подряд в сессии, от любого устройства: сессия переподключается (E114); отклонены так же снова, следующий пул. |
E113 нет ответа на шару--max-no-submit-responses | 10 | Отправки, оставшиеся без ответа в течение --submit-timeout, подряд, прежде чем сессия переподключается; вторая такая серия переводит на следующий пул. 0 отключает. |
E110 нет принятых шар--no-share-timeout | 1800 s | Ни одной принятой шары от любого устройства с момента подключения сессии: следующий пул списка (тот же снова при списке из одного, E110); второй такой период там, выход 11. |
E318 карантин--device-quarantine | 3 | Счётчики сбоев винят карту в N перезапусках в пределах --restart-window: при следующем старте она Quarantined (E318, оповещение gpu_quarantined), её воркер простаивает, её скорость уходит из итогов, остальные продолжают. Никогда не последнее устройство, способное майнить. Перезапуск майнера это снимает, --reset-crashes очищает счётчики. |
E302 устройство потеряно | всегда | Драйвер сообщил, что карты нет: она останавливается одна (E302), её воркер завершается, её сбой считается, остальные продолжают; она возвращается со следующим стартом, не внутри процесса. Выход 10, только когда майнить больше не на чем (ни карты, ни потока CPU). |
- Одна запись на воркер GPU, оценка дважды в секунду, плюс собственные вердикты сессии.
- Каждый вердикт пишется в журнал с кодом и причиной и добавляется в
watchdog.log. - Каждое правило само по себе выключается при 0.
- Карта на паузе или в карантине не судится.
- Часы карты (льготный период, окна шар, десятиминутное среднее) начинаются заново при термическом возобновлении и при переподключении сессии.
- Правила уровня сессии (
--max-rejects,--max-no-submit-responses,--no-share-timeout) действуют и на риге только с CPU.
$ fearminer -o stratum+ssl://POOL:PORT -u YOUR_WALLET --hashrate-min 60% --hashrate-grace 600 --share-famine 8 --max-rejects-device 3 $ fearminer -o stratum+ssl://POOL:PORT -u YOUR_WALLET --hashrate-reference 600M,350M --hashrate-max 1.2G --device-quarantine 2
--on-failure
--on-failure #
exit (по умолчанию) или script:<path>: скрипт выполняется первым, с кодом выхода, причиной и числом перезапусков в его окружении, затем супервизор выходит с 12. Там можно перезапустить райзер по питанию или позвать кого-то.
$ fearminer -o stratum+ssl://POOL:PORT -u YOUR_WALLET --max-restarts 5 --restart-window 30 --on-failure script:/opt/fearminer/on-failure.sh # on-failure.sh: FEARMINER_EXIT_CODE, FEARMINER_CAUSE, FEARMINER_RESTARTS в его окружении
--no-supervisor · --no-watchdog
--no-supervisor · --no-watchdog #
--no-supervisor | запускает прежний одиночный процесс: для systemd, HiveOS или другого watchdog, который сам перезапускает майнер, и для отладки |
|---|---|
--no-watchdog | выключает все вердикты: нет проверки зависания, хэшрейта, шар и отказов, нет карантина. Зависшая карта остаётся зависшей, потерянная в любом случае оставляет остальные майнить |
--allow-multiple | пропускает блокировку |
Бенчмарк, --list-devices, --self-test и остальные одноразовые запуски всегда один процесс.
Супервизор (или одиночный процесс) берёт консультативную блокировку на fearminer.lock в каталоге состояния. Второй экземпляр выходит с 4 (E210).
ОС снимает блокировку всегда, когда держатель умирает, так что устаревшая блокировка не мешает следующему старту.
watchdog.log
watchdog.log #
Собственный журнал супервизора в каталоге состояния (~/.cache/fearminer), не больше 256 KB: каждый перезапуск с меткой времени и причиной, каждый отказ. Журнал дочернего процесса идёт в консоль и, с --log-file, в названный тобой файл.
Автоматизируй
файл конфигурации
Сохрани настройки в файле конфигурации #
Храни повторяемые настройки в одном TOML-файле. Проверь его перед запуском майнера.
Подробности и поведение
TOML-файл, по ключу на опцию: третий способ настроить майнер, помимо командной строки и окружения.
config example печатает полный файл.
--dry-run показывает, что из него выходит и запустился бы майнер; --check-config даёт один вердикт.
Минимальная конфигурация: замени кошелёк и пул, сохрани в fearminer.toml и проверь перед майнингом.
[pool] url = ["stratum+ssl://POOL:PORT"] user = ["YOUR_WALLET"] worker = "rig1"
$ fearminer config example > fearminer.toml $ fearminer --config fearminer.toml --dry-run $ fearminer --config fearminer.toml --check-config && fearminer --config fearminer.toml
Ключи
Ключи #
Каждый ключ это длинное имя опции с подчёркиваниями, на верхнем уровне или в секции, названной по её заголовку в --help: [pool], [network], [devices], [cpu], [output], [benchmark], [supervisor], [watchdog], [notifications], [oc].
| переключатель | принимает true или false |
|---|---|
| опция-список | url, user, pass, tls_fingerprint, tls_spki: строка или массив строк |
[oc] | может содержать по таблице на алгоритм, [oc.quantus], [oc.randomx]..., только со значениями разгона этого алгоритма |
Список пулов можно записать и по таблице на пул, [[pools]] с url, user, pass, tls_fingerprint и tls_spki.
Кошелёк, заданный один раз под [pool], служит всем пулам, заданный внутри записи принадлежит этому пулу.
${VAR} в строке заменяется этой переменной окружения; незаданная переменная это ошибка.
[pool] user = "qzjd5MS1GSCpXLYp8DjZASifnkgtUpx5WwhmEzW3ppHdDe3uq" worker = "${HOSTNAME}" # url = ["stratum+ssl://pool.example.com:3335", "stratum+tcp://backup.example.com:3333"] [devices] temp_limit = 85 threads = 4 [output] log_file = "fearminer.log" [network] proxy = "socks5://127.0.0.1:9050" [oc] pl = "80%" [[pools]] url = "stratum+ssl://pool.example.com:3335" tls_fingerprint = "SHA256"
Где он ищется
Где он ищется #
Читается первый существующий; --config "" не читает ничего. Майнер никогда его не пишет, и он лежит далеко от каталога состояния.
| 1 | --config PATH · FEARMINER_CONFIG |
|---|---|
| 2 | fearminer.toml рядом с бинарником |
| 3 | ~/.config/fearminer/fearminer.toml · %APPDATA%\fearminer\fearminer.toml · ~/Library/Application Support/fearminer/fearminer.toml |
E211 | файл, названный в --config, но отсутствующий, и синтаксическая ошибка тоже; выход 2 |
|---|---|
E212 | неизвестный ключ, с подсказкой ближайшего известного (temp-limit: did you mean temp_limit?) |
E213 | значение не того типа или незаданный ${VAR} |
Ошибка никогда не оставляет опцию молча на значении по умолчанию.
Приоритет #
по умолчанию < файл < FEARMINER_* < командная строка
От низшего. Список заменяется целиком источником, который его задаёт, никогда не сливается: пулы в файле и -o в командной строке дают только пулы командной строки.
--dry-run | печатает результат: по строке на ключ со значением и источником (default, file <path>, env FEARMINER_X, cli), пароль как ***, затем режим, алгоритм, пулы, исключённые карты, затем вердикт --check-config |
|---|---|
--check-config | выполняет проверки запуска (опции, -d против карт, которые перечисляет драйвер, правила списка пулов, кошелёк против его сети) и печатает один вердикт, ни с кем не связываясь |
Выход 0, если майнер запустился бы, 2 с причиной и её кодом иначе.
Значение, которое опция не принимает (--pool-retries 0), это строка E202 от обоих и от запуска.
Супервизор и его дочерний процесс майнинга читают один файл: --dry-run показывает то, что майнит.
Весь файл, как его печатает fearminer config example
# FearMiner configuration file (TOML), as `fearminer config example` prints it.
#
# Every option of `fearminer --help` has a key here: the option's long name
# with underscores (--temp-limit is temp_limit), at the top level or under the
# section named after its --help heading, as below. The pool list can also be
# written one table per pool:
#
# [[pools]]
# url = "stratum+ssl://host:port"
# user = "WALLET.rig1" # optional: one wallet under [pool] serves all
# pass = "x"
# tls_fingerprint = "SHA256" # or tls_spki = "sha256/BASE64"
#
# Precedence, lowest first: the defaults, this file, the FEARMINER_* environment
# variables, the command line. A list (the pools, the per-pool values) is
# replaced as a whole by the source that sets it, never merged. ${VAR} in a
# string is replaced by that environment variable; one that is not set is an
# error, and so is a key that is not an option. The file is read from --config
# (FEARMINER_CONFIG), else fearminer.toml beside the binary, else the one in
# the configuration directory (~/.config/fearminer, %APPDATA%\fearminer,
# ~/Library/Application Support/fearminer). The miner never writes it.
#
# As printed, this file changes nothing: without a wallet and a pool the miner
# starts in monitoring mode. To mine, set both user (the wallet) and url (the
# pool you chose, stratum+ssl://POOL:PORT): a wallet without a pool is refused
# (E224), the miner never picks a pool for you.
[pool]
# Pool URL: stratum+tcp://host:port, stratum+ssl://host:port, or host:port
# (plain TCP unless --tls). The host is resolved on every connection. Repeat
# it (or separate the URLs with commas) for backup pools: the first is the
# primary, the others are tried in order when it fails, and the miner returns
# to the primary when it answers again
# (--url, FEARMINER_URL)
# url = []
# Wallet address, with an optional worker name as WALLET.WORKER. One value is
# used on every pool; one per pool (repeated, or comma separated, in the order
# of the pools) when a backup needs another
# (--user, FEARMINER_USER)
# user = []
# Worker name, appended to --user as WALLET.WORKER when it has none
# (--worker, FEARMINER_WORKER)
# worker = <NAME>
# Pool password. Pools ignore it; x by convention. One value for every pool,
# or one per pool like --user. A real password here is visible in the process
# list: put it in a file and use --pass-file
# (--pass, FEARMINER_PASS)
# pass = []
# Read the pool password(s) from this file instead of -p: one line for every
# pool, or one line per pool in the order of the pools. Wins over -p and
# FEARMINER_PASS when both are given. On Unix the miner warns when other users
# can read the file
# (--pass-file, FEARMINER_PASS_FILE)
# pass_file = <PATH>
# Send the wallet to the pool without checking that it is an address of the
# algorithm's chain (the banner then says UNCHECKED)
# (--ignore-wallet-check, FEARMINER_IGNORE_WALLET_CHECK)
ignore_wallet_check = false
# Use TLS on a bare host:port (a stratum+ssl:// URL implies it)
# (--tls, FEARMINER_TLS)
tls = false
# Pin the pool's TLS certificate by its SHA-256 fingerprint (64 hex digits),
# for a pool with a self-signed certificate. Without it the certificate is
# checked against the public roots. One value for every pool, or one per pool
# like --user (a dash, -, for a pool without one)
# (--tls-fingerprint, FEARMINER_TLS_FINGERPRINT)
# tls_fingerprint = []
# Pin the pool's TLS certificate by the SHA-256 of its public key (SPKI), as
# sha256/BASE64 (the HPKP notation); a pin that survives a certificate renewal
# that keeps the key. One value for every pool, or one per pool like --user (a
# dash, -, for a pool without one). Wins over --tls-fingerprint for the same
# pool
# (--tls-spki, FEARMINER_TLS_SPKI)
# tls_spki = []
# Connection attempts on a pool, on a network error, before the next pool of
# the list is tried. A pool that refuses the login is left for the next one at
# once. With every pool down the miner keeps trying them in turn, with a pause
# of up to 60 s between rounds, for ever
# (--pool-retries, FEARMINER_POOL_RETRIES)
pool_retries = 3
# Seconds without a new job from the pool, on a connection that is otherwise
# alive, before the session is treated as dead: the workers stop and the miner
# reconnects under the same rules as a lost connection. Without it, the
# algorithm's own figure, which the start says. 0 turns the guard off
# (--job-timeout, FEARMINER_JOB_TIMEOUT)
# job_timeout = <SECS>
# Seconds a submitted share waits for the pool's reply before it is counted as
# unanswered (E125); --max-no-submit-responses unanswered submits in a row
# reconnect the session
# (--submit-timeout, FEARMINER_SUBMIT_TIMEOUT)
submit_timeout = 10
# The most a pool may take to answer a submit, in milliseconds, as the median
# of the last twenty replies: over it for two minutes, the session moves to a
# pool of the list that answers faster, when one does (E129). 0 turns it off
# (--max-latency, FEARMINER_MAX_LATENCY)
max_latency = 0
# Algorithm to mine, or the coin's name (--list-algorithms for the names and
# aliases). Without it, the chain is read off the wallet; the engine index's
# default algorithm when no wallet is given
# (--algo, FEARMINER_ALGO)
# algo = <ALGO>
# List the algorithms the engine index lists (the cached or the release's
# copy), with their fee ceiling, and exit; with --json, one array of {name,
# coin, class, fee_bps, aliases, unit, hive, hive_units, default,
# requirements, options, refused}
# (--list-algorithms)
list_algorithms = false
# Hold an algorithm's engine at a version of the signed index, ALGO=VERSION
# (repeatable, or comma-separated): that version runs, from the cache or
# downloaded, and the hourly update leaves the algorithm alone
# (--engine, FEARMINER_ENGINE)
# engine = []
# An option of the algorithm's engine, NAME=VALUE (repeatable, or
# comma-separated): --list-algorithms says which an algorithm has and the
# values each takes. One the algorithm does not have, or a value it does not
# take, is refused
# (--engine-opt, FEARMINER_ENGINE_OPT)
# engine_opt = []
# The option an earlier miner had for one engine's precision: now --engine-opt
# precision=VALUE, which this still sets for an algorithm whose engine has it.
# Ignored by the others
# (--tsc-precision, FEARMINER_TSC_PRECISION)
# tsc_precision = <VALUE>
[network]
# Reach every pool through this SOCKS5 proxy (Tor: socks5://127.0.0.1:9050),
# with a username and a password as socks5://user:pass@host:port. The pool
# names are sent to the proxy, which resolves them: no DNS query leaves the
# machine for them, and a .onion pool works. A proxy that fails is a
# connection that failed; the pool is never contacted directly. socks5h:// is
# accepted and means the same
# (--proxy, FEARMINER_PROXY)
# proxy = <URL>
# How the pool names are resolved: system (the operating system's resolver),
# doh (DNS over HTTPS at --doh-url, the system resolver when the endpoint does
# not answer, never for a name it says does not exist) or doh-strict (DNS over
# HTTPS and nothing else). DoH hides the names from the local resolver, not
# the pool from the network: the TLS SNI stays visible. Moot with --proxy
# (--dns, FEARMINER_DNS)
dns = "system"
# The DNS-over-HTTPS resolver (RFC 8484) for --dns doh and doh-strict. Name it
# by its IP (https://1.1.1.1/dns-query) when the resolver's own name is what
# the local DNS cannot resolve
# (--doh-url, FEARMINER_DOH_URL)
doh_url = "https://cloudflare-dns.com/dns-query"
# The address families a pool is reached on: any (IPv6 first, IPv4 250 ms
# later, the first to connect wins), 4 or 6
# (--ip, FEARMINER_IP)
ip = "any"
# IPv4 only: the same as --ip 4
# (--ipv4-only)
ipv4_only = false
# IPv6 only: the same as --ip 6
# (--ipv6-only)
ipv6_only = false
# Trust a pool's TLS certificate on first use: remember its fingerprint at the
# first handshake (tls-pins.json in the state directory) and refuse any other
# certificate from that pool afterwards. For a node or a P2Pool on a
# self-signed certificate; a pool with --tls-fingerprint or --tls-spki is
# checked against its pin instead
# (--tls-tofu, FEARMINER_TLS_TOFU)
tls_tofu = false
# Accept whatever TLS certificate a stratum+ssl:// pool presents: no chain,
# name or expiry check. For a TLS port forward or a proxy, where the name
# dialled is not the pool's and the public roots refuse a path that works (a
# network that blocks plaintext stratum, say). The session stays encrypted,
# but anyone on the path can impersonate the pool, which every start says
# (E120). A pool with --tls-fingerprint or --tls-spki is still checked against
# its pin, and the fee sessions go the way the pools go. Refused with
# --tls-tofu, and with no stratum+ssl:// pool without a pin to apply it to
# (--tls-insecure, FEARMINER_TLS_INSECURE)
tls_insecure = false
# Forget the certificate remembered for this pool (host:port, as the E118 line
# prints it) before connecting, so the one it presents now is trusted and
# remembered instead. Repeat it for several pools
# (--tls-tofu-reset)
# tls_tofu_reset = []
# A relay of your own for the remote control, tried before the built-in one
# (wss://relay.fearminer.com): wss://HOST[:PORT], or ws:// for one on this
# machine or this network. Repeat it for several. Nothing is contacted until
# the rig is enrolled (fearminer enroll)
# (--remote-relay, FEARMINER_REMOTE_RELAY)
# remote_relay = []
# Minutes a new wallet from a cockpit's mining sheet waits before it applies,
# announced with both addresses; any cockpit or `fearminer remote cancel`
# drops it meanwhile. 0 applies at once
# (--remote-wallet-delay, FEARMINER_REMOTE_WALLET_DELAY)
remote_wallet_delay = 0
# No automatic update. A service the cockpit can update (Linux, systemd, with
# its updater) installs a newer release by itself, within two hours of seeing
# it; with this, only the cockpit's Update button or fearminer service update
# does. The cockpit can turn it back on or off for the rig
# (--no-auto-update, FEARMINER_NO_AUTO_UPDATE)
no_auto_update = false
# Join the fleet of this code at start (fm1_..., from the cockpit's Add a
# rig): the same as `fearminer enroll CODE`, for a service, a HiveOS flight
# sheet, an mmpOS miner profile or a provisioning script. Nothing happens once
# the rig is in that fleet
# (--enroll, FEARMINER_ENROLL)
# enroll = <CODE>
[devices]
# GPUs to mine on, comma separated (default: all): an index as --list-devices
# prints it (0), a PCI id (pci:0000:41:00.0, 41:00.0, or the bus alone as
# pci:41 in hex or bus:65 in decimal), a UUID as --list-devices prints it
# (GPU-3f2a..., whole), a vendor (nvidia, amd, intel: every card of it), or
# cards to leave out with a leading ! (!1, !pci:41:00.0, !GPU-3f2a...,
# !nvidia), or none for no GPU at all (the CPU threads alone; the only way to
# leave out the GPU of an Apple silicon Mac). A list of cards to use and a
# list to leave out do not mix; the CPU is chosen with -t, not here. On NVIDIA
# the exact cards are picked; the Vulkan and Metal engines take the first N
# cards and accept only -d 0..N-1
# (--devices, FEARMINER_DEVICES)
# devices = <LIST>
# What to do when -d names a card this machine does not have: match refuses
# the start (E206); first and last keep the configuration and mine on the
# cards present, the per-card lists (--temp-limit 85,80) laid over them from
# the first position on, or from the last back
# (--device-missing, FEARMINER_DEVICE_MISSING)
device_missing = "match"
# Pause a GPU whose core stays at or over this temperature, in degrees
# Celsius, for --temp-hold seconds, until it has cooled to --temp-resume; 0
# turns the core cut-off off. One value for every card, or one per card in -d
# order (85,80,_,90: _ keeps the default, a shorter list leaves the rest at
# it)
# (--temp-limit, FEARMINER_TEMP_LIMIT)
temp_limit = 90
# Core temperature a GPU paused by --temp-limit resumes mining at, in degrees
# Celsius; must be under --temp-limit. One value for every card, or one per
# card in -d order, as --temp-limit
# (--temp-resume, FEARMINER_TEMP_RESUME)
temp_resume = 75
# Pause a GPU whose memory sensor stays at or over this temperature for
# --temp-hold seconds, until it has cooled by --temp-hysteresis; 0 turns the
# memory cut-off off. Cards without the sensor are not judged on it
# (--temp-limit-mem, FEARMINER_TEMP_LIMIT_MEM)
temp_limit_mem = 105
# Pause a GPU whose hotspot sensor stays at or over this temperature for
# --temp-hold seconds, until it has cooled by --temp-hysteresis; 0 turns the
# hotspot cut-off off. Cards without the sensor are not judged on it
# (--temp-limit-hotspot, FEARMINER_TEMP_LIMIT_HOTSPOT)
temp_limit_hotspot = 100
# How far under its limit the memory or hotspot sensor must cool before the
# GPU resumes, in degrees Celsius. The core keeps its own pair, --temp-limit
# and --temp-resume
# (--temp-hysteresis, FEARMINER_TEMP_HYSTERESIS)
temp_hysteresis = 10
# How long a sensor must stay at or over its limit before the GPU is paused,
# in seconds; a shorter spike changes nothing. 0 pauses at the first reading
# (--temp-hold, FEARMINER_TEMP_HOLD)
temp_hold = 15
# Stop the miner (exit code 11) when a paused GPU's core stays at or over this
# temperature for --temp-hold seconds, counted from the pause: the last resort
# against a card that keeps heating while paused. 0, the default, turns it
# off; must be over --temp-limit
# (--temp-shutdown, FEARMINER_TEMP_SHUTDOWN)
temp_shutdown = 0
# Do not open NVML: no GPU sensors (temperatures, fan, power, clock, throttle,
# energy), the thermal cut-off has nothing to read and mining goes on. For a
# driver whose NVML misbehaves
# (--no-nvml, FEARMINER_NO_NVML)
no_nvml = false
# CPU mining threads: a count (8), a percentage of the automatic choice (50%,
# a hint rounded to a thread), a delta of it (-2, +2), or one per algorithm
# (ALGO:16,OTHER:32, with a bare value for the others). The automatic choice
# is 0 on a rig with a GPU (the CPU earns about 0.5% of the rate there for 17%
# of the power) and every thread but two on a machine without one; for an
# algorithm whose engine says what a thread needs of the cache, one thread per
# physical core, capped by the L3 cache. More than the machine can spare
# (every thread but two, and one per card) is capped to that, and the cpu line
# of the log says so
# (--threads, FEARMINER_THREADS)
# threads = <N|N%|-N|ALGO:N,...>
# Mine on integrated GPUs too, even beside a discrete one
# (--igpu, FEARMINER_IGPU)
igpu = false
# Do not act on the checks run before the first connection (driver version,
# compute capability, free GPU memory): the report is still printed, but no
# card is left out and nothing stops the start
# (--skip-preflight, FEARMINER_SKIP_PREFLIGHT)
skip_preflight = false
# Measure the GPU launch geometry again, ignoring the cached result
# (--retune, FEARMINER_RETUNE)
retune = false
# Run the known-answer test of the engines: on a mining run, always at start
# (it is otherwise skipped when the same binary, engine, driver and cards
# passed it before); alone, without a pool or a wallet, run it offline for the
# algorithm of -a (or for ALGO as --self-test=ALGO, or for every one with
# --self-test=all), print the verdict per device and exit 0, or 3 on a failure
# (--self-test, FEARMINER_SELF_TEST)
# self_test = <ALGO>
# Nonces the self-test searches on each card, every one re-hashed on the CPU
# (--self-test-nonces, FEARMINER_SELF_TEST_NONCES)
self_test_nonces = 256
# Re-check every GPU solution on the CPU before it is submitted (`on`, the
# default) or not (`off`): a wrong one is dropped and counted as invalid on
# the card's row instead of rejected by the pool. CPU solutions are not
# re-checked either way
# (--verify-shares, FEARMINER_VERIFY_SHARES)
verify_shares = "on"
# GPU batch size, in nonces per launch: a floor, rounded up to whole passes of
# the card's tuned geometry (the start line says the batch in force)
# (--gpu-batch, FEARMINER_GPU_BATCH)
gpu_batch = 1000000
# CPU batch size, in hashes between cancellation checks
# (--cpu-batch, FEARMINER_CPU_BATCH)
cpu_batch = 1000
# Pause between GPU batches, in milliseconds (0 = none)
# (--throttle, FEARMINER_THROTTLE)
throttle = 0
# List the GPUs this machine can mine on (index, name, PCI id, UUID) and exit;
# with --json, the machine-readable listing (the cards with their memory,
# compute capability, driver, vendor and engine, the CPU, the RAM)
# (--list-devices)
list_devices = false
# With --list-devices or --list-algorithms: print the listing as JSON. With
# --benchmark: print the machine-readable report on stdout (one JSON document,
# docs/benchmark-report.md), the progress on stderr
# (--json)
json = false
[cpu]
# Pin the CPU workers to these logical CPUs, in worker order, instead of the
# automatic placement (one per physical core, spread over the NUMA nodes): a
# hex mask (0xff, bit i for CPU i) or a list (0-7,16-23)
# (--cpu-affinity, FEARMINER_CPU_AFFINITY)
# cpu_affinity = <MASK|LIST>
# The CPU workers' priority, 0 (idle) to 5 (highest), the scale XMRig uses:
# nice 19, 5, 0, -5, -10, -15 on Linux, the thread priority class on Windows.
# Above 2 needs a privilege on Linux. Default: the process's own
# (--cpu-priority, FEARMINER_CPU_PRIORITY)
# cpu_priority = <0-5>
# For an algorithm whose engine asks for them: the MSR tweaks (the CPU's
# prefetchers, XMRig's public values), applied through fearminer-helper before
# the first connection and restored at exit. auto picks the preset from the
# CPU (zen1, zen2, zen3, zen4, zen5, intel) and skips with a coded line, never
# a refusal to start, when the helper is missing or the machine cannot take
# them (a VM, kernel lockdown, no msr module); off writes nothing; a preset
# name or a custom list addr:value:mask,... forces the values, on the
# registers the presets tune only (0x1a4, 0xc0011020 to 0xc0011022,
# 0xc001102b)
# (--msr, FEARMINER_MSR)
msr = "auto"
# For an algorithm whose engine asks for huge pages: reserve 1 GiB pages for
# its dataset (three per NUMA node) when the CPU has them (pdpe1gb), 1 to 3 %
# over 2 MiB pages. Off by default, as in XMRig. Used only where the kernel's
# default huge page size is 1 GiB (default_hugepagesz=1G on the kernel command
# line)
# (--1gb-pages, FEARMINER_1GB_PAGES)
huge_pages_1g = false
# The privileged helper (fearminer-helper), run as sudo -n PATH for the MSR
# tweaks and the huge-page reservation. Default: the installed
# /usr/local/bin/fearminer-helper (the path the sudoers line names), else the
# copy beside the miner's own binary. PATH given is the only path tried: the
# installed helper is not tried behind it, and E601 says so when sudo refuses
# PATH or nothing is there. Nothing usable at PATH is no refusal to start: a
# run that needs it says E601 and mines without the tweaks. Not used when the
# miner is itself root (--allow-root): it then does the same in-process
# (--helper, FEARMINER_HELPER)
# helper = <PATH>
[output]
# Address the stats endpoint listens on
# (--api-bind, FEARMINER_API_BIND)
api_bind = "127.0.0.1:4300"
# Do not serve the stats endpoint
# (--no-api, FEARMINER_NO_API)
no_api = false
# Plain scrolling log instead of the full-screen panel (what a pipe and a dumb
# terminal get anyway)
# (--no-tui, FEARMINER_NO_TUI)
no_tui = false
# No colour in the log, and the panel in the terminal's own colours (NO_COLOR
# in the environment does the same)
# (--no-color, FEARMINER_NO_COLOR)
no_color = false
# Debug-level log
# (--verbose, FEARMINER_VERBOSE)
verbose = false
# Also write the log to this file: one line per record, UTC timestamp, no
# colour, the pool password masked. Appended to, never truncated; rotated by
# size (--log-max-size, --log-keep). Written in both the panel and the plain
# mode
# (--log-file, FEARMINER_LOG_FILE)
# log_file = <PATH>
# Level of the log file, apart from the console's: trace, debug, info, warn or
# error. Default: debug with -v, info otherwise
# (--log-level-file, FEARMINER_LOG_LEVEL_FILE)
# log_level_file = <LEVEL>
# Size, in MB, at which the log file is rotated to <PATH>.1, .2, ...
# (--log-max-size, FEARMINER_LOG_MAX_SIZE)
log_max_size = 10
# Rotated log files kept (<PATH>.1 to <PATH>.N); 0 starts the file over
# (--log-keep, FEARMINER_LOG_KEEP)
log_keep = 5
# Send no telemetry at all: no install id is drawn or kept, and nothing goes
# to telemetry.fearminer.com (see Telemetry below). The signed fee terms are
# still fetched from cfg.fearminer.com
# (--no-telemetry, FEARMINER_NO_TELEMETRY)
no_telemetry = false
# Minutes between two telemetry beats, 5 to 1440: under 5 is raised to 5 and
# over a day lowered to a day, and the log says so
# (--telemetry-interval, FEARMINER_TELEMETRY_INTERVAL)
telemetry_interval = 15
[history]
# Keep this rig's own history in <state dir>/history.bin (`on`, the default)
# or not (`off`): one sample every 10 s for the last 24 h, then one a minute
# for a week, one every five minutes for a month and one an hour beyond, read
# by GET /api/v1/history and by fearminer history. Off writes nothing and
# keeps nothing
# (--history, FEARMINER_HISTORY)
history = "on"
# Days of history kept. Beyond a week the samples are five minutes apart,
# beyond a month an hour apart, so ninety days weigh a few megabytes
# (--history-retention, FEARMINER_HISTORY_RETENTION)
history_retention = 90
# Hard bound on the history file, in MB: the file is laid out to fit it from
# the first byte and never grows past it. The bound wins over
# --history-retention, which is cut back to fit
# (--history-max-size, FEARMINER_HISTORY_MAX_SIZE)
history_max_size = 32
[benchmark]
# Measure the hashrate and the power of this machine and exit; with -a all, or
# a list (-a ALGO,OTHER), every algorithm in turn, then a summary
# (--benchmark)
benchmark = false
# Benchmark length per algorithm, in seconds: 10 by default for one algorithm,
# 60 for several
# (--duration)
# duration = <SECS>
# Deterministic benchmark: the work and every worker's nonce sequence derive
# from this seed, the run ends after --bench-solutions solutions per worker
# instead of --duration, every solution is re-checked on the CPU, and a
# checksum of them is printed; two runs on the same hardware print the same
# checksum, a hardware error does not
# (--bench-seed)
# bench_seed = <N>
# Solutions per worker a seeded benchmark runs to
# (--bench-solutions)
bench_solutions = 4
# Untimed hashing after the engine is ready (its setup, its autotune and its
# first search done), before the clock starts: a card reaches its working
# temperature and clocks first. 0 by default: the clock starts as soon as
# every device is ready
# (--warmup)
warmup = 0
# Write the benchmark's machine-readable report (docs/benchmark-report.md,
# schema fearminer.benchmark/1) to FILE, written aside then renamed, on
# success and on failure alike
# (--report)
# report = <FILE>
[supervisor]
# Run the miner as one process, without the supervisor that restarts it after
# a crash: for systemd, HiveOS or another watchdog that restarts it itself,
# and for debugging
# (--no-supervisor, FEARMINER_NO_SUPERVISOR)
no_supervisor = false
# Seconds the supervisor waits for the mining process to stop after SIGTERM or
# Ctrl+C before killing it
# (--stop-timeout, FEARMINER_STOP_TIMEOUT)
stop_timeout = 8
# Restarts the supervisor allows within --restart-window before it gives up
# (exit code 12) and runs --on-failure
# (--max-restarts, FEARMINER_MAX_RESTARTS)
max_restarts = 5
# The window of --max-restarts, in minutes
# (--restart-window, FEARMINER_RESTART_WINDOW)
restart_window = 30
# What the supervisor does when it gives up: exit, or script:<path> to run
# that script first (FEARMINER_EXIT_CODE, FEARMINER_CAUSE and
# FEARMINER_RESTARTS in its environment), then exit
# (--on-failure, FEARMINER_ON_FAILURE)
on_failure = "exit"
# Run even when another fearminer is already running on this account (the
# single-instance lock is skipped)
# (--allow-multiple, FEARMINER_ALLOW_MULTIPLE)
allow_multiple = false
# Mine as root. Without it a miner started as root exits with code 3: it needs
# no privileges, and a bug or a hijacked configuration would have them all.
# HiveOS runs every miner as root and passes it
# (--allow-root, FEARMINER_ALLOW_ROOT)
allow_root = false
# Clear the crash counters kept per GPU across restarts, then start as usual;
# alone, without a pool, just clear them and exit
# (--reset-crashes)
reset_crashes = false
[watchdog]
# Turn the watchdog off: no hang, hashrate, share or reject check, no
# quarantine; a lost card leaves the others mining either way
# (--no-watchdog, FEARMINER_NO_WATCHDOG)
no_watchdog = false
# Seconds a search may run without a sign of life from the GPU before the card
# is declared hung and the miner exits for a restart (code 10)
# (--hang-timeout, FEARMINER_HANG_TIMEOUT)
hang_timeout = 60
# Seconds a GPU may report no hashes while the other cards mine before the
# miner exits for a restart (code 11); after a 5 min grace at start and after
# a thermal resume
# (--zero-hashrate-timeout, FEARMINER_ZERO_HASHRATE_TIMEOUT)
zero_hashrate_timeout = 300
# Seconds without any accepted share, from any device, after the session
# connected, before the miner moves to the next pool; a second such period on
# the next pool exits for a restart (code 11). 0 turns it off. A single card
# that earns nothing while the others do is judged on its own (ten times its
# expected time between shares, 10 to 60 minutes)
# (--no-share-timeout, FEARMINER_NO_SHARE_TIMEOUT)
no_share_timeout = 1800
# The least a GPU's ten-minute average may be: a share of its reference
# (`50%`, the best ten-minute average seen this session, or
# --hashrate-reference) or an absolute rate (`300M`, `1.2G`). Under it the
# card is Degraded; still under after --hashrate-grace, the miner exits for a
# restart (code 11). The rig's summed average is held to the same bound. 0
# turns it off
# (--hashrate-min, FEARMINER_HASHRATE_MIN)
hashrate_min = "50%"
# The most a GPU's ten-minute average can honestly be, in the same forms; over
# it the figure is wrong and is reported, never restarted. 0 turns it off
# (--hashrate-max, FEARMINER_HASHRATE_MAX)
hashrate_max = 0
# Seconds a GPU may stay under --hashrate-min before the miner exits for a
# restart; 0 never restarts it (Degraded and the alert only)
# (--hashrate-grace, FEARMINER_HASHRATE_GRACE)
hashrate_grace = 300
# The reference the percentages of --hashrate-min and --hashrate-max refer to,
# in H/s (`600M`): one value for every card, or one per card in engine order,
# comma separated. Learnt when not given: the best ten-minute average seen
# this session
# (--hashrate-reference, FEARMINER_HASHRATE_REFERENCE)
# hashrate_reference = <RATE[,RATE...]>
# How many expected share intervals (the difficulty over the card's rate) a
# GPU may go without finding a share, never under 10 minutes, before it is
# Degraded and its search restarted; a second famine exits for a restart (code
# 11). 0 turns it off
# (--share-famine, FEARMINER_SHARE_FAMINE)
share_famine = 5
# Shares of one GPU the pool may refuse in a row (stale ones aside) before the
# card is Degraded until it has a share accepted; also the solutions the CPU
# re-check may refuse within ten minutes. 0 turns it off
# (--max-rejects-device, FEARMINER_MAX_REJECTS_DEVICE)
max_rejects_device = 5
# Shares the pool may refuse in a row, from any device, before the session is
# reconnected; a second such run moves to the next pool. 0 turns it off
# (--max-rejects, FEARMINER_MAX_REJECTS)
max_rejects = 15
# Submits left unanswered by the pool for --submit-timeout, in a row, before
# the session is reconnected; a second such run moves to the next pool. 0
# turns it off
# (--max-no-submit-responses, FEARMINER_MAX_NO_SUBMIT_RESPONSES)
max_no_submit_responses = 10
# Restarts blamed on one GPU within --restart-window before it is Quarantined
# at the next start: left out of mining while the others carry on, until the
# miner is restarted. Never the last device that could mine. 0 turns it off
# (--device-quarantine, FEARMINER_DEVICE_QUARANTINE)
device_quarantine = 3
[notifications]
# Send the alerts to this URL as JSON (POST, format version 1, see the
# README); repeat it, or separate the URLs with commas, for several. Retried
# on a 5xx or a network error, never on a 4xx
# (--notify-url, FEARMINER_NOTIFY_URL)
# notify_url = []
# Send the alerts to a Telegram chat through a bot: the bot's token and the
# chat id, as BOT_TOKEN:CHAT_ID
# (--notify-telegram, FEARMINER_NOTIFY_TELEGRAM)
# notify_telegram = <BOT_TOKEN:CHAT_ID>
# Send the alerts to a Discord channel through its webhook URL
# (--notify-discord, FEARMINER_NOTIFY_DISCORD)
# notify_discord = <WEBHOOK_URL>
# Sign each --notify-url body with HMAC-SHA256 under this secret
# (X-FearMiner-Signature: sha256=<hex>), so the receiver can check it came
# from this miner
# (--notify-secret, FEARMINER_NOTIFY_SECRET)
# notify_secret = <SECRET>
# The least severity that is sent: info, warning, error or critical
# (--notify-min-severity, FEARMINER_NOTIFY_MIN_SEVERITY)
notify_min_severity = "warning"
# Send one test message (a rig_up) to every notifier and the heartbeat's
# /start, print what happened, and exit: 0 when every delivery went through, 1
# otherwise
# (--notify-test)
notify_test = false
# Ping this URL every 60 s (GET; POST with --heartbeat-post), plus <URL>/start
# at startup and <URL>/fail on a critical event, the healthchecks.io
# convention; an Uptime Kuma push URL works as is
# (--heartbeat-url, FEARMINER_HEARTBEAT_URL)
# heartbeat_url = <URL>
# POST the heartbeat with a small JSON body (hashrate, effective hashrate,
# shares, uptime, restarts) instead of a GET
# (--heartbeat-post, FEARMINER_HEARTBEAT_POST)
heartbeat_post = false
[oc]
# Core clock offset in MHz, signed (+100, -50), applied through the driver
# (NVIDIA, driver 520 or later). One value for every card, or one per card in
# -d order (100,_,-50: _ leaves that card alone). Without any OC option the
# miner touches no clock, power limit or fan register. Read back after it is
# set; refused with its code when the driver says no (E703: run as root with
# --allow-root)
# (--cclock, FEARMINER_CCLOCK)
# cclock = <MHZ[,MHZ...]>
# Lock the core clock at this many MHz (what nvidia-smi -lgc does); 0 removes
# the lock. One value for every card, or one per card in -d order. The driver
# cannot read a lock back, so at exit the lock is reset to the driver's
# default
# (--lock-cclock, FEARMINER_LOCK_CCLOCK)
# lock_cclock = <MHZ[,MHZ...]>
# Memory clock offset in MHz, signed (+800, -500). One value for every card,
# or one per card in -d order
# (--mclock, FEARMINER_MCLOCK)
# mclock = <MHZ[,MHZ...]>
# Lock the memory clock at this many MHz (nvidia-smi -lmc), which must be one
# of the steps the card publishes (405, 810, 5001, 10251...; E701 lists them
# otherwise); 0 removes the lock. One value for every card, or one per card in
# -d order
# (--lock-mclock, FEARMINER_LOCK_MCLOCK)
# lock_mclock = <MHZ[,MHZ...]>
# Power limit, in watts (220) or as a percentage of the card's default limit
# (80%), inside the range the card publishes (E702 shows the minimum and the
# maximum otherwise). One value for every card, or one per card in -d order
# (--pl, FEARMINER_PL)
# pl = <W|N%[,...]>
# Fan speed in percent (70%), or auto to give the fan back to the driver's
# curve. One value for every card, or one per card in -d order. A card without
# fan control (a laptop) refuses it (E704)
# (--fan, FEARMINER_FAN)
# fan = <N%|auto[,...]>
# Seconds to wait, after a card has started mining (its first accepted share,
# or 30 s at most), before its core offset and lock are applied: for the rigs
# that crash when the offset lands on a cold card. 0 applies them at start
# with the rest
# (--oc-delay, FEARMINER_OC_DELAY)
oc_delay = 0
# Ignore every OC option and any [oc] section of the file: the miner touches
# no clock, power limit or fan register, and says so at start. For a rig whose
# OC is set outside (HiveOS, Afterburner, a script)
# (--no-oc, FEARMINER_NO_OC)
no_oc = false
# Put every selected card at the driver's defaults (locks removed, offsets at
# 0, the default power limit, the fan on its curve) before the OC options are
# applied
# (--oc-reset-on-start, FEARMINER_OC_RESET_ON_START)
oc_reset_on_start = false
# Run this program once per card before mining starts, directly, never through
# a shell, with FEARMINER_DEVICE, FEARMINER_PCI_BUS, FEARMINER_UUID and
# FEARMINER_ALGO in its environment; 30 s at most, the exit code logged (E707
# when not 0)
# (--oc-script, FEARMINER_OC_SCRIPT)
# oc_script = <PATH>
# A set per algorithm, applied at start for the algorithm mined, over the [oc]
# values above and under the environment and the command line: one table per
# algorithm of the engine index ([oc.quantus], [oc.randomx], [oc.pearl],
# [oc.tensorcash], [oc.commonfoundry]), with any of the six value options
# (cclock, lock_cclock, mclock, lock_mclock, pl, fan), one value for every
# card or one per card in -d order, as under [oc]. --dry-run prints the sets
# and the policy they make.
#
# [oc.quantus]
# cclock = 100
# lock_mclock = "5001,_"
# pl = "80%"
[commands]
# Which commands a running miner takes beyond the reversible ones: read (the
# default: pause, resume, toggle and retune only), operate (restart and stop
# too), sensitive (the wallet, the pools and the overclocking too). A command
# over the level is refused with E217, a valid token or not
# (--unrestricted-api, FEARMINER_UNRESTRICTED_API)
unrestricted_api = "read"
# Run this program when EVENT happens, directly, never through a shell, with
# FEARMINER_EVENT and the event's context in its environment; 30 s at most,
# the exit code logged (E139 when not 0). Repeat it, or separate the hooks
# with commas, for several. The events: start, exit, crash, pause, resume,
# pool-switch, share-rejected-high, low-hashrate, temp-high, device-lost
# (--hook, FEARMINER_HOOK)
# hook = []
# Watch the configuration file and reload it when it changes. Off by default:
# SIGHUP and PUT /api/v1/config reload it either way. A value the new file
# gives that does not validate is refused whole (E220) and the configuration
# in force is kept
# (--watch-config, FEARMINER_WATCH_CONFIG)
watch_config = false
# Run without a console: the process detaches from the terminal and keeps
# mining after the shell that started it is gone. Implies --no-tui (there is
# no screen to draw on); give --log-file to keep the log
# (--background, FEARMINER_BACKGROUND)
background = false
# The whole process's scheduling priority, 0 (idle) to 5 (highest), on the
# same scale as --cpu-priority, which sets the worker threads' priority alone.
# Above 2 needs a privilege on Linux; refused by the OS, it is E613 and the
# miner keeps the normal priority
# (--priority, FEARMINER_PRIORITY)
# priority = <N>уведомления и heartbeat
Настрой оповещения #
Отправляй события майнинга в выбранный сервис оповещений или вебхук. Heartbeat покажет, продолжает ли риг выходить на связь.
Подробности и поведение
В чат Telegram, канал Discord, твой собственный webhook или во все три.
--notify-test | отправляет по одному rig_up каждому и на /start heartbeat, печатает итог по каждому получателю, выходит с 0, когда каждая доставка прошла |
|---|---|
| каждое сообщение | называет риг: имя воркера, иначе имя хоста |
| событие | неблокирующая запись в ограниченную очередь |
| доставка | таймаут 10 с, повтор через 5, 30 и 120 с при 5xx или сетевой ошибке, никогда при 4xx |
Токен бота, токены webhook и секрет никогда не попадают в журнал.
$ fearminer -o stratum+ssl://POOL:PORT -u YOUR_WALLET --notify-telegram BOT_TOKEN:CHAT_ID --notify-test $ fearminer -o stratum+ssl://POOL:PORT -u YOUR_WALLET --notify-discord https://discord.com/api/webhooks/... $ fearminer -o stratum+ssl://POOL:PORT -u YOUR_WALLET --notify-url https://example.com/hook --notify-secret SECRET --notify-min-severity error $ fearminer -o stratum+ssl://POOL:PORT -u YOUR_WALLET --heartbeat-url https://hc-ping.com/UUID
События
События #
| событие | важность | когда |
|---|---|---|
rig_up | info | Майнер запущен и майнит. |
rig_down | critical | Чистая остановка, или супервизор сдался. |
gpu_down | error | Карта, которую драйвер объявил пропавшей (Lost). |
gpu_unstable | warning | Карта, чьи неустаревшие отказы достигли пяти, карта, провалившая самопроверку, или вердикт watchdog по ней. |
gpu_invalid_share | error | Карта отдала решение, которое перепроверка CPU отвергла до отправки; invalid в аннотациях это счёт карты на данный момент. |
gpu_degraded | warning | Карта, которую watchdog держит в Degraded: отказы подряд, голод по шарам (причина в сообщении). |
gpu_quarantined | error | Карта, которую watchdog исключил из майнинга: перезапускалась слишком часто. |
hashrate_low | warning | Скорость ниже 70 % лучшего десятиминутного среднего сессии; с устройством, десятиминутное среднее этой карты ниже --hashrate-min. |
hashrate_recovered | info | Снова на 90 % от него; с устройством, карта снова выше своего минимума. |
hashrate_suspect | warning | Цифра выше --hashrate-max: неверна цифра, не карта. |
temp_high | warning | Карта, удерживаемая термической отсечкой. |
temp_critical | critical | Пауза дольше 10 мин, показание на 10 °C выше предела, или карта за --temp-shutdown, что останавливает майнер. |
shares_rejected_high | warning | Отклонено больше 5 % из 50 и более шар. |
pool_disconnected | warning | Соединение с пулом потеряно или отвергнуто. |
pool_failover | warning | Сессия перешла на резервный. |
pool_recovered | info | Снова на главном, или переподключение. |
wallet_changed | critical | Кошелёк, на который идёт майнинг, не тот, что был в прошлой сессии на этом пуле. |
watchdog_restart | error | Супервизор перезапустил процесс майнинга (причина в сообщении). |
devfee_start · devfee_stop | info | Раунд комиссии начинается, заканчивается. |
block_found | info | Зарезервировано: ни один пул, с которым говорит эта сборка, не сообщает, была ли шара блоком. |
update_available | info | Условия несут более новую версию. |
Что сдерживает шум
Что сдерживает шум #
- --notify-min-severity (по умолчанию warning) это планка, ниже которой ничего не отправляется.
- Ожидает, когда появляется, срабатывает, продержавшись свою задержку подтверждения: hashrate_low 120 с, gpu_down 30 с, temp_high 10 с, pool_disconnected 60 с; остальные немедленно. Пул, вернувшийся за тридцать секунд, не упоминается вовсе.
- Сработавшее условие повторяется не чаще раза в четыре часа и закрывается сообщением, когда проходит: hashrate_low через hashrate_recovered, pool_disconnected и pool_failover через pool_recovered, temp_high возобновлением, gpu_down тем, что карта снова майнит.
- rig_down покрывает gpu_down, который покрывает hashrate_low, как и pool_disconnected: покрытое оповещение не отправляется, и его закрытие тоже.
- То, что набралось за тридцать секунд, уходит одной группой, по сообщению на чат; критическое событие не ждёт. Журнал показывает alert firing: ... и alert resolved: ... для отправленного. /stats считает alerts_firing и notifications_sent.
Webhook
Webhook #
Один POST на уведомление: Content-Type application/json, User-Agent fearminer/<version>, X-FearMiner-Event с именем события и, с --notify-secret, X-FearMiner-Signature, HMAC-SHA256 тела этим секретом. Тело, формат версии 1:
POST твой URL
Content-Type: application/json
User-Agent: fearminer/1.15.2
X-FearMiner-Event: gpu_down
X-FearMiner-Signature: sha256=<hex>
{
"version": 1,
"event": "gpu_down",
"severity": "error",
"status": "firing",
"rig": "rig1",
"ts": "2026-09-22T10:00:00.000Z",
"fingerprint": "gpu_down/rig1/0",
"labels": {"rig": "rig1", "device": "0", "pci": "0000:41:00.0", "device_name": "NVIDIA GeForce RTX 3090", "pool": "stratum+ssl://pool.example.com:3335"},
"annotations": {"cause": "..."},
"summary": "GPU0 lost (reported by the driver)",
"details": ""
}status | firing или resolved |
|---|---|
fingerprint | <event>/<rig>/<device или ->: один и тот же в обоих сообщениях одного оповещения |
labels | только применимые ключи, device, pci и device_name для карты, pool, когда он замешан |
annotations | цифры события (temp_c, cause, latest_version, ...) |
Telegram получает sendMessage простым текстом (без Markdown), Discord content с тем же текстом, по сообщению на группу.
Heartbeat
Heartbeat #
--heartbeat-url | пингуется каждые 60 с (± 10 %), GET, или POST с небольшим JSON-телом при --heartbeat-post |
|---|---|
URL/start | при старте, соглашение healthchecks.io |
URL/fail | при критическом событии, то же соглашение |
Сервис без них (push URL Uptime Kuma со своей строкой запроса) работает с простым URL; его /start и /fail получают 404.
Сбои пишутся на уровне debug, не чаще одного предупреждения в десять минут.
Пинг: таймаут 10 с, майнинг никогда не блокируется.
Под супервизором события и heartbeat шлёт процесс майнинга; супервизор шлёт watchdog_restart и, сдаваясь, rig_down, с теми же настройками.
GET https://hc-ping.com/UUID каждые 60 с
GET https://hc-ping.com/UUID/start при старте
GET https://hc-ping.com/UUID/fail при критическом событии
POST {"rig","hashrate_hs","hashrate_effective_hs","shares_accepted","shares_rejected","uptime_secs","restarts","alerts_firing"} --heartbeat-postAPI
Используй локальный API #
Читай состояние майнинга и отправляй команды из своих инструментов. По умолчанию API слушает loopback-адрес рига.
Подробности и поведение
Версионированный API рядом с /stats, на 127.0.0.1:4300 по умолчанию: чтение и три записи.
POST /api/v1/oc | установка на карте |
|---|---|
POST /api/v1/commands | команда |
PUT /api/v1/config | перечитывание конфигурации |
--api-bind 0.0.0.0:4300 | открывает его в LAN |
--no-api | выключает |
Каждый объект под /api/v1 несёт api_version (1), версию пути.
Сервер работает до загрузки условий и до первого подключения (нули и null до тех пор, mode уже задан) и остаётся доступным через переподключения и раунды комиссии.
Прочитай хэшрейт локального майнера. Фрагмент примера ответа:
curl -s http://127.0.0.1:4300/api/v1/summary | jq .hashrate
{ "local_hs": 618400000, "local_10m_hs": 611900000, "session_hs": 609800000, "effective_hs": 598200000, "effective_pct": 97.8 }Единицы в именах полей.
_hs | хэшей в секунду |
|---|---|
_c | градусы Цельсия |
_w | ватты |
_s | секунды |
_pct | проценты |
429 с Retry-After | сверх 20 запросов в секунду на клиента на /api/v1/* и /openapi.json |
405 с Allow | метод, которого путь не принимает |
Значение, которое ещё нельзя вычислить, это null.
Каждой записи, POST /api/v1/oc, POST /api/v1/commands, PUT /api/v1/config, нужен токен откуда угодно, включая эту машину.
Файл токена читаем только пользователем майнера.
Токен #
| TCP-пир на loopback | токен не нужен; это привязка по умолчанию |
|---|---|
| с другой машины | только с --api-bind 0.0.0.0:4300: каждый запрос к /api/v1/* должен нести Authorization: Bearer <token> |
| три записи | он нужен откуда угодно, включая эту машину |
| неверный токен | 401, откуда угодно |
/healthz, /readyz, /stats, /hive-stats, /mmpos | его никогда не спрашивают |
Токен: 32 случайных байта в base64url, создаётся при первом старте в <state dir>/api_token (права 0600); стартовый журнал говорит, где он, но не какой.
fearminer token show печатает его, fearminer token rotate заменяет; работающий майнер держит загруженный, пока не перезапустится.
Токен никогда не ставится в URL.
Методы управления и примеры
| эндпоинт | токен | что возвращает |
|---|---|---|
PUT /api/v1/config | откуда угодно | Нужен токен откуда угодно. Пустое тело: перечитать из файла, окружения и командной строки. {"set": {"temp_limit": "85"}}: эти ключи над всеми источниками, побеждают при каждом следующем перечитывании, пока не будут записаны снова или записаны как null, что возвращает ключ файлу. Проверяется целиком до того, как что-либо применено; конфигурация, не прошедшая проверку, это 422 с E220, и ничего не меняется. Отвечает {api_version, source, changed[], restart_required[], held[]}. 400: ключ, который не опция. 422: ключ, которому нужен перезапуск (E219). 409: запуск без конфигурации, которую можно перечитать. |
POST /api/v1/commands | откуда угодно | Нужен токен откуда угодно: {"command": "pause", "devices": [0, 1]}, devices необязательно, опускается для всего рига. pause, resume, toggle и retune принимаются по умолчанию; restart и stop требуют --unrestricted-api operate, иначе 403 с E217. Отвечает {api_version, command, outcome, paused, paused_devices}. 400: имя, которое не команда (E216). 404: карта, на которой этот запуск не майнит (E218). Чтения по этому пути нет. |
POST /api/v1/oc | откуда угодно | Нужен токен откуда угодно, включая эту машину. Тело: {"device": 0, "core_offset_mhz": 100, "core_lock_mhz": 0, "mem_offset_mhz": 800, "mem_lock_mhz": 10251, "power_limit": "220", "fan": "70%"}; все значения кроме device необязательны, power_limit в ваттах или "80%", fan процент или "auto", фиксация 0 снимает фиксацию. Применяется сразу, читается обратно, записывается для восстановления при выходе. Отвечает {api_version, card}, карта как она показывает после, отклонённое значение в refused с его кодом. 400: тело, которое не является набором. 401: без токена. 404: карта не под управлением разгона. 409: запуск без управления разгоном. |
$ curl -s http://127.0.0.1:4300/api/v1/summary | jq .hashrate $ curl -s -H "Authorization: Bearer $(fearminer token show)" http://rig:4300/api/v1/devices $ curl -s -o /dev/null -w '%{http_code}\n' http://127.0.0.1:4300/readyz $ fearminer token rotate $ curl -s -X POST -H "Authorization: Bearer $(fearminer token show)" -H 'Content-Type: application/json' -d '{"device": 0, "power_limit": "80%"}' http://127.0.0.1:4300/api/v1/oc $ curl -s -X POST -H "Authorization: Bearer $(fearminer token show)" -H 'Content-Type: application/json' -d '{"command": "pause"}' http://127.0.0.1:4300/api/v1/commands $ curl -s -X PUT -H "Authorization: Bearer $(fearminer token show)" http://127.0.0.1:4300/api/v1/config
Под HiveOS порт статистики закреплён на 127.0.0.1:4300, где h-stats.sh читает /hive-stats. На хосте, доступном из недоверенных сетей, закрой порт файрволом, прежде чем открывать его через --api-bind.
Методы чтения состояния
| эндпоинт | токен | что возвращает |
|---|---|---|
GET /api/v1/summary | с другой машины | api_version, version, build, uptime_s, algo, mode, session_connected, pool {url, index, is_primary, switches}, hashrate {local_hs, local_10m_hs, session_hs, effective_hs, effective_pct}, shares {accepted, rejected, stale, invalid, best_difficulty}, fee {rate_pct, seconds_mined_for_fee, seconds_mined_for_user, shares_for_fee, shares_for_user}, efficiency_kh_per_w, restarts, alerts_firing, wallet_changed, time_to_first_share_s, engines[] {algo, role, version, platform, source}, os, service, update_ready, update, engine_index {origin, url, key_id}, bench. |
GET /api/v1/devices | с другой машины | api_version и devices[], по одному на строку таблицы: index, kind, label, name, pci_bus_id, state, hashrate_hs, temp_c, fan_pct, power_w, power_limit_w, clock_mhz, throttle, shares {accepted, rejected, stale, invalid}, efficiency_kh_per_w, crashes; затем датчики, которые могут быть у карты, null когда их нет: temp_mem_c, temp_hotspot_c, energy_mj (счётчик драйвера в миллиджоулях с его загрузки), throttle_reasons (стабильные метки, [] когда нет), ecc_corrected, ecc_uncorrected (волатильные, когда ECC включён), pcie_replays, pcie_gen, pcie_width, pcie_max_gen, pcie_max_width. |
GET /api/v1/pools | с другой машины | api_version, active_index и список резерва: по каждому пулу index, rank, is_primary, is_active и его запись с начала, через переподключения: shares {accepted, rejected, stale, unanswered, best_difficulty} (best_difficulty это лучшая шара, принятая пулом), rejected_by_reason {low_difficulty, stale, duplicate, unknown_job, unauthorized, other}, uptime_s, reconnects, avg_reply_ms, latency_ms (скользящая медиана последних двадцати времён ответа на отправку, null при менее пяти), jobs_duplicate, jobs_replayed, nonce_space_exhausted. |
GET /api/v1/history | с другой машины | Собственная история этого рига: ?from=&to=&step=&metric=&device=. Отвечает {api_version, from_ms, to_ms, step_s, layer, device, clock {drift_ms, gaps, samples}, t_ms[], series[{metric, unit, aggregate, values[]}]}: начала интервалов один раз в t_ms, затем по массиву на метрику, null там, где ничего не выбрано. layer это ответившее разрешение (ten_second, minute, five_minute, hour), step_s шаг интервалов; более мелкий шаг поднимается до шага слоя, а не отклоняется. 400: граница, шаг, метрика или устройство, которых не существует, либо диапазон свыше 20 000 точек (E202). 409: запуск с --history off (E223). |
GET /api/v1/config | с другой машины | api_version и действующая конфигурация, никогда не секрет: пулы с pass "***" и логином, обрезанным по двоеточию, выбор устройств, пороги, api_bind и опубликованные списки reloadable[] и restart_required[] (Управляй работающим майнером). |
GET /api/v1/oc | с другой машины | api_version, enabled (false без опции разгона или с --no-oc), backend, delay_s, cards[], по одной на карту под управлением разгона: index, label, name, pci_bus_id, uuid, wanted (запрошенные значения, null там, где не трогали), readback (core_mhz, mem_mhz, core_offset_mhz, mem_offset_mhz, power_limit_w, fan_pct, fan_manual), applied[], pending[] (придержанные --oc-delay), refused[] (setting, code, reason), restore (что карта показывала до того, как запуск её тронул). |
GET /healthz | никогда | 200 ok, пока процесс отвечает; без данных. Liveness-проверка. |
GET /readyz | никогда | 200 {ready: true}, как только сессия подключена и устройство майнит, 503 {ready: false, reason} до того. Readiness-проверка. |
GET /openapi.json | с другой машины | OpenAPI 3.0 для всего выше, /stats, /hive-stats и /mmpos. fearminer openapi печатает то же; архивы несут его как openapi.json. |
GET /stats · GET /hive-stats | никогда | Объект custom-miner HiveOS: hs в kH/s по каждой карте (по строке CPU на алгоритме CPU), total_khs их сумма, temp, fan, uptime, ver, ar из четырёх элементов ([accepted, rejected, invalid, "invalid per row"]), algo, bus_numbers, state и crashes строк, счётчики (hashes_total, accepted, rejected, shares_invalid, difficulty, best_difficulty, pool_rtt_ms, reconnects, wallet_changed, fee_percent, mode, time_to_first_share_s, hashrate_effective_hs, efficiency_kh_per_w, alerts_firing, ...) и devices с покарточными шарами (включая shares_invalid), эффективностью и датчиками. |
Summary, для примера #
Пример JSON
{
"api_version": 1, "version": "1.15.2", "build": "a1b2c3d4e", "uptime_s": 3600, "algo": "quantus", "mode": "mining",
"session_connected": true,
"pool": {"url": "stratum+ssl://pool.example.com:3335", "index": 0, "is_primary": true, "switches": 0},
"hashrate": {"local_hs": 618400000, "local_10m_hs": 611900000, "session_hs": 609800000, "effective_hs": 598200000, "effective_pct": 97.8},
"shares": {"accepted": 412, "rejected": 3, "stale": 2, "invalid": 0, "best_difficulty": 91200000000},
"fee": {"rate_pct": 2.0, "seconds_mined_for_fee": 72, "seconds_mined_for_user": 3528, "shares_for_fee": 8, "shares_for_user": 404},
"efficiency_kh_per_w": 2150.4, "restarts": 0, "alerts_firing": 0, "wallet_changed": false, "time_to_first_share_s": 12.3
}Описание полей
mode это mining или monitoring. effective_hs и effective_pct это null при менее чем десяти принятых шарах в окне. efficiency_kh_per_w это null без показаний мощности. time_to_first_share_s это null до первой принятой шары. Полная схема каждого объекта: /openapi.json.
Устройство, например #
Пример JSON
{
"api_version": 1,
"devices": [{
"index": 0, "kind": "gpu", "label": "GPU0", "name": "NVIDIA GeForce RTX 4070 Ti", "pci_bus_id": "0000:01:00.0", "state": "Mining",
"hashrate_hs": 618400000, "temp_c": 64, "temp_mem_c": 78, "temp_hotspot_c": null, "fan_pct": 62, "power_w": 271, "power_limit_w": 285, "clock_mhz": 2610,
"throttle": false, "throttle_reasons": ["power_cap"], "energy_mj": 9812044000, "ecc_corrected": null, "ecc_uncorrected": null,
"pcie_replays": 0, "pcie_gen": 4, "pcie_width": 16, "pcie_max_gen": 4, "pcie_max_width": 16,
"shares": {"accepted": 412, "rejected": 3, "stale": 2, "invalid": 0}, "efficiency_kh_per_w": 2281.9, "crashes": 0
}]
}Описание полей
state | одно из состояний Выбирай устройства и управляй ими |
|---|---|
throttle_reasons | [] когда карта не троттлит |
shares.invalid | считает решения, отвергнутые перепроверкой CPU до отправки, которых пул никогда не видел (Проверь корректность и измерь скорость) |
crashes | счётчик этой карты, хранимый между перезапусками |
Датчик, которого карта или драйвер не дают, это null; с --no-nvml все датчики null.
команды и горячее перечитывание
Управляй работающим майнером #
Ставь на паузу, продолжай и применяй поддерживаемые изменения без перезапуска сервиса. Некоторые изменения перезапускают процесс майнинга.
Подробности и поведение
Команды и перечитывание конфигурации работают на запущенном майнере, без перезапуска. Четыре входа: локальный API, терминальная панель, сигнал, файл в каталоге состояния. Ничто отсюда не выходит за пределы машины.
обратимое по умолчанию
pause, resume, toggle и retune это единственные записи, которые майнер принимает по умолчанию. Каждая обратима, ни одна не может двигать деньги.
три уровня
По умолчанию: read. --unrestricted-api operate добавляет restart и stop, которые прекращают майнинг; --unrestricted-api sensitive добавляет кошелёк, пулы и разгон. Выше уровня: отказ с E217, с верным токеном или без, и сказано, как это включить.
ничто не прерывается
Пауза: каждый рабочий поток заканчивает начатый перебор. Перечитывание: конфигурация проверяется целиком, прежде чем что-либо применено. Смена пула: сессия завершается чисто на следующем полусекундном круге. Тот же процесс всё это время продолжает майнить.
Команды #
| команда | уровень | что делает |
|---|---|---|
pause | read | Придерживает риг или названные карты: каждый рабочий поток заканчивает начатый перебор, затем простаивает на самом свежем задании. Соединения не разрываются, ничто не прерывается на середине пачки. Строки показывают Paused (operator). |
resume | read | Майнить снова. Общий resume также отпускает карты, придержанные по одной. |
toggle | read | Пауза, если майнит, продолжение, если на паузе: то же, что шлют SIGUSR1 и клавиша p в терминальной панели. |
retune | read | Перезапускает перебор рига или названных карт на самом свежем задании и с новым зерном. Геометрия запуска измеряется при создании контекста карты и кэшируется на всю жизнь процесса: полный повторный замер это перезапуск с --retune. |
restart | operate | Завершает процесс майнинга; супервизор запускает его снова. Код выхода 14, не считается в --max-restarts. Требует --unrestricted-api operate. |
stop | operate | Остановить майнер насовсем. Требует --unrestricted-api operate. |
Уровень sensitive: кошелёк, ключи пула и логина, наборы разгона. set в PUT /api/v1/config отклоняет их с E217, если майнер не запущен с --unrestricted-api sensitive, какой бы токен ни предъявили.
Уровень защищает API и только его.
| клавиши терминальной панели | нужен терминал, на котором майнер рисует |
|---|---|
| сигнал | нужно право сигналить процессу |
| файл-сигнал | нужна запись в собственный каталог состояния майнера |
<state dir>/stop останавливает майнер, запущенный вообще без расширенного режима.
Четыре способа послать команду
Четыре способа послать команду #
- POST /api/v1/commands, с токеном откуда угодно, включая эту машину (Используй локальный API).
- Терминальная панель: p придерживает весь риг и отпускает его снова, 1..9 по одной карте каждая (1 это GPU0).
- SIGUSR1 переключает паузу рига, по одному на сигнал. Посылается на pid, который знает менеджер служб, то есть супервизору, а тот передаёт его процессу майнинга.
- Файлы-сигналы, токен и право сигналить не нужны: <state dir>/stop, /pause и /resume. Майнер потребляет каждый, то есть удаляет его, в течение секунды. Тот же файл, записанный снова, это та же команда снова. Файл, который не удаётся удалить, это E137, и он не исполняется.
$ curl -s -X POST -H "Authorization: Bearer $(fearminer token show)" -H 'Content-Type: application/json' -d '{"command": "pause", "devices": [0]}' http://127.0.0.1:4300/api/v1/commands $ kill -USR1 $(pgrep -o fearminer) $ touch ~/.cache/fearminer/pause command pause from file: the rig paused command stop from api refused: E217 command not allowed: stop needs --unrestricted-api operate
Каждая команда попадает в журнал с источником (api, tui, signal, file) и результатом, отклонена или нет.
Горячее перечитывание
Горячее перечитывание #
SIGHUP, файл под наблюдением --watch-config и PUT /api/v1/config делают одно и то же.
- Конфигурация перечитывается из файла, затем из окружения, затем из командной строки, за которой остаётся последнее слово, как при старте.
- Проверяется целиком, прежде чем что-либо применено.
- Применяются перечитываемые ключи.
- Печатается, что изменилось, кошелёк первым.
| конфигурация, не прошедшая проверку | отклоняется целиком с E220, действующая сохраняется полностью, майнинг не прерывается |
|---|---|
SIGHUP, --watch-config, PUT /api/v1/config с пустым телом | изменившийся ключ, которому нужен перезапуск, не ошибка: остальное применяется, ключ называется с E219 |
set в PUT /api/v1/config | строже: set, называющий такой ключ, отклоняется с E219 и 422, и из этого запроса не применяется ничего |
$ fearminer -o stratum+ssl://POOL:PORT -u YOUR_WALLET --watch-config --log-file fearminer.log $ kill -HUP $(pgrep -o fearminer) $ curl -s -X PUT -H "Authorization: Bearer $(fearminer token show)" -H 'Content-Type: application/json' -d '{"set": {"temp_limit": "85"}}' http://127.0.0.1:4300/api/v1/config reload SIGHUP: 2 key(s) changed: temp_limit 90 -> 85 · url stratum+ssl://A -> stratum+ssl://B reload 1 key(s) held from the API, over the file: temp_limit (write one as null to hand it back) E219 the change needs a restart: algo (quantus -> randomx) is kept, the rest is applied
GET /api/v1/config отдаёт reloadable[] и restart_required[]; fearminer --help их печатает.
| перечитывается | список пулов и все значения по пулам, тайминги переключения, все пороги --temp-*, все пороги watchdog, адреса оповещений и минимальная важность, heartbeat, уровень журнала, --history-retention, --history-max-size, наборы разгона, применяемые сразу и без --oc-delay |
|---|---|
| требует перезапуска | алгоритм, выбор устройств, число потоков, привязка API, настройки движка и CPU, сетевые опции, файл журнала, сам --history, настройки супервизора, сами опции команд |
Вместе исчерпывающи: каждый ключ, который принимает файл конфигурации, ровно в одном из них.
- Перечитывание, меняющее список пулов, завершает сессию в эфире чисто, на следующем полусекундном круге.
- Ничего в полёте, ничего не числится за пулом.
- Следующая открывается на новом основном пуле, в том же процессе.
- Ключ, записанный через
set, продолжает побеждать файл при каждом следующем перечитывании. - Каждое перечитывание называет удерживаемые ключи, в журнале и в
held[]. - Запись такого ключа как
nullвозвращает его файлу, и уровень для этого не нужен.
Хуки
Хуки #
--hook <EVENT>:<PATH>, повторяемая или через запятую, запускает локальную программу по событию.
- Программа запускается напрямую, никогда через shell.
- Ей даётся 30 с, затем она убивается.
- Её код выхода идёт в журнал,
E139, если он не ноль. - Что бы хук ни ответил, майнинг продолжается.
| --hook | когда срабатывает |
|---|---|
start | Майнер начал майнить. |
exit | Процесс майнинга завершается, чисто. |
crash | Процесс майнинга умер, и супервизор запускает его снова. |
pause · resume | Риг или карта придержаны либо отпущены: команда, терминальная панель, сигнал, файл-сигнал или тепловая отсечка. |
pool-switch | Сессия перешла на другой пул списка или вернулась на основной. |
share-rejected-high | Пул отклоняет слишком много шар (E114, E316). |
low-hashrate | Хэшрейт ниже --hashrate-min после льготного окна (E313). |
temp-high | Карта достигла --temp-limit и поставлена на паузу (E306). |
device-lost | Драйвер сообщил, что карта пропала (E302). |
Контекст приходит в окружении, никогда в командной строке: FEARMINER_EVENT всегда, затем поля, которые есть у события.
FEARMINER_DEVICEFEARMINER_PCI_BUSFEARMINER_UUIDFEARMINER_ALGOFEARMINER_POOLFEARMINER_CODEFEARMINER_SUMMARY
Поля, которого у события нет, нет вовсе, а не пустое, так что скрипт отличает нет карты от карты 0.
Четыре переменные устройства пишутся так же, как их пишет --oc-script.
$ fearminer -o stratum+ssl://POOL:PORT -u YOUR_WALLET --hook temp-high:/opt/rig/hot.sh --hook device-lost:/opt/rig/lost.sh # hot.sh: FEARMINER_EVENT, FEARMINER_DEVICE, FEARMINER_PCI_BUS, FEARMINER_UUID, FEARMINER_ALGO, FEARMINER_POOL, FEARMINER_CODE, FEARMINER_SUMMARY E139 hook script failed: temp-high /opt/rig/hot.sh exited 1 after 0.4 s
--check-configпроверяет форму значения и больше ничего.- Путь проверяется, когда событие происходит, так что
--hook temp-high:/nonexistentпроходит и становитсяE139при первом же перегреве рига. E221(плохой хук) это само значение,<EVENT>:<PATH>, где event существует.
--background · --priority
--background · --priority #
--background | без консоли. Майнер перезапускает сам себя со своими аргументами, в собственной сессии, три стандартных потока на /dev/null, печатает новый pid, возвращает 0 |
|---|---|
--priority от 0 до 5 | задаёт приоритет планировщика всему процессу |
--cpu-priority | двигает только рабочие потоки |
Вызвавший shell свободен; закрытие терминала не уносит ни один из процессов.
Задай вместе с этим --log-file, иначе журнал уходит в никуда и прочитать риг можно только через API.
Выше 2 требует привилегии на Linux; при отказе ОС: E613, и майнер остаётся с обычным приоритетом.
история
Читай историю майнинга #
Каждый риг хранит свою историю. Читай её из командной строки или через API.
Подробности и поведение
Каждый риг хранит собственную историю, в своём каталоге состояния: ни сервера, ни базы данных, настраивать нечего.
Она отвечает офлайн; дашборд читает те же данные по API.
Последние 24 часа держатся в памяти и раз в минуту пишутся в <state dir>/history.bin: перезапуск или kill -9 их не теряет.
На диске те же выборки сворачиваются по мере закрытия каждого окна.
| шаг | хранится | откуда берётся |
|---|---|---|
10 s | 24 h | Одна выборка каждые 10 с, около 8 600 точек, отвечается из памяти, без единого прочитанного байта. |
1 min | 7 d | Одна в минуту, сворачивается по мере закрытия каждой минуты. |
5 min | 30 d | Одна каждые пять минут, на месяц. |
1 h | 90 d | Одна в час, до --history-retention дней, 90 по умолчанию. |
Запрошенный шаг выбирает слой: последний час с шагом 10 с из памяти, прошлый месяц с шагом в час из грубого слоя.
--history-max-size | 32 МБ по умолчанию, жёсткая граница; файл размечен под неё с первого байта |
|---|---|
--history off | ничего не хранит, ничего не пишет |
Она важнее срока хранения: риг со множеством карт хранит меньше дней, а не файл побольше.
Девяносто дней рига с восемью картами: около 7 МБ.
Выборка содержит:
| риг | локальный и эффективный хэшрейт, принятые, отклонённые и неверные шары, мощность рига, дрейф часов, активный пул, состояние рига |
|---|---|
| каждая карта | хэшрейт, температура, вентилятор, мощность и частота |
При свёртке:
- скорости, температуры и проценты усредняются
- счётчики шар складываются
- пул и состояние берутся самые свежие
Каждый ответ говорит, что именно, по каждой метрике, в поле aggregate.
fearminer history #
fearminer history читает файл напрямую: майнер работать не обязан, у сети ничего не спрашивается.
$ fearminer history --from -24h --step 5m $ fearminer history --from 2026-09-15 --to 2026-09-16 --step 1h --metric temp_c --device 0 $ fearminer history --from -7d --step 1h --format json | jq .series[0] time_ms,time,hashrate_hs,hashrate_effective_hs,shares_accepted,temp_c_0 1789776000000,2026-09-19T00:00:00Z,611900000,598200000,37,64 1789776300000,2026-09-19T00:05:00Z,612400000,601100000,41,65
--from, --to | now, -24h, -7d, -90m, -3600s, unix-время в секундах или миллисекундах, метка ISO 8601 в UTC (2026-09-20T10:00:00Z; одна дата это полночь). По умолчанию: сутки назад и сейчас |
|---|---|
--step | 10s, 1m, 5m, 1h, 1d, просто секунды. По умолчанию: самый мелкий слой, достающий до --from. Более мелкий шаг поднимается до шага слоя, а не отклоняется, и ответ называет использованный шаг |
--metric, --device | сужают выдачу |
--format csv | по умолчанию: строка заголовка, по строке на точку, время в ISO 8601 рядом с миллисекундами, пустая ячейка там, где ничего не выбрано |
--format json | тот объект, что отдаёт API |
Нет истории: E223, выход 2.
GET /api/v1/history
GET /api/v1/history #
Те же данные на порту API, запрос в URL: токен с другой машины, как и везде под /api/v1.
$ curl -s 'http://127.0.0.1:4300/api/v1/history?from=-24h&step=5m&metric=hashrate_hs'
{"api_version": 1, "from_ms": 1789689600000, "to_ms": 1789776000000, "step_s": 300, "layer": "minute", "device": null,
"clock": {"drift_ms": 12, "gaps": 0, "samples": 288},
"t_ms": [1789689600000, 1789689900000, ...],
"series": [{"metric": "hashrate_hs", "unit": "H/s", "aggregate": "avg", "values": [611900000, 612400000, null, ...]}]}layer | ответившее разрешение (ten_second, minute, five_minute, hour) |
|---|---|
step_s | шаг интервалов |
| 400 | граница, шаг, метрика или устройство, которых не существует, либо диапазон свыше 20 000 точек (E202) |
| 409 | запуск с --history off (E223) |
Интервал без выборок это null, а не ноль.
Каждая выборка несёт монотонные часы рига и его настенные часы; интервал между двумя это большая из двух разниц.
Перевод часов назад по NTP никогда не делает интервал отрицательным; машина, проспавшая два часа, показывает этот разрыв.
Уход настенных часов: clock.drift_ms и отдельная метрика clock_drift_ms.
history.bin
history.bin #
Заголовок в 64 байта, затем по одному кольцу фиксированного размера на слой. В заголовке:
FEARHIST, магия- версия формата
- версия схемы выборки
- размер записи
- число полей
- число слотов устройств
- ёмкость и шаг каждого слоя
- CRC-32
Запись: двое часов, интервал, значения f32, CRC-32.
Записи минуты уходят одной записью на слой, на собственное место слоя в файле; больше ничто не двигается.
Файл никогда не растёт и никогда не переписывается: самая старая выборка перезаписывается, по одному слоту за раз.
| запись, порванная отключением питания | не проходит CRC: её нет |
|---|---|
| обрезанный файл | читается на то, что в нём есть |
| файл, который не наш | заменяется |
| файл, в который не удаётся писать | E222, сказанное один раз, майнинг не тронут |
Ничто из этого не мешает майнеру стартовать.
Читатель другой сборки или другого языка остаётся совместимым, если:
- проверяет магию
- берёт число полей и размер записи из заголовка, а не зашитые в код
- берёт меньшее из того, что знает сам, и того, что говорит файл
- перешагивает остальное по размеру записи
Поля только добавляются, их никогда не переставляют, не переименовывают и не удаляют.
Разбирайся и устраняй неполадки
терминальная панель и журнал
Читай терминальную панель и журналы #
Терминальная панель показывает майнинг на риге. Без интерактивного терминала используй текстовый журнал.
first share accepted after 12.3 s hashrate 588.5 MH/s
Пример вывода. Хэшрейт и принятая шара подтверждают, что майнинг начался и пул принял твою работу.
Показания и клавиши терминальной панели
Терминальная панель это полноэкранная панель: хэшрейт, спарклайн, лента шар, строка на каждую карту, журнал.
l | только журнал |
|---|---|
q | выход |
p | придержать весь риг и отпустить его снова |
1..9 | по одной карте каждая (Управляй работающим майнером) |
--no-tui печатает те же записи простым прокручиваемым журналом, для службы или майнинг-ОС.
--log-file хранит их в файле, в любом режиме.
локальный и эффективный
| большое число | локальный хэшрейт, то, что считают карты |
|---|---|
eff | эффективный хэшрейт, то, что засчитывает пул: сложность шар, принятых за последний час, на это время, и её доля от локального среднего за тот же час |
Разница это устаревшие шары, задержка, удача окна и раунды комиссии.
При менее чем десяти принятых шарах за час eff показывает -, а панель показывает оценку с первой шары, приглушённо, с её погрешностью: ~118.2 T ±41 %.
шары по картам
Каждая строка показывает acc/rej, вердикты пула по шарам этой карты, устаревшие в скобках, плюс счёт invalid, как только перепроверка CPU отвергнет решение до отправки (Проверь корректность и измерь скорость).
- Устаревшая это шара, отвергнутая потому, что её задачи уже не было: задержка, не карта.
- Аппаратная неисправность видна как неустаревшие отказы или растущий счёт
invalid. - Пять неустаревших отказов подряд держат карту в
Degraded(E316); пять поднимаютgpu_unstable.
kH/W
Эффективность, в шапке для рига и в каждой строке: хэши сессии на джоули мощности платы, которую сообщает драйвер (NVML на NVIDIA), с выборкой дважды в секунду.
Мощность платы, а не из розетки: потери блока питания и остальная машина не входят.
- на движке, который её не сообщает (Vulkan, CPU).
Первая минута
Первая минута #
До подключения майнер печатает, куда идёт хэш и на чём он работает: простой журнал (--no-tui) показывает строки ниже, терминальная панель то же в шапке и в строках устройств.
fearminer 1.15.2 (a1b2c3d4e, 2026-09-22) wallet qzjd5MS1GSCpXLYp8DjZASifnkgtUpx5WwhmEzW3ppHdDe3uq (checksum ok) worker rig1 pool stratum+ssl://pool.example.com:3335 (primary) pool stratum+tcp://backup.example.com:3333 (backup 2/2) custody pool (the pool pays the wallet) algo quantus fee 2.00% of the mining time to the fee pool build 1.15.2 (a1b2c3d4e, 2026-09-22) sha256 3a3524b62caa8307 egress stratum+ssl://pool.example.com:3335 · fee pool (one-minute rounds) · cfg.fearminer.com (terms, every 20 min) · telemetry.fearminer.com (telemetry every 15 min: event, install id, format, version, system, mining, hardware, hashrate bucket, features, uptime bucket, errors, pool host; fearminer telemetry show, fearminer.com/telemetry) · download.fearminer.com (engines, hourly) driver NVIDIA 570.86, libcuda.so.1 and libnvidia-ml.so.1 present gpu #0 NVIDIA GeForce RTX 4070 Ti [0000:01:00.0]: compute 8.9, 11470 MB free of 12282 ram 64.0 GB host bare metal, kernel lockdown none, Secure Boot off network dns system · ip any dns pool.example.com → 203.0.113.10 (system resolver) cpu off on 32 threads, 1 GPU (-t N turns it on) connected to stratum+ssl://pool.example.com:3335 (203.0.113.10:3335) fee window: 2.00 % of the time, first round in about 49 min job 9dd830e6 diff 18.25G first share accepted after 12.3 s fee round started (1 min) fee round ended: 2 share(s)
- wallet
- Адрес, проверенный по сети (checksum ok), или UNCHECKED с --ignore-wallet-check. Воркер дописан к нему: ты видишь то, что видит пул.
- pool
- Пулы как заданы в -o: первый главный, остальные резерв по порядку. Кошелёк без пула отклоняется ещё до этой строки (E224).
- custody · fee
- custody: кто платит кошельку (пул). fee: ставка для этого алгоритма, добываемая минутными раундами на отдельном соединении, 2 % на Quantus, 0,85 % на RandomX, 1 % на Pearl, 2 % на TensorCash (её майнит его движок на том же пуле), ничего, когда подписанные условия не называют для него пул комиссии.
- build · egress
- build: версия и первые шестнадцать hex-цифр SHA-256 запущенного бинарника. egress: каждый хост, с которым майнер будет говорить, других нет; telemetry.fearminer.com указан с периодичностью, группами отправляемых полей и тем, где их посмотреть (с --no-telemetry на его месте стоит no telemetry (--no-telemetry)).
- driver · gpu · ram · host · network · dns · cpu
- Предстартовая проверка охватывает: драйвер NVIDIA и его библиотеки; compute capability и свободную память каждой карты против нужд алгоритма; системную память; хост (голое железо или VM, kernel lockdown, Secure Boot). Затем как достигаются пулы (прокси или режим DNS, семейства адресов, доверие при первом контакте), во что разрешается имя каждого пула и кто ответил. Карта, не прошедшая проверку, помечается Excluded с её кодом; остальные майнят. cpu: потоки CPU, майнящие рядом с ними, выключены на риге с GPU, если нет -t N, по одному на физическое ядро на RandomX. Число сверх того, что машина может отдать (все потоки кроме двух и по одному на карту), урезается до него, и строка говорит об этом.
- fee window · fee round
- Когда движки подняты, fee window даёт ставку как долю времени и когда наступит первый раунд. Каждый раунд пишет fee round started (1 min) и fee round ended: N share(s). Ни одна строка не называет пул комиссии. Алгоритм, для которого условия не называют пул комиссии, говорит об этом один раз и майнится бесплатно.
- first share
- Перед первой шарой каждый движок отвечает на свой тест с известными ответами (Проверь корректность и измерь скорость); запуск на том же бинарнике, драйвере и картах пропускает его и говорит об этом. Первый запуск также измеряет несколько геометрий запуска на твоей карте и кэширует лучшую (--retune измеряет заново). Затем первая задача, затем первая принятая шара, названная один раз с её задержкой, /stats несёт её как time_to_first_share_s. При шаре в минуту эффективный хэшрейт что-то значит через десять минут.
Терминальная панель: плывущий хэшрейт, спарклайн с минимумом, средним и максимумом, лента шар, строка на каждую карту (состояние, температура, вентилятор, мощность, acc/rej, время с последней шары) и журнал. Клавиши:
Простой журнал
Простой журнал #
--no-tui печатает по строке на запись: принятые (✔) и отклонённые (✘) шары с картой, сложностью и временем ответа, новые задачи, подключения, вердикты с их кодом.
Раз в минуту строка несёт три хэшрейта, каждый с именем своего окна, затем эффективный:
- мгновенную скорость
- десятиминутное среднее
- среднее за сессию: все хэши с начала на аптайм
- то, что засчитывает пул, с его долей от локального
Строка приходит при любой скорости, по часам процесса: при нуле она называет карту на паузе, как ниже.
--no-color убирает цвет, -v добавляет записи debug.
19:12:14 ✔ 5/6 · GPU0 · 18.25G · 24 ms 19:12:21 hashrate 588.5 MH/s (10m 587.9, session 586.2, eff 580.2 / 98 %) 19:13:21 hashrate 0.0 H/s (10m -, session -, eff -) - GPU0 Paused (mem 106 °C) - shares 3/3 - diff 1.60M
Файл журнала и его ротация
Файл журнала и его ротация #
--log-file PATH пишет каждую запись майнера, в режиме панели или простом, по строке на запись: 2026-09-20T19:33:49.788Z INFO message (UTC, миллисекунды, без цвета), пароль пула заменён на ***.
Дописывается, никогда не обрезается. Ротируется по размеру в PATH.1 ... PATH.N.
--log-max-size | размер ротации, по умолчанию 10 MB |
|---|---|
--log-keep | сколько файлов хранится, по умолчанию 5; --log-keep 0 начинает файл заново |
--log-level-file | свой уровень файла, debug с -v, иначе info, так что debug-файл может идти под тихой консолью |
Неудавшаяся ротация сообщается в консоль, и майнер продолжает писать.
$ fearminer -o stratum+ssl://POOL:PORT -u YOUR_WALLET --log-file fearminer.log --log-level-file debug --log-max-size 10 --log-keep 5 2026-09-20T19:33:49.788Z INFO connected to stratum+ssl://pool.example.com:3335 (203.0.113.10:3335)
ошибки и коды выхода
Разберись в ошибке #
Найди код из журнала или запусти fearminer explain CODE, чтобы узнать причину и способ исправления.
Подробности и поведение
Каждая строка сбоя несёт код и сообщение, больше ничего.
fearminer explain <CODE> печатает причину, последствия и что делать, офлайн.
E1xx | сеть |
|---|---|
E2xx | конфигурация |
E3xx | оборудование |
E4xx | кошелёк |
E5xx | ядра и движки |
E6xx | привилегии и предпосылки производительности (твики MSR, huge pages, помощник) |
E7xx | разгон |
E8xx | служба и удалённое управление |
Выпущенный номер никогда не используется повторно.
$ fearminer explain E302
E302 device lost
cause: The driver reported the card gone in the middle of a search: an Xid error, a PCIe reset, a crash of the card, an overclock or a power supply that cannot hold it.
impact: The card's worker has exited. With the watchdog on, the miner exits with code 10 and the supervisor restarts it (the card comes back with the driver, the process does not get it back); with --no-watchdog the others mine on without it.
action: If it struck after a long stable run, lower the clock or the power limit and try again. If it struck at the first search, check the driver (nvidia-smi, dmesg for Xid) and the riser or slot.Коды выхода #
| код | значение | супервизор |
|---|---|---|
0 | Запрошена остановка (SIGTERM, Ctrl+C, q), чисто. | |
1 | Неклассифицированная ошибка. | перезапускает |
2 | Неверная конфигурация или аргументы, каждый отказ со своим кодом (E2xx; E4xx для кошелька, который не декодируется). | окончательный |
3 | Нет предусловия: нет устройства, движок не стартует, все устройства провалили самопроверку, порт занят, или запуск от root без --allow-root. | окончательный |
4 | Другой экземпляр уже работает (--allow-multiple, чтобы запустить несколько). | окончательный |
10 | Сбой или зависание устройства. | перезапускает |
11 | Вердикт watchdog: нулевой, призрачный или низкий хэшрейт, голод по шарам, нет принятых шар, или карта за --temp-shutdown. | перезапускает |
12 | Супервизор сдался после --max-restarts за --restart-window. | окончательный |
13 | Дочерний процесс умер от сигнала, которого не ждал. | перезапускает |
14 | Выполнена команда restart: супервизор снова запускает процесс майнинга, это не считается в --max-restarts. | перезапускает |
- Супервизор выходит с кодом дочернего процесса, когда не перезапускает его (0, 2, 3, 4).
- 12, когда сдался.
- 0 после запрошенной остановки, убит дочерний процесс или нет.
Лаунчеры останавливаются на 2, 3, 4, 12 и перезапускают на остальных; юнит systemd использует RestartPreventExitStatus=2 3 4 12.
fearminer --help печатает эту таблицу.
Коды ошибок #
Сбой устройства (E302 по E305, E313 по E319, E506 по E508) выдаёт себя временем: на первом поиске это майнер или драйвер, после долгой стабильной работы разгон.
fearminer explain перечисляет все коды; fearminer explain E302, e302 или 302 печатает один.
E1xx · сеть
E101 | pool unreachable |
E102 | TLS handshake failed |
E103 | TLS certificate pin mismatch |
E104 | login refused |
E105 | no job from the pool |
E106 | no pool answers |
E107 | pool address does not resolve |
E108 | connection lost |
E109 | unreadable message from the pool |
E110 | pool accepts no share |
E111 | fee terms not fetched |
E113 | pool answers no submit |
E114 | pool refuses every share |
E115 | proxy connection failed |
E116 | DNS over HTTPS failed |
E117 | name not found by the DoH resolver |
E118 | TLS certificate changed since first use |
E119 | TLS trust file unusable |
E120 | TLS certificate not verified |
E125 | share unanswered |
E126 | pool redirect refused |
E127 | nonce space exhausted |
E128 | job replayed by the pool |
E129 | pool latency over the limit |
E135 | command channel closed |
E136 | command failed |
E137 | sentinel file unusable |
E138 | configuration file not watched |
E139 | hook script failed |
E2xx · конфигурация
E201 | bad pool URL |
E202 | bad option value |
E203 | wrong number of per-pool values |
E204 | wallet required |
E205 | pool required |
E206 | bad device selection |
E207 | stats port unusable |
E208 | log file unusable |
E209 | state directory unusable |
E210 | another instance is running |
E211 | configuration file unusable |
E212 | unknown configuration key |
E213 | bad value in the configuration file |
E214 | this miner cannot run that chain |
E215 | the wallet matches several chains |
E216 | unknown command |
E217 | command not allowed |
E218 | bad command target |
E219 | the change needs a restart |
E220 | reload rejected |
E221 | bad hook |
E222 | history file unusable |
E223 | no history kept |
E224 | wallet without a pool |
E3xx · железо
E301 | no device to mine on |
E302 | device lost |
E303 | device hang |
E304 | zero hashrate |
E305 | ghost hashrate |
E306 | thermal pause |
E307 | NVIDIA driver missing |
E308 | NVIDIA driver too old |
E309 | GPU engine cannot start |
E310 | not enough free GPU memory |
E311 | NVIDIA driver mismatch |
E312 | every worker has exited |
E313 | hashrate low |
E314 | hashrate suspect |
E315 | share famine |
E316 | shares refused in a row |
E317 | device back to mining |
E318 | device quarantined |
E319 | thermal shutdown |
E320 | engine process restarted |
E321 | engine index refused |
E322 | engine index not fetched |
E323 | engine download refused |
E324 | no engine to run |
E325 | engine not supported by this miner |
E326 | engine updated |
E327 | engine update rolled back |
E328 | fee engine started per round |
E329 | machine below the algorithm's requirements |
E4xx · кошелёк
E401 | wallet does not decode for the chain |
E402 | wallet check skipped |
E5xx · ядро и движок
E501 | kernel load failed |
E502 | compute capability unsupported |
E503 | tuning failed |
E504 | degraded kernel |
E505 | share could not be encoded |
E506 | kernel gives wrong results |
E507 | invalid share caught before submit |
E508 | engine refused its own candidates |
E6xx · привилегии и производительность
E601 | helper not available |
E602 | helper call failed |
E603 | MSR tweaks skipped in a virtual machine |
E604 | MSR tweaks skipped under kernel lockdown |
E605 | MSR tweaks skipped: msr module missing |
E606 | MSR tweaks skipped: writes disabled |
E607 | MSR tweaks skipped: no preset for this CPU |
E608 | MSR values not restored |
E609 | huge pages short |
E610 | 1 GB pages unavailable |
E611 | MSR tweaks unavailable on this platform |
E612 | Lock pages in memory right missing |
E613 | priority not applied |
E614 | MSR values restored |
E615 | huge pages not released |
E616 | run named to the helper by its pid alone |
E7xx · разгон
E701 | memory clock is not a step of the card |
E702 | overclock value out of the card's range |
E703 | overclock needs privileges |
E704 | overclock not supported |
E705 | overclock refused by the driver |
E706 | overclock restore file unusable |
E707 | overclock script failed |
E708 | overclock restored |
E8xx · служба и удалённый канал
E801 | no service manager |
E802 | the mining OS runs the miner |
E803 | service manager step failed |
E804 | service not installed |
E805 | service privilege |
E806 | service starts with your session |
E807 | option makes no service |
E808 | a service is already there |
E809 | remote command refused |
E810 | enrolment refused |
E811 | relay refused the rig |
E812 | relay unreachable |
E813 | update refused |
E814 | updater not installed |
E815 | release not downloaded |
E816 | release failed its checks |
E817 | new binary failed its checks |
E818 | update rolled back |
E819 | updated |
E820 | benchmark refused |
Названия принадлежат майнеру, как их печатает explain, без перевода: строка журнала и таблица совпадают слово в слово.
безопасность и доверие
Приватность, загрузки и локальные файлы #
Узнай, куда подключается майнер, что хранит и как проверить загрузку.
Подробности и поведение
FearMiner проверяет кошелёк до первого пакета, при каждом старте говорит, куда идёт хэш, предупреждает, когда он изменился, отказывается от привилегий, которые ему не нужны, и перечисляет каждый хост, с которым говорит.
Проверка кошелька и предупреждение о его смене
Проверка кошелька и предупреждение о его смене #
Проверяется до того, как майнер куда-либо подключится.
| Quantus | SS58-адрес сети Quantus, префикс 189, 32-байтный аккаунт, контрольная сумма blake2b проверяется |
|---|---|
| RandomX | адрес mainnet Monero, обычный, субадрес или интегрированный, контрольная сумма keccak проверяется. Отклоняются по имени: testnet и stagenet |
| TensorCash | адрес TensorCash tc1... segwit (bech32) или адрес base58check этой сети, контрольную сумму проверяет его движок |
- Кошелёк это часть
-uдо.worker. - Суффикс
+diffи префиксsolo:проверку не проходят и уходят как набраны. - Адрес, который не декодируется, или адрес другой сети: отклоняется с причиной, код выхода 2, подключения нет, между сетями ничего не угадывается.
--ignore-wallet-checkотправляет его как набран, предупреждает при старте (E402), помечает баннерUNCHECKED.
Кошелёк также запоминается по хосту пула: хэш хоста и кошелька в wallets.json в каталоге состояния, никогда в открытом виде, после первой принятой шары сессии.
Если файл знает другой кошелёк для этого хоста, следующий старт:
- печатает
WARN wallet changed since the last session on <host> (was <date>) - показывает
wallet changedв шапке - ставит
wallet_changedв/statsи API - отправляет критическое оповещение
wallet_changed - продолжает майнить
Предупреждение возвращается при каждом старте, пока новый кошелёк не заработает шару.
Root и пароли
Root и пароли #
- На Linux и macOS майнер, запущенный от root, выходит с 3.
--allow-rootзапускает его всё равно; пакет HiveOS передаёт эту опцию.- Юнит systemd запускает майнер под отдельным пользователем.
- Супервизор проверяет один раз, до порождения процесса майнинга; на Windows проверки нет.
- Настоящий пароль пула в
-pилиFEARMINER_PASS(всё, кроме принятогоx) виден в списке процессов, и майнер говорит об этом один раз при старте. --pass-fileчитает его из файла, по строке на пул; процесс майнинга видит путь, а не пароль.- О файле, доступном на чтение другим пользователям, предупреждается.
- В файле журнала и в
/api/v1/configпароль это***.
Твики MSR и резервирование huge pages, для которых RandomX нужен root, идут через fearminer-helper (Алгоритмы, комиссии и требования).
- отдельный проверенный бинарник, без сети и без конфигурации
- достигаемый через
sudo -nдо первого подключения и никогда после - майнер, запущенный от root, делает это внутри процесса, без помощника
Установка частоты, лимита мощности или вентилятора требует, чтобы сам майнер был root (--allow-root), либо разгон остаётся снаружи.
Реле не читает зашифрованные сообщения кокпита и не подписывает твои команды. Ему видны IP-адреса соединений, время и объём трафика, идентификаторы ригов, открытые ключи, записи привязки, версии ПО и время последнего контакта.
Если реле недоступно, майнинг продолжается, пока риг восстанавливает связь. Проверенные движки и условия комиссии из кэша или архива позволяют работать без серверов FearMiner. Для майнинга всё равно нужно соединение с пулом.
С чем общается майнер #
- Твой пул, по stratum+tcp или stratum+ssl: каждый пул списка, когда есть резерв; через прокси SOCKS5 из --proxy, который тогда и разрешает имена.
- Пул комиссии, во время минутных раундов комиссии, по своему соединению, через тот же прокси.
- cfg.fearminer.com, за подписанными условиями комиссии, при старте и каждые 20 минут, напрямую, не через прокси, если не задан HTTPS_PROXY. Недоступен: старт задерживается не более чем на пять секунд, майнер работает с последними проверенными условиями (terms.bin) или со встроенными.
- telemetry.fearminer.com, анонимная телеметрия: отчёт, когда работа уже идёт, периодический отчёт каждые 15 мин (--telemetry-interval) и отчёт при штатной остановке, через тот же прокси и резолвер, что и пулы. Полей: 22, групп: 12 (
event,install,format,version,system,mining,hardware,hashrate,features,uptime,errors,pool); никогда кошелёк, имя воркера, имя машины или адрес. Каждое поле и что с ним делается: Что собирает FearMiner. --no-telemetry (FEARMINER_NO_TELEMETRY=1) выключает всё и не отнимает ни одной функции; условия по-прежнему загружаются. - Только если ты их попросишь, напрямую: конечные точки оповещений и heartbeat (api.telegram.org, discord.com, твои URL) и резолвер DNS over HTTPS из --dns doh.
- relay.fearminer.com, только после подключения рига к кокпиту, не раньше: одно исходящее соединение (порт 443) с запечатанными сообщениями, которые читает только твоя ферма, через тот же прокси и резолвер, что и пулы. --remote-relay ставит первым твой собственный ретранслятор.
- download.fearminer.com, подписанный индекс движков при старте и каждый час, движок, когда его нет или вышел новее, а для службы, которую обновляет кокпит, latest.json примерно раз в час и релиз только при запрошенном или автоматическом обновлении (Алгоритмы, комиссии и требования, Движки).
Строка egress при старте перечисляет всё это. Эндпоинт статистики слушает на 127.0.0.1, если --api-bind не говорит иного.
Один dialer на каждое соединение с пулом: --proxy, --dns и --ip одинаково относятся к сессии, пробам и раундам комиссии.
Пока настроен прокси, пул никогда не достигается напрямую (Подключись к своему пулу).
Проверить загрузку
Проверить загрузку #
Каждый релиз несёт SHA256SUMS по своим файлам и SHA256SUMS.minisig, его подпись minisign ключом релиза.
У fearminer verify ключ зашит, и он проверяет, по строке на файл:
- подпись офлайн (Ed25519)
- SHA-256 каждого файла из списка, лежащего в том же каталоге
ok | файл совпал со своей суммой |
|---|---|
MISSING | список его называет, в каталоге его нет. Так и должно быть, если ты скачал не все файлы релиза; это не ошибка |
MISMATCH | файл на месте, его сумма другая. Вот это и есть ошибка: удали и скачай заново |
Выход 0 только когда подпись верна и каждый имеющийся файл совпал.
Всё остальное печатает verification FAILED; do not run this download.
Если дать архив, он ищет SHA256SUMS рядом.
minisign и sha256sum делают то же вручную.
Ключ меняется только с релизом, который об этом объявляет.
$ fearminer verify SHA256SUMS $ fearminer verify fearminer-linux-x86_64.tar.gz $ minisign -Vm SHA256SUMS -P RWQR3owV+nRhfgNJeUBqcRK868S52NFG2BOrIzKpkQ5ey6lCEfM9+3Eg $ sha256sum -c SHA256SUMS --ignore-missing PS> .\fearminer.exe verify SHA256SUMS PS> Get-FileHash .\fearminer-windows-x86_64.zip -Algorithm SHA256
Суммы покрывают и sbom.cdx.json, спецификацию CycloneDX бинарника: каждый компонент внутри с его версией, для сверки с базами уязвимостей.
Бинарники Linux и Windows несут список зависимостей в секции, которую читает cargo audit bin.
Каждый архив несёт THIRD-PARTY-NOTICES.txt, лицензии открытых компонентов внутри.
Почему бинарники не подписаны
Почему бинарники не подписаны #
Бинарники пока не подписаны, поэтому Windows и macOS останавливают их при первом запуске; антивирусы относят любой майнер к HackTool или CoinMiner. Первое говорит, что издатель неизвестен, второе, что программа майнит.
Сначала проверьте загрузку. Каждый релиз несёт SHA256SUMS по своим файлам и SHA256SUMS.minisig, его подпись minisign ключом релиза. У fearminer verify этот ключ зашит: подпись офлайн, затем SHA-256 каждого названного в суммах файла в том же каталоге; выход 0 только когда всё совпало. minisign проверяет ту же подпись опубликованным ключом. sha256sum, или Get-FileHash в PowerShell, сравнивает хеш вручную с суммами со страницы релиза.
При удачной проверке ok печатается по каждому скачанному файлу, а по тем файлам релиза, которых ты не брал, MISSING: выход всё равно 0. Ошибкой считается только неверная подпись или MISMATCH, и тогда verification FAILED; do not run this download: удали, скачай заново. После этого дальше говорит операционная система про отсутствующую подпись, а не про сам файл.
Подпись в планах, без даты: сертификат Authenticode и учётная запись разработчика Apple это ежегодный счёт. А пока значение имеет подпись на SHA256SUMS, которую ты можешь проверить сами и офлайн.
Что он пишет на диск
Что он пишет на диск #
Каждый архив распаковывается в папку с именем архива.
fearminer | майнер (fearminer.exe на Windows) |
|---|---|
start_<algo> | по лаунчеру на алгоритм: та же команда с кошельком в переменной, в цикле перезапуска |
readme.txt | тот же справочник, что и эта страница, офлайн |
openapi.json | описание API |
engines/ | подписанный индекс движков и движки этой платформы: первый старт майнит и без сети |
fearminer-helper | только Linux: привилегированный помощник для RandomX (Алгоритмы, комиссии и требования) |
~/.config/fearminer/tuning.json | Кэш настройки GPU (%USERPROFILE%\.config\fearminer на Windows, ~/Library/Caches/fearminer на macOS). |
~/.cache/fearminer/ | Каталог состояния (%USERPROFILE%\.cache\fearminer на Windows; FEARMINER_STATE_DIR переносит его), с файлами ниже. |
terms.bin · fearminer.lock · crashes.json | Последние проверенные условия; блокировка одного экземпляра; счётчики сбоев по картам. |
selftest.json · bench-<algo>.json | Вердикты самопроверки по каждому движку (бинарник, драйвер, карты, на которых он пройден); последний бенчмарк по каждому алгоритму, с его контрольной суммой. |
tls-pins.json · oc-restore.json | Сертификаты, запомненные --tls-tofu, с ключом host:port; то, что показывала каждая карта до того, как разгон её тронул, с ключом UUID, пока не возвращено. |
/run/fearminer-helper/msr.json | Пишется помощником, принадлежит root, только на Linux: исходные значения MSR до msr restore или следующей загрузки. |
history.bin | Собственная история этого рига, по одному кольцу фиксированного размера на разрешение, ограниченная --history-max-size (32 МБ по умолчанию) и никогда не растущая за неё (Читай историю майнинга). |
stop · pause · resume | Файлы-сигналы, которые оркестратор без токена создаёт, чтобы поставить риг на паузу, продолжить или остановить его: майнер исполняет за секунду и удаляет файл (Управляй работающим майнером). |
wallets.json · watchdog.log · api_token | Отпечатки кошельков по хостам пулов (хэш, никогда не кошелёк); журнал супервизора, не больше 256 KB; токен API, читаемый только тобой. |
telemetry-id | Идентификатор установки телеметрии, 32 случайные hex-цифры, и версия его последнего запуска, читается только твоей учётной записью; с --no-telemetry не записывается никогда; fearminer telemetry rotate-id заменяет его. |
engines/ | Кэш движков: подписанный индекс движков и две последние версии движка каждого алгоритма, каждая проверяется по индексу перед каждым стартом. |
remote-commands.log · remote-sheet.json · benchmark-run.json · benchmark-last.json · update-health.json | Команды фермы, выполненные или отклонённые, и применённый ею лист майнинга; бенчмарк, запрошенный кокпитом, затем его итог; то, чего ждёт обновление, когда новый майнер запущен. |
fearminer.toml | Читается, никогда не пишется, рядом с бинарником или в каталоге конфигурации. Файл журнала только там, где его называет --log-file. |
Что видит ретранслятор
Что видит ретранслятор #
| связь | одно исходящее соединение от рига, порт 443, открывать порты не нужно, через тот же прокси и резолвер, что и пулы; появляется после подключения рига, не раньше |
|---|---|
| статус | раз в минуту, каждые 10 с, пока открыт кокпит, запечатан так, что прочитать его может только твоя ферма |
| ретранслятор | пересылает запечатанные сообщения; не может их прочитать, не может подключить риг, не может подписать команду |
| команды | подписаны твоей фермой, для одного рига, действуют минуту и один раз: pause, resume, toggle, retune, restart, stop, лист майнинга, update до нового релиза (служба Linux с её механизмом обновления) и benchmark. Каждая, выполненная или отклонённая, записывается в remote-commands.log на риге |
| ретранслятор недоступен | майнинг продолжается; связь восстанавливается сама |
| свой ретранслятор | --remote-relay wss://HOST, пробуется раньше wss://relay.fearminer.com |
FAQ
Устрани неполадки рига #
Начни с наблюдаемого симптома. В каждом ответе есть первая проверка и ссылки на справочник.
Подробности и поведение
Опция или команда, которая отвечает. Когда строка журнала несёт код, первым отвечает fearminer explain <CODE>.
Хэшрейт ниже ожидаемого.
Хэшрейт ниже ожидаемого. #
Проверьте строки предполётной проверки: E308 (драйвер старше, чем нужно ядрам) или E307 (нет libcuda) сажают карту на Vulkan, примерно треть скорости. В строке должно быть Mining, а не Paused (temp), Degraded (причина в строке) или Excluded. Низкий eff при нормальной локальной скорости это пул: устаревшие шары, задержка. --retune заново измеряет геометрию запуска после смены драйвера. --benchmark --duration 30 меряет без пула; --bench-seed 1 добавляет контрольную сумму для сравнения двух запусков.
GPU показывает Paused (temp 91 °C).
GPU показывает Paused (temp 91 °C). #
Термическая отсечка. Датчик указан в строке: temp для ядра, mem для памяти. Ядро возобновляет работу при --temp-resume (75 °C), память при пределе минус --temp-hysteresis (10 °C). Для паузы нужно --temp-hold (15 с) выше предела; всплеск ничего не делает. Улучши продув или снизь лимит мощности инструментом вендора. --temp-limit 85 останавливает раньше, --temp-limit 0 отключает отсечку по ядру, --temp-limit 85,80,_ задаёт карте 1 своё значение. temp_critical после десяти минут паузы; --temp-shutdown 95 останавливает майнер, если карта греется на паузе дальше.
Шары отклоняются.
Шары отклоняются. #
Устаревшая (в скобках) пришла, когда её задачи уже не было: задержка до пула, безвредна в пределах нескольких процентов; ближний пул или резерв помогают. Неустаревший отказ на одной карте это карта: снизьте её разгон. Пять подряд держат её в Degraded до принятия одной (E316) и поднимают gpu_unstable. invalid это решение, отвергнутое CPU до отправки, та же неисправность карты, пойманная раньше (E507). Отказы на всех картах разом это пул или логин: пятнадцать подряд переподключают сессию (E114); fearminer explain E110.
Моя карта показывает Degraded или Quarantined. Что дальше?
Моя карта показывает Degraded или Quarantined. Что дальше? #
Degraded это подозрение, причина в строке, и карта продолжает майнить: десятиминутное среднее ниже --hashrate-min (E313, перезапуск после --hashrate-grace, если так и остаётся), отказы подряд (E316, снимается следующей принятой шарой), голод по шарам (E315, её поиск перезапущен). На первом поиске это майнер или драйвер; после долгой стабильной работы разгон: снизь его. Quarantined (E318): карта уронила майнер --device-quarantine раз (3) за --restart-window (30 мин), пропускает этот запуск, остальные майнят. Устрани причину (разгон, райзер, драйвер) и перезапусти; --reset-crashes очищает счётчики, --device-quarantine 0 выключает правило.
Самопроверка провалилась на карте.
Самопроверка провалилась на карте. #
Неверный ответ на известный вход (E506): карта исключена из запуска, Excluded (E506) в её строке, остальные майнят. Запусти fearminer --self-test на стоковых частотах: провал и там это неисправность железа или драйвера (dmesg на Xid, райзер, слот, переустановка драйвера); проход на стоке и провал в разгоне это разгон. Предупреждение в строке вердикта (E508) другое: движок отверг часть собственных кандидатов, шары в безопасности, ядро теряет немного, карта майнит дальше.
Кошелёк отклонён (E401, E214, E215).
Кошелёк отклонён (E401, E214, E215). #
E401: адрес не декодируется для сети или принадлежит другой сети (testnet Monero, адрес Quantus с неверным символом): скопируй его заново из кошелька. E214: этот майнер не может майнить эту сеть. E215: адрес подходит двум сетям, назови одну через -a. --ignore-wallet-check отправляет его всё равно, баннер пишет UNCHECKED, и пул отвергает шары или платит кому-то другому.
Пул недоступен (E101, E107, E106).
Пул недоступен (E101, E107, E106). #
E107 это имя: проверь хост и DNS. Печатается один раз на сбой; повторы уходят в журнал debug, пока имя не разрешится. E101 это порт или файрвол: попробуй простой TCP-порт через stratum+tcp://, TLS-порт через stratum+ssl://. E106 это все пулы списка лежат: майнер перебирает их по кругу и никогда не выходит. Добавь резервный пул вторым -o.
Как запускать при загрузке?
Как запускать при загрузке? #
fearminer service install с опциями запуска (fearminer service install -o stratum+ssl://POOL:PORT -u YOUR_WALLET -w rig1): служба твоей учётной записи, стартует с машиной и перезапускается после сбоя, без пароля; systemd на Linux, launchd на macOS, задание при входе на Windows. --system через sudo устанавливает вместо неё службу всей машины. Одна строка из Настрой первый риг делает это за тебя. HiveOS: flight sheet. Служба.
Как запустить несколько ригов?
Как запустить несколько ригов? #
Кокпит (Управляй ригами из кокпита) показывает их все на одном экране и задаёт, что майнит каждый. Без него: Один кошелёк везде, своё имя воркера на риг (-w rig1, rig2, ... или WALLET.rig1): пул показывает их раздельно, и каждое оповещение называет свой риг. По fearminer.toml на риг с worker = "${HOSTNAME}" правок не требует. --api-bind 0.0.0.0:4300 на каждом плюс fearminer token show по разу на риг дают дашборду API; --heartbeat-url на риг скажет, какой из них замёрз.
Где лежат файлы?
Где лежат файлы? #
Каталог состояния ~/.cache/fearminer (%USERPROFILE%\.cache\fearminer на Windows): terms.bin, fearminer.lock, crashes.json, wallets.json, selftest.json, bench-<algo>.json, watchdog.log, api_token, history.bin. Кэш тюнинга ~/.config/fearminer/tuning.json (~/Library/Caches/fearminer на macOS). Файл конфигурации читается рядом с бинарником или в ~/.config/fearminer, %APPDATA%\fearminer, ~/Library/Application Support/fearminer; файл журнала только там, где его называет --log-file. Ферма, обновления и кэш движков хранят там ещё несколько файлов (Что он пишет на диск).
Как берётся комиссия?
Как берётся комиссия? #
2 % на Quantus, 0,85 % на RandomX, 1 % на Pearl, 2 % на TensorCash, печатается в --list-algorithms и в шапке терминальной панели. Добывается минутными раундами на отдельном соединении с пулом комиссии, никогда на твоей сессии. При старте: fee window: 2.00 % of the time, first round in about N min; каждый раунд пишет fee round started (1 min) и fee round ended: N share(s); оповещения это devfee_start и devfee_stop; /api/v1/summary считает секунды и шары каждой стороны. Ставка это потолок: подписанные условия могут снизить её или отключить для алгоритма, но никогда не поднять. У TensorCash раундов нет: его движок держит сессию с пулом и сам майнит комиссию там же, на аккаунт FearMiner.
Майнер сам перезапускается. Почему?
Майнер сам перезапускается. Почему? #
Вердикт watchdog перезапустил процесс майнинга. Строка консоли supervisor: ... и watchdog.log несут причину и её код (E302 потеряна, E303 зависание, E304 нулевой хэшрейт, E305 призрак, E313 низкий хэшрейт, E315 голод по шарам, E110 нет принятых шар на двух пулах, E319 термическое отключение). fearminer explain <CODE> говорит, что делать. Счётчик сбоев в строке называет карту; карта, обвинённая три раза за тридцать минут, пропускает следующий запуск (Quarantined). Пять перезапусков за тридцать минут: он сдаётся с кодом выхода 12, и --on-failure script:<path> запускает твой скрипт.
Он отказывается работать от root.
Он отказывается работать от root. #
По замыслу (код выхода 3): майнеру не нужны привилегии. Запускай его под своей учётной записью или выделенной; юнит systemd задаёт User=. --allow-root запускает его всё равно, как делает пакет HiveOS. То, для чего RandomX нужен root на Linux, твики MSR и huge pages, идёт через fearminer-helper (Алгоритмы, комиссии и требования), маленький отдельный бинарник, достигаемый через sudo -n до первого подключения. Только разгон требует, чтобы сам майнер был root.
Мой GPU не NVIDIA и не Apple.
Мой GPU не NVIDIA и не Apple. #
Он работает на движке Vulkan, на доле скорости нативного ядра; предстартовая проверка говорит об этом. Vulkan и Metal берут первые N карт, так что -d принимает только 0..N-1. Алгоритму только для CPU (RandomX) GPU не нужен.
Windows пишет «неизвестный издатель»; антивирус ругается.
Windows пишет «неизвестный издатель»; антивирус ругается. #
Бинарник не подписан: SmartScreen показывает Подробнее, затем Выполнить в любом случае. Некоторые антивирусы помечают любой GPU-майнер; добавьте fearminer.exe в исключения. Вместо подписи: fearminer verify SHA256SUMS (ключ релиза зашит) и строка build при старте, SHA-256 запущенного бинарника, против SHA256SUMS.
RandomX медленный.
RandomX медленный. #
Прочитай блок старта. E609 huge pages short стоит 20 до 30 %; строка MSR с кодом (E601 до E607) до 30 % на Intel, 6 % на Zen; light mode (машина, которая не может вместить датасет 2 ГиБ) намного больше. Строка performance даёт достигнутую долю идеальной конфигурации. fearminer-helper (Алгоритмы, комиссии и требования) делает и то и другое при старте. Без него: Linux, vm.nr_hugepages с числом из строки E609, сразу после загрузки; Windows, Lock pages in memory. Держи 2 ГиБ свободными. Оставь число потоков по одному на физическое ядро; -t принимает число, процент или сдвиг.
Может ли майнер работать через Tor или прокси?
Может ли майнер работать через Tor или прокси? #
Да. --proxy socks5://127.0.0.1:9050 отправляет каждое соединение с пулом (сессия, пробы, раунды комиссии) через прокси SOCKS5, который разрешает имена пулов: ни один DNS-запрос по пулу не покидает машину, пул .onion работает, и пул никогда не пробуется напрямую, пока задан прокси. Загрузки движков, связь с ретранслятором кокпита и телеметрия идут через тот же прокси; загрузка условий и оповещения идут напрямую. --dns doh скрывает имена от локального резолвера без прокси; --tls-tofu закрепляет самоподписанный сертификат ноды при первом контакте. Подключись к своему пулу.
Разгоняет ли майнер мои карты?
Разгоняет ли майнер мои карты? #
Нет. Без опции разгона ни один регистр частоты, лимита мощности или вентилятора не трогается, и --no-oc говорит об этом при старте. --cclock, --lock-cclock, --mclock, --lock-mclock, --pl и --fan настраивают карту через NVML, читают её обратно и возвращают прежние показания при выходе и после сбоя. fearminer oc show печатает, что показывают карты; fearminer oc reset возвращает их после запуска, убитого без очистки. Для установки нужен root (--allow-root); иначе E703, и майнинг продолжается на частотах карты. Выбирай устройства и управляй ими.
Как подключить дашборд?
Как подключить дашборд? #
Кокпиту на app.fearminer.com (Управляй ригами из кокпита) ничего из этого не нужно. Для своего дашборда: curl http://127.0.0.1:4300/api/v1/summary с самого рига ничего не требует. С другой машины: --api-bind 0.0.0.0:4300 при старте, затем Authorization: Bearer <token>, токен из fearminer token show. /stats и /hive-stats отдают плоский объект HiveOS без токена. /openapi.json описывает каждое поле. GET /api/v1/history отдаёт то, что риг записал сам, с тем шагом, который ты просишь: база временных рядов не нужна (Читай историю майнинга). Трём записям, установке на карте, команде работающему майнеру, перечитыванию конфигурации, нужен токен откуда угодно, и они не выходят за то, что позволяет --unrestricted-api (Управляй работающим майнером).
Пример юнита systemd
# /etc/systemd/system/fearminer.service [Unit] Description=FearMiner After=network-online.target [Service] User=fearminer StateDirectory=fearminer WorkingDirectory=/var/lib/fearminer Environment=HOME=/var/lib/fearminer FEARMINER_NO_TUI=1 EnvironmentFile=/etc/default/fearminer ExecStart=/usr/local/bin/fearminer Restart=always RestartSec=2s RestartPreventExitStatus=2 3 4 12 TimeoutStopSec=30s KillSignal=SIGINT [Install] WantedBy=multi-user.target
Юнит оставляет перезапуски супервизору майнера и позволяет systemd перезапустить всё целиком, только когда тот сдался; окончательные коды не трогаются. FEARMINER_NO_SUPERVISOR=1 в файле окружения отдаёт все перезапуски systemd.
Полный справочник
опции
Найди опцию или команду #
Ищи по имени, переменной окружения или задаче. У каждой записи есть значение, умолчание и действие.
Подробности и поведение
Опция, значение, значение по умолчанию, переменная окружения, что делает.
Каждую опцию можно задать и из окружения как FEARMINER_<OPTION>, и в файле конфигурации под её длинным именем с подчёркиваниями (--temp-limit это temp_limit; --1gb-pages это huge_pages_1g).
Командная строка имеет приоритет над обоими.
Использование
Использование #
fearminer [OPTIONS] [WALLET] [COMMAND]
| опция | значение | по умолчанию | FEARMINER_* | что делает |
|---|---|---|---|---|
WALLET | Кошелёк: то же, что -u, и, как и он, задаётся вместе с пулом (-o); без -a сеть читается по адресу. | |||
-h, --help | Напечатать справку. -h печатает краткую, --help всё: опции, примеры, коды выхода. | |||
-V, --version | Печатает версию, коммит и дату сборки. |
Пул
Пул #
| опция | значение | по умолчанию | FEARMINER_* | что делает |
|---|---|---|---|---|
-o, --url | <URL> | FEARMINER_URL | URL пула: stratum+tcp://host:port, stratum+ssl://host:port или host:port (простой TCP без --tls). Хост резолвится при каждом подключении. Повтор или запятые задают резервные пулы: первый главный, остальные пробуются по порядку при его отказе; возврат к главному, как только он снова отвечает. wss://host[:port]/path для алгоритма, чей движок сам держит сессию с пулом (TensorCash). Псевдоним --pool. | |
-u, --user | <WALLET[.WORKER]> | FEARMINER_USER | Адрес кошелька, имя воркера необязательно, как WALLET.WORKER. Одно значение на все пулы; по одному на пул (повтор или запятые, в порядке пулов), когда резервному нужно другое. Псевдоним --wallet. | |
-w, --worker | <NAME> | FEARMINER_WORKER | Имя воркера, дописывается к --user как WALLET.WORKER, когда у того его нет. | |
-p, --pass | <PASS> | x | FEARMINER_PASS | Пароль пула. Пулы его игнорируют; x по соглашению. На все пулы или по одному на пул, как --user. Настоящий пароль здесь виден в списке процессов; используй --pass-file. |
--pass-file | <PATH> | FEARMINER_PASS_FILE | Пароль(и) пула из этого файла вместо -p: одна строка на все пулы или по строке на пул в порядке пулов. Сильнее -p и FEARMINER_PASS. На Unix предупреждает, когда его могут читать другие пользователи. | |
--ignore-wallet-check | false | FEARMINER_IGNORE_WALLET_CHECK | Отправлять кошелёк без проверки, что это адрес сети алгоритма; баннер тогда пишет UNCHECKED. | |
--tls | false | FEARMINER_TLS | TLS на голом host:port (подразумевается URL stratum+ssl://). | |
--tls-fingerprint | <SHA256> | FEARMINER_TLS_FINGERPRINT | Закрепить TLS-сертификат пула по отпечатку SHA-256 (64 hex-цифры), для самоподписанного сертификата; иначе он проверяется по публичным корням. На все пулы или по одному на пул, как --user (дефис, -, для пула без отпечатка). Псевдоним --tls-cert-sha256. | |
--tls-spki | <sha256/BASE64> | FEARMINER_TLS_SPKI | Закрепить TLS-сертификат пула по SHA-256 его открытого ключа (SPKI), как sha256/BASE64 (нотация HPKP); переживает обновление сертификата с тем же ключом. На все пулы или по одному на пул, как --user (дефис, -, для пула без пина). Приоритетнее --tls-fingerprint для того же пула. | |
--pool-retries | <N> | 3 | FEARMINER_POOL_RETRIES | Попытки подключения к пулу при сетевой ошибке, прежде чем пробуется следующий. Пул, отклонивший логин, оставляется сразу. Все пулы недоступны: майнер бесконечно перебирает их по кругу с паузой до 60 с между кругами. |
--job-timeout | <SECS> | по сети | FEARMINER_JOB_TIMEOUT | Секунды без новой задачи на в остальном живом соединении, прежде чем сессия считается мёртвой: рабочие потоки останавливаются, майнер переподключается как после потери соединения. По сети по умолчанию: 120 quantus, 300 randomx (не чаще одной задачи в минуту), 180 pearl, 300 tensorcash (свой пул оценивает его движок). 0: защита выключена. |
--submit-timeout | <SECS> | 10 | FEARMINER_SUBMIT_TIMEOUT | Секунды, которые отправленная шара ждёт ответа пула, прежде чем считаться без ответа (E125). --max-no-submit-responses таких подряд переподключают сессию. |
--max-latency | <MS> | 0 | FEARMINER_MAX_LATENCY | Максимум времени ответа пула на отправку, в миллисекундах, как медиана последних двадцати ответов. Выше него две минуты: сессия переходит на более быстрый пул списка, если такой есть (E129). 0 отключает. |
-a, --algo | <ALGO> | quantus | FEARMINER_ALGO | Алгоритм или монета для майнинга (--list-algorithms для имён и псевдонимов). По умолчанию: сеть, прочитанная по кошельку; quantus без кошелька. Псевдоним --coin. |
--list-algorithms | Перечислить алгоритмы из индекса движков (закэшированного или из релиза) с их потолком комиссии и выйти; с --json один массив из {name, coin, class, fee_bps, aliases, unit, hive, requirements, refused}. | |||
--engine | <ALGO=VERSION> | FEARMINER_ENGINE | Закрепить движок алгоритма на версии из подписанного индекса, ALGO=VERSION (можно повторять или через запятую): работает эта версия, из кэша или скачанная, и ежечасное обновление этот алгоритм не трогает. | |
--engine-opt | <NAME=VALUE> | FEARMINER_ENGINE_OPT | Опция движка алгоритма, NAME=VALUE (можно повторять или через запятую): --list-algorithms показывает, какие опции есть у алгоритма и какие значения принимает каждая. Опция, которой у алгоритма нет, или значение, которое она не принимает, отклоняется. | |
--tsc-precision | <VALUE> | FEARMINER_TSC_PRECISION | Опция прежнего майнера для точности одного движка: теперь это --engine-opt precision=VALUE, и она по-прежнему задаёт его для алгоритма, у движка которого он есть. Остальные её игнорируют. |
Конфигурация
Конфигурация #
| опция | значение | по умолчанию | FEARMINER_* | что делает |
|---|---|---|---|---|
--config | <PATH> | FEARMINER_CONFIG | Конфигурация из этого TOML-файла, по ключу на опцию. По умолчанию: fearminer.toml рядом с бинарником, затем файл в каталоге конфигурации, если они есть. --config "" не читает ничего. | |
--dry-run | Напечатать действующую конфигурацию и выйти; ни с кем не связывается. Каждый ключ со значением и источником (default, file, env, cli), пароль замаскирован; затем режим, алгоритм, пулы, исключённые карты; затем вердикт --check-config. Выход 0, если майнер запустился бы, 2 с причиной и её кодом иначе. | |||
--check-config | Проверить конфигурацию без майнинга: опции, выбор устройств против карт, которые перечисляет драйвер, список пулов, кошелёк против его сети. Выход 0, если майнер запустился бы, 2 с причиной и её кодом иначе. Ни с кем не связывается. |
Сеть
Сеть #
| опция | значение | по умолчанию | FEARMINER_* | что делает |
|---|---|---|---|---|
--proxy | <URL> | FEARMINER_PROXY | Достигать каждый пул через этот прокси SOCKS5 (Tor: socks5://127.0.0.1:9050); учётные данные как socks5://user:pass@host:port. Имена пулов разрешает прокси: ни один DNS-запрос по ним не покидает машину, и пул .onion работает. Отказавший прокси это неудавшееся соединение: прямого обращения к пулу нет. socks5h:// означает то же. | |
--dns | <MODE> | system | FEARMINER_DNS | Разрешение имён пулов: system (резолвер ОС), doh (DNS over HTTPS по --doh-url, системный резолвер, когда конечная точка не отвечает, но никогда для имени, которого, по её словам, нет), doh-strict (только DNS over HTTPS). DoH скрывает имена лишь от локального резолвера: TLS SNI остаётся видимым. Не имеет значения с --proxy. |
--doh-url | <URL> | https://cloudflare-dns.com/dns-query | FEARMINER_DOH_URL | Резолвер DNS over HTTPS (RFC 8484) для --dns doh и doh-strict. Укажи его IP (https://1.1.1.1/dns-query), когда локальный DNS не может разрешить имя самого резолвера. |
--ip | <any|4|6> | any | FEARMINER_IP | Семейство адресов для подключения к пулу: any (сначала IPv6, IPv4 через 250 мс, побеждает первое соединившееся), 4 или 6. |
--ipv4-only | false | Только IPv4: то же, что --ip 4. | ||
--ipv6-only | false | Только IPv6: то же, что --ip 6. | ||
--tls-tofu | false | FEARMINER_TLS_TOFU | Доверять TLS-сертификату пула при первом контакте, для ноды или P2Pool с самоподписанным сертификатом: отпечаток первого рукопожатия идёт в tls-pins.json в каталоге состояния; любой другой сертификат этого пула далее отклоняется. Пул с --tls-fingerprint или --tls-spki проверяется по своему пину. | |
--tls-insecure | false | FEARMINER_TLS_INSECURE | Принимать любой TLS-сертификат, который предъявляет пул stratum+ssl:// без пина: без проверки цепочки, имени и срока. Для TLS-проброса порта или прокси, когда имя, к которому подключаются, не имя пула. Сессия остаётся зашифрованной, но пул больше не аутентифицируется (E120 при каждом старте). Пул с --tls-fingerprint или --tls-spki сохраняет свой пин, а раунды комиссии идут тем же путём, что и пулы. Отклоняется вместе с --tls-tofu и когда не остаётся пула stratum+ssl:// без пина. | |
--tls-tofu-reset | <HOST:PORT> | Забыть сертификат, запомненный для этого пула (host:port, как печатает строка E118), перед подключением; предъявленный сейчас принимается и запоминается. Повтори для нескольких пулов. | ||
--remote-relay | <URL> | FEARMINER_REMOTE_RELAY | Свой ретранслятор для удалённого управления, пробуется раньше встроенного (wss://relay.fearminer.com): wss://HOST[:PORT] или ws:// для ретранслятора на этой машине или в этой сети. Повтори для нескольких. Ничего не запрашивается, пока риг не подключён. | |
--remote-wallet-delay | <MIN> | 0 | FEARMINER_REMOTE_WALLET_DELAY | Сколько минут новый кошелёк из листа майнинга кокпита ждёт перед применением, с оповещением обоих адресов; любой кокпит или fearminer remote cancel отменяет его за это время. 0, по умолчанию, применяет сразу. |
--no-auto-update | false | FEARMINER_NO_AUTO_UPDATE | Без автообновлений. Риг, установленный как служба Linux, сам ставит новый FearMiner в течение двух часов после того, как увидит его, с той же проверкой подписи и откатом, что и кнопка «Обновить» в кокпите; с этой опцией обновляет только кнопка или fearminer service update. Кокпит может включить или выключить это для одного рига или для всего парка. | |
--enroll | <CODE> | FEARMINER_ENROLL | Подключиться к ферме по этому коду при старте (fm1_..., из «Добавить риг» в кокпите): то же, что fearminer enroll CODE, для службы, flight sheet HiveOS или скрипта развёртывания. Ничего не делает, если риг уже в этой ферме. |
Устройства
Устройства #
| опция | значение | по умолчанию | FEARMINER_* | что делает |
|---|---|---|---|---|
-d, --devices | <LIST> | все | FEARMINER_DEVICES | GPU для майнинга, через запятую: индекс (0), PCI id (pci:0000:41:00.0, 41:00.0 или одна шина, pci:41 в hex либо bus:65 в десятичном), UUID целиком (GPU-3f2a...), всё как печатает --list-devices; вендор (nvidia, amd, intel: все его карты); или исключение с ведущим ! (!1, !pci:41:00.0, !GPU-3f2a..., !nvidia). Списки использования и исключения не смешиваются. Потоки CPU задаёт -t. NVIDIA выбирает названные карты точно; элемент, не совпавший ни с одной картой здесь, это E206, выход 2, если только --device-missing first или last не майнит на имеющихся картах. Vulkan и Metal берут первые N карт, только 0..N-1. Исключить все карты можно: карта показана как Excluded, майнят потоки CPU; без потоков CPU это E301, выход 3. |
--device-missing | <POLICY> | match | FEARMINER_DEVICE_MISSING | Когда -d называет карту, которой нет на этой машине: match отказывает в запуске (E206); first и last сохраняют конфигурацию и майнят на имеющихся картах, покарточные списки (--temp-limit 85,80) накладываются с первой позиции или с последней назад. |
--temp-limit | <C[,C...]> | 90 | FEARMINER_TEMP_LIMIT | Ставить на паузу GPU, чьё ядро держится на этой температуре или выше (в градусах Цельсия) --temp-hold секунд, пока он не остынет до --temp-resume; 0: отсечки по ядру нет. На все карты или по одной на карту в порядке -d (85,80,_,90: _ оставляет значение по умолчанию, более короткий список оставляет остальные при нём). |
--temp-resume | <C[,C...]> | 75 | FEARMINER_TEMP_RESUME | Температура ядра, при которой GPU, остановленный по --temp-limit, возобновляет работу; должна быть ниже --temp-limit. На все карты или по одной на карту в порядке -d. |
--temp-limit-mem | <C> | 105 | FEARMINER_TEMP_LIMIT_MEM | Ставить на паузу GPU, чей датчик памяти держится на этой температуре или выше --temp-hold секунд, пока он не остынет на --temp-hysteresis; 0: отсечки по памяти нет. Карта без датчика по нему не судится. |
--temp-limit-hotspot | <C> | 100 | FEARMINER_TEMP_LIMIT_HOTSPOT | То же для датчика hotspot; 0 отключает. NVML не даёт показания hotspot: на NVIDIA датчик отсутствует и карта по нему не судится. |
--temp-hysteresis | <C> | 10 | FEARMINER_TEMP_HYSTERESIS | Насколько ниже предела должен остыть датчик памяти или hotspot, прежде чем GPU возобновит работу, в градусах Цельсия. У ядра своя пара, --temp-limit и --temp-resume. |
--temp-hold | <SECS> | 15 | FEARMINER_TEMP_HOLD | Секунды, которые датчик должен держаться на пределе или выше, прежде чем GPU остановят; более короткий всплеск ничего не меняет. 0 останавливает при первом показании. |
--temp-shutdown | <C> | 0 | FEARMINER_TEMP_SHUTDOWN | Остановить майнер (код выхода 11, E319), когда ядро GPU на паузе держится на этой температуре или выше --temp-hold секунд, отсчитанных от паузы. 0 отключает; должна быть выше --temp-limit. |
--no-nvml | false | FEARMINER_NO_NVML | Не открывать NVML: нет датчиков GPU (температура, вентилятор, мощность, частота, троттлинг, энергия), каждый датчик null на /api/v1/devices и /stats, майнинг продолжается. Стартовая строка gpu говорит sensors off (--no-nvml): no thermal cut-off. | |
-t, --threads | <N|N%|-N|ALGO:N,...> | FEARMINER_THREADS | Потоки майнинга на CPU: число (8), процент от автоматического выбора (50%, с округлением до потока), сдвиг (-2, +2) или по одному на алгоритм (randomx:16, голое значение для остальных). Автоматически: 0 на риге с GPU (CPU там даёт около 0,5 % скорости за 17 % мощности), все потоки кроме двух без GPU; RandomX по одному потоку на физическое ядро с ограничением по кэшу L3 (2 МиБ на поток). Больше, чем машина может отдать (все потоки кроме двух, по одному на карту), урезается до этого, и строка cpu в журнале говорит об этом (asked 999 with -t, capped to 30 of 32). | |
--igpu | false | FEARMINER_IGPU | Майнить и на встроенных GPU, даже рядом с дискретным. | |
--skip-preflight | false | FEARMINER_SKIP_PREFLIGHT | Игнорировать вердикт проверок перед первым подключением (версия драйвера, compute capability, свободная память GPU): отчёт печатается, ни одна карта не исключается, ничто не останавливает запуск. | |
--retune | false | FEARMINER_RETUNE | Измерить геометрию запуска GPU заново, игнорируя кэшированный результат. | |
--self-test | [=<ALGO>] | FEARMINER_SELF_TEST | Тест движков с известными ответами. При майнинге принудительно выполняется на старте (иначе пропускается, когда тот же бинарник, драйвер и карты уже прошли его). Отдельно, без пула и кошелька: офлайн для алгоритма из -a (--self-test=ALGO для другого, --self-test=all для всех), вердикт по каждому устройству, выход 0, или 3 при сбое. | |
--self-test-nonces | <N> | 256 | FEARMINER_SELF_TEST_NONCES | Число nonce, которые самопроверка ищет на каждой карте, каждый пересчитывается на CPU. |
--verify-shares | <on|off> | on | FEARMINER_VERIFY_SHARES | Перепроверять решения GPU на CPU перед отправкой (on, по умолчанию) или нет (off): каждое, пока проверка стоит меньше 1 % ядра, и одно из десяти после этого: неверное отбрасывается и считается invalid в строке карты, а не отклонённым пулом. Решения CPU не перепроверяются никогда. |
--gpu-batch | <N> | 1000000 | FEARMINER_GPU_BATCH | Размер пакета GPU, в nonce на запуск: нижняя граница, округляемая вверх до целых проходов настроенной геометрии карты (стартовая строка даёт действующий пакет). |
--cpu-batch | <N> | 1000 | FEARMINER_CPU_BATCH | Размер пакета CPU, в хэшах между проверками отмены. |
--throttle | <MS> | 0 | FEARMINER_THROTTLE | Пауза между пакетами GPU, в миллисекундах; 0 без паузы. |
--list-devices | Перечислить GPU, на которых может майнить эта машина (индекс, имя, PCI id, UUID), и выйти; больше ничего не печатается. --json даёт машиночитаемую форму. | |||
--json | С --list-devices или --list-algorithms печатать список как JSON: карты с памятью, compute capability, драйвером, вендором и движком, плюс CPU и RAM; или алгоритмы с name, coin, class, fee_bps, aliases, unit, hive, requirements и refused. |
CPU
CPU #
| опция | значение | по умолчанию | FEARMINER_* | что делает |
|---|---|---|---|---|
--cpu-affinity | <MASK|LIST> | FEARMINER_CPU_AFFINITY | Закрепить рабочие потоки CPU за этими логическими CPU, в порядке потоков: шестнадцатеричная маска (0xff, бит i для CPU i) или список (0-7,16-23). Заменяет автоматическое размещение, по одному на физическое ядро, с распределением по узлам NUMA. | |
--cpu-priority | <0-5> | FEARMINER_CPU_PRIORITY | Приоритет рабочих потоков CPU, от 0 (idle) до 5 (наивысший), шкала XMRig: nice 19, 5, 0, -5, -10, -15 на Linux, класс приоритета потока на Windows. Выше 2 на Linux требует привилегии (E613 при отказе). По умолчанию: приоритет самого процесса. | |
--msr | <auto|off|PRESET|LIST> | auto | FEARMINER_MSR | Твики MSR для RandomX (префетчеры CPU, публичные значения XMRig), применяются через fearminer-helper до первого подключения, восстанавливаются при выходе. auto выбирает пресет по CPU (zen1, zen2, zen3, zen4, zen5, intel); отсутствие помощника или машина, которая их не принимает (VM, kernel lockdown, нет модуля msr), пропускает их строкой с кодом, никогда не отказывая в старте. off ничего не пишет. Имя пресета или список addr:value:mask,... задаёт значения принудительно, только на регистрах пресетов (0x1a4, 0xc0011020 до 0xc0011022, 0xc001102b). |
--1gb-pages | false | FEARMINER_1GB_PAGES | RandomX: резервировать страницы по 1 ГиБ для датасета, три на узел NUMA, когда CPU их поддерживает (pdpe1gb): на 1 до 3 % быстрее страниц по 2 МиБ. По умолчанию выключено, как в XMRig. Только там, где размер huge page по умолчанию у ядра равен 1 ГиБ (default_hugepagesz=1G в командной строке ядра). В файле huge_pages_1g. | |
--helper | <PATH> | FEARMINER_HELPER | Привилегированный помощник (fearminer-helper), запускается как sudo -n PATH для твиков MSR и резервирования huge pages. По умолчанию: установленный /usr/local/bin/fearminer-helper (путь из строки sudoers), иначе копия рядом с бинарником майнера. Заданный PATH единственный пробуемый путь, установленный помощник за ним не пробуется; E601, когда sudo отказывает ему или там ничего нет. Отсутствие пригодного по PATH не отказ в запуске: запуск RandomX говорит E601 и майнит без твиков, --check-config предупреждает. Не используется, когда майнер root (--allow-root): он делает то же внутри процесса. |
Вывод
Вывод #
| опция | значение | по умолчанию | FEARMINER_* | что делает |
|---|---|---|---|---|
--api-bind | <IP:PORT> | 127.0.0.1:4300 | FEARMINER_API_BIND | Адрес, на котором слушают эндпоинт статистики и API. 0.0.0.0:4300 открывает их в LAN, где /api/v1/* требует токен. |
--no-api | false | FEARMINER_NO_API | Не поднимать эндпоинт статистики и API. | |
--no-tui | false | FEARMINER_NO_TUI | Простой прокручиваемый журнал вместо полноэкранной панели (то, что и так получают конвейер и простой терминал). | |
--no-color | false | FEARMINER_NO_COLOR | Без цвета в журнале; панель в собственных цветах терминала. NO_COLOR в окружении делает то же. | |
-v, --verbose | false | FEARMINER_VERBOSE | Журнал уровня debug. | |
--log-file | <PATH> | FEARMINER_LOG_FILE | Также писать журнал в этот файл: по строке на запись, метка времени UTC, без цвета, пароль пула замаскирован. Дописывается, никогда не обрезается; ротируется по размеру (--log-max-size, --log-keep). Пишется и в режиме панели, и в простом. | |
--log-level-file | <LEVEL> | info · debug с -v | FEARMINER_LOG_LEVEL_FILE | Уровень файла журнала, отдельно от консоли: trace, debug, info, warn или error. |
--log-max-size | <MB> | 10 | FEARMINER_LOG_MAX_SIZE | Размер в MB, при котором файл журнала ротируется в PATH.1, .2, ... |
--log-keep | <N> | 5 | FEARMINER_LOG_KEEP | Сколько ротированных файлов хранить (PATH.1 до PATH.N); 0 начинает файл заново. |
--no-telemetry | false | FEARMINER_NO_TELEMETRY | Не отправлять никакой телеметрии: идентификатор установки не генерируется и не хранится, и на telemetry.fearminer.com ничего не уходит (что она несла бы: Что собирает FearMiner). Ни одна функция от этого не зависит. Подписанные условия комиссии по-прежнему берутся с cfg.fearminer.com. | |
--telemetry-interval | <MIN> | 15 | FEARMINER_TELEMETRY_INTERVAL | Минуты между двумя периодическими отчётами телеметрии, от 5 до 1440: меньше 5 поднимается до 5, больше суток опускается до суток, и журнал об этом говорит. |
История
История #
| опция | значение | по умолчанию | FEARMINER_* | что делает |
|---|---|---|---|---|
--history | <on|off> | on | FEARMINER_HISTORY | История этого рига в <state dir>/history.bin (on, по умолчанию) или нет (off): выборка каждые 10 с за 24 ч, затем одна в минуту за неделю, одна в пять минут за месяц, одна в час дальше. Её читают GET /api/v1/history и fearminer history. off не хранит ничего; смена требует перезапуска. |
--history-retention | <DAYS> | 90 | FEARMINER_HISTORY_RETENTION | Сколько дней истории хранить. Дальше недели выборки через пять минут, дальше месяца через час: девяносто дней весят несколько мегабайт. Перечитывается без перезапуска. |
--history-max-size | <MB> | 32 | FEARMINER_HISTORY_MAX_SIZE | Жёсткая граница файла истории, в МБ: файл размечается под неё с первого байта и никогда за неё не растёт. Она важнее --history-retention, которое урезается, чтобы уместиться. Перечитывается без перезапуска. |
Бенчмарк
Бенчмарк #
| опция | значение | по умолчанию | FEARMINER_* | что делает |
|---|---|---|---|---|
-B, --benchmark | Измерить хэшрейт и мощность этой машины и выйти; пул и кошелёк не нужны. С -a all или списком (-a quantus,randomx) алгоритмы идут по очереди, затем сводка; тот, что машина не тянет, пропускается с причиной, TensorCash тоже (офлайн-бенчмарка нет: его скорость измеряется на пуле). Часы стартуют после прогрева, один незасчитанный поиск на воркер, так что подготовка движка (сборка датасета RandomX) не учитывается. Цифры сохраняются в каталоге состояния (bench-<algo>.json); следующий запуск показывает их рядом с новыми. | |||
--duration | <SECS> | 10 · 60 | Длительность бенчмарка на алгоритм в секундах: 10 для одного алгоритма, 60 для нескольких. | |
--bench-seed | <N> | Детерминированный бенчмарк: работа и последовательность nonce каждого воркера выводятся из этого seed. Запуск заканчивается после --bench-solutions решений на воркер, а не по --duration. Каждое решение перепроверяется на CPU, печатается контрольная сумма: два запуска на том же железе печатают одну сумму, аппаратная ошибка нет. | ||
--bench-solutions | <K> | 4 | Число решений на воркер, до которого идёт бенчмарк с seed. | |
--warmup | <SECS> | 0 | Хэширование без отсчёта времени после того, как движок готов (подготовка, автонастройка и первый поиск выполнены), до старта отсчёта: карта сначала выходит на рабочую температуру и частоты. При 0 отсчёт начинается, как только готовы все устройства. | |
--report | <FILE> | Записать машиночитаемый отчёт бенчмарка (схема fearminer.benchmark/1) в FILE: сначала во временный файл, затем переименованием, и при успехе, и при сбое. |
Супервизор
Супервизор #
| опция | значение | по умолчанию | FEARMINER_* | что делает |
|---|---|---|---|---|
--no-supervisor | false | FEARMINER_NO_SUPERVISOR | Запустить майнер одним процессом, без супервизора, который перезапускает его после сбоя. Для systemd, HiveOS или другого watchdog, который перезапускает его сам, и для отладки. | |
--stop-timeout | <SECS> | 8 | FEARMINER_STOP_TIMEOUT | Секунды, которые супервизор ждёт после SIGTERM или Ctrl+C, прежде чем убить процесс майнинга. |
--max-restarts | <N> | 5 | FEARMINER_MAX_RESTARTS | Перезапуски, которые супервизор допускает в пределах --restart-window, прежде чем сдаться (код выхода 12) и выполнить --on-failure. |
--restart-window | <MIN> | 30 | FEARMINER_RESTART_WINDOW | Окно для --max-restarts, в минутах. |
--on-failure | <ACTION> | exit | FEARMINER_ON_FAILURE | Что делает супервизор, когда сдаётся: exit, или script:<path>, чтобы сначала выполнить этот скрипт (FEARMINER_EXIT_CODE, FEARMINER_CAUSE и FEARMINER_RESTARTS в его окружении), затем выйти. |
--allow-multiple | false | FEARMINER_ALLOW_MULTIPLE | Запускать, даже когда другой fearminer уже работает под этой учётной записью; блокировка одного экземпляра пропускается. | |
--allow-root | false | FEARMINER_ALLOW_ROOT | Майнить от root. Без него майнер, запущенный от root, выходит с кодом 3. HiveOS запускает каждый майнер от root, и его пакет передаёт эту опцию. | |
--reset-crashes | Очистить счётчики сбоев по каждому GPU, хранимые между перезапусками, и с ними карантин, затем стартовать как обычно; отдельно, без пула, очистить их и выйти. |
Watchdog
Watchdog #
| опция | значение | по умолчанию | FEARMINER_* | что делает |
|---|---|---|---|---|
--no-watchdog | false | FEARMINER_NO_WATCHDOG | Выключить watchdog: нет проверки зависания, хэшрейта, шар и отказов, нет карантина; потерянная карта в любом случае оставляет остальные майнить. | |
--hang-timeout | <SECS> | 60 | FEARMINER_HANG_TIMEOUT | Секунды, которые поиск может идти без признаков жизни от GPU, прежде чем карта считается зависшей и майнер выходит на перезапуск (код 10). |
--zero-hashrate-timeout | <SECS> | 300 | FEARMINER_ZERO_HASHRATE_TIMEOUT | Секунды, которые GPU может не выдавать хэшей, пока другие карты майнят, прежде чем майнер выйдет на перезапуск (код 11); 5 мин отсрочки при старте и после термического возобновления. |
--no-share-timeout | <SECS> | 1800 | FEARMINER_NO_SHARE_TIMEOUT | Секунды без принятой шары от любого устройства, после подключения сессии, прежде чем майнер перейдёт к следующему пулу; второй такой период на следующем пуле выходит для перезапуска (код 11). 0 отключает. Карта, которая ничего не приносит, пока остальные приносят, судится отдельно, по десятикратному ожидаемому времени между шарами, от 10 до 60 минут. |
--hashrate-min | <RATE> | 50% | FEARMINER_HASHRATE_MIN | Нижняя граница десятиминутного среднего GPU: доля эталона (50%, лучшее десятиминутное среднее за сессию, или --hashrate-reference) либо абсолютная скорость (300M, 1.2G). Ниже неё карта Degraded; всё ещё ниже после --hashrate-grace, майнер выходит для перезапуска (код 11). Та же граница для суммарного среднего рига. 0 отключает. |
--hashrate-max | <RATE> | 0 | FEARMINER_HASHRATE_MAX | Верхняя граница десятиминутного среднего GPU, в тех же формах; выше неё цифра неверна и об этом сообщается (E314), перезапуска нет. 0 отключает. |
--hashrate-grace | <SECS> | 300 | FEARMINER_HASHRATE_GRACE | Секунды, которые GPU может оставаться ниже --hashrate-min, прежде чем майнер выйдет для перезапуска; 0 никогда не перезапускает (только Degraded и оповещение). |
--hashrate-reference | <RATE[,RATE...]> | FEARMINER_HASHRATE_REFERENCE | Эталон для процентов --hashrate-min и --hashrate-max, в H/s (600M): на все карты или по одной на карту в порядке движка, через запятую. Если не задан, выучивается: лучшее десятиминутное среднее за сессию. | |
--share-famine | <N> | 5 | FEARMINER_SHARE_FAMINE | Сколько ожидаемых интервалов между шарами (сложность, делённая на скорость карты) GPU может быть без шары, но не меньше 10 минут, прежде чем станет Degraded и его поиск перезапустят; второй голод выходит для перезапуска (код 11). 0 отключает. |
--max-rejects-device | <N> | 5 | FEARMINER_MAX_REJECTS_DEVICE | Шары одного GPU, которые пул может отклонить подряд (кроме устаревших), прежде чем карта станет Degraded до принятия шары; также решения, которые перепроверка на CPU может отклонить за десять минут. 0 отключает. |
--max-rejects | <N> | 15 | FEARMINER_MAX_REJECTS | Сколько шар пул может отклонить подряд, от любого устройства, прежде чем сессия переподключится; вторая такая серия переводит на следующий пул. 0 отключает. |
--max-no-submit-responses | <N> | 10 | FEARMINER_MAX_NO_SUBMIT_RESPONSES | Отправки, оставшиеся без ответа в течение --submit-timeout, подряд, прежде чем сессия переподключится; вторая такая серия переводит на следующий пул. 0 отключает. |
--device-quarantine | <N> | 3 | FEARMINER_DEVICE_QUARANTINE | Перезапуски по вине одного GPU в пределах --restart-window, прежде чем он попадёт в Quarantined при следующем старте: вне майнинга, пока остальные работают, до перезапуска майнера. Никогда не последнее устройство, способное майнить. 0 отключает. |
Уведомления
Уведомления #
| опция | значение | по умолчанию | FEARMINER_* | что делает |
|---|---|---|---|---|
--notify-url | <URL> | FEARMINER_NOTIFY_URL | Отправлять оповещения на этот URL как JSON (POST, формат версии 1); повтор или запятые для нескольких. Повтор при 5xx или сетевой ошибке, никогда при 4xx. | |
--notify-telegram | <BOT_TOKEN:CHAT_ID> | FEARMINER_NOTIFY_TELEGRAM | Отправлять оповещения в чат Telegram через бота: BOT_TOKEN:CHAT_ID, токен от @BotFather. | |
--notify-discord | <WEBHOOK_URL> | FEARMINER_NOTIFY_DISCORD | Отправлять оповещения в канал Discord через его webhook URL. | |
--notify-secret | <SECRET> | FEARMINER_NOTIFY_SECRET | Подписывать каждое тело --notify-url HMAC-SHA256 этим секретом, в X-FearMiner-Signature: sha256=<hex>. | |
--notify-min-severity | <LEVEL> | warning | FEARMINER_NOTIFY_MIN_SEVERITY | Наименьшая отправляемая важность: info, warning, error или critical. |
--notify-test | Отправить одно тестовое сообщение (rig_up) каждому получателю и на /start heartbeat, напечатать результат, выход 0, если каждая доставка прошла, 1 иначе. | |||
--heartbeat-url | <URL> | FEARMINER_HEARTBEAT_URL | Пинговать этот URL каждые 60 с (GET; POST с --heartbeat-post), плюс URL/start при старте и URL/fail при критическом событии: соглашение healthchecks.io. Push URL Uptime Kuma работает как есть. | |
--heartbeat-post | false | FEARMINER_HEARTBEAT_POST | Отправлять heartbeat как POST с небольшим JSON-телом (хэшрейт, эффективный хэшрейт, шары, аптайм, перезапуски) вместо GET. |
Разгон
Разгон #
| опция | значение | по умолчанию | FEARMINER_* | что делает |
|---|---|---|---|---|
--cclock | <MHZ[,MHZ...]> | FEARMINER_CCLOCK | Смещение частоты ядра в МГц, со знаком (+100, -50), через драйвер (NVIDIA, драйвер 520 или новее). На все карты или по одной на карту в порядке -d (100,_,-50: _ пропускает эту карту). Читается обратно после установки; отклоняется со своим кодом, когда драйвер отказывает (E703: нужен root, --allow-root). Без опций разгона не трогается ни один регистр частоты, лимита мощности или вентилятора. | |
--lock-cclock | <MHZ[,MHZ...]> | FEARMINER_LOCK_CCLOCK | Зафиксировать частоту ядра на стольких МГц (nvidia-smi -lgc); 0 снимает фиксацию. На все карты или по одной на карту в порядке -d. Фиксацию нельзя прочитать обратно, поэтому при выходе она сбрасывается к значению драйвера по умолчанию. | |
--mclock | <MHZ[,MHZ...]> | FEARMINER_MCLOCK | Смещение частоты памяти в МГц, со знаком (+800, -500). Одно значение на все карты или по одному на карту в порядке -d. | |
--lock-mclock | <MHZ[,MHZ...]> | FEARMINER_LOCK_MCLOCK | Зафиксировать частоту памяти на стольких МГц (nvidia-smi -lmc); должна быть ступенью, которую публикует карта (405, 810, 5001, 10251...; иначе E701 перечисляет их). 0 снимает фиксацию. На все карты или по одной на карту в порядке -d. | |
--pl | <W|N%[,...]> | FEARMINER_PL | Лимит мощности, в ваттах (220) или в процентах от лимита карты по умолчанию (80%), в пределах диапазона, который публикует карта (иначе E702 даёт минимум и максимум). На все карты или по одной на карту в порядке -d. | |
--fan | <N%|auto[,...]> | FEARMINER_FAN | Скорость вентилятора в процентах (70%) или auto, чтобы вернуть вентилятор кривой драйвера. На все карты или по одной на карту в порядке -d. Карта без управления вентилятором (ноутбук) отклоняет это (E704). | |
--oc-delay | <SECS> | 0 | FEARMINER_OC_DELAY | Секунды после того, как карта начала майнить (её первая принятая шара или максимум 30 с), прежде чем применить смещение и фиксацию ядра: для ригов, которые падают, когда смещение ложится на холодную карту. 0 применяет их при старте вместе с остальным. |
--no-oc | false | FEARMINER_NO_OC | Игнорировать все опции разгона и любую секцию [oc] файла: не трогается ни один регистр частоты, лимита мощности или вентилятора, и стартовая строка говорит об этом. Для рига, чей разгон задан снаружи (HiveOS, Afterburner, скрипт). | |
--oc-reset-on-start | false | FEARMINER_OC_RESET_ON_START | Вернуть каждую выбранную карту к значениям драйвера по умолчанию (фиксации сняты, смещения 0, лимит мощности по умолчанию, вентилятор на своей кривой) перед применением опций разгона. | |
--oc-script | <PATH> | FEARMINER_OC_SCRIPT | Запустить эту программу один раз для каждой карты перед началом майнинга, напрямую, никогда через shell, с FEARMINER_DEVICE, FEARMINER_PCI_BUS, FEARMINER_UUID и FEARMINER_ALGO в окружении; не дольше 30 с, код выхода в журнале (E707, если не 0). |
Команды
Команды #
| опция | значение | по умолчанию | FEARMINER_* | что делает |
|---|---|---|---|---|
--unrestricted-api | <LEVEL> | read | FEARMINER_UNRESTRICTED_API | Команды, которые работающий майнер принимает сверх обратимых: read (по умолчанию: pause, resume, toggle, retune), operate (ещё restart, stop), sensitive (ещё кошелёк, пулы, разгон). Команда выше уровня отклоняется с E217, с верным токеном или без. Защищает только API (Управляй работающим майнером). |
--hook | <EVENT:PATH> | FEARMINER_HOOK | Запустить эту программу, когда происходит EVENT, напрямую, никогда через shell, с FEARMINER_EVENT и контекстом события в окружении; не дольше 30 с, код выхода в журнале (E139, если не 0). Повтор или запятые для нескольких. События: start, exit, crash, pause, resume, pool-switch, share-rejected-high, low-hashrate, temp-high, device-lost. | |
--watch-config | false | FEARMINER_WATCH_CONFIG | Следить за файлом конфигурации и перечитывать его при изменении. Выключено по умолчанию: SIGHUP и PUT /api/v1/config перечитывают его в любом случае. Значение, не прошедшее проверку, отклоняет весь новый файл (E220); действующая конфигурация сохраняется. | |
--background | false | FEARMINER_BACKGROUND | Работать без консоли: процесс отделяется и продолжает майнить после закрытия своего shell. Включает --no-tui; задай --log-file, чтобы сохранить журнал. Только Unix; на Windows запускай майнер службой. | |
--priority | <0-5> | FEARMINER_PRIORITY | Приоритет планировщика всего процесса, от 0 (простой) до 5 (наивысший), по шкале --cpu-priority, которая охватывает только рабочие потоки. Выше 2 требует привилегии на Linux; при отказе ОС это E613, и сохраняется обычный приоритет. |
Команды
Команды #
| команда | что делает |
|---|---|
fearminer explain [CODE] | Объяснить код ошибки из журнала (E302, e302 или 302): причину, последствия и что делать, офлайн. Без кода перечислить все. |
fearminer token show | Напечатать токен API, который должен нести запрос с другой машины; создаётся, если его нет. |
fearminer token rotate | Заменить токен новым и напечатать его; старый перестаёт работать при следующем старте майнера. |
fearminer verify <FILE>... | Проверить загрузку офлайн зашитым ключом релиза. По SHA256SUMS (с .minisig рядом) или по архиву (с SHA256SUMS рядом): проверить подпись, затем SHA-256 каждого перечисленного файла в том же каталоге, по строке на файл, ok, MISSING или MISMATCH. Выход 0 только когда подпись верна и каждый имеющийся файл совпал. |
fearminer config example | Напечатать полный файл конфигурации, каждый ключ со значением по умолчанию и справкой в комментарии, в режиме наблюдения (без кошелька, без пула), чтобы перенаправить в fearminer.toml и отредактировать. |
fearminer history --from --to --step | Напечатать, что делал этот риг, из его собственной истории, офлайн: майнер работать не обязан. Читает <state dir>/history.bin, печатает выборки между --from и --to с шагом --step, в CSV или JSON, те же данные отдаёт GET /api/v1/history (Читай историю майнинга). |
fearminer oc show | По каждой карте: её показания (частоты, смещения, лимит мощности, вентилятор), ступени и диапазоны, которые она публикует, и что запуск оставил вернуть в oc-restore.json. -d сужает список карт, как при запуске. |
fearminer oc reset [--defaults] | Вернуть то, что запуск записал в oc-restore.json и не вернул сам (запуск, убитый без очистки): по строке на карту с тем, что возвращено, и тем, что карта показывает после. --defaults вместо этого сбрасывает выбранные карты к значениям драйвера по умолчанию. -d сужает список карт. |
fearminer cockpit | Показать кокпит майнера, уже работающего на этой машине: полноэкранная панель запуска на переднем плане, читается из API этого майнера раз в секунду. Майнер не запускается; q или Ctrl+C закрывают только просмотр. Когда stdout не терминал, печатает строки журнала майнера и текстовую сводку каждые 10 секунд. Выход 2 (E822), когда ни один майнер не отвечает. Псевдоним: watch. |
fearminer service <COMMAND> | Запускать майнер как службу, вместе с машиной, с перезапуском после сбоя: install, status, logs, stop, start, restart, update, rollback, uninstall (update и rollback на Linux; Служба). |
fearminer enroll [CODE] | Подключиться к ферме кокпита, выдавшего код; --status называет ферму, --leave сразу выводит из неё риг. Майнинг при этом не затрагивается (Управляй ригами из кокпита). |
fearminer remote <COMMAND> | Удалённый канал на этой машине: off, on, status, cancel (Управляй ригами из кокпита). |
fearminer telemetry show | Напечатать периодический отчёт, который отправил бы работающий майнер, ничего не отправляя; опции запуска идут после команды. Генерирует идентификатор установки, если его ещё нет (никогда с --no-telemetry); то, что измеряет только работающий майнер, показано как при старте. --json печатает только JSON. |
fearminer telemetry rotate-id | Сгенерировать новый случайный идентификатор установки для телеметрии: со следующего старта майнера машина считается новой установкой. |
fearminer gui | Открыть окно: выбрать алгоритм, пул, кошелёк и карты, запускать и останавливать майнер, следить за его картами, шарами и журналом. То же окно открывает двойной щелчок; настройки пишутся в тот же fearminer.toml. |
Переключатель принимает true или false в файле или окружении (FEARMINER_NO_TUI=1). Опция-список (url, user, pass, tls_fingerprint, tls_spki, hook) принимает строку или массив строк. Опции без переменной это разовые действия, их нельзя задать из окружения.