Это изображение из TLDP просто потрясающее. Оно показывает, что перед тем, как предоставить пользовательскому пространству фактический доступ к файловой системе для чтения, записи и открытия, блоки отображаются на виртуальной файловой системе.
иВикипедияговорит, что существует 3 версии файловых систем на разных уровнях.
Итак, являются ли стандартные (узлы sd) относящимися к физическим или, послеЛВМотображенная виртуальная файловая система?
Или они имеют в виду только раздел? (что означало бы, что запись непосредственно на раздел также пропустит драйвер файловой системы, без которого вы даже не сможете взаимодействовать с самими файлами)
Если это так, то какие устройства представляют собой драйверы файловой системы или файловые системы или... Я просто не знаю... Может ли кто-нибудь дать мне ссылку на источник, где объясняется использование диска ядром?
решение1
вкратце: /dev/sdaX
представляет раздел. Я думаю, что фундаментальное заблуждение, которое у вас есть, заключается в разнице между файловыми системами и разделами. Раздел на самом деле прост — по сути, это просто часть диска, которая определена в таблице разделов в начале диска. Однако файловая система — это гораздо более сложная вещь. Файловая система по сути является структурой данных, используемой для отслеживания файлов, которые ядро (в частности, драйвер файловой системы) может читать и записывать. Эту структуру данных технически можно разместить в любом месте на диске, но ожидается, что начало структуры данных fs будет таким же, как и начало раздела.
В своем вопросе вы упомянули LVM — давайте пока забудем об этом, поскольку это более сложная тема (я объясню LVM в конце).
Допустим, у вас есть один жесткий диск на 100 ГБ, на котором нет ничего, кроме нулей. В этом случае у вас будет файл, /dev/sda
из которого вы можете извлечь 100 ГБ (хотя eg du
сообщит о нем как о файле нулевой длины, поскольку это специальный блок), и он не содержит ничего, кроме нулей. /dev/sda
— это метод, с помощью которого ядро предоставляет необработанное содержимое устройства пользовательскому пространству для чтения и записи. Вот почему он имеет тот же объем данных, что и ваш диск, и имеет то же содержимое, что и ваш диск. Если вы переключите пятый бит на /dev/sda
единицу вместо нуля, ядро переключит пятый бит на физическом диске для соответствия. На представленной вами схеме эта запись будет проходить через интерфейс системного вызова в ядро, затем через драйвер жесткого диска IDE и, наконец, на сам жесткий диск.
Теперь предположим, что вы хотите сделать что-то полезное с этим диском, например, хранить на нем файлы. Теперь вам нужна файловая система. В ядре Linux вам доступно множество нелепых файловых систем. Каждая из них использует свою структуру данных на диске для отслеживания файлов, и они также могут изменять свои структуры данных разными способами, например, чтобы предоставитьатомарная записьгарантии (т.е. запись либо успешна, либо нет; данные не могут быть записаны наполовину, даже если машина выходит из строя). Вот что люди имеют в виду, когда говорят о «драйвере файловой системы»: драйвер файловой системы — это фрагмент кода, который понимает, как читать и записывать структуры данных определенной файловой системы на диск. Примерами являются ext4, btrfs, XFS и т.д.
Итак, вы хотите хранить файлы. Допустим, вы выбрали ext4 в качестве файловой системы. Теперь вам нужно отформатировать диск так, чтобы на нем существовали структуры данных для пустой файловой системы. Для этого вы используете mkfs.ext4
и указываете ему записать в /dev/sda
. mkfs.ext4
Затем ядро запишет пустую файловую систему ext4, начиная с начала /dev/sda
. Затем ядро возьмет записи в /dev/sda
и применит их к началу физического диска. Теперь, когда на диске содержатся структуры данных файловой системы, вы можете, например, mount /dev/sda /mnt
смонтировать совершенно новую файловую систему, переместить в нее файлы и т. д. Любые записи в файлы /mnt
затем будут проходить через интерфейс системных вызовов, затем в драйвер файловой системы ext4 (который знает, как превратить более абстрактную команду «записать эти данные в такой-то файл» в конкретные изменения, которые необходимо внести в структуры данных файловой системы на диске), затем в драйвер жесткого диска IDE, а затем, наконец, в сам диск.
Итак, вышесказанное будет работать, но обычно люди так не делают. Обычно они используютперегородкина диске. Раздел — это, по сути, просто определенный раздел диска. Когда вы используете разделы, у вас естьтаблица разделовв начале диска, где указано, где физически расположен каждый раздел. Разделы удобны, поскольку позволяют разделить диск на несколько разделов, которые можно использовать для разных целей.
Допустим, вы хотите создатьдвафайловые системы на диске, обе ~50 ГБ (т.е. пополам). Сначала вам нужно будет разбить диск на разделы. Для этого вам нужно будет использовать такой инструмент, как fdisk
или gdisk
, оба из которых создают различные типы таблиц разделов, и вы должны указать своему инструменту записывать в /dev/sda
. Когда вы закончите разбиение, у вас будет /dev/sda
, /dev/sda1
, и /dev/sda2
. /dev/sda1
и /dev/sda2
— это способ ядра представлять различные разделы на диске. Если вы запишете в начало /dev/sda2
, он запишет в начало второго раздела, который находится всередина диска.
Другой способ объяснить это — поговорить о содержимом /dev/sda
. Вспомним, что /dev/sda
это бит в бит, содержимое физического жесткого диска. И /dev/sda1
это бит в бит, содержимое первого раздела жесткого диска. Это означает, что /dev/sda
есть немного данных — заголовок раздела — за которым следует точное содержимое /dev/sda1
, затем /dev/sda2
. /dev/sda1
и /dev/sda2
сопоставлены с определенными областями на диске, которые являются разделами, которые вы настроили.
Отсюда мы можем использовать mkfs.ext4
снова для создания файловой системы на /dev/sda1
, которая будет записывать на диск, начиная сразу после заголовка раздела. Если мы используем mkfs.ext4
на /dev/sda2
, она будет записывать, начиная с начала раздела, который находится в середине диска (и, таким образом, в середине /dev/sda
содержимого ).
Теперь вы можете сделать, например, mount /dev/sda2 /mnt
. Это говорит ядру читать данные файловой системы, начиная с начала второго раздела, и предоставлять их вам в более удобной форме — т. е. файлы и каталоги в месте /mnt
. Опять же, ядро использует драйвер файловой системы для фактического выполнения этого сопоставления.
Теперь давайте кратко поговорим о LVM. LVM — это, по сути, просто абстракция над разделами. Разделы отображаются очень, очень прямо в физические местоположения на диске. В примере с двумя разделами выше, предположим, вы хотите удалить первый раздел и расширить второй на освободившееся пространство. Поскольку разделы отображаются напрямую в области диска, единственный способ сделать это — физически переместить все 50 ГБ данных раздела в начало диска, а затем расширить раздел до конца.
LVM разработан, чтобы сделать это менее болезненным. По сути, вы даете LVM кучу необработанного хранилища, а затем говорите ему, как использовать это хранилище. LVM предоставляет вам виртуальный «диск», который можно разделить как разделы, но чье базовое хранилище может находиться где угодно в необработанном пуле хранения, который вы для него выделили. Чтобы использовать пример выше, если вы дали LVM весь диск для использования, а затем разделили его на два, вы можете удалить первый «раздел» и расширить второй «раздел», чтобы мгновенно заполнить это пространство, потому что LVM может отслеживать, где находятся данные на диске, не требуя от них строгого «порядка».
Более подробную информацию о работе LVM можно найти в этом ответе:https://unix.stackexchange.com/a/106871/29146
решение2
/dev/sda
— это интерфейс ко всему жесткому диску. Если у вас есть разрешение, вы можете напрямую искать в любом месте на диске. /dev/sda1
— это первый раздел на диске. На этом этапе файловая система еще не задействована. Внутри раздела может быть непосредственно файловая система или это может быть контейнер LVM.