Некоторые сведения о физическом уровне и управлении виртуальными машинами
Носители данных
Две задачи:
Свойства среды передачи данных
- Коммутация каналов или данных?
- Аналоговый поток ⇒ разделяем каналы
Не обязательно тянуть несколько линий: при частотной модуляции можно использовать несколько несущих разной частоты на одной среде
- Цифровой поток ⇒ разделяем данные
- Объём метаинформации растёт
- Аналоговый поток ⇒ разделяем каналы
- С помощью чего передаются данные
Пример: RS232 можно 3 провода (RxD, TxD, GND), можно 5 (+RTS, CTS), можно больше для согласования и управления (см. там же)
Пример: витая пара
- Параметры среды, условия эксплуатации
- RS-232: длина и сопротивление провода
Витая пара: оплётка, шаг и направление скруток, расстояние до соседней пары и т. п. (тысячи их)
- Коммутация каналов или данных?
- Формат данных
Физическое кодирование — как представляются 0 и 1
- Синхронизация
Как отличить данные от не-данных? (преамбула/кадр)
- Обнаружение ошибок. Пример: чётность; сколько дополнительных битов, столько ошибок можно найти, но не исправить.
RS232: снова уровнем выше, биты чётности UART
Исправление ошибок (пример: линейный код избыточность такая, что при возникновении одной ошибки результат всё равно по метрике ближе неискажённому исходнику)
Скремблинг (в некоторых средах спасает от собственных помех и «накопления единицы»)
Адская математика и алгоритмы коррекции искажений среды (например, ADSL)
Пример: витая пара
дифференциальный сигнал и фазовая манипуляция (отличная статья В. Кисиля)
Что известно о физическом уровне со стороны ОС? Да ничего почти.
- COM-порт:
stty -a < /dev/ttyS0 (вместе с физическими параметрами нам покажут свойства кадра последовательного интерфейса ttyS0 и даже прикладные свойства — параметры терминальной линии)
обратите внимание на то, что порт должен открываться на чтение, поэтому используется «<»)
Например, можно задать правильный размер экрана (в знакоместах терминала) — rows / colunms
- Ethernet:
ethtool eth0
- Посмотреть на «Supported ports» и «Port»
ip link set eth0 up
- Снова посмотреть на «Supported ports» и «Port»
Работа с VirtualBox
Важно: Фиксация состояния (snapshot) и откат к этому состоянию
- Что мы меняем на лекциях в настройках
- Клонирование машин
- Перейти в экспертный режим :
«Связное клонирование»
«Новые MAC-адреса для всех сетевых адаптеров»:
- Перейти в экспертный режим :
- Дополнительно: выключение проброса COM в сеть или смена TCP-порта в настройках (иначе вторая машина не запустится)
О волшебных скриптах в лекции
Управление VirtualBox с помощью VBoxManage
На 2024 год — alien technology detected: никогда не запускайте VBoxManage и / или VirtualBox в русской локали — скрипты перестанут работать, потому что файлы настройки окажутся переведёнными на русский!
- Если вы видите сообщения на русском языке, но хотите, чтобы скрипты работали:
Удалите все виртуалки и каталоги ~/VirtualBox VMs и ~/.config/VirtualBox
Сразу после того, как откроете терминал, делайте export LC_ALL=en_US.UTF-8
- Если вы видите сообщения на русском языке, но хотите, чтобы скрипты работали:
Проброс COM-сорта через TCP (COM1, то есть /dev/ttyS0, работает консолью)
Подключение к порту с помощью netcat
netcat localhost ПОРТ
ещё удобнее — c помощью socat, только там параметры эзотерические:
socat -,cfmakeraw,echo=0,escape=15 TCP4:localhost:ПОРТ
- Второй com-порт: записывает его вывод в файл:
Из командной строки: VBoxManage modifyvm ИМЯ_виртуалки --uart2 0x02f8 3 --uartmode2 file port_logger
(Из командной строки: VBoxManage modifyvm ИМЯ_виртуалки --uart2 0x02f8 3 --uartmode2 tcpserver TCP-Порт для проброса)
- Скрипты на гостевой машине:
export TERM=xterm-256color — для раскраски консоли
или . bin/xtermresize — для раскраски консоли (работает на всех ANSI-терминалах) и подгонки размера с помощью stty (работает только на xterm)
sethostname имя
Как делать Д/З
Программа (скрипт) report и файлы отчёта
- Создание отчёта:
report номер_задания название_хоста
получается файл report.номер_задания.название_хоста
- Просмотр отчёта
report файл_отчёта
Передача отчёта из виртуалки
- «аппаратный вариант» — COM-порт в файл
- выключите виртуалку
удалите файл port_logger (или как вы его назвали)
- Настройте эмуляцию COM-порта — перенаправление вывода в файл
- В виртуальной машине:
- Настройте второй COM-порт так:
# stty raw -echo < /dev/ttyS1
raw — это режим, при котором ядро не считает его терминалом, и не обрабатывает/преобразует передаваемые байты
-echo — выключает режим, при котором вся вводимая информация немедленно отображается (то есть «как бы» выводится; в этом году у нас в конце лекции из-за невыключения были непонятки)
- Вывалите отчёт в COM-порт (больше ничего с ним не делайте)
# cat report.01.base > /dev/ttyS1
- Настройте второй COM-порт так:
Выключите виртуалку и переименуйте файл port_logger (или как там он назван) в report.01.base
«Аппаратно-сетевой вариант» — COM-порт в TCP + netcat (для систем, в которых есть netcat) — как консоль в лекциях.
- Настройте эмуляцию COM-порта — перенаправление ввода-вывода в поток TCP/IP например, на порт 2010
- После старта вируталки в хост-системе запустите
# netcat localhost 2010 > report.01.base
- В виртуалке проделайте обе команды (перенастройку ttyS1 и перенаправление файла с отчётом)
На хост-системе скажите netcat-у ^D (Это control+D)
Отчёт — это tar-архив
На хост-системе нужно проверить, что он не попортился при передаче, с помощью tar tvf report.01.base
Д/З
Внимание:
новый Образ!
Не забудьте про замечание относительно LC_ALL (как минимум в Linux)
Задание 1
Дважды склонировать базовый образ (виртуалки будут называться base и second)
Настроить COM2 в двух образах на работу с сокетом («настройки ВМ → COM-порты» «Порт2 → хост-канал» + какое-нибудь имя, например, vboxport; см. подсказку VirtualBox-а, как это должно называться под Windows — там хитро)
На одном хосте поставить «подключаться к уже существующему каналу», на другом — нет (он-то будет открывать сокет)
- Если хотите сделать то же самое из командной строки, то у меня получилось так:
- В результате запись в COM2 на одной машине должна приводить к чтению из COM2 на другой и наоборот
- Отчёты:
На базовой машине (report 1 base)
stty -a < /dev/ttyS1
stty raw -echo < /dev/ttyS1
stty -a < /dev/ttyS1
cat /dev/ttyS1
после получения текста нажать ^C (Это control+C)
- (не забыть ^D для остановки отчёта)
На клоне (report 1 second)
stty -a < /dev/ttyS1
stty raw -echo < /dev/ttyS1
date > /dev/ttyS1
stty -a < /dev/ttyS1
- (не забыть ^D для остановки отчёта)
Получить оба отчёта с виртуалок. Например, перенастроить на обеих машинах COM2 для получения через него отчёта в файл, и тем же cat засунуть его туда
Оба отчёта (report.01.base и report.01.second) именно с такими названиями переслать одним письмом в качестве двух приложений на uneexlectures@cs.msu.ru
В теме письма должно встречаться слово LinuxNetwork2024
Перед отправкой обязательно проверьте, что отчёт не битый и открывается как tar.gz-архив! Если он побирся, возможно, вы не сделали stty raw -echo.