Информационные технологииStfw.Ru 🔍

Еще раз про автоматический вход в систему

Адриан Чанг
🕛 02.12.2010, 16:12
Практически "однопользовательские" машины становятся все обычнее по мере того, как все больше людей используют GNU/Linux на собственных настольных компьютерах. Принятая в Linux система многопользовательской регистрации при входе в систему редко используется значительной долей новых пользователей. Обычным требованием стала такая конфигурация, чтобы при включении компьютера автоматически (без запроса регистрационного имени пользователя и пароля) загружалась бы настроенная под единственного непривилегерованного пользователя графическая среда, обычно KDE или GNOME.

Вопрос "Как это сделать?" задается столь часто, что меня удивляет не-написаность HOWTO по этому вопросу (ну, по крайней мере я такового не нашел). Данная статья ни в коей мере не претендует на полноту изложения, позволяющую восполнить этот пробел, но я надеюсь, что она сможет придать читателю верное направление:).

Готовые решения


Способы автоматизации входа в систему уже предлагались и один из них излагается в одном из старых выпусков Linux Gazette (http://www.linuxgazette.com/issue27/kodis.html).

Этот способ предполагает наложение заплатки на программу /sbin/mingetty, которая запускается скриптом init при загрузке системы. Саму заплатку и инструкции по ее использованию можно найти на http://users.jagunet.com/~kodis/autologin/autologin.html. Но, хотя автоматический вход в систему в виртуальной консоли и облегчается, этот способ сам по себе не инициализирует графическую среду. Читайте ниже про то, как можно устроить и это тоже.

В качестве альтернативы можно воспользоваться пакетом autologin ( http://www.linux-easy.com/development/autologin/). Этот пакет позоволяет запускать при начальной загрузке графический десктоп. Впрочем, лишь немногие дистрибутивы GNU/Linux включают его, как стандартный.

Последние версии kdm (выполненой в стиле KDE замене xdm - менеджера входа в систему для X11). Раскомментируйте следующие строчки в /etc/kde2/kdmrc:
AutoLoginEnable=true AutoLoginUser=fred
Благодаря этим настройкам kdm будет автоматически в момент запуска входить в систему под именем пользователя fred, запускать выбранную fred'ом графическую оболочку без какого-либо вмешательства пользователя. Mandrake поставляет графическую компоненту для активизации этой возможности kdm, позволяя избежать череватое ошибками редактирование текстовых файлов настроек.

Но, возможно, именно kdm кому-то не нужен или кто-то вообще не хочет его устанавливать. Возможно, не хватает места на диске или же kdm тяжеловат для старенького PC. К счастью, существует способ автоматически войти в систему на одной из виртуальных консолей сразу после загрузки компьютера, не завязанный на наложение патчей или скачивание дополнительных программ. Этот процесс несколько более "запутан", но он применим и для минимальной конфигурации GNU/Linux - нет необходимости устанавливать GNOME, KDE или тянущий за собой весь QT kdm. Автоматическая загрузка командной строки (или другого интерактивного консольного приложения) может быть полезной даже в отсутсвие на машине X-ов:).

Метод правки напильником


Создайте файл autologinfred.c в своем любимом текстовом редакторе и наберите эту короткую C-программу:

int main() { execlp( "login", "login", "-f", "fred", 0);
}
Системный вызов execlp выполнит команду "login -f fred" и заменит текущий контекст обработки на контекст этого вызова. Страница man для login описывает действие ключа -f. Откомпилируйте эту крошечную программу с помощью компилятора GNU C:

$ gcc -o autologinfred autologinfred.c
Получите права root'а (командой su) и скопируйте исполнимый файл в общедоступную директорию:

# cp autologinfred /usr/local/sbin/
Теперь взглянем на /etc/inittab. Этот конфигурационный файл используется init, самым первым процессом, который запускается при инициализации Linux. Вам должны попасться строки наподобие следующих:

1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
Конкретное содержимое /etc/inittab варьирует от дистрибутива к дистрибутиву. В Debian-системах можно увидеть:

1:2345:respawn:/sbin/getty 38400 tty1
2:23:respawn:/sbin/getty 38400 tty2
3:23:respawn:/sbin/getty 38400 tty3
Измените строку, начинающуюся с "1:2345" так, чтобы она выглядела следующим образом:

1:2345:respawn:/sbin/getty -n -l /usr/local/sbin/autologinfred 38400 tty1
В результате пользователь fred будет зарегистрирован в системе на первой виртуальной консоли. В некоторых дистрибутивах GNU/Linux (например, в RedHat) должен использоваться /sbin/agetty. Ключ -l <альтернативная программа регистрации в системе> заменяет используемую по умолчанию программу /sbin/login той, которую мы скомпилировали ранее. Ключ -n говорит getty не запрашивать регистрационное имя пользователя.

Инициализация при входе в систему графического рабочего стола

Если мы перезагрузим компьютер, то процесс init автоматически войдет в систему пользователем fred на первой виртуальной консоли и запустит командную оболочку - шелл. Однако для запуска графического рабочего стола пользователь fred по-прежнему должен набрать команду startx сам, путем личного нажима на клавиши. Можно ли автоматизировать и это?

Если fred при входе в систему загружает оболочку /bin/bash, то первыми будут выполнятся команды, перечисленные в файле ~fred/.bash_profile. Вы можете добавить команду startx туда, но это вызовет проблемы, т.к. .bash_profile используется и в других ситуациях, таких, как вход в систему со второй виртуальной консоли или при открытии xterm. Вместо этого мы добавим в .bash_profile следующие строки:


if [ -z "$DISPLAY" ] && [ $(tty) == /dev/tty1 ]; then startx
fi

При каждом новом заходе в систему с первой виртуальной консоли будет автоматически запускаться графический интерфейс. Окружающие операторы гарантируют, что сеансы, запускаемые из среды графического рабочего стола или из других виртуальных консолей, не будут немедленно запускать новую графическую Х-сессию. Пользователям /bin/sh следует добавить эти строки в ~fred/.profile, а пользователям tcsh нужно конвертировать их в эквивалентный скрипт для csh.

Если GUI уже запущен (через xdm, gdm, kdm и т.д.), то следует выполнить команду startx-:1. Она создаст вторую GUI-сессию. Если Вам нужна только один активный графический десктоп, то лучше отключить существующий экземпляр Xserver'а уменьшив уровень выполнения [run level] (в RedHat) или отключив [unlinking] конфигурационные файлы /etc/rc?.d/S99?dm (в Debian).

Варианты

Теперь при каждой загрузке машины пользователь fred входит в систему с первой виртуальной консоли, инициализируется коммандная оболочка bash, которая читает свой ~/.bash_profile и вызывает команду startx - и все это без вмешательства пользователя или ввода паролей. Не правда ли мило?

Мы можем пойти дальше и воспользоваться файлом ~/.xinitrc для того, чтобы запустить на рабочем столе конкретную программу (за деталями обращайтесь к man startx). Поместите туда свою любимую игру и Ваша Linux-машина будет работать, что твои игровые автоматы, за вычетом декоративного корпуса. Запустите проигрыватель Ogg Vorbis с визуальными эффектами и Вы получите специализированный музыкальный автомат:).

Автоматический вход в систему может быть полезен и вне контекста графического интерфейса пользователя. Можно настроить специального пользователя, шеллом для которого будет /usr/bin/top. Теперь одна виртуальная консоль будет служить для интерактивного наблюдения за активными процессами. Варианты безграничны.

Заключение

Многопользовательская операционная система GNU/Linux становится все более популярной в однопользовательском контексте. В таких ситуация можно/хочется легко обойтись и без протоколов регистрации пользователя в системе. Данная статья иллюстрирует тот факт, что UNIX-корни не мешают использованию ОС и в таких "специальных" случаях. Несложные изменения конфигурационных файлов и немного программирования - и процесс входа в систему может быть легко автоматизирован в большинстве дистрибутивов GNU/Linux, в полной мере сохраняя гибкость и настраиваемость системы.

Linux   Теги:

Читать IT-новости в Telegram
Информационные технологии
Мы в соцсетях ✉