云实验室案例-Linux Weston and Service
本文档涉及案例包括:
• Weston, Linux Service, DRM的基本介绍
• 关闭Weston并运行unit_test
相关知识:
为了能够通过unit_test灵活的测试显示功能,用户还需要了解Weston、DRM等框架的基本概念。
weston介绍
i.MX的标准Linux系统选择以Weston为基础构建其桌面,并为其实现相关的硬件支持。对于i.MX系列MPU的GPU、VPU、NPU等的测试,一般也都是基于Weston构建软件代码体系。
Weston是Wayland compositor的参考实现,提供基础桌面环境和Libweston库,适用于多种应用场景。其特点是适用性、可靠性和可预测性。 Weston从内部体系结构来看,主要分为窗口管理(shell),合成器(compositor)和输入管理几个部分。可见,如果拿Android作类比,从功能上看它约等同于InputManagerService,WindowManagerService和SurfaceFlinger。
DRM介绍
DRM(Direct Rendering Manager)是Linux 目前主流的图形显示框架,也是目前i.MX系列MPU默认的图形显示框架。
相比FB架构,DRM更能适应当前日益更新的显示硬件。 DRM可以统一管理GPU和Display驱动,使得软件架构更为统一,方便管理和维护。
DRM作为Linux显示系统的统筹管理框架,只能有一个master管理员。在i.MX默认Linux镜像下,DRM被Weston管理。因此当用户想要单纯调用ARM的相关API调试显示时,就需要关闭掉Weston,使得Weston让出DRM管理权限。
Linux中service的概念
在Linux操作系统中,服务(Service)是一个基本概念,它通常指的是运行在后台的、持续提供特定功能或资源给系统内部组件或者网络上的客户端程序。
这些服务是系统正常运行和提供各种功能的关键组成部分,它们可以按照预定义的启动顺序自动加载,并在整个系统运行期间保持活动状态。
Linux中service的管理
Linux通过init系统(如Systemd、SysV init或其他init替代品)来管理和控制服务的启动、停止、重启以及查看其运行状态等。常见的服务管理方式包括:
启动服务: sudo systemctl start service_name
停止服务: sudo systemctl stop service_name
重启服务: sudo systemctl restart service_name
查看服务状态: systemctl status service_name
启用服务自动启动: sudo systemctl enable service_name
禁用服务自动启动: sudo systemctl disable service_name
Linux中的systemctl
systemctl 是用于管理 systemd 系统和服务的命令行工具。systemd 是 Linux 系统中的初始化系统和服务管理器,systemctl 提供了与 systemd 交互的接口,用于启动、停止、重启服务以及查看服务状态等操作。systemctl 基于 systemd,通过与 systemd 通信来控制系统服务的运行状态。它可以管理单个服务单元,也可以对系统进行管理,如重启、关机等操作。
Linux中service的查看
systemctl list-units
列出当前运行的所有服务、守护进程、挂载点、sockets等unit的状态信息。
systemctl list-unit-files
用于列出所有的服务、守护进程、定时任务等unit文件及其启动状态。这个命令的输出结果会显示每个unit文件的名称以及它们是否被设置为开机启动。
对i.MX的MPU开发板而言,Linux默认会打开Weston的相关服务,并在开机过程中运行Weston服务,开启Weston进程,完成桌面初始化并独占DRM显示通路。因此,用户如果需要接管显示并独立使用Unit_test程序对显示功能进行测试,就需要在系统中关闭weston服务,或者杀死weston进程。
执行步骤:
1 预定板子
2 案例执行
2.1 Linux service的查看
登陆后,可以通过命令systemctl list-unit --type=service来查看当前运行的所有service
因为列出的service比较多,如果我们想要找到特定的某个service的话,可以通过grep命令,如下寻找含有关键字weston的服务的命令:
发现确实可以找到weston的相关服务。如果用户进一步希望看到服务的启动状态,可以通过命令systemctl list-unit-files--type=service来进行查看,如下图所示:
其中包括weston关键字的有:
STATE意味着该服务的当前运行状态,PRESET表明的是预设状态,
STATE常见的状态包括:
因此weston.service的状态为“打开”,已建立了启动链接。
2.2 Linux service的打开和关闭
可以尝试使用systemctl disable service_name命令将weston服务禁掉,这样在启动过程中,weston服务将不会工作,也就自然不会去占用DRM显示的控制权限。
命令如下图所示:
在输入命令后,会有大量log喷出。此时再使用systemctl list-unit-files--type=service | grep Weston 命令查看weston服务的启动状态,可以看到该服务已经被禁止:
2.3 Weston进程的关闭
除了直接关闭掉weston的服务外,也可以选择在Root登陆后手动关闭掉weston相关进程。
首先回忆在上一篇文章<i.MX8MP-Linux signal and Pthread>中使用的是kill命令,其具体命令为:命令格式为
kill -[num] [pid]
num为数字信号,如20;
pid为进程的pid号;
weston对应的PID可能每次启动都有所变化,因此用户可以选择使用killall命令来杀死weston进程。它和之前所述的kill命令,区别在于kill后面跟的是PID,而killall后面紧跟的参数是进程名称。它的具体格式和描述如下所述:
killall <command-name>
command-name为要杀死进程的名称。
描述:杀死指定名字的进程,即向名字为<command-name>的所有进程发送IGTERM信号
可以看到,killall命令和上一章中所使用的kill命令类似,都是通过向进程发送信号的方式,来杀死进程。
为得到weston的进程名称,可以使用ps命令进行查看:
在log中没有找到weston相关的进程。下一步尝试使用ps -aux命令,这里的-a选项表示显示所有进程,-u选项表示用户友好的输出,-x表示显示没有控制终端的进程
此时看到有非常多的进程被打印了出来,需要借助grep命令来寻找含有weston关键字的服务
这里进程740就是weston的进程,该进程的执行命令是“/usr/bin/weston --log=/run/user/0/weston.log --modules=systemd-notify.so”,执行的是/usr/bin/目录下的weston程序,后面的“--log=/run/user/0/weston.log --modules=systemd-notify.so”则是传参。
这里尝试使用killall Weston杀死weston进程:
可以发现,所有和weston相关的进程都被关掉了,此时显示器黑屏,只有左上角有一个小的横线。此时,Weston进程关闭,DRM的管理权限已经被让出,用户可以通过DRM API或unit_test程序去直接操作显示。