Ноутбук общего пользования с ограничением времени сеанса

от автора

Приветствую хабровчане,

недавно вот попросили настроить ноутбук в одном из маленьких кафе так, чтоб им смогли бесплатно пользоваться посетители, причем с ограничением времени и не беспокоясь за свои данные.

Итак, исходная ситуация и требуемая функциональность:

  • Ноутбук Acer i3, 4GB RAM, WIFI/USB, 640GB HDD(1 Recovery Partition + 1 System/Data), Win 7 Home Premium;
  • необходимое время сессии ограничено 30 минутами;
  • перерыв между сессиями(минимальный между логинами) в 2 минуты;
  • данные сеанса не сохраняются, более того — должны быть удалены с ноутбука по окончании сессии;
  • возможность работы определенного пользователя(работник кафе) без ограничения времени;
  • возможность использования при необходимости предустановленной Windows 7.

После интенсивного поиска в интернет на тему программ для интернет-кафе я решил, что из пушки по воробьям все-таки палить не стоит, и выбрал следующие средства для решения поставленной задачи:

  • Линукс как вторая, и основная операционная система(Ubuntu 12.04 LTS, т.к. будет еще пару лет поддерживаться обновлениями);
  • гостевая учетная запись, которая в 12.04 присутствует и после окончания сессии удаляет все данные пользователя;
  • двойная скрытая загрузка, с опциональной загрузкой windows.


Теперь по порядку.

Установка системы

В windows через „Система-Управление-Управление дисками“ уменьшил основной раздел (с меткой „Acer“) на 200 ГБ, получилось свободная неформатированная область диска(200ГБ), туда и поставим убунту.

Инсталляция Ubuntu проводится стандартно, загрузка с cd/dvd.
При установке можно выбрать вариант «рядом с существующей операционной системой», я выбрал ручное разбиение на разделы:

  • (расширенный) корневой раздел root (использовать как „/“) 20 GB ext4 (/dev/sda5);
  • домашний раздел (использовать как „/home“) 176 GB ext4 (/dev/sda6);
  • раздел файла подкачки (использовать как swap) 4 GB (/dev/sda7), хотя в принципе не нужен, т.к. глубокий сон с сохранением на диск не предвидится, а для инет-серфинга он не понадобится.

Систему устанавливаем с именем пользователя administrator („admin“ уже зарезервирован в убунту).

После первой перезагрузки подключаем сеть/WIFI (если еще не подключились) и инсталлируем все обновления плюс парочку необходимых дополнений для нормальной работы:

sudo apt-get update sudo apt-get dist-upgrade sudo apt-get install flashplugin-downloader sudo apt-get install gimp 

Если планируется использование java (например, онлайн-банкинг и т.п.), ставим ее тоже:

sudo apt-get install openjdk-7-jre icedtea-7-plugin 

В этом ноутбуке первый раздел (/dev/sda1) – это раздел восстановления Windows, поэтому из загрузочного меню GRUB его желательно убрать от греха подальше.
Я сделал так:

из /boot/grub/grub.conf скопировал нужную секцию в /etc/grub.d/40_custom:

#!/bin/sh exec tail -n +3 $0 # This file provides an easy way to add custom menu entries.  Simply type the # menu entries you want to add after this comment.  Be careful not to change # the 'exec tail' line above. menuentry "Windows 7 (loader) (on /dev/sda2)" --class windows --class os { insmod part_msdos insmod ntfs set root='(hd0,msdos2)' search --no-floppy --fs-uuid --set=root 70E253CBE25393E6 chainloader +1 } 

в конец файла /etc/default/grub дописываем

GRUB_DISABLE_OS_PROBER="true" 

и запускаем в терминале обновление меню GRUB

sudo update-grub 

Tеперь при перезагрузке в меню видим только пункты относящиеся к линуксу и последним пунктом загрузку установленной Windows.

Если необходимо спрятать загрузочное меню, придется обойти один баг, присутствующий в ubuntu 12.04, а именно то что просто изменением параметров в /etc/default/grub

GRUB_HIDDEN_TIMEOUT="5" GRUB_HIDDEN_TIMEOUT_QUIET="false" 

спрятать меню при загрузке не удастся.
Это лечится добавлением в конец файла /etc/grub.d/00_header фрагмента

### BEGIN Hidden Menu Test ### cat << EOF if [ ${timeout} != -1 ]; then if sleep --verbose --interruptible ${GRUB_HIDDEN_TIMEOUT} ; then set timeout=0 fi fi EOF ### END Hidden Menu Test ### 

В конечном итоге файл /ets/default/grub имеет у меня следующий вид:

GRUB_DEFAULT="0" GRUB_HIDDEN_TIMEOUT="5" GRUB_HIDDEN_TIMEOUT_QUIET="false" GRUB_TIMEOUT="5" GRUB_DISTRIBUTOR="`lsb_release -i -s 2> /dev/null || echo Debian`" GRUB_CMDLINE_LINUX_DEFAULT="quiet splash" GRUB_CMDLINE_LINUX=""  # Uncomment to enable BadRAM filtering, modify to suit your needs # This works with Linux (no patch required) and with any kernel that obtains # the memory map information from GRUB (GNU Mach, kernel of FreeBSD ...) #GRUB_BADRAM="0x01234567,0xfefefefe,0x89abcdef,0xefefefef"  # Uncomment to disable graphical terminal (grub-pc only) #GRUB_TERMINAL="console"  # The resolution used on graphical terminal # note that you can use only modes which your graphic card supports via VBE # you can see them in real GRUB with the command `vbeinfo' GRUB_GFXMODE="640x480"  # Uncomment if you don't want GRUB to pass "root=UUID=xxx" parameter to Linux #GRUB_DISABLE_LINUX_UUID="true"  # Uncomment to disable generation of recovery mode menu entries #GRUB_DISABLE_RECOVERY="true"  # Uncomment to get a beep at grub start #GRUB_INIT_TUNE="480 440 1"  GRUB_DISABLE_OS_PROBER="true" 

и конечно, не забудьте обновить grub перед перезагрузкой:

sudo update-grub 

Теперь если после исчезновения экрана биос в течение 5 секунд нажать ESC, появится меню GRUB, иначе будет тихо загружен первый пункт меню по умолчанию (Ubuntu).

Конфигурируем гостевую сессию

  • Создаем нового пользователа user (это будет сначала наш образец для гостя, потом логин для работника кафе);
  • Меняем обои;
  • Выставляем нужные ярлыки на рабочий стол/конфигурируем по вкусу панель Unity;
  • Меняем настройки LibreOffice, Gimp и т.д.

Выходим из системы и логинимся снова как administrator.
Создаем папку /etc/guest-session/skel:

sudo mkdir -p /etc/guest-session/skel 

и копируем туда домашний каталог нашего user:

sudo cp -a /home/rus/* /etc/guest-session/skel/ sudo cp -a /home/rus/.* /etc/guest-session/skel/ 

Если теперь войти в систему как гость, то рабочий стол и окружение должны выглядеть точно так же как и у пользователя user.

Ограничение гостевой сессии по времени

Логинимся в систему как administrator.
Добавляем в файл /usr/sbin/guest-account в конец функции remove_account() (выполняется, когда гость выходит из системы) строки:

remove_account () { … …      rm -f /tmp/*.guest   touch /tmp/$(date -d "today" +"%Y%m%d%H%M").guest } 

Создаем файл /etc/guest-session/skel/.guest.sh со следующим содержимым:

#!/bin/sh  if [ -f /tmp/*.guest ] then     TIMEOUT=2     TIMESTAMP=`date -d "today" +"%Y%m%d%H%M"`      for FNAME in /tmp/*.guest      do 	OLDTIME="$(basename $FNAME .guest)"     done      if [ $(($TIMESTAMP-$OLDTIME)) -lt $TIMEOUT ]     then 	sleep 10 	notify-send -u critical "Новая сессия еще не может быть запущена!" "Подождите некоторое время (сейчас будет выполнен выход из системы)." 	sleep 10 	gnome-session-quit --logout --no-prompt     fi fi  sleep 10 notify-send -u critical "Новая сессия запущена"  "У Вас 30 минут времени.\n\nПользуйтесь!" sleep 600 notify-send -u critical "Осталось 20 минут..." sleep 600 notify-send -u critical "Осталось 10 минут..." sleep 300 notify-send -u critical "Через 5 минут будет выполнен автоматических выход из системы!\nВсе данные Вашего сеанса будут удалены." sleep 300 notify-send -u critical "До свидания" "Сеанс завершится через 10 секунд.\nВсе данные Вашего сеанса будут удалены." sleep 10 gnome-session-quit --logout --no-prompt 

и делаем его исполняемым:

sudo chmod a+x /etc/guest-session/skel/.guest.sh 

Остается только добавить в конец файла /etc/guest-session/skel/.profile строчку

 $HOME/.guest.sh & 

и собственно на этом все.

Результат

В результате я получил ноутбук, который без предупреждения и показа меню загружается в убунту, с тремя пользователями: administrator, user и „гость“, и с ограничением времени „гостевого“ сеанса в 30 минут с принудительной паузой в 2 минуты. Паузу можно сбросить, перезагрузив ноутбук. Если такое нежелательно, то стоит сохранять файл .guest не в /tmp, а, скажем, в /var/log (см. /usr/sbin/guest-account).
Через определенные промежутки времени пользователю выдаются сообщения об оставшемся времени сеанса.
Во время сеанса возможна смена пользователя (например на user, и обратно на гость без необходимости полного выхода user’a из системы).

Недостатки

Скрипт .guest.sh хотя и не виден в домашней папке (по крайней мере сразу), но виден в списке процессов, и этот процесс спокойно убивается гостем (если он знает как), что в принципе снимает ограничение на время сеанса.

Конструктивная критика и предложения по улучшению данного решения приветствуется!

ссылка на оригинал статьи http://habrahabr.ru/post/179237/


Комментарии

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

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