Успешный запуск свежеустановленной системы знаменует начало более увлекательного и существенно более длительного периода адаптации системы под потребности и привычки пользователя. До эпохи полной победы маркетинга над здравым смыслом, любой аппарат (машину) вначале настраивали, а затем запускали и смотрели насколько хорошо она работает. Но нашлись люди с инновационным мышлением. Оказалось что это концептуально не верный подход. Правильно — удалять гланды через задний проход. Это открывает огромные перспективы перед человечеством. Например пациент может курить во время операции — рот у него ничем не занят. Вот вы смеетесь, а для некоторых это очень важно. Увы эта цунами докатилась и до мира десктопного Линукса. Первый вход в систему происходит в графическом интерфейсе и при работающем графическом интерфейсе мы должны его же и настраивать. Поэтому эксперименты с заменой драйвера (модуля ядра) видеокарты чреваты интересной рекурсией: чтобы исправить ошибки в настройках графической системы, надо эту графическую систему запустить, которая не работает из-за ошибок в настройках графической системы. В этой статье я расскажу как в популярном дистрибутиве Ubuntu (от 10.04 и старше) отмотать вспять клубок безумных инноваций и вернуть землю под ноги.
Маленькое лирическое отступление о системе инициализации, для общего понимания вопроса. Загрузчик (GRUB) загружает выбранное ядро (vmlinuz-****) и передает ему вместе с управлением образ корневой файловой системы этапа начальной инициализации (initrd-****, которая в миру известна как initramfs). Завершается этот этап монтированием настоящей корневой файловой системы ( которая указана в качестве параметра оператора kernel в меню GRUB) и запуском демона init , который на самом деле центральный демон системы Upstart и к традиционному init (SysytemV) не имеет никакого отношения. Сразу вспоминается разъяснения политрука солдату Чонкину, что древко это палка, но надо говорить древко. Демон init читает файлы upstart заданий из каталога /etc/init, далее сам для себя генерирует событие «started», и начинает выполнять upstart задания в соответствии с происходящими upstart событиями. Запуск системных служб (демонов) не имеющих upstart заданий (рассчитанных на систему инициализации SystemV и имеющих управляющие скрипты в /etc/init.d) осуществляется upstart заданием /etc/init/rc.conf по событию runlevel N. События runlevel генерирует задание /etc/init/rc-sysinit.conf, в нем же указан умолчательный (2-й) уровень запуска. Закончилось отступление.
В Ubuntu уровни запуска (runlevel) 2,3,4,5 абсолютно идентичны по набору системных служб, следовательно бесполезны. Идея состоит в следующем. Необходимо запуск графической оболочки оставить только на 3,4,5 уровнях запуска. Тогда при загрузке по умолчанию система окажется на 2-м уровне без попыток запуска графической оболочки. В меню GRUB добавляем пункт, который абсолютно идентичен нашему основному (умолчательному) варианту, а в конец строки kernel (или сразу после параметра root ) через пробел пишем цифру 3. При выборе этого пункта загрузочного меню система загрузится на 3-й уровень, что повлечет автоматический старт графической оболочки. Вот фрагмент моего загрузочного меню:
title 10.04 LXDE sda8 Graphic mode
root (hd0,7)
kernel /boot/vmlinuz-2.6.32-21-generic root=/dev/sda8 3
initrd /boot/initrd.img-2.6.32-21-generic
title 10.04 LXDE sda8 Text mode
root (hd0,7)
kernel /boot/vmlinuz-2.6.32-21-generic root=/dev/sda8
initrd /boot/initrd.img-2.6.32-21-generic
Теперь о главном. Как убрать загрузку графики на втором уровне запуска. Это не просто, а очень просто. От версии к версии в Ubuntu все большее количество системных служб запускаются через upstart задания. В 10.04 и следующих релизах запуск графической оболочки выполняется upstart заданием /etc/init/gdm.conf (kdm.conf, lxdm.conf). Поэтому совершенно бессмысленно ковыряться в симлинках /etc/rc[2-3].d (как рекомендовалось ранее) - не поможет. Берем текстовый редактор, с правами root открываем файл /etc/init/gdm.conf (kdm.conf, lxdm.conf)
вместо:
start on (filesystem
and started dbus
and (graphics-device-added fb0 PRIMARY_DEVICE_FOR_DISPLAY=1
or drm-device-added card0 PRIMARY_DEVICE_FOR_DISPLAY=1
or stopped udevtrigger))
stop on runlevel [016]
Пишем:
start on (filesystem
and start on runlevel [345]
and started dbus
and (graphics-device-added fb0 PRIMARY_DEVICE_FOR_DISPLAY=1
or drm-device-added card0 PRIMARY_DEVICE_FOR_DISPLAY=1
or stopped udevtrigger))
stop on runlevel [0216]
сохраняемся, выходим. На этом все.
Для настройки графики загружаемся в текстовом режиме — ставим новые мега-супер-пупер дрова, набираем startx — читаем поток ошибок, если чего не заладилось с X-сами, выправляем кривизну, повторяем попытку.
Подводные камни. Беда здесь может быть в том, что и текстовые консоли нынче графические, и для своей корректной работы требуют правильных модулей ядра. Поэтому если после первой успешной загрузки, по ctrl-alt-F[1-6] вы вместо приглашения ввода имени пользователя видите черный экран, то не спешите проделывать все вышеописанное. Для начала надо добиться нормальной работы текстовых консолей. В /etc/modprobe.d/blacklist-framebuffer.conf надо указать те модули которые грузятся, но некорректно работают. Например модули fbcon и vgafb (тут правда все довольно индивидуально). После внесения правок в этот файл надо пересобрать файл initrd-****:
sudo update-initramfs -u
Перегрузиться и посмотреть появились ли текстовые консоли. Если нет, значит продолжаем поиски до достижения положительного результата.
23.03.2011
Обсудить статью можно на моей страничке в ЖЖ (amiserv.livejornal.com)