Instalación de un Rig de minería en linux con undervolt para gráficas AMD

Publicado: 04/12/2020 en Criptomonedas
Etiquetas:, , , , , ,

A la hora de montar un minero para criptomonedas se puede utilizar diferentes hardwares, según con que algoritmo se vaya a trabajar, para este tutorial me voy a centrar en un equipo para la minería de Ethereum (Ethash), también vale para otras criptomonedas como Ravencoin o cualquier otra compatible con el hardware.
DESCARGA DE RESPONSABILIDAD:
Antes de comenzar con el manual quiero dejar claro que no me hago responsable del mal uso que el usuario haga de este documento así queda dicho que el usuario es el único responsable de los daños ocasionados a los componentes así como a las personas por la mala manipulación, todas las indicaciones expuestas en este documento están tal cual a mi me han funcionado y lleva años funcionando sin problema.

Harware:

  • Asrock H110 Pro BTC
  • Corsair RM1000X 1000W 80 Plus Gold Modular
  • 3 x Sapphire Pulse Radeon RX 580 8GB GDDR5
  • PNY CS900 2.5″ 120GB SSD SATA 3 TLC
  • Adaptador PCI-E 1X a PCI-E 16X
  • 2 x Kingston HyperX Fury Black DDR4 2400 PC4-19200 8GB CL15
  • Intel Core i5-7400 3.0GHz BOX

Software:

  • Ubuntu 18.04 server
  • NetworkManager
  • Lm-Sensors
  • Netdata
  • fail2ban
  • 2FA Google Authenticator

Prologo:

El sistema operativo empleado es Ubuntu 18.04 server pero también valdría una versión superior siempre y cuando los softwares utilizados sean compatibles. No voy a explicar como instalar ubuntu ya que hay muchos tutoriales por la red que lo explican bien, me centraré en configurar el sistema para lo que queremos.
Una de las cosas más importantes en un rig es tener el control sobre los parámetros de configuración de las tarjetas gráficas ya que van a estar 24/7 conectadas y si no se controla el consumo el tiempo de vida útil del hadware se reduce considerablemente, por eso se ajusta las GPU para que tengan un mínimo consumo con un máximo rendimiento.
En windows hacer esto es relativamente fácil pero en linux ya es otra cosa, así que empecemos con el tune.

Cambio del Kernel de Linux:

Para poder cambiar los parámetros de las GPU tenemos que tener un kernel compatible y este es a partir de la versión 4.17, para saber que versitón tenemos, tipeamos.
$ uname -a

si nos devuelve una versión inferior tenemos qie actualizar y vamos a instalar el kernel 4.20 que es el que me ha dado un buen resultados.
Primero actualizamos el OS.
$ sudo apt update
$ sudo apt upgrade

Vamos al directorio tmp que es un directorio que se borra todo lo que hay dentro cuando reiniciamos
$ cd /tmp

Bajamos los archivos del kernel que son 3

$ sudo wget -c https://kernel.ubuntu.com/~kernel-ppa/mainline/v4.20/linux-headers-4.20.0-042000_4.20.0-042000.201812232030_all.deb

$ sudo wget -c https://kernel.ubuntu.com/~kernel-ppa/mainline/v4.20/linux-image-unsigned-4.20.0-042000-generic_4.20.0-042000.201812232030_amd64.deb

$ sudo wget -c https://kernel.ubuntu.com/~kernel-ppa/mainline/v4.20/linux-modules-4.20.0-042000-generic_4.20.0-042000.201812232030_amd64.deb

Instalamos los paquetes.
$ sudo dpkg -i linux-*.deb

Comprobamos si se ha instalado correctamente
$ uname -a

$ uname -r

Fuente

NetworkManager:

Lo primero es poner una IP local fija para poder tener acceso remoto a nuestro minero y poder supervisar el rendimiento, para eso usaré el NetworkManager, te dejo un enlace para la instalación y configuración

NetworkManager

Para la supervisión instalamos dos softwares Lm-Sensors que nos informará de las teperaturas de las gráficas y de la GPU y Netdata que es un entorno web para consultar esos parámetros en remoto

Lm-Sensors:

Instalamos Lm-Sensors para el monitoreo de los parámetros del Rig

Lm-Sensors

Netdata:

Netdata es un softwarte de entorno web con el que monitorear el estado de nuestro rig, podemos ver las temperaturas, voltajes, velocidad de los ventiladores de las GPU’s y temperaturas de la CPU, entre otros parámetros pero a mi lo que más me importan son los que he mencionado.

Instalar Netdata.
$ sudo apt install netdata

una vez instalado tenemos que configurarlo para poder acceder desde nuestro terminal tenemos que editar el fichero de configuración netdata.conf y añadir la IP local de nuestro Rig
$ sudo nano /etc/netdata/netdata.conf

Buscamos la línea donde añadir la IP pulsando control + w y escribimos bind to y pulsamos entrer y nos lleva a la línea en cuestión

Le añadimos nuestra IP en mi caso es la 192.168.1.6

Reiniciamos Netdata para establecer los cambios
$ sudo systemctl restart netdata

Comprobamos el estado del programa
$ sudo systemctl status netdata

Integración Lm-Sensors a Netdata:

El archivo de configuración que instala por defecto Netdata es muy simple y genérico y apenas tiene parámetros y se encuentra en la ruta /etc/netdata . Para poder ver las temperaturas en remoto con Lm-Sensors tenemos que activarlo dentro del archivo de configuración de Netdata, ahora nos hace falta un archivo que cumpla nos descargamos tipenado en la barra del explorador.

http://192.168.1.6:19999/netdata.conf

Se abre una página en el explorador donde podemos revisar los parámetros, estos los tendremos que copiar en el archivo por defecto que instaló Netdata. Lo que hacemos es sustituimos el archivo por defecto por el nuevo y para eso tipeamos en la consola.
$ sudo wget -O /etc/netdata/netdata.conf http://192.168.1.6:19999/netdata.conf

Para activar Lm-Sensors en Netdata tenemos que buscar la línea apropiada y descomentarla, en la sección de [plugins] buscamos la linea charts.d = yes y lo descomentamos.
$ sudo nano /etc/netdata/netdata.conf

Para buscar esta línea más rápido podemos utilizar las teclas de busqueda rápida, pulsando Ctrl+w se abre un cuadro te texto en nano donde tipeamos charts.d = yes y nos lleva directo, una vez cambiado lo guardamos pulsando Ctrl+O.

Tenemos que activar las sondas descomentando la línea sensors=force contenida en el fichero charts.d.conf que se encuentra en la ruta /etc/nextdata

Guardamos los cambios y reiniciamos el servicio y listo.
$ sudo systemctl restart netdata

Arranque automático de Netdata:

Por defecto Netdata no se ejecuta cuanto arrancas el equipo así que hay que crear un servicio en systemd para hacerlo.

En la ruta /etc/systemd/system Creamos un fichero con nombre netdatainit.service y dentro le añadimos lo siguiente:

[Unit]
Description=Script service
After=network.target network-online.target
Wants=network-online.target

[Service]
ExecStart=/usr/local/bin/netdata_service.sh

[Install]
WantedBy=multi-user.target

Ahora habilitamos el servicio para que Netdata inicie automáticamente al encender o reiniciar nuestro Rig, tipeamos:
$ sudo systemctl enable netdatainit

Una vez está en marcha Netdata lo puedes parar cuando quieras con el comando
$ sudo systemctl start netdatainit

Pararlo con
$ sudo systemctl stop netdatainit

Ver el estado en el que está el servicio con
$ sudo systemctl status netdatainit

Una vez lo tienes en marcha puedes monitorear tu Rig desde cualquier explorador poniendo la ip y el puerto 19999, por ejemplo vamos a usar este ejemplo, si recuerdas más arriba hemos utilizado la IP interna 192.168.1.6 así que la dirección que debemos escribir en el explorador es 192.168.1.6:19999 y si hemos hecho todo bien aparecerá en el menú de la derecha la pestaña Sensors que es donde podemos ver los parámetros de nuestras gráficas

Al desplegar la pestaña Sensors podemos ver otras más donde comprobamos en tiempo real la temperatura del equipo, tanto las gráficas como el procesador, etc.

Instalación Driver AMD

Vamos a la página oficial de AMD y descargamos los driver para ubuntu 64.
Si estamos trabajando en servidor e intentamos descargarlos con el comando wget no funcionará así que tenemos que pasarlo con un pendrive desde un USB, así que vamos a hacer esta tarea

Creamos la carpeta donde será montado el USB
$ sudo mkdir /media/USB

Averiguamos con que nombre ha nombrado el sistema el USB así antes de introducir el USB vemos los dispositivos que hay conectamos con el comando
$ sudo ls -l /dev/sd*

En la imagen solo se ve un dispositivo con el nombre de sda, ahora conectamos el USB y volvemos a pasar el mismo comando y comparamos.

Nos aparece un dispositivo nuevo llamado sdb1, este es el USB, el siguiente paso es montar el pendrive en el directorio que hemos creado en el paso anterior.
Si el formato de archivos es FAT
$ mount -t vfat /dev/sdb1 /media/USB
Si es NTFS
$ mount -t ntfs /dev/sdb1 /media/USB
Si es EXT4
$ mount -t ext4 /dev/sdb1 /media/USB

Una vez montada la memoria pasamos el driver al servidor, yo siempre paso el archivo a la carpeta personal Descargas
$ sudo cp amdgpu-pro-20.30-1109583-ubuntu-18.04.tar.xz /home/nest/Descargas

Entramos en el directorio y le damos permiso de escritura y lectura.
$ sudo chmod 777 amdgpu-pro-20.30-1109583-ubuntu-18.04.tar.xz

Lo descomprimimos y se genera una carpeta
$ tar -Jxvf amdgpu-pro-20.30-1109583-ubuntu-18.04.tar.xz

Entramos en la carpeta descomprimida la que está en azul e instalamos el driver con el comando.
$ ./amdgpu-install -y --opencl=pal,legacy

Para más información de como instalar el driver en ubuntu podemos consultar el manual en la página del fabricante AMD

Una vez termina la instalación tenemos que activar overdriver en el kernel del sistema, para ello editamos el archivo grup de linux con el comando
$ sudo nano /etc/default/grub

Buscamos la línea donde diga
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"

Lo editamos y lo dejamos como.
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash amdgpu.ppfeaturemask=0xffffffff"

Guardamos y actualizamos el grub
$ sudo update-grub

Y reniniciamos el Rig y ya tendremos control sobre las GPU’s
$ sudo reboot

Como ajustar los valores de la GPU para un optimo rendimiento

Las gráficas que estoy utilizando son las Sapphire Pulse Radeon RX 580 8GB GDDR5 así que solo puedo hablar bajo mi experiencia de los ajustes a este modelo de gráficas, los ajustes consisten en modificar las frecuencias y voltajes para que tenga un menor consumo con el máximo hash rate posible, de esta manera alargaremos la vida útil de nuestro hardware lo más posible. De fábrica el consumo es de unos 160w y un hash rate de 22MH/s, modificando estos valores he conseguido bajar el consumo a 99w con el mismo hash rate. A este procedimiento se conoce en el mundo de la minería de criptomonedas como undevolt, dicho esto empezamos con la fiesta.

Todas las tarjetas se listan dentro del sistema bajo la ruta /sys/class/drm/ son todos enlaces simbólicos, si nos vamos hasta esa ruta veremos desde la tarjeta integrada en placa que tiene el nombre de card0 hasta la última RX580 con nombre card3

Para los ajustes de frecuencias y voltajes se hace en un fichero que ha generado el grub al reiniciar el sistema con el nombre de pp_od_clk_voltage dentro estarán todas las frecuencias y voltajes colocados en un orden concreto, en el caso de las RX580 tiene ocho niveles de frecuencia/voltaje del procesador y tres de frecuencia /voltaje de las memorias.
Si utilizamos una de las tarjetas como ejemplo, utilizaremos la card1 la ruta hacia ese fichero es /sys/class/drm/card1/device
En la siguiente imagen se puede ver los valores de fábrica de la GPU

Si nos fijamos en el archivo vemos unas líneas numeradas en el caso del procesador va del 0 al 7 y en el caso de la memoria del 0 al 2, tomando por ejemplo la línea 7 de la imagen superior nos fijamos que pertenece al procesador y en la misma línea hay un número 1366MHz esa es la frecuencia de trabajo y 1150mv es el voltaje al que trabaja.

Lo primero es pasar el ajuste de la GPU de modo automático a manual para poder hacer los cambios.
echo “manual” > /sys/class/drm/card1/device/power_dpm_force_performance_level

Para modificar los valores de frecuencia y voltaje utilizaremos los siguientes comandos.
echo “s 7 1209 900” > /sys/class/drm/card1/device/pp_od_clk_voltage
echo “m 2 1850 850” > /sys/class/drm/card1/device/pp_od_clk_voltage

Analicemos el primer comando, s es para el procesador 7 es la línea que queremos editar 1209 es la frecuencia de trabajo y 900 el voltaje de trabajo.
El segundo comando, m es para la memoria 2 es la línea e editar 1850 es la frecuencia 850 el voltaje

Hay dos maneras de dejar los ventiladores de la GPU o en automático y estos se ajustarán en función de la temperatura o en modo manual y los podemos poner a la velocidad que queramos, por mi experiencia la mejor manera es dejarlos en manual, esta línea tiene dos valores. El valor 2 es para modo automático y 1 es para modo manual, lo dejamos en 1
echo “1” > /sys/class/drm/card1/device/hwmon/hwmon2/pwm1_enable

Una vez pasado a modo manual editaremos el porcentaje de velocidad del ventilador, donde 128 es el porcentaje, ahora le toca a ustedes averiguar cual es el mejor valor para su GPU
echo “128” > /sys/class/drm/card1/device/hwmon/hwmon2/pwm1

Una vez esté todo configuramos a nuestro gusto los tenemos que guardar para que se hagan efectivos y la GPU empiece a trabajar con los nuevos parámetros.
echo “c” > /sys/class/drm/card1/device/pp_od_clk_voltage

Ahora que ya sabemos la manera de ajustar la GPU lo que hago para automatizar el procesos es crearme un fichero en bash con el nombre StartGPU.sh donde pongo todos los ajustes de las tarjetas y las configuro todas al mismo tiempo, todos los parámetros que muestro en el fichero no significan se vayan a funcionar en tu sistema, tu tendrás que descubrir que configuraciones son las más óptimas para tu equipo.
El archivo quedaría de esta manera.

#!/bin/bash
#Configuracion de primera tarjeta AMD RX580 de 8Gb
echo “manual” > /sys/class/drm/card1/device/power_dpm_force_performance_level
echo “s 0 300 750” > /sys/class/drm/card1/device/pp_od_clk_voltage
echo “s 1 600 769” > /sys/class/drm/card1/device/pp_od_clk_voltage
echo “s 2 918 875” > /sys/class/drm/card1/device/pp_od_clk_voltage
echo “s 3 1145 880” > /sys/class/drm/card1/device/pp_od_clk_voltage
echo “s 4 1160 885” > /sys/class/drm/card1/device/pp_od_clk_voltage
echo “s 5 1180 890” > /sys/class/drm/card1/device/pp_od_clk_voltage
echo “s 6 1200 900” > /sys/class/drm/card1/device/pp_od_clk_voltage
echo “s 7 1245 900” > /sys/class/drm/card1/device/pp_od_clk_voltage
echo “m 0 300 750” > /sys/class/drm/card1/device/pp_od_clk_voltage
echo “m 1 1000 800” > /sys/class/drm/card1/device/pp_od_clk_voltage
echo “m 2 1900 875” > /sys/class/drm/card1/device/pp_od_clk_voltage
echo “c” > /sys/class/drm/card1/device/pp_od_clk_voltage
echo “1” > /sys/class/drm/card1/device/hwmon/hwmon2/pwm1_enable
echo “128” > /sys/class/drm/card1/device/hwmon/hwmon2/pwm1


#Configuración de segunda tarjeta AMD RX580 de 8Gb
echo “manual” > /sys/class/drm/card2/device/power_dpm_force_performance_level
echo “s 0 300 750” > /sys/class/drm/card2/device/pp_od_clk_voltage
echo “s 1 600 769” > /sys/class/drm/card2/device/pp_od_clk_voltage
echo “s 2 918 875” > /sys/class/drm/card2/device/pp_od_clk_voltage
echo “s 3 1145 880” > /sys/class/drm/card2/device/pp_od_clk_voltage
echo “s 4 1160 885” > /sys/class/drm/card2/device/pp_od_clk_voltage
echo “s 5 1180 890” > /sys/class/drm/card2/device/pp_od_clk_voltage
echo “s 6 1200 900” > /sys/class/drm/card2/device/pp_od_clk_voltage
echo “s 7 1245 900” > /sys/class/drm/card2/device/pp_od_clk_voltage
echo “m 0 300 750” > /sys/class/drm/card2/device/pp_od_clk_voltage
echo “m 1 1000 800” > /sys/class/drm/card2/device/pp_od_clk_voltage
echo “m 2 1900 875” > /sys/class/drm/card2/device/pp_od_clk_voltage
echo “c” > /sys/class/drm/card2/device/pp_od_clk_voltage
echo “1” > /sys/class/drm/card2/device/hwmon/hwmon3/pwm1_enable
echo “128” > /sys/class/drm/card2/device/hwmon/hwmon3/pwm1

# Configuración de segunda tarjeta AMD RX580 de 8Gb
echo “manual” > /sys/class/drm/card3/device/power_dpm_force_performance_level
echo “s 0 300 750” > /sys/class/drm/card3/device/pp_od_clk_voltage
echo “s 1 600 769” > /sys/class/drm/card3/device/pp_od_clk_voltage
echo “s 2 918 875” > /sys/class/drm/card3/device/pp_od_clk_voltage
echo “s 3 1145 880” > /sys/class/drm/card3/device/pp_od_clk_voltage
echo “s 4 1160 885” > /sys/class/drm/card3/device/pp_od_clk_voltage
echo “s 5 1180 890” > /sys/class/drm/card3/device/pp_od_clk_voltage
echo “s 6 1200 900” > /sys/class/drm/card3/device/pp_od_clk_voltage
echo “s 7 1245 900” > /sys/class/drm/card3/device/pp_od_clk_voltage
echo “m 0 300 750” > /sys/class/drm/card3/device/pp_od_clk_voltage
echo “m 1 1000 800” > /sys/class/drm/card3/device/pp_od_clk_voltage
echo “m 2 1900 875” > /sys/class/drm/card3/device/pp_od_clk_voltage
echo “c” > /sys/class/drm/card3/device/pp_od_clk_voltage
echo “1” > /sys/class/drm/card3/device/hwmon/hwmon4/pwm1_enable
echo “128” > /sys/class/drm/card3/device/hwmon/hwmon4/pwm1

Este fichero lo tengo en el directorio donde tengo el minero y lo ejecutamos con el comando.
$ sudo ./StartGPU.sh

La manera de averiguar que configuraciones son las apropiadas para tu sistema es con el método de prueba y error, tienen que saber que estas configuraciones no son permanentes y se irán cada vez que reinicien el Rig, así que si establecen una mala configuración que hace que se bloquee el Rig con solo reiniciarlo, recuperarán todos los valores de fábrica. ¡¡¡Ojo y esto es muy importante.. siempre que bajes el voltaje tu GPU no sufrirá ningún daño, si por el contrario y nos equivocamos en los valores de voltaje y los subimos más de la cuenta puedes dañar la!!! .

Empezamos el ajuste, lo primero es poner en marcha el software del minero, las GPU’s tienen que estar en carga para poder ajustar el rendimiento óptimo.
Empezamos con el ajuste del procesador y en la línea 7, es donde el sistema pillará los parámetros para trabajar, dejamos sin tocar el voltaje y vamos bajando la frecuencia a valores de -0,5 en -0.5 hasta que se vea una perdida de velocidad de minado ahí sabremos el límite mínimo de frecuencia a la que puede trabajar sin perdidas significativas de velocidad.
Ahora pasamos a ajustas el voltaje y hacemos lo mismo que con la frecuencia, vamos bajando de -0.5 en -0.5 hasta que se bloquee la GPU y deje de trabajar, ahí sabremos el límite mínimo de voltaje, reiniciamos el rig y ajustamos el valor al último valor conocido donde la GPU no se bloqueó y seguimos bajando ahora de -0.05 en -0.05 esto es un ajuste fino y haremos el mismo procedimiento que el paso anterior.
Una vez tenemos ya el límite mínimo en voltaje que la GPU puede trabajar sin bloquearse podemos ver que el consumo en watios ha disminuido, una vez llegado a este punto yo prefiero perder un poco más de velocidad de minado pero una cosa mínima en detrimento del aumentar el tiempo de vida útil de la GPU.
Para eso empiezo a bajar la frecuencia en valores de -0.005 y voy observando la perdida de hasers, a suponer que el máximo que mi tarjeta puede minar con todos los parámetros de fábrica es de 22MH/s voy bajando la frecuencia de -0.005 en -0.005 hasta que la velocidad caiga a 21.9MH/s ahí paro y luego hago lo mismo con el voltaje, solo esa pequeña perdida hace que podamos bajar más el voltaje de la GPU y pase el consumo de 160W a pleno rendimiento a 99W, baja el consumo y por ende el calor generado y le damos más tiempo de vida útil a la GPU.
El siguiente paso es hacer lo mismo con la memoria.
¡¡OJO!! cada vez que queramos cambiar de moneda tenemos que ajustar las gráficas a ese algoritmo, ósea que tendremos que repetir el proceso por cada algoritmo

Poner en marcha el Rig

Ya con todo configurado ponemos en producción el Rig, no utilizo entorno gráfico no lo considero necesario para esto, así que trabajo en entorno servidor y me conecto a el por SSH con la herramienta Putty si estas en una intranet con solo poner la IP del Rig ya te conectas si estás fuera de la red local pues tendrás que poner o un dominio o la IP de la línea, no voy a entrar en este tipo de detalles de como configurar los puertos del router para tener acceso por SSH fuera de tu red lan y de como utilizar una DNS en IP dinámicas.

Conectamos por SSH con Putty al Rig

Vamos a la ruta donde tenemos las configuraciones de las GPU’s y las cargamos con el comando.
$ sudo ./StartGPU.sh

El problema de utilizar el protocolo SSH es que cuando cierras la sesión el minero se para, para evitar esto vamos a trabajar con entornos SSH virtuales, para el ejemplo voy a utilizar el pool nanominer

Creamos un entorno virtual tipenado $ screen -S nombre_que_queramos
$ screen -S nanominer

Se crea una nueva terminal virtual, nos vamos al directorio donde está el minero y lo ponemos en marcha.
$ sudo ./nanominer

Para salir de la sesión y que no se cierre pulsamos Ctrl+A y luego D

Para recuperar la sesión tecleamos.
$ screen -r nanominer

Para ver las sesiones que tienes abiertas.
$ screen -ls

Para cerrar una sesión tecleamos kill (numero de proceso) mostrado en screen -ls
$ kill 31158

El resultado sería algo parecido a esto, las velocidades son mucho más altas en la imagen pero es por que he modificado la bios de las GPU’s para aumentar el rendimiento.

Ahora solo faltaría la instalación del software de minería, yo uso nanominer y trabajo en el pool Nanopool pero teniendo ya un Rig armado y funcionado cada uno puede ponerlo a trabajar en el pool y moneda que quiera.

Fuentes consultadas:
How to undervolt the AMD RX 4XX and RX 5XX GPUs
How to overclock your AMD GPU on Linux

Protección a intentos de accesos no autorizados:

Es muy importante proteger nuestro Rig de las malas intenciones de los hacker y para eso instalaremos medidas de seguridad, lo primero que tenemos que hacer es si vamos a controlar el Rig en remoto por medio del protocolo SSH es redireccionar el puerto, el protocolo utiliza el puerto 22 y los hackers lo saben, pues para ponérselo más difícil redireccionaremos el puerto en el router utilizando por ejemplo como puerto externo el 5400 y en interno 22

Instalamos Fail2ban

fail2ban

Instalamos Google Authenticator

2FA Google Authenticator

Deja un comentario