Dockerサーバーの余ったリソースをXMRigでマイニングしてみた

# 前書き的なもの

自宅サーバーとして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/

↓ 作業に必要なパッケージのインストール

```bash:apt&#x20;Install
$ sudo apt update

$ sudo apt -y install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg \
    gnupg-agent \
    software-properties-common
```

> ＊[-y]オプションでインストール時の確認スキップ、後の工程で" gnupg "がインストールされてないと怒られる事が多いので追加。

↓ Docker公式からGPG Keyの取得

```bash:Add&#x20;GPG&#x20;Key
$ curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add -
```

↓ 公式がkeyを確認しろと言ってるので一応確認

```bash:Key&#x20;check
$ 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]とかに書き換える

```bash:Intel,AMD&#x20;CPU
$ sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/debian \
   $(lsb_release -cs) \
   stable"
```

```bash:ARM&#x20;CPU
$ sudo add-apt-repository \
   "deb [arch=arm64] https://download.docker.com/linux/debian \
   $(lsb_release -cs) \
   stable"
```

↓ Dockerのインストール

```bash:Docker&#x20;Install&#x20;(1)
$ sudo apt update
$ sudo apt install docker-ce docker-ce-cli containerd.io
```

> ＊バージョン指定したい場合は以下のコマンドで調べて各パッケージ名の後に[ =Version ]指定でインストール
> 詳細については公式へ
>
> ```bash:Docker&#x20;Install&#x20;(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で確認、特に怒られなければ問題ない。

```bash:Docker&#x20;Check
$ sudo docker run hello-world
```

# DockerFileを用意してイメージ作成

今回利用するXMRigをUbuntu18.04のベースイメージ上でソースからコンパイルしてイメージ作成、コンテナ作成して実行するだけでマイニングできるようにします。

XMRigのソースはGithubから→https://github.com/xmrig/xmrig

↓ DockerFileを好きなように書く

```Dockerfile: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](https://wallet.mymonero.com/)などで作成した自分のウォレットのアドレスを入力するだけ。

途中の" echo | tee "はXMRigの作者が寄付としてデフォルトで1%(1%なら100分に1分程度)の時間ごとに作者のアカウントでマイニングするようになっており、ソースのヘッダーファイルを書き換えてデフォルト寄付を無効にしている。

寄付を無効にしている理由としては、マイニングプールによってはブロックを掘り当てた際にプールに参加してマイニングしていないと報酬を得られないので、寄付マイニング中にプールでブロックを掘り当てると報酬が得られない可能性がある為。

↓ 作成したDockerFileをサーバーに何かしらで送る

```bash:DockerFile&#x20;Send
$ scp Dockerfile User@ServerAddless:/xmrig
```

↓ scpで転送が面倒ならsshでvimコピペも可

```bash:DockerFile&#x20;vim
$ mkdir /xmrig
$ vi /xmrig/Dockerfile
```

↓ DockerFileをBuildしてイメージ作成、build中にmakeしてるので結構時間かかる

```bash:Docker&#x20;Build
$ cd /xmrig
$ docker build -t xmrig .
```

↓ 作成したイメージの確認、作成した名前のイメージが表示されればOK

```bash:Docker&#x20;Image&#x20;List
$ docker image ls
 REPOSITORY       TAG       IMAGE ID       CREATED          SIZE
 xmrig            latest    74e3b5a9434b   10 seconds ago   354MB
```

# イメージからコンテナ作成して実行

作成したイメージを指定してdocker runすれば自動的にXMRigがマイニングしてくれます。

↓ docker runでコンテナ作成して実行

```bash:Docker&#x20;Run
$ docker run -d --name xmrig --restart=always xmrig
```

XMRigの稼働状況など見たい場合はDockerのログから参照

↓ dockerのコンテナログからXMRigの出力確認

```bash:Docker&#x20;Logs
$ 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使用率などを確認

```bash:Docker&#x20;Stats
$ 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環境も構築して試してみたいです。