本文為《PVE安裝Kodi》系列文章的一部分。
本文同步發(fā)表在我的個(gè)人博客https://evine.win貌笨。
- PVE 直接安裝最新版 Kodi
- 為Kodi適配遙控器
- 修改Kodi字幕字體
- 修改Kodi皮膚字體
- 屏蔽Kodi的關(guān)機(jī)衅斩、重啟按鈕
- 設(shè)置Kodi啟動(dòng)的前置條件
- 像使用盒子/LibreELEC一樣使用PVE直裝的Kodi,實(shí)現(xiàn)遙控器啟停
- kodi-send使用相關(guān)說明
- 轉(zhuǎn)換遙控器的esc鍵為backspace鍵
前言
在《PVE 直接安裝最新版 Kodi》一文的評論中诬像,有網(wǎng)友提出能不能像操控電視盒子/LibreELEC/CoreELCE一樣用遙控器操控PVE中直裝的Kodi屋群,實(shí)現(xiàn)打開和關(guān)閉Kodi,這是個(gè)好想法坏挠,我也認(rèn)為這樣會(huì)大方便PVE中直裝的Kodi的使用芍躏,所以學(xué)習(xí)了相關(guān)udev、udevadm癞揉、evtest纸肉、input溺欧、input remap相關(guān)知識(shí),終于實(shí)現(xiàn)了這個(gè)非常便于使用的功能柏肪。
參考資料
udev, udevadm, evtest, input_remap_utilities, evsieve
思路
用遙控器操控PVE中直裝的Kodi姐刁,實(shí)現(xiàn)打開和關(guān)閉Kodi,這個(gè)場景需要在無桌面環(huán)境下烦味,脅持遙控器的電源鍵聂使,讓它的作用變更為打開/關(guān)閉Kodi,所以只是將電源鍵映射為其他鍵是不行的谬俄,而是需要脅持遙控器的電源鍵柏靶,讓它變更為運(yùn)行某個(gè)腳本,然后由腳本實(shí)現(xiàn)打開/關(guān)閉Kodi溃论。
根據(jù) input_remap_utilities 列出的幾個(gè)按鍵映射工具屎蜓,只有 evsieve 可以在無桌面環(huán)境下脅持按鍵并運(yùn)行指定腳本,實(shí)現(xiàn)上述場景钥勋。
準(zhǔn)備工作
以下相關(guān)命令均為root用戶執(zhí)行的炬转。
如果需要新建文件,請直接在Linux環(huán)境中使用
nano XXXX
創(chuàng)建算灸,請不要在Windows環(huán)境中創(chuàng)建后再上傳扼劈。
所有的輸入設(shè)備都由udev
程序識(shí)別并保存在/dev/input
下,通過輸入ls -l /dev/input
可以查看到許多eventX
的設(shè)備菲驴。設(shè)備的編號(hào)會(huì)隨著外設(shè)的插入或卸載以及開關(guān)機(jī)的變化而變化荐吵,也就是說電源鍵所在的輸入設(shè)備的eventX
中X
這個(gè)編號(hào)不是固定的,所以我們不能直接使用/dev/input/eventX
來作為后續(xù)要脅持的輸入設(shè)備赊瞬。運(yùn)行ls -l /dev/input/by-id
先煎,udev
會(huì)在這個(gè)目錄下創(chuàng)建易于識(shí)別的、唯一的森逮、不隨外設(shè)的插入卸載或開關(guān)機(jī)而變化的軟連接榨婆,無論X
如何變化磁携,它們都將指向正確的設(shè)備褒侧。
我的遙控器是自帶接收器的2.4G無線遙控器,插上接收器谊迄,通過evtest
程序先找出遙控器電源鍵在什么設(shè)備上闷供。
# 安裝evtest
apt install evtest
# 運(yùn)行evtest
evtest --grab
# evtest會(huì)列出所有可用的輸入設(shè)備,可以看到我的遙控器有event5-event8共4個(gè)設(shè)備
# 你可以選擇具體的編號(hào)來進(jìn)行測試统诺,找到每個(gè)設(shè)備分別能控制哪些按鍵
# 經(jīng)過測試歪脏,我發(fā)現(xiàn)我遙控器的電源鍵在event8,也就是2.4G Composite Devic System Control這個(gè)設(shè)備
No device specified, trying to scan all of /dev/input/event*
Available devices:
/dev/input/event0: Power Button
/dev/input/event1: AT Translated Set 2 keyboard
/dev/input/event2: VirtualPS/2 VMware VMMouse
/dev/input/event3: VirtualPS/2 VMware VMMouse
/dev/input/event4: QEMU QEMU USB Tablet
/dev/input/event5: 2.4G Composite Devic
/dev/input/event6: 2.4G Composite Devic Mouse
/dev/input/event7: 2.4G Composite Devic Consumer Control
/dev/input/event8: 2.4G Composite Devic System Control
/dev/input/event9: PC Speaker
Select the device event number [0-9]:8 # 手動(dòng)輸入要測試的設(shè)備編號(hào)粮呢,如果不清楚電源鍵在什么設(shè)備上婿失,你可以一個(gè)一個(gè)試出來
Input device ID: bus 0x3 vendor 0x627 product 0x697d version 0x110
Input device name: "2.4G Composite Devic System Control"
Supported events:
Event type 0 (EV_SYN)
Event type 1 (EV_KEY)
Event code 116 (KEY_POWER)
Event code 142 (KEY_SLEEP)
Event code 143 (KEY_WAKEUP)
Event type 4 (EV_MSC)
Event code 4 (MSC_SCAN)
Properties:
Testing ... (interrupt to exit) # 按下電源鍵钞艇,evtest輸出以下結(jié)果,沒有反應(yīng)表示設(shè)備擇取不對
Event: time 1669209045.421999, type 4 (EV_MSC), code 4 (MSC_SCAN), value 10081
Event: time 1669209045.421999, type 1 (EV_KEY), code 116 (KEY_POWER), value 1
Event: time 1669209045.421999, -------------- SYN_REPORT ------------
Event: time 1669209045.422021, type 1 (EV_KEY), code 116 (KEY_POWER), value 0
Event: time 1669209045.422021, -------------- SYN_REPORT ------------
# Ctrl+C退出
通過測試豪硅,我知道了我遙控器的電源鍵的鍵碼為116
哩照,鍵名為KEY_POWER
,去掉KEY_
懒浮,鍵值轉(zhuǎn)換為小寫power
這個(gè)值在后面會(huì)用到飘弧。不出意外,一般遙控器的電源鍵的鍵值都是power
砚著。
現(xiàn)在來找一下event8
這個(gè)設(shè)備在/dev/input/by-id
下的軟連接叫什么次伶,運(yùn)行ls -l /dev/input/by-id/
:
total 0
lrwxrwxrwx 1 root root 9 Nov 23 22:40 usb-0627_2.4G_Composite_Devic-event-if01 -> ../event7
lrwxrwxrwx 1 root root 9 Nov 23 22:40 usb-0627_2.4G_Composite_Devic-event-kbd -> ../event5
lrwxrwxrwx 1 root root 9 Nov 23 22:40 usb-0627_2.4G_Composite_Devic-if01-event-mouse -> ../event6
lrwxrwxrwx 1 root root 9 Nov 23 22:40 usb-0627_2.4G_Composite_Devic-if01-mouse -> ../mouse3
lrwxrwxrwx 1 root root 9 Nov 23 22:40 usb-QEMU_QEMU_USB_Tablet_28754-0000:00:01.2-1-event-mouse -> ../event4
lrwxrwxrwx 1 root root 9 Nov 23 22:40 usb-QEMU_QEMU_USB_Tablet_28754-0000:00:01.2-1-mouse -> ../mouse2
這......udev
沒有識(shí)別出來......準(zhǔn)確的講,是因?yàn)?code>udev的默認(rèn)規(guī)則/usr/lib/udev/rules.d/60-persistent-input.rules
無法區(qū)分2.4G Composite Devic Consumer Control
和2.4G Composite Devic System Control
這兩個(gè)設(shè)備稽穆,現(xiàn)象是每次關(guān)機(jī)再開機(jī)或每次卸載再插入接收器后冠王,usb-0627_2.4G_Composite_Devic-event-if01
這個(gè)設(shè)備一會(huì)兒指向2.4G Composite Devic Consumer Control
,一會(huì)兒指向2.4G Composite Devic System Control
舌镶,所以我需要修改一下udev
的規(guī)則版确,讓它能夠準(zhǔn)確識(shí)別出2.4G Composite Devic System Control
『跽郏可能其他遙控器不存在此問題绒疗,需要你自行測試一下此問題存在不存在。
現(xiàn)在來讓udev
能準(zhǔn)確識(shí)別2.4G Composite Devic System Control
骂澄,運(yùn)行udevadm info --attribute-walk --name=/dev/input/event8
(其中event8
是根據(jù)上面evtest
測試后知道的)吓蘑,輸出內(nèi)容:
Udevadm info starts with the device specified by the devpath and then
walks up the chain of parent devices. It prints for every device
found, all possible attributes in the udev rules key format.
A rule to match, can be composed by the attributes of the device
and the attributes from one single parent device.
looking at device '/devices/pci0000:00/0000:00:1e.0/0000:01:1b.0/usb2/2-1/2-1:1.1/0003:0627:697D.0003/input/input9/event8':
KERNEL=="event8"
SUBSYSTEM=="input"
DRIVER==""
ATTR{power/async}=="disabled"
ATTR{power/control}=="auto"
ATTR{power/runtime_active_kids}=="0"
ATTR{power/runtime_active_time}=="0"
ATTR{power/runtime_enabled}=="disabled"
ATTR{power/runtime_status}=="unsupported"
ATTR{power/runtime_suspended_time}=="0"
ATTR{power/runtime_usage}=="0"
looking at parent device '/devices/pci0000:00/0000:00:1e.0/0000:01:1b.0/usb2/2-1/2-1:1.1/0003:0627:697D.0003/input/input9':
KERNELS=="input9"
SUBSYSTEMS=="input"
DRIVERS==""
ATTRS{capabilities/abs}=="0"
ATTRS{capabilities/ev}=="13"
ATTRS{capabilities/ff}=="0"
ATTRS{capabilities/key}=="c000 10000000000000 0"
ATTRS{capabilities/led}=="0"
ATTRS{capabilities/msc}=="10"
ATTRS{capabilities/rel}=="0"
ATTRS{capabilities/snd}=="0"
ATTRS{capabilities/sw}=="0"
ATTRS{id/bustype}=="0003"
ATTRS{id/product}=="697d"
ATTRS{id/vendor}=="0627"
ATTRS{id/version}=="0110"
ATTRS{inhibited}=="0"
ATTRS{name}=="2.4G Composite Devic System Control"
ATTRS{phys}=="usb-0000:01:1b.0-1/input1"
ATTRS{power/async}=="disabled"
ATTRS{power/control}=="auto"
ATTRS{power/runtime_active_kids}=="0"
ATTRS{power/runtime_active_time}=="0"
ATTRS{power/runtime_enabled}=="disabled"
ATTRS{power/runtime_status}=="unsupported"
ATTRS{power/runtime_suspended_time}=="0"
ATTRS{power/runtime_usage}=="0"
ATTRS{properties}=="0"
ATTRS{uniq}==""
...下面其他信息此處略去
通過多次運(yùn)行udevadm info --attribute-walk --name=/dev/input/eventX
(X更換為不同的設(shè)備編號(hào))可知,我的設(shè)備2.4G Composite Devic System Control
可以通過ATTRS{name}
這個(gè)屬性即可以進(jìn)行唯一識(shí)別坟冲。參考 udev 這個(gè)鏈接磨镶,新建/etc/udev/rules.d/01-system-control.rules
,內(nèi)容如下:
ATTRS{name}=="2.4G Composite Devic System Control", SYMLINK+="input/by-id/usb-0627_2.4G_Composite_Devic-System-Control"
這種方式是寫死的健提,只針對這一個(gè)遙控器有效琳猫,復(fù)雜的規(guī)則咱也寫不來...當(dāng)然如果你想采用更智能的識(shí)別方式,可以參考 Writing udev rules 和 編寫udev規(guī)則私痹。
其中SYMLINK+="input/by-id/usb-0627_2.4G_Composite_Devic-System-Control"
是指讓udev
在/dev/input/by-id
下自動(dòng)創(chuàng)建usb-0627_2.4G_Composite_Devic-System-Control
脐嫂,其指向2.4G Composite Devic System Control
這個(gè)設(shè)備。軟連接名稱你可以自行定義紊遵。
現(xiàn)在重啟下或者重插一下接收器账千,終于可以識(shí)別出來了:
ls -l /dev/input/by-id
## 生成了`usb-0627_2.4G_Composite_Devic-System-Control`這個(gè)軟連接
total 0
lrwxrwxrwx 1 root root 9 Nov 23 22:40 usb-0627_2.4G_Composite_Devic-event-if01 -> ../event7
lrwxrwxrwx 1 root root 9 Nov 23 22:40 usb-0627_2.4G_Composite_Devic-event-kbd -> ../event5
lrwxrwxrwx 1 root root 9 Nov 23 22:40 usb-0627_2.4G_Composite_Devic-System-Control -> ../event8
lrwxrwxrwx 1 root root 9 Nov 23 22:40 usb-0627_2.4G_Composite_Devic-if01-event-mouse -> ../event6
lrwxrwxrwx 1 root root 9 Nov 23 22:40 usb-0627_2.4G_Composite_Devic-if01-mouse -> ../mouse3
lrwxrwxrwx 1 root root 9 Nov 23 22:40 usb-QEMU_QEMU_USB_Tablet_28754-0000:00:01.2-1-event-mouse -> ../event4
lrwxrwxrwx 1 root root 9 Nov 23 22:40 usb-QEMU_QEMU_USB_Tablet_28754-0000:00:01.2-1-mouse -> ../mouse2
設(shè)置按鍵脅持
以下相關(guān)命令均為root用戶執(zhí)行的。
如果需要新建文件暗膜,請直接在Linux環(huán)境中使用
nano XXXX
創(chuàng)建匀奏,請不要在Windows環(huán)境中創(chuàng)建后再上傳。
-
下載我為PVE 7.X預(yù)編譯好的 evsieve学搜,其他版本不保證可用娃善,如果下載不了论衍,可以按照官方教程自己編譯。我會(huì)隨著Debian和evsieve版本的升級(jí)一直更新該文件聚磺,請及時(shí)在這個(gè)倉庫查看更新情況:devome/files@github
wget https://raw.githubusercontent.com/devome/files/master/evsieve/evsieve -O /usr/local/bin/evsieve chmod +x /usr/local/bin/evsieve ## 安裝evsieve的運(yùn)行依賴 apt install libevdev2
按照《PVE 直接安裝最新版 Kodi》安裝好Kodi饲齐,建議按非root用戶設(shè)置好
/etc/systemd/system/kodi.service
,注意含有ExecStart
和ExecStop
這兩行咧最。如果你不需要Kodi開機(jī)自動(dòng)啟動(dòng)捂人,那么創(chuàng)建好這個(gè)文件就好了,不需要運(yùn)行systemctl enable --now kodi.service
矢沿。-
新建一個(gè)用來自動(dòng)判斷是啟動(dòng)Kodi還是關(guān)閉Kodi的腳本
/usr/local/bin/kodi-power.sh
滥搭,后續(xù)由evsieve
來使用,內(nèi)容如下:#!/usr/bin/env bash export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin if [[ -z $(ps -ef | grep "kodi.bin" | grep -v "grep") ]]; then ## 如果kodi還沒有啟動(dòng)捣鲸,那么就啟動(dòng)它 systemctl start kodi.service else ## 如果kodi已經(jīng)啟動(dòng)了瑟匆,那么就停止它 systemctl stop kodi.service fi
注:停止Kodi這一行,相比使用
systemctl stop kodi.service
栽惶,更推薦使用kodi-send
愁溜,詳見:kodi-send使用相關(guān)說明。注意增加可執(zhí)行權(quán)限:
chmod +x /usr/local/bin/kodi-power.sh
外厂。 -
根據(jù) evsieve 的說明冕象,在運(yùn)行
evsieve
時(shí),它所要脅持的設(shè)備必須已經(jīng)插入了汁蝶,但是我又希望evsieve
能夠開機(jī)自動(dòng)運(yùn)行渐扮,所以我需要在正式運(yùn)行前先確保2.4G Composite Devic System Control
這個(gè)設(shè)備已經(jīng)插入。這項(xiàng)工作就交給腳本來判斷吧掖棉,新建/usr/local/bin/evsieve.sh
墓律,內(nèi)容如下(注意按照注釋修改target_hijack_input_device
和target_hijack_button
):#!/usr/bin/env bash export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin ## 要脅持的目標(biāo)設(shè)備的絕對路徑,請注意修改成自己的 ## 不要直接寫/dev/input/eventX幔亥,而要寫/dev/input/by-id下的設(shè)備 target_hijack_input_device="/dev/input/by-id/usb-0627_2.4G_Composite_Devic-System-Control" ## 要脅持的按鍵的鍵名耻讽,請注意修改成你獲取到的,不出意外帕棉,一般遙控器的電源鍵的鍵值都是power target_hijack_button="power" ###### 以下無需修改 ###### ## 先檢測 target_hijack_input_device 是否已經(jīng)存在 while :; do if [[ -L "$target_hijack_input_device" ]]; then break else echo "The '$target_hijack_input_device' is not inserted, wait 2 seconds..." sleep 2 fi done ## 執(zhí)行電源鍵脅持针肥,當(dāng)按下指定鍵時(shí),轉(zhuǎn)換為運(yùn)行腳本/usr/local/bin/kodi-power.sh笤昨,詳細(xì)用法請見:https://github.com/KarsMulder/evsieve exec evsieve \ --input "$target_hijack_input_device" grab persist=reopen \ --hook key:$target_hijack_button exec-shell="/usr/local/bin/kodi-power.sh" \ --block key:$target_hijack_button
該腳本同樣需要可執(zhí)行權(quán)限:
chmod +x /usr/local/bin/evsieve.sh
祖驱。 -
新建
/etc/systemd/system/evsieve.service
,內(nèi)容如下:[Unit] Description = Run evsieve Requires = systemd-udevd.service After = systemd-udevd.service Wants = systemd-udevd.service [Service] User = root Group = root ExecStart = /usr/local/bin/evsieve.sh ExecStop = /usr/bin/killall --user root --exact --wait evsieve TimeoutStartSec = infinity Restart = on-abort [Install] WantedBy = multi-user.target
-
讓
evsieve.service
開機(jī)啟動(dòng)啟動(dòng)瞒窒。這個(gè)必須得開機(jī)自動(dòng)啟動(dòng),要不然脅持不了乡洼。運(yùn)行并確保evsieve.service
已經(jīng)運(yùn)行好后崇裁,按一下遙控器的電源鍵來試一試效果吧匕坯。注意:因?yàn)镵odi程序比較大,無論是啟動(dòng)Kodi拔稳,還是關(guān)閉Kodi葛峻,系統(tǒng)都需要一定時(shí)間來處理,所以不要連續(xù)按電源鍵巴比,這樣只會(huì)讓系統(tǒng)混亂术奖。
注意:如果
evsieve.service
沒有正常啟動(dòng),可能按下電源鍵會(huì)讓PVE關(guān)機(jī)轻绞。## 設(shè)置開機(jī)自動(dòng)啟動(dòng)采记,并立即運(yùn)行起來 systemctl enable --now evsieve.service ## 再看看是不是evsieve.service是不是啟動(dòng)好了 systemctl status evsieve.service ## 如果像這樣就表示啟動(dòng)好啦 evsieve.service - Run evsieve Loaded: loaded (/etc/systemd/system/evsieve.service; enabled; vendor preset: enabled) Active: active (running) since Thu 2022-11-24 18:11:27 CST; 36min ago Main PID: 1249 (evsieve) Tasks: 2 (limit: 72123) Memory: 1.8M CPU: 59ms CGroup: /system.slice/evsieve.service └─1249 evsieve --input /dev/input/by-id/usb-0627_2.4G_Composite_Devic-System-Control grab persist=reopen --hook key:power exec-shell=/usr/local/bin/kodi-power.sh --block key:power 11月 24 18:11:27 pve systemd[1]: Started Run evsieve.
有些遙控器的返回鍵不是真正的返回鍵,而是退出鍵政勃,會(huì)直接退出到主菜單唧龄,而不是返回到上一層。如果不習(xí)慣這樣的操作方式奸远,那么我們可以仍然借助evsieve這個(gè)工具來實(shí)現(xiàn)按鍵的轉(zhuǎn)換既棺。詳見 轉(zhuǎn)換遙控器的退出鍵為返回鍵。
總結(jié)
通過本教程懒叛,PVE直接安裝Kodi也變得很好用了丸冕,就像使用電視盒子/LibreELEC/CoreELEC一樣,實(shí)現(xiàn)遙控器啟動(dòng)/停止薛窥。