Блочное устройство linux что это
А ты знаешь особенности файловой системы Linux? Linux обаладет очень мощной файловой системы, возможности которой знают далеко не все пользователи. Сегодня ты станешь одним из них, а чтобы статья не была сугубо теоретической и сухой мы рассмотрим ряд практических примеров на каждый день. Один из них - восстановление загрузчика GRUB после очередной переустановки Windows.
Архитектура файловой системы, ее основные структуры
Прежде, чем приступить к рассмотрению архитектуры файловой системы Linux, нужно разобраться, что вообще такое файловая система (ФС). Можно встретить различные определения, например, ФС - это способ представления информации на носителе данных. Или ФС - часть операционной системы, обеспечивающая выполнение операций над файлами. Но более точным будет объединение этих двух определений. Ведь, грубо говоря, любая файловая система состоит как минимум из двух уровней - уровня представления данных и набора системных вызовов для работы с данными. Зачастую операционная система может работать с различными файловыми системами, например, с основной файловой системой (используется на жестком диске) и с файловой системой CD - ISO9660. Поэтому ОС должна обеспечить приложениям стандартный интерфейс, позволяющий обращаться к файлам на разных ФС прозрачно, то есть программист не должен вникать в тонкости каждой файловой системы. Например, в никсах для открытия файла используется системный вызов open(). Программа просто вызывает open(), передав ему имя файла, а на какой ФС расположен этот файл - дело третье. Теперь посмотри на рис. 1, на нем изображено все то, что было сказано выше. Зеленым отмечен пользовательский уровень, а желтым - уровень ядра.
Рис.1 Архитектура файловой системы
Приложение может использовать функции glibc (библиотека GNU C) или же напрямую использовать системные вызовы ядра - тут уж как будет угодно программисту. Использовать функции glibc удобнее, но, вызывая непосредственно системные вызовы, (например, open(), read(), write(), close()) можно немного повысить производительность приложения - ведь ты минуешь glibc, которая все равно использует те же системные вызовы.
VFS - это виртуальная файловая система. Именно она позволяет добиться существующего сейчас уровня абстракции. Каждая файловая система имеет свои особенности. Если бы не было VFS, то пришлось бы разрабатывать разные версии системных вызовов для каждого типа поддерживаемой файловой системы, например, open_ext3() - для открытия файла, находящегося на файловой системе ext3, или open_vfat() - для ФС VFAT. Другими словами, VFS делает системные вызовы независимыми от типа используемой файловой системы.
Драйверы устройств используются для физического доступа к носителям данных. Ведь эти самые носители тоже различны - у тебя может быть установлено несколько жестких дисков с разными интерфейсами, например, PATA- и SATA-диски.
Копаем глубже
Рисунок 1 - это общее представление о файловой системе Linux. Настало время копнуть глубже. Рассмотрим логическую структуру файловой системы ext3. Физически жесткий диск разбит на секторы размером 512 байт. Первый сектор дискового раздела в любой файловой системе считается загрузочной областью. В первичном разделе эта область содержит загрузочную запись — фрагмент кода, который инициирует процесс загрузки операционной системы при запуске. На других разделах эта область не используется. Остальные секторы объединены в логические блоки размером 1, 2 или 4 Кб. Логический блок есть наименьшая адресуемая порция данных: данные каждого файла занимают целое число блоков. Блоки, в свою очередь, объединяются в группы блоков. Группы блоков и блоки внутри группы нумеруются последовательно, начиная с 1.
Раздел диска, на котором сформирована файловая система ext3, может быть представлен такой схемой (рис. 2).
Рис.2 Структура файловой системы
Суперблок служит начальной точкой файловой системы и хранит всю информацию о ней. Он имеет размер 1024 байта и располагается по смещению 1024 байта от начала файловой системы. В каждой группе блоков он дублируется, что позволяет быстро восстановить его после сбоев.
В суперблоке определяется размер файловой системы, максимальное число файлов в разделе, объем свободного пространства и содержится информация о том, где искать незанятые участки. При запуске ОС суперблок считывается в память, и все изменения файловой системы вначале находят отображение в копии суперблока и записываются на диск только периодически. Это позволяет повысить производительность системы, так как многие пользователи и процессы постоянно обновляют файлы. С другой стороны, при останове системы суперблок обязательно должен быть записан на диск, что не позволяет выключать компьютер простым выключением питания. В противном случае, при следующей загрузке информация, записанная в суперблоке, окажется не соответствующей реальному состоянию файловой системы.
После суперблока следует описание (дескриптор) группы блоков. Хранящаяся в нем информация позволяет найти битовые карты блоков и индексных дескрипторов, а также таблицу индексных дескрипторов.
Структуру системного блока можно найти в /usr/src/linux/include/linux/fs.h:
Битовой картой блоков (block bitmap) называется структура, каждый бит которой показывает, отведен ли такой же по счету блок какому-либо файлу. Значение 1 показывает, что блок занят. Эта карта служит для поиска свободных блоков в тех случаях, когда надо выделить место под файл. Битовая карта индексных дескрипторов выполняет аналогичную функцию по отношению к таблице индексных дескрипторов: показывает, какие именно дескрипторы заняты. Каждому файлу соответствует один и только один индексный дескриптор (inode), который идентифицируется своим порядковым номером — индексом файла. В индексном дескрипторе хранятся метаданные файла. Среди них — все атрибуты файла, кроме его имени, и указатель на данные файла.
Для обычного файла или каталога этот указатель представляет собой массив из 15 адресов блоков. Первые 12 адресов в этом массиве являются прямыми ссылками на номера блоков, в которых хранятся данные файла. Если данные не помещаются в 12 блоков, то включается механизм косвенной адресации. Следующий адрес в этом массиве является косвенной ссылкой, то есть адресом блока, в котором хранится список адресов следующих блоков с данными из этого файла. Сколько блоков с данными можно так адресовать? Адрес блока занимает 4 байта, блок, как уже сказано, имеет размеры 1, 2 или 4 Кб. Значит, путем косвенной адресации можно разместить 256 — 1024 блока.
А если файл еще длиннее? Следующий адрес в массиве-указателе указывает на блок двойной косвенной адресации (double indirect block). Этот блок содержит список адресов блоков, которые, в свою очередь, содержат списки адресов следующих блоков данных.
И, наконец, последний адрес в массиве-указателе задает адрес блока тройной косвенной адресации, то есть блока со списком адресов блоков, которые являются блоками двойной косвенной адресации.
Пока остается непонятным, где находится имя файла, если его нет ни среди данных файла, ни среди его метаданных. В *nix-подобных системах имя файла есть атрибут не самого файла, а файловой системы, понимаемой как логическая структура каталогов. Имя файла хранится только в каталоге, к которому файл приписан, и больше нигде. Из этого вытекают любопытные следствия.
Во-первых, одному индексному дескриптору может соответствовать любое количество имен, приписанных к разным каталогам, и все они являются настоящими. Количество имен (жестких ссылок) учитывается в индексном дескрипторе. Именно это количество можно увидеть по команде «ls –l». Во-вторых, удаление файла означает просто удаление записи о нем из данных каталога и уменьшение на 1 счетчика ссылок. В-третьих, сопоставить имя можно только номеру индексного дескриптора внутри одной и той же файловой системы, именно поэтому нельзя создать жесткую ссылку в другую файловую систему (символическую — можно, у нее другой механизм хранения).
Сам каталог таким же образом приписан к своему родительскому каталогу. Корневой каталог всегда записан в индексный дескриптор с номером 2 (номер 1 отведен для списка адресов дефектных блоков). В каждом каталоге хранится ссылка на него самого и на его родительский каталог — это и есть псевдоподкаталоги «.» и «..».
Таким образом, количество ссылок на каталог равно количеству его подкаталогов плюс два. Данные каталога представляют собой связный список с записями переменной длины и выглядят примерно так, как показано на рис 3.
Рис.3 Структура каталога в ext3
А как же файлы физических устройств? Они могут находиться в тех же каталогах, что и обычные файлы: в каталоге нет никаких данных, говорящих о принадлежности имени файлу на диске или устройству. Разница находится на уровне индексного дескриптора. Если иноде обычного файла указывает на дисковые блоки, где хранятся его данные, то в иноде файла устройства содержится указатель на список драйверов устройств в ядре — тот элемент списка, который соответствует старшему номеру устройства (рис. 4).
Рис.4 Разница между обычным файлом и файлом устройства
Монтирование
Чтобы получить доступ к файлам и каталогам, находящимся за пределами корневой ФС (на других разделах жесткого диска или на других носителях), нужно примонтировать их к корневой файловой системе.
Для монтирования файловой системы предназначена программа mount, для размонтирования - umount. Общий формат вызова (наиболее часто используемый) следующий:
После монтирования файловая система добавляется в список смонтированных файловых систем в ядре:
Последняя структура mnt_list - это и есть список смонтированных файловых систем. Пользователь может просмотреть этот список в файле /etc/mtab.
Некоторые особые операции с файловой системой
Создать файловую систему Linux можно не только на физическом носителе данных, но и в обычном файле. Для начала нужно создать пустой файл:
Команда dd читает данные с устройства /dev/zero и записывает их в файл fs.img. В качестве данных будет просто поток нулей, причем не чисел ноль (ANSI-код 48), а неотображаемых символов NULL (ANSI-код 0). Данные читаются и записываются блоками по 1 Кб (bs=1k), и общее количество блоков равно 30000. Таким образом, на выходе получаем файл размером почти 30 Мб, заполненный символами NULL. После этого командой losetup мы превратим наш файл в блочное устройство:
Теперь мы можем обращаться к устройству /dev/loop0, как к обычному блочному устройству (блочным называется устройство, обмен данными с которым производится блоками, например, секторами диска). Создадим файловую систему на устройстве /dev/loop0 с помощью команды mke2fs:
Все готово для монтирования созданной файловой системы. Мы подмонтируем ее к каталогу /mnt/fs, который нужно создать заранее:
После этого мы можем работать с каталогом /mnt/fs, как с обычным каталогом файловой системы. Никаких ограничений нет. Внутри этого каталога мы можем создать еще один пустой файл и тоже превратить его в файловую систему, а затем подмонтировать. Для упрощения процесса вместо команды losetup можно указать параметр '-o loop' команды mount, например:
Для размонтирования файла с файловой системой, как обычно, используем umount:
Далее следует удалить устройство /dev/loop0 (если ты его создавал):
Немного практики. Alcohol и UltraISO средствами Linux!
Все это хорошо и очень занимательно, но разберемся, как можно применить полученные знания на практике. Пустой файл, созданный с помощью dd, нам не нужен. Что мы будем в нем хранить? Записывать файлы? А не проще ли записать их в обычные каталоги и не морочить себе голову? Но dd можно использовать не только для создания пустых файлов, но и для создания образов CD/DVD:
Данная команда создаст образ CD-диска и запишет его в домашний каталог пользователя под именем image.iso. Затем можно обратиться к файлам созданного образа без его записи на болванку. Для этого нужно подмонтировать его к корневой файловой системе (каталог /mnt/fs должен существовать):
После этого ты можешь работать с /mnt/fs, как с обычным каталогом. Но работа с ISO-образами - это не единственное применение loop-устройств. Может так получиться, что после установки системы окажется, что оперативной памяти не хватает. Покупать дополнительный модуль памяти не хочется, а переразбивать жесткий диск с целью увеличения размера раздела подкачки - тем более. Тогда можно создать пустой файл, отформатировать его как файл подкачки и подключить к системе:
Первая команда создает пустой файл размером 256 Мб. Вторая - форматирует его как своп. Как видишь, для Linux нет особой разницы, с чем работать - с файлом или с блочным устройством. Ты запросто можешь отформатировать обычный файл в любую файловую систему. Третья команда подключает созданный своп-файл к системе. Можешь ввести команду free, чтобы убедиться, что файл подкачки подключен. Только не забудь добавить последнюю команду в сценарии запуска системы, чтобы не вводить ее после каждой перезагрузки.
Изменение корневой файловой системы
Linux позволяет изменять корневую файловую систему. Предположим, требуется восстановить загрузчик Linux. Ты загрузился с LiveCD, но тебе нужно подключить корневую файловую систему так, чтобы все изменения, производимые вводимыми командами, относились именно к корневой файловой системе на жестком диске, а не к корневой файловой системе LiveCD. Другими словами нам нужно изменить корневую файловую систему. Делается это просто - с помощью команды chroot:
Монтирование каталога к каталогу
В Linux можно подмонтировать каталог к каталогу, а не только каталог к устройству. Делается это с помощью все той же команды mount, но запущенной с параметром '--bind':
Восстановление загрузчика GRUB: пошаговое руководство
Ты переустановил Windows, а она установила в MBR свой загрузчик и теперь нельзя загрузить Linux? Не переустанавливать же еще и Linux из-за такой мелочи! Для восстановления загрузчика GRUB нужно загрузиться с LiveCD (подойдет любой LiveCD с любым дистрибутивом Linux) и ввести следующие команды:
Все данные команды нужно вводить от имени root. Чтобы получить полномочия root, нужно использовать команды su или sudo. Например, в Ubuntu LiveCD нужно вводить все команды с использованием команды sudo, например,
Разберемся, что означают данные команды. Первая команда создает каталог /old, который будет использоваться в качестве точки монтирования. Вторая команда создает в этом каталоге подкаталог dev, который пригодится для монтирования devfs – псевдофайловой системы. Третья команда используется для монтирования корневой файловой системы дистрибутива Linux, установленного на жестком диске к каталогу /old. Предположим, что твой дистрибутив Linux был установлен в раздел /dev/sda5. Поэтому нужно ввести команду:
mount /dev/sda5 /old
После этого нужно подмонтировать каталог /dev к каталогу /old/dev. Это делается с помощью все той же команды mount, но с параметром --bind. Команда chroot заменяет корневую систему нашего LiveCD на корневую систему дистрибутива, установленного на винчестере. Тебе остается лишь ввести команду:
Данная команда установит загрузчик GRUB так, как он был установлен до этого. После установки GRUB нужно перезагрузить компьютер (команда reboot).
Операционная система Linux предоставляет производительные средства и наборы инструментов для управления аппаратными устройствами, в том числе накопителями. Эта статья расскажет, как Linux представляет эти устройства и, как превратить неформатированное хранилище (raw storage) в полезное пространство.
Блочные системы хранения
Блочная система хранения (block storage) – это ещё одно название блочного устройства в Linux. Блочное устройство – это часть аппаратных средств, предназначенная для хранения данных, например жесткий диск (hard disk drive, HDD), твердотельный накопитель (solid state drive, SSD), флэш-карта памяти и т.д. Они называются блочными устройствами, так как ядро подключается к аппаратным средствам путем ссылки на блоки фиксированного размера (фрагменты пространства).
По сути, блоковая система хранения – это обычное дисковое хранилище на компьютере. После установки и настройки такая система работает как продолжение дерева текущей файловой системы и позволяет записывать или считывать информацию с диска.
Разделы диска
Дисковые разделы – один из способов разделения накопителя на меньшие единицы. Разделом называется логически выделенная часть накопителя, которую, по сути, можно воспринимать и обрабатывать как сам накопитель.
Разделение диска позволяет сегментировать доступное пространство и использовать каждый его раздел для индивидуальной цели. Это дает пользователю большую гибкость, позволяя разделить установку на несколько операционных систем, пространств подкачки или специализированных файловых систем.
Конечно, диски можно форматировать и использовать без разделения. Однако некоторые операционные системы требуют предоставить им таблицу разделов, даже если на диске есть только один раздел. Как правило, для достижения большей гибкости в дальнейшем новые диски рекомендуется заранее разделять.
MBR и GPT
При разделении диска важно учитывать формат. Как правило, при этом используются форматы MBR (Master Boot Record) и GPT (GUID Partition Table).
MBR – традиционная система дискового разделения, которая используется уже более 30 лет. Из-за её возраста в ней есть ряд серьёзных ограничений. Например, её нельзя использовать для разделения дисков, чей объём превышает 2Тб. Также MBR позволяет создать максимум четыре первичных раздела; при этом четвертый раздел, как правило, является «расширенным разделом», в котором можно создавать «логические разделы» (то есть, таким образом можно разделить последний раздел, чтобы добавить дополнительные разделы).
GPT – более современная модель разделения диска, которая пытается решить некоторые из проблем MBR. Системы, использующие GPT, могут делить диск на большее количество разделов (как правило, ограничения в этом смысле накладываются самой операционной системой). Кроме того, GPT не ограничивает размеры диска, а таблица разделов доступна в нескольких точках системы из соображений безопасности.
В большинстве случаев лучше использовать GPT (если только операционная система или наборы инструментов не подразумевают другого решения).
Форматирование и файловые системы
Ядро Linux может распознавать неформатированный диск. Но накопитель должен обязательно быть отформатированным.
Форматирование – это процедура записи на диск меток, файловой системы и другой управляющей информации для дальнейшей работы с файлами. Файловая система – это система, которая структурирует данные и управляет операциями записи и извлечения данных на диске. Без файловой системы невозможно использовать устройство для хранения файлов и выполнения любых файловых операций.
Существует множество различных форматов файловых систем. На базовом уровне все они обеспечивают похожее представление диска, но каждый из них поддерживает разные функции и механизмы для обслуживания пользователей и выполнения операций.
Наиболее популярными файловыми системами в Linux являются:
- Ext4: (четвертая версия расширенной файловой системы) самая популярная на сегодняшний день файловая система. Ext4 обеспечивает систему журналирования и обратную совместимость с существующими системами, она невероятно надёжна и имеет зрелую поддержку и инструментарий. Это отличный выбор, если у вас нет никаких особенных требований.
- XFS: специализируется на производительности и больших файлах данных. Эта файловая система быстро форматируется и предоставляет высокую пропускную способность при работе с большими файлами и дисками. Также она поддерживает быстрые снапшоты. XFS журналирует только метаданные. Это обеспечивает высокую производительность, но может привести к повреждению данных в случае резкой потери мощности.
- Btrfs: современная многофункциональная файловая система, работающая по принципу «копирование при записи» (copy-on-write). Такая архитектура позволяет интегрировать функциональные возможности управления томами на уровне файловой системы. Готовность системы Btrfs к производственным нагрузкам всё ещё остаётся предметом активного обсуждения; многие системные администраторы считают её несколько незрелой для этого.
- ZFS: современная файловая система и менеджер томов с широким и зрелым набором функций, работающий по принципу «копирование при записи». ZFS обеспечивает высокую целостность данных, может обрабатывать большие файловые системы, предоставляет функции управления томами (клонирование, создание снапшотов, систематизация томов в RAID и RAID-подобные массивы для обеспечения избыточности данных и повышения производительности). Что касается работы в Linux, ZFS имеет противоречивую историю из-за проблем с лицензированием. Несмотря на это Ubuntu поставляет двоичный модуль ядра ZFS, а Debian включает исходный код ZFS в свои репозитории. Другие дистрибутивы ещё не определились с поддержкой ZFS.
Управление устройствами хранения в Linux
Файлы устройств в /dev
Система Linux почти всё представляет в виде файлов. Это касается и аппаратных накопителей, которые представлены в системе в виде файлов в каталоге /dev. Как правило, имена файлов, представляющих устройства хранения данных, начинаются с sd или hd, после чего следует буква. Например, первый диск на сервере, как правило, будет называться примерно так: /dev/sda.
Разделы таких накопителей тоже будут иметь свои файлы в /dev. В имя такого файла входит sd или hd + буква + порядковый номер раздела. Например, первый раздел на первом диске сервера будет называться /dev/sda1.
Файлы /dev/sd* и /dev/hd* представляют традиционный способ обозначения дисков и разделов, существует значительный недостаток в использовании значений. Ядро Linux распределяет имена устройств при каждой загрузке системы, а это может привести к путанице при изменении узлов устройств.
Чтобы обойти эту проблему, каталог /dev/disk содержит подкаталоги, которые предоставляют более надёжный способ определения дисков и разделов в системе. Они содержат символические ссылки на правильные файлы /dev/[sh]da*, которые создаются при загрузке системы. В названии ссылки содержится идентифицирующий признак каталога. Эти ссылки всегда указывают на правильные устройства, потому они используются как статические идентификаторы хранилищ.
В каталоге /dev/disk могут существовать следующие подкаталоги:
- by-label: большинство файловых систем предоставляет механизмы маркировки, которые позволяют назначать произвольные имена для диска или раздела. Этот каталог хранит ссылки, названные с помощью предоставленных пользователем меток.
- by-uuid: UUID (универсально уникальные идентификаторы) – это длинные уникальные последовательности букв и цифр, которые можно использовать в качестве идентификатора для ресурса хранения. Как правило, они очень сложные для человеческого восприятия, но зато они обеспечивают уникальность (даже при работе между несколькими системами). UUID отлично подходят для создания ссылок на хранилища, которые могут мигрировать между системами, так как они устраняют конфликты имён.
- by-partlabel и by-partuuid: GPT таблицы предоставляют свой собственный набор меток и UUID. Они во многом похожи на идентификаторы из предыдущих каталогов, но используют специфические идентификаторы GPT.
- by-id: хранит ссылки, сгенерированные серийным номером устройства.
- by-path: как и by-id, этот каталог использует подключения устройств хранения к самой системе. Ссылки здесь построены на основе интерпретации системой аппаратного обеспечения, используемого для доступа к устройству. Серьёзным недостатком является то, что при подключении устройства к другому порту это значение может измениться.
Как правило, для постоянной идентификации конкретных устройств используются каталоги by-label или by-uuid.
Монтирование блочных устройств
Файлы устройств в каталоге /dev используются для обмена данными с драйвером ядра. Тем не менее, чтобы рассматривать устройство в качестве сегмента доступного пространства, требуется более удобное разделение.
В Linux и других Unix-подобных системах вся система представлена единым унифицированным деревом файлов независимо от количества физических устройств. Таким образом, когда на диске или разделе используется файловая система, её нужно подключить к существующему дереву. Монтирование – это процесс присоединения отформатированного раздела или диска к каталогу в файловой системе Linux. Доступ к содержимому накопителя можно получить с помощью этого каталога.
Устройства обычно монтируются в специальные выделенные пустые каталоги; если устройство было смонтировано в непустой каталог, то текущее содержимое этого каталога будет недоступно, пока устройство не демонтируют. Существует множество различных опций для монтирования, которые можно настроить, чтобы изменить поведение смонтированного устройства (например, открыть устройство только для чтения, чтобы защитить его данные от изменений).
Стандарт иерархии файловой системы рекомендует использовать для временно смонтированных файловых систем каталог /mnt или его подкаталоги. Однако этот стандарт не дает никаких рекомендаций относительно того, где хранить более постоянные устройства, потому вы можете выбрать для них любое удобное место. Обычно для этого также используется каталог /mnt или его подкаталоги.
Постоянное монтирование
Дистрибутивы Linux читают файл /etc/fstab, чтобы узнать, какие файловые системы нужно монтировать во время запуска. Если этот файл не содержит записи о какой-либо файловой системе, то такая файловая система не будет смонтирована автоматически. Исключение составляют только системы, которые определяются файлами .mount системы инициализации systemd.
Файл /etc/fstab достаточно прост. Каждая строка определяет блочное устройство, его точку монтирования, формат диска, параметры монтирования, а также некоторую другую информацию.
Продвинутое управление хранилищами
Большинство случаев простого использования накопителей и хранилищ не требует дополнительных структур управления. При работе со сложными парадигмами можно получить более высокую производительность, избыточность или гибкость.
Что такое RAID?
RAID (Redundant Array of Independent Disks) – это технология управления хранением данных и виртуализацией, которая позволяет сгруппировать диски и управлять ими как единым целым.
Характеристики RAID-массива зависит от уровня RAID, который определяет, как именно диски в массиве связаны друг с другом. Выбранный уровень влияет на производительность и избыточность. Наиболее распространенными уровнями являются:
- RAID 0: также известен как распределение данных. При записи данных в массив они разделяются на блоки и распределяются между дисками в наборе. Это дает прирост производительности, поскольку можно одновременно записывать или читать несколько дисков. Недостатком является то, что отказ одного диска может стать причиной потери данных всего массива, так как ни один диск не содержит достаточных для восстановления данных.
- RAID 1: технология зеркалирования. Данные, записанные в массив RAID 1, записываются на несколько дисков. Главным преимуществом такого подхода является избыточность данных, что позволяет сохранить данные даже в случае потери жёсткого диска. Поскольку несколько дисков содержат одни и те же данные, полезная емкость уменьшается наполовину.
- RAID 5: технология распределения данных (подобно RAID 0). Этот уровень также реализует распределенную четность по всем дискам. Это означает, что если диск выйдет из строя, остальные диски позволяют восстановить массив с помощью информации о четности. Этой информации достаточно, чтобы восстановить один из дисков, то есть массив может пережить потерю любого диска.
- RAID 6: обладает теми же параметрами, что и RAID 5, но использует два диска чётности. То есть, такие массивы могут переносить потерю любых двух дисков. Конечно, емкость массива зависит от четности.
- RAID 10: комбинация уровней 1 и 0 (массив RAID 0, построенный из массивов RAID 1). Этот уровень предоставляет два набора зеркальных массивов, в которых можно распределять данные. В результате получается высокопроизводительный массив, обладающий некоторыми характеристиками избыточности. Суммарная мощность такого массива составляет половину объединенного дискового пространства.
Что такое LVM?
LVM (или Logical Vvolume Management) – это система, которая абстрагирует основные физические характеристики устройств хранения данных для повышения гибкости и мощности. LVM может создавать группы физических устройств и управлять ими как единым блоком. Это позволяет по мере необходимости сегментировать пространство в логические тома, которые будут работать как разделы.
LVM реализуется на основе обычных разделов и позволяет обойти множество ограничений, присущих традиционным дисковым разделам. Например, при использовании томов LVM можно легко расширять разделы, создавать новые разделы, которые охватывают несколько дисков, создавать снапшоты и перемещать тома на разные физические диски. LVM можно комбинировать с RAID.
Дальнейшие действия
Если у вас есть новое накопительное устройство, которое вы хотите использовать в системе Linux, это руководство поможет разобраться с основами разделения дисков, форматирования и монтирования новых файловых систем. Чтобы научиться выполнять базовые операции по управлению хранилищем, читайте это руководство.
Теперь взглянем на аспекты работы Gentoo Linux и Linux в общем, связанные с дисковой подсистемой, включая блочные устройства, разделы и файловые системы Linux. Как только основные понятия о дисках и файловых системах будут изучены, можно будет приступать к созданию разделов и файловых систем для установки.
Для начала, рассмотрим блочные устройства. Устройства SCSI и Serial ATA обозначаются как /dev/sda , /dev/sdb , /dev/sdc и так далее. На более современных компьютерах твердотельные накопители NVMe на базе PCI Express имеют дескриптор вида /dev/nvme0n1 , /dev/nvme0n2 и так далее.
Следующая таблица поможет определить необходимый тип блочного устройства в системе:
Тип устройства | Дескриптор устройства по умолчанию | Примечания и полезные сведения |
---|---|---|
NVM Express (NVMe) | /dev/nvme0n1 | Передовая на данный момент технология твердотельных накопителей. Устройства NVMe подключаются к шине PCI Express и обладают наиболее быстрой скоростью передачи блочных данных, доступной на рынке. Системы образца 2014 года и новее могут иметь поддержку устройств NVMe. |
SATA, SAS, SCSI или USB flash | /dev/sda | Данный тип устройств стал доступным примерно с 2007 года и встречается до сих пор, являясь, пожалуй, самым используемым типом в Linux. Устройства могут подключаться через шины SATA, SCSI или USB в виде устройства блочного хранилища. |
MMC, eMMC и SD | /dev/mmcblk0 | Устройства embedded MMC, SD-карты и другие типы карт памяти могут использоваться для хранения данных. Однако не все системы могут позволить загружаться с данного типа устройств. Не рекомендуется использовать данные устройства для установки Linux; лучше используйте их по прямому назначению — для переноса файлов. Также их можно использовать для кратковременного резервного копирования. |
IDE/PATA | /dev/hda | Так старые драйверы ядра Linux отображают диски IDE/Parallel ATA, подключённые к шине IDE. Строго говоря, подобный тип устройств постепенно исчезает из компьютеров с 2003 года, когда компьютерная индустрия переключилась на SATA. Большинство систем с одним контроллером IDE могут поддерживать до четырёх устройств ( hda - hdd ) Альтернативное именование для этих устаревших интерфейсов включают в себя Extended IDE (EIDE) и Ultra ATA (UATA). |
Данные блочные устройства представляют абстрактный интерфейс к диску. Пользовательские приложения могут использовать их для взаимодействия с диском, не заботясь о том, какой это диск — SATA, SCSI или какой-либо ещё. Программа просто адресует пространство на диске как совокупность следующих друг за другом 4096-байтных (4K) блоков с произвольным доступом.
Introduction to block devices
Block devices
ЗаметкаPlaceholder for introduction to block devices specific to that architecture
Designing a partition scheme
ЗаметкаPlaceholder for designing a partition scheme specific to that architecture
Создание файловых систем
Введение
Теперь, когда разделы созданы, пора разместить на них файловые системы. В следующем разделе описаны различные поддерживаемые в Linux файловые системы. Те из читателей, кто уже знает, какую файловую систему будет использовать, могут продолжить с раздела Создание файловой системы. Другим стоит продолжить чтение, чтобы узнать о доступных вариантах…
Файловые системы
Linux поддерживает несколько десятков файловых систем, хотя для большинства из них необходимы достаточно веские причины их использовать. Лишь только некоторые из них можно считать стабильными на архитектуре amd64. Рекомендуется прочитать информацию о файловых системах и об их состоянии поддержки перед тем, как останавливать свой выбор на экспериментальных.
btrfs Файловая система следующего поколения, обеспечивающая множество дополнительных функций, таких как мгновенные снимки, самовосстановление с помощью контрольных сумм, поддержка прозрачного сжатия, субтомов и интегрированный RAID. Ядра старше ветки 5.4 не обеспечивают безопасную работу btrfs, так как исправления наиболее серьёзных проблем стабильности появились только в более поздних ветках долговременной поддержки ядра. Ошибки с повреждением файловой системы довольно часты для старых версий ядра, особенно небезопасны и нестабильны версии старше 4.4. Повреждения файловой системы для ядер старше 5.4 обычно характерны при включении сжатия. RAID 5/6 и quota groups небезопасны для всех версий btrfs. Более того, btrfs может неявным образом нарушить работу с файловыми операциями с ошибкой ENOSPC (при этом df сообщает, что свободное место есть) из-за внутренней фрагментации (свободное место высчитывается из расчёта DATA + SYSTEM участков, но при этом этом не учитывается в участках METADATA). Также, единственная ссылка 4K на экстент 128M внутри btrfs может отображать свободное место, которое недоступно для использования. Всё это приводит к тому, что btrfs возвращает ENOSPC, а df говорит, что есть свободное пространство. Установка sys-fs/btrfsmaintenance и конфигурация сценариев на периодический запуск поможет сократить количество проблем с ENOSPC путём ребалансировки btrfs, но не устранит их окончательно. Некоторые системы могут никогда не получить ошибку ENOSPC, когда как другие будут встречать её часто. Если риск получения ошибки ENOSPC недопустим, следует использовать другую файловую систему. При использовании btrfs убедитесь, что не собираетесь использовать конфигурацию, которая известна своей нестабильностью. За исключением проблемы ENOSPC, информация о существующих проблемах btrfs в последних ветках ядра доступна на вики-странице состояния btrfs. ext2 Это проверенная и надежная файловая система Linux, но она не обладает средствами журналирования метаданных, что означает, что проверка файловой системы ext2 при запуске может занимать довольно много времени. Существует достаточно широкий выбор журналируемых файловых систем нового поколения, целостность которых может быть проверена очень быстро, что является преимуществом перед нежурналируемыми системами. Журналирование файловой системы позволяет избежать долгих задержек при загрузке системы, а также избежать её нестабильного состояния. ext3 Журналируемая версия файловой системы ext2, обеспечивающая журналирования метаданных для быстрого восстановления в дополнение к другим режимам журналирования, таким как журналирование всех данных и упорядоченных данных. В данной ФС используются индексы на базе деревьев хешей, что в большинстве случаев обеспечивает высокую производительность. Вкратце, ext3 — это очень хорошая и надёжная файловая система. ext4 Изначально созданная как ответвление от ext3, ext4 реализует новые возможности, повышение производительности и устранение ограничений на размер раздела на диске ценой незначительного изменения формата данных на диске. Она может быть размером до 1 ЭБ, а максимальный размер файла может составлять 16 ТБ. Вместо классического ext2/3 блочного распределения ext4 использует экстенты, которые улучшают производительность при работе с большими файлами и уменьшают фрагментацию. Ext4 также обеспечивает более сложные алгоритмы распределения блоков (отложенное распределение и мультиблочное распределение), дающие драйверу файловой системы больше возможностей по оптимизации размещения данных на диске. Ext4 рекомендуется как универсальная файловая система для всех платформ. f2fs Файловая система (Flash-Friendly File System) была создана Samsung для использования на NAND-накопителях. По состоянию на 2 квартал 2016 года файловая система считается не завершенной, но она может быть достойным выбором при установке на microSD карту, USB-накопитель или другие накопители. JFS Высокопроизводительная журналируемая файловая система от IBM. JFS — это легкая, быстрая и надежная файловая система, основанная на двоичных деревьях с хорошей производительностью в различных условиях. ReiserFS Основанная на двоичных деревьях журналируемая файловая система с хорошей общей производительностью, особенно при работе с множеством мелких файлов ценой чутью больших затрат центрального процессора. ReiserFS версии 3 включена в ядро Linux, однако не рекомендуется использовать её для первичной установки системы Gentoo. Существуют более новые версии ReiserFS, но для своей работы они требуют дополнительных патчей ядра. XFS Файловая система с журналированием метаданных, которая поставляется с мощным набором функций и оптимизирована для масштабируемости. XFS менее снисходительно относится к различным аппаратным проблемам, однако непрерывно обновляется, обрастая новым возможностями. VFAT Так же известна как FAT32, поддерживается Linux, но не имеет поддержку стандартных файловых разрешений UNIX. В основном используется для взаимодействия с другими операционными системами (в основном Microsoft Windows и Apple OSX), но также необходима при использовании некоторых системных прошивок загрузчика (например, UEFI). NTFS New Technology Filesystem является основной файловой системой для Microsoft Windows начиная с NT 3.5. Как и vfat, она не сохраняет настройки UNIX разрешений и расширенные атрибуты, необходимые для нормальной работы BSD или Linux, поэтому её не следует использоваться в качестве корневой файловой системы. Её необходимо использовать только для взаимодействия с системами Microsoft Windows (обратите внимание на акцент слова только).Создание файловой системы
Для создания файловых систем на разделе или томе существуют пользовательские утилиты для каждого возможного типа файловой системы. Нажмите на имя файловой системы в таблице ниже для получения дополнительной информации о каждой файловой системе:
Например, чтобы создать корневой раздел ( ) в ext4 при использовании структуры разделов из примера, используются следующие команды:
При использовании ext2, ext3 или ext4 на малых разделах (менее 8 ГиБ) файловая система должна быть создана с особыми параметрами для резервирования достаточного количества индексных дескрипторов (inodes). Приложение mke2fs ( mkfs.ext2 ) использует настройки «bytes-per-inode» для вычисления количества необходимых дескрипторов. На небольших разделах рекомендуется увеличивать расчётное количество дескрипторов.
Данные команды учетверяют количество индексных дескрипторов для такой ФС, так как «bytes-per-inode» уменьшает количество байт на каждый дескриптор с 16 кб до 4 кб. Это соотношение может быть изменено в любую сторону с помощью команды:
Теперь создайте файловые системы на только что созданных томах (или логических разделах).
Активация раздела подкачки
Для инициализации разделов подкачки используется команда mkswap :
Чтобы активировать раздел подкачки, используйте swapon :
Создайте и активируйте раздел подкачки командами выше.
Монтирование корневого раздела
Теперь, когда созданы разделы и размещённые на них файловые системы, настало время их смонтировать. Используйте команду mount , только не забудьте предварительно создать каталоги для монтирования каждого созданного раздела. В качестве примера мы смонтируем корневой раздела:
ЗаметкаЕсли /tmp/ находится на отдельном разделе, не забудьте после монтирования изменить права доступа:
Позже в инструкции будут смонтированы файловая система proc (виртуальный интерфейс к ядру) и другие псевдофайловые системы ядра. Но сначала мы установим установочные файлы Gentoo.
Далее разбираемся в блочных устройствах операционной системы Linux
В этой статье мы дополнительно проанализируем блочные устройства Linux, надеясь дать вам более глубокое понимание деталей реализации блочных устройств.。
Фактически, блочное устройство или драйвер блочного устройства могут быть очень удобно реализованы в операционной системе Linux. В Linux такими блочными устройствами являются хорошо известные RAID, multipathing и Ceph RBD. Его характеристика есть в операционной системе /dev В каталоге будет создан файл. Различные типы блочных устройств, показанные на рисунке 1, включают обычные блочные устройства SCSI и блочные устройства логических томов LVM, которые по сути являются блочными устройствами.Разница заключается в различной бизнес-логике и именах.
В операционной системе LinuxРеализация блочных устройств на самом деле очень проста, но также очень сложна.. Простая вещь состоит в том, что мы можем создать драйвер блочного устройства только с двумя функциями; сложная часть состоит в том, что взаимосвязь между шиной блочного устройства и нижележащим драйвером устройства сложна, и существует много типов драйверов блочных устройств.
Давайте сначала посмотрим, как создать блочное устройство. Метод создания очень прост. Он в основном вызывает две функции ядра Linux, а именно alloc_disk и add_disk. alloc_disk используется для выделения одного gendisk Экземпляр структуры, и последний должен зарегистрировать экземпляр структуры в системе. После двух вышеуказанных шагов мы можем /dev См. Блочное устройство в каталоге.Еще одно важное место - инициализировать очередь запросов структуры gendisk, чтобы при получении запроса на уровне приложения он вызывал процедуру очереди для обработки.。
Подробный код реализации для создания блочных устройств не предназначен для использования в качестве подробного введения. Студенты, которым необходимо знать, могут прочитать книгу «Драйверы устройств Linux», Последняя - третья редакция.Глава 16 этой книгиВ нем подробно представлены детали реализации драйвера блочного устройства на основе памяти, а также имеется вспомогательный исходный код. Так называемое блочное устройство на основе памяти означает, что данные этого блочного устройства хранятся в памяти, а не на реальном физическом устройстве, таком как магнитный диск или оптический диск. Ниже приведен фрагмент кода из книги, приведенной в этой статье. Ядром являются две упомянутые выше функции.
Вышеупомянутая программа блочного устройства может быть скомпилирована в модуль ядра. После загрузки модуля ядра с помощью команды insmod вы можете /dev Под каталогом вы видите файл с именемsbullaЗаблокировать устройство.
Сложность блочного устройства заключается в большом разнообразии шин, а также в множестве основных типов драйверов. Сложность всей системы заключается в инициализации блочного устройства. После включения устройства очень сложно связать его с ядром Linux и представить его пользователю. На рис. 2 показан снимок экрана содержимого шины Linux, представленного этим номером. Блочное устройство может быть расположено в любом месте шины на рисунке.
Поскольку эта часть содержимого сама по себе очень сложна, в этой статье не приводятся подробности содержимого, относящиеся к работе по инициализации устройства. Впоследствии этот номер будет вводить связанный контент отдельно. Сегодня эта статья в основном представляет связанное содержимое блочного устройства и уровня базового драйвера в более интуитивно понятной форме с помощью нескольких примеров.
В качестве примера возьмем блочное устройство SCSI, хотя имя отображается в / dev.sdXБлокировать устройства, но основная разница между драйверами очень велика. Мы знаем, что устройства SCSI могут быть подключены к хосту разными способами:
- Интерфейсный диск SAS или SATA
- IP-SAN, который соединяет устройства хранения через Ethernet и выглядит как обычные диски на стороне хоста.
- FC-SAN, подключенный к запоминающему устройству через оптическое волокно, выглядит как обычный диск на стороне хоста.
Видно, что, хотя все они основаны на блочных устройствах SCSI, основные различия в драйверах очень велики, поэтому процесс инициализации, естественно, сильно отличается. Это все блочные устройства SCSI.Если рассматриваются сетевые блочные устройства (nbd или rbd) и блочные устройства, такие как гибкие диски и оптические диски, это более сложно.
Самая большая особенность сетевого блочного устройства - это создание сопоставления устройства от сервера к клиенту, что очень просто по сравнению со SCSI. Давайте возьмем NBD в качестве примера, чтобы понять основные принципы. Сам NBD представляет собой архитектурную программу CS (клиент-сервер), которая может отображать файл или диск на стороне сервера (команда: nbd-server 12345 itworld123.txt, где 12345 - номер порта). На самом деле это очень похоже на сопоставление NFS с каталогами.Разница в том, что NBD сопоставляется с диском на клиенте, а NFS сопоставляется с деревом каталогов на клиенте.
Инициализация блочного устройства по-прежнему выполняется двумя вышеуказанными функциями, но здесьЯдро - это инициализированная процедура очереди запросов. do_nbd_request . Эта функция является ядром блочного устройства NBD, которое преобразует запрос блока в сетевой запрос и отправляет его на сервер NBD для обработки. Протокол сетевого запроса очень прост, он определяется структурой, показанной на рисунке 4.
DRBD
Номер DRBD был представлен в предыдущей статье, и он называется распределенным реляционным блочным устройством (то есть блочным устройством распределенной репликации). DRBD можно понимать как сетевой RAID1, то есть его блочные устройства существуют на двух серверах одновременно, и существует взаимосвязь спаривания. Когда делается запрос на запись в одно из блочных устройств, DRBD копирует данные в блочное устройство на другом сервере с помощью внутренней логики. Таким образом повышается доступность блочного устройства.Когда один из серверов не работает, другой сервер все еще может предоставлять мне услуги.
Подобно NBD, разница между DRBD и другими блочными устройствами заключается в его процедуре обработки очереди. В DRBD это процедура drbd_make_request. Вы можете проанализировать конкретную реализацию этой процедуры самостоятельно.
Помимо типов блочных устройств, представленных выше, существует множество типов блочных устройств, таких как LVM и multipath. Из-за ограниченного объема в данной статье он пока не рассматривается, а будет представлен позже.
В предыдущей статье мы упоминали псевдофайловую систему блочного устройства, и мы знаем, что псевдофайловая система в конечном итоге вызовет общий блочный уровень. generic_perform_write функция. Затем в этой статье будет проанализирована конкретная реализация этой функции, чтобы каждый имел более глубокое представление о процедурах в группе запросов, упомянутой выше. Ниже приведен конкретный код функции. В этой статье удаляются некоторые некритические части кода и сохраняется основной код.
Вывести список действительных в данный момент блочных устройств:
… Включая информацию о подключенных файловых системах:
Вывести списки блочных устройств по идентификатору, способу подключения, метке и UUID (в последних двух случаях — только для тех устройств, где они назначены):
Вывести отдельные метаданные (UUID, метка, тип ФС, etc. ) блочных устройств:
Вывести сведения о разделах доступных носителей:
… Более подробную информацию о разделах устройства /dev/ sdX :
Вывести таблицу разделов MBR устройства /dev/ sdX в текстовом представлении:
… В виде, пригодном для последующего восстановления:
… Скопировать таблицу с /dev/ sdX на /dev/ sdY :
Скопировать главную загрузочную запись с устройства /dev/ sdX в файл sdX.mbr :
Считать данные температурных датчиков устройств:
… Получить эти же данные с hddtemp(8), работающего в режиме демона и обслуживающего запросы на порту 7634 :
Снять образ устройства /dev/ sdX в файл image :
… Упакованный образ в файл image.gz ( image.bz2 , image.xz ):
Восстановить содержимое устройства /dev/ sdX из файла image (осторожно! очевидно, эта команда приведет к потере всех находящихся на устройстве данных):
Записать образ image на DVD в приводе /dev/ sr3 :
Обнаружить и инициализировать новое устройство на порту hostA :
Удалить из системы устройство /dev/ sdX :
Измерить производительность устройства /dev/ sdX :
Запустить процедуры самодиагностики S.M.A.R.T. для устройства /dev/ sdX :
Вывести информацию об известных физических томах, группах, и логических томах LVM:
… Только о физических томах /dev/ sdX4 , /dev/ sdY2 :
… Только о логических томах группы vgfoo :
Активировать логический том lvbar группы vgfoo :
… Все тома группы vgfoo :
Запретить (разрешить) запись на логический том lvbar группы vgfoo :
Инициализировать устройства /dev/ sdX4 , /dev/ sdY2 как физические тома:
Создать группу томов vgfoo с использованием физических томов /dev/ sdX4 , /dev/ sdY2 :
… Удалить (осторожно! перед выполнением проверьте, что группа не содержит каких-либо имеющих значение данных):
… Используя только свободное пространство физических томов /dev/ sdY2 , /dev/ sdZ :
… Удалить (осторожно! перед выполнением проверьте, что том не содержит каких-либо имеющих значение данных):
Перенести данные физического тома /dev/ sdY2 на другие физические тома группы:
Читайте также: