Анатомия подсистемы SCSI в Linux

Введение в многоуровневую архитектуру SCSI

Интерфейс SCSI (Small Computer Systems Interface, интерфейс малых вычислительных систем) представляет собой набор стандартов, которые определяют интерфейс и протоколы для связи с большим числом устройств (главным образом, устройств хранения). В Linux® реализована подсистема SCSI, обеспечивающая связь с этими устройствами. Linux является отличным примером многоуровневой архитектуры, которая объединяет драйверы высокого уровня, например, диска или CD-ROM, с физическими интерфейсом, таким как Fibre Channel или Serial Attached SCSI (SAS). В этой статье мы рассказываем о SCSI-подсистеме Linux и обсуждаем пути ее будущего развития.

М. Тим Джонс, инженер-консультант, Emulex

M. Тим Джонс (M. Tim Jones) является архитектором встраиваимого программного обеспечения и автором работ: Программирование Приложений под GNU/Linux, Программирование AI-приложений и Использование BSD-сокетов в различных языках программирования. Он имеет опыт разработки процессоров для геостационарных космических летательных аппаратов, а также разработки архитектуры встраиваемых систем и сетевых протоколов. Сейчас Тим работает инженером-консультантом в корпорации Эмулекс (Emulex Corp.) в г.Лонгмонт, Колорадо.



27.12.2007

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 клиентского компьютера, а целью 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
Места взаимодействия подсистемы SCSI и ядра Linux

Аналогично другим основным подсистемам ядра Linux, подсистема SCSI реализована в многоуровневой архитектуре с тремя различными уровнями. Так называемый верхний уровень представляет интерфейс высокого уровня ядра для SCSI и драйверы устройств основных типов. Далее идёт средний уровень, также называемый общим или объединяющим уровнем. На этом уровне располагаются общие сервисы для верхнего и нижнего уровней стека SCSI. И, наконец, нижний уровень представляет фактические драйверы для физических интерфейсов, связанных со SCSI (смотри рисунок 3).

Рисунок 3. Многоуровневая архитектура подсистемы SCSI в Linux
Многоуровневая архитектура подсистемы 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.

Ресурсы

Научиться

Получить продукты и технологии

Обсудить

Комментарии

developerWorks: Войти

Обязательные поля отмечены звездочкой (*).


Нужен IBM ID?
Забыли Ваш IBM ID?


Забыли Ваш пароль?
Изменить пароль

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Профиль создается, когда вы первый раз заходите в developerWorks. Информация в вашем профиле (имя, страна / регион, название компании) отображается для всех пользователей и будет сопровождать любой опубликованный вами контент пока вы специально не укажите скрыть название вашей компании. Вы можете обновить ваш IBM аккаунт в любое время.

Вся введенная информация защищена.

Выберите имя, которое будет отображаться на экране



При первом входе в developerWorks для Вас будет создан профиль и Вам нужно будет выбрать Отображаемое имя. Оно будет выводиться рядом с контентом, опубликованным Вами в developerWorks.

Отображаемое имя должно иметь длину от 3 символов до 31 символа. Ваше Имя в системе должно быть уникальным. В качестве имени по соображениям приватности нельзя использовать контактный e-mail.

Обязательные поля отмечены звездочкой (*).

(Отображаемое имя должно иметь длину от 3 символов до 31 символа.)

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Вся введенная информация защищена.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=Linux, Open source
ArticleID=279424
ArticleTitle=Анатомия подсистемы SCSI в Linux
publish-date=12272007