Приветствуюе,
недавно вот попросили настроить ноутбук в одном из маленьких кафе так, чтоб им смогли бесплатно пользоваться посетители, причем с ограничением времени и не беспокоясь за свои данные.
Итак, исходная ситуация и требуемая функциональность:
- Ноутбук 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 минут времени.nnПользуйтесь!"
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 хотя и не виден в домашней папке (по крайней мере сразу), но виден в списке процессов, и этот процесс спокойно убивается гостем (если он знает как), что в принципе снимает ограничение на время сеанса.
Конструктивная критика и предложения по улучшению данного решения приветствуется!
Автор: hrum