nspawn 容器調(diào)優(yōu)指南 (GPU,音頻,輸入法等)
這一篇單獨(dú)抽出來講講 nspawn 容器有什么可以調(diào)優(yōu)的地方
Xorg
按照 ArchWiki 的說法,必須使用只讀掛載 Xorg 套接字
詳情見 Wiki 的 nspawn 篇?X.org?部分
在容器中設(shè)定?$DISPLAY
?變量與宿主機(jī)相同即可
GPU NVIDIA
以 ArchLinux 為例子
要想在容器內(nèi)使用 N 卡,首先主機(jī)必須裝好驅(qū)動(dòng)
其次掛載設(shè)備肯定是逃不掉的
接下來安裝驅(qū)動(dòng),只需要安裝 lib 部分即可
換句話說就是不要內(nèi)核模塊
接下來運(yùn)行?nvidia-smi
?會(huì)發(fā)現(xiàn)報(bào)錯(cuò)了
用?strace
?跟一下發(fā)現(xiàn)對設(shè)備?/dev/nvidiactl
?的訪問被拒絕
所以我們需要用 drop-in 替換添加一些參數(shù)
在這個(gè)例子中,容器的名字為?archlinux
所以對應(yīng)的服務(wù)應(yīng)該是?systemd-nspawn@archlinux.service
然后我們就可以把替換文件放進(jìn)
在替換文件里面添加?DeviceAllow
?參數(shù)允許對設(shè)備文件的訪問
接下來重新加載 Systemd 服務(wù)配置
最后啟動(dòng)容器
那么 CUDA 和 OpenCL 呢?
自己補(bǔ)上對應(yīng)的軟件包,補(bǔ)齊所需 lib 就完事了
音頻 PulseAudio
正確掛載 D-Bus 的方法應(yīng)該是將?/run/user/$UID/pulse
?以?只讀
?的方式掛載
如果不用只讀掛載,容器內(nèi)很有可能清空掉這個(gè)文件夾,導(dǎo)致宿主機(jī)丟失 PulseAudio 套接字
從而引發(fā)所有音頻失效
一個(gè)配置文件的例子如下
音頻倒是不需要做太多的修改,掛進(jìn)去就好
D-Bus
跟 PulseAudio 掛載類似,只讀掛載套接字就好
如果不以只讀的方式去掛載很有可能導(dǎo)致 nspawn 容器內(nèi)將 D-Bus 套接字刪得一干二凈
另外雖然?/run/user/$UID
?下面還有?systemd
?文件夾,但是我們并不需要掛載他
為了讓容器內(nèi)外的 Systemd 相互通信只需要有 D-Bus 掛載就足夠了
一個(gè)配置文件的例子如下
輸入法 fcitx5
容器內(nèi)不需要安裝 fcitx5 相關(guān)的庫,但是需要保證環(huán)境變量正確設(shè)定
$XDG_RUNTIME_DIR
?需要正確指向?/run/user/$UID
$LANG
?必須是?zh_CN.UTF-8
這里應(yīng)該把?$XDG_RUNTIME_DIR
?指向?/run/user/1000
在實(shí)際測試中,下列程序不需要設(shè)定?XDG
?變量也可以正常使用
QQ
Chrome (含衍生版)
Firefox
GEdit
GIMP
幾乎所有依賴 GTK 的程序都可以正常運(yùn)行
但是 Qt 程序偏偏沒了就不行,經(jīng)過測試的 Qt 程序如下
QV2 某某某
Krita
Mumble