forked from grigory-rechistov/simlab
-
Notifications
You must be signed in to change notification settings - Fork 0
/
lab03.tex
324 lines (249 loc) · 25.2 KB
/
lab03.tex
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
\chapter{Связь симуляции с внешним миром}\label{chap:lab03}
\section{Цель занятия}
Необходимость коммуникации --- доставка данных.
\begin{enumerate*}
\item Образы дисков, форматы raw, craff, vmdk, iso.
\item Паравиртуализация: hostfs, magic instructions.
\item Сетевое взаимодействие: NAT, port forwarding, bridging.
\end{enumerate*}
\section{Диски}
Под дисками мы будем подразумевать устройства хранения данных на жёстких магнитных дисках (стандарты SATA, IDE, FireWire, SCSI), твердотельных накопителях (USB-флешки, SSD), а также оптические диски (CD, DVD, Blu-ray) и теряющие актуальность гибкие диски (\abbr floppy disks).
С моделированием дисковой подсистемы связано несколько специфичных вопросов.
\begin{itemize*}
\item Обеспечение высокой скорости симуляции. Объём передаваемых данных для ряда приложений может быть большим, как и связанное с этим замедление модели.
\item Обеспечение непосредственного хранения массивов данных. Ёмкость моделируемых дисков может достигать десятков терабайт.
\item Постоянство хранилища модели. В отличие от ОЗУ и регистров устройств, жёсткие диски не теряют данные при выключении или перезагрузке компьютера. Однако сохранение состояния между запусками симуляции нарушает принцип её воспроизводимости и повторяемости.
\end{itemize*}
\subsection{Форматы хранения}
Поскольку диск представляет собой устройство с произвольным доступом, естественная форма хранения его данных --- это файл в хозяйской системе. В простом случае он содержит собой просто копию байт-в-байт всего содержимого реального диска, т.н. «сырой» (\abbr raw) образ диска. Преимущество такого формата --- его простота и универсальность; практически все симуляторы поддерживают его. Основной недостаток --- нерациональное использование хозяйского дискового пространства. Например, симуляция установки ОС может занять 1 Гбайт места на образе диска в 100 Гбайт; результирующий образ диска будет занимать 100 Гбайт, при этом 99\% его будут потеряны для хозяйской системы впустую.
Многие симуляторы поддерживают более компактные способы хранения, в которых в файл записываются только изменённые секторы диска; заголовочная часть файла содержит список этих секторов и их местоположение. Как правило, каждая программа имеет свой формат и иногда поддерживает другие или позволяет конвертировать их друг в друга. Примеры: Qcow2~\cite{qcow2} (Qemu), VDI (Oracle Virtualbox), VMDK~\cite{vmdk} (VMware ESX), VHD (Microsoft VirtualPC), HDD (Parallels Desktop), CRAFF (Wind River Simics).
Некоторые форматы поддерживают прозрачное сжатие записанных данных.
Для образов оптических дисков, которые в большинстве случаев являются носителями с данными только для чтения, используются сырые образы. Чаще всего они именуются ISO-образами по имени стандарта используемой на них файловой системы ISO 9660\footnote{Хотя это не единственный стандарт для оптических дисков; альтернативой является UDF (universal disk format), призванный обойти многие ограничения ISO 9660.}.
Из-за своего небольшого размера (меньше 3 Мбайт) образы гибких дисков хранятся в raw-формате.
\subsection{Сохранение состояния дисков}
Зачастую нежелательно модифицировать исходный файл образа диска: экспериментальное ПО/вирусы/ошибки пользователя внутри симулятора может сделать его неработоспособным, или же желательно впоследствии запускать симуляцию из первоначального состояния.
Для таких целей в большинстве симуляторов существует опция: все изменённые секторы сохранять не в оригинальном, а в дополнительном \textbf{разностном} файле (также называемом \textbf{дельтой}). Для моделируемого приложения указанная схема абсолютно прозрачна --- внутри симуляции изменения видны там, где и должны быть. Однако после выключения симуляции допустимо отбросить дельту и использовать оригинальный образ. В случае появления желания зафиксировать внесённые в результате последней симуляционной сессии правки --- следует воспользоваться утилитами слияния оригинального образа и дельты.
Развивая эту идею, можно вообразить себе схему с несколькими дельтами, полученными на разных этапах симуляции (и даже <<дельты к дельтам>>), одновременно наложенными на диск. Таким образом, можно иметь множество снимков состояний дискового хранилища, суммарно занимающие места меньше, чем занимали бы отдельные полные копии.
\section{Копирование файлов внутрь моделируемой системы}
Simics --- полноплатформенный симулятор, а это значит, что вся целевая система моделируется, включая диски, на которых установлено программное обеспечение. Часто может возникнуть необходимость транспортировки файлов из хозяйской системы в симулируемую и наоборот. Simics предоставляет способ прямого доступа к хозяйской операционной системе из моделируемой, называемой \textit{SimicsFS}.
\subsection{SimicsFS}
\textit{SimicsFS} --- это модуль ядра ОС, доступный в Linux и Solaris, для поддержки специальной файловой системы, делающий доступной файловую систему хозяина внутри гостевой системы. В рассматриваемой нами системе \textit{Viper} поддержка \textit{SimicsFS} уже установлена (описание процесса установки \textit{SimicsFS} можно найти в~\cite{hindsight}), поэтому для доступа к хозяйской файловой системе достаточно воспользоваться командой:
\begin{lstlisting}
# mount /host
[ 25.060559] [simicsfs] mounted
\end{lstlisting}
После этого вы можете просматривать, скачивать и удалять файлы с хозяйской ЭВМ. Например, вы можете посмотреть содержимое корневой директории хозяйской операционной системы (Для Linux)
\begin{lstlisting}
# ls /host
bin dev ipathfs lost+found opt sbin share_debian tmp
boot etc lib media proc selinux srv usr
cgroup home lib64 mnt root share sys var
\end{lstlisting}
Вы можете сравнить вывод команды \texttt{ls /host} внутри моделируемой системы с выводом команды \texttt{ls /} внутри хозяйской системы и убедиться, что он совпадает.
Для того чтобы прекратить работу с \textit{SimicsFS}, достаточно просто отмонтировать хозяйскую файловую систему следующей командой:
\begin{lstlisting}
# umount /host
\end{lstlisting}
\subsection{Подключение симулятора к реальной сети}
Подключение симулятора к реальной сети открывает много новых возможностей. Например, позволяет упростить процесс загрузки файлов на симулируемую машину с помощью FTP (\abbr File Transfer Protocol); данная возможность может также использоваться для доступа к виртуальной машине удаленно с помощью Telnet.
\subsection{Типы соединений}
Simics предоставляет 4 способа подключения к реальной сети, которые описаны в~\cite{enug}. В данной секции описано, как они работают, их преимущества и недостатки.
\subsubsection{Перенаправление портов (\abbr Port forwarding)}
Перенаправление портов --- это самый простой тип соединений. Для установления соединения он не требует ни прав администратора, ни какой-либо другой конфигурации хозяйской машины.
Однако перенаправление портов ограничено только TCP- и UDP-трафиком. Другой трафик, например ping пакеты, которые использует ICMP-протокол, не пройдет через такое соединение. Нельзя использовать порты, которые уже используются на хозяйской машине, а также нельзя использовать порты меньше 1024 без прав администратора.
Каждый TCP- и UDP-порт требует отдельного правила перенаправления. По этой причине конфигурация приложений, которые используют множество портов или порты, определяемые произвольным образом (\abbr random ports), может оказаться довольно обременительной.
Перенаправление портов разрешает коммуникации между гостевой и хозяйской машинами, а также любыми узлами реальной сети.
\subsubsection{Соединение через сетевой мост (\abbr Ethernet bridging connection)}
С помощью соединения через сетевой мост у симулируемой машины появляеться возможность непосредственно подключаться к реальной сети. Данное соединение позволяет использовать трафик любого типа. Обычно симулируемый узел использует IP-адреса подсети, так как в данном случае не требуется менять конфигурацию хозяина. Тем не менее при использовании такого соединения хозяйская машина остается не доступной из гостевой.
Для использования соединения через сетевой мост на хозяйской машине необходимо иметь права на доступ к TAP.
\subsubsection{Соединение с хостом (\abbr Host connection)}
C помощью соединения с хостом хозяин подключается к моделируемой сети, позволяющей использование трафика любого типа между моделируемым и реальным узлами.
Соединение с хостом также поддерживает и перенаправление IP. Когда используется перенаправление IP, хозяйская операционная система маршрутизирует IP-трафик между реальной и симулируемой сетью. Из вышесказанного следует, что маршрутизация должна быть настроена между симулируемой и реальной сетью для того, чтобы данный способ работал.
Для использования соединения через сетевой мост на хозяйской машине необходимо иметь права на доступ к TAP.
\begin{table}[htb]
\caption{Cпособы соединения с реальной сетью}
\label{tab:cmp-real-network-connection}
\center
\begin{tabularx}{\textwidth}{|X|c|c|c|c|}
\hline
& П. Портов & Мост Т & Мост НТ & Хост \\
\hline
Права администратора для конфигурации & нет & да & да & да \\
Права администратора для запуска & нет & нет & да & нет \\
Реальный IP & нет & да & да & нет \\
Поддержка UDP/TCP & да & да & да & да \\
Ограничение UDP/TCP-портами & да & нет & нет & нет \\
Поддержка всего IPv4 & нет & да & да & да \\
Поддержка всего Ethernet & нет & нет & да & да \\
Соединение с хозяином & да & нет & нет & да \\
Конфигурация хозяина & нет & нет & да & нет \\
\hline
\end{tabularx}
\begin{description*}
\item[П. Портов:] перенаправление портов
\item[Мост Т:] создание сетевого моста с трансляцией MAC-адресов
\item[Мост НТ:] создание сетевого моста без трансляции MAC-адресов
\item[Хост:] соединение с хостом
\end{description*}
\end{table}
Таблица~\ref{tab:cmp-real-network-connection} резюмирует преимущества и недостатки каждого типа соединений. Для простых TCP-сервисов, таких как FTP, HTTP или Telnet, лучше всего подходит перенаправление портов. В нашем случае этого достаточно, поэтому другие способы соединения с реальной сетью мы подробно рассматривать не будем.
Для каждого типа соединений с реальной сетью существет команда, которая принимает объект типа Ethernet link.
\section{Ход работы}
\subsection{SimicsFS}
\begin{enumerate*}
\item Загрузите Simics со стартовым скриптом \texttt{viper-busybox.simics} в конфигурации с процессором класса \texttt{core-i7-single}:
\begin{lstlisting}
$ ./simics -e '$cpu_class=core-i7-single' targets/x86-x58-ich10/viper-busybox.simics
\end{lstlisting}
\item Запустите симуляцию:
\begin{lstlisting}
simics> continue
running>
\end{lstlisting}
\item После того как гостевая система загрузится, авторизуйтесь и примонтируйте хозяйскую файловую систему:
\begin{lstlisting}
busybox login: root
[guest]# mount /host
\end{lstlisting}
\item Выведите содержимое корневой директории хозяйской операционной системы и сравните его с выводом содержимого папки /host внутри симулируемой машины:
\begin{lstlisting}
[host]$ ls /
[guest]# ls /host
\end{lstlisting}
\item Создайте файл в своей рабочей директории и убедитесь, что он также стал виден из симулируемой машины:
\begin{lstlisting}
[host]$ cd /share_debian/workspaces/students/ivanov
[host]$ touch test
[guest]# ls /host/share_debian/workspaces/students/ivanov
\end{lstlisting}
\item Удалите созданный файл из симулируемой машины и убедитесь, что в реальной системе он тоже был удален:
\begin{lstlisting}
[guest]# rm test
[host]$ ls /share_debian/workspaces/students/ivanov
\end{lstlisting}
\item Попробуйте из моделируемой системы удалить какой-либо системный файл хозяйской ОС, например, /bin/sh:
\begin{lstlisting}
[host]$ rm /bin/sh
rm: cannot remove `/bin/sh': Permission denied
[guest]# rm /host/bin/sh
rm: cannot remove `/host/bin/sh': Permission denied
\end{lstlisting}
Видно, что даже наличие прав администратора внутри симулируемого узла не позволяет нам удалять файлы, недоступные для записи пользователю, который запустил симуляцию.
\end{enumerate*}
\subsection{Подключение к реальной сети}
\begin{enumerate*}
\item Прежде чем подключать симулируемую систему к реальной сети, нам необходимо убедиться, что у хозяйской машины есть подключение к Интернету. В противном случае симулируемая система также не сможет подключиться к сети. Проверим, что соединение с Интернетом есть у реальной системы. Протестируем Telnet соединение с веб-сервером, например google.com, на 80 порту, с помощью ввода команды \texttt{GET /}. Эта команда должна вернуть HTML-содержимое стартовой странцицы сервера
\begin{lstlisting}
$ telnet www.google.com 80
Trying 74.125.232.243...
Connected to www.google.com.
Escape character is '^]'.
GET /
HTTP/1.0 302 Found
Location: http://www.google.ru/
Cache-Control: private
Content-Type: text/html; charset=UTF-8
Set-Cookie: PREF=ID=8ebf0b0d9fda87c2:FF=0:TM=1358767271:LM=1358767271:S=i7ZpIQ-KLg2H1VXZ;
expires=Wed, 21-Jan-2015 11:21:11 GMT;
path=/; domain=.google.com
Set-Cookie: NID=67=ogXTGYQQ5wlyfWupN8EmmGRdfL_7FQ5CNhU3yf2lArXX-04...
expires=Tue, 23-Jul-2013 11:21:11 GMT;
path=/; domain=.google.com; HttpOnly
P3P: CP="This is not a P3P policy! See http://www.google.com/support/accounts/bin/answer.py?hl=en&answer=151657 for more info."
Date: Mon, 21 Jan 2013 11:21:11 GMT
Server: gws
Content-Length: 218
X-XSS-Protection: 1; mode=block
X-Frame-Options: SAMEORIGIN
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>302 Moved</TITLE></HEAD><BODY>
<H1>302 Moved</H1>
The document has moved
<A HREF="http://www.google.ru/">here</A>.
</BODY></HTML>
Connection closed by foreign host.
\end{lstlisting}
\item Загрузите Simics со стартовым скриптом \texttt{practicum.simics}~ref{chap:target-script}:
\begin{lstlisting}
$ ./simics targets/practicum.simics
\end{lstlisting}
\item На холостом ходу наша симулируемая машина может бежать быстрее реального времени, поэтому время ожидания соединения может пройти быстрее, чем требуется. Для того чтобы избежать этого, необходимо включить режим реального времени.
\begin{lstlisting}
simics> enable-real-time-mode
simics>
\end{lstlisting}
\item Подкулючите моделируемую систему к реальной сети с помощью команды connect-real-network
\begin{lstlisting}
simics> connect-real-network 192.168.1.100
No ethernet link found, created default_eth_switch0.
Connected practicum.mb.sb.eth_slot to default_eth_switch0
Created instantiated 'std-service-node' component 'default_service_node0'
Connecting 'default_service_node0' to 'default_eth_switch0' as 192.168.1.1
NAPT enabled with gateway 192.168.1.1/24 on link default_eth_switch0.link.
NAPT enabled with gateway fe80::2220:20ff:fe20:2000/64 on link default_eth_switch0.link.
Host TCP port 4021 -> 192.168.1.100:21
Host TCP port 4022 -> 192.168.1.100:22
Host TCP port 4023 -> 192.168.1.100:23
Host TCP port 4080 -> 192.168.1.100:80
Real DNS enabled at 192.168.1.1/24 on link default_eth_switch0.link.
Real DNS enabled at fe80::2220:20ff:fe20:2000/64 on link default_eth_switch0.link.
simics>
\end{lstlisting}
\item Необходимо включить DHCP pool. Переменная \texttt{service_node} должна создаться после выполнения команды \texttt{connect-real-network}:
\begin{lstlisting}
simics> default_service_node0.dhcp-add-pool pool-size = 50 ip = 192.168.1.150
simics>
\end{lstlisting}
\item Запустите симуляцию:
\begin{lstlisting}
simics> continue
running>
\end{lstlisting}
\item После загрузки симулируемого узла для доступа в Интернет необходимо настроить DHCP.
\begin{lstlisting}
user@master0:~$ sudo dhclient -v eth1
Internet Systems Consortium DHCP Client 4.1.1-P1
Copyright 2004-2010 Internet Systems Consortium.
All rights reserved.
For info, please visit https://www.isc.org/software/dhcp/
[ 121.257375] ADDRCONF(NETDEV_UP): eth1: link is not ready
[ 121.261351] e1000e: eth1 NIC Link is Up 10 Mbps Full Duplex, Flow Control: No
ne
[ 121.261764] 0000:00:19.0: eth1: 10/100 speed: disabling TSO
[ 121.262438] ADDRCONF(NETDEV_CHANGE): eth1: link becomes ready
Listening on LPF/eth1/00:19:a0:e1:1c:9f
Sending on LPF/eth1/00:19:a0:e1:1c:9f
Sending on Socket/fallback
DHCPDISCOVER on eth1 to 255.255.255.255 port 67 interval 8
DHCPOFFER from 192.168.1.1
DHCPREQUEST on eth1 to 255.255.255.255 port 67
DHCPACK from 192.168.1.1
bound to 192.168.1.150 -- renewal in 1517 seconds.
user@master0:~$
\end{lstlisting}
\item
\begin{lstlisting}
user@master0:~$ telnet gnu.org 80
Trying 208.118.235.148...
Connected to gnu.org.
Escape character is '^]'.
GET /
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>302 Found</title>
</head><body>
<h1>Found</h1>
<p>The document has moved <a href="http://savannah.nongnu.org/?">here</a>.</p>
<hr>
<address>Apache/2.2.14 Server at www.nongnu.org Port 80</address>
</body></html>
Connection closed by foreign host.
\end{lstlisting}
\item Также с помощью Telnet вы можете посмотреть ASCII-версию <<Звездных войн>>
\begin{lstlisting}
user@master0:~$ telnet towel.blinkenlights.nl
\end{lstlisting}
\end{enumerate*}
\iftoggle{webpaper}{
\printbibliography[title={Список литературы к занятию}]
}{}