PVE 8.2 RTX 5090 GPU Passthrough (顯卡通透)

PVE 8 加上GPU Passthrough(顯卡通透)可能是5090或主機板太新,一直卡關,因此我有必要紀錄一下如何攻克。

話說我前幾天終於說服公司購買好一點的顯示卡,因為什麼PCI-E 16倍是什麼鬼我都不懂,於是快馬加鞭衝去原價屋找專業店家買主機,先說要買頂規的5090,店家就自動會展開相關配置了,而且額外不收費。

主機板:Z890 Aorus master 
CPU:Inten Core ultra 9 285K
記憶體:256GB
M.2.: 1T
顯卡:ASUS ROG ASTRAL RTX 5090 32G 水冷
power:1300 瓦

收到貨之後,想說主機這麼好,應該要安裝pve多工使用;但之前一直沒試過顯卡通透功能,爬文得知

  1. 主機板要打開vt-d (iommu),以及sr-iov功能
  2. pve 修改支援PCI passthrough,開通vfio-pci功能
    請參考官網作法,顯卡做通透之後,就不能讓pve主機使用(只能用在虛擬主機)。
    PCI passthrough 允許您在虛擬機 (VM) 內使用實體 PCI 裝置 (顯示卡、網際網路卡),但此功能僅限於 KVM 虛擬化環境。如果您對某裝置執行「PCI passthrough」,該裝置將不再可供主機使用。請注意,已通過 PCI passthrough 的虛擬機無法進行遷移。

實際上我安裝pve 8.4.1的時候照著設定,一直不行,後來想說是不是版本太新,因此改用8.3.1也不行,後來再改成8.2.2也不行,我總共測試了這些做法:

  1. Avic.blog
  2. Zen’s blog
  3. ithome的william mou

文章都說只要開通vfio-pci以及iommu就可以了,我照做也開通成功。

lspci -nnk

dmesg | grep -e DMAR -e IOMMU

但實際上新增vm一直無法出現開機bios畫面,一看就知道通透失敗。

甚至我都扒出有些設定新版pve 8 棄用,也改用新的設定 initcall_blacklist=sysfb_init,但一樣GG。

我後來繼續拿8.2.2來測試其他作法(不想再重灌8.4.1),無意間在這裡發現新大陸,裡面提到一個設定要加上去

我測試了也還是失敗,就在此時我突然如到電影盜夢空間(全面啟動)情節,不自覺自己下了一個指令 modinfo -p vfio-pci,系統居然多嘴跟我說還有其他設定要加上企

我把這些設定都加到 /etc/modprobe.d/vfio.conf 裡面( 加完記得要 update-initramfs -u -k all )。

disable_denylist=1 disable_idle_d3=1 enable_sriov=1

再重開vm就成功進入開機畫面了,vm 安裝完ubuntu 24.04,還要安裝 nvidia 驅動測試是否能通透。

我參考了這兩篇

https://docs.nvidia.com/datacenter/tesla/driver-installation-guide/index.html#ubuntu-installation

https://docs.nvidia.com/cuda/cuda-installation-guide-linux/index.html#common-installation-instructions-for-ubuntu

安裝完畢,執行 nvidia-smi,看到心愛的 5090 就安心了。

最後安裝docker(須重開docker),我參考張騰元文章

docker安裝完畢,我讓docker也能使用 nvidia ,請參考 https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html

終極目標:安裝 ollama ,讓大語言模型使用顯卡

docker run -d –gpus=all -v ollama:/root/.ollama -p 11434:11434 –name ollama ollama/ollama

至此大功告成。

使用容器(docker)自架N8N

使用容器 docker 自架N8N社群版非常簡單,但功能有所限制;雲端付費版每月最低20歐元,可解鎖更多功能,建議先使用雲端版14天試用看看,不符合期待再考慮自架。自架方式有很多種,容器方式為首選。

我的環境是:
1. 容器主機
RockyLinux 9.4,docker ce 27.03,postgres sql server 17
2. 代理伺服器主機 apache httpd 2.4
3. dns n8n.test.com

1. 建立docker-compose.yaml檔案
紅字部分須注意斟酌修改

version: "3"
services:
n8n:
image: n8nio/n8n
restart: always
ports:
- "5678:5678"
environment:
- N8N_BASIC_AUTH_ACTIVE=true
- N8N_BASIC_AUTH_USER
- N8N_BASIC_AUTH_PASSWORD
- N8N_HOST=n8n.test.com
- N8N_PORT=5678
- N8N_PROTOCOL=http
- NODE_ENV=production
- WEBHOOK_URL=https://n8n.test.com/
- DB_TYPE=postgresdb
- DB_POSTGRESDB_DATABASE=n8n
- DB_POSTGRESDB_HOST=postgres主機ip
- DB_POSTGRESDB_PORT=5432
- DB_POSTGRESDB_USER=使用者
- DB_POSTGRESDB_PASSWORD=密碼
- DB_POSTGRESDB_SCHEMA=public
- TZ=Asia/Taipei
- GENERIC_TIMEZONE=Asia/Taipei
- N8N_RUNNERS_ENABLED=true
- N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=true
- N8N_EMAIL_MODE=smtp
- N8N_SMTP_HOST=mail.hlmt.com.tw
- N8N_SMTP_PORT=587
- N8N_SMTP_USER=郵件帳號
- N8N_SMTP_PASS=郵件密碼
- N8N_SMTP_SENDER=sender@test.com
- N8N_SMTP_SSL=false
- N8N_SMTP_STARTTLS=true
- EXPRESS_TRUST_PROXY=true
- N8N_PROXY_HOPS=1
- N8N_PUSH_BACKEND=sse
# 若使用httpd proxy透過web socket請改成N8N_PUSH_BACKEND=websocket
volumes:
- .n8n:/home/node/.n8n


經過測試這版v1.86版,有權限問題,需要先手動建立.n8n,使用者設定為 1000
# mkdir -p .n8n
# chown -R 1000:1000 .n8n

2. 啟用n8n容器

執行 https://n8n.test.com 之後,就可以設定主人了

安裝完畢 ***社群版限制一個帳號,若郵件設定正確,可以再邀請別人加入。


實作一個玩玩看-檢查咖啡偶文章,有新的就通知

一開始先新增RSS Feed trigger:每天晚上查看一次咖啡偶網站 https://kafeiou.pw/feed


中間增加過濾器 filter,過濾當天是否有新的文章,若有就發email通知。

左邊使用java script,左邊變數名稱可以用拖拉的,把第一關卡日期拉進去,再調整日期格式。
右邊則為目前系統日期。
左右相同才會觸發右邊發郵件通知
左邊抓取RSS Feed Trigger從kafeiou獲得地的日期,右邊是當天

測試一下,大功告成。


另外在步驟一有提到使用web socket的方式進行反向代理參數設定,須修改docker-compose.yaml檔案
請改為N8N_PUSH_BACKEND=websocket 。httpd config 設定參考如下:

<VirtualHost *:443>
ServerName n8n.test.com

ErrorLog /var/log/httpd/ssl_error_log
TransferLog /var/log/httpd/ssl_access_log

SSLEngine On
SSLCertificateFile /etc/letsencrypt/live/n8n.test.com/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/n8n.test.com/privkey.pem
SSLCACertificateFile /etc/letsencrypt//live/n8n.test.com/fullchain.pem

SSLProxyEngine On
ProxyRequests Off
ProxyPreserveHost On
RequestHeader set X-Forwarded-Proto "https"
RewriteEngine On
RewriteCond %{HTTP:Upgrade} =websocket [NC]
RewriteRule /(.*) ws://容器主機IP:5678/$1 [P,L]
RewriteCond %{HTTP:Upgrade} !=websocket [NC]
RewriteRule /(.*) http://容器主機IP:5678/$1 [P,L]

<Location />
Order allow,deny
Allow from all
</Location>
</VirtualHost>

「Tolgee」自行架設(self-hosted),使用docker

上一篇文章「Tolgee」協助您開發多語系APP我建議公司內部使用tolgee;本篇簡易tolgee教學「tolgee該如何使用docker自行架設」

  1. 前置作業要把docker或podman,可以看這篇RockyLinux 安裝 docker準備好。
  2. 準備好外部的資料庫容器(postgres、mariadb),postgress可參考這篇postgres 指令(連線、安裝)
  3. 安裝容器
    這裡我採用連結外部postgres,請先行建立資料庫tolgee,
    其他環境變數(標示紅字),需自行調整。

docker-compose.yaml檔案

version: '3'

services:
app:
image: tolgee/tolgee:latest
volumes:
- ./data:/data
- ./config.yaml:/config.yaml
ports:
- '8090:8080'
deploy:
restart_policy:
condition: on-failure
env_file:
- .env
#若不使用外部postgres,可自架內部專用postgres
# db:
# image: postgres:13
# environment:
# POSTGRES_DB: tolgee
# POSTGRES_USER: admin
# POSTGRES_PASSWORD: admin
# volumes:
# - ./data/postgres:/var/lib/postgresql/data
# ports:
# - '5432ˊ:5432' # 讓外面也可存取

.config.yaml檔案

tolgee:
postgres-autostart:
enabled: false
spring:
datasource:
url: jdbc:postgresql://外部postgreIP:5432/tolgee
username: 帳號
password: 密碼

.env檔案

spring.config.additional-location: file:///config.yaml
TOLGEE_AUTHENTICATION_ENABLED=true
TOLGEE_AUTHENTICATION_INITIAL_PASSWORD=admin
TOLGEE_AUTHENTICATION_INITIAL_USERNAME=admin
TOLGEE_AUTHENTICATION_JWT_SECRET=my_jwt_secret #長度必須大於64
#TOLGEE_MACHINE_TRANSLATION_GOOGLE_API_KEY=my_google_api_key
TOLGEE_SMTP_AUTH=true
TOLGEE_SMTP_FROM=Tolgee <no-reply@mydomain.com>
TOLGEE_SMTP_HOST=email-smtp.regional-region.amazonaws.com
TOLGEE_SMTP_PASSWORD=omg/my/password
TOLGEE_SMTP_PORT=465
TOLGEE_SMTP_SSL_ENABLED=true
TOLGEE_SMTP_USERNAME=user@company.com

# 停用自行註冊功能,只能管理者邀請
TOLGEE_AUTHENTICATION_REGISTRATIONS_ALLOWED=false

# 搞定反向代理之後,請設定網站名稱(不然邀請函只會出現ip)
TOLGEE_FRONT_END_URL=https://tolgee.test.com

安裝完畢,管理者就可以寄發邀請email,或是連結給使用者,讓使用者加入專案

心得結論

Tolgee自架版本雖說有些限制,但已經很好用了,一般小公司有開發app的人已經不得了,不需要用企業版複雜功能。

windows 10 22h2啟用sslv3以及老舊加密法

windows 10 22h2 已經停用 sslv3 加密, 但是有些公司郵件伺服器還在使用sslv3,以及很老舊的加密方式,所以有必要啟用他們。

要啟用sslv3,可到 Nartac Software 下載 IIS Crypto 4.0

執行IIS Crypto程式,如下圖所示,點選 「Best Practices」-> 再選SSL3.0 ,或是全選也可,然後套用 Apply ->重開機,就可以重新讓windows 10 22h2 重振雄風繼續支援老舊加密法。

這樣就能爭取時間,趕緊升級舊系統囉。

選擇 “Cipher Suites”(如下圖) ,將能勾選的都選上,然後手動加上以下加密法,最後再一次apply,Reboot。

#請手動加入
TLS_DHE_RSA_WITH_AES_256_GCM_SHA384
TLS_DHE_RSA_WITH_AES_128_GCM_SHA256
TLS_RSA_WITH_3DES_EDE_CBC_SHA

mac lid closed 如何避免mac蓋子蓋上後電源關閉

Prevent Macbook Pro to sleep when lid closed

sudo pmset -a disablesleep 1
# 這個指令我測試會讓螢幕無法關閉,就不建議使用了 - 20250423

此外還要停用進入保護模式,以及休眠

Click Lock Screen, then select the menu next to Turn display off on power adapter when inactive. Pick Never.

https://www.lifewire.com/prevent-macbook-from-sleeping-when-lid-is-closed-5203069

另外我不喜歡開螢幕就開機,或是接電源也開機(Mac 版本需為 Sequoia 15.4.x ),可執行以下指令

sudo nvram BootPreference=%00
# 出處這裡 

windows uwp怎確認網站是否可存取

   try
{
var request = WebRequest.Create("https://tw.yahoo.com");
request.Timeout = 5000;
request.Method = "HEAD";

using (var response = (HttpWebResponse)request.GetResponse())
{
String s = response.StatusCode.ToString();
response.Close();
return s.Equals(System.Net.HttpStatusCode.OK.ToString());
}
}
catch (System.Net.WebException exception)
{
return false;
}

RockyLinux 9 使用usb硬碟備份,要避免硬碟進入休眠

過年要到了,小公司需要利用這時間進行系統備份,外接usb備份也很重要,備份完直接切斷usb硬碟連線,但我發現usb會進入休眠,不確定是否能終端機叫醒,因此乾脆直接改成不休眠狀態。

2013年有篇文章,有大佬分享心得

Linux官方參考資料

又是windows 11,停用TLS 1.0、TLS 1.1,只支援1.2

windows 11 從2024年開始,預設就停用TLS 1.0、TLS 1.1了。

表姊公司dovecot 內送郵件伺服器沒有支援TLS 1.2,解法就兩種

  1. 啟用windows 11 TLS 1.0、TLS 1.1
    https://learn.microsoft.com/en-us/windows/win32/secauthn/tls-10-11-deprecation-in-windows
  2. 讓dovecot相容TLS 1.2
    重點在Linux Server上的openssl 版本必須1.0.1或以上
    dovecot啟用TLS 1.2 做法如下:
    https://serverfault.com/questions/959186/error-performing-tls-handshake-with-dovecot-2-3-upgrade

我自己修改dovecot啟用TLS 1.2 做法如下:

  1. 產生dh.pem
    openssl dhparam 4096 > /etc/dovecot/dh.pem
  2. 修改 /etc/dovecot/conf.d/10-ssl.conf

ssl_dh =</etc/dovecot/dh.pem
ssl_min_protocol = TLSv1.2
ssl_cipher_list = ALL:!LOW:!SSLv2:!EXP:!aNULL
ssl_prefer_server_ciphers = yes

最後再更新我自己整合的郵件伺服器(綁定本地端微軟網域伺服器)
https://github.com/WilliamFromTW/docker-Postfix-AD


2024/01/10 (冏只隔一天又出現其他問題)

上次問題解決之後(windows 11其實有更新到24h2),後續又發現其他台windows 11未更新24h2,收發信還是有問題,但問題不太一樣

Jan 10 09:49:02 docker dovecot: pop3-login: Disconnected: Connection closed: SSL_accept() failed: error:1417A0C1:SSL routines:tls_post_process_client_hello:no shared cipher 

我除了更新mail server的postfix 、dovecot、openssl (RockyLinux 8.8) 外,變更dovecot一些設定,就解決問題了。

  1. 啟用windows 11 的TLS 1.0 、TLS 1.1
    依照微軟建議,我做成reg檔案,請按此下載匯入到windows啟用
  2. 更改dovecot設定,改成最小可支援 TLS 1.1 ,ssl_cipher_lis也修改(出處請參照這裡)
ssl_min_protocol = TLSv1.1
#ssl_cipher_list = ALL:!kRSA:!SRP:!kDHd:!DSS:!aNULL:!eNULL:!EXPORT:!DES:!3DES:!MD5:!PSK:!RC4:!ADH:!LOW:!DH@STRENGTH
ssl_cipher_list = ALL:!LOW:!SSLv2:!EXP:!aNULL

win11 22h2帶來的影響,無法連線MSSQL 2005

我表姊公司在1999年就開始使用高格EPR系統,這個系統使用當時開發windows程式的顯學 Borland 軟體架構(2-tier、3-tier),資料庫使用interbase 。

高格一路上升級,資料庫改成BDE+mssql 2005混合體,連線方式從netbeui改tcpip,用戶端作業系統從windown 98到windows 10也能使用。

我認為高格是一款很棒的軟體,不比我二姊公司現在還在使用生產力中心開發的老古董”excel 97 進銷存系統”差。

直到最近,表姊公司換新的筆電,原本依照步驟,將windows啟用.net framework 3.5、smb 1.0 ,安裝interbase、mssql 2005 client 就可以連到 mssql 2005 server,實際上安裝後,卻無法正常連線到資料庫;我找了很久找不出原因,只好google一下”win11 mssql 2005″,居然在ITHOME找到解法 https://ithelp.ithome.com.tw/questions/10212352(感謝 aaron3399mihihi) ,只要利用 IISCrypto 這個軟體(備用下載),將win11被移除的加密方式加回來,就可以連上mssql 2005 server了,也讓高格能繼續生存下去。

加回來的加密協定:

TLS_DHE_RSA_WITH_AES_256_GCM_SHA384
TLS_DHE_RSA_WITH_AES_128_GCM_SHA256
TLS_RSA_WITH_3DES_EDE_CBC_SHA

國外參考

1 2 3 ... 6