 | Уровень сложности: средний М. Тим Джонс, инженер-консультант, Emulex
27.12.2007 Интерфейс SCSI (Small Computer Systems Interface, интерфейс малых вычислительных систем) представляет собой набор стандартов, которые определяют интерфейс и протоколы для связи с большим числом устройств (главным образом, устройств хранения). В Linux® реализована подсистема SCSI, обеспечивающая связь с этими устройствами. Linux является отличным примером многоуровневой архитектуры, которая объединяет драйверы высокого уровня, например, диска или CD-ROM, с физическими интерфейсом, таким как Fibre Channel или Serial Attached SCSI (SAS). В этой статье мы рассказываем о SCSI-подсистеме Linux и обсуждаем пути ее будущего развития.
GNU/Linux и SCSI являются естественной парой, поскольку оба имеют схожие характеристики в соответствующих им средах. GNU/Linux является безопасной и надёжной операционной системой, работающей без сбоев. SCSI - очевидный выбор для надежных и высокопроизводительных устройств хранения. Кроме того, обе системы имеют открытый исходный код. Вы можете загрузить и прочитать различные спецификации SCSI с сайта технического комитета T10 Международного комитета по стандартам информационных технологий (INCITS). Точно так же вы можете загрузить исходный код GNU/Linux, чтобы разобраться в его реализации. Каждая из этих технологий доминирует в соответствующей отрасли, поэтому неудивительно, что GNU/Linux поддерживает SCSI лучше, чем какая бы то ни было другая операционная система.
Эволюция SCSI
SCSI - это очень интересный для изучения интерфейс, поскольку он является одним из старейших интерфейсов, который продолжает развиваться и по сей день. Первый стандарт SCSI, SCSI-1, был создан Shugart Associates примерно в 1979 году. SCSI-1 определяет 8-битный параллельный интерфейс с частотой синхронизации 5 МГц, обеспечивающий максимальную скорость передачи данных 5 мегабайт в секунду (МБ/с).
Стандарт SCSI-2 был разработан в 1985 году и отличался в два раза большей тактовой частотой (10 МГц) и более широкой шиной (16 бит). SCSI-2, получивший название Fast/Wide SCSI, обеспечивает скорости передачи данных до 20 МБ/с, он обратно совместим со SCSI-1, хотя и со скоростью SCSI-1.
Разработка SCSI-3 началась в 1993 году; на самом деле он представляет собой набор стандартов, определяющих протоколы, команды и методы сигнализации. Под именем SCSI-3 объединяются стандарты параллельного SCSI под названием Ultra и современных последовательных протоколов на базе SCSI, к которым относятся IEEE 1394 (FireWire), Fibre Channel, Internet SCSI (iSCSI) и новика в этой серии - SAS. Эти стандарты изменили ситуацию на рынке устройств хранения, предоставив технологии сетей хранения данных (такие как FC-AL и iSCSI), увеличив скорость передачи данных до уровня, превышающего 1 гигабит в секунду (Гбит/с), повысив количество адресуемых устройств до более чем 100, а также увеличив максимальную длину кабеля более чем до 25 метров. На рисунке 1 показана эволюция скорости передачи данных SCSI с 1986 по 2007 годы.
Рисунок 1. Эволюция скорости передачи данных SCSI
Действующие лица SCSI
В SCSI реализуется клиент-серверная архитектура связи. Инициатор отправляет запросы команд целевым устройствам. Целевое устройство обрабатывает запрос и направляет ответ инициатору. Инициатор может представлять устройство SCSI клиентского компьютера, а целью SCSI может быть дисковый накопитель, CD-ROM, накопитель на магнитной ленте или специальные устройства, например, сервис мониторинга блока накопителей.
Команды SCSI
Несмотря на то, что транспортные протоколы SCSI изменялись с годами, команды SCSI сохранили многие свои первоначальные элементы. Команда SCSI определяется в блоке дескриптора команды (Command Descriptor Block, CDB). В CDB содержится код операции, определяющий ту или иную операцию, которую необходимо выполнить, и несколько параметров для этой операции.
Команды SCSI поддерживают чтение и запись данных (по четыре варианта каждого действия) и ряд команд, не относящихся к данным, например test-unit-ready (проверка готовности устройства), inquiry (получение основной информации о целевом устройстве), read-capacity (получение ёмкости целевого устройства), и т.д. Набор команд, поддерживаемых целевым устройством, зависит от типа устройства. Инициатор определяет тип устройства посредством команды inquiry. В таблице 1 перечислены наиболее распространённые команды SCSI, которые могут вам встретиться.
Таблица 1. Распространенные команды SCSI
| Команда | Назначение |
|---|
| Test unit ready | Запрашивает, готово ли устройство к передаче данных |
|---|
| Inquiry | Запрашивает основную информацию об устройстве |
|---|
| Request sense | Запрос информации по ошибке выполнения предыдущей команды |
|---|
| Read capacity | Запрашивает информацию о ёмкости устройства хранения |
|---|
| Read | Чтение данных с устройства |
|---|
| Write | Запись данных на устройство |
|---|
| Mode sense | Запрос страниц конфигурации (параметров устройства) |
|---|
| Mode select | Настройка параметров устройства на странице конфигурации |
|---|
В SCSI реализовано около шестидесяти команд для широкого спектра устройств (включая устройства с произвольным доступом, такие как диски, и устройства с последовательным доступом, такие как лента). В SCSI также реализованы особые команды для доступа к сервисам enclosure services (например, запрос текущих параметров состояние и температуры в корпусе устройства хранения). Дополнительную информацию можно найти в разделе Ресурсы.
Архитектура SCSI в ядре Linux
На рисунке 2 показаны места взаимодействия подсистемы SCSI и ядра Linux. Над ядром находится интерфейс системных вызовов, который обрабатывает маршрутизацию вызовов из пространства пользователя соответствующей цели в ядре (например, открытие, чтение и запись). Уровень абстракции для множества файловых систем, поддерживаемых ядром, предоставляет виртуальная файловая система (VFS) Она берет на себя отправку запросов соответствующей файловой системе. Связь с большинством файловых систем производится через буферный кэш, который оптимизирует доступ к физическому устройству путём кэширования последних использованных данных. Далее располагается уровень драйверов блочных устройств, который может содержать различные блочные драйверы для расположенных ниже устройств. Одним из таких драйверов блочных устройств является подсистема SCSI.
Рисунок 2. Места взаимодействия подсистемы SCSI и ядра Linux
Аналогично другим основным подсистемам ядра Linux, подсистема SCSI реализована в многоуровневой архитектуре с тремя различными уровнями. Так называемый верхний уровень представляет интерфейс высокого уровня ядра для SCSI и драйверы устройств основных типов. Далее идёт средний уровень, также называемый общим или объединяющим уровнем. На этом уровне располагаются общие сервисы для верхнего и нижнего уровней стека SCSI. И, наконец, нижний уровень представляет фактические драйверы для физических интерфейсов, связанных со SCSI (смотри рисунок 3).
Рисунок 3. Многоуровневая архитектура подсистемы SCSI в Linux
Исходный код подсистемы SCSI (верхний и средний уровни SCSI, а также множество драйверов) можно найти в ./linux/drivers/scsi. Структуры данных SCSI могут находиться в директории исходных кодов SCSI и в ./linux/include/scsi.
Верхний уровень SCSI
Верхний уровень подсистемы SCSI представляет интерфейс ядра самого высокого уровня (уровень устройства). Он состоит из набора драйверов блочных (дисков и CD-ROM SCSI) и символьных устройств (ленточных накопителей SCSI и базовых устройств SCSI). Верхний уровень принимает запросы от расположенных выше систем (например, VFS) и преобразует их в запросы SCSI. Верхний уровень также выполняет команды SCSI и уведомляет вышестоящий уровень о состоянии их выполнения.
Драйвер дисков SCSI реализован в ./linux/drivers/scsi/sd.c. Драйвер дисков SCSI инициализируется вызовом register_blkdev (как блочное устройство) и предоставляет общий набор функций, выполняемых всеми устройствами SCSI посредством вызова scsi_register_driver. Наиболее интересны из них sd_probe и sd_init_command. При подключении к системе нового устройства SCSI вызывается функция sd_probe среднего уровня SCSI. Функция sd_probe определяет, будет ли устройство управляться драйвером дисковых устройств SCSI, и если это так, создаёт новую структуру scsi_disk, представляющую это устройство. Функция sd_init_command принимает запрос от уровня файловой системы и преобразует его в команду записи или чтения SCSI (для выполнения запросов на ввод-вывод вызывается sd_rw_intr).
Драйвер ленточных накопителей SCSI реализован в ./linux/drivers/scsi/st.c. Драйвер ленточных накопителей представляет собой устройство последовательного доступа и регистрируется как символьное устройство с помощью register_chrdev_region. В драйвере ленточных накопителей SCSI также реализована функция проверки st_probe. Она создаёт новое ленточное устройство и добавляет его к вектору scsi_tapes. Уникальность драйвера ленточных накопителей SCSI состоит в том, что он по возможности выполняет ввод и вывод напрямую из пространства пользователя. В противном случае данные передаются через буфер драйвера.
Драйвер CD-ROM SCSI реализован в ./linux/drivers/scsi/sr.c. Драйвер CD-ROM также является блочным устройством и представляет набор функций, аналогичный набору функций драйвера дисковых накопителей SCSI. Функция sr_probe используется для создания структуры scsi_sd, представляющей устройство CD-ROM, а также для регистрации CD-ROM с помощью register_cdrom. Драйвер ленточных накопителей SCSI также экспортирует sr_init_command, которая преобразует запрос в запросы чтения и записи CD-ROM SCSI.
И, наконец, драйвер базового устройства SCSI реализован в ./linux/drivers/scsi/sg.c. Этот драйвер позволяет пользовательским приложениям отправлять устройствам команды SCSI (например, format, mode sense или диагностические команды). Использовать драйвер базового устройства SCSI из пространства пользователя можно посредством пакета sg3utils. В этом пакете пространства пользователя содержится множество утилит для отправки команд SCSI и обработки ответов на них.
Средний уровень SCSI
Средний уровень SCSI является уровнем общих служб для верхнего и нижнего уровней SCSI (реализован частично в ./linux/drivers/scsi/scsi.c). В нем реализованы функции, используемые драйверами верхнего и нижнего уровня; таким образом, он служит связующим элементом между этими уровнями. Этот уровень важен тем, что он абстрагирует реализацию драйверов нижнего уровня (LLD); частично он реализован в ./linux/drivers/scsi/hosts.c. Это позволяет использовать хост-адаптеры шины (HBA) Fibre Channel с различными интерфейсами одинаковым образом.
Средний уровень SCSI выполняет регистрацию драйверов нижнего уровня и обработку ошибок. На среднем уровне также реализованы команды SCSI для организации очереди между верхними и нижними уровнями. Ключевой функцией среднего уровня SCSI является преобразование запросов команд верхнего уровня в запросы SCSI. Кроме того, он управляет обработкой ошибок SCSI.
По существу, средний уровень действует посредником между верхним и нижнем уровнями подсистемы SCSI. Он принимает запросы на выполнение операций SCSI и организует очередь обработки (как можно увидеть в ./linux/drivers/scsi/scsi_lib.c). После завершения выполнения этих команд он получает ответ SCSI от драйверов нижнего уровня и уведомляет верхний уровень о завершении выполнения запроса.
Одним из наиболее важных аспектов среднего уровня является обработка ошибок и тайм-аутов. Если команда SCSI не выполнена в приемлемое время или на запрос SCSI была возвращена ошибка, средний уровень обрабатывает ошибку или повторяет запрос. Средний уровень также управляет восстановлением более высокого уровня, например, запросами на сбросSCSI или HBA (LLD). Обработчик ошибок и тайм-аутов SCSI реализован в ./linux/drivers/scsi/scsi_error.c.
Нижний уровень SCSI
На нижнем уровне расположен набор драйверов, называемых драйверами SCSI нижнего уровня. Это специализированные драйверы, которые предоставляют интерфейсы к физическим устройствам, например, к HBA. Драйверы нижнего уровня обеспечивают абстрагирование HBA конкретных устройств от общего среднего уровня. Каждый драйвер нижнего уровня предоставляет интерфейс к определенному оборудованию, но имеет стандартный набор интерфейсов для среднего уровня.
На нижнем уровне содержится большая часть кода, поскольку он учитывает различные вариации типов адаптеров SCSI. Например, в протокол Fibre Channel входят драйверы нижнего уровня для адаптеров Emulex и QLogic. В число драйверов нижнего уровня для адаптеров SAS входят драйверы для адаптеров Adaptec и LSI.
Будущее Linux и SCSI
Можно с уверенностью сказать, что у SCSI есть будущее, и его место будет в Linux. С развитием SCSI Linux будет поддерживать самые современные усовершенствования. Linux поддерживает новый протокол SAS с драйверами для целого ряда HBA. По мере развития протокола до более высоких скоростей (например, до 6 Гбит/с в SAS или 8 Гбит/с в FC) Linux будет оставаться на передовой разработки и внедрения.
Также Linux будет оставаться на переднем крае создания новых протоколов SCSI. Среди них важно упомянуть Fibre Channel over Ethernet (FCoE). FCoE является наложением кадров Fibre Channel на полнодуплексные сети Ethernet (как правило, 1 Гбит/с или 10 Гбит/с). Протокол FCoE важен потому, что он объединяет наиболее распространённый протокол сетевых устройств хранения с наиболее распространённой сетевой средой. За этой технологией определенно следует наблюдать, и Linux будет в ней присутствовать.
Также ожидается выход комплексной защиты данных в SCSI на основе нового стандарта целостности данных T10. Этот стандарт добавляет в каждый сектор поле контроля целостности данных (DIF), поддерживающее защиту данных на носителях. Новое 8-байтовое поле DIF содержит циклический избыточный код (CRC) для защиты данных, ссылочную метку для защиты от неверно направленной записи, а также метку приложения. Метка приложения соответствует конкретному приложению и определяет назначение данных — например, часть документа PDF. Дополнительную информацию можно найти в разделе Ресурсы.
Заключение
Ядро Linux - это классический пример абстрактной многоуровневой архитектуры. Оно объединяет отдельные файловые системы различных типов с различными физическими средами хранения данных. Когда эти среды связаны со SCSI, подсистема SCSI преобразует общие блочные запросы Linux в запросы SCSI для определенных устройств. С годами сама подсистема SCSI претерпела множество изменений, и они ещё не закончены. В Linux реализуются новые технологии, в том числе комплексная защита данных и новые протоколы, например, FCoE.
Ресурсы Научиться
- Оригинал статьи Anatomy of the Linux SCSI subsystem (EN).
- Дополнительную информацию о различных спецификациях SCSI, от базовых команд SCSI до новейших протоколов SCSI, например, SAS, можно получить на сайте Технического комитета T10.
- В этой статье Лаборатории разработки открытого исходного кода (EN)
обсуждается ядро 2.6 и драйвер дисковых устройств SCSI, а также подробно рассматривается реализация SCSI в ядре Linux.
-
Список инструментов пространства пользователя для просмотра, запросов и управления устройствами SCSI, использующих базовый драйвер SCSI в ядре Linux. (В Linux поддерживается целый ряд инструментов для SCSI, включая sg3utils, упомянутый в этой статье.)(EN)
-
Анатомия ядра Linux (EN)" (developerWorks, июнь 2007 г.) содержит общий обзор ядра Linux и всех основных его подсистем.
-
Управление ядром с помощью системных вызовов Linux (EN)" (developerWorks, март 2007 г.) рассматривает интерфейс системных вызовов ядра Linux (от вызовов из пространства пользователя до их выполнения ядром).
-
Анатомия сетевого стека Linux (EN)" (developerWorks, июнь 2007 г.) знакомит с базовой архитектурой сетевого стека Linux, в том числе с основными составляющими его компонентами и структурами.
-
Анатомия файловой системы Linux (EN) " (developerWorks, октябрь 2007 г.) описывает виртуальную файловую систему (VFS)—часто называемую виртуальным коммутатором файловой системы—ядра Linux и рассматривает некоторые основные структуры, связывающие вместе файловые системы.
-
Fibre Channel over Ethernet (FCoE) - один из интересных протоколов SCSI, выход которого планируется в ближайшем будущем. Он ещё не готов, но активно разрабатывается несколькими производителями. (EN)
- Прочтите эту спецификацию методики Data Integrity Field (DIF) для комплексной защиты данных. DIF реализует защиту диска, обнаруживает неверно направленную запись, а также позволяет указывать метки приложений, обеспечивающих дополнительную защиту данных. Технология DIF разработана несколькими поставщиками, а это обозначает, что она будет поддерживаться дисками и HBA многих производителей. (EN)
- В разделе Linux сайта developerWorks можно найти дополнительные ресурсы для разработчиков Linux, а также самые популярные среди наших читателей статьи и руководства. (EN)
- Посмотрите все
советы по Linux
и
руководства Linux
на сайте developerWorks.
- Следите на последними новостями на портале Web-трансляций и технических мероприятий developerWorks. (EN)
Получить продукты и технологии
Обсудить
Об авторе  | |  | M. Тим Джонс (M. Tim Jones) является архитектором встраиваимого программного
обеспечения и автором работ: Программирование Приложений под GNU/Linux,
Программирование AI-приложений и Использование BSD-сокетов в различных
языках программирования. Он имеет опыт разработки процессоров для геостационарных
космических летательных аппаратов, а также разработки архитектуры встраиваемых
систем и сетевых протоколов. Сейчас Тим работает инженером-консультантом в корпорации
Эмулекс (Emulex Corp.) в г.Лонгмонт, Колорадо. |
Выскажите мнение об этой странице
|  |