Олег Ларин
Олег Ларин

NVMe-oF/TCP: поддержка ОС и платформами виртуализации

21 минута
635
0

Введение
К настоящему времени поддержка основных и новых функций NVMe-oF/TCP реализована в составе всех основных open source ОС: Linux/Red Hat (RHEL 9.X), SUSE (SLES 15 SP4 и SP5), Ubuntu Ubuntu 22.04), а также в ряде платформ виртуализации, среди которых можно назвать версию 8.1 VMware vSphere, в которой реализована end to end поддержка NVMe-oF/TCP. Это дает возможность развертывания широкого набора приложений с использованием новых низколатентных ИТ инфраструктур на базе NVMe-oF/TCP.

Поддержка NVMe oF/TCP в составе ОС SUSE

Централизованное обнаружение конечных устройств

В SLES 15 SP4 для поддержки новых функций NVMe, таких как централизованный контроллер обнаружения (CDC, Centralized Dis- covery Controller), пакет nvme-cli обновлен до версии 2.0 и добавле- ны два новых пакета: libnvme версии 1.0 и nvme-stas версии 1.0 (https:/

/www.suse.com/releasenotes/x86_64/SUSESLES/15-SP4/index.html).

NVMe-oF страдает от известной проблемы обнаружения, которая существенно ограничивает размер реалистичных развертываний. Чтобы решить эту проблему обнаружения, благодаря недавно добавленным и обновленным пакетам в 15 SP4 теперь можно управлять NVMe-oF через «сетецентрический» (централизованный контроллер обнаружения) процесс подготовки вместо “end node-centric” (Direct Discovery Controller, DDC) подхода, используя следующие преимущества:

автоматическое обнаружение NVMe-oF CDC в IP-сети и предотвращение ручного конфигурирования пользователем IP-адреса контроллеров обнаружения;

– CDC позволяет пользователям управлять подключением из единой точки управления на основе IP Fabric by IP Fabric. Следует иметь в виду, что пользователь по-прежнему может выполнять явную регистрацию в CDC и DDC.

Загрузка по сети с NVMeoF через TCP (по состоянию на 05.07.2023 г.)

SLES поддерживает загрузку с NVMe-oF через TCP в соответствии со спецификацией загрузки NVM Express® 1.0 (https:// nvmexpress.org/wpcontent/uploads/NVMExpressBootSpecification– 2022.11.15-Ratified.pdf).

Предзагрузочную среду UEFI можно настроить для попыток подключения NVMe-oF через TCP к удаленным серверам хранения и использования их для загрузки. Предзагрузочная среда создает таблицу ACPI — таблицу загрузочного микропрограммного обеспечения NVMe (NBFT, NVMe Boot Firmware Table) для хранения информации о конфигурации NVMe-oF, используемой для загрузки. Операционная система использует эту таблицу на более позднем этапе загрузки для настройки сети и соединений NVMe-oF для доступа к корневой файловой системе.

Загрузка с NVMe-oF через TCP поддерживается при следующих условиях (https://www.suse.com/support/kb/doc/?id=000021116):

  • SUSE Linux Enterprise Server 15 с пакетом обновления 5 или более поздней версии;
  • массив хранения SAN, поддерживающий NVMe-oF/TCP;
  • хост-система с BIOS, поддерживающая загрузку с NVMe-oF/TCP.

Более подробная информация доступна в Руководстве по администрированию хранилища SLES15 SP5 (https://documentation.suse.com/ sles/15-SP5/html/SLESall/chanvmeof.html).

Известные проблемы

Загрузка с NVMe-oF через TCP — это недавняя разработка как со стороны BIOS, так и со стороны операционной системы.

Несмотря на то, что для обеспечения стабильной работы этой функции были предприняты большие усилия, она все еще является но- вой для производственных сред. Среди существующих проблем можно отметить следующие:

  • NetworkManager в настоящее время не поддерживается.

Загрузка с NVMe-oF через TCP в настоящее время требует использования wicked для управления сетью.

Хотя загрузка с помощью NetworkManager может работать, NetworkManager не будет знать об особой природе сетевых интерфейсов nbft$X. Он может попытаться перенастроить их или отключить, что опасно для сетевых подключений, необходимых для доступа к корневой файловой системе – wicked реализует логику для правильной работы с интерфейсами nbft$X.

Поддержка NetworkManager будет добавлена в более позднем пакете обновления SLE 15;

  • различные шлюзы на нескольких сетевых интерфейсах.

Маршрутизация в несвязанные подсети через разные шлюзы через несколько сетевых интерфейсов не поддерживается для загрузки NVMe-oF через TCP.

В таких конфигурациях может случиться так, что некоторые целевые подсистемы NVMe недоступны для операционной системы на хосте. В настоящее время это ограничение вызвано различными базовыми концепциями маршрутизации между предзагрузочной средой UEFI и операционной системой Linux.

Чтобы избежать этой проблемы, следует убедиться, что все подсистемы NVMe, необходимые для загрузки, либо подключены к хосту в сегментах локальной сети (маршрутизация/шлюз не требуются), либо доступны через один шлюз по умолчанию;

  • проблемы с многопутевым подключением (multipath).

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

Эта проблема была исправлена в ранних обновлениях обслуживания dracut, nvme-cli и wicked, выпущенных в июне 2023 г.;

  • MTU и другие параметры соединения.

Установка атрибутов соединения Ethernet, таких как максимальный размер блока передачи (MTU, Maximum Transmission Unit) для интерфейсов nbft$X, в настоящее время не поддерживается.

Этого можно добиться, создав собственное правило udev и включив его в файл initramfs.

Поддержка NVMe-oF для виртуальных машин доступна с улучшенными  образами   BIOS   OVMF,   которые   можно   получить в Timberland SIG (https://github.com/timberland-sig).

nvmecli в SLE 15 SP5 (GA) поддерживает только устаревший синтаксис nvme shownbft, который позднее был заменен на nvme nbft show. Обновление обслуживания nvmecli в SLE 15 SP5 будет поддерживать обе команды.

Поддержка NVMe-oF/TCP в Linux

В конфигурировании NVMe/TCP режим хоста полностью поддерживается, а настройка контроллера не поддерживается (https:// access.redhat.com/documentation/ruru/red_hat_enterprise_linux/9/ html/managing_storage_devices/configuringnvmeoverfabricsusingnvmetcp_managingstoragedevices).

Чтобы развернуть установку NVMe/TCP необходимо выполнить:

  • настройку хоста NVMe/TCP;
  • подключение хоста NVMe/TCP к контроллеру NVMe/TCP.

В Red Hat Enterprise Linux 9 встроенная многопутевая передача NVMe включена по умолчанию. Включение многопутевого подключения DM не поддерживается для NVMe/TCP.

Библиотека libnvme содержит как nvme cli, так и nvme-stas. nvme cli используется для ручного конфигурирования (one-shot) configu- ration, nvme-stas – для динамического/автоматизированного обнаружения СХД (табл. 1, [7]).

Для настройки хоста NVMe/TCP используется процедура nvme-cli

через CLI-интерфейс.

nvmestas — это проект Linux с открытым исходным кодом, который предоставляет [8] (https://github.com/linuxnvme/nvmestas):

  • клиента центрального контроллера обнаружения (CDC, Cen- tral Discovery Controller) для Linux;

NVMe-oF/TCP: поддержка ОС и платформами виртуализации - 1

Табл. 1: Сравнение особенностей библиотек nvme-stas и nvme-cli

  • обработку асинхронных уведомлений о событиях (AEN, Asyn- chronous Event Notifications);
  • автоматическое управление подключением к подсистеме NVMe;
  • обработку ошибок и создание отчетов;
  • автоматическую (zeroconf) и ручную настройку nvme-stas, состоящую из двух служб – staf и staс и работающих на хосте. Для этого используется недавно выпущенная libnvme 0 для связи с драйвером nvme ядра Linux (рис. 1).

STAF (STorage Appliance Finder) — поиск устройств для хранения данных. Задачи, выполняемые STAF, включают:

  • регистрацию в демоне Avahi для службы типа _nvme-disc._tcp. Это позволяет STAF находить центральные контроллеры или контроллеры прямого обнаружения (CDC, DDC) с автоматической инициализацией (ZTP). STAF также позволяет пользователям вручную вводить CDC и DDC в файл конфигурации ( / etc/stas/stafd.conf), когда пользователи предпочитают не использовать ZTP;
  • подключение к обнаруженным или настроенным CDC или DDC;
  • получение списка подсистем хранения с помощью команды

«получить страницу журнала»;

NVMe-oF/TCP: поддержка ОС и платформами виртуализации - 2

Рис. 1. Блок-схема взаимодействия служб nvme-stas.

  • поддержание кэша обнаруженных подсистем хранения;
  • обеспечение интерфейса D-Bus, с помощью которого сторонние приложения могут получать данные о подключениях контроллера обнаружения (например, страницы журнала).

STAC (STorage Appliance Connector) — соединитель устройств хранения данных. Задачи, выполняемые STAC, включают:

  • чтение списка подсистем хранения от STAF через D-Bus;
  • подобно STAF, STAC также может считывать список подсистем хранения для подключения из файла конфигурации;
  • настройку соединения контроллера ввода/вывода;
  • обеспечение интерфейса D-Bus, с помощью которого сторонние приложения могут получать данные о подключениях контроллера ввода-вывода.

Репозиторий nvme-stas на GitHub: https://github.com/linuxnvme/ nvmestas.

Linux ограничивает количество членств в группах многоадресной рассылки, к которым может принадлежать хост. Значение по умолчанию — 20. Чтобы Avahi мог отслеживать пакеты mDNS (много- адресная DNS) на всех интерфейсах, хост-компьютер должен иметь возможность зарегистрировать одну группу многоадресной рассылки для каждого интерфейса. Это могут быть физические или логические интерфейсы. Например, настройка 10 VLAN на физическом интерфейсе увеличивает общее количество интерфейсов на

  1. Если общее количество интерфейсов превышает ограничение в 20, Avahi не сможет отслеживать все интерфейсы.

End-to-end поддержка NVMe-oF/TCP в VMware vSphere 8.1

Компания VMware объявила о поддержке протокола хранения NVMe/TCP в выпуске VMware vSphere 7 Update 3 в сентябре 2021 г. [1]. Среди первых партнеров VMware, реализовавших поддержку NVMe/TCP в составе своих решений, были Dell и Lightbits. Далее о поддержке NVMe/TCP объявили NetApp, PureStorage (добавлена в Purity 6.4.2.), Pavilion (3 мая 2022 г., https://pavilion.io/press/ pavilion-achieves-vmware-certification-for-nvme-of-flash-array/), Infinidat (13 окт. 2022 г.) и др.

В ноябре 2022 г. стала доступна (GA) VMware vSphere 8. Среди расширений, касающихся NVMe-oF, следующие (https:// blogs.vmware.com/virtualblocks/2022/09/20/vsphere-8-corestoragewhatsnew/):

  • увеличено количество поддерживаемых пространств имен и путей как для NVMe-TCP, так и для NVMe-FC. Теперь поддерживается 256 пространств имен и 2 КБ путей с NVMe-TCP и NVMe-FC;

NVMe-oF/TCP: поддержка ОС и платформами виртуализации - 3

Рис. 2. End-to-end поддержка инфраструктуры для NVMe.

  • расширена поддержка резервирования устройств NVMe для клиентов, использующих поддержку Microsoft WSFC для блокировки дисков на уровне приложений. Это позволяет клиентам использовать возможности Clustered VMDK для использования с Microsoft WSFC с хранилищами данных NVMe-oF (обратите внимание, изначально только FC);
  • добавлена поддержка расширенных служб обнаружения (Ad- vanced NVME-oF Discovery Services) NVMe-oF в ESXi, чтобы помочь клиентам с настройкой NVMe-oF в среде Ethernet. Также добавлена поддержка NVMe Advance Discovery. Это позволяет vSphere запрашивать в сети поддерживаемые контроллеры массива NVMe, упрощая настройку;
  • добавлена поддержка NVMe over Fabrics (NVMeoF) для виртуальных томов vSphere (vVols, vSphere Virtual Volumes) в vSphere 8 (https://blogs.vmware.com/virtualblocks/2022/09/15/whats-new- with-vvols-vsphere-8/). Многие поставщики массивов и представители отрасли переходят на протокол NVMe-oF для повышения производительности и пропускной способности по сравнению с традиционными подключениями SCSI и NFS (сетевая файловая система). Благодаря этому объявлению клиенты могут воспользоваться преимуществами высокопроизводительных массивов хранения NVMe-oF и управлять ими в хранилище данных vVol с помощью управления на основе политик хранения (SPBM, Storage Policy Based Management) в vCenter.

vVols поддерживает NVMeoF /TCP

Большое объявление для vVols в vSphere 8 — поддержка NVMe-oF. Это новая спецификация vVols , vSphere API (интерфейсы прикладного программирования) для VASA (vSphere Storage APIs for Storage Awareness) 4.0.

NVMe-oF обеспечивает лучшую производительность и меньшую задержку по сравнению с обычным SCSI. NVMe разработан для флэш-памяти, и подключение к массиву флэш-памяти NVMe с использованием SCSI является неотъемлемым узким местом. С NVMe-oF vVols каждый объект vVol становится пространством имен NVMe. Затем эти пространства имен группируются в группу ANA (Asymmetrical Namespace Access – асимметричный доступ к пространству имен). В NVMe многие команды являются внутриполосными (In-Band) для более эффективной связи между хостами vSphere и массивом.

В vSphere 8 была упрощена настройка NVMe в vVols. При развертывании NVMe в vCenter после регистрации VASA основная настройка выполняется в фоновом режиме, а обнаружение контроллера NVMe выполняется автоматически. После создания datastore vPE (virtual Protocol Endpoints) и соединение управляются VASA.

При анонсировании vSphere 8 была добавлена поддержка NVMe-FC для виртуальных томов (vVols). В vSphere 8 U1 (20 марта 2023 г.) эта поддержка была расширена для транспорта NVMe-TCP, что позволило создать идеальный союз NVMeoF и vVols [6]. В отличие от datastore на базе VMFS, с vVols работать проще и удобнее – гораздо меньше ограничений и больше автоматизации управления.

С выходом vSphere 8 U1 поддержка NVMe стала полностью законченной (рис. 2) без каких-либо преобразований SCSI в NVMe на любом из уровней ESXi. Это огромный последний шаг в реализации всех возможностей NVMe. Теперь, с поддержкой ОС, протокол NVMe можно использовать от GOS (guest operating system) до конечного устройства/массива.

Подробнее о последних расширениях – https://core.vmware.com/blog/ vvols-nvme-perfect-match, https://blogs.vmware.com/vsphere/2023/03/ announcing-vsphere-8-update-1.html.

Настройка и конфигурирование NVMeoF/TCP в VMware vSphere

Настройка NVMe-TCP в vSphere проста и не требует специального оборудования [2]. NVMe-TCP использует стандартное аппаратное обеспечение Ethernet и может объединяться с другим трафиком. Рекомендуется выделить сетевые карты для NVMe-TCP для максимальной производительности, но это не обязательно. Следует отметить, что NVMe-TCP или NVMe, как правило, могут использовать большую часть, если не всю, доступную полосу пропускания. Впоследствии объединение NVMe-TCP с другим трафиком без достаточной пропускной способности может повлиять на другой сетевой трафик.

VMware (по состоянию на конец марта 2023 г.) через vSphere (из единого центра) полностью реализовала поддержку NVMe-oF/TCP на всех уровнях – от сервера до сети и хранилища томов. Это существенно отличается от других платформ, где поддержка NVMe-oF/ TCP реализована лишь, как правило, на одном из уровней (частично). Для настройки других уровней и их интеграции требуется уже другой инструментарий (или/и ручная настройка).

Помимо этого, в vSphere максимально полно реализована функциональность, связанная с поддержкой NVMe-oF/TCP, включая автоматическое обнаружение устройств [4,5].

Сервис Advanced NVMe-oF Discovery Service в ESXi обеспечивает динамическое обнаружение устройств совместимых со стандартами NVMe Discovery Service. ESXi будет использовать сервис mDNS/DNS- SD для получения такой информации, как IP-адрес и номер порта. ESXi отправляет многоадресный (multicast) DNS-запрос (mDNS), запрашивающий информацию от сущностей, предоставляющих службу обнаружения (NVMe) (DNS-SD). Если такая сущность активна в сети (по которой был отправлен запрос), она отправит хосту (одноадресный, unicast) ответ с запрашиваемой информацией – IP-адресом и номером порта, на котором запущена служба.

Конфигурирование сети NVMe-oF/TCP средствами VMware vSphere состоит из следующих шести основных этапов [2]:

  • настройка сети;
  • конфигурирование группы сетевых портов;
  • конфигурирование VMkernel;
  • конфигурирование адаптеров NVMe-TCP;
  • добавление контроллера хранилища;
  • создание нового

Для реализации архитектуры NVMe-oF/TCP необходимо выполнение следующих требований:

  • наличие поддержки NVMe-oF/TCP у NVMe-массива;
  • совместимость ESXi-хоста;
  • наличие Ethernet-адаптера;
  • установленного программного адаптера NVMe-oF/TCP. Этот программный компонент должен быть включен на хосте ESXi и подключен к соответствующему сетевому адаптеру;
  • установленного NVMe-контроллера, который добавляется после настройки программного адаптера NVMe -TCP.

Настройка сети (конфигурирование адаптеров для NVMe over TCP Storage)

Настройка сети состоит из следующих этапов:

  • настройка привязки VMkernel для NVMe/TCP-адаптера;
  • включение NVMe/TCP-адаптера;

добавление NVMe-oF-контроллера.

NVMe-oF/TCP: поддержка ОС и платформами виртуализации - 4

Рис. 3. Привязка порта для NVMe-TCP-адаптера.

NVMe-oF/TCP: поддержка ОС и платформами виртуализации - 5

Рис. 4. Пример топологии NVMe/TCP-сети.

Рекомендуется использовать port binding (связывание/привязка портов) при развертывании NVMe-TCP. Для этого необходимо создать vmkernel для каждой сетей карты, которая используется.

Привязка порта для NVMe-TCP включает создание виртуального коммутатора и подключение физического сетевого адаптера и адаптера VMkernel к виртуальному коммутатору. Благодаря этому соединению TCP-адаптер привязывается к адаптеру VMkernel. В конфигурации можно использовать стандартный коммутатор vSphere или распределенный коммутатор vSphere. Привязка порта для NVMe-TCP-адаптера показана на рис. 3.

Пример топологии NVMe/TCP-сети представлен на рис. 4. В этом примере два стандартных коммутатора vSphere и два сетевых адаптера (vmnic) на хосте обеспечивают высокую доступность. Они подключаются к двум внешним коммутаторам [3].

Если целевые контроллеры массива находятся в одной VLAN/подсети, можно использовать один коммутатор с несколькими группами портов. Если целевые контроллеры массива находятся в отдельных VLAN/подсетях, необходимо использовать отдельные коммутаторы для каждой VLAN/подсети. Настройка NVMe-TCP аналогична настройке iSCSI с той разницей, что используются виртуальные адаптеры NVMe. Виртуальный NVMe-адаптер создается для каждого vmkernel/NIC, используемого для NVMe-TCP.

Настройка привязки VMkernel для TCP-адаптера с помощью стандартного коммутатора vSphere

Можно настроить привязку порта VMkernel для TCP-адаптера, используя стандартный коммутатор vSphere и один восходящий канал на каждый коммутатор. Настройка сетевого подключения включает создание виртуального адаптера VMkernel для каждого физического сетевого адаптера. Используется сопоставление 1:1 между каждым виртуальным и физическим сетевым адаптером.

Адаптер NVMe/TCP не поддерживает такие функции объединения сетевых карт, как отработка отказа и балансировка нагрузки. Вместо этого для этих функций используется Storage Multipathing.

Настройка привязки VMkernel для TCP-адаптера с распределенным коммутатором vSphere

Можно настроить привязку порта VMkernel для TCP-адаптера с помощью распределенного коммутатора vSphere и одного восходящего канала на каждый коммутатор. Настройка сетевого подключения включает создание виртуального адаптера VMkernel для каждого физического сетевого адаптера. Используется сопоставление 1:1 между каждым виртуальным и физическим сетевым адап- тером. Как и для предыдущего варианта, адаптер NVMe/TCP не поддерживает такие функции объединения сетевых карт, как от- работка отказа и балансировка нагрузки. Вместо этого для этих функций используется Storage Multipathing.

NVMe-oF/TCP: поддержка ОС и платформами виртуализации - 6

Табл. 2. Типы поддерживаемых хранилищ vCenter Server и ESXi

Включение NVMe/TCP-адаптера

Для включения NVMe/TCP-адаптера используется vSphere Client.

Добавление NVMeoF-контроллера массива

Для добавления контроллера NVMe используется vSphere Client. После добавления контроллера пространства имен NVMe, связанные с контроллером, становятся доступными для хоста ESXi. Устройства хранения NVMe, представляющие пространства имен в среде ESXi, отображаются в списке устройств хранения.

Создание нового datastore

Хранилища данных — это логические контейнеры, аналогичные файловым системам, которые скрывают специфику физического хранилища и предоставляют единую модель для хранения файлов виртуальных машин. Хранилища данных также можно использовать для хранения образов ISO, шаблонов виртуальных машин и образов дискет.

vCenter Server и ESXi поддерживают 4 типа хранилищ данных: VMFS (vSphere Virtual Machine File System; версия 5 и 6), NFS (вер- сия 3 и 4.1), vSAN, vVol (табл. 2). Для работы по протоколу NVMe-TCP предназначен тип VMFS (рекомендуется версии 6).

При конфигурировании и настройке инфраструктуры NVMe-TCP следует обратить внимание на следующие факторы:

  • необходимо убедиться в достаточной пропускной способности сети при объединении NVMe-TCP с другим трафиком vSphere. Если возможно, выделите сетевые карты для NVMe-TCP, чтобы добиться максимально возможной производительности;
  • необходимо обязательно выполнить необходимые действия на всех хостах vSphere, подключенных к целевому тому NVMeoF (пространство имен);
  • нельзя добавлять NQN*) (NVMe Qualified Name) хоста к существующему тому iSCSI . Следует создавать новые профили хоста NVMe для целевых томов NVMe;
  • можно подключиться к одному и тому же массиву через SCSI и NVMe одновременно, но нельзя подключиться к одним и тем же целям. Например, может быть хранилище данных iSCSI LUN и хранилище данных пространства имен NVMe-TCP из одного массива, подключенного к одному и тому же набору хостов

Источники, доп. ресурсы

[1] Announcing NVMe/TCP Support with VMware vSphere 7 Up-date 3, September 28, 2021 – https://blogs.vmware.com/vsphere/ 2021/09/announcing-nvme-tcp-support-vmware-vsphere-7-up- date-3.html.

[2] Configuring NVMeoF TCP – https://core.vmware.com/resource/ configuring-nvmeof-tcp.

[3] vSphere VMware vSphere 8.0. VMware ESXi 8.0. vCenter Server 8.0 – https://docs.vmware.com/en/VMware- vSphere/8.0/vsphere-esxi-vcenter-80-storage-guide.pdf.

[4] VMware vSphere 0. Release Notes – https://docs.vmware.com/ en/VMware-vSphere/8.0/rn/vmware-vsphere-80-release- notes.pdf.

[5] What’s New with vSphere 8 Core vSphere 8 Update 1 – https://core.vmware.com/resource/whats-new-vsphere-8-core- storage.

[6] vVols with NVMe – A Perfect February 09, 2023 – https://core.vmware.com/blog/vvols-nvme-perfect-match.

[7] NVMe/TCP: Performance, Deployment and Automation, Erik Smith, Dell Technologies, Christine McMonigal, Intel. July 19, 2023 – https://www.snia.org/educational-library/nvme-tcp-per- formance-deployment-and-automation-2023.

[8] SDC2022 – STorage Appliance Services (nvme-stas). 3 янв. 2023 – https://www.youtube.com/watch?v=kbHSmm6X7TA.

[9] NVMe®/TCP Q&A, August 7, 2023 – https://sniansfblog.org/ nvme-tcp-qa/.

Авторы: Гантимуров А.П., Калашник А.Г.


*) Подсистема NVMe представляет собой массив хранения, который может включать несколько контроллеров NVMe, несколько пространств имен, энергонезависимую память и интерфейс между контроллером и энергонезависимой памятью. Подсистема идентифицируется квалифицированным именем NVMe (NQN, NVMe Qualified Name) подсистемы.

FavoriteLoadingОтслеживать

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Максимальный размер загружаемого файла: 0 Б. Вы можете загрузить: изображение, аудио, видео, документ, таблица, интерактив, текст, архив, код, другое. Ссылки на YouTube, Facebook, Twitter и другие сервисы, вставленные в текст комментария, будут автоматически встроены. Перетащите файл сюда

Последние статьи

Top