在Ubuntu 以Nvidia GTX 1070 挖礦Zcash 設定筆記

以下是紀錄基於興趣,摸索挖礦程式,Ubuntu 下Nvidia 卡配置的一些經驗。同樣也適合需要Nvidia 顯示卡來進行Cuda運算(AI, Deep learning等)但不希望影響日常顯示用途的需求。

筆者對於眾多電子貨幣應該挖哪一種並沒有太深入的研究,自然也沒有太關心波動、收益等等,只是興趣研究,不打算長期投入。本文提到Zcash 也只是因為在Ptt 搜尋到Nvidia 卡較適合挖Zcash。

機體配備如下:

  • CPU: Intel i5-4460 (HD 4600 內顯)
  • Motherboard: Asus H97 Pro Gamer
  • Graphic Card: EVGA Nvidia GTX 1070

各種嘗試

一開始,我先安裝最新版的Ubuntu 17.04, 並且加入了Nvidia 官方的PPA 安裝到最新版的Nvidia 驅動以及Cuda tookit。因為我本來兩個螢幕都接在Nvidia GTX 1070上面,安裝完驅動程式重開機以後,其實就沒有什麼問題,下載EWBF cuda miner 按照說明填入Pool 位址就可以開挖了。只是,程式一但啟動,所有Ubuntu 桌面的程式都會開始Lag, 如果電腦就這樣掛在那邊也就算了,可是我希望平常仍舊可以順順的執行一些基本工作如瀏覽網頁、編寫Markdown文件等。這時候我突然想到:對呀,Intel CPU i5-4460 不是有內顯,一直沒有啟用?如果我用其處理日常顯示硬體加速,然後讓Nvidia GTX 1070 全力跑運算,豈不是很美妙?

然而,事情當然不會這麼順利,否則我也不會打這一篇了。

使用Nvidia提供的命令工具 prime-select 切換到intel顯示,登出再登入以後,再去啟動EWBF cuda miner 會出現錯誤無法啟動。在terminal 內使用prime-select 切回nvidia 後就可以了,只是這時候在Ubuntu 啟動任何程式都會出現錯誤,變成只有EWBF cuda miner 可以跑。這時候在下指令prime-select 切回intel 又可以了。但是每次都要切不是很麻煩?

研究國外論壇討論後,發現不能使用PPA 加入的方式安裝cuda 以及Nvidia driver, 會安裝到opengl 以及nvidia-prime 一些有的沒有的。然後必須要以xorg.conf 給實際沒有輸出畫面到螢幕的Nvidia 卡啟用後,Nvidia Driver才會載入。

配置步驟

總結一下配置順序:

我採用Ubuntu 是因為對其套件系統最熟悉,也不想花太多時間在系統的調整上。但是其實在Linux 發行版中我最認同Arch Linux 的哲學,因為Ubuntu 很多套件包雖然看起來都包好替你做了很多事,但是實際上使用者在不清楚系統被做了什麼的情況下,要進行進階修改就很容易出事。

如果要採用Ubuntu ,建議還是使用16.04,因其為長期支援版,許多套件開發者也只會提供相對應的編譯設定。

Nvidia 卡如果有要在多重開機其他的作業系統下接螢幕使用,建議在安裝Ubuntu 的情況下先不要接,像我就是Benq 螢幕有HDMI跟DVI端口,平常用DVI端口連接到獨顯,在安裝Ubuntu 時先拔掉DVI 然後用HDMI接到主機板上intel 內顯的接口。

在安裝完Ubuntu後,不要腦衝馬上啟用Nvidia第三方驅動程式

如果你已經安裝了……那請先移除吧

sudo apt-get remove --purge nvidia-*

請先到Nvidia 官網下載Linux 的cuda toolkit 以及 Driver

我是先安裝cuda, Nvidia 官方Cuda 安裝包內附的Driver 較舊,所以我安裝完以後又再安裝Driver,我不知道順序有沒有影響。

先確認有沒有安裝build-essential

sudo apt-get install build-essential

建立blacklist 擋掉Ubuntu 預設會載入的nouveau 驅動

sudo nano /etc/modprobe.d/blacklist-nouveau.conf
//在檔案內加入這兩行
blacklist nouveau
options nouveau modeset=0

先更新kernel ramdisk
sudo update-initramfs -u
sudo reboot

接下來安裝剛剛載下來的東西

在安裝的時候,需要先停掉lightdm,請先按下 Ctrl + Alt + F1 切到Text Console Mode

sudo service lightdm stop // 停掉lightdm

sudo sh "cudai-installer-file-name" --no-opengl-libs //啟動Nvidia Cuda 安裝檔,且不要安裝opengl

這時候,啟動成功的話,會跳出長長的Agreement 要你確認,再下一步有可能會跳出警告說:你仍然有X server 正在執行中,請先關閉它。不過理論上前面關掉lightdm 就已經關掉了才對。沒關係,直接先下一步看紀錄檔。cat 出紀錄檔訊息以後,會告訴你xorg PID 數字跟/tmp/.X0-lock 檔案被鎖住,

我是直接kill 掉xorg 跟rm -rf /tmp/.X0-lock,這時候再去執行一次安裝檔就可以順利執行進到下一步了。

接下去會問你好幾個東西,Driver 反正之後還會裝,隨便你要不要裝,X server config 請先不要update, 之後要自己建一個。然後接著問你要不要安裝cuda當然選要。

安裝好後,重新啟動一次,接著安裝最新的nvidia driver,也是需要先停掉X server,所以就照上面的指令做,然後要安裝Driver時:

sudo sh "nvidia-driver-filename" --no-opengl-files

一樣如果碰到X server 還在的問題的話,也是看安裝錯誤紀錄檔找到PID 把它kill 掉

中間有問要不要安裝dkms , 我這邊是選要。

最後安裝好重新啟動後,有些人可能已經可以開始在不接螢幕的情況下開始跑cuda 了。不過有些人因為需要調整超頻,啟用nvidia-settings 時會出現”Missing extensions “錯誤。

超頻xorg.conf 設定

經過搜集資料以後,了解到Nvidia 顯示卡要在Linux 超頻的話需要很奇葩的透過xorg.conf 來假裝他有一個screen 裝置才能進行超頻的動作。

於是我在/etc/X11/xorg.conf (如果沒有請自行新增)內的設定如下:

Section "ServerLayout"
    Identifier     "Layout0"
    Screen      0  "Screen0"
    Screen      1  "Screen1"
    InputDevice    "Keyboard0" "CoreKeyboard"
    InputDevice    "Mouse0" "CorePointer"
EndSection

Section "Files"
EndSection

Section "InputDevice"
    # generated from default
    Identifier     "Mouse0"
    Driver         "mouse"
    Option         "Protocol" "auto"
    Option         "Device" "/dev/psaux"
    Option         "Emulate3Buttons" "no"
    Option         "ZAxisMapping" "4 5"
EndSection

Section "InputDevice"
    # generated from default
    Identifier     "Keyboard0"
    Driver         "kbd"
EndSection

Section "Monitor"
    Identifier     "Monitor0"
    VendorName     "Unknown"
    ModelName      "Unknown"
    HorizSync       28.0 - 33.0
    VertRefresh     43.0 - 72.0
    Option         "DPMS"
EndSection

Section "Device"
    Identifier     "Device0"
    Driver         "intel"
    BusID          "PCI:0:2:0"
EndSection

Section "Device"
    Identifier     "Device1"
    Driver         "nvidia"
    VendorName     "NVIDIA Corporation"
    BoardName      "GeForce GTX 1070"
    BusID          "PCI:1:0:0"
    Option         "ConnectedMonitor" "DFP-0" //代表不連接任何顯示器
    Option         "Coolbits" "31" //啟用進階超頻功能
    Option         "AllowEmptyInitialConfiguration" "true" // 強制啟用顯示卡
EndSection

Section "Screen"
    Identifier     "Screen0"
    Device         "Device0"
EndSection

Section "Screen"
    Identifier     "Screen1"
    Device         "Device1"
    Option         "Coolbits" "31"
    Option         "UseDisplayDevice" "none" 
    Option         "RegistryDwords" "PerfLevelSrc=0x2222"
EndSection

請注意我的Screen0 給Monitor0 都是指向Device0 也就是intel 內顯。另外Nvida 裝置仍然有新增額外的Screen 指向他,但是不會連接任何顯示器。

至於兩個裝置的BusID 可以如下指令取得

lspci | grep -i vga

新增完,重新啟動以後,應該就可以在nvidia-settings 控制台內看到顯示卡溫度、風扇以及超頻調整的選項了。

我在Ubuntu 17.04碰到一個奇怪的bug是我無論怎麼新增xorg.conf 在/etc/X11 的路徑重新啟動後都會被刪掉,很無言。

如果確認xorg.conf 作用後,就可以下指令超頻了。新增一個bash 檔:

#!/bin/bash
nvidia-settings -a '[gpu:0]/GPUPowerMizerMode=1' //調整Performance Level
nvidia-settings -a '[gpu:0]/GPUGraphicsClockOffset[3]=200' 
nvidia-settings -a '[gpu:0]/GPUMemoryTransferRateOffset[3]=500'
nvidia-settings -a '[gpu:0]/GPUFanControlState=1' //允許風扇控制
nvidia-settings -a '[fan:0]/GPUTargetFanSpeed=100' //不怕吵的話直接調到100%

gpu:0, gpu:1 ……可以用nvidia-smi 指令列出來,或者nvidia-settings query出來,可以看manual

然後檔案看要手動執行還是要在statup 內每次登入自動執行也可。

原先沒超頻EWBF cuda miner 大概400 sol/s 左右,超頻後可以到450 sol/s

EWBF Cuda Miner Github

至於怎麼設定挖Zcash 就請自行研究囉。

參考

  1. http://www.markbuckler.com/post/install-cuda/
  2. https://www.reddit.com/r/EtherMining/comments/6gfnzi/overclocking_of_multiple_gtx_1070_cards_on_375/
  3. https://forum.ethereum.org/discussion/7780/gtx1070-linux-installation-and-mining-clue-goodbye-amd-welcome-nvidia-for-miners
  4. https://forums.geforce.com/default/topic/1014760/geforce-1000-series/gtx-1070-cannot-control-overclock-settings-on-ubuntu-16-04-/
撰寫 by Gbanyan
一個剛受完病理組織、解剖生理摧殘完的醫學生,準備踏入臨床學習之路。 除了從醫之路的所見所聞,一些雜談外, 也想寫一些自己對3C資訊、網路趨勢的一些觀察、心得。