本文介绍如何快速部署基于Windows 10和Debian Linux的嵌入式系统。 给出了构建安全接口的示例。
引言
在开发具有图形化人机界面的设备的过程中,迟早要完成的任务不仅是创建界面本身,还在于选择界面应在其上工作的平台。 这样的平台可以是具有操作系统的单板计算机,也可以是具有屏幕和一组相关库的微控制器,或者是其他一些原始解决方案。
经常发生这样的情况:在运行接口的控制系统的顶层,还执行与外界的通信任务以及与各种外围设备的交互。 此外,界面本身对图形资源的要求可能很高。 因此,为了节省人工成本,可以将单板计算机作为基础并在其上安装现成的操作系统。 在这种情况下,可以通过使用带有良好文档和一系列示例的现代框架来大大简化软件开发。
接口要求
从用户的角度来看,该界面应满足以下要求:
- 全屏加载时,应显示一个应用程序,即相同的界面,相同的图形外壳;
- 除此应用程序外,用户别无其他选择。
- 应用程序应始终工作,系统不应进入睡眠状态,屏幕不应关闭;
- 所有键盘快捷键,助手,辅助功能和其他类似功能均应禁用;
- 如果应用程序出现任何故障-它应由系统自动重新启动;
- 该系统对速度或实时模式没有特殊要求,但是,接口必须响应用户命令而没有明显的延迟。
- 该系统必须能够抵抗反复的硬重启,并且无需运行特殊的脚本来完成工作;
- 应该有可能将完成的装配快速克隆到一系列设备中,并在自动模式下进行所有必要的设置。
换句话说,完全限制了用户操作,稳定性和可伸缩性。
对于单板计算机的操作系统,我们将立即考虑两个选项,一个基于Windows,另一个基于Linux,并将它们相互比较。
例如,让我们创建一个触摸屏信息亭界面。 作为一个应用程序,让我们以Qt Quick培训示例之一为例,并对其进行一些更改。 Qt框架可用于两种操作系统。
为了不研究在ARM平台上安装Windows和Linux的细微差别,可以在某些x86兼容处理器的基础上轻松组装该系统。 在这种情况下,使用了英特尔湾径平台上众多可用板卡之一进行实验。
GitHub上提供了所有程序和脚本的软件包。
Windows路径
一次,引入了Microsoft的Windows Embedded来创建嵌入式系统。 即使在Windows Embedded XP的早期版本中,也为开发人员提供了一套工具,用于组装截断率最高的工具,但配有必需的图像驱动程序。 这些程序集需要最少的RAM,即使在较弱的处理器上也能正常工作。 该技术是在Windows Embedded Standard 7版本中开发的,使您想到了创建自己的程序集的过程。 Windows Embedded使用了开放模块目录的思想,任何人都可以仅在其系统中配备必要的组件集。 尽管采用了截短形式,但可以使用此方法的最新版本是Windows Embedded Standard 8.1。
现代Windows 10 IoT被定位为Windows Embedded的替代产品,但与以前的版本有很大不同。 打开的组件目录不再可用。 从设计者那里收集光图像并制作自己的安装盘的能力已经消失。 现在,可以在预安装的系统中配置嵌入式系统的特殊选项,例如记录过滤器,引导加载程序品牌,键盘过滤器等。 此外,仅在Windows 10 Enterprise重型版本的一部分中提供对这些功能的支持。
但是,尽管对系统的要求很高,尤其是对RAM的要求很高,但主要由于硬件组件的可用性,即使在嵌入式解决方案中使用较重的版本也不会引起任何特殊问题。 此外,不要忘记,近年来,从Microsoft购买旧产品的许可证变得越来越困难。
快速修复
初步检查发现,即使在普通的Windows 10中,也已经内置了“分配的访问”功能(图1),它看起来像是任务的现成解决方案。
图 1.分配的访问功能
在这种情况下,可以用作接口的程序应首先开发为通用Windows平台应用程序。 这些appx应用程序例如安装在Windows Phone上。 当然,可以将一个简单的全屏应用程序转换为appx并使用必要的证书进行签名,然后安装。 它可以用作接口,但是没有适当的保护。 不幸的是,在普通的“分配的访问”模式下,用户仍然可以访问某些系统设置和热键。 结果,使用这种方法无法获得满足上述所有要求的接口。 必须以其他方式手动配置系统。
正确的决定
1.初始安装
因此,首先,我们需要Windows 10 Enterprise LTSB发行版 。 您可以拍摄原始的Microsoft映像,也可以使用一些轻量级的映像,也可以使用第三方工具制作自己的映像。 对于实验板,选择了一种现成的组件(轻型32位版本)。
我们通过分发工具包将系统安装在目标板上。 安装时,我们将磁盘分为两部分,C:-系统,D:-主应用程序,实用程序和日志。 这种故障对于将来的记录滤波器很有用。 安装后,我们等待直到设置菜单出现,否则我们不会继续使用网络设置菜单。
我们通过Ctrl + Shift + F3重启进入服务模式。
如果安装过程中没有错误,则重新启动后,系统本身将进入管理员的服务帐户,并且SysPrep窗口将出现在屏幕上(图2)。 必须关闭它,我们将使用尚未创建的特殊答案文件以不同的方式启动SysPrep 。
图 2.服务模式。
2.系统配置
您将需要Windows 10评估和部署工具包中的部署工具,以执行进一步的步骤。
从板上装有Windows发行版的磁盘中,您需要解压缩install.wim映像文件 。 碰巧在某些程序集中,该文件可以以扩展名esd压缩形式存储。 在这种情况下,您必须先打开包装。 dism实用程序用于此目的。
找出容器内所需版本的序列号(SourceIndex)。
dism /Get-WimInfo /WimFile:install.esd
然后,提取图像文件(在本例中为容器中的第一个文件)。
dism /export-image /SourceImageFile:install.esd /SourceIndex:1 /DestinationImageFile:install.wim /Compress:max /CheckIntegrity
现在,您需要在Windows系统映像管理器中(通过“部署工具”)打开映像并生成目录。
应该注意的是,只有在图像的位深与主机的位深匹配时,才可以在Windows System Image Manager中使用图像。 即,不可能在64位系统中编辑32位版本的映像。 正如他们所说,在这里没有任何评论。
创建目录后,编辑SysPrep实用程序的答案文件。 输入所有者信息,添加必要的用户并配置第一个自动登录(图3)。
图 3.创建一个答案文件。
列出所有参数是没有意义的;答案文件的内容可以在存储库中找到。 最主要的是不要忘记将CopyProfile参数设置为true ,将SkipReam设置为1并启用管理员自动登录 。 您可以在第4部分“ 专业化-Microsoft-Windows-Shell-Setup-ProductKey”中输入产品密钥。
3.安装程序
接下来,您需要实际的install.wim映像文件 ,因此需要将其放在custom.xml应答文件旁边,在保存之后,必须在其中手动替换映像的路径。 在文件末尾,该行应如下所示:
<cpi:offlineImage cpi:source="wim:d:/service/install.wim#Windows 10 Enterprise LTSB" xmlns:cpi="urn:schemas-microsoft-com:cpi" />
要获取KioskShell演示界面,您需要从源代码构建Windows版本。 组装技巧在资源库中。
我们将文件复制到板上,并获得以下文件和目录结构:
C:\ └── Design\ ├── backgroundDefault.jpg - ( ) └── oemlogo.bmp - , D:\ ├── Logs\ - ├── Service\ │ ├── AfterSetup.bat - , SysPrep │ ├── FirstLogon.bat - │ ├── customize.xml - │ ├── install.wim - │ ├── CustomShellSetup.ps1 - PowerShell │ ├── EnableRules.ps1 - PowerShell │ ├── DisableAllRules.ps1 - ( ) │ └── UserLogon.bat - ( ) └── Shell\ - "KioskShell.exe"
4.手动系统设置
当系统处于服务模式时,您可以随意重新启动多次,系统将自动返回到该状态。 但是,如果在设置电源之前有很长的空闲时间,则屏幕可能会锁定并且不会重新进入,只有重启才能提供帮助。 由于每个特定项目可能都有其自己的配置功能,因此最好手动进行,但是您也可以使用自动化脚本。
我们安装嵌入式系统的必要组件并禁用用户帐户控制(请参阅存储库中的AfterSetup.bat )
安装所有驱动程序,配置硬件(IP网卡,屏幕的分辨率和方向,外部设备的端口等),禁用粘滞键和所有特殊功能。
由于将来我希望能够进行远程管理,因此我们将允许通过RDP进行访问。 管理员密码将在自动配置阶段过期。
接下来,您需要在“ 本地组策略编辑器”中禁用系统更新(在“ 计算机配置-管理模板-Windows组件-Windows Update”部分中,需要将“已配置的自动更新”设置为“ 已禁用” )。 此外,您还需要关闭Windows Update的自动扫描功能(在Microsoft-Windows部分-UpdateOrchestrator的任务计划程序中,您需要禁用所有任务),否则每次启动时都会弹出一个黑色窗口,并且当您连接到Internet时,Windows可能会突然开始更新。
接下来,配置电源设置。 为此,您必须首先在“ 高级电源设置”部分中显示所有电源设置(为此,在注册表中HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ Power \ PowerSettings \ 238C9FA8-0AAD-41ED-83F4-97BE242C8F20的每个子项中,如果您具有Attributes参数,则需要分配给他的价值2 )。 既然所有设置都可用,请关闭睡眠模式,缺勤模式,取消电源按钮上的操作(当然,除非您另有需要),然后在空闲时关闭授权计时器。 接下来,我们通过连接删除待机模式(在HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ Power部分中,您需要将CsEnabled参数设置为0 )。 如有必要,请关闭屏幕的自适应亮度控制。
完成所有系统设置后,我们将有最后的机会进行更改,因为第二次运行AfterSetup.bat脚本将使用SysPrep启动自动配置机制,该机制无法停止。 您仍然需要记住激活系统(建议您熟悉一下自己激活Windows企业版的选项)。 即使在此阶段,您也可以制作整个磁盘的备份副本,并修复映像的初始状态,以防将来发生任何更改。
在工作结束时, SysPrep将不会重新启动,但会关闭计算机的电源-此时,您已经可以创建一个工作映像,准备移植到系列中。
5.最终的自动系统设置
首次加载工作映像后(请从存储库中查看FirstLogon.bat ),将配置安全接口,将自动登录重新配置为用户帐户,并且将禁用可能破坏系统的键盘快捷键。 接下来,将配置并激活统一写过滤器。 在这种情况下,筛选器配置为保护除Service和Logs文件夹之外的所有分区,并使用256 MB交换空间。 系统将重新引导几次,如果一切都正确完成,则在下次引导时,将出现一个安全界面,代表用户帐户启动。
要在现场维修系统,可以转到登录屏幕,例如,登录到管理员帐户。 在Windows 10中,为此提供了一种标准方法,您需要连续按5次“ Win”键。
Linux路径
没有使用基于Linux的图形界面来创建嵌入式系统的单一标准方法。 由于没有相同的通用发行版,因此这是一组基于完全不同的原理创建的系统。 最接近主题的似乎是Yocto Linux项目。 但是,很难在其中收集所有包含应用程序,驱动程序和第三方库的映像。 为解决此问题,采用现成的,受支持的发行版并手动进行配置比较容易。
简单的解决方案
1.初始安装
因此,首先,我们需要发行版本身,例如Debian 。 您可以另选一个,也可以自己制作。 最主要的是,发行版没有自动更新系统。 对于实验板,选择了Debian Linux 9(64位版本,内核4.9)。
我们以传统方式安装系统。 安装时,我们将磁盘分为两部分,sda1- /用于系统,sda2- / var / log用于系统和软件日志。 这种故障对于将来的记录滤波器很有用。 安装标准的xfce GUI和ssh服务器。 我们在用户安装期间添加管理员并设置密码。
安装后, 根帐户的第一件事就是将管理员用户添加到sudo组。
apt install sudo adduser administrator sudo
我们以用户名管理员的身份进入系统,并添加一个新用户user 。
sudo useradd -m user
为了方便起见,您可以完全删除他的密码,因为访问该帐户的位置仍然会关闭。
sudo passwd -d user
2.系统配置
我们会根据需要安装驱动程序,固件软件包和其他程序。
要在将来启用远程管理,可以在必要时安装和配置vnc服务器。 但是,在这种情况下,这是没有意义的,因为所有管理任务都可以通过控制台轻松执行,为此,仅通过ssh进行访问就足够了。
Linux能够为不同的用户使用不同的窗口管理器。 为了使用户界面正常工作,请安装具有微调功能的简约管理器。 对于配置,您将需要更多的应用程序。
sudo apt install fluxbox arandr plymouth
使用arandr,可以根据需要更改屏幕的分辨率和方向,然后将配置另存为脚本(图4)。

图 4.屏幕设置。
接下来,选择较早安装的fluxbox作为窗口管理器之后,需要使用用户帐户登录一次系统,然后再次注销。 这是必需的,以便fluxbox第一次创建所有设置文件并被选作用户帐户的标准管理器(请参阅用户主目录中的.dmrc文件)。
现在,您需要配置fluxbox以满足上述接口要求。 为此,请关闭/home/user/.fluxbox/init中的session.screen0.toolbar.visible面板:false ,注释掉除/home/user/.fluxbox/keys和/ home / user /中的音量按钮以外的所有键盘快捷键。 fluxbox / startup添加了屏幕配置脚本的启动,从而禁用了显示器的节能功能和全屏应用程序的自动运行。 如果出现意外故障,脚本将重新启动应用程序。
set_resolution.sh xset -dmps s off /home/user/autostart.sh &
现在,您需要加快系统启动过程,并向用户隐藏它。 为此,请在/ etc / default / grub中设置GRUB_TIMEOUT = 0 , 并在/etc/grub.d/10_linux中设置quiet_boot =“ 1” 。 要在加载到内核参数GRUB_CMDLINE_LINUX中时显示动画,您需要添加启动选项,如果屏幕方向发生变化,则fbcon =旋转:1或fbcon =旋转:3选项(取决于方向)。 如有必要,您可以在登录屏幕上更改分辨率和方向。 为此,必须在/etc/lightdm/lightdm.conf中指定display-setup-script = set_resolution.sh 。 如果需要隐藏光标,则添加xserver-command = X -core -nocursor 。
我们将选择加载动画样式。
sudo plymouth-set-default-theme -R text
最后修复所有更改。
sudo update-grub2
3.安装程序
要获得KioskShell演示界面,您需要从源代码构建Linux版本。 组装技巧在资源库中。
我们将文件复制到板上,并获得以下文件和目录结构:
/ ├── usr/ - "KioskShell" ├── local/ │ └── bin/ │ └── set_resolution.sh └── home/ ├── administrator/ │ └── relogin.sh - └── user/ └── autostart.sh -
4.最终系统设置
在此阶段,您可以制作整个磁盘的备份副本,并修复映像的初始状态,以防将来发生任何更改。
在用户帐户下设置自动登录,为此,在/etc/lightdm/lightdm.conf中设置autologin-user = user 。
现在设置写保护。
sudo apt install bilibop
安装时,选择动态的假设备映射 。
编辑设置文件/etc/bilibop/bilibop.conf 。 我们使用参数BILIBOP_LOCKFS =“ true”激活该模块,并向异常BILIBOP_LOCKFS_WHITELIST =“ / var / log”添加一个带有日志的部分。 让我们启用必要时暂时禁用保护的功能BILIBOP_LOCKFS_POLICY =“ soft” 。 并且由于系统中没有加密,因此您需要设置BILIBOP_LOCKFS_SWAP_POLICY =“ soft” 。
我们重新启动系统,如果一切都正确完成,则会出现一个安全界面,代表用户帐户启动。
可以很容易地自动化最后一步,从而在首次启动时获得具有自动配置的系统。 这将创建一个用于扩展到多个设备的分布(此机制建议独立实现)。
为了对系统进行维修,可以进入登录屏幕并登录到管理员帐户。 在Linux上,您首先需要通过Ctrl + Alt + F1进入控制台。 登录管理员帐户后,强制用户用户退出系统。
sudo skill -KILL -u user
然后通过Ctrl + Alt + F7返回图形模式,然后再次以管理员身份登录。
结论
无论选择哪一条路径,最终结果都是相同的结果。 如果配置正确,则用户界面将满足上述所有要求。 通常,只有视觉差异才可能与在不同平台上使用硬件加速渲染图形元素的功能相关联。
图 5.接口正在运行。
由于系统的基础是单板计算机,因此安装任何触摸屏或其他控件都不会成为问题。 如果您拥有适当的应用程序,则可以在此基础上不仅创建设备的控制台或交互式仪表板,还可以创建其他设备,例如信息或交易终端。
选择问题
有一种观点认为,Linux很难配置和维护,但同时它是免费的,而Windows既简单又方便,但是却要花钱。 这也许是正确的,但仅在家庭一级。 在创建嵌入式系统时,应考虑其他情况。 例如,对Windows进行微调,尤其是在电源管理和其他低级元素方面,似乎不再简单方便。 此外,请不要忘记Windows 10对资源的要求很高。 在此示例中,有可能多次测量一个干净系统的内存消耗,空闲状态约为400 MB。 为了进行比较,Linux Debian及其所有附件占用了大约200 MB的内存。 当然,如果您具有数GB的RAM,这不是问题,但是,在使用Windows和高负载的客户端应用程序时,仍然必须使用功能更强大的单板计算机。 Linux对资源的要求不高,但是确实很难配置,并且需要一种整洁的方法,尤其是在使用引导加载程序时。 此外,在将某些元素开发和实现到系统中的过程中,有时有必要使用特殊参数组装您自己的内核。 它是有效的,但需要适当水平的技能。
作为创建安全接口的一部分,很难做出明确的选择。 部署系统的复杂度大致相同。 获得一系列仪器的Windows许可证的成本可以等于在Linux上维护系统的成本。 您决定选择哪种系统。
作者将基于所描述示例的各种人机界面引入了用于各种应用的电子设备中,并证明了它们在现实世界中的可操作性。