Compare commits
4 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4015fe4fa7 | ||
|
|
1c4dab825e | ||
|
|
5ebef8d95a | ||
|
|
56e266c439 |
377
s4a.tex
377
s4a.tex
@@ -13,8 +13,9 @@
|
|||||||
% Заполняем поля PDF уже со включенной опцией unicode
|
% Заполняем поля PDF уже со включенной опцией unicode
|
||||||
\hypersetup{pdftitle={systemd для администраторов},%
|
\hypersetup{pdftitle={systemd для администраторов},%
|
||||||
pdfauthor={Lennart Poettering, Sergey Ptashnick}}
|
pdfauthor={Lennart Poettering, Sergey Ptashnick}}
|
||||||
% Небольшое сокращение
|
% Несколько сокращений
|
||||||
\newcommand{\sectiona}[1]{\section*{#1}\addcontentsline{toc}{section}{#1}}
|
\newcommand{\sectiona}[1]{\section*{#1}\addcontentsline{toc}{section}{#1}}
|
||||||
|
\newcommand{\hreftt}[2]{\href{#1}{\texttt{#2}}}
|
||||||
% Настройка макета страницы
|
% Настройка макета страницы
|
||||||
\setlength{\hoffset}{-1.5cm}
|
\setlength{\hoffset}{-1.5cm}
|
||||||
\addtolength{\textwidth}{2cm}
|
\addtolength{\textwidth}{2cm}
|
||||||
@@ -1050,7 +1051,7 @@ systemd и на этот случай есть простое решение, и
|
|||||||
Заметим, что systemd читает файлы конфигурации из обоих этих
|
Заметим, что systemd читает файлы конфигурации из обоих этих
|
||||||
каталогов, но файлы из +/etc+ (управляемые системным
|
каталогов, но файлы из +/etc+ (управляемые системным
|
||||||
администратором) имеют приоритет над файлами из +/lib+ (которые
|
администратором) имеют приоритет над файлами из +/lib+ (которые
|
||||||
управляются пакетным менеджером). Таким образом, созание
|
управляются пакетным менеджером). Таким образом, создание
|
||||||
символьной ссылки (или обычного файла)
|
символьной ссылки (или обычного файла)
|
||||||
+/etc/systemd/system/ntpd.service+ предотвращает чтение
|
+/etc/systemd/system/ntpd.service+ предотвращает чтение
|
||||||
штатного файла конфигурации +/lib/systemd/system/ntpd.service+.
|
штатного файла конфигурации +/lib/systemd/system/ntpd.service+.
|
||||||
@@ -1090,7 +1091,7 @@ systemd и на этот случай есть простое решение, и
|
|||||||
(через механизмы sudo или PolicyKit) право на использование
|
(через механизмы sudo или PolicyKit) право на использование
|
||||||
+systemctl+, это еще не~означает, что он сможет запустить
|
+systemctl+, это еще не~означает, что он сможет запустить
|
||||||
заблокированную службу~--- права на выполнение +rm+ (удаление
|
заблокированную службу~--- права на выполнение +rm+ (удаление
|
||||||
блокирующей символьной ссылки) выдаются отдельно}.
|
блокирующей символьной ссылки) выдаются отдельно.}.
|
||||||
\end{itemize}
|
\end{itemize}
|
||||||
|
|
||||||
После прочтения изложенного выше, у читателя может возникнуть вопрос: как
|
После прочтения изложенного выше, у читателя может возникнуть вопрос: как
|
||||||
@@ -1165,10 +1166,10 @@ chroot в самой программе. Прежде всего, коррект
|
|||||||
chroot-окружения требует глубокого понимания принципов работы программы.
|
chroot-окружения требует глубокого понимания принципов работы программы.
|
||||||
Например, нужно точно знать, какие сокеты использует программа, чтобы обеспечить
|
Например, нужно точно знать, какие сокеты использует программа, чтобы обеспечить
|
||||||
bind-монтирование соответствующих каталогов. С учетом вышесказанного,
|
bind-монтирование соответствующих каталогов. С учетом вышесказанного,
|
||||||
эффективный chroot-защита обеспечивается в том случае, когда она реализована в
|
эффективная chroot-защита обеспечивается в том случае, когда она реализована в
|
||||||
коде самого демона. Именно разработчик лучше других знает (\emph{обязан знать}),
|
коде самого демона. Именно разработчик лучше других знает (\emph{обязан} знать),
|
||||||
как правильно сконфигурировать chroot-окружение, и какой минимальный набор
|
как правильно сконфигурировать chroot-окружение, и какой минимальный набор
|
||||||
файлов, каталогов и файловых систем необходим внутри для нормальной работы
|
файлов, каталогов и файловых систем необходим внутри него для нормальной работы
|
||||||
демона. Уже сейчас существуют демоны, имеющие встроенную поддержку chroot.
|
демона. Уже сейчас существуют демоны, имеющие встроенную поддержку chroot.
|
||||||
К сожалению, в системе Fedora, установленной с параметрами по умолчанию, таких
|
К сожалению, в системе Fedora, установленной с параметрами по умолчанию, таких
|
||||||
демонов всего два: \href{http://avahi.org/}{Avahi} и RealtimeKit. Оба они
|
демонов всего два: \href{http://avahi.org/}{Avahi} и RealtimeKit. Оба они
|
||||||
@@ -1212,7 +1213,7 @@ RootDirectoryStartOnly=yes
|
|||||||
командой +systemctl start foobar.service+. Информацию о его текущем состоянии
|
командой +systemctl start foobar.service+. Информацию о его текущем состоянии
|
||||||
можно получить с помощью команды +systemctl status foobar.service+. Команды
|
можно получить с помощью команды +systemctl status foobar.service+. Команды
|
||||||
управления и мониторинга службы не~зависят от того, запущена ли она в chroot'е,
|
управления и мониторинга службы не~зависят от того, запущена ли она в chroot'е,
|
||||||
или нет. Этим systemd отличается от класического SysV init.
|
или нет. Этим systemd отличается от классического SysV init.
|
||||||
|
|
||||||
Новые ядра Linux поддерживают возможность создания независимых пространств имен
|
Новые ядра Linux поддерживают возможность создания независимых пространств имен
|
||||||
файловых систем (в дальнейшем FSNS, от <<file system namespaces>>). По
|
файловых систем (в дальнейшем FSNS, от <<file system namespaces>>). По
|
||||||
@@ -1240,7 +1241,7 @@ InaccessibleDirectories=/home
|
|||||||
защитить данные пользователей от потенциальных хакеров. (Подробнее об этих
|
защитить данные пользователей от потенциальных хакеров. (Подробнее об этих
|
||||||
опциях можно почитать на
|
опциях можно почитать на
|
||||||
\href{http://0pointer.de/public/systemd-man/systemd.exec.html}{странице
|
\href{http://0pointer.de/public/systemd-man/systemd.exec.html}{странице
|
||||||
руководства}).
|
руководства}.)
|
||||||
|
|
||||||
Фактически, FSNS по множеству параметров превосходят +chroot()+. Скорее всего,
|
Фактически, FSNS по множеству параметров превосходят +chroot()+. Скорее всего,
|
||||||
Avahi и ReltimeKit в ближайшем будущем перейдут с +chroot()+ к использованию
|
Avahi и ReltimeKit в ближайшем будущем перейдут с +chroot()+ к использованию
|
||||||
@@ -1287,7 +1288,7 @@ systemd имеет целый ряд возможностей, полезных
|
|||||||
debootstrap/febootstrap. В этом случае возможности +systemctl+ ограничиваются
|
debootstrap/febootstrap. В этом случае возможности +systemctl+ ограничиваются
|
||||||
операциями с символьными ссылками, определяющими триггеры активации юнитов, т.е.
|
операциями с символьными ссылками, определяющими триггеры активации юнитов, т.е.
|
||||||
выполнением действий +enable+ и +disable+, не~требующих непосредственного
|
выполнением действий +enable+ и +disable+, не~требующих непосредственного
|
||||||
взаимодействия с процессом init}.
|
взаимодействия с процессом init.}.
|
||||||
|
|
||||||
Однако, куда более интересные возможности предоставляет программа
|
Однако, куда более интересные возможности предоставляет программа
|
||||||
\href{http://0pointer.de/public/systemd-man/systemd-nspawn.html}{systemd-nspawn},
|
\href{http://0pointer.de/public/systemd-man/systemd-nspawn.html}{systemd-nspawn},
|
||||||
@@ -1305,7 +1306,7 @@ Linux, которая позиционируется как современна
|
|||||||
настроек и т.п., в то время как +systemd-nspawn+ является лишь более удобной и
|
настроек и т.п., в то время как +systemd-nspawn+ является лишь более удобной и
|
||||||
эффективной заменой команды +chroot(1)+, предназначенной прежде всего для
|
эффективной заменой команды +chroot(1)+, предназначенной прежде всего для
|
||||||
развертывания, восстановления, сборки и тестирования операционных систем. Далее
|
развертывания, восстановления, сборки и тестирования операционных систем. Далее
|
||||||
автор разъясняет свою точку зрения на этот вопрос}.
|
автор разъясняет свою точку зрения на этот вопрос.}.
|
||||||
+systemd-nspawn+ проста в использовании как +chroot(1)+, однако изоляция
|
+systemd-nspawn+ проста в использовании как +chroot(1)+, однако изоляция
|
||||||
от хост-системы является более полной и безопасной. Всего одной командой
|
от хост-системы является более полной и безопасной. Всего одной командой
|
||||||
вы можете загрузить внутри контейнера \emph{полноценную} ОС (на базе systemd
|
вы можете загрузить внутри контейнера \emph{полноценную} ОС (на базе systemd
|
||||||
@@ -1378,7 +1379,7 @@ systemd уже подготовлен для работы внутри таки
|
|||||||
наилучший результат, когда оно реализовано непосредственно в
|
наилучший результат, когда оно реализовано непосредственно в
|
||||||
коде самой программы.
|
коде самой программы.
|
||||||
\item +ReadOnlyDirectories=+ и +InaccessibleDirectories=+ могут быть
|
\item +ReadOnlyDirectories=+ и +InaccessibleDirectories=+ могут быть
|
||||||
удобной альтернативой созданию полноценных chroot-окружений.
|
удобной альтернативой созданию полновесных chroot-окружений.
|
||||||
\item Если вам нужно поместить в chroot-окружение какую-либо службу,
|
\item Если вам нужно поместить в chroot-окружение какую-либо службу,
|
||||||
воспользуйтесь опцией +RootDirectory=+.
|
воспользуйтесь опцией +RootDirectory=+.
|
||||||
\item +systemd-nspawn+~--- очень неплохая штука.
|
\item +systemd-nspawn+~--- очень неплохая штука.
|
||||||
@@ -1390,7 +1391,7 @@ systemd уже подготовлен для работы внутри таки
|
|||||||
|
|
||||||
\section{Поиск виновных}
|
\section{Поиск виновных}
|
||||||
|
|
||||||
Fedora~15\footnote{Также известный как величайший в истории релиз свободной ОС}
|
Fedora~15\footnote{Величайший в истории релиз свободной ОС}
|
||||||
является первым релизом Fedora, использующим systemd в качестве системы
|
является первым релизом Fedora, использующим systemd в качестве системы
|
||||||
инициализации по умолчанию. Основной нашей целью при работе над выпуском F15
|
инициализации по умолчанию. Основной нашей целью при работе над выпуском F15
|
||||||
является обеспечение полной взаимной интеграции и корректной работы всех
|
является обеспечение полной взаимной интеграции и корректной работы всех
|
||||||
@@ -1399,8 +1400,7 @@ Fedora~15\footnote{Также известный как величайший в
|
|||||||
инструментов (доступных уже в F15), которые должны помочь нам в поиске проблем,
|
инструментов (доступных уже в F15), которые должны помочь нам в поиске проблем,
|
||||||
связанных с процессом загрузки. В этой статье я попытаюсь рассказать о том, как
|
связанных с процессом загрузки. В этой статье я попытаюсь рассказать о том, как
|
||||||
найти виновников медленной загрузки вашей системы, и о том, что с ними делать
|
найти виновников медленной загрузки вашей системы, и о том, что с ними делать
|
||||||
дальше. Мы хотим помочь вам в поиске тех системных компонентов, которые являются
|
дальше.
|
||||||
причинами ваших проблем.
|
|
||||||
|
|
||||||
Первый инструмент, который мы можем вам предложить, очень прост: по завершении
|
Первый инструмент, который мы можем вам предложить, очень прост: по завершении
|
||||||
загрузки, systemd регистрирует в системном журнале информацию о суммарном
|
загрузки, systemd регистрирует в системном журнале информацию о суммарном
|
||||||
@@ -1413,17 +1413,17 @@ systemd[1]: Startup finished in 2s 65ms 924us (kernel) + 2s 828ms 195us (initrd)
|
|||||||
Эта запись означает следующее: на инициализацию ядра (до момента запуска initrd,
|
Эта запись означает следующее: на инициализацию ядра (до момента запуска initrd,
|
||||||
т.е. dracut) ушло 2 секунды. Далее, чуть менее трех секунд работал initrd. И
|
т.е. dracut) ушло 2 секунды. Далее, чуть менее трех секунд работал initrd. И
|
||||||
наконец, почти 12 секунд было потрачено systemd на запуск программ из
|
наконец, почти 12 секунд было потрачено systemd на запуск программ из
|
||||||
пространства пользователя. Итоговое время, начиная с того момента, как
|
пространства пользователя. Итоговое время, начиная с того момента, как загрузчик
|
||||||
загрузчик передал управление коду ядра, до того момента, как systemd завершил
|
передал управление коду ядра, до того момента, как systemd завершил все
|
||||||
все операции, связанные с загрузкой системы, составило почти 17 секунд.
|
операции, связанные с загрузкой системы, составило почти 17 секунд. Казалось
|
||||||
Казалось бы, смысл этого числа вполне очевиден, однако не~стоит делать поспешных
|
бы, смысл этого числа вполне очевиден\ldots{} Однако не~стоит делать поспешных
|
||||||
выводов. Прежде всего, в нем не~учитывается время, затраченное на инициализацию
|
выводов. Прежде всего, сюда не~входит время, затраченное на
|
||||||
вашего сеанса в GNOME, так как эта задача уже выходит за рамки задач процесса
|
инициализацию вашего сеанса в GNOME, так как эта задача уже выходит за рамки
|
||||||
init. Кроме того, в этом периоде времени учитывается только работа systemd, хотя
|
задач процесса init. Кроме того, в этом показателе учитывается только время
|
||||||
часто бывает так, что некоторые демоны продолжают \emph{свою} работу по
|
работы systemd, хотя часто бывает так, что некоторые демоны продолжают
|
||||||
инициализации уже после того, как секундомер остановлен. Проще говоря:
|
\emph{свою} работу по инициализации уже после того, как секундомер остановлен.
|
||||||
предложенные вам числа позволяют лишь оценить общую скорость загрузки, однако
|
Проще говоря: приведенные числа позволяют лишь оценить общую скорость
|
||||||
они не~являются точной характеристикой длительности процесса.
|
загрузки, однако они не~являются точной характеристикой длительности процесса.
|
||||||
|
|
||||||
Кроме того, эта информация носит поверхностный характер: она не~сообщает, какие
|
Кроме того, эта информация носит поверхностный характер: она не~сообщает, какие
|
||||||
именно системные компоненты заставляют systemd ждать так долго. Чтобы исправить
|
именно системные компоненты заставляют systemd ждать так долго. Чтобы исправить
|
||||||
@@ -1480,16 +1480,335 @@ $ systemd-analyze blame
|
|||||||
отсутствует SIM-карта. Этот модем очень долго отвечает на запросы udev. Опрос
|
отсутствует SIM-карта. Этот модем очень долго отвечает на запросы udev. Опрос
|
||||||
устройств является частью схемы, обеспечивающей работу ModemManager'а и
|
устройств является частью схемы, обеспечивающей работу ModemManager'а и
|
||||||
позволяющей NetworkManager'у упростить для вас настройку 3G. Казалось бы,
|
позволяющей NetworkManager'у упростить для вас настройку 3G. Казалось бы,
|
||||||
очевидно, что виновником задержек является именно ModemManager, так как опрос
|
очевидно, что виновником задержки является именно ModemManager, так как опрос
|
||||||
устройств для него занимает слишком много времени. Но такое обвинение будет
|
устройств для него занимает слишком много времени. Но такое обвинение будет
|
||||||
заведомо ошибочным. Дело в том, что опрос устройств вообще является довольно
|
заведомо ошибочным. Дело в том, что опрос устройств очень часто оказывается довольно
|
||||||
длительной процедурой. Медленный опрос 3G-устройств для ModemManager является
|
длительной процедурой. Медленный опрос 3G-устройств для ModemManager является
|
||||||
частным случаем, отражающим это общее правило. Хорошая система опроса устройств
|
частным случаем, отражающим это общее правило. Хорошая система опроса устройств
|
||||||
обязательно должна учитывать тот факт, что операция опроса любого из устройств
|
обязательно должна учитывать тот факт, что операция опроса любого из устройств
|
||||||
может затянуться надолго. Истинной причиной наших проблем является тот факт,
|
может затянуться надолго. Истинной причиной наших проблем является необходимость
|
||||||
что мы должны ожидать завершения опроса устройств, т.е., наличие
|
ожидать завершения опроса устройств, т.е., наличие службы
|
||||||
+udev-settle.service+ как обязательной части нашего процесса загрузки.
|
+udev-settle.service+ как обязательной части нашего процесса загрузки.
|
||||||
|
|
||||||
|
Но почему эта служба вообще присутствует в нашем процессе загрузки? На самом
|
||||||
|
деле, мы можем прекрасно обойтись и без нее. Она нужна лишь как часть
|
||||||
|
используемой в Fedora схемы инициализации устройств хранения, а именно,
|
||||||
|
набора скриптов, выполняющих настройку LVM, RAID и multipath-устройств. На
|
||||||
|
сегодняшний день, реализация этих систем не~поддерживает собственного механизма
|
||||||
|
поиска и опроса устройств, и поэтому их запуск должен производиться только после
|
||||||
|
того, как эта работа уже проделана~--- тогда они могут просто последовательно
|
||||||
|
перебирать все диски. Однако, такой подход противоречит одному из
|
||||||
|
фундаментальных требований к современным компьютерам:
|
||||||
|
возможности подключать и отключать оборудование в любой момент, как при
|
||||||
|
выключенном компьютере, так и при включенном. Для некоторых
|
||||||
|
технологий невозможно точно определить момент завершения формирования списка устройств
|
||||||
|
(например, это характерно для USB и iSCSI), и поэтому процесс опроса
|
||||||
|
таких устройств обязательно должен включать некоторую фиксированную задержку,
|
||||||
|
гарантирующую, что все подключенные устройства успеют отозваться. С точки зрения
|
||||||
|
скорости загрузки это, безусловно, негативный эффект: соответствующие скрипты
|
||||||
|
заставляют нас ожидать завершения опроса устройств, хотя большинство этих
|
||||||
|
устройств не~являются необходимыми на данной стадии загрузки. В частности, в
|
||||||
|
рассматриваемой нами системе LVM, RAID и multipath вообще
|
||||||
|
не~используются!\footnote{Наиболее правильным решением в данном случае будет
|
||||||
|
ожидание событий подключения устройств (реализованное через libudev или
|
||||||
|
аналогичную технологию) с соответствующей обработкой каждого такого события~---
|
||||||
|
подобный подход позволит нам продолжить загрузку, как только будут готовы все
|
||||||
|
устройства, необходимые для ее продолжения. Для того, чтобы загрузка была
|
||||||
|
быстрой, мы должны ожидать завершения инициализации только тех устройств, которые
|
||||||
|
\emph{действительно} необходимы для ее продолжения на данной стадии. Ожидать
|
||||||
|
остальные устройства в данном случае смысла нет. Кроме того, стоит отметить, что
|
||||||
|
в числе программ, не~приспособленных для работы с динамически меняющимся
|
||||||
|
оборудованием и построенных в предположении о неизменности списка устройств,
|
||||||
|
кроме служб хранения, есть и другие подсистемы. Например, в нашем случае работа
|
||||||
|
initrd занимает так много времени главным образом из-за того, что для запуска
|
||||||
|
Plymouth необходимо дождаться завершения инициализации всех устройств
|
||||||
|
видеовывода. По неизвестной причине (во всяком случае, неизвестной для меня)
|
||||||
|
подгрузка модулей для моих видеокарт Intel занимает довольно продолжительное
|
||||||
|
время, что приводит к беспричинной задержке процесса загрузки. (Нет, я протестую
|
||||||
|
не~против опроса устройств, но против необходимости ожидать его завершения, чтобы
|
||||||
|
продолжить загрузку.)}
|
||||||
|
|
||||||
|
С учетом вышесказанного, мы можем спокойно исключить +udev-settle.service+ из
|
||||||
|
нашего процесса загрузки, так как мы не~используем ни~LVM, ни~RAID,
|
||||||
|
ни~multipath. Замаскируем эти службы, чтобы увеличить скорость загрузки:
|
||||||
|
\begin{Verbatim}
|
||||||
|
# ln -s /dev/null /etc/systemd/system/udev-settle.service
|
||||||
|
# ln -s /dev/null /etc/systemd/system/fedora-wait-storage.service
|
||||||
|
# ln -s /dev/null /etc/systemd/system/fedora-storage-init.service
|
||||||
|
# systemctl daemon-reload
|
||||||
|
\end{Verbatim}
|
||||||
|
|
||||||
|
После перезагрузки мы видим, что загрузка стала на одну секунду быстрее. Но
|
||||||
|
почему выигрыш оказался таким маленьким? Из-за второго осквернителя нашей
|
||||||
|
загрузки~--- cryptsetup. На рассматриваемой нами системе зашифрован раздел
|
||||||
|
+/home+. Специально для тестирования я записал пароль в файл, чтобы исключить
|
||||||
|
влияние скорости ручного набора пароля. К сожалению, для подключения
|
||||||
|
шифрованного раздела cryptsetup требует более пяти секунд. Будем ленивы, и
|
||||||
|
вместо того, чтобы исправлять ошибку в cryptsetup\footnote{На самом деле, я
|
||||||
|
действительно пытался исправить эту ошибку. Задержки в cryptsetup, по
|
||||||
|
моим наблюдениям, обусловлены, главным образом, слишком большим значением по
|
||||||
|
умолчанию для опции +--iter-time+. Я попытался доказать сопровождающим пакета
|
||||||
|
cryptsetup, что снижение этого времени с 1 секунды до 100~миллисекунд
|
||||||
|
не~приведет к трагическим последствиям для безопасности, однако они мне
|
||||||
|
не~поверили.}, попробуем найти обходной путь\footnote{Вообще-то я предпочитаю
|
||||||
|
решать проблемы, а не~искать пути для их обхода, однако в данном конкретном
|
||||||
|
случае возникает отличная возможность продемонстрировать одну интересную
|
||||||
|
возможность systemd\ldots{}}. Во время загрузки systemd должен дождаться, пока
|
||||||
|
все файловые системы, перечисленные в +/etc/fstab+ (кроме помеченных как
|
||||||
|
+noauto+) будут обнаружены, проверены и смонтированы. Только после этого systemd
|
||||||
|
может продолжить загрузку и приступить к запуску служб. Но первое обращение
|
||||||
|
к +/home+ (в отличие, например, от +/var+), происходит на поздней стадии
|
||||||
|
процесса загрузки (когда пользователь входит в систему). Следовательно, нам
|
||||||
|
нужно сделать так, чтобы этот каталога автоматически монтировался при загрузке,
|
||||||
|
но процесс загрузки не~ожидал завершения работы +cryptsetup+, +fsck+ и +mount+
|
||||||
|
для этого раздела. Как же сделать точку монтирования доступной, не~ожидая, пока
|
||||||
|
завершится процесс монтирования? Это можно сделать, воспользовавшись магической
|
||||||
|
силой systemd~--- просто добавим опцию монтирования +comment=systemd.automount+
|
||||||
|
в +/etc/fstab+. После этого, systemd будет создавать в +/home+ точку
|
||||||
|
автоматического монтирования, и при первом же обращении к этому каталогу,
|
||||||
|
если файловая система еще не~будет готова к работе,
|
||||||
|
systemd подготовит соответствующее устройство, проверит и смонтирует ее.
|
||||||
|
|
||||||
|
После внесения изменений в +/etc/fstab+ и перезагрузки мы получаем:
|
||||||
|
\begin{Verbatim}
|
||||||
|
systemd[1]: Startup finished in 2s 47ms 112us (kernel) + 2s 663ms 942us (initrd)
|
||||||
|
+ 5s 540ms 522us (userspace) = 10s 251ms 576us.
|
||||||
|
\end{Verbatim}
|
||||||
|
|
||||||
|
Прекрасно! Несколькими простыми действиями мы выиграли почти семь секунд. И эти
|
||||||
|
два изменения исправляют только две наиболее очевидные проблемы. При более
|
||||||
|
аккуратном и детальном исследовании, обнаружится еще множество моментов, которые
|
||||||
|
можно улучшить. Например, на другом моем компьютере, лаптопе X300 двухлетней
|
||||||
|
давности (и даже два года назад он был не~самым быстрым на Земле), после
|
||||||
|
небольшой доработки, время загрузки до полноценной среды GNOME
|
||||||
|
составило около четырех секунд, и это еще не~предел совершенства.
|
||||||
|
|
||||||
|
+systemd-analyze blame+~--- простой и удобный инструмент для поиска медленно
|
||||||
|
запускающихся служб, однако он обладает одним существенным недостатком: он
|
||||||
|
не~показывает, насколько эффективно параллельный запуск снижает потерю времени
|
||||||
|
для медленно запускающихся служб. Чтобы вы могли наглядно оценить этот фактор,
|
||||||
|
мы подготовили команду +systemd-analyze plot+. Использовать ее очень просто:
|
||||||
|
\begin{Verbatim}
|
||||||
|
$ systemd-analyze plot > plot.svg
|
||||||
|
$ eog plot.svg
|
||||||
|
\end{Verbatim}
|
||||||
|
|
||||||
|
Она создает наглядные диаграммы, показывающие моменты запуска служб и время,
|
||||||
|
затраченное на их запуск, по отношению к другим службам. На текущий момент, она
|
||||||
|
не~показывает явно, кто кого ожидает, но догадаться обычно несложно.
|
||||||
|
|
||||||
|
Чтобы продемонстрировать эффект, порожденный двумя нашими оптимизациями,
|
||||||
|
приведем ссылки на соответствующие графики:
|
||||||
|
\href{http://0pointer.de/public/blame.svg}{до} и
|
||||||
|
\href{http://0pointer.de/public/blame2.svg}{после} (для полноты описания приведем также и
|
||||||
|
соответствующие данные +systemd-analyze blame+:
|
||||||
|
\href{http://0pointer.de/public/blame.txt}{до} и
|
||||||
|
\href{http://0pointer.de/public/blame2.txt}{после}).
|
||||||
|
|
||||||
|
У наиболее эрудированных читателей может возникнуть вопрос: как это соотносится с
|
||||||
|
программой \href{https://github.com/mmeeks/bootchart}{bootchart}? Действительно,
|
||||||
|
+systemd-analyze plot+ и +bootchart+ рисуют похожие графики. Однако, bootchart
|
||||||
|
является намного более мощным инструментом~--- он детально показывает, что
|
||||||
|
именно происходило во время загрузки, и отображает соответствующие графики
|
||||||
|
использования процессора и ввода-вывода. +systemd-analyze plot+ оперирует более
|
||||||
|
высокоуровневой информацией: сколько времени затратила та или иная служба во
|
||||||
|
время запуска, и какие службы были вынуждены ее ожидать. Используя оба эти
|
||||||
|
инструмента, вы значительно упростите себе поиск причин замедления вашей
|
||||||
|
загрузки.
|
||||||
|
|
||||||
|
Но прежде, чем вы вооружитесь описанными здесь средствами и начнете
|
||||||
|
отправлять багрепорты авторам и сопровождающим программ, которые замедляют вашу
|
||||||
|
загрузку, обдумайте все еще раз. Эти инструменты предоставляют вам <<сырую>>
|
||||||
|
информацию. Постарайтесь не~ошибиться, интерпретируя ее. Например, в
|
||||||
|
при рассмотрении приведенного выше примера я показал, что проблема была вовсе
|
||||||
|
не~в +udev-settle.service+, и не~в опросе устройств для ModemManager'а, а в
|
||||||
|
неудачной реализации подсистемы хранения, требующей ожидать окончания опроса
|
||||||
|
устройств для продолжения загрузки. Именно эту проблему и нужно исправлять.
|
||||||
|
Поэтому постарайтесь правильно определить источник проблем. Возлагайте вину на
|
||||||
|
тех, кто действительно виноват.
|
||||||
|
|
||||||
|
Как уже говорилось выше, все три описанных здесь инструмента доступны в
|
||||||
|
Fedora~15 <<из коробки>>.
|
||||||
|
|
||||||
|
Итак, какие же выводы мы можем сделать из этой истории?
|
||||||
|
\begin{itemize}
|
||||||
|
\item +systemd-analyze+~--- отличный инструмент. Фактически, это
|
||||||
|
встроенный профилировщик systemd.
|
||||||
|
\item Постарайтесь не~ошибиться, интерпретируя вывод профилировщика!
|
||||||
|
\item Всего два небольших изменения могут ускорить загрузку системы на
|
||||||
|
семь секунд.
|
||||||
|
\item Программное обеспечение, не~способное работать с динамически
|
||||||
|
меняющимся набором устройств, создает проблемы, и должно быть
|
||||||
|
исправлено.
|
||||||
|
\item Принудительное использование в стандартной установке Fedora~15
|
||||||
|
промышленной реализации подсистем хранения, возможно, является
|
||||||
|
не~самым правильным решением.
|
||||||
|
\end{itemize}
|
||||||
|
|
||||||
|
\section{Новые конфигурационные файлы}
|
||||||
|
|
||||||
|
Одно из наиболее масштабных нововведений
|
||||||
|
\href{http://www.freedesktop.org/wiki/Software/systemd}{systemd}~--- наличие
|
||||||
|
полного набора программ, необходимых на ранних стадиях загрузки, причем эти
|
||||||
|
программы написаны на простом, быстром, надежном и легко поддающемся
|
||||||
|
распараллеливанию языке C. Теперь можно отказаться от <<простыней>>
|
||||||
|
shell-скриптов, разработанных для этих задач различными дистрибутивами. Наш
|
||||||
|
<<Проект нулевой оболочки>>\footnote{Наш девиз~--- <<Первой оболочкой,
|
||||||
|
запускающейся при старте системы, должна быть GNOME shell>>. Формулировка
|
||||||
|
оставляет желать лучшего, но все же неплохо передает основную идею.} увенчался
|
||||||
|
полным успехом. Уже сейчас возможности предоставляемого нами инструментария
|
||||||
|
покрывают практически все нужды настольных и встраиваемых систем, а также
|
||||||
|
большую часть потребностей серверных систем:
|
||||||
|
\begin{itemize}
|
||||||
|
\item Проверка и монтирование всех файловых систем.
|
||||||
|
\item Обновление и активация квот на всех файловых системах.
|
||||||
|
\item Установка имени хоста.
|
||||||
|
\item Конфигурирование интерфейса обратной петли (+lo+).
|
||||||
|
\item Подгрузка правил SELinux, обновление
|
||||||
|
меток безопасности в динамических каталогах +/run+ и +/dev+.
|
||||||
|
\item Регистрация в ядре дополнительных бинарных форматов (например,
|
||||||
|
Java, Mono, WINE) через API-файловую систему +binfmt_misc+.
|
||||||
|
\item Установка системной локали.
|
||||||
|
\item Настройка шрифта и раскладки клавиатуры в консоли.
|
||||||
|
\item Создание, очистка, удаление временных файлов и каталогов.
|
||||||
|
\item Применение предписанных в +/etc/fstab+ опций к смонтированным
|
||||||
|
ранее API-файловым системам.
|
||||||
|
\item Применение настроек +sysctl+.
|
||||||
|
\item Поддержка технологии упреждающего чтения (read ahead), включая
|
||||||
|
автоматический сбор информации.
|
||||||
|
\item Обновление записей в +utmp+ при включении и выключении системы.
|
||||||
|
\item Сохранение и восстановление затравки для генерации случайных чисел
|
||||||
|
(random seed).
|
||||||
|
\item Принудительная загрузка указанных модулей ядра.
|
||||||
|
\item Поддержка шифрованных дисков и разделов.
|
||||||
|
\item Автоматический запуск +getty+ на serial-консолях.
|
||||||
|
\item Взаимодействие с Plymouth.
|
||||||
|
\item Создание уникального идентификатора системы.
|
||||||
|
\item Установка часового пояса.
|
||||||
|
\end{itemize}
|
||||||
|
|
||||||
|
В стандартной установке Fedora~15 запуск shell-скриптов требуется только для
|
||||||
|
некоторых устаревших служб, а также для подсистемы хранения данных (поддержка
|
||||||
|
LVM, RAID и multipath). Если они вам не~нужны, вы легко можете отключить их, и
|
||||||
|
наслаждаться загрузкой, полностью очищенной от shell-костылей (я это сделал уже
|
||||||
|
давно). Такая загрузка является уникальной возможностью Linux-систем.
|
||||||
|
|
||||||
|
Большинство перечисленных выше компонентов настраиваются через конфигурационные
|
||||||
|
файлы в каталоге +/etc+. Некоторые из этих файлов стандартизированы для всех
|
||||||
|
дистрибутивов, и поэтому реализация их поддержки в наших инструментах
|
||||||
|
не~представляла особого труда. Например, это относится к файлам +/etc/fstab+,
|
||||||
|
+/etc/crypttab+, +/etc/sysctl.conf+. Однако множество других, нестандартно
|
||||||
|
расположенных файлов и каталогов вынуждали нас добавлять множество операторов
|
||||||
|
+#ifdef+, чтобы обеспечить поддержку различных вариантов расположения
|
||||||
|
конфигураций в разных дистрибутивах. Такой положение дел сильно усложняет
|
||||||
|
жизнь нам всем, и при этом ничем не~оправдано~--- все эти файлы решают одни и те
|
||||||
|
же задачи, но делают это немного по-разному.
|
||||||
|
|
||||||
|
Чтобы улучшить ситуацию и установить единый стандарт расположения базовых
|
||||||
|
конфигурационных файлов во всех дистрибутивах, мы заставили systemd пользоваться
|
||||||
|
дистрибутивно-специфическими конфигурациями только в качестве \emph{резервного}
|
||||||
|
варианта~--- основным источником информации становится определенный нами
|
||||||
|
стандартный набор конфигурационных файлов. Разумеется, там, где это возможно, мы
|
||||||
|
старались не~придумывать чего-то принципиально нового, а брали лучшее из
|
||||||
|
решений, предложенных существующими дистрибутивами. Ниже приводится небольшой
|
||||||
|
обзор этого нового набора конфигурационных файлов, поддерживаемых systemd во
|
||||||
|
всех дистрибутивах:
|
||||||
|
\begin{itemize}
|
||||||
|
\item
|
||||||
|
\hreftt{http://0pointer.de/public/systemd-man/hostname.html}{/etc/hostname}:
|
||||||
|
имя хоста для данной системы. Одна из наиболее простых и важных
|
||||||
|
системных настроек. В разных дистрибутивах оно настраивалось
|
||||||
|
по-разному: Fedora использовала +/etc/sysconfig/network+,
|
||||||
|
OpenSUSE~--- +/etc/HOSTNAME+, Debian~--- +/etc/hostname+. Мы
|
||||||
|
остановились на варианте, предложенном Debian.
|
||||||
|
\item
|
||||||
|
\hreftt{http://0pointer.de/public/systemd-man/vconsole.conf.html}{/etc/vconsole.conf}:
|
||||||
|
конфигурация раскладки клавиатуры и шрифта для консоли.
|
||||||
|
\item
|
||||||
|
\hreftt{http://0pointer.de/public/systemd-man/locale.conf.html}{/etc/locale.conf}:
|
||||||
|
конфигурация общесистемной локали.
|
||||||
|
\item
|
||||||
|
\hreftt{http://0pointer.de/public/systemd-man/modules-load.d.html}{/etc/modules-load.d/*.conf}:
|
||||||
|
каталог\footnote{Прим. перев.: для описания этого и трех
|
||||||
|
последующих каталогов автор пользуется термином <<drop-in
|
||||||
|
directory>>. Этот термин означает каталог, в который можно
|
||||||
|
поместить множество независимых файлов настроек, и при чтении
|
||||||
|
конфигурации все эти файлы будут обработаны (впрочем, часто
|
||||||
|
накладывается ограничение~--- обрабатываются только файлы с
|
||||||
|
именами, соответствующими маске, обычно +*.conf+). Такой подход
|
||||||
|
позволяет значительно упростить процесс как ручного, так и
|
||||||
|
автоматического конфигурирования различных компонентов~--- для
|
||||||
|
внесения изменений в настройки уже не~нужно редактировать
|
||||||
|
основной конфигурационный файл, достаточно лишь
|
||||||
|
скопировать/переместить в нужный каталог небольшой файл с
|
||||||
|
указанием специфичных параметров.} для перечисления модулей
|
||||||
|
ядра, которые нужно принудительно подгрузить при загрузке
|
||||||
|
(впрочем, необходимость в этом возникает достаточно редко).
|
||||||
|
\item
|
||||||
|
\hreftt{http://0pointer.de/public/systemd-man/sysctl.d.html}{/etc/sysctl.d/*.conf}:
|
||||||
|
каталог для задания параметров ядра (+sysctl+). Дополняет
|
||||||
|
классический конфигурационный файл +/etc/sysctl.conf+.
|
||||||
|
\item
|
||||||
|
\hreftt{http://0pointer.de/public/systemd-man/tmpfiles.d.html}{/etc/tmpfiles.d/*.conf}:
|
||||||
|
каталог для управления настройками временных файлов (systemd
|
||||||
|
обеспечивает создание, очистку и удаление временных файлов и
|
||||||
|
каталогов, как во время загрузки, так и во время работы
|
||||||
|
системы).
|
||||||
|
\item
|
||||||
|
\hreftt{http://0pointer.de/public/systemd-man/binfmt.d.html}{/etc/binfmt.d/*.conf}:
|
||||||
|
каталог для регистрации дополнительных бинарных форматов
|
||||||
|
(например, форматов Java, Mono, WINE).
|
||||||
|
\item
|
||||||
|
\hreftt{http://0pointer.de/public/systemd-man/os-release.html}{/etc/os-release}:
|
||||||
|
стандарт для файла, обеспечивающего идентификацию дистрибутива и
|
||||||
|
его версии. Сейчас различные дистрибутивы используют для этого
|
||||||
|
разные файлы (например, +/etc/fedora-release+ в Fedora), и
|
||||||
|
поэтому для решения такой простой задачи, как вывод имени
|
||||||
|
дистрибутива, необходимо использовать базу данных, содержащую
|
||||||
|
перечень возможных названий файлов. Проект LSB попытался создать
|
||||||
|
такой инструмент~---
|
||||||
|
\hreftt{http://refspecs.freestandards.org/LSB_3.1.0/LSB-Core-generic/LSB-Core-generic/lsbrelease.html}{lsb\_release}~---
|
||||||
|
однако реализация такой простой вещи через скрипт на Python'е
|
||||||
|
является не~самым оптимальным решением. Чтобы исправить
|
||||||
|
сложившуюся ситуацию, мы решили перейти к единому простому
|
||||||
|
формату представления этой информации.
|
||||||
|
\item
|
||||||
|
\hreftt{http://0pointer.de/public/systemd-man/machine-id.html}{/etc/machine-id}:
|
||||||
|
файл с идентификатором данного компьютера (перекрывает
|
||||||
|
аналогичный идентификатор D-Bus). Гарантируется, что в любой
|
||||||
|
системе, использующей systemd, этот файл будет существовать и
|
||||||
|
содержать корректную информацию (если его нет, он автоматически
|
||||||
|
создается при загрузке). Мы вынесли этот файл из-под эгиды
|
||||||
|
D-Bus, чтобы упростить решение множества задач, требующих
|
||||||
|
наличия уникального и постоянного идентификатора компьютера.
|
||||||
|
\item
|
||||||
|
\hreftt{http://0pointer.de/public/systemd-man/machine-info.html}{/etc/machine-info}:
|
||||||
|
новый конфигурационный файл, хранящий информации о полном имени
|
||||||
|
(описательном) хоста (например, <<Компьютер Леннарта>>) и
|
||||||
|
значке, которым он будет обозначаться в графических оболочках,
|
||||||
|
работающих с сетью (раньше этот значок мог определяться,
|
||||||
|
например, файлом +/etc/favicon.png+). Данный конфигурационный
|
||||||
|
файл обслуживается демоном
|
||||||
|
\hreftt{http://www.freedesktop.org/wiki/Software/systemd/hostnamed}{systemd-hostnamed}.
|
||||||
|
\end{itemize}
|
||||||
|
|
||||||
|
Одна из важнейших для нас задач~--- убедить \emph{вас} использовать эти новые
|
||||||
|
конфигурационные файлы в ваших инструментах для настройки системы. Если ваши
|
||||||
|
конфигурационные фронтенды будут использовать новые файлы, а не~их старые
|
||||||
|
аналоги, это значительно облегчит портирование таких фронтендов между
|
||||||
|
дистрибутивами, и вы внесете свой вклад в стандартизацию Linux, и в конечном
|
||||||
|
счете упростится жизнь и у администраторов, и для пользователей. Разумеется, на
|
||||||
|
текущий момент эти файлы полностью поддерживаются только дистрибутивами,
|
||||||
|
основанными на systemd, но уже сейчас в их число входят практически все ключевые
|
||||||
|
дистрибутивы, \href{http://www.ubuntu.com/}{за исключением
|
||||||
|
одного}\footnote{Прим. перев.: В конце 2010~года энтузиаст Andrew Edmunds
|
||||||
|
\href{http://cgit.freedesktop.org/systemd/commit/?id=858dae181bb5461201ac1c04732d3ef4c67a0256}{добавил}
|
||||||
|
в systemd базовую поддержку Ubuntu и
|
||||||
|
\href{https://wiki.ubuntu.com/systemd}{подготовил} соответствующие пакеты,
|
||||||
|
однако его инициатива не~встретила поддержки среди менеджеров Canonical. На
|
||||||
|
момент написания этих строк (май 2011 года) проект остается заброшенным уже пять
|
||||||
|
месяцев (с середины декабря 2010~г.).}.
|
||||||
|
|
||||||
\end{document}
|
\end{document}
|
||||||
|
|
||||||
vim:ft=tex:tw=80:spell:spelllang=ru
|
vim:ft=tex:tw=80:spell:spelllang=ru
|
||||||
|
|||||||
Reference in New Issue
Block a user