xg-scale
annotate xen/export.tex @ 0:4730a0d07d88
Исходники курса после первого прочтения.
Правки (которых должно быть много),
ещё пока не вносились.
Правки (которых должно быть много),
ещё пока не вносились.
author | Igor Chubin <igor@chub.in> |
---|---|
date | Tue Jul 01 16:16:44 2008 +0300 (2008-07-01) |
parents | |
children | 7ad41782e1ad |
rev | line source |
---|---|
igor@0 | 1 \section{Преобразование независимых систем в виртуальные домены Xen} |
igor@0 | 2 |
igor@0 | 3 Здесь описывается как выполнять систему, установленную на компьютере, |
igor@0 | 4 внутри домена Xen или с помощью эмулятора QEMU, исполняющегося на другом компьютере. |
igor@0 | 5 Может быть полезно при консолидации и виртуализации систем, |
igor@0 | 6 при работе с устаревшими системами, при тестировании. |
igor@0 | 7 |
igor@0 | 8 \subsection{Идея} |
igor@0 | 9 В связи с постоянным увеличением вычислительной мощности и объёма оперативной памяти машин, наблюдающимся в настоящее время, большую популярность приобретает идея виртуализации систем. В особенности популярным этот подход становится |
igor@0 | 10 при построении серверной инфраструктуры. |
igor@0 | 11 |
igor@0 | 12 Виртуализированная серверная инфраструктура редко строится с нуля. Чаще всего существует парк физических (не виртуализированных) серверов, которые безостановочно работают, выполняя возложенные на них задачи. |
igor@0 | 13 Нередко для хранения информации (операционной системы, программного обеспечения и данных) эти серверы используют не внешние хранилища, а собственные жётские |
igor@0 | 14 диски. |
igor@0 | 15 |
igor@0 | 16 Виртуализация сервера в данном случае может быть выполнена одним из указанных способов: |
igor@0 | 17 \begin{enumerate} |
igor@0 | 18 \item \textit{Миграция служб.} В виртуальной системе новый сервер разворачивается с нуля. Затем на него переносятся службы старого сервера. После чего старый сервер выводится из эксплуатации. |
igor@0 | 19 \item \textit{Миграция операционной системы.} Старый сервер останавливается, а затем на нём по сети (с компакт-диска или другого внешнего носителя информации) запускается другая операционная система, которая экспортирует установленный в сервере жёсткий диск системе виртуализации. Система виртуализации исполняет операционную систему, проинсталированную на этом диске. При условии, что виртуализация удалась, данные переносятся на хранилище системы виртуализации и старый сервер выключается. |
igor@0 | 20 \end{enumerate} |
igor@0 | 21 |
igor@0 | 22 Последний способ проще и быстрее, но он должен допускать возможность |
igor@0 | 23 временной, непродолжительной остановки сервера (на время запуска другой операционной системы, экспорта, запуска виртуальной машины поверх экспортированных данных). |
igor@0 | 24 В случае правильного выполнения всех операций простой в этом случае составит до 10 минут. |
igor@0 | 25 |
igor@0 | 26 Обратите внимание что данные, расположенные на жёстком диске, |
igor@0 | 27 при загрузке новой операционной системы, выполнящей экспорт, |
igor@0 | 28 никак не используются. Загрузка выполняется по сети, с компакт-диска или другого внешнего носителя. Диск экспортируется для доступа к нему системы виртуализации. Изменения на диске может делать только сама операционная система, установленная на этом же диске, после того как она запущена в виртуальном домене. |
igor@0 | 29 |
igor@0 | 30 Ниже детально рассматривается процесс миграции, |
igor@0 | 31 выполненный по второму сценарию. |
igor@0 | 32 |
igor@0 | 33 \subsection{Постановка задачи} |
igor@0 | 34 Пусть есть две системы: |
igor@0 | 35 \begin{itemize} |
igor@0 | 36 \item \textit{Старая система} (old) --- система, которая должна быть экспортирована. |
igor@0 | 37 \item \textit{Xen-система} (xen) --- система, внутри которой должен исполняться домен под управлением экспортированной системы. |
igor@0 | 38 \end{itemize} |
igor@0 | 39 |
igor@0 | 40 Необходимо создать новую виртуальную машину, |
igor@0 | 41 которая будет использовать в качестве жёсткого диска жёсткий диск удалённого хоста, экспортированный для доступа по сети с помощью протоколов сетевого доступа к дисковым хранилищам. |
igor@0 | 42 |
igor@0 | 43 \subsection{Запуск второй операционной системы в домене Xen установленной на том же компьютере} |
igor@0 | 44 Рассмотрим для начала простейший случай, когда на одном компьютере |
igor@0 | 45 установлено две операционные системы. |
igor@0 | 46 Он отличается от интересующей нас задачии тем, что не нужно |
igor@0 | 47 выполнять экспорт диска как сетевого устройства. |
igor@0 | 48 |
igor@0 | 49 Если на компьютере установлены две операционные системы, |
igor@0 | 50 и одна из них это Xenolinux (Xen + Linux), |
igor@0 | 51 то вторую можно запустить как пользовательский домен Xen. |
igor@0 | 52 |
igor@0 | 53 Запуск систем, не подготовленных для использования в паравиртуальном домене Xen, |
igor@0 | 54 внутри Xen возможен только в том случае, если центральный процессор системы поддерживает аппаратную виртуализацию. |
igor@0 | 55 В противном случае вместо Xen можно использовать QEMU. |
igor@0 | 56 |
igor@0 | 57 Операционная система, загруженная в родном режиме: |
igor@0 | 58 |
igor@0 | 59 \begin{center} \resizebox{10cm}{!}{\includegraphics[width=12cm]{/var/lib/mediawiki/images/2/29/Win2003_native.JPG}}\\ \textit{}\end{center} |
igor@0 | 60 |
igor@0 | 61 Конфигурационный файл домена Xen: |
igor@0 | 62 |
igor@0 | 63 \begin{verbatim} |
igor@0 | 64 %$ egrep -v '^#|^\ *$' /etc/xen/win2003 |
igor@0 | 65 kernel = "hvmloader" |
igor@0 | 66 builder='hvm' |
igor@0 | 67 memory = 512 |
igor@0 | 68 shadow_memory = 8 |
igor@0 | 69 name = "win2003" |
igor@0 | 70 acpi=1 |
igor@0 | 71 vif = [ 'type=ioemu, bridge=br0' ] |
igor@0 | 72 disk = ['phy:/dev/hda,hda,w' ] |
igor@0 | 73 device_model = 'qemu-dm' |
igor@0 | 74 boot="c" |
igor@0 | 75 sdl=0 |
igor@0 | 76 vnc=1 |
igor@0 | 77 vnclisten="127.0.0.1" |
igor@0 | 78 stdvga=0 |
igor@0 | 79 serial='pty' |
igor@0 | 80 soundhw='sb16' |
igor@0 | 81 \end{verbatim} |
igor@0 | 82 |
igor@0 | 83 В данном случае операционная система Windows установлена |
igor@0 | 84 на жёсткий диск IDE, подключенный в системе в режиме Primary Master |
igor@0 | 85 (блочное устройство \texttt{/dev/hda}). |
igor@0 | 86 |
igor@0 | 87 Старт домена выполняется стандартным образом: |
igor@0 | 88 |
igor@0 | 89 \begin{verbatim} |
igor@0 | 90 %# xm create win2003 |
igor@0 | 91 %# vncviewer 127.0.0.1:0 |
igor@0 | 92 \end{verbatim} |
igor@0 | 93 |
igor@0 | 94 Здесь вместо 0 может быть указан другой номер, в зависимости от номера |
igor@0 | 95 VNC-сеанса, который будет соответствовать заданному домену Xen. |
igor@0 | 96 Подробнее см. руководство пользователя Xen. |
igor@0 | 97 |
igor@0 | 98 Домен Xen, загруженный с жёсткого диска: |
igor@0 | 99 |
igor@0 | 100 \begin{itemize} |
igor@0 | 101 \item Процессор AMD 3000+ |
igor@0 | 102 \item 512 Mb ОЗУ |
igor@0 | 103 \end{itemize} |
igor@0 | 104 |
igor@0 | 105 \begin{figure} |
igor@0 | 106 \includegraphics[width=12cm]{/var/lib/mediawiki/images/b/bc/W2003_xen.png} |
igor@0 | 107 \end{figure} |
igor@0 | 108 |
igor@0 | 109 На домен, в котором работает установленная операционная система |
igor@0 | 110 распространяются все те же законы, которые распространяются на систему, которая установлена в домен с нуля |
igor@0 | 111 традиционным способом. |
igor@0 | 112 |
igor@0 | 113 \subsection{Запуск домена с экспортированного образа} |
igor@0 | 114 Если операционная система установлена не локально, |
igor@0 | 115 а на другом компьютере, необходимо каким-то образом его донести системе виртуализации, так что бы, грубо говоря, виртуальный домен увидел диск. |
igor@0 | 116 |
igor@0 | 117 Процедура включает три шага: |
igor@0 | 118 \begin{enumerate} |
igor@0 | 119 \item Выполнить бездисковую загрузку старой системы \textit{old} под управлением Linux; |
igor@0 | 120 \item Выполнить экспорт диска загруженной системы \textit{old} с помощью AoE или iSCSI; |
igor@0 | 121 \item На работающей Xen-системе \textit{xen} запустить домен, который будет использовать экспортированный старой машиной. |
igor@0 | 122 \end{enumerate} |
igor@0 | 123 |
igor@0 | 124 \subsubsection{Подготовка сервера бездисковой загрузки} |
igor@0 | 125 Детально процедура подготовки сервера бездисковой загрузки |
igor@0 | 126 описана на странице \htmladdnormallinkfoot{PXE}{http://xgu.ru/wiki/PXE}. |
igor@0 | 127 Ниже приводятся только примеры конфигурационных |
igor@0 | 128 файлов ключевых систем, использующихся в работе. |
igor@0 | 129 |
igor@0 | 130 \paragraph{DHCP} |
igor@0 | 131 Конфигурация демона dhcpd в файле \textbf{/etc/default/dhcp}: |
igor@0 | 132 |
igor@0 | 133 \begin{verbatim} |
igor@0 | 134 %$ egrep -v '^#|^\ *$' /etc/default/dhcp |
igor@0 | 135 INTERFACES="br0" |
igor@0 | 136 \end{verbatim} |
igor@0 | 137 |
igor@0 | 138 Сам конфигурационный файл \textbf{/etc/dhcpd.conf}: |
igor@0 | 139 |
igor@0 | 140 \begin{verbatim} |
igor@0 | 141 %$ egrep -v '^#|^\ *$' /etc/dhcpd.conf |
igor@0 | 142 option domain-name "clinika.com"; |
igor@0 | 143 option domain-name-servers 192.168.15.254; |
igor@0 | 144 option subnet-mask 255.255.255.0; |
igor@0 | 145 default-lease-time 600; |
igor@0 | 146 max-lease-time 7200; |
igor@0 | 147 subnet 192.168.7.0 netmask 255.255.255.0 { |
igor@0 | 148 range 192.168.7.200 192.168.7.220; |
igor@0 | 149 option routers 192.168.7.254; |
igor@0 | 150 filename "pxelinux.0"; |
igor@0 | 151 } |
igor@0 | 152 host clinika { |
igor@0 | 153 hardware ethernet 00:13:8f:49:b0:31; |
igor@0 | 154 fixed-address 192.168.7.253; |
igor@0 | 155 } |
igor@0 | 156 \end{verbatim} |
igor@0 | 157 |
igor@0 | 158 \paragraph{TFTP} |
igor@0 | 159 |
igor@0 | 160 \begin{verbatim} |
igor@0 | 161 %$ egrep -v '^#|^\ *$' /etc/default/tftpd-hpa |
igor@0 | 162 RUN_DAEMON="yes" |
igor@0 | 163 OPTIONS="-l -s /var/lib/tftpboot/ltsp/i386/" |
igor@0 | 164 \end{verbatim} |
igor@0 | 165 |
igor@0 | 166 \paragraph{PXE} |
igor@0 | 167 Наполнение каталога TFTP-сервера. |
igor@0 | 168 Здесь присутствуют файлы загрузчика PXELINUX. |
igor@0 | 169 |
igor@0 | 170 \begin{verbatim} |
igor@0 | 171 %$ ls -l /var/lib/tftpboot/ltsp/i386/ |
igor@0 | 172 итого 10690 |
igor@0 | 173 -rw-r--r-- 1 root root 203 2007-10-04 boot.msg |
igor@0 | 174 -rw-r--r-- 1 root root 80023 2007-07-11 config-2.6.21-2-486 |
igor@0 | 175 lrwxrwxrwx 1 root root 23 2007-10-04 initrd.img -> initrd.img-2.6.21-2-486 |
igor@0 | 176 -rw-r--r-- 1 root root 3691052 2007-10-04 initrd.img-2.6.21-2-486 |
igor@0 | 177 -rw-r--r-- 1 root root 9519 2007-10-04 logo.16_1 |
igor@0 | 178 lrwxrwxrwx 1 root root 20 2007-10-04 nbi.img -> nbi.img-2.6.21-2-486 |
igor@0 | 179 -rw-r--r-- 1 root root 5019136 2007-10-04 nbi.img-2.6.21-2-486 |
igor@0 | 180 -rw-r--r-- 1 root root 13944 2007-10-04 pxelinux.0 |
igor@0 | 181 drwxr-xr-x 2 root root 104 2007-10-05 pxelinux.cfg |
igor@0 | 182 -rw-r--r-- 1 root root 780664 2007-07-11 System.map-2.6.21-2-486 |
igor@0 | 183 lrwxrwxrwx 1 root root 20 2007-10-04 vmlinuz -> vmlinuz-2.6.21-2-486 |
igor@0 | 184 -rw-r--r-- 1 root root 1319152 2007-07-11 vmlinuz-2.6.21-2-486 |
igor@0 | 185 \end{verbatim} |
igor@0 | 186 |
igor@0 | 187 Конфигурационный файл загрузчика PXELINUX: |
igor@0 | 188 |
igor@0 | 189 \begin{verbatim} |
igor@0 | 190 clint:Dom0~$ cat /var/lib/tftpboot/ltsp/i386/pxelinux.cfg/default |
igor@0 | 191 DISPLAY boot.msg |
igor@0 | 192 TIMEOUT 150 |
igor@0 | 193 DEFAULT vmlinuz |
igor@0 | 194 PROMPT 1 |
igor@0 | 195 |
igor@0 | 196 LABEL 2.6.21.2 |
igor@0 | 197 KERNEL vmlinuz |
igor@0 | 198 APPEND nfsdir=192.168.7.254:/opt/ltsp/i386 lang=ru ramdisk_size=1000000 |
igor@0 | 199 root=/dev/nfs rw nfsroot=192.168.7.254:/opt/ltsp/i386/ ip=dhcp initrd=initrd.img |
igor@0 | 200 \end{verbatim} |
igor@0 | 201 |
igor@0 | 202 \paragraph{Корневая файловая система, загружаемая по сети} |
igor@0 | 203 В каталоге \texttt{/opt/ltsp/i386/} |
igor@0 | 204 развёрнута операционная система Linux. |
igor@0 | 205 Инсталляция выполняется с помощью \textit{debootstrap} |
igor@0 | 206 или аналогичным способом. |
igor@0 | 207 |
igor@0 | 208 В системе должны быть установлены пакеты: |
igor@0 | 209 \begin{itemize} |
igor@0 | 210 \item vblade |
igor@0 | 211 \end{itemize} |
igor@0 | 212 |
igor@0 | 213 \subsubsection{Экспорт диска старой машины по сети} |
igor@0 | 214 Сервер, который будет экспортирован, |
igor@0 | 215 перезагружается и загружается |
igor@0 | 216 по сети. |
igor@0 | 217 |
igor@0 | 218 После этого необходимо выполнить следующие действия. |
igor@0 | 219 |
igor@0 | 220 Будем считать, что экспорт выполняется с помощью протокола |
igor@0 | 221 ATA over Ethernet. |
igor@0 | 222 Можно использовать другой протокол доступа к диску по сети. |
igor@0 | 223 |
igor@0 | 224 Убедитесь, что загружен модуль \textbf{aoe}: |
igor@0 | 225 |
igor@0 | 226 \begin{verbatim} |
igor@0 | 227 ltsp:~# lsmod | grep aoe |
igor@0 | 228 aoe 24416 0 |
igor@0 | 229 \end{verbatim} |
igor@0 | 230 |
igor@0 | 231 Экспортируйте диск \texttt{/dev/hda} (или другой -- тот, на котором установлена система) с помощью \textbf{vblade}: |
igor@0 | 232 |
igor@0 | 233 \begin{verbatim} |
igor@0 | 234 ltsp:~# vblade 1 0 eth0 /dev/hda |
igor@0 | 235 pid 3344: e1.0, 78165360 sectors O_RDWR |
igor@0 | 236 \end{verbatim} |
igor@0 | 237 |
igor@0 | 238 \subsubsection{Запуск домена с экспортированного образа} |
igor@0 | 239 На системе виртуализации |
igor@0 | 240 загрузите модуль \textbf{aoe}: |
igor@0 | 241 |
igor@0 | 242 \begin{verbatim} |
igor@0 | 243 clint:Dom0~$ ls -l /dev/etherd |
igor@0 | 244 ls: /dev/etherd: Heт такого файла или каталога |
igor@0 | 245 %# modprobe aoe |
igor@0 | 246 aoe: aoe_init: AoE v22 initialised. |
igor@0 | 247 aoe: 00138f49b031 e1.0 v400c has 78165360 sectors |
igor@0 | 248 %# sudo lsmod | grep aoe |
igor@0 | 249 aoe 23456 0 |
igor@0 | 250 \end{verbatim} |
igor@0 | 251 |
igor@0 | 252 При этом |
igor@0 | 253 в \texttt{/var/log/messages} |
igor@0 | 254 должны появиться сообщения: |
igor@0 | 255 |
igor@0 | 256 \begin{verbatim} |
igor@0 | 257 ... kernel: aoe: aoe_init: AoE v22 initialised. |
igor@0 | 258 ... kernel: aoe: 00138f49b031 e1.0 v400c has 78165360 sectors |
igor@0 | 259 ... kernel: etherd/e1.0: p2 < p5 p6 p7 p8 p9 > p3 |
igor@0 | 260 \end{verbatim} |
igor@0 | 261 |
igor@0 | 262 В каталоге \texttt{/dev/etherd} |
igor@0 | 263 должны появиться новые файлы устройств, |
igor@0 | 264 соответствующие обнаруженным дискам |
igor@0 | 265 ATA over Ethernet: |
igor@0 | 266 |
igor@0 | 267 \begin{verbatim} |
igor@0 | 268 %# ls -l /dev/etherd/ |
igor@0 | 269 итого 0 |
igor@0 | 270 c-w--w---- 1 root disk 152, 3 2007-10-05 21:46 discover |
igor@0 | 271 brw-rw---- 1 root disk 152, 256 2007-10-05 21:57 e1.0 |
igor@0 | 272 brw-rw---- 1 root disk 152, 258 2007-10-05 21:46 e1.0p2 |
igor@0 | 273 brw-rw---- 1 root disk 152, 259 2007-10-05 21:46 e1.0p3 |
igor@0 | 274 brw-rw---- 1 root disk 152, 261 2007-10-05 21:46 e1.0p5 |
igor@0 | 275 brw-rw---- 1 root disk 152, 262 2007-10-05 21:46 e1.0p6 |
igor@0 | 276 brw-rw---- 1 root disk 152, 263 2007-10-05 21:46 e1.0p7 |
igor@0 | 277 brw-rw---- 1 root disk 152, 264 2007-10-05 21:46 e1.0p8 |
igor@0 | 278 brw-rw---- 1 root disk 152, 265 2007-10-05 21:46 e1.0p9 |
igor@0 | 279 cr--r----- 1 root disk 152, 2 2007-10-05 21:46 err |
igor@0 | 280 c-w--w---- 1 root disk 152, 4 2007-10-05 21:46 interfaces |
igor@0 | 281 c-w--w---- 1 root disk 152, 5 2007-10-05 21:46 revalidate |
igor@0 | 282 \end{verbatim} |
igor@0 | 283 |
igor@0 | 284 Далее необходимо создать конфигурационный файл |
igor@0 | 285 нового домена Xen |
igor@0 | 286 или модифицровать существующий. |
igor@0 | 287 |
igor@0 | 288 \begin{verbatim} |
igor@0 | 289 %$ egrep -v '^#|^\ *$' /etc/xen/win2k |
igor@0 | 290 kernel = "hvmloader" |
igor@0 | 291 builder='hvm' |
igor@0 | 292 memory = 512 |
igor@0 | 293 shadow_memory = 8 |
igor@0 | 294 name = "win2k" |
igor@0 | 295 acpi=1 |
igor@0 | 296 vif = [ 'type=ioemu, bridge=br0' ] |
igor@0 | 297 disk = ['phy:/dev/etherd/e1.0,hda,w' ] |
igor@0 | 298 device_model = 'qemu-dm' |
igor@0 | 299 boot="c" |
igor@0 | 300 sdl=0 |
igor@0 | 301 vnc=1 |
igor@0 | 302 vnclisten="127.0.0.1" |
igor@0 | 303 stdvga=0 |
igor@0 | 304 serial='pty' |
igor@0 | 305 soundhw='sb16' |
igor@0 | 306 \end{verbatim} |
igor@0 | 307 |
igor@0 | 308 После чего запустить домен: |
igor@0 | 309 |
igor@0 | 310 \begin{verbatim} |
igor@0 | 311 %@ xm create win2k |
igor@0 | 312 \end{verbatim} |
igor@0 | 313 |
igor@0 | 314 \subsubsection{Результат запуска} |
igor@0 | 315 Старая машина, загруженная самостоятельно. |
igor@0 | 316 \begin{itemize} |
igor@0 | 317 \item Процессор Sempron 2600 |
igor@0 | 318 \item 457968KB ОЗУ |
igor@0 | 319 \end{itemize} |
igor@0 | 320 \begin{center} \resizebox{10cm}{!}{\includegraphics[width=12cm]{/var/lib/mediawiki/images/b/b9/W2k.jpg}}\\ \textit{}\end{center} |
igor@0 | 321 |
igor@0 | 322 Домен Xen, загруженный удалённо |
igor@0 | 323 с жёсткого диска старой системы: |
igor@0 | 324 \begin{itemize} |
igor@0 | 325 \item Процессор AMD 3000+ |
igor@0 | 326 \item 523800KB ОЗУ |
igor@0 | 327 \end{itemize} |
igor@0 | 328 \begin{center} \resizebox{10cm}{!}{\includegraphics[width=12cm]{/var/lib/mediawiki/images/c/cd/W2k_2.png}}\\ \textit{}\end{center} |
igor@0 | 329 |
igor@0 | 330 Другие изображения: |
igor@0 | 331 |
igor@0 | 332 \begin{center} \resizebox{10cm}{!}{\includegraphics[width=12cm]{/var/lib/mediawiki/images/f/f9/W2k_0.png}}\\ \textit{}\end{center} |
igor@0 | 333 \begin{center} \resizebox{10cm}{!}{\includegraphics[width=12cm]{/var/lib/mediawiki/images/7/75/W2k_1.png}}\\ \textit{}\end{center} |
igor@0 | 334 |
igor@0 | 335 Мы бы не смогли подключиться к этой системе удалённо |
igor@0 | 336 в момент запуска, поскольку сетевая подсистема ещё не работает. |
igor@0 | 337 Такие изображения можно сделать только при запуске машины |
igor@0 | 338 в виртуальной системе или в эмуляторе. |
igor@0 | 339 |
igor@0 | 340 \subsubsection{Перенесение образа старой машины} |
igor@0 | 341 Если старый сервер должен быть выведен |
igor@0 | 342 из эксплуатации, необходимо скопировать |
igor@0 | 343 данные на новое место. |
igor@0 | 344 |
igor@0 | 345 Домен соответствующий виртуализируемому серверу должен быть потушен в момент копирования! |
igor@0 | 346 |
igor@0 | 347 Например, если перенос выполняется на том LVM: |
igor@0 | 348 |
igor@0 | 349 \begin{verbatim} |
igor@0 | 350 %# lvcreate -L 20G -n server2003 /dev/XEN |
igor@0 | 351 %# dd if=/dev/etherd/e1.0 of=/dev/XEN/server2003 |
igor@0 | 352 %# sed -i -e s@/dev/etherd/e1.0@/dev/XEN/server2003@ /etc/xen/win2003 |
igor@0 | 353 \end{verbatim} |
igor@0 | 354 |
igor@0 | 355 |
igor@0 | 356 \subsection{Дополнительная информация} |
igor@0 | 357 \begin{itemize} |
igor@0 | 358 \item \htmladdnormallinkfoot{Экспорт установленной системы в домен Xen}{http://xgu.ru/wiki/xen/export} (рус.) |
igor@0 | 359 \end{itemize} |