08 октября 2014
Описываемый проект внедрён и используется уже лет пять. Пришло время рассказать, как всё было и поделиться опытом.
Давным-давно работал я техником (что-то вроде лаборанта, но более узкоспециализировано) в одном из учебных заведений среднего профессионального образования нашей необъятной родины. Смотрел, как проходят занятия, видел, как неаккуратно обращаются с хрупким программным обеспечением студенты и преподаватели, участвовал в массовых рутинных операциях, таких как: «переустановить некую самую популярную ОС на 30 и более разных компьютеров», «ой, нам для нужд учебного процесса срочно нужно поставить вот этот программный пакет, но аудиторию ещё не знаем» и далее в таком же духе.
Был я не совсем доволен положением вещей. Казалось мне, что всё должно быть проще, легче, изящней и вообще работать чуть ли не само (знакомое чувство?). В итоге взрывоопасная смесь из юношеского максимализма, студенческой неопытности и желания изменить мир сотворили в моей голове «идеальную» картину, как оно всё-таки должно быть.
Под катом много текста c картинками, технические подробности, одна тяжелая гифка и 6-ти минутная видео презентация.
А идея была проста, ставлю везде дистрибутив Linux, ведь все знают, что они (линуксы) безопасны, красивы и вирусов там нет. Пишу небольшой велопарк, для автоматизации рутины… Профит!
На самом деле, к тому времени с Linux и открытым ПО я был знаком достаточно хорошо и вполне осознавал отсутствие привычных программ для преподавателей и/или учебных материалов по открытым аналогам. Насколько мне было известно, об эти проблемы разбились многие внедрения. Но я все продумал! Надо было только сесть, быстренько всё написать и настало бы всеобщее счастье. Неужели такие мелочи, как человеческие привычки и нежелание учиться чему-то новому могут остановить дотошного студента? В общем-то, они могли бы остановить, но начальство было благосклонно к моему энтузиазму, за что ему большое спасибо. Пока я копошился с написанием своих велосипедов, о которых ниже, в нашей стране в сфере образования стали усиленно бороться с нелегальным ПО. Тут мои идеи пришлись кстати.
Помимо чисто эгоистического «облегчить работу себе», я искренне желал сделать обучение в компьютерных классах проще и плодотворнее как для студентов, так и для преподавателей. Простая замена «самой популярной ОС» на дистрибутив Linux, с моей точки зрения, — это «шило на мыло». Такой переход упрощает жизнь бухгалтерам и юристам, а обслуживающий персонал как бегал от компьютера к компьютеру, так и продолжит бегать (ну, может чуть меньше). Собственно, вот список проблем, которые я вознамерился решить. И решил.
ПО в компьютерных классах требует обслуживания. Его надо устанавливать и обновлять на многих машинах
Могу поставить одну программку на один компьютер, на два — уже не могу: однообразная работа меня пугает. Тут очень кстати пригодилась пакетная система установки. Собрал пакет, положил в репозиторий, на компьютерах прописал обновление при загрузке. Репозиторий от Ubuntu скачал целиком и разместил в локальной сети. Часть пакетов заменил, часть добавил. Написал несколько скриптов для сборки пакетов и копирования обновлённого репозитория на сервер.
Теперь, если нужно обновить ПО, достаточно кинуть пакет в репозиторий и перезагрузить компьютеры.
Красивый, лёгкий внешний вид без возможности его поменять
Студенты любят проявить свою индивидуальность и подкрутить внешний вид общественных компьютеров под себя. Иногда у них это получается не совсем политкорректно, тогда преподаватели прибегают в панике, ведь через политики псевдобезопасности «самой популярной ОС» заблокировано меню для смены обоев. Это обстоятельство ничуть не пугает студентов, они ведь в курсе, какую картинку надо заменить… И далее в том же духе. Фантазия молодого поколения и стремление «выделиться» не знает преград. То есть не знала.
Будучи фанатом KDE, я бы с удовольствием поделился радостью использования этой чудесной среды, но здесь легендарная KDE-шная настраеваемость как раз совсем не нужна, поэтому выбор пал на оконный менеджер OpenBox и pypanel. И почти всё. Вот такой минимализм. Поработала такая связка и выяснилось, что c OpenBox не дружит Lazarus (клон Delphi) и некоторые программы из-под wine.
Итоговый вариант, работающий по сей день, был постороен на оконном менеджере KWIn и панели tint2. KWin умеет рисовать и «современные красивости» через OpenGL, и «по старинке» без проблем работать на старом железе, которое на тот момент имело место быть.
Внимательный читатель уже заметил недостающий компонент в этом «рабочем столе-описании» — собственно рабочий стол, на котором рисуются иконки. Вот и велосипед номер один. «Рабочий стол» я написал сам. Были у меня к этому компоненту специфичные требования, да и писать его просто. Нужно только правильные X11 флаги назначить окну, а флаги эти быстро смотрятся в реализации KDE-шного рабочего стола (вот она, сила open source!). Мой рабочий стол должен был быть предельно простым: уметь отображать .desktop-файлы (аналог .lnk в Windows, только текстовый) из конкретной папки и показывать «нескучные обои» из конкретного файла. Вот только запускать программы он должен был не самостоятельно, а по DBUS (это такой IPC) через «клиента для управления», о котором ниже. Последняя версия рабочего стола была переписана с использованием QML, и стало всё совсем весело и анимировано.
Безопасность и здоровье всем компьютерам!
Многие студенты и преподаватели относятся к этим понятиям по принципу «не моё — не жалко». Такое отношение пользователей крайне расстраивает обслуживающий персонал. Я подумал немного и сделал из студенческих машин «терминалы», возвращающиеся к своему исходному состоянию при смене пользователя или перезагрузке. Сделано это было обычным скриптом на баше, зачищающем home и tmp. Просто и эффективно.
Свои данные везде или наше персональное облако
Если просто стирать все студенческие наработки и заставлять их делать каждый раз всё заново… Это было бы круто! Наверное, скорость и качество их работ сильно возросли бы, и уже ко второму курсу они могли бы… Но этому плану по улучшению качества образования не суждено было сбыться. Отчасти потому, что мне хотелось поиграть с FUSE и написать свою кеширующую файловую систему. Написал. Некоторое время она поработала, но потом мне надоело с ней возиться. На баше набросал скрипт, который при выходе пользователя избирательно сжимает файлы из домашнего каталога и бросает на сервер через rsync, а при входе загружает и распаковывает. Побочный эффект: студенты больше не привязаны к конкретным компьютерам и аудиториям. Ура!
Хотим указывать, какое ПО можно использовать
Пользователи в основной своей массе юридически безграмотны. Объяснить, что ряд программ нельзя использовать в учебном процессе, не заплатив крупную сумму, очень сложно, так ещё и ряд этот периодически пополняется без ведома сотрудников, ответственных за вопросы легальности установленных программ.
Для начала я подошёл к решению этого вопроса классически: работать все будут из-под ограниченного аккаунта. Именно все, как студенты, так и преподаватели из-под одного обычного аккаунта, заведенного на всех машинах. Это, а также самоудаляющиеся данные, да и сам по себе Linux делают установку стороннего неодобренного софта затруднительной.
Кнуты без пряников внедрению не подлежат
Ограничить теперь можно всё и вся и почувствовать себя настоящим злодеем. Но такой задачи не стояло, поэтому нужно было сделать что-то приятное… Сначала преподавателям и учебному процессу. Ради этой благой цели я написал «Панель управления» компьютерным классом. Зачем писать своё, когда уже есть неплохие и даже открытые решения? Мне хотелось веб-интерфейс. Ведь так здорово зайти с любого компьютера (смартфона, планшета) и порулить компьютерным классом. И преподаватель не привязан к конкретной машине.
«Панель управления» — это сервер, принимающий команду с веб-интерфейса и пересылающий всем выделенным компьютерам. HTTP- и сетевой IPC-сервер я объединил в одной программе (сейчас я бы так не делал, совсем не масшабируется) ради удобства обработки событий и общей памяти.
Клиент для упомянутого сервера я установил на все машины под управлением Linux. Клиент подключается к серверу при включении компьютера и ждёт команд. Большинство команд просто запускают bash-скрипты.
Концентрация внимания студентов
Функционал «Панели управления» расширялся постепенно. Но первой и, пожалуй, главной «фичей» было разрешение на использование программ. Выглядит это так: студенты садятся за компьютеры, вводят свои логины и пароли и видят пустой рабочий стол. Преподаватель садится за компьютер, вводит свой логин и пароль и видит на рабочем столе иконку «Панели управления». При нажатии на иконку открывается браузер со страницей «Панели управления». На этой странице из списка установкой галочек выбираются программы, которые нужны преподавателю для занятия. Иконки выбранных преподавателем программ появляются на рабочих столах студентов. Теперь студенты могут запустить программы, щелкнув по иконкам, или сам преподаватель может со своего компьютера запустить нужные программы на всех или на выделенных компьютерах студентов.
Работает эта магия следующим образом. Сервер посылает клиентам команду «установить application_name». Клиент, получив команду, скачивает с HTTP-сервера файл «application_name.desktop». В этом файле к стандартным полям я добавил ещё несколько, в которых перечислены пакеты для установки, основные файлы и директории приложения и т. д.
Когда desktop-файл загрузится, клиент попытается установить перечисленные в нём пакеты и задать права на чтение/запуск указанным файлам приложения. Если преподаватель решает, что хватит студентам работать с какой-то из разрешенных программ, он снимает галочку в «Панели управления». Клиентам приходит команда «удалить application_name», программа закрывается, desktop-файл удаляется, с указанных файлов снимаются разрешения на чтение и выполнение. Установленные пакеты остаются нетронутыми. Переустанавливать каждый раз слишком накладно.
Пока программа ставится и настраивается, на рабочем столе весело подпрыгивает полупрозрачная иконка приложения.
Когда выходит новая интересная программка, я кидаю пакет в репозиторий, а на сервер desktop-файл, и в «Панели управления» появляется программа, доступная для выбора преподавателем.
Наблюдение за работой
Студенческие машины раз в несколько секунд посылают на сервер уменьшенный скриншот рабочего стола. Эта картинка демонстрируется преподавателю в «Панели управления». Но этого мало. Все конкурентные решения умеют смотреть и управлять удаленным рабочим столом. А чем я хуже?
Тут возникла ещё одна «хотелка»: режим показа одного рабочего стола всему классу. Была такая задача и подумал, что неплохо бы встроить и этот функционал. Обычный x11vnc из поставки Ubuntu сильно тормозил при подключении 25 экранов, да и при 10 было уже некомфортно. Спас положение TurboVNC, который показал приемлемую производительность. На «Панель управления» добавил ещё две кнопки: «Посмотреть рабочий стол (и поуправлять)» и «Показать выделенный всем». При нажатии идёт команда на сервер «Покажи компьютер X компьютерам Y1..Yn», а сервер уже указывает, кому запустить VNC-сервер, а кому — просмотрщики, панель управления ведь обычная web-страница и напрямую общаться с другими компьютерами ей сложно.
Ограничение Интернета
Когда студенты видят браузер, мысли об учёбе покидают и во вкладках обосновываются социальные сети и прочие не связанные с обучением ресурсы развлекательного характера. Ну и ладно, вернемся к диктаторским мерам и введём белые списки. Только пусть управляют ими преподаватели. Хотят, пусть всё разрешают, а надо, так указывают разрешенные адреса. Добавил ещё одну кнопку в «Панель управления». По нажатии открывается диалог, куда можно добавить URL.
Эти сайты сохраняются в профиле преподавателя, и доступны в списке программ, откуда легко назначаются студентам, установкой галочки. При назначении URL выделенным компьютерам приходит команда: добавить в список разрешённых указанный адрес и перенастроить установленный на каждой машине tiniproxy.
Структура WWW сейчас такова, что разрешенный сайт X скорее всего тянет скрипты, стили и картинки с других неразрешенных ресурсов, и страницы выглядят грустно или работают некорректно. Поэтому. когда приходит команда «добавить разрешенный URL», сайт скачивается, парсится, из него вынимаются ссылки на скрипты, стили и картинки и добавляются в разрешённые. Cрабатывает не всегда корректно, но это лучше чем ничего.
Еще некоторым приложениям нужен доступ к определенным сайтам для корректной работы. Для таких случаев в desktop-файл я добавил параметр с перечислением сайтов. Когда преподаватель выбирает приложение, указанные для него сайты автоматически разрешаются. Если нужно разрешить всем или некоторым студентам полный доступ, преподаватель выбирает в списке «Полный доступ в Интернет» и ограничения снимаются.
Изучение операционных систем или виртуальные машины
Поначалу, когда все это затевал, я успокаивал преподавателей наличием «самой популярной ОС XP» в виртуальной машине. Забегая вперёд, скажу, что больше эта опция недоступна и у нас плавно, не без стрессов, но сформировалась среда исключительно из свободного ПО (в нескольких компьютерных классах).
Возвращаясь к визуализации, я выбрал VirtualBox и реализовал управление виртуальными машинами в духе всей системы — делаю один раз и тиражирую для всех. В «Панели управления» в разделе с приложениями теперь перечисленны и FreeDOS (не спрашивайте зачем), и ReactOS, и тот же Ubuntu Linux с root-доступом. Эти псевдоприложения запускают скрипт, который загружает с сервера образ виртуальной машины и кладёт его в кеш. Если образ не изменился и уже в кеше, заново скачиваться он не будет. Тот же скрипт настраивает VirtualBox и запускает виртуальную машину в режиме снапшота, т. е. студент может делать с запущенной виртуальной машиной что угодно, но всё вернётся к изначальному состоянию.
А как же Gnome и KDE?
Преподаватели хотят показывать студентам разные «рабочие среды», мол, существует не только одна кнопка Пуск (которая то есть, то её нет). Сначала я пошёл по простому пути и подготовил несколько виртуальных машин с Linux: одна — на KDE, другая — на Gnome. Но в таком режиме эти требовательные окружения работали очень неторопливо. И когда выдалась свободная минутка, написал скрипты, которые «просто» запускают выбранное окружение рабочего стола поверх моего, а преподаватель с «Панели управления» может в любой момент закрыть «KDE» или «Gnome». Теперь менять рабочие столы можно без перезагрузок. Быстро и удобно!
Анонимный вход
В компьютерных классах иногда проходят мероприятия со сторонними участниками (презентации, курсы, олимпиады и т.д.). Заводить для каждого из гостей логин и пароль неинтересно, поэтому в панели есть кнопка «Анонимный вход». Это очень удобная и важная кнопка! Нажатие на неё откроет на выбранных компьютерах чистый рабочий стол без единой иконки. Если потом выбрать в «панели управления» из списка всё, что необходимо и нажать «запустить утомительный процесс запуска одинаковых программ или открытия сайтов, связанный с перебеганием от компьютера к компьютеру будет заменён несколькими кликами.
Ограничивать так по полной
Ещё в „Панели управления“ есть кнопка „Заблокировать экран“. Она запускает самописный блокировщик с анимированным замочком (да, потому что мне хотелось анимированный замочек) и блокирует экран выбранным студентам.
Флешки отключены запретом чтения /media. Раньше способ был радикальнее, правильнее и эффективнее, но он перестал работать после очередного обновления Ubuntu. Преподаватель может разрешить студентам использовать флешки, выбрав в списке „Сменные носители“.
Установка дистрибутива должна быть предельно простой
Все компоненты системы я собрал в репозиторий. Теперь, чтобы настроить рабочее место моей мечты, нужно выполнить три простых действия: установить Kubuntu, подключить репозиторий, скомандовать apt-get install integration-client. И так на каждой машине. Это долго и нудно, особенно когда компьютеров 100+. Поэтому я воспользовался чудесным дистрибутивом SystemResсueCD. У него есть простое руководство по пересборке и добавлению скриптов в автозапуск. Теперь для установки дистрибутива нужно загрузиться с подготовленных мною флешки или диска, выбрать тип сети (DHCP, NAT или общая), указать номер аудитории и номер компьютера, выбрать тип установки: на одну машину или массовую установку во всём классе (поднимется сервер сетевой загрузки). Когда все параметры введены, скрипт размечает диск через parted, монтирует на самбе директорию с заранее подготовленным образом системы, распаковывает через fsarchiver на жесткий диск и устанавливает загрузчик. Весь процесс занимает 5-10 минут в зависимости от мощности компьютера и загруженности сети, а главное — не требует особых технических навыков.
Для тех, кто добрался до этих строк и располагает еще шестью минутами свободного времени есть изобилующая 3D эффектами презентация описанного проекта, которую я готовил для одной профильной конференции. К сожалению, по наивности, я сделал упор на то, что Linux это хорошо, а не Linux — плохо, а надо было отстраниться от священных воин и просто демонстрировать свои наработки. Но если смотреть с определённой долей иронии то вполне забавно.
Почему нельзя было тоже самое сделать на „самой популярной ОС“?
В принципе можно, но намного сложнее. Разрабатывать придётся намного больше. Для многих задач решаемых одной строкой на Bash в Windows придётся писать полноценную программу (PowerShell в те времена не было). И самое главное реализовать описанную массовую установку для большинства Windows программ легально не получится. В тексте лицензий такой подход, часто явно запрещён. А если ограничиться только open source приложениями, то зачем вообще Windows? По поводу совмести с железом, дистрибутив Linux смотрится намного выигрышнее. За долгие годы апгрейдов в компьютерных классах собрался зоопарк материнских плат, видео и прочих карт. Ubuntu без проблем и долнительных настроек ставится практически на все машины (c учётом обновления установочного образа системы раз в два года). Установить класс на Windows и что бы сразу всё заработало — это очень редкий случай, и приходится по долгу колдовать над каждой машиной по отдельности.
Выводы
На вопрос — улучшилось или ухудшилось качество образования после внедрения всего вышеописанного — ответ такой: ничего не изменилось. Качество образования, как оказалось, целиком зависит от квалификации преподавателя. Однако процессы обучения и обслуживания компьютерного парка стали значительно более удобными, дешевыми, защищенными и контролируемыми.
Сейчас многие ограничения потеряли актуальность в связи с обилием мобильной техники у студентов. Интернет и игры от учебных компьютеров уже не нужны, они есть на планшетах и телефонах. (Вот сынок/дочка тебе планшет, учись хорошо… Много раз видел такую сцену… О чём эти родители вообще думают?!)
P. S. По поводу игр. Совершенно случайно получился интересный эксперимент. Когда я только развернул первую версию системы, в ней не было доступных игровых приложений. Через несколько дней один из преподавателей попросил меня добавить хоть какую-нибудь игру. Ну, я и добавил… шахматы. Вы когда-нибудь видели, как ещё недавно непреклонные фанаты Conter Strike c тем же задором играли в шахматы? Студенты собрались у компьютера (к сожалению, не было сетевого режима), кричали, махали руками, играя в эту игру!
P. P. S. Наработки по проекту здесь: http://sourceforge.net/p/int/code/ci/master/tree/. Внимание! Очень много страшного студенческого кода и глупых архитектурных решений, на JS вообще без слёз смотреть нельзя. Может когда-нибудь я всё же вернусь к этому проекту и перепишу, как надо (мечтательно).