前書き的なもの
自宅サーバーとしてXeon E5-2630Lを積んだラックサーバー(FUJITSU PRIMERGY RX200S7)の運用を始めて早3か月、Web、アプリケーション、NASと色々な用途で使用していましたがマシンパワーの割に小規模でリソースの1割を使用できているかどうかな状況だったので、余ったリソースでマイニングしてみました。
備忘録的なもの...(笑)
Docker上で構築することで環境に左右されずにとりあえず動くのと、マシンリソースの明確な制限と区分けがDockerで簡単にできるので今回構築してみました。
内容としてはUbuntu18.04のベースイメージ上にXMRigを引っ張ってきてコンパイルするだけ。
2022/01/23追記
XMRigのバージョンの問題でDockerfileのビルド中にXMRigのコンパイルが出来なくなっていたのでブランチにてバージョン指定するように変更。
Dockerのインストール
異なるマシン環境、OSでも動いてくれる!素晴らしい!!
ということで、Dockerのインストールから始めましょう。
Docker導入済みな方は次の項目へ。
手順は特に変わったこともなく公式通りにインストールします。
以下、公式の手順通り → https://docs.docker.com/engine/install/debian/
↓ 作業に必要なパッケージのインストール
$ sudo apt update
$ sudo apt -y install \
apt-transport-https \
ca-certificates \
curl \
gnupg \
gnupg-agent \
software-properties-common
*[-y]オプションでインストール時の確認スキップ、後の工程で" gnupg "がインストールされてないと怒られる事が多いので追加。
↓ Docker公式からGPG Keyの取得
$ curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add -
↓ 公式がkeyを確認しろと言ってるので一応確認
$ sudo apt-key fingerprint 0EBFCD88
pub 4096R/0EBFCD88 2017-02-22
Key fingerprint = 9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88
uid Docker Release (CE deb) <docker@docker.com>
sub 4096R/F273FCD8 2017-02-22
↓ aptにリポジトリ追加、環境によって2行目の[arch=amd64]を[arch=arm64]とかに書き換える
$ sudo add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/debian \
$(lsb_release -cs) \
stable"
$ sudo add-apt-repository \
"deb [arch=arm64] https://download.docker.com/linux/debian \
$(lsb_release -cs) \
stable"
↓ Dockerのインストール
$ sudo apt update
$ sudo apt install docker-ce docker-ce-cli containerd.io
*バージョン指定したい場合は以下のコマンドで調べて各パッケージ名の後に[ =Version ]指定でインストール
詳細については公式へDocker Install (2)$ apt-cache madison docker-ce $ apt-cache madison docker-ce-cli $ sudo apt install docker-ce=<VERSION_STRING> \ docker-ce-cli=<VERSION_STRING> \ containerd.io
↓ お約束のHello Worldで確認、特に怒られなければ問題ない。
$ sudo docker run hello-world
DockerFileを用意してイメージ作成
今回利用するXMRigをUbuntu18.04のベースイメージ上でソースからコンパイルしてイメージ作成、コンテナ作成して実行するだけでマイニングできるようにします。
XMRigのソースはGithubから→https://github.com/xmrig/xmrig
↓ DockerFileを好きなように書く
FROM ubuntu:18.04
# Default git repository
ENV GIT_REPOSITORY https://github.com/xmrig/xmrig.git
ENV XMRIG_VER v6.15.3
ENV TZ=Asia/Tokyo
# Install packages
RUN apt update \
&& apt upgrade -y \
&& set -x \
&& apt install -qq --no-install-recommends -y build-essential ca-certificates cmake make git libhwloc-dev libuv1-dev libssl-dev \
&& git clone -b $XMRIG_VER $GIT_REPOSITORY \
&& echo "#ifndef XMRIG_DONATE_H" | tee /xmrig/src/donate.h \
&& echo "#define XMRIG_DONATE_H" | tee -a /xmrig/src/donate.h \
&& echo "constexpr const int kDefaultDonateLevel = 0;" | tee -a /xmrig/src/donate.h \
&& echo "constexpr const int kMinimumDonateLevel = 0;" | tee -a /xmrig/src/donate.h \
&& echo "#endif /* XMRIG_DONATE_H */" | tee -a /xmrig/src/donate.h \
&& cd /xmrig \
&& cmake . \
&& make -j$(nproc)\
&& cd - \
&& mv /xmrig/xmrig /usr/local/bin/ \
&& rm -rf /xmrig \
&& apt purge -y -qq build-essential cmake git libhwloc-dev libuv1-dev libssl-dev \
&& apt clean -qq
EXPOSE 80
ENTRYPOINT ["/usr/local/bin/xmrig"]
CMD ["--donate-level","0","-o","monerohash.com:2222","-u","WALLET_ADDRESS","-p","x","-k"]
今回はUbuntu18.04のベースイメージ上にgitでXMRigのソースを引っ張て来てコンパイルし、実行に不要なファイルをきれいにするだけ。
一応使い方としては、CMD行の" -o "オプションの値" monerohash.com:2222 "に自分の参加したいマイニングプールの指定するアドレス:ポートを、" -u "オプションの値" WALLET_ADDRESS "をMoneroの場合はMyMoneroなどで作成した自分のウォレットのアドレスを入力するだけ。
途中の" echo | tee "はXMRigの作者が寄付としてデフォルトで1%(1%なら100分に1分程度)の時間ごとに作者のアカウントでマイニングするようになっており、ソースのヘッダーファイルを書き換えてデフォルト寄付を無効にしている。
寄付を無効にしている理由としては、マイニングプールによってはブロックを掘り当てた際にプールに参加してマイニングしていないと報酬を得られないので、寄付マイニング中にプールでブロックを掘り当てると報酬が得られない可能性がある為。
↓ 作成したDockerFileをサーバーに何かしらで送る
$ scp Dockerfile User@ServerAddless:/xmrig
↓ scpで転送が面倒ならsshでvimコピペも可
$ mkdir /xmrig
$ vi /xmrig/Dockerfile
↓ DockerFileをBuildしてイメージ作成、build中にmakeしてるので結構時間かかる
$ cd /xmrig
$ docker build -t xmrig .
↓ 作成したイメージの確認、作成した名前のイメージが表示されればOK
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
xmrig latest 74e3b5a9434b 10 seconds ago 354MB
イメージからコンテナ作成して実行
作成したイメージを指定してdocker runすれば自動的にXMRigがマイニングしてくれます。
↓ docker runでコンテナ作成して実行
$ docker run -d --name xmrig --restart=always xmrig
XMRigの稼働状況など見たい場合はDockerのログから参照
↓ dockerのコンテナログからXMRigの出力確認
$ docker logs xmrig
* ABOUT XMRig/6.10.0 gcc/7.5.0
* LIBS libuv/1.18.0 OpenSSL/1.1.1 hwloc/1.11.9
* HUGE PAGES supported
* 1GB PAGES disabled
* CPU Intel(R) Xeon(R) CPU E5-2630L 0 @ 2.00GHz (1) 64-bit AES
L2:1.5 MB L3:15.0 MB 6C/12T NUMA:1
* MEMORY 4.8/15.6 GB (31%)
* DONATE 0%
* ASSEMBLY auto:intel
* POOL #1 monerohash.com:2222 algo auto
* COMMANDS hashrate, pause, resume, results, connection
* OPENCL disabled
* CUDA disabled
[2021-03-14 18:22:15.660] net use pool monerohash.com:2222 107.191.99.221
[2021-03-14 18:22:15.660] net new job from monerohash.com:2222 diff 50000 algo rx/0 height 2316997
[2021-03-14 18:22:15.660] cpu use argon2 implementation SSSE3
[2021-03-14 18:22:15.662] msr msr kernel module is not available
[2021-03-14 18:22:15.662] msr FAILED TO APPLY MSR MOD, HASHRATE WILL BE LOW
[2021-03-14 18:22:15.663] randomx init dataset algo rx/0 (12 threads) seed c065bc1e5406f242...
[2021-03-14 18:22:15.663] randomx allocated 2336 MB (2080+256) huge pages 0% 0/1168 +JIT (0 ms)
[2021-03-14 18:22:25.066] randomx dataset ready (9403 ms)
[2021-03-14 18:22:25.066] cpu use profile rx (6 threads) scratchpad 2048 KB
[2021-03-14 18:22:25.069] cpu READY threads 6/6 (6) huge pages 0% 0/6 memory 12288 KB (3 ms)
[2021-03-14 18:22:27.353] cpu accepted (1/0) diff 50000 (265 ms)
[2021-03-14 18:22:46.715] net new job from monerohash.com:2222 diff 75000 algo rx/0 height 2316997
[2021-03-14 18:22:49.526] cpu accepted (2/0) diff 75000 (233 ms)
[2021-03-14 18:23:16.935] net new job from monerohash.com:2222 diff 112501 algo rx/0 height 2316997
[2021-03-14 18:23:25.040] cpu accepted (3/0) diff 112501 (191 ms)
[2021-03-14 18:23:25.102] miner speed 10s/60s/15m 1845.8 n/a n/a H/s max 1846.2 H/s
"new job"でプールからジョブが降ってきて"accepted (1/0) diff 50000 (265 ms)"のように承認されていれば正常に稼働してマイニングできています。
デフォルトで1分毎にハッシュレートが表示されるようになっているので、それを見ながらチューニングするのが普通なのですが自動で最適化されるようでなかなかの数字出ているのでそのまま使えると思います。
ちなみに上記ログを見てもらうとわかるように当環境では6コア/12スレッドCPUを使用しており、自動で最適化され半分の6スレッドしか使用していませんがこれ以上スレッドを割り当ててもハッシュレートがそこまで伸びませんでした。
↓ docker statsでコンテナのCPU使用率などを確認
$ docker stats --no-stream
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
97b858fafab4 xmrig 599.88% 2.305GiB / 15.57GiB 14.80% 40.1kB / 19.3kB 0B / 0B 12
CPUは6コア/12スレッドなので1200%が上限ですが半分の600%前後で推移しています。
後書き的なもの
とりあえず数日運用してみましたが、他のサービスやアプリケーションにも影響与えずに安定してくると平均2kH/s出ているので様子見しようと思います。
稼働時のサーバー消費電力が平均125Wなので赤字ではありますが、この消費電力で2kH/s出ていればまぁ上々かと。
余裕があれば後日、XMR-Stakと比較もしてみます。
そのうちサーバー増設しようかなと思ってるので、その際にはk8s環境も構築して試してみたいです。