Привет!
О могущественные хабрамэн и прекраснейшие хабравимен! Ничтожный заметил, что сура о блистательной Windows Embedded ещё не записана в книге мудрости хабра. Да будет дозволено мне, недостойному, поведать вам одну поучительную историю о том как был построен и внедрён особо пуленепробиваемый Windows ® ™ на объектах одной российской железнодорожной корпорации.
Итак, одним утром, в нашу скромную обитель Системного ПО прибыл гонец от программистов с ужасными и печальными новостями. Истинно говорю вам — программцы в командировке не смогли обновить ПО на рабочем месте, т.к. оное обуял шайтан и заселил его вирусами, троянами, порнобаннерами и контерстрайком (сауирщенно неуиновные пользователи были сауирщенно ни при чём).
Наш мудрейший халиф, узнав о таком непотребстве, созвал диван. И так говорили придворные мудрецы и звездочёты:
Антивирус не был установлен по причине отсутствия на станциях интернета (станции раскиданы по всей поверхности России и ездить с офлайн базой для обновления — как-то не вариант). На некоторых станциях есть выход в интранет, где есть корпоративный антивирус, но во-первых: не на всех, во-вторых: антивирус там — хтонический Symantec, старый и добрый.
Спустя некоторое количество служебок, было принято решение заменить десктопный Windows на что-то более прочное и надёжное, но при этом win32-совместимое. Из всей массы подходящих платформ был выбран Windows XP Embedded, т.к. по нему уже имелись наработки да и вообще, классная себе такая система.
Мы прикинули что можно сделать встроенными средствами IDE Windows Embedded:
Но это всё скучно и просто. Начальство прониклось идеей модульного ПО™, которая заключается в разделении прикладного, системного ПО и конфигурации на «модули» — образы ФС, объединяющие ПО по функциональным признакам. Плюсы такого подхода:
Очевидных минусов вроде бы нет, казалось бы — внедряй и радуйся. Но то, что для QNX (изначально модульная система разрабатывалась для наших промышленных компьютеров) было просто и естественно в Windows стало адовой мигренью и выглядело как попытка скрестить морского ежа с подъёмным краном. В итоге реализовать таки получилось, но обо всём по порядку.
Как решались задачи по пунктам:
Поиски ПО для монтирования образов в Windows были долгими и мучительными. Попадались только реализации RAM-drive, что безусловно классно, но не то. Вспомнил, что в комплект Windows Virtual Server включена утилита для монтирования файлов vhd, но как добавить её в мою WinXP и легально ли это вообще, мне так и не открылось. Проект века уже почти накрылся медным тазом, я прикидывал как бы отделаться меньшей кровью и избежать разработки собственного драйвера, как вдруг в гугле всплыла ссылка на отличнейший filedisk. Подходит по всем статьям — может монтировать образы как логические диски (эмулировать носитель он не умеет, но это и не требовалось), выполнен в виде драйвера, что позволяет легко добавить в проект XP Embedded, из коробки содержит консольную утилиту для управления дисками — то что надо для использования в стартовых скриптах. В общем — стопроцентное попадание.
Драйвер установлен, но где же взять сами образы? Берём dd for windows и создаём из её виртуального /dev/null образы требуемого размера. Подключаем их с помощью filedisk, видим логические диски без ФС, создаём на них NTFS, заполняем содержимым.
На одном из образов я разместил стартовые скрипты, которые запускаются после логона и производят некоторые настройки(установка IP-адреса, разрешения экрана и т.п. из конфиг-файла). Ясно, что к моменту логона, образы уже должны быть примонтированы. И тут я перепробовал кучу вариантов — Schtasks, который позволяет выполнять задачу при логоне (но он срабатывал как-то далеко не всегда), загонял скрипт монтирующий диски в сервисы с помощью sc — при этом, содержимое образов было недоступно пользовательским аккаунтам от имени которых запускалось прикладное ПО (как вариант можно было бы перенести задачи из скриптов в службу, но скриптоложство мне почему-то милее этого бездушного C++). В итоге сколхозил — AutoExNt выполняет монтирование перед логоном, а задачи конфигурирования системы исполняются с помощью зашифрованных cpau-заданий от имени администратора (т.к. автологон происходит под аккаунтом обычного пользователя). Это был первый из стабильно работающих вариантов, а отладка к тому моменту так меня достала, что плюнул на уродство способа и оставил как есть.
Дополнительно, разработал небольшую простую утилитку автозапуска, т.к. из проекта был исключён Explorer Shell и ключи авторана в реестре никто не обрабатывал, а программы на старте запускать кому-то надо было.
На этом мои мучения с системным ПО Windows в принципе окончились, настало время подумать как же вся эта хрень будет устанавливаться на целевую машину.
Windows XP Embedded не содержит в себе инструментов для разметки и форматирования диска, в отличие от обычной Windows XP. Т.е. установка XPe заключается в копировании структуры каталогов проекта в корень раздела, отформатированного в FAT32/NTFS и помеченного как активный (флаг boot установлен). Комплект поставки XPe включает в себя диск WinPE, который содержит необходимые для разметки утилиты, но сценарии применения этого диска довольно туманны(например, он не может быть использован как диск восстановления). Похвалив про себя такую заботу о пользователях, я решил вообще не связываться с продукцией Microsoft для развёртывания XPe (хотя есть вроде бы бесплатный Windows AIK, но по предыдущему опыту попыток разобраться в лицензионных ограничениях продуктов Microsoft было принято решение поискать чего-то на стороне).
Решил попытать счастья с GNU/Linux, т.к. драйвер ntfs-3g уже довольно давно был стабильным и вполне себе работал (и, кстати, в довольно странных местах — по блажи Realtek, в SDK для их мультимедиа-платформ используется как ФС по умолчанию для внешних накопителей). Взял Live-CD Ubuntu LTS, очистил его от логотипов и упоминания Ubuntu (ибо для глубокой модификации системы Canonical выдвигает такие требования) и начал кастомизировать. Выбор дистрибутива был обусловлен личными предпочтениями.
Первая версия среды развёртывания представляла из себя bash-скрипт, который общался с пользователем с помощью zenity. Простенько и со вкусом. Была забракована, как недостаточно божественная в плане UI.
Вторая версия была написана на Mono (C# — корпоративный стандарт) и содержала в себе чуть ли не все графические элементы GTK. Высокая комиссия отметила, что UI по-прежнему недостаточно божественен, но таки жизнеспособен.
Сама процедура установки состояла из вызова внешних утилит — parted для разметки, mkfs.ntfs из пакета ntfsprogs(ntfstools) для создания ФС и rsync для копирования данных с установочного носителя.
Дальше — ребут и переход непосредственно к развёртыванию Windows Embedded.
Сейчас Windows XP Embedded (Windows Embedded Standard 2009) стремительно теряет актуальность (хотя поддержка будет продолжаться до 2015 года) — на смену ей пришла Windows Embedded 7, которая гораздо, гораздо, гораздо удобнее XPe, однако разработкой с её использованием занимается мой коллега, я же описал (как мог, хе-хе) собственный опыт. Надеюсь кто-то найдёт что-нибудь полезное в этом сборнике вредных советов.
В завершении приведу список полезных ресурсов по Windows Embedded:
О могущественные хабрамэн и прекраснейшие хабравимен! Ничтожный заметил, что сура о блистательной Windows Embedded ещё не записана в книге мудрости хабра. Да будет дозволено мне, недостойному, поведать вам одну поучительную историю о том как был построен и внедрён особо пуленепробиваемый Windows ® ™ на объектах одной российской железнодорожной корпорации.
Как мы дошли до жизни такой
Итак, одним утром, в нашу скромную обитель Системного ПО прибыл гонец от программистов с ужасными и печальными новостями. Истинно говорю вам — программцы в командировке не смогли обновить ПО на рабочем месте, т.к. оное обуял шайтан и заселил его вирусами, троянами, порнобаннерами и контерстрайком (сауирщенно неуиновные пользователи были сауирщенно ни при чём).
ПО представляет собой АРМ электромеханика СЦБ, написано на VC++ 6 + MFC + WINAPI.
Наш мудрейший халиф, узнав о таком непотребстве, созвал диван. И так говорили придворные мудрецы и звездочёты:
Антивирус не был установлен по причине отсутствия на станциях интернета (станции раскиданы по всей поверхности России и ездить с офлайн базой для обновления — как-то не вариант). На некоторых станциях есть выход в интранет, где есть корпоративный антивирус, но во-первых: не на всех, во-вторых: антивирус там — хтонический Symantec, старый и добрый.
Спустя некоторое количество служебок, было принято решение заменить десктопный Windows на что-то более прочное и надёжное, но при этом win32-совместимое. Из всей массы подходящих платформ был выбран Windows XP Embedded, т.к. по нему уже имелись наработки да и вообще, классная себе такая система.
Windows XP Embedded — это встраиваемая компонентная операционная система на базе Windows XP Professional Edition и предназначена для применения в различных встраиваемых системах: системах промышленной автоматизации, банкоматах, медицинских приборах, кассовых терминалах, игровых автоматах, VoIP-компонентах и т. п. Windows XP Embedded включает дополнительные функции по встраиванию, среди которых фильтр защиты от записи (EWF и FBWF), загрузка с флеш-памяти, CD-ROM, сети, использование собственной оболочки системы и т. п.
В настоящий момент известна как Windows Embedded Standard.
Windows on steroids
Мы прикинули что можно сделать встроенными средствами IDE Windows Embedded:
- запретить запись на диск
- ограничить учётку пользователя в правах
- лишить пользователя возможности запуска чего-либо кроме АРМ
- закрыть неиспользуемые порты
- отключить монтирование внешних USB-накопителей
- исключить из системы прикладное и системное ПО, не требующееся для непосредственной работы АРМ (Media Player, Outlook Express, Paint, Проводник и т.п.)
Но это всё скучно и просто. Начальство прониклось идеей модульного ПО™, которая заключается в разделении прикладного, системного ПО и конфигурации на «модули» — образы ФС, объединяющие ПО по функциональным признакам. Плюсы такого подхода:
- структура ПО становится более упорядоченной
- более удобная система версионирования ПО (прошу прощения за этот чудо-термин, лучшего не придумалось)
- повышение скорости развёртывания\обновления ПО — большой файл пишется быстрее множества мелких
- повышение гибкости системы, например — системное ПО (ОС) можно смонтировать в read-only, не затронув при этом прикладные программы
Очевидных минусов вроде бы нет, казалось бы — внедряй и радуйся. Но то, что для QNX (изначально модульная система разрабатывалась для наших промышленных компьютеров) было просто и естественно в Windows стало адовой мигренью и выглядело как попытка скрестить морского ежа с подъёмным краном. В итоге реализовать таки получилось, но обо всём по порядку.
Усекновение Windows
Как решались задачи по пунктам:
- для блокирования записи на диск применяем EWF с отображением данных в RAM
Расширенный фильтр записи — драйвер, перехватывающий обращения на запись к жёсткому диску и буферизующий их в зависимости от настроек:
- на специально выделенном скрытом разделе
- в оперативной памяти
Реальной записи на защищённый раздел при этом не происходит, она выполняется только по запросу пользователя (т.н. commit), для чего добрейший Microsoft предоставляет API и готовую утилиту ewfmgr. При использовании специального раздела для буферизации данные будут сохранены между перезагрузками, в случае буферизации в RAM — нет.
- создаём учётную запись из предустановленного шаблона Windows — «обычный пользователь» и ставим её в автологон
- создаём компонент типа Shell (системная оболочка) запускающий АРМ в качестве системной оболочки; исключаем из системы explorer.exe. У особо хитроумного пользователя всё ещё есть возможность просматривать структуру каталогов через диалог сохранения файла в одном из окон АРМ, но:
- это проблема программистов (хе-хе)
- не забываем про фильтрацию записи и ограниченную учётную запись
- т.к. я не большой любитель WHS-ного диалекта VB, то воспользовался батником, дёргающим netsh.exe firewall
- с лишними компонентами поступил просто — создал проект XP Embedded, содержащий только жизненно необходимые компоненты (т.е. — автоматически добавленные по зависимостям аппаратного обеспечения компоненты + требуемая инфраструктура для работы АРМ)
- отключение внешних USB-накопителей было выполнено варварским методом, а именно — из образа системы были исключены драйвер для USB-накопителей и мастер установки нового оборудования, а также через ключ реестра отключено отображение мастера нового оборудования при подключении неизвестного PnP-устройства (ну а вдруг)
Проблема отключения PnP-устройств может быть решена несколькими способами (а ещё есть devcon), но этот меня привлёк своей глобальностью, т.е. заодно с USB-накопителями будут отключены любые другие несанкционированные периферийные устройства, но, при этом сохранится возможность заменить USB-мышь\клавиатуру (т.к. драйвер имеется в системе и он содержит цифровую подпись — такие драйвера устанавливаются автоматически)
Монтирование образов
Поиски ПО для монтирования образов в Windows были долгими и мучительными. Попадались только реализации RAM-drive, что безусловно классно, но не то. Вспомнил, что в комплект Windows Virtual Server включена утилита для монтирования файлов vhd, но как добавить её в мою WinXP и легально ли это вообще, мне так и не открылось. Проект века уже почти накрылся медным тазом, я прикидывал как бы отделаться меньшей кровью и избежать разработки собственного драйвера, как вдруг в гугле всплыла ссылка на отличнейший filedisk. Подходит по всем статьям — может монтировать образы как логические диски (эмулировать носитель он не умеет, но это и не требовалось), выполнен в виде драйвера, что позволяет легко добавить в проект XP Embedded, из коробки содержит консольную утилиту для управления дисками — то что надо для использования в стартовых скриптах. В общем — стопроцентное попадание.
Драйвер установлен, но где же взять сами образы? Берём dd for windows и создаём из её виртуального /dev/null образы требуемого размера. Подключаем их с помощью filedisk, видим логические диски без ФС, создаём на них NTFS, заполняем содержимым.
На одном из образов я разместил стартовые скрипты, которые запускаются после логона и производят некоторые настройки(установка IP-адреса, разрешения экрана и т.п. из конфиг-файла). Ясно, что к моменту логона, образы уже должны быть примонтированы. И тут я перепробовал кучу вариантов — Schtasks, который позволяет выполнять задачу при логоне (но он срабатывал как-то далеко не всегда), загонял скрипт монтирующий диски в сервисы с помощью sc — при этом, содержимое образов было недоступно пользовательским аккаунтам от имени которых запускалось прикладное ПО (как вариант можно было бы перенести задачи из скриптов в службу, но скриптоложство мне почему-то милее этого бездушного C++). В итоге сколхозил — AutoExNt выполняет монтирование перед логоном, а задачи конфигурирования системы исполняются с помощью зашифрованных cpau-заданий от имени администратора (т.к. автологон происходит под аккаунтом обычного пользователя). Это был первый из стабильно работающих вариантов, а отладка к тому моменту так меня достала, что плюнул на уродство способа и оставил как есть.
Дополнительно, разработал небольшую простую утилитку автозапуска, т.к. из проекта был исключён Explorer Shell и ключи авторана в реестре никто не обрабатывал, а программы на старте запускать кому-то надо было.
На этом мои мучения с системным ПО Windows в принципе окончились, настало время подумать как же вся эта хрень будет устанавливаться на целевую машину.
Развёртывание
Windows XP Embedded не содержит в себе инструментов для разметки и форматирования диска, в отличие от обычной Windows XP. Т.е. установка XPe заключается в копировании структуры каталогов проекта в корень раздела, отформатированного в FAT32/NTFS и помеченного как активный (флаг boot установлен). Комплект поставки XPe включает в себя диск WinPE, который содержит необходимые для разметки утилиты, но сценарии применения этого диска довольно туманны(например, он не может быть использован как диск восстановления). Похвалив про себя такую заботу о пользователях, я решил вообще не связываться с продукцией Microsoft для развёртывания XPe (хотя есть вроде бы бесплатный Windows AIK, но по предыдущему опыту попыток разобраться в лицензионных ограничениях продуктов Microsoft было принято решение поискать чего-то на стороне).
Решил попытать счастья с GNU/Linux, т.к. драйвер ntfs-3g уже довольно давно был стабильным и вполне себе работал (и, кстати, в довольно странных местах — по блажи Realtek, в SDK для их мультимедиа-платформ используется как ФС по умолчанию для внешних накопителей). Взял Live-CD Ubuntu LTS, очистил его от логотипов и упоминания Ubuntu (ибо для глубокой модификации системы Canonical выдвигает такие требования) и начал кастомизировать. Выбор дистрибутива был обусловлен личными предпочтениями.
Первая версия среды развёртывания представляла из себя bash-скрипт, который общался с пользователем с помощью zenity. Простенько и со вкусом. Была забракована, как недостаточно божественная в плане UI.
Вторая версия была написана на Mono (C# — корпоративный стандарт) и содержала в себе чуть ли не все графические элементы GTK. Высокая комиссия отметила, что UI по-прежнему недостаточно божественен, но таки жизнеспособен.
Сама процедура установки состояла из вызова внешних утилит — parted для разметки, mkfs.ntfs из пакета ntfsprogs(ntfstools) для создания ФС и rsync для копирования данных с установочного носителя.
Дальше — ребут и переход непосредственно к развёртыванию Windows Embedded.
Заключение
Сейчас Windows XP Embedded (Windows Embedded Standard 2009) стремительно теряет актуальность (хотя поддержка будет продолжаться до 2015 года) — на смену ей пришла Windows Embedded 7, которая гораздо, гораздо, гораздо удобнее XPe, однако разработкой с её использованием занимается мой коллега, я же описал (как мог, хе-хе) собственный опыт. Надеюсь кто-то найдёт что-нибудь полезное в этом сборнике вредных советов.
В завершении приведу список полезных ресурсов по Windows Embedded:
- В первую очередь это конечно же тематический раздел на MSDN
- Русскоязычный форум компании «Кварта» — официального поставщика Windows Embedded в России. Вероятно, единственный крупный русскоязычный ресурс по Windows Embedded.
- Был ещё отличный репозиторий пользовательских скриптов и компонентов xpefiles.com, но с ним случилось что-то нехорошее.