Uxplay + Raspberry 自動啟動 autostart

最近在弄 UxplayRaspberry Pi 4 B 上面的自動啟動遇到的一些問題和解決方式筆記一下 (好喔 上次寫在 blog 筆記也好幾年了www)

首先 Uxplay 安裝其實很簡單

Raspberry 如果安裝的 image 是 Desktop 的版本

只要簡單的使用 apt 安裝就好了

sudo apt install uxplay

問題是幾乎沒用過 Linux desktop 了,所以超不熟wwwww

安裝完 uxplay 直接執行

uxplay -bt709

參數要加上 -bt709 是因為我用的是 raspberry 4B 和 raspberry OS(debian)

其他的 OS 或是硬體不一定需要加這個

這細節很多 詳情可參考 uxplay 的 README 這邊不再贅述

當測試完啟動投影是正常之後,接下來是自動啟動的問題

方法大概是兩種(擇一)

  • debian 系統的 systemd
  • 視窗系統的 autostart

systemd

這個訪法其實比較通用,因為系統改版不太會改這個架構,而採用視窗系統的 autostart 比較容易跟系統版本推進採用不同視窗系統,以至於方法有所變動。

首先先建立並編輯一個服務檔

sudo vi /etc/systemd/system/uxplay.service

內容如下

[Unit]
Description=Uxplay autostart
After=graphical.target

[Service]
ExecStart=/usr/bin/uxplay -bt709
Environment=DISPLAY=:0
User={your_login_id_for_desktop}

[Install]
WantedBy=graphical.target

其中 User= 後面要改成你登入視窗介面用的 user

然後測試啟動

sudo systemctl start uxplay.service

停止

sudo systemctl stop uxplay.service

設置自動啟動

sudo systemctl enable uxplay.service

這樣就完成了

視窗系統的 autostart

寫這篇主要是因為摸這個一直弄錯wwwww

首先先要搞清楚 raspberry 的 desktop 環境組成到底是誰組成

是 X11 ? LXDE ? wayland ? wayfire ? labwc ?

搞到最後才知道原來現煮時 (2024.12.08) 是使用 Wayland + labwc

當知道是這兩個組成的話,事情就變超簡單的了 只是我搞了三個小時才弄清楚wwwww

來看一下 labwc 官網說明文件 搜尋 autostart 就找到方法了

首先 labwc 設定檔都放在 ~/.config/labwc 資料夾

如果找不到就開一個

mkdir -p ~/.config/labwc

然後編輯一個自動執行檔

vi ~/.config/labwc/autostart

內容其實就是一般的 shell script ,官網也有 範例可參考 ,但這範例沒有我們要用的東西

我們自己編輯 內容如下

export DISPLAY=:0
/usr/bin/uxplay -bt709

這樣就可以了

測試就重開機一下吧

更新: 放在 /etc/xdg/labwc/autostart 也是可以

備註

以上兩種方法都以最簡單的方式啟動 uxplay

如果您要增加額外的參數或是做錯誤輸出之類的請自己處理嚕

測試環境

Raspberry Pi 4b

Raspberry Pi OS (64bit) Debian bookworm with Desktop 2024.11.19

802.1x 無線網路驗證 FreeRADIUS + Microsoft AD

首先感恩廖大讚歎廖大(chianan_liao)的分享私人筆記才有這篇騙吃騙喝的文章

現況

  • 有一台該死的Microsoft AD(Active Directory) 但我離不開她 (其實用 samba 的偽 AD 也可以)
  • 我的無線網路環境有一堆人要用,不想用單一密碼,我需要 802.1x 做無線網路驗證,讓每個人打自己的 AD 帳密連線

架構

本文就是要弄出右上角這台 RADIUS Server

  • 網域: alexw.net
  • 網域簡寫: ALEXW
  • 原本就有的 AD Server
    host: ads.alexw.net
    ip: 192.168.1.2
  • 本文要建立的 FreeRADIUS + samba
    host: rad.alexw.net
    ip: 192.168.1.3

本文測試環境: Debian 10 / Windows Server 2019

前置作業

裝好一台 debian,設置 hosts 對應

debian 會設置 127.0.1.1 對應本機,這個註解掉改為 host ip

/etc/hosts

127.0.0.1   localhost
# 127.0.1.1 rad.alexw.net  rad
192.168.1.3    rad.alexw.net rad

設置 DNS server (設為兼任 dns 的 AD server)

/etc/resolv.conf

nameserver 192.168.1.2
domain alexw.net
search alexw.net

安裝套件

安裝 freeradius 和 samba 等相關套件

apt install freeradius samba-common winbind krb5-config libpam-winbind libnss-winbind -y

設定 krb5

/etc/krb5.conf

[libdefaults]
    dns_lookup_realm = false
    dns_lookup_kdc = true
    default_realm = ALEXW.NET
    
[realms]
    ALEXW.NET = {
        kdc = ads.alexw.net
        admin_server = ads.alexw.net
    }
​
[domain_realm]
    .alexw.net = ALEXW.NET
     alexw.net = ALEXW.NET

設定 samba

/etc/samba/smb.conf

* * security = ADS  這行的 ADS 不是 ads.alexw.net 的 server name 而是真的要打 “ADS” * *

[global]
    security = ADS
    workgroup = ALEXW
    ntlm auth = Yes
    realm = ALEXW.NET
    client NTLMv2 auth = YES
    log file = /var/log/samba/log.%m
    max log size = 1000
    logging = file
    log level = 1
    password server = ads.alexw.net
    winbind use default domain = true
    winbind offline logon = false
    template homedir = /home/%U
    template shell = /bin/bash
    idmap config * : backend = tdb
    idmap config * : range = 10000-20000

/etc/nsswitch.conf

passwd:         compat winbind
group:            compat winbind
shadow:         compat winbind
gshadow:       files
​
hosts:             files dns
networks:      files
​
protocols:      db files
services:         db files
ethers:            db files
rpc:                  db files
​
netgroup:       nis

加入網域

把這台機器加入 AD 網域,當個快樂的 AD 成員(使用 administrator 帳號,理論上非 administrator 也可以)

net ads join -U administrator

下面這錯誤可以忽略 這是動態更新 DNS 失敗(因為伺服器都設置 static dns 不做 dynamic)

Enter administrator's password:
Using short domain name -- ALEXW
Joined 'RAD' to dns domain 'alexw.net'
DNS Update for rad.alexw.net failed: ERROR_DNS_UPDATE_FAILED
DNS update failed: NT_STATUS_UNSUCCESSFUL

備註:以後如果機器撤掉要退網域則使用 (現在不要打這行指令啦啊啊啊)

## 這是退網域用的指令
## net ads leave -U administrator

重啟 winbind

systemctl restart winbind

測試是否能讀取 AD 使用者和群組的資料

wbinfo -u
wbinfo -g

測試帳號登入

ntlm_auth --username={AD_USER_ACCOUNT} --password={AD_USER_PASSWORD}

正確會出現

NT_STATUS_OK: The operation completed successfully. (0x0)

設定FreeRADIUS

把 freerad 帳號加入 winbindd_priv 群組

usermod -a -G winbindd_priv freerad

重啟 winbind

systemctl restart winbind

編輯 FreeRADIUS 設定

/etc/freeradius/3.0/radiusd.conf 不需更改

編輯用戶端設定

/etc/freeradius/3.0/clients.conf

secret 後面接的是 radius 用的 secret key (自行設定)

client localhost {
    ipaddr = 127.0.0.1
    secret   = AAA@AAA
}
​
client localhost_ipv6 {
    ipv6addr = ::1
    secret   = AAA@AAA
}
​
client private-network-1 {
    ipaddr  = 192.168.0.0/16
    secret  = AAA@AAA
}

修改 mschap

/etc/freeradius/3.0/mods-available/mschap

mschap {
    use_mppe=yes
    require_encryption = yes
    require_strong = yes
    with_ntdomain_hack = yes
​
    winbind_username = "%{mschap:User-Name}"
    winbind_domain = "ALEXW"
​
   ntlm_auth = "/usr/bin/ntlm_auth --allow-mschapv2 --request-nt-key --username=%{%{Stripped-User-Name}:-%{%{User-Name}:-None}} --challenge=%{%{mschap:Challenge}:-00} --nt-response=%{%{mschap:NT-Response}:-00}"
​
}

修改 /etc/freeradius/3.0/mods-available/ntlm_auth

修改裡面的 path 和 domain

exec ntlm_auth {
    wait = yes
    program = "/usr/bin/ntlm_auth --request-nt-key --domain=ALEXW --username=%{mschap:User-Name} --password=%{User-Password}"
}

測試 RADIUS 連線

停止服務並改用啟動偵錯模式 freeradius -X

systemctl stop freeradius
freeradius -X

然後用另一個 console 測試連線測試本地端 (本地開 18120,如果是遠端則是 1812)

radtest -t mschap {USER} "{USER_PASSWORD}" localhost:18120 0 AAA@AAA

成功會得到這樣的訊息

Sent Access-Request Id 12 from 0.0.0.0:57999 to 127.0.0.1:18120 length 132
        User-Name = "{USER}"
        MS-CHAP-Password = "{USER_PASSWORD}"
        NAS-IP-Address = 127.0.0.1
        NAS-Port = 0
        Message-Authenticator = 0x00
        Cleartext-Password = "{USER_PASSWORD}"
        MS-CHAP-Challenge = 0x3a6a904d7a1c7d7b
        MS-CHAP-Response = 0x0001000000000000000000000000000000000000000000000000beb439542bf97174619a4b7a7360141633ba32b8719a5de4
Received Access-Accept Id 12 from 127.0.0.1:18120 to 127.0.0.1:57999 length 84
        MS-CHAP-MPPE-Keys = 0x00000000000000004e09b29052bcb917ed0d2bc195ce801a
        MS-MPPE-Encryption-Policy = Encryption-Required
        MS-MPPE-Encryption-Types = 4

測試成功後 ctrl-c 終止 freeradius -X 程序 啟用並設置每次開機啟動服務

systemctl start freeradius
systemctl enable freeradius

現在連線可以使用

Android 手機連線時選擇 PEAP / MSCHAPV2 / 不驗證

iOS 則無腦直連

以上就可以算完工了,不過對於 android 11 更新後會發現不能選不驗證,他一定要做驗證才能連線

只好繼續往下做

加入憑證

這邊我們採用免費的 Let’s encrypt 的憑證來使用

let’s encrypt 是發行憑證的單位,但是我們會用第三方套件去申請和更新憑證,本文採用 certbot 這個套件來處理

記得以前都是用 apt 直裝,不過這次發現 certbot 是建議使用 snap 套件管理來安裝,那就來試試看)

那就先來安裝 snap

apt install snapd -y

安裝完之後要更新 snap core

snap install core
snap refresh core

使用 snap 安裝 certbot

snap install --classic certbot

取得憑證 (需公用 ip 正反解 + 80 port 防火牆暢通)

/snap/bin/certbot certonly --standalone

完成後金鑰會存放在 /etc/letsencrypt/live/{your_domain}

測試自動更新

/snap/bin/certbot renew --dry-run

在 free radius 目錄內建立 let’s encrypt 資料夾 將金鑰檔案複製過去並設置權限

mkdir -p /etc/freeradius/3.0/certs/letsencrypt
cp /etc/letsencrypt/live/rad.alexw.net/privkey.pem /etc/freeradius/3.0/certs/letsencrypt
cp /etc/letsencrypt/live/rad.alexw.net/fullchain.pem /etc/freeradius/3.0/certs/letsencrypt
chown freerad:freerad -R /etc/freeradius/3.0/certs/letsencrypt

修改 /etc/freeradius/3.0/mods-enabled/eap

# private_key_file = /etc/ssl/private/ssl-cert-snakeoil.key 
private_key_file = /etc/freeradius/3.0/certs/letsencrypt/privkey.pem

# certificate_file = /etc/ssl/certs/ssl-cert-snakeoil.pem
certificate_file = /etc/freeradius/3.0/certs/letsencrypt/fullchain.pem

重啟 freeradius

systemctl restart freeradius

android 手機連線的時候,驗證部分選使用系統憑證應該就可以通了

iOS 一樣無腦直連

搞定收工

AD GPO 隱藏討人厭的搜尋方塊和沒用的摳他那(cortana)

Windows 搜尋功能自古以來按下 win-key 直接打字就有,不過麻瓜們都不知道,所以在最近這幾版的 Windows 10 改成預設就是個大搜尋框,超礙事的,直接拿掉怕麻瓜們不方便,留個放大鏡圖示好了,至於 Cortana 就根本是沒用的東西,直接拿掉。

老樣子,打開 gpmc.msc 編輯你要改的 GPO 找到 使用者設定 / 喜好設定 / Windows 設定 / 登錄
記得這邊不要用”電腦設定”,要用”使用者設定

新增登錄
搜尋方塊是
HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Search\SearchboxTaskbarMode
值設定為 1 ( 0隱藏 / 1圖示 / 2 整個方框 )

Cortana 圖示是
HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced\ShowCortanaButton
設定值為 0 ( 0隱藏 / 1 顯示)

這樣乾淨多了(菸~

在 AD 環境中 Firefox 的群組原則管理

要在 AD 環境中透過群組原則 (GPO) 來管理 Firefox 可以從 https://github.com/mozilla/policy-templates/releases 下載群組原則樣板 (ex: policy_templates_v2.4.zip)。

解開來裡面找到兩個檔案

  • nwindows\firefox.admx 這是群組原則樣板檔
  • windows\zh-TW\firefox.adml 這是樣板的中文語言檔

admx 檔和之前做 chorme / new edge 的 adm 檔操作方式不同,
admx 檔是放在本機,然後操作群組原則的時候會自動抓來用,但是你換到沒有admx 的電腦操作就看不到哩,但是群組原則效果還在。
adm 檔則是掛進去到處都看得到。

firefox.admx 複製到本機(要執行 gpmc.msc 的機器)的 C:\Windows\PolicyDefinitions\ 底下(此範例以 windows 10 為例,如果是 windows 版本較舊,像是 windows7, server 2012 則資料夾可能不同)

firefox.adml 語言檔則放在 C:\Windows\PolicyDefinitions\zh-TW\ 底下。
以上兩個檔案 (addx/adml) 放好了就完成環境準備了,這時候執行 gpmc.msc 開或是新開你要的群組原則來編輯,就可以看到在系統管理範本內有 firefox 的選項了,admx 檔案會直接出現,不會像 adm 檔出現在傳統系統管理範本的分類。

自動安裝擴充元件

本範例以 uBlock Origin 為例,先到擴充套件的官網,找到網址的識別名稱,這邊是 “ublock-origin” 先把這字串記起來,下個步驟會用到。

打開群組原則編輯器,找到 電腦設定\原則\系統管理範本\Firefox\擴充套件\要安裝的擴充套件 啟用他,然後按下 “顯示…” 的按鈕,編輯要安裝的檔案來源列表。

注意! 這邊的值要直接可以找到要安裝的 xpi 檔,如果你去複製官網的按鈕連結,你會得到的是 https://addons.mozilla.org/firefox/downloads/file/3663488/ublock_origin-1.30.6-an+fx.xpi

這其實不 OK! 因為這路徑有限定版本,以後官網更新不就會裝到舊版….

所以這路徑不能直接複製官網按鈕,不過還好官網有作對應,我們只要用 https://addons.mozilla.org/firefox/downloads/latest/<擴充元件識別名稱>/latest.xpi 就可以直接對應到最新版本,範例如下:

擴充套件網頁 https://addons.mozilla.org/zh-TW/firefox/addon/ublock-origin/
擴充套件最新版本檔案 https://addons.mozilla.org/firefox/downloads/latest/ublock-origin/latest.xpi

我們就直接把下面這行貼到值裡面,按下確定就好了。

關閉新通知

打開群組原則編輯器,找到 電腦設定\原則\系統管理範本\Firefox\權限\通知\封鎖傳送通知的新請求 把它啟用就好了。

讀者可能會想,上面不是有個封鎖的網站,為何不打開來填個萬用字元* 就好了嗎?
這其實不行,以目前版本 2.4 版官網說明 有提到

> Because these are origins, not domains, entries with unique ports must be specified separately. This explicitly means that it is not possible to add wildcards.

所以是不能用萬用字元的。

範例就這兩個,其他就不贅述了,祝各位躺的愉快。

AD 環境下把新版 Edge 搞得跟 Chrome 一樣(欸 不是)

新版 Edge 本來就是被 MS 改醜改難用而且無法登入 Google 同步的 Chrome 啊啊
雖然教了同事改預設瀏覽器,但是懶麻瓜眾多,就是有人會直接使用,只好把這改得稍微能用
承接昨天的廢文 在 AD 環境中 Google Chrome 的管理 ,這次我們要換用 Edge 的政策範本 來處理

首先先到 這裡 下載 Policy Files ,如果是禁止符號表示你的版本和平台沒有選定,請依照您的環境選定版本。
下載是一個 MicrosoftEdgePolicyTemplates.cab 的檔案,打開會有個 MicrosoftEdgePolicyTemplates.zip

然後一樣打開群組原則編輯設定 ( gpmc.msc ) 建立新的群組原則連結到你要部署的組織,然後在群組原則的 系統管理範本 右鍵新增範本,把 msedge.adm 抓進來
另外一提,如果您不是 AD 環境,也想要改掉新分頁的鬼 bing 可以用 本機群組原則編輯器(gpedit.msc) 處理

然後在傳統系統管理範本內就有 Edge 的範本了

接下來我們要改
* 設定 Microsoft Edge 為預設瀏覽器 – 關閉
* 設定新索引標籤頁面 URL – 改為 google 首頁
* 預設搜尋提供者搜尋 URL – 改為 google 搜尋
* 安裝擴充功能 – 安裝 ublock origin
* 預設通知設定 – 關閉

關閉檢查 Edge 為預設瀏覽器

Microsoft Edge / 設定 Microsoft Edge 為預設瀏覽器 : 已停用

設定新索引標籤頁面為 Google 首頁

如果沒有藉由群組原則改,由 Edge 設定介面怎麼找都改不掉新分頁的 bing 首頁

Microsoft Edge / 啟動、首頁和新索引標籤 / 設定新索引標籤頁面 URL : 啟用並設為 https://www.google.com

預設搜尋引擎改為 Google

bing 真的難用,預設搜尋當然是要 Google

Microsoft Edge / 預設搜尋提供者 / 啟用預設搜尋提供者 這個要先啟用才有效
接這設定搜尋 URL
Microsoft Edge / 預設搜尋提供者 / 預設搜尋提供者搜尋 URL 啟用 並把右方說明的 google 區塊貼過來,前後的單引號不用

{google:baseURL}search?q={searchTerms}&{google:RLZ}{google:originalQueryForSuggestion}{google:assistedQueryStats}{google:searchFieldtrialParameter}{google:searchClient}{google:sourceId}ie={inputEncoding}

安裝擴充元件 – 以 ublock origin 為例

新版 Edge 的擴充元件要來 https://microsoftedge.microsoft.com/addons/Microsoft-Edge-Extensions-Home 找

找到後把網址的 id 複製起來

Microsoft Edge / 擴充功能 / 控制哪些擴充功能會默默地安裝
啟用並點擊 選項 / 顯示 把剛複製的 id 放在這邊
另外一提,新版 Edge 是可以安裝 Google Chrome 商店的擴充元件,也就是說你把 Chrome 擴充元件的 id 貼過來他也會安裝
像是本範例的 ublock origin 兩邊都有,你如果把兩邊的 id 都貼過來,他會裝兩套 ublock origin………

關閉通知

瀏覽器通知這個鬼東西真的很討厭,麻瓜們沒事就會中招,超煩

Microsoft Edge / 內容設定 / 預設通知設定 : 啟用並設定為 2. 不允許任何網站顯示桌面通知

在 AD 環境中 Google Chrome 的管理

要在 AD 環境中使用群組原則管理 Chrome 要先到 官網 下載 Chrome 政策範本 policy_templates.zip

解壓縮後找到 windows\adm\zh-TW\chrome.adm

再打開 群組原則編輯器 (gpmc.msc) 到 系統管理範本 新增剛解壓縮出來的 chrome.adm 這個範本檔
就可以讓群組原則處理 Chrome 的設定

範例一 : 幫網域上的 Chrome 都裝上 uBlock Origin

這個擋廣告軟體 這超好用 也可以擋掉 youtube 剛開始播放時的廣告
首先先去 uBlock Origin 的官網 記住網址的後面代號

然後再群組原則管理裡面 對你想要改的組織設一個群組原則然後編輯它

找到 系統管理範本 / 傳統系統管理範本(ADM) / Google / Google Chrome / 擴充功能 / 設定強制安裝的應用程式和擴充功能清單

啟用它並由下方選項顯示編輯清單,裡面的值就打上上面複製來的 擴充功能 id (例如 cjpalhdlnbpafiamejdnhcphjbkeiagm )

按下確定後 所有符合此群組原則的電腦就會自動裝上你指定的擴充功能了

範例二 : 讓所有電腦的桌面通知都關閉

系統管理範本 / 傳統系統管理範本 / Google / Google Chrome / 內容設定 / 預設通知設定
把它停用

以後就不會莫名其妙亂跳通知了

[iPad管理] iOS 批次重新命名


[iPad管理] iOS 批次重新命名

當使用 Apple MDM 管理方案 (ASM + profile management) 管理 iPad,每當裝置重置,裝置名稱又會回到 “iPad” ,原本預期裝置名稱可以由 Server 端設定,重置後會自己抓回來,不過我沒有找到這個功能,以至於每次重置都要重新一台一台重設,相當麻煩。

這麼麻煩的事情,應該有人做自動化吧,在網路上逛了一圈,果不其然有人已經造好輪子了,因為這個版本是吃英文版的 apple configurator 2 所以就順手 fork 回來改成中文版匯出直接可用的版本


環境準備:


製作 CSV 檔案:

將數台 iPad 透過 USB hub 連接到 macOS 機器上並打開 AC2

rename device from AC2

如果你的裝置名稱還是預設,請先在 AC2 上面先把該重新命名的裝置做第一次命名,當然也可以從 iPad 上面直接設好名稱再接過來。

輸出資訊

全選(⌘+A),右鍵 輸出 / 資訊 …

選擇輸出資訊

輸出資訊至少要勾選 “名稱” 其他欄位隨意。

選擇儲存檔案名稱

選擇輸出CSV檔檔名,本範例以 ipad_b.csv 為檔名,檔案存放在與rename_ios_devices.py 相同的資料夾(如不同,執行時請自行加上路徑)。

csv 檔案內容

使用文字編輯器查看 ipad_b.csv 內容,第一行標題必須包含 UDID名稱 兩個欄位,如您的 CSV 標題為英文,請使用英文版本的程式或是將其內容改為中文名稱。


使用本程式批次重新命名:

打開 終端機.app 或是 iTerm2.app 切換工作目錄到 rename_ios_devices.py 與 ipad_b.csv 的資料夾。本範例以桌面為例

cd ~/Desktop

執行重新命名程式 (使用 ipad_b.csv 為其資料來源)

python rename_ios_devices.py ipad_b.csv

搞定收工

OpenSIPS 建置筆記

使用 opensips 建立一個 sip server 給內部使用

本文以 debian 9.5 為例 ( opensips v2.2)

安裝 mariadb 當資料庫

apt-get install mariadb-server
mysql_secure_installation

Enter current password for root (enter for none):
Set root password? [Y/n] y
New password:
Re-enter new password:
Remove anonymous users? [Y/n] y
Disallow root login remotely? [Y/n] y

安裝 opensips

apt-get install opensips opensips-mysql-module

設定

設定監聽 IP

vi /etc/opensips/opensips.cfg

修改監聽 ip 這邊不可以用 127.0.0.1 一定要用你的 ip
然後 alias 設定為 hostname

listen=udp:192.168.1.88:5060
alias=udp:sip.hsps.tp.edu.tw:5060

設定 domain 與資料庫

vi /etc/opensips/opensipsctlrc

SIP_DOMAIN=your.domain.name #設定你的domain
DBENGINE=MYSQL #使用 mysql/mariadb
DBHOST=localhost #資料庫主機
DBNAME=opensips  #資料庫名稱
DBRWUSER=opensips  #SQL帳號
DBRWPW="opensipsrw" #更改為你想設定的密碼

依照上面設定建立 sql 帳號與資料庫

opensipsdbctl create

MySQL password for root: 輸入 mysql root 密碼
Enter character set name: latin1
Install presence related tables? (y/n): y
fraud_detection emergency? (y/n): y

新增 SIP 帳密 (for client)

opensipsctl add 101 101
opensipsctl add 102 102

帳號資料會建立在 table opensips.subscriber

然後就可以通了

設定系統服務

設定開機自動啟動

 systemctl enable opensips

平常操作就

啟動 systemctl start opensips

重啟 systemctl restart opensips

查看狀態 systemctl status opensips

HP Win10 更新後出現 WDF VIOLATION 無法開機

WDF_VIOLATION
今天公司的 HP 桌機 Windows 10 更新重開之後就出現 WDF VIOLATION 錯誤

auto repair gg
然後重開自動進修復又失敗

這是因為更新與 HP 的鍵盤快速鍵驅動衝突
解決方法請在這個畫面按下面 “進階選項” 然後選 “疑難排解” / “進階選項” / “命令提示字元”

切換到你安裝 windows 的磁碟 以下以 C: 磁碟為例
依序打下列指令 把原本的驅動更改名稱使其不啟動

c:
cd windows\system32\drivers\
ren HpqKbFiltr.sys HpqKbFiltr.sys.old

重開機之後就 ok 了

XenServer 轉移至 Proxmox (PVE)

XenServer 轉移至 Proxmox (PVE)
本文亦可適用於 xcp-ng

準備工作

XenServer 匯出 xva

用 ssh 登入 xenserver

使用以下指令匯出 xva

xe vm-export vm={你的虛擬機器名稱} filename={匯出的檔名.xva}

( 可以用 xe vm-list 列出所有的 vm 名稱)

轉換映像檔

這個部份我是在 pve 上面做,所以先把 xva 檔丟過來或是用 nfs 之類的其他方式掛載

解壓縮 xva 檔

tar xf xen_vm.xva

解開會得到

  • 檔案 ova.xml
  • 資料夾 Ref:990 (數字不盡相同)

再用 xenmigrate.py 將資料夾 Ref:990 轉換為 raw image (以下以 vm_raw.img 為例)

注意 轉換成 raw 的時候會佔滿原本該虛擬硬碟原本分配的硬碟大小, 而非 thin 大小

python xenmigrate.py -c Ref:990 vm_raw.img

產生出的 vm_raw.img 即為 raw image

如果需 qcow2 檔案則可以用 qemu-img 轉換 (以下以輸出 vm.qcow2 為例)

 qemu-img convert -f raw -O qcow2 vm_raw.img vm.qcow2

建立虛擬機器

登入 pve web ui 建立一個虛擬機器

ex: id=101 disk=qcow2(32G)

虛擬機器不要開

ssh 進去 找到虛擬硬碟實際位置 (ex: /mnt/pve/NAS/images/101/vm-101-disk-1.qcow2)

本機儲存請找 /var/lib/vz/images/{vm-id}

把轉出來的 qcow2 覆蓋掉剛建立的 vm-101-disk-1.qcow2

mv -f vm.qcow2 /mnt/pve/NAS/images/101/vm-101-disk-1.qcow2

修改設定檔磁碟容量 /etc/pve/qemu-server/101.conf

#virtio0: RS_PVE_NFS:101/vm-101-disk-1.qcow2,size=32G
virtio0: RS_PVE_NFS:101/vm-101-disk-1.qcow2,size=250G

開機測試沒問題後,就可以把先前產生的 xva / img / ova / Ref 檔案砍一砍了

Ref:

  • https://pve.proxmox.com/wiki/Xenmigrate
  • https://github.com/derekjhyang/xenserver_to_xen