Что такое блочное устройство Linux

Обновлено: 21.11.2024

Блочное устройство – это устройство, с которого вы можете считывать блоки. Например, жесткие диски, приводы компакт-дисков и дискеты являются блочными устройствами, но не клавиатура. Вы можете получать данные с клавиатуры и рассматривать их как блоки, но не можете искать на клавиатуре. Вы можете сказать жесткому диску "дай мне блок 5433", затем блок 7707, затем блок 1807, и вы не можете сделать это с помощью клавиатуры, поэтому клавиатура не является блочным устройством.

Содержание

Важно понимать идеи, лежащие в основе размеров блоков.

Размеры дисковых блоков

Обычно жесткий диск не может прочитать менее 512 байт. Если вы хотите прочитать меньше, прочитайте 512 байт и отбросьте остальные. Вот почему dd читает один блок размером 512 байт в следующем примере:

Размеры блоков файловой системы

Итак, если вы храните файл в этой файловой системе, он будет храниться в блоке размером 4096 байт, то есть, даже если ваш файл содержит всего 6 байт, он отнимет 4096 байт от емкости вашего диска:

Размер блока ядра

Кроме того, ядро ​​имеет собственный размер блока. Это актуально, например. для вмстат. На справочной странице vmstat вы найдете оператор

Итак, снова другой размер блока при работе с vmstat. Это размер блока, который ядро ​​Linux использует для кэширования и буферизации. Это самый заметный из всех размеров блоков.

Приложения

вмстат

vmstat использует 1 тыс. блоков

iostat

iostat использует блоки размером 512 Б

  • буферизованный ввод-вывод и прямой ввод-вывод
  • асинхронный ввод-вывод и синхронный ввод-вывод

Разница между буферизованным вводом-выводом и прямым вводом-выводом заключается в том, что прямой ввод-вывод не использует кэш операционной системы. Во время открытого системного вызова вы можете сказать, что вам нужен прямой ввод-вывод. Больше информации.

Разница между асинхронным вводом-выводом и синхронным вводом-выводом заключается в том, что асинхронный ввод-вывод считывает и записывает данные из/в файл, не дожидаясь фактического поступления данных, а отправляя данные в сетевой сокет. Вы должны использовать libaio для этого. Больше информации.

Узнать размер блочного устройства

Чтобы узнать размер блочного устройства /dev/sda:

или немного сложнее читать:

Узнать файловую систему, хранящуюся на блочном устройстве

Файловая система обычно хранится в разделе, а не непосредственно на блочном устройстве. Чтобы найти все разделы в /dev/sda, используйте

Подобно ЦП и памяти, блочные устройства были с нами в мире Linux и UNIX в течение долгого времени и останутся. В этой статье я попытаюсь указать на некоторые последние разработки и дать идеи по отладке и доступные инструменты.

Вы когда-нибудь задумывались, как подсчитать контрольную сумму на блочном устройстве? Как сделать так, чтобы устройство выглядело больше, чем основной диск? Как сжать диск? В этой статье есть что-то новое для всех.

Для символьных устройств драйвер отправляет/принимает отдельные байты. Для блочных устройств связь осуществляется целыми блоками. Например, драйверы жесткого диска или NVMe могут представлять содержимое диска для доступа на чтение/запись через узел устройства /dev/sda, и мы можем представить блочное устройство как представление диска в виде длинной последовательности байтов. Затем пользователь системы Linux может открыть устройство, найти место, к которому нужно получить доступ, и прочитать или записать данные.

Многие из упомянутых здесь программных продуктов берут существующие блочные устройства и делают доступными новые устройства, например, обеспечивая прозрачное сжатие между обоими устройствами. Другие слои, такие как LVM, можно использовать поверх. Эта гибкость — одна из сильных сторон Linux!

Создание блочных устройств для тестирования

Предположим, мы хотим попрактиковаться в замене неисправных дисков в системе mdadm raid. Для такой настройки нам потребуется несколько быстрых и одноразовых блочных устройств.

Возможно, самый простой способ поиграть с блочными устройствами — создать обычный файл и затем сопоставить его с блочным устройством. Мы будем использовать dd для создания 32-мегабайтного файла с нулями и сопоставления его с блочным устройством /dev/loop0.

Loop0 теперь можно использовать как обычное блочное устройство. Отображение может быть удалено позже с помощью lossup -d /dev/loop0 . Наш самый простой тест доступа будет заключаться в записи байтов, а затем их чтении.

Этот тест также интересен, когда вы получаете 2 системы с Fibre Channel HBA, настроенными для общего общего LUN в хранилище SAN: когда LUN все еще не используется, запись нескольких байтов с одного узла, а затем чтение их со всех узлов в соответствии с приведенные выше команды — хороший тест.

Еще одна идея для получения блочных устройств для тестов: создайте том LVM, а затем снимок. Затем вы можете выполнять чтение/запись этого моментального снимка LVM и уничтожать его, когда он больше не нужен.

В течение нескольких лет моментальный снимок можно было снова объединить с исходным томом. Это также можно использовать для обновлений RHEL: сделайте снимок, обновите до нового дополнительного выпуска. Затем, если ваше приложение перестанет работать, вы объедините исходный снимок. Если ваше приложение удовлетворено обновлением, вы просто удаляете моментальный снимок.Единственным недостатком этой процедуры является то, что она состоит из нескольких шагов и не является простой, так как /boot не живет в LVM и требует дополнительного внимания. В этой статье kbase есть подробности.

Когда вы используете dd, чтобы получить представление о скорости доступа к блочному устройству, вы можете использовать status=progress в новых версиях dd :

Кроме того, hdparm -t и hdparm -T можно использовать для отображения базовой скорости доступа к дисковым устройствам.

Еще одна идея для тестовых блочных устройств: iSCSI. RHEL поставляется с целевым программным обеспечением iSCSI (что делает доступными блочные устройства), а также с инициатором, поэтому программное обеспечение «потребляется». Одна цель iSCSI также может использоваться несколькими инициаторами. Кроме того, когда доступ идет по сети, анализ трафика и его исследование с помощью, например, wireshark показывает операции на уровне SCSI. Если вы хотите имитировать медленные блочные устройства, вы можете настроить iSCSI, а затем выполнить формирование трафика для сетевых пакетов iSCSI.

Дополнительную порцию дисков, пожалуйста!

Предположим, вы хотите выяснить, как адаптеры главной шины и блочные устройства будут представлены в файловой системе /sys, или если требуется большое количество устройств, вам может помочь модуль ядра scsi_debug.

Модуль эмулирует адаптер scsi, только опирается не на реальное хранилище, а на память. Использование modinfo scsi_debug дает обзор параметров. Итак, эта команда:

порождает для нас 100 дисков (5x10x2) размером 16 МБ, как видно из cat /proc/partitions . Подробно:

5 хостов scsi эмулируются

10 LUN для каждого

Эти параметры следует выбирать осторожно, так как правила udev запускаются на новых блочных устройствах, поэтому при большом количестве дисков может наблюдаться высокая нагрузка. Вы также можете использовать scsi_debug для проверки многопутевого сопоставления устройств.

Кроме того, количество видимых дисковых устройств в реальном мире может быстро вырасти. Представьте себе хранилище SAN, экспортирующее 100 LUN в систему. SAN подключается к фабрике с помощью 4 портов. У нас есть 2 оптоволоконных коммутатора перед хранилищем SAN, а затем наша система RHEL с 2 оптоволоконными портами. В результате 100 LUN отображаются как 1600 блочных устройств в системе RHEL. Тысячи дисковых устройств быстро становятся проблемой при загрузке, поэтому следует внимательно относиться к номерам LUN и путям.

Предоставление доступа к огромным блочным устройствам

Предположим, вы хотите исследовать поведение огромных блочных устройств. Например, сколько данных будет занимать файловая система XFS на блочном устройстве емкостью 10 ТБ?

Мы уже использовали dd для сопоставления файла с блочным устройством. Что происходит с разреженным файлом в качестве бэкэнда? Обычный файл просто содержит последовательность байтов. Для разреженных файлов между последовательностями байтов у нас есть дыры, куда не было записано никаких данных. Преимущество записи последовательности нулей заключается в том, что эти дыры являются специальной функцией файловой системы и занимают гораздо меньше места.

Разреженные файлы можно, например, создать с помощью скомпилированного кода C, с помощью dd или с помощью truncate .

Благодаря этому мы можем создать разреженный файл размером 10 ТБ, который в файловой системе занимает всего несколько КБ. Мы также можем сопоставить это с lossup с блочным устройством: устройство будет выглядеть как обычный диск емкостью 10 ТБ. Как только мы запишем на блочное устройство, базовый файл будет расти.

Итак, если вам интересно, сколько данных XFS занимает на диске объемом 10 ТБ после создания файловой системы:

Еще один способ "предоставить блочные устройства большего размера, чем у серверной части" — это использование Virtual Data Optimizer (VDO). VDO является частью RHEL и может уменьшить объем данных на уровне блоков. При этом серверная часть объемом 10 ТБ может быть представлена ​​как 15 ТБ, поэтому, если ваши данные хорошо сжимаются, вы можете хранить там 15 ТБ данных.

Блокировать высокую доступность и зеркалирование устройств

Как предотвратить потерю данных из-за отказа дисков? RAID — это один из способов.

При программном рейде Linux видит диски как отдельные устройства. Уровень программного рейда собирает устройства в новое блочное устройство, например mdadm создает устройство /dev/md0.

Когда RAID реализован аппаратно, Linux видит только одно устройство и не знает о базовом аппаратном RAID. Как у программного, так и у аппаратного RAID есть свои сильные и слабые стороны - если вы сомневаетесь, мы можем помочь вам найти лучший подход для ваших требований.

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

Если хранилище SAN подключено, то, скорее всего, внутри SAN используется RAID для защиты данных от сбоя диска.При взаимодействии с SAN мы, вероятно, увидим, что LUN доступны как множество дисков, и используем dm-multipath для абстрагирования всех этих дисковых устройств на отдельные LUN, которые SAN фактически экспортирует. dm-multipath позволяет нам пережить отказ компонентов (оптоволоконные кабели, оптоволоконные коммутаторы и т. д.), а также сбалансировать ввод-вывод по доступным путям.

Баланс производительности и цены

Похоже, мы подошли к концу эры вращающихся дисков. Они большие, дешевые и (по сравнению с более новыми технологиями) медленные. Такие технологии, как NVMe и SSD, быстрее, но дороже. Использование dm-cache может помочь получить лучшее из обоих миров: с dm-cache мы можем размещать устройства NVMe перед дисковыми устройствами, и NVMe действует как кеш. Подробности здесь и здесь.

Проверка целостности: были ли изменены данные?

Если вы храните данные через блочное устройство на жестком диске, когда-нибудь задумывались, что произойдет, если операция чтения вернет что-то другое, чем было записано?

Поставщики жестких дисков указывают среднее время наработки на отказ своих дисков, и с постоянно увеличивающимися размерами дисков необходимо учитывать целостность данных.

Если мы запускаем на жестком диске простую файловую систему, такую ​​как XFS, и диск возвращает измененные байты, то файловая система вряд ли это заметит. XFS поддерживает контрольные суммы для метаданных, но не для самих сохраненных данных.

Чтобы противостоять этому, в более новых версиях RHEL 8 можно использовать целостность Device Mapper (dm-integrity). На этом уровне поверх жесткого диска записанные данные хранятся с контрольной суммой, что позволяет нам определять, когда диск возвращает неверные данные.

Мы также можем удобно использовать dm-integrity вместе с LUKS, который представляет собой слой для шифрования блочных устройств. При установке Linux на ноутбук рекомендуется использовать LUKS.

DIF/DIX: проверка целостности на всех уровнях

Предположим, нас беспокоит повреждение данных в полном стеке, вплоть до записи данных на блочное устройство: что можно с этим сделать?

В современных установках при перемещении данных может быть задействовано множество уровней: приложение в гостевой системе KVM записывает данные, они проходят через файловую систему и LVM в гостевой системе на гипервизор, который записывает данные в LUN в хранилище SAN. Если данные искажаются, необходимо просмотреть все эти слои.

DIF/DIX — это подход к защите от модификации на этих уровнях: когда приложение записывает данные, добавляется дополнительная контрольная сумма, поле целостности данных (DIF). Эта контрольная сумма остается с данными на всех уровнях, пока в конце концов хранилище не проверит DIF и не сохранит как данные, так и DIF. Кроме того, при чтении контрольная сумма проверяется запоминающим устройством. Это немного похоже на dm-integrity, но с проверкой, выполняемой непосредственно на прикладном уровне.

Что касается приложений, то только несколько приложений (например, базы данных Oracle) поддерживают DIF/DIX, а также лишь несколько поставщиков систем хранения данных. Red Hat не сертифицирует совместимость DIF/DIX, но работает с партнерами, чтобы гарантировать, что DIF/DIX возможен, чтобы уровни Linux могли с ним справиться.

В будущем большее количество приложений и решений для хранения данных может начать поддерживать DIF/DIX. Подробности здесь.

Диагностика

Давайте также рассмотрим некоторую диагностику блочных устройств. И cat /proc/partitions, и lsblk часто используются для получения обзора системных блочных устройств.

Команда iostat из пакета sysstat предоставляет подробные сведения об операциях ввода-вывода на блочных устройствах, пропускной способности устройства и оценках насыщения устройства. Когда устройство перегружено, может иметь смысл дальнейшее расследование.

Команда blktrace создает трассировки трафика ввода-вывода, iotop показывает сведения о пропускной способности. Performance Co-Pilot (PCP) — это наше решение по умолчанию, позволяющее отображать пропускную способность в реальном времени и создавать архивные файлы для последующего изучения. С помощью Redis и Grafana эти показатели также можно красиво визуализировать.

С пакетом bcc мы можем запускать код в пространстве ядра, что очень помогает нам на блочных уровнях:

bcc/trace: Кто/какой процесс выполняет определенные функции на блочных устройствах?

bcc/biosnoop: Какой процесс обращается к блочному устройству, сколько байтов используется, какая задержка ответа на запросы?

Обзор

Как мы видели, мир Linux предоставляет множество инструментов и технологий для блочных устройств, и почти каждую неделю появляются новые возможности. Создание блочных устройств для тестирования легко, чтобы попробовать что-то. Эти технологии можно комбинировать, что обеспечивает большую гибкость.

Создание слоев вместе один раз может сработать, но также важно, чтобы весь стек также собирался после перезагрузки и обновлений RHEL.Если вы сомневаетесь, обратитесь к своему техническому менеджеру аккаунта (TAM) или в службу поддержки Red Hat, чтобы подтвердить, проверены ли комбинации и рекомендованы ли они.

В этой главе рассматриваются следующие темы:

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

Этот тип устройства обычно применяется к дисковым устройствам, но что касается OpenBoot, это просто означает, что устройство "выглядит как диск" на уровне программного интерфейса OpenBoot.

FCode блочного устройства должен объявлять тип блочного устройства и реализовывать методы open и close , а также методы, описанные в разделе «Необходимые методы».

Хотя пакеты типа блочного устройства представляют собой байт-ориентированный интерфейс с остальной частью системы, связанные аппаратные устройства обычно блочно-ориентированы, то есть устройство считывает и записывает данные в блоках (группах, например , 512 или 2048 байт). Стандартный пакет поддержки /deblocker помогает представить интерфейс, ориентированный на байты, поверх интерфейса, ориентированного на блоки, реализуя уровень буферизации, который скрывает базовую длину блока.

Блочные устройства часто подразделяются на несколько логических разделов в соответствии с меткой диска — специальным блоком, обычно первым на устройстве, который содержит информацию об устройстве. Драйвер отвечает за правильную интерпретацию метки диска. Драйвер может использовать стандартный пакет поддержки /disk-label, если устройство не поддерживает специализированную метку. Пакет поддержки /disk-label интерпретирует системно-зависимый формат метки. Поскольку протокол загрузки с диска обычно зависит от формата метки, стандартный пакет поддержки /disk-label также реализует метод загрузки для соответствующего протокола загрузки.

Байт-устройства – это запоминающие устройства с последовательным доступом, например ленточные устройства. OpenBoot обычно использует для загрузки байтовые и блочные устройства.

Программа FCode байтового устройства должна объявлять тип байтового устройства и реализовывать методы открытия и закрытия в дополнение к описанным в разделе "Обязательные методы".

Несмотря на то, что пакеты типа байтового устройства представляют собой интерфейс, ориентированный на байты, к остальной части системы, соответствующие аппаратные устройства обычно ориентированы на запись; устройство считывает и записывает данные в записи, содержащие более одного байта. Записи могут быть фиксированной или переменной длины. Стандартный пакет поддержки /deblocker помогает представить интерфейс, ориентированный на байты, поверх интерфейса, ориентированного на записи, реализуя уровень буферизации, который скрывает базовую структуру записи.

размер блока ( -- длина блока )

Этот метод возвращает длину блока записи (в байтах) всех данных, передаваемых на устройство или с устройства. Наиболее распространенное значение для block-len — 512.

Этот метод требуется, только если используется пакет поддержки /deblocker.

загрузить ( адрес -- размер )

загрузка работает по-разному для блочных и байтовых устройств.

В случае блочных устройств автономная программа загружается с устройства в память по адресу addr . size - это размер загруженной программы в байтах. Если устройство может содержать несколько таких программ, аргументы экземпляра, возвращаемые my-args, могут использоваться для выбора нужной программы. open выполняется перед вызовом load.

С байтовыми устройствами загрузка считывает автономную программу из файла ленты, заданного значением строки аргумента, заданной my-args . Это значение является строковым представлением десятичного целого числа. Если строка аргумента пуста, используется ленточный файл 0. load помещает программу в память по адресу addr , возвращая размер прочитанной программы в байтах.

max-transfer ( -- max-len )

Этот метод возвращает размер в байтах самой большой разовой передачи, которую может выполнить устройство. max-transfer должен быть кратен размеру блока .

Этот метод требуется, только если используется пакет поддержки /deblocker.

чтение (адрес len -- фактическое)

Этот метод считывает не более len байтов с устройства в память по адресу addr . фактическое количество прочитанных байтов. Если число прочитанных байтов равно 0 или отрицательно, чтение завершилось неудачно. Обратите внимание, что len не обязательно должен быть кратным нормальному размеру блока устройства.

Этот метод требуется, только если используется пакет поддержки /deblocker.

поиск работает по-разному для блочных и байтовых устройств.

Для блочных устройств поиск устанавливает позицию устройства для следующего чтения или записи. Позиция — это смещение в байтах от начала устройства, заданное 64-битным числом, которое представляет собой конкатенацию poshigh и poslow. статус равен -1, если поиск не удался, и 0 или 1, если он успешен.

записать (адрес len -- фактический)

Этот метод записывает len байтов из памяти по адресу addr на устройство. фактическое количество записанных байтов. Если фактическое значение меньше len , запись не удалась.len не обязательно должен быть кратным нормальному размеру блока устройства.

Блочные устройства характеризуются произвольным доступом к данным, организованным в виде блоков фиксированного размера. Примерами таких устройств являются жесткие диски, дисководы CD-ROM, RAM-диски и т. д. Для упрощения работы с блочными устройствами ядро ​​Linux предоставляет целую подсистему, называемую подсистемой блочного ввода-вывода (или блочного уровня).

Что такое блочное и символьное устройство в Linux?

Символическое устройство vs. Заблокировать устройство

Символьное («c») устройство — это устройство, с которым Драйвер общается, отправляя и получая отдельные символы (байты, октеты). Блочное (b) устройство — это устройство, с которым Драйвер общается, отправляя целые блоки данных.

Как получить доступ к заблокированному устройству в Linux?

Блочные устройства в системе можно обнаружить с помощью команды lsblk (список блочных устройств). Попробуйте это в виртуальной машине ниже. Введите lsblk в командной строке и нажмите Enter.

Что такое устройства в Linux?

В Linux в каталоге /dev можно найти различные специальные файлы. Эти файлы называются файлами устройств и ведут себя не так, как обычные файлы. Наиболее распространенными типами файлов устройств являются блочные и символьные устройства.

Что такое драйвер блочного устройства?

Устройства, поддерживающие файловую систему, называются блочными. Драйверы, написанные для этих устройств, известны как драйверы блочных устройств. Драйверы блочных устройств также могут предоставлять интерфейс символьного драйвера, который позволяет служебным программам обходить файловую систему и напрямую обращаться к устройству. …

Какие существуют типы драйверов устройств?

Драйверы устройств можно разделить на две категории:

  • Драйверы устройств ядра.
  • Драйверы устройств пользовательского режима.

В чем разница между символьным устройством и блочным устройством?

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

Как вывести список всех устройств в Linux?

Лучший способ перечислить что-либо в Linux — запомнить следующие команды ls:

  1. ls: список файлов в файловой системе.
  2. lsblk: список блочных устройств (например, дисководов).
  3. lspci: список устройств PCI.
  4. lsusb: список USB-устройств.
  5. lsdev: список всех устройств.

Где хранятся файлы устройств в Linux?

Все файлы устройств Linux расположены в каталоге /dev, который является неотъемлемой частью корневой (/) файловой системы, поскольку эти файлы устройств должны быть доступны операционной системе во время процесса загрузки.

Как увидеть устройства в Linux?

Узнайте, какие именно устройства находятся внутри вашего компьютера с Linux или подключены к нему.

  1. Команда монтирования. …
  2. Команда lsblk. …
  3. Команда df. …
  4. Команда fdisk. …
  5. Файлы /proc. …
  6. Команда lspci. …
  7. Команда lsusb. …
  8. Команда lsdev.

Какие существуют два типа файлов устройств?

В Unix-подобных операционных системах существует два основных типа файлов устройств, называемых специальными символьными файлами и специальными блочными файлами. Разница между ними заключается в том, сколько данных считывается и записывается операционной системой и оборудованием.

Что такое узлы устройств?

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

Что такое mkdir?

Команда mkdir в Linux/Unix позволяет пользователям создавать новые каталоги. mkdir означает «создать каталог». С помощью mkdir вы также можете устанавливать разрешения, создавать несколько каталогов (папок) одновременно и многое другое.

Что такое блочное устройство?

Блочные устройства характеризуются произвольным доступом к данным, организованным в виде блоков фиксированного размера. Примерами таких устройств являются жесткие диски, дисководы CD-ROM, RAM-диски и т. д. … Символьные устройства имеют одну текущую позицию, в то время как блочные устройства должны иметь возможность перемещаться в любую позицию на устройстве, чтобы обеспечить произвольный доступ к данным.

Что такое блочные и символьные устройства?

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

Что такое драйвер символьного устройства?

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

Читайте также: