Хабрахабр

Развёртывание встраиваемой системы на базе Windows и Linux

В статье описаны методы быстрого развёртывания встраиваемой системы на базе Windows 10 и Debian Linux. Приведены примеры сборки защищённого интерфейса.

В качестве такой платформы может быть либо одноплатный компьютер с операционной системой, либо микроконтроллер с экраном и набором соответствующих библиотек, либо какое-то иное оригинальное решение. В процессе разработки устройств, имеющих графический человеко-машинный интерфейс, рано или поздно возникает задача не только создания самого интерфейса, но и выбора платформы, на базе которой он должен работать.

Более того, интерфейс сам по себе может быть довольно требователен к графическим ресурсам. Часто бывает, что на верхнем уровне системы управления, на котором работает интерфейс, выполняются также задачи связи с внешним миром и взаимодействие с широким набором периферийных устройств. Разработка программ в этом случае может сильно упроститься за счет использования современных фреймворков с хорошей документацией и набором примеров. Учитывая это и в целях экономии трудозатрат можно взять за основу именно одноплатный компьютер и установить на него готовую операционную систему.

Требования к интерфейсу

С точки зрения пользователя интерфейс должен удовлетворять следующим требованиям:

  • При загрузке на весь экран должно появляться одно приложение, оно же интерфейс, оно же графическая оболочка;
  • Кроме этого приложения пользователю не должно быть доступно больше ничего;
  • Приложение должно работать всё время, система не должна засыпать, экран не должен выключаться;
  • Все сочетания клавиш, помощники, специальные возможности и прочие подобные функции должны быть отключены;
  • В случае любого сбоя приложения — оно должно автоматически перезапускаться системой;
  • К системе не предъявляются особые требования по быстродействию или режимам реального времени, однако, необходимо чтобы интерфейс откликался на команды пользователя без ощутимых задержек;
  • Система должна быть устойчива к многократным жестким перезагрузкам, не должно быть необходимости выполнения специального сценария для завершения работы;
  • Должна быть предусмотрена возможность быстрого клонирования готовой сборки на серию устройств с выполнением всех необходимых настроек в автоматическом режиме.

Другими словами, полное ограничение действий пользователя, устойчивость и масштабируемость.

Что касается операционной системы для одноплатного компьютера, то рассмотрим сразу два варианта, один на базе Windows, другой на базе Linux, и сравним их между собой.

А в качестве приложения возьмем один из учебных примеров Qt Quick и реализуем его с некоторыми изменениями. Для примера создадим интерфейс киоска с сенсорным экраном. Фреймворк Qt доступен для обоих операционных систем.

В данном случае для экспериментов была использована одна из множества доступных плат на платформе Intel Bay Trail. Чтобы не углубляться в нюансы установки Windows и Linux на ARM платформы, систему можно легко собрать на базе какого-нибудь x86-совместимого процессора.

Пакет всех программ и скриптов доступен на GitHub.

Еще в ранней версии Windows Embedded XP разработчикам предоставлялся набор инструментов для сборки максимально урезанных, но оснащенных нужными драйверами образов. В свое время для создания встраиваемых систем была представлена Windows Embedded от Microsoft. Технология получила свое развитие в версии Windows Embedded Standard 7, где процесс создания собственных сборок был доведен до ума. Эти сборки требовали минимум оперативной памяти и прекрасно работали даже на слабых процессорах. Последняя версия, в которой был доступен такой подход, хотя уже в урезанном виде, это Windows Embedded Standard 8. В Windows Embedded применялась идеология открытого каталога модулей, и любой желающий мог оснастить свою систему только необходимым набором компонентов. 1.

Открытый каталог компонентов более недоступен. Современная Windows 10 IoT позиционируется как альтернатива Windows Embedded, но сильно отличается от своих предшественников. Специальные опции именно встраиваемой системы, такие как фильтр записи, брендирование загрузчика, клавиатурный фильтр и прочее, теперь настраиваются уже в предварительно установленной системе. Пропала возможность собирать лёгкие образы из конструктора и делать из них собственные установочные диски. Причем, поддержка этих функций доступна только в составе тяжелой версий Windows 10 Enterprise.

Тем более, не стоит забывать, что в последнее время становится сложнее купить лицензию на старые продукты от Microsoft. Однако, несмотря на высокие системные требования, особенно к объему оперативной памяти, использование даже тяжёлых версий во встраиваемых решениях не вызывает особых проблем, в первую очередь за счет доступности аппаратных комплектующих.

Быстрое решение

1), которая выглядит, как готовое решение поставленной задачи. При первом рассмотрении выясняется, что в даже в обычной Windows 10 есть уже встроенная функция «Assigned Access» (рис.

Assigned access

1. Рис. Функция «Assigned Access»

Эти приложения в формате appx устанавливаются, например, на Windows Phone. Программа, которую можно использовать в этом случае в качестве интерфейса, должна быть изначально разработана как приложение Universal Windows Platform. Оно может работать как интерфейс, но без должной защиты. Простое полноэкранное приложение, конечно, можно преобразовать в appx и подписать необходимыми сертификатами, а после этого установить. Получить в результате интерфейс, соответствующий всем изложенным выше требованиям, с помощью такого подхода не получится. К сожалению, в штатном режиме «Assigned access» для пользователя всё равно остается открытым доступ к некоторым системным настройкам и горячим клавишам. Система должна быть настроена вручную, иным способом.

Правильное решение

1. Первичная установка

Можно взять оригинальный образ Microsoft, можно какой-нибудь облегчённый или сделать свой, с помощью сторонних инструментов. Итак, в первую очередь нам необходим дистрибутив Windows 10 Enterprise LTSB. Для экспериментальной платы была выбрана одна из готовых сборок (облегчённая 32-битная версия).

При установке разбиваем диск на два раздела, C: — для системы, D: — для основного приложения, служебных программ и журналов. Устанавливаем систему из дистрибутива на целевую плату. После установки дожидаемся появления меню настойки параметров, либо меню с настройками сети и дальше не продолжаем. Такая разбивка пригодится в дальнейшем для фильтра записи.

Перезагружаемся в служебный режим через Ctrl+Shift+F3.

2). Если в процессе установки не было ошибок, то после перезагрузки система сама зайдет в служебный аккаунт администратора и на экране появится окно SysPrep (рис. Его надо закрыть, запускать SysPrep мы будем иначе, используя специальный файл ответов, который еще предстоит создать.

SysPrep window

2. Рис. Служебный режим.

2. Конфигурация системы

Для дальнейших действий понадобится Deployment Tools из комплекта Windows 10 Assessment and Deployment Kit.

Бывает, что в некоторых сборках этот файл может храниться в сжатом виде с расширением esd. Из диска с установленным на плату дистрибутивом Windows нужно извлечь файл образа install.wim. Для этого используется утилита dism. В этом случае его сначала нужно распаковать.

Выясним порядковый номер нужной версии внутри контейнера (SourceIndex).

dism /Get-WimInfo /WimFile:install.esd

Затем, извлечём файл образа (в данном случае, первый в контейнере).

dism /export-image /SourceImageFile:install.esd /SourceIndex:1 /DestinationImageFile:install.wim /Compress:max /CheckIntegrity

Теперь нужно открыть образ в Windows System Image Manager (из комплекта Deployment Tools) и сгенерировать каталог.

То есть, нельзя в 64-битной системе редактировать образ 32-битной версии. Стоит отметить, что работать с образами в Windows System Image Manager можно только в том случае, если разрядность образа совпадает с разрядностью хоста. Тут, как говорится, без комментариев.

Введем данные о владельце, добавим нужных пользователей и настроим первый автологин (рис. Когда каталог создан, отредактируем файл ответов для утилиты SysPrep. 3).

Answers file

3. Рис. Создание файла ответов.

Главное, не забыть выставить параметры CopyProfile в true, SkipReam в 1 и включить автологин администратора. Все параметры перечислять смысла нет, с содержимым файла ответов можно ознакомится в репозитории. Свой ключ продукта можно вписать в разделе 4 specialize — Microsoft-Windows-Shell-Setup — ProductKey.

3. Установка программ

В конце файла строка должна выглядеть так: Далее понадобится собственно файл образа install.wim, поэтому его нужно положить рядом с файлом ответов customize.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 (в планировщике заданий в разделе Microsoft — Windows — UpdateOrchestrator нужно отключить все задачи), иначе каждый раз при загрузке будет всплывать чёрное окно, а при подключении к Интернету Windows может внезапно начать обновляться. Далее, нужно отключить обновление системы в Local Group Policy Editor (в разделе Computer Configuration — Administrative Templates — Windows Components — Windows Update нужно установить Configured Automatic Updates значение Disabled).

Для этого нужно сначала в разделе Advanced Power Settings сделать видимыми все настройки питания (для этого в реестре в каждом подразделе в HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Power\PowerSettings\238C9FA8-0AAD-41ED-83F4-97BE242C8F20 при наличии параметра Attributes нужно присвоить ему значение 2). Далее, настроим параметры питания. Далее, убираем режим ожидания с подключением (в разделе HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Power нужно присвоить параметру CsEnabled значение 0). Теперь, когда все настройки доступны, отключаем спящий режим, режим отсутствия, убираем действие по кнопке питания (если, конечно, не нужно иное) и отключаем таймер авторизации при простое. При необходимости, выключаем адаптивную регулировку яркости экрана.

Систему ещё надо не забыть активировать (с вариантами активации корпоративных версий Windows предлагается ознакомиться самостоятельно). Когда все настройки системы выполнены, у нас есть последняя возможность внести какие либо правки, так как второй запуск скрипта AfterSetup.bat запустит механизм автоматической настройки с помощью SysPrep, остановить который будет нельзя. Ещё на этом этапе можно сделать резервную копию всего диска и зафиксировать предварительное состояние образа на случай каких-либо изменений в будущем.

По окончании работы SysPrep не перезагрузит, а выключит компьютер — на этом моменте можно создать уже рабочий образ, готовый для портирования на серию.

5. Финальная автоматическая настройка системы

FirstLogon.bat из репозитория) произойдёт настройка защищённого интерфейса, автологин будет перенастроен на учетную запись User и будут отключены сочетания клавиш, которыми можно сломать систему. После первой загрузки рабочего образа (см. В данном случае, фильтр настроен на защиту всех разделов, кроме папок Service и Logs, и использует своп размером 256 Мб. Далее, будет настроен и активирован Unified Write Filter. Система перезагрузится несколько раз и, если всё сделано правильно, то при очередной загрузке появится защищённый интерфейс, запущенный от имени учетной записи User.

В Windows 10 для этого предусмотрен штатный способ, нужно 5 раз подряд нажать клавишу «Win». Для обслуживания системы на месте есть возможность попасть на экран входа в систему и, например, зайти в учетную запись администратора.

Как не существует и единого общего дистрибутива, всё таки, это семейство систем, которое создано на совершенно иных принципах. Единого стандартного способа создания встраиваемых систем с графическим интерфейсом на базе Linux не существует. Однако в нем достаточно сложно собирать образы, насыщенные приложениями, драйверами и сторонними библиотеками. Наиболее близким по тематике может показаться проект Yocto Linux. Для решения поставленной задачи проще взять готовый, хорошо поддерживаемый дистрибутив и настроить его вручную.

Простое решение

1. Первичная установка

Можно взять и другой, можно сделать свой. Итак, в первую очередь нам необходим сам дистрибутив, например Debian. Для экспериментальной платы был выбран Debian Linux 9 (64-битная версия, ядро 4. Главное, чтобы в дистрибутиве не было системы автоматического обновления. 9).

При установке разбиваем диск на два раздела, sda1 — / для системы, sda2 — /var/log для системных и программных логов. Устанавливаем систему традиционным способом. Устанавливаем штатный графический интерфейс xfce и сервер ssh. Такая разбивка пригодится в дальнейшем для фильтра записи. Добавляем в процессе установки пользователя administrator и задаем пароль.

После установки первым делом из аккаунта root добавляем пользователя administrator в группу sudo.

apt install sudo
adduser administrator sudo

Заходим в систему под логином administrator и добавляем нового пользователя user.

sudo useradd -m user

Для удобства можно убрать для него пароль совсем, так как доступ для этого аккаунта будет всё равно везде закрыт.

sudo passwd -d user

2. Конфигурация системы

Устанавливаем драйверы, пакеты прошивок, дополнительные программы по желанию.

Однако, в данном случае в этом нет смысла, так как все задачи администрирования можно легко выполнить через консоль, а для этого достаточно только доступа по ssh. Для возможности удаленного администрирования в будущем, при необходимости, можно установить и настроить сервер vnc.

Для работы интерфейса пользователя установим минималистский менеджер с возможностью тонкой настройки. В Linux есть возможность использовать разные оконные менеджеры для разных пользователей. А для конфигурации понадобится ещё несколько приложений.

sudo apt install fluxbox arandr plymouth

4). С помощью arandr можно изменить разрешение и ориентацию экрана, если это необходимо, а затем сохранить конфигурацию как скрипт (рис.

Screen parameters set_resolution.sh

4. Рис. Настройка экрана.

Это нужно для того, чтобы fluxbox при первом запуске создал все файлы настроек и был выбран в качестве стандартного менеджера для аккаунта user (см. Далее необходимо один раз зайти в систему под учетной записью user, предварительно выбрав в качестве оконного менеджера установленный ранее fluxbox, а затем обратно выйти. файл .dmrc в домашнем каталоге пользователя).

Для этого в /home/user/.fluxbox/init выключим панель session.screen0.toolbar.visible: false, в /home/user/.fluxbox/keys закомментируем все сочетания клавиш кроме кнопок громкости, а в /home/user/.fluxbox/startup добавим запуск скрипта настройки экрана, отключение энергосберегающих функций монитора и автозапуск полноэкранного приложения. Теперь нужно настроить fluxbox на соответствие требованиям к интерфейсу, описанным выше. Скрипт будет перезапускать приложение в случае неожиданного сбоя.

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 нужно добавить опцию splash, а в случае изменения ориентации экрана ещё опцию fbcon=rotate:1 или fbcon=rotate:3 в зависимости от направления. А если необходимо скрыть курсор, то добавить xserver-command=X -core -nocursor. Для этого в /etc/lightdm/lightdm.conf нужно указать display-setup-script=set_resolution.sh.

Выберем стиль анимации загрузки.

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. Финальная настройка системы

На этом этапе можно сделать резервную копию всего диска и зафиксировать предварительное состояние образа на случай каких-либо изменений в будущем.

Настроим автоматический вход в систему под учетной записью user, для этого в /etc/lightdm/lightdm.conf установим autologin-user=user.

Теперь установим защиту от записи.

sudo apt install bilibop

При установке выбираем dynamic fake device map.

Активируем модуль параметром BILIBOP_LOCKFS=«true» и добавим раздел с логами в исключения BILIBOP_LOCKFS_WHITELIST="/var/log". Отредактируем файл настроек /etc/bilibop/bilibop.conf. И так как в системе нет шифрования, нужно установить BILIBOP_LOCKFS_SWAP_POLICY=«soft». Разрешим возможность временного отключения защиты при необходимости BILIBOP_LOCKFS_POLICY=«soft».

Перезагружаем систему и, если всё сделано правильно, появится защищенный интерфейс, запущенный от имени учетной записи user.

Это позволит создать дистрибутив для масштабирования на несколько устройств (данный механизм предлагается реализовать самостоятельно). Последний этап может быть легко автоматизирован для получения системы с автоматической настройкой при первом запуске.

В Linux для этого нужно сначала попасть в консоль через Ctrl+Alt+F1. Для обслуживания системы на месте есть возможность попасть на экран входа в систему и зайти в учетную запись администратора. После входа в аккаунт администратора принудительно вывести пользователя user из системы.

sudo skill -KILL -u user

Затем вернуться в графический режим через Ctrl+Alt+F7 и ещё раз зайти под администратором.

При правильной настройке пользовательский интерфейс будет соответствовать всем требованиям, описанным выше. Независимо от того, какой из путей был выбран, в конечном итоге получится один и тот же результат. Возможны лишь визуальные различия, связанные, как правило, с особенностями отрисовки графических элементов с использованием аппаратного ускорения на разных платформах.

Protected shell application

5. Рис. Интерфейс в рабочем режиме.

При наличии соответствующего приложения, на данной базе можно создать не только консоль управления прибора или интерактивную панель мониторинга, но так же и другие устройства, например, информационные или торговые терминалы. Так как основой системы является одноплатный компьютер, не составит проблем установить любой сенсорный экран или другие органы управления.

Проблема выбора

Это, пожалуй, верно, но только на бытовом уровне. Существует мнение, что Linux очень сложен в настройке и обслуживании, но при этом бесплатен, а Windows проста и удобна, но при этом стоит денег. Например, тонкая настройка Windows, особенно в части управления питанием и другими низкоуровневыми элементами, уже не кажется простой и удобной. Когда дело касается создания встраиваемых систем стоит принимать во внимание иные обстоятельства. В данном примере удалось измерить несколько раз потребление памяти чистой системы, и оно составляло около 400 Мб в состоянии простоя. Причем, не стоит забывать, что Windows 10 довольно требовательна к ресурсам. Конечно, при наличии нескольких гигабайт оперативной памяти это не проблема, но всё же, при использовании Windows и высоконагруженных клиентских приложений приходится брать более мощные одноплатные компьютеры. Для сравнения, Linux Debian со всеми дополнениями занимал в памяти около 200 Мб. Более того, при разработке и внедрении в систему некоторых элементов иногда бывает необходима сборка собственного ядра с особыми параметрами. Linux менее требователен к ресурсам, но действительно сложен в настройке и требует аккуратного подхода, особенно при работе с загрузчиком. Это эффективно, но требует соответствующего уровня квалификации.

Трудоемкость развёртывания систем оказывается примерно одинаковой. В рамках создания защищенного интерфейса однозначный выбор сделать сложно. Какую систему выбрать, решать вам. Затраты на приобретение лицензий на Windows для серии приборов могут сравняться с затратами на обслуживание систем на Linux.

Различные человеко-машинные интерфейсы, созданные на базе описанных примеров, были внедрены автором в электронные приборы для самых разных применений и доказали свою работоспособность в реальном мире.

Теги
Показать больше

Похожие статьи

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Кнопка «Наверх»
Закрыть