\section{Подключениё устройств}

\textbf{Как выполнять горячее подключение блочных устройств в Xen.}<br/>
Перевод и редактирование: Игорь Чубин<br/>
Короткая ссылка: http://xgu.ru/wiki/xen/block-attach<br/>
Оригинал: \url{http://lists.xensource.com/archives/html/xen-users/2007-03/msg01024.html}

Здесь рассматривается как выполнять горячее подключение устройств Xen,
и как это может пригодиться при организации резервного копирования
данных из доменов domU.

\subsection{Горячее подключение устройств}
У команды \textit{xm} есть подкоманды \textit{block-attach} и \textit{block-detach}.
В man-странице по \textit{xm} рассказывается детальнее об этих подкомандах (надо заметить, что описание подкоманды \textit{block-detach} там не совсем верное).

Эти команды, в частности, позволяют подключать/отключать (виртуальные) блочные устройства в domU. Делается это из домена dom0.

Например:
\begin{verbatim}
                                                                                                                             
\end{verbatim}
 \begin{verbatim}
                                                                                                                             
\end{verbatim}

Команда \dq{}xm block-list\dq{} показывает список устройств, подключенных к домену.
Мы делаем предположение, что последний пункт в списке это последнее
добавленное устройство.
Это работает, но такое поведение нигде не задокументировано, 
поэтому оно может измениться. 
Нам нужно отслеживать block id устройств, поскольку команда \textit{block-detach} требует знания именно id, а не имени устройства или файла.

\subsection{Резервное копирование данных домена}
После этого создаётся snapshot и подсоединяется к Amanda-серверу.
Backup-сервер с помощью fsck выполняет проверку на вновь подключенном устройстве, монтирует его, выполняет резервное копирование, а потом размонтирует его.

После этого в домене 0 выполняется команда:                                                                                                                              \begin{verbatim}
  block-attach domain-id be-dev fe-dev mode [bedomain-id]
\end{verbatim}

Здесь описано как выполнять подключение устройств из командной строки.
Конечно, это можно делать и скриптами. 
\begin{verbatim}
                                                                                                                             
\end{verbatim}
Аналогичным образом можно выполнять горячее подключение сетевых устройств,
но это отдельная история.

\subsection{Подкоманды xm для работы с блочными устройствами}
\subsubsection{block-attach}
\begin{verbatim}
  block-attach domain-id be-dev fe-dev mode [bedomain-id]
\end{verbatim}

Создать новое виртуальное блочное устройство.
В результате выполняется hotplug-событие для гостевого домена.

\paragraph{Опции}
\begin{itemize}
\item  \textit{domain-id} -- Номер гостевого домена, к которому будет подключаться устройство. 
\item  \textit{be-dev} -- Устройство в backend-домене (обычно домен 0), которое должно экспортироваться. Его можно указать как физический раздел (phy:sda7) или как файл, который должен быть смонтирован через loopback-устройство (file://path/to/loop.iso).
\item  \textit{fe-dev} -- Как устройство должно быть представлено в гостевом домене. Параметр можно указывать или в виде символьного имени (для распространённых устройств), например как /dev/hdc, или с помощью device id, например 0x1400 (код device id для /dev/hdc в шестнадцатеричной системе). 
\item  \textit{mode} -- Режим доступа из гостевого домена. Поддерживаются режимы rw (read/write) и ro (read-only).
\item  \textit{bedomain-id} -- backend-домен, обеспечивающий устройство. По умолчанию домен 0.
\end{itemize}

\paragraph{Примеры}
Монтирование ISO-диска:
\begin{verbatim}
xm block-attach guestdomain file://path/to/dsl-2.0RC2.iso /dev/hdc ro
\end{verbatim}

Команда подключает ISO-файл dsl как /dev/hdc в гостевом домене в режиме read/only. Возможно, гостевая система и не увидит этот файл как сетевой, 
но ручное монтирование точно сработает.

\subsubsection{block-detach}
\begin{verbatim}
 block-detach domain-id devid
\end{verbatim}

Удалить блочное устройство из домена.
В качестве \textit{devid} должно быть указано устроство домена 0.
Номер определяется с помощью команды \textit{xm block-list}.

Сейчас эта команда сломана.
Даже если устройство удалено из домена domU,
оно занято в домене 0.

\subsubsection{block-list}
\begin{verbatim}
 block-list [-l|--long] domain-id
\end{verbatim}

Показать список виртуальных блочных устройств для домена.
Вывод представлен в виде отформатированного списка или как S-выражение (S-Expression), в том случае, если задана опция --long.

\subsection{Дополнительная информация}
\begin{itemize}
\item  xm(1) -- man-страница по \textbf{xm}
\item  Amanda -- система для резервного копирования по сети
\end{itemize}

