硬件软件系统方案应用范例智能车大赛技术支持学习园地关于我们恩智浦官网

Linux Weston和系统服务

云实验室案例-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 APIunit_test程序去直接操作显示。