背景
系统集成的工作使用一些嵌入式开发板进行UI开发,此时最好不启动桌面,仅启动一个进程。
系统
开发板:
米尔MYD-YA157C-V2
https://item.taobao.com/item.htm?spm=a230r.1.14.16.74fe7bb7oF9dxE&id=609796292798&ns=1&abbucket=8#detail
系统:
myir@linux:~$ uname -a
Linux linux 4.19.9 #1 SMP PREEMPT Wed Jan 8 08:09:26 UTC 2020 armv7l armv7l armv7l GNU/Linux
myir@linux:~$ cat /etc/issue
Ubuntu 18.04 LTS \n \l
UI进程:
主程序是:
https://github.com/fyne-io/fyne/tree/master/cmd/fyne_demo
UI编译过程
编译工具:
https://github.com/lucor/fyne-cross
docker代理:
在systemd的docker.service内,Service段增加代理配置:
[Service]
Environment="HTTP_PROXY=http://127.0.0.1:2081"
systemctl restart docker
本机golang代理:
配置本机环境变量,启用GO的代理(国内程序员的悲哀):
export GO111MODULE=on
export GOPROXY=https://goproxy.cn
交叉编译:
然后按照fyne-cross官网安装fyne-cross
进入fynd_demo目录后,运行:
fyne-cross linux -arch=arm -env GO111MODULE=on -env GOPROXY=https://goproxy.cn -env GO111MODULE=on
即可交叉编译成功,二进制文件在fyne-cross/bin目录内
关闭默认X进程
找到startx相关命令,注释(或者有可能是systemd进程)
此开发板米尔官方提供的程序在:
/usr/bin/watchdog.sh
添加systemd配置
文件:
/etc/systemd/system/user-program.service
[Unit]
Description=User Screen Daemon
[Service]
Type=simple
User=root
Restart=always
RestartSec=5s
ExecStart=/usr/bin/xinit /home/myir/examples -- /usr/bin/X :0
StartLimitIntervalSec=2
StartLimitBurst=0
RestartSec=2
[Install]
WantedBy=multi-user.target
注意要用root启动,需要在应用中分配权限;必须指定Service中的最后三项,保证一直连续重启服务(HDMI如果没有插,那么此服务会失败)。
用户程序是/home/myir/examples,可以修改为其它二进制文件。
修改启动用户权限
/etc/X11/Xwrapper.config
allowed_users=anybody
原理及相关文档
X11是第11版的X程序,系统实现的是客户端和应用端。
我们使用的Linux桌面系统都是基于X11的,所以只要换到中间的桥梁部分就行了(这个板子是xfce4。
https://en.wikipedia.org/wiki/X_Window_System
https://wiki.archlinux.org/index.php/Xinit
https://docstore.mik.ua/orelly/linux/run/ch11_01.htm
https://unix.stackexchange.com/questions/437809/start-x-server-on-login-with-systemd