diff --git a/s4a.tex b/s4a.tex index 2c29917..8ee5f04 100644 --- a/s4a.tex +++ b/s4a.tex @@ -1117,6 +1117,7 @@ Apache, crond, atd, которые по роду служебной деятел +ln+. \section{Смена корня} +\label{sec:chroots} Практически все администраторы и разработчики рано или поздно встречаются с \href{http://linux.die.net/man/1/chroot}{chroot-окружениями}. Системный вызов @@ -4139,6 +4140,133 @@ ControlGroupAttribute=memory.swappiness 70 и они не~так сильно ухудшают производительность. Возможно, мы рассмотрим их в последующих статьях. +\section{Проверка на виртуальность} + +Еще в начале разработки systemd, мы внимательно изучали существовавшие на тот +момент init-скрипты, выделяя наиболее типичные для них операции. Среди прочих, в +составленный нами список попала и такая функция, как определение виртуализации: +некоторые скрипты проверяли, запускаются они в виртуальном окружении (например, +KVM, VMWare, LXC и т.д.) или на полноценной, физической системе. Часть этих +скриптов отказывалась работать на виртуальных системах (например, службы +управления устройствами совершенно излишни в виртуальных контейнерах, не~имеющих +доступа к устройствам), другие же, наоборот, запускались только в определенных +виртуальных окружениях (например, всевозможные <>, +рекомендуемые к запуску на гостевых системах VMWare и VirtualBox). По-хорошему, +в некоторых ситуациях было бы более правильно проверять некоторые другие +условия, а не~пытаться явно определить наличие виртуализации. Тем не~менее, +всесторонне изучив вопрос, мы пришли к выводу, что во многих случаях +возможность явной проверки такого условия при запуске служб была бы очень +кстати. В результате, мы добавили поддержку соответствующей опции настройки +юнитов~--- +\hreftt{http://www.freedesktop.org/software/systemd/man/systemd.unit.html}{ConditionVirtualization}; +кроме того, мы создали небольшую утилиту, которую можно вызывать из +скриптов~--- +\hreftt{http://www.freedesktop.org/software/systemd/man/systemd-detect-virt.html}{systemd-detect-virt(1)}; +и наконец, мы предоставили простой интерфейс для шины D-Bus, позволяющий +получить информацию о виртуализации даже непривилегированным программам. + +Определить, запущен код на виртуальной системе, или на физической, на самом деле +\href{http://cgit.freedesktop.org/systemd/systemd/tree/src/shared/virt.c#n30}{не~так +уж и сложно}. В зависимости от того, какие именно механизмы виртуализации вы +хотите определить, основная работа сводится к выполнению инструкции CPUID и, +возможно, проверке некоторых файлов в +/sys+ и +/proc+. Основная трудность +здесь~--- точно знать строки, которые нужно искать. Список таких строк +необходимо поддерживать в актуальном состоянии. В настоящий момент, systemd +определяет следующие механизмы виртуализации: +\begin{itemize} + \item Полная виртуализация (т.е. виртуальные машины): + \begin{itemize} + \item qemu + \item kvm + \item vmware + \item microsoft + \item oracle + \item xen + \item bochs + \end{itemize} + \item Виртуализация на уровне ОС (т.е. контейнеры): + \begin{itemize} + \item chroot + \item openvz + \item lxc + \item lxc-libvirt + \item \hyperref[sec:chroots]{systemd-nspawn} + \end{itemize} +\end{itemize} + +Рассмотрим, как можно использовать эту функциональность. + +\subsection{Условия на запуск юнитов} + +При помощи опции +\hreftt{http://www.freedesktop.org/software/systemd/man/systemd.unit.html}{ConditionVirtualization}, +добавленной в секцию +[Unit]+ файла конфигурации юнита, вы можете обеспечить +запуск (или наоборот, отмену запуска) данного юнита в зависимости от того, +работает ли он на виртуальной системе, или нет. В случае утвердительного ответа, +также можно уточнить, какая система виртуализации при этом используется. +Например: +\begin{Verbatim} +[Unit] +Name=My Foobar Service (runs only only on guests) +ConditionVirtualization=yes + +[Service] +ExecStart=/usr/bin/foobard +\end{Verbatim} + +Помимо <<+yes+>> или <<+no+>>, вы также можете указать идентификатор конкретной +системы виртуализации (согласно списку выше, например, <<+kvm+>>, <<+vmware+>> и +т.д.), либо <<+container+>> или <<+vm+>> (что позволит отличить виртуализацию на +уровне ОС от полной виртуализации). Кроме того, вы можете добавить перед +значением восклицательный знак, и результат проверки будет инвертирован (юнит +запустится только в том случае, если указанная технология +\emph{не}~используется). Подробности вы можете узнать на +\href{http://www.freedesktop.org/software/systemd/man/systemd.unit.html}{странице +руководства}. + +\subsection{В скриптах} + +В скриптах оболочки вы можете выполнить аналогичные проверки при помощи утилиты +\hreftt{http://www.freedesktop.org/software/systemd/man/systemd-detect-virt.html}{systemd-detect-virt(1)}. +Например: +\begin{Verbatim} +if systemd-detect-virt -q ; then + echo "Virtualization is used:" `systemd-detect-virt` +else + echo "No virtualization is used." +fi +\end{Verbatim} + +Эта утилита возвращает код 0 (успех), обнаружив виртуализацию, или ненулевое +значение, если виртуализация не~выявлена. Кроме того, она выводит идентификатор +обнаруженной системы виртуализации (согласно списку выше), если это не~было +запрещено опцией +-q+. Кроме того, опции +-c+ и +-v+ позволяют ограничить +проверки только механизмами виртуализации на уровне ОС, либо полной +виртуализации, соответственно. Подробности см. на +\href{http://www.freedesktop.org/software/systemd/man/systemd-detect-virt.html}{странице +руководства}. + +\subsection{В программах} + +Информация о виртуализации также представлена на системной шине: +\begin{Verbatim} +$ gdbus call --system --dest org.freedesktop.systemd1 --object-path /org/freedesktop/systemd1 \ +> --method org.freedesktop.DBus.Properties.Get org.freedesktop.systemd1.Manager Virtualization +(<'systemd-nspawn'>,) +\end{Verbatim} + +Если виртуализация не~выявлена, это свойство содержит пустую строку. Обратите +внимание, что некоторые контейнерные системы не~могут быть обнаружены напрямую +из непривилегированного кода. Именно поэтому мы не~стали создавать библиотеку, а +воспользовались шиной D-Bus, которая позволяет корректно решить проблему +привилегий. + +Стоит отметить, что все эти инструменты определяют только <<самый внутренний>> +из задействованных механизмов виртуализации. Если вы используете несколько +систем, вложенных друг в друга, вышеописанные инструменты обнаружат только ту, в +которой они непосредственно запущены. В частности, если они работают в +контейнере, находящемся внутри виртуальной машины, они увидят только контейнер. + \end{document} vim:ft=tex:tw=80:spell:spelllang=ru