Записки IT специалиста
Linux — начинающим. Часть 4. Работаем с файловой системой. Теория
- Автор: Уваров А.С.
- 21.01.2016
Умение работать с файловой системой — один из наиболее важных навыков для начинающих. Действительно, о какой работе с системой может идти речь, если вы не знаете где и какие системные файлы расположены, не можете свободно перемещаться по дереву каталогов и выполнять элементарные операции с файлами? Тем более, что эти вопросы в руководствах обычно не поднимаются, предполагая, что читатель обладает необходимым минимумом знаний и умений. Поэтому очередная часть нашего цикла будет посвящена именно работе с файловой системой.
Научиться настраивать MikroTik с нуля или систематизировать уже имеющиеся знания можно на углубленном курсе по администрированию MikroTik. Автор курса, сертифицированный тренер MikroTik Дмитрий Скоромнов, лично проверяет лабораторные работы и контролирует прогресс каждого своего студента. В три раза больше информации, чем в вендорской программе MTCNA, более 20 часов практики и доступ навсегда.
Перед тем как начать, вспомним, что такое файловая система. Прежде всего, это порядок, определяющий способ организации, хранения и именования информации на устройствах хранения, а только потом практическая реализация этого порядка. Т.е. первичен некий свод правил: что где лежит, как называется и т.д. и т.п., а практические реализации файловых систем, например, NTFS или ext4, это технический способ организации информации на определенном типе носителя в соответствии с принятыми правилами.
За примерами далеко ходить не надо, каждый пользователь Windows знает, что файлы лежат в папках, папки на разделах (логических дисках), а систему следует искать в папке Windows системного диска. Точно также любой Linux администратор будет искать настройки в /etc, логи в /var/log, а свои собственные документы в /home.
Так как большинство начинающих Linux администраторов уже имеют достаточный опыт работы с файловой системой Windows, то прежде всего мы рассмотрим, что общего у двух систем, а чем они отличаются. Понимание этих моментов поможет по максимуму использовать уже имеющийся опыт, в тоже время, не совершая глупых ошибок.
Структура файловой системы
Начнем с привычного и понятного.
В основу файловой системы Windows положен диск, символизирующий собой отдельное устройство хранения информации. При этом каждый диск содержит свою собственную файловую систему, корень которой составляет он сам и обозначается буквой. Т.е. запись вида C:\ — обозначает корень файловой системы на диске С, а D:\Работа — папку в корне файловой системы диска D. Подключая к системе новый носитель информации мы получаем еще одну или несколько файловых систем.
Это одна из самых больших привычек: подключили накопитель — в системе появился новый диск, если это не так, то накопитель либо не определился, либо неисправен.
В Linuх концепция принципиально иная. Вспомним: все есть файл, дисковые накопители — это тоже определенный тип файла. Кроме того, файловая система Linuх иерархична, т.е. имеет один единственный корень, обозначаемый символом /.
Этот момент вызывает у новичков множество непониманий. Но на самом деле нет ничего сложного, файловая система в Linux просто организована по-другому, но при этом она по-своему стройна, логична и понятна.
Давайте еще раз рассмотрим схему с Windows. На ней имеется один физический диск для системы, второй для пользовательских данных и компакт диск с музыкой. А теперь взглянем на другую схему, где мы показали аналогичную организацию размещения данных в среде Linux.
У нас также имеется системный диск, на котором расположен корень файловой системы и все системные папки. Пользовательские данные все также располагаются на втором физическом диске, но в системе вы его не увидите. Почему? Да потому что в файловой системе Linux такого понятия нет. Новички на этом месте обычно впадают в панику, считают что диск не определился и начинают судорожно искать его где можно и где нельзя.
Но диск, с точки зрения Linux, это тоже файл и может быть расположен в любом месте файловой системы. В нашем случае никто не мешает поместить его на место папки /home, где располагаются пользовательские данные. Такое действие называется монтированием, а место файловой системы, к которому присоединен носитель — точкой монтирования. Таким образом папка /home целиком окажется на втором жестком диске, что будет в какой-то мере аналогично переносу пользовательских данных на диск D.
Съемные носители, такие как компакт-диски, флешки и т.п. в графической среде монтируются автоматически в предопределенную директорию /media, а в рабочем окружении появляется ярлык, что делает работу с ними неотличимой от Windows. В серверной среде вам потребуется монтировать съемные носители вручную, также вы можете выбрать произвольную точку монтирования, но лучше не изобретать велосипед, а использовать /media.
Еще один момент, связанный с иерархичностью файловой системы Linuх — это неизменность путей к данным при изменении физической структуры дисков. Простой пример: у вас есть большая коллекция музыки, которую вы решили вынести на отдельный жесткий диск. В Windows все просто: купили новый диск, подключили, скопировали. Но есть один недостаток. Если до этого пути к музыке были D:\Музыка, то стали E:\Музыка и все ранее созданные ярлыки, плейлисты и т.п. стали неверны.
В Linux процесс выглядит немного посложнее: новый диск временно монтируется, скажем, в /mnt, затем на него переносится содержимое папки /home/Музыка, после чего он монтируется на постоянной основе в точку /home/Музыка. В итоге наша коллекция лежит на отдельном жестком диске, но все плейлисты как работали с /home/Музыка так и продолжают работать.
Эту возможность трудно переоценить, особенно когда надо вынести на отдельный раздел не коллекцию музыки, а базу почтового сервера или содержимое хранилища виртуальных машин.
Имена файлов и расширения
Имена файлов и папок в Linux ограничены длинной в 256 символов и запретом на / (слеш). Отдельно следует упомянуть о символах . (точка) и
(тильда), точка перед именем файла или директории добавляют ему атрибут «скрытый», а тильда после имени добавляет атрибут «архивный» и также делает файл скрытым. Например, .file — скрытый файл, а file
Но это не говорит о том, что можно называть файлы, как вам нравится, без оглядки на иные системы, прежде всего Windows. Допустим, мы решили вопреки всем правилам назвать файл <Правила?>, в Linux нам никто не помешает этого сделать, но уже попытавшись скопировать его на флешку с FAT32 нас постигнет наказание, имя файла превратится в набор подчеркиваний.
Если передать его по SSH то ситуация будет немного получше, подчеркиваниями заменятся только запрещенные символы, а просто перетащив файл из окна виртуальной машины мы получили третий вариант именования файла.
Поэтому, если вы не хотите превращения имени вашего файла в нечто совершенно неожиданное, то не используйте в именах символы:
Также не злоупотребляйте служебными символами в начале имени, например, никто не мешает создать вам файл с именем -text, однако при попытке скопировать его в консоли вы получите неожиданный результат:
Еще одна важная особенность — Linux регистрозависимая система, это означает, что file.txt, File.txt и file.TXT — три разных файла!
Пока вы работаете с такими файлами в среде Linux проблем не будет, но если мы их попытаемся скопировать на флешку FAT32, то сразу возникнут затруднения.
Но это цветочки, ягодки будут тогда, когда вам понадобиться перенести на Windows платформу, скажем, веб-сайт со всем содержимым, куда на протяжении длительного времени заливались многочисленные image.jpg, Image.jpg или image.JPG.
Поэтому примите к сведению и постарайтесь соблюдать еще одно простое правило: все имена файлов набирать только в нижнем регистре, верхний регистр допускается там, где он уместен, например, в именах собственных. Также не забывайте о спецсимволах. Почему? Просто посмотрите на скриншот ниже:
Отдельный разговор — это пробелы в именах файлов. Такая практика не запрещается, но считается в профессиональных кругах дурным тоном. По возможности избегайте таких имен.
Следующая особенность Linux-систем — это расширения файлов. В Windows тип файла полностью определяется его расширением, от которого также зависит дальнейшее поведение системы при работе с таким файлом. Все знают, что для того, чтобы скрипт мог запускаться, ему нужно присвоить расширение bat или cmd. В Linux поведение системы в отношении того или иного файла зависит от его типа, а для возможности запуска файл должен иметь установленный атрибут «исполняемый».
Однако это не говорит, что Linux игнорирует расширения файлов. В графической среде, для удобства пользователя, расширения точно также ассоциируются с приложениями, как и в Windows. Но есть и отличия, вы можете дать файлу несуществующее расширение или оставить его без расширения вообще, система правильно определит тип содержимого и сопоставит его с программой. А вот присвоив ему зарезервированное расширение вы просто сопоставите файл программе, без учета его содержимого.
Как видим документ LibreOffice успешно определяется последним невзирая на «левое» или отсутствующее расширение, но присвоив ему расширение jpg, мы сопоставим его программе просмотра изображений и получим ошибку при открытии.
С изображением и иным медиаконтентом связана еще одна особенность, если у файла есть расширение, то система не будет определять его реальное содержимое и будет пытаться открыть его так, как указано в расширении. Простой пример: мы переименовали файл jpg в png, после чего получили ошибку при попытке его открыть, в тоже время тот же самый файл без расширения вообще открывается нормально.
В Windows jpg переименованный в png (и наоборот) открываться будет нормально, разве что специализированный софт (например, Photoshop) станет ругаться. Поэтому если у вас в Linux перестали открываться мультимедийные файлы, которые нормально открываются в Windows, попробуйте просто удалить им расширение, чтобы система самостоятельно определила содержимое. Для примера мы специально удалили расширения у файлов различных типов, что из этого вышло можно увидеть ниже:
Конечно не со всеми типами файлов все гладко, так документы формата MS Office 2007 и выше (docx, xslx и т.п.) будут определяться как zip-архивы, которыми на самом деле и являются, но мы думаем, что ситуация, когда вы получите офисный документ без расширения на практике вам не встретится.
Жесткие и символические ссылки
Начав работать с Linux вы обязательно столкнетесь с этим типом файлов. Они не имеют прямого аналога в файловой системе Windows и поэтому на них стоит остановиться подробнее.
Начнем с символических ссылок, в первом и достаточно грубом приближении они напоминают ярлыки Windows, это специальный тип файла, который служит указателем на другой файл. Но при этом, в отличии от ярлыка, воспринимается системой прозрачно, т.е. не как файл ярлыка, а как файл типа, на который указывает ссылка. Проще говоря, мы не можем подсунуть Windows приложению ярлык на библиотеку вместо библиотеки, а в Linux это общепринятая практика.
Разберем устройство символических ссылок подробнее, в дальнейшем это поможет понять их отличие от жестких ссылок и лучше понять сферу их применения. Как известно файл (или каталог) есть ничто иное, как некая именованная область на диске. Соответствие имени файла областям диска хранится в специальной таблице файловой системы (inode в Linux, MFT или FAT в Windows), т.е. файл — это указатель в inode на определенную область данных на диске.
Символическая ссылка — это отдельный файл, со своим inode, который указывает на изначальный файл. Если первоначальный файл будет удален или перемещен, символические ссылки останутся, но окажутся бесполезными. В тоже время мы можем как угодно перемещать символические ссылки или удалять их, что никак не скажется на первоначальном файле.
Символические ссылки широко применяются в случаях, когда один и тот-же файл должен быть доступен под разными именами или в разных местах, но при этом его содержимое не должно меняться. Например, некое приложение требует библиотеку lib-1.0.1.so, в то время как есть совместимая библиотека lib-1.0.5.so, в этом случае создаем символическую ссылку на lib-1.0.5.so с именем lib-1.0.1.so и проблема решена. Другой случай, приложение требует lib-1.0.5.so, которая есть в системе, но ищет ее в другом месте, в этом случае делаем символическую ссылку с таким же именем, но в нужное расположение.
Визуально символические ссылки можно определить по значку ярлычка в графическом окружении или по символу @ перед именем файла в mc (но, если вы создадите файл с началом имени на @ — символической ссылкой он не станет).
Другое применение, это файлы настроек. Например, веб-сервер Аpache содержит два набора директорий: с доступными модулями и настройками, и применяющимися в текущий момент. Для того, чтобы подключить модуль или настройку достаточно сделать символическую ссылку из одной директории в другую, надо выключить — удаляем символическую ссылку. Сам файл модуля или настроек остается на своем месте и может быть использован в дальнейшем.
Символические ссылки можно создавать не только на файлы, но и на каталоги. Также нет ограничения на физическое расположение символических ссылок в пределах одной физической файловой системы (одного раздела).
Жесткие ссылки. Это принципиально иная сущность. Жесткая ссылка создает еще одну запись в inode файла, т.е. по сути является еще одним его именем, а внешне является полной копией первоначального файла, определить при этом где файл, а где жесткая ссылка практически невозможно. Отличие жесткой ссылки от копии заключается в том, что несмотря на разные имена, это один и тот-же файл и, если изменить одно из его имен — изменятся остальные. Также файл физически существует до тех пор, пока на него есть хоть одна ссылка (первоначальный это файл или символическая ссылка — значения не имеет).
Для чего могут понадобиться жесткие ссылки? Самое распространенное их применение, это создание полных копий файла без лишних затрат дискового пространства. Например, инсталляционные пакеты. Допустим нам надо выложить на FTP несколько вариантов ПО, в каждый из наборов которого входят некие общие пакеты и документация, причем нужна синхронизация между этими файлами, например, если мы внесли изменения в документацию, это должно отразиться во всех наборах. Жесткие ссылки отлично решают эту задачу.
В тоже время жесткие ссылки создают дополнительную путаницу, особенно если вам нужно удалить файл во всех местах использования. Поэтому подходите к использованию жестких ссылок с осторожностью и не злоупотребляйте ими, так как в большинстве случаев символических ссылок более чем достаточно.
Жесткие ссылки, так как являются дополнительной записью в inode, могут использоваться только в пределах одного физического раздела. Также спецификации POSIX запрещают создание жестких ссылок для каталогов.
Права доступа
Еще одним неотъемлемым атрибутом любой файловой системы являются права доступа к файлам и папкам. Linux унаследовал классическую UNIX-систему прав, они не так гибки, как хотелось бы, но обеспечивают приемлемый уровень гибкости и безопасности для простых систем.
Права доступа к файлу (а как мы помним, в Linux все есть файл) хранятся в специальном 16-битовом поле атрибутов файла:
Тип объекта | Особые признаки | Права доступа | |||||||||||||
SUID | SGID | sticky | Пользователь | Группа | Остальные | ||||||||||
# | # | # | # | s | s | t | r | w | x | r | w | x | r | w | x |
Первые четыре бита устанавливают флаг типа объекта, они задаются при создании файла и не могут быть изменены. Флаг может иметь следующие значения:
- — — Отсутствие флага — обычный файл
- l — Символическая ссылка
- d — Директория
- b — Блочное устройство
- c — Символьное устройство
- p — Канал, устройство fifo
- s — Unix-сокет
Следующие три бита хранят особые признаки, влияющие на запуск исполняемых файлов и некоторые иные права, к ним мы вернемся несколько позже. И наконец следующие девять бит, разделенные на блоки по три бита содержат права доступа к файлу или директории.
Каждый файл в UNIX должен иметь владельца (пользователь, user), группового владельца (группа, group) и остальных пользователей (остальные, other), каждый из этих пользователей может иметь права на чтение (r), запись (w) и исполнение (x).
Применительно к каталогам флаги имеют несколько иной смысл: r — право получения имен файлов в каталоге (но не их атрибутов), x — право получения доступа к файлам и их атрибутам, w — право манипулировать именами файлов, т.е. создавать, удалять, переименовывать. Минимальный разумный набор прав на каталог: rx-, так как только r позволит получить только имена файлов, но не их тип, размер и т.п. Ниже показан пример папки с набором прав r—.
Как нетрудно заметить, w без х не имеет никакого смысла и равносильно его отсутствию.
Запись прав может производиться как в символьной, так и в числовой форме, для этого используют двоичное или восьмеричное (что удобнее) значение установленных битов.
OCT | BIN | Символьное | Права на файл | Права на каталог |
0 | 000 | — | отсутствие прав | отсутствие прав |
1 | 001 | —x | право на исполнение | право на доступ к файлам и атрибутам |
2 | 010 | -w- | право на запись | отсутствие прав |
3 | 011 | -wx | право на запись и исполнение | все права, кроме получения имен файлов |
4 | 100 | r— | право на чтение | право на получение имен файлов |
5 | 101 | r-х | право на чтение и исполнение | право на получение имен файлов и доступ к ним |
6 | 110 | rw- | право на чтение и запись | право на получение имен файлов |
7 | 111 | rwx | все права | все права |
В то время, как в системе используются преимущественно символьные обозначения, для целей администрирования обычно используются цифровые восьмеричные значения. Потому что проще, быстрее и удобнее написать, что права на файл должны быть 644, а не rw-r—r—.
В тоже время символьная запись позволяет быстро оценить реальный набор прав, а не вспоминать, что значит 755. Стандартные права для вновь создаваемых файлов — 664, папок — 775, исключение — файлы и каталоги, созданные с правами суперпользователя, они получают 644 и 755 соответственно.
На практике из всех сочетаний флагов доступа реально используются только 0, 4, 5, 6, 7 для файлов и 0, 5, 7 для папок.
Разобравшись с основными правами перейдем к особым признакам, таких три:
OCT | BIN | Наименование | Действие |
1 | 001 | sticky | удалить файл может только владелец или root |
2 | 010 | SGID | файл запускается на исполнение с правами группового владельца |
4 | 100 | SUID | файл запускается на исполнение с правами владельца |
Начнем с младшего бита, его установка означает установку sticky-бита для каталога, установка данного флага для файлов в современных системах игнорируется. Дословно sticky обозначает «липкий», что довольно хорошо соответствует его смыслу. После установки данного флага удалить файл из каталога может только его владелец или суперпользователь, даже если на файлы и папку стоят права 777.
Эта опция может быть использована для организации файловых серверов типа «файлопомойка», когда нужно организовать доступ для всех, без разбора, но исключить возможность случайного или преднамеренного удаления чужих файлов. Установить sticky-бит может только суперпользователь, снять — суперпользователь или владелец каталога.
Опции SUID и SGID позволяют любому пользователю запускать файл на исполнение с правами его владельца или группы. Для чего это нужно? В обычных условиях файл запускается с правами текущего пользователя, что не всегда достаточно для его работы. Например, таким образом работает утилита passwd, нам нужно чтобы пользователь имел возможность изменить свой пароль без повышения прав, но данная операция требует прав суперпользователя. Как быть? Использовать признак SUID. Если мы проверим права на утилиту, то увидим запись rwsr-xr-x или 4755.
При установке признаков SUID и SGID они заменяют символ x на s в соответствующей группе символьного представления или записываются перед основными правами в восьмеричном виде. Вообще-то в цифровом виде все права следует записывать в четырехзначном формате, так как если особые признаки не установлены, то это 000 BIN или 0 OCT. Т.е. правильно писать не 777, а 0777, но обычно для краткости первый ноль опускают.
Если установлены несколько признаков, то записывается восьмеричное число аналогичное установленным битам в двоичном формате, например, SUID + sticky это 101 BIN или 5 OCT. Установленный sticky-бит заменяет x на t в группе other. Ниже показан каталог с правами 7775 или rwsrwsr-t, что соответствует установке на него SUID, SGID и sticky-бит одновременно.
Данная запись сделана нами исключительно в тестовых целях, так как установка SUID для каталога не имеет смысла, а установка SGID приведет к тому, что групповым владельцем создаваемых в нем файлов будет группа владельца каталога, а не группа создавшего его пользователя, как происходит по умолчанию. Также, ввиду потенциальной опасности, игнорируется установка SUID и SGID для скриптов.
В графической среде установка прав разнится в зависимости от выбранного настольного окружения, например, в Unity настройки выполнены в понятной пользователю форме, но особые признаки не отображаются и не могут быть установлены, а для папок присутствует бесполезный набор прав r—.
В XFCE не потрудились задать понятные и логичные наборы для файлов и папок, ограничившись стандартным перечислением, включая бесполезные -w- и -wx, также отсутствует явное указание признака «исполняемый», вместо этого флаг x автоматически добавляется к любому набору прав владельца.
И наконец KDE сочетает достаточно лаконичный основной набор прав с возможностью установки признака «исполняемый» для файлов и sticky-бит для папок с возможностью явно указывать особые признаки в дополнительных настройках.
В любом случае следует помнить, что графический интерфейс не является основным средством администрирования Linux, а представляет надстройку над средствами командной строки. В следующей части нашей статьи мы как раз уделим внимание приемам работы с файловой системой Linux в консольной среде.
Научиться настраивать MikroTik с нуля или систематизировать уже имеющиеся знания можно на углубленном курсе по администрированию MikroTik. Автор курса, сертифицированный тренер MikroTik Дмитрий Скоромнов, лично проверяет лабораторные работы и контролирует прогресс каждого своего студента. В три раза больше информации, чем в вендорской программе MTCNA, более 20 часов практики и доступ навсегда.
Дополнительные материалы:
Помогла статья? Поддержи автора и новые статьи будут выходить чаще:
Или подпишись на наш Телеграм-канал:
Файловые системы в Linux
XFS — начало разработки 1993 год, фирма Silicon Graphics, в мае 2000 года предстала в GNU GPL, для пользователей большинства Linux систем стала доступна в 2001-2002 гг. Отличительная черта системы — прекрасная поддержка больших файлов и файловых томов, 8 эксбибайт — 1 байт (8*2 60 -1 байт) для 64-х битных систем. Ко всему прочему обладает другими немаловажными особенностями — непрерывные области дискового пространства, задержка выделения пространства и онлайн дефрагментация. Является одной из старейших журналируемых файловых систем для *nix, и содержит в себе наиболее отлаженный, в этом контексте, исходный код.
ReiserFS (Reiser3) — одна из первых журналируемых файловых систем под Linux, разработана Namesys. Имеет некоторые врождённые головные боли, но в целом неплохая система, ведущая отсчёт дней своих с 2001 года. Оговорюсь, что смысл журналируемых систем заключается в дисковых транзакциях, которые последовательно пишутся в специальную зону диска (журнал, он же лог), перед тем как данные попадают в конечные точки файловой системы. Максимальный объём тома для этой системы равен 16 тебибайт (16*2 40 байт).
JFS (Journaled File System) — файловая система, детище IBM, явившееся миру в далёком 1990 году для ОС AIX (Advanced Interactive eXecutive). В виде первого стабильного релиза, для пользователей Linux, система стала доступна в 2001 году. Из плюсов системы — неплохая масштабируемость. Из минусов — не особо активная поддержка на протяжении всего жизненного цикла. Максимальный рамер тома 32 пэбибайта (32*2 50 байт).
ext (extended filesystem) — появилась в апреле 1992 года, это была первая файловая система, изготовленная специально под нужды Linux ОС. Разработана Remy Card с целью преодолеть ограничения файловой системы Minix.
ext2 (second extended file system) — была разработана Remy Card в 1993 году. Не журналируемая файловая система, это был основной её недостаток, который исправит ext3.
ext3 (third extended filesystem) — по сути расширение исконной для Linux ext2, способное к журналированию. Разработана Стивеном Твиди (Stephen Tweedie) в 1999 году, включена в основное ядро Linux в ноябре 2001 года. На фоне других своих сослуживцев обладает более скромным размером пространства, до 4 тебибайт (4*2 40 байт) для 32-х разрядных систем. На данный момент является наиболее стабильной и поддерживаемой файловой системой в среде Linux.
Reiser4 — первая попытка создать файловую систему нового поколения для Linux. Впервые представленная в 2004 году, система включает в себя такие передовые технологии как транзакции, задержка выделения пространства, а так же встроенная возможность кодирования и сжатия данных. Ханс Рейзер (Hans Reiser), главный разработчик системы, рекламировал использовать своё детище непосредственно как БД с улучшенными метаданными. После того, как Ханс Рейзер был осуждён за убийство в 2008 году, дальнейшая судьба системы стала сомнительной.
ext4 — попытка создать 64-х битную ext3 способную поддерживать больший размер файловой системы (1 эксбибайт). Позже добавились возможности — непрерывные области дискового пространства, задержка выделения пространства, онлайн дефрагментация и прочие. Обеспечивается прямая совместимость с системой ext3 и ограниченная обратная совместимость при недоступной способности к непрерывным областям дискового пространства.
UPD: Btrfs (B-tree FS или Butter FS) — проект изначально начатый компанией Oracle, впоследствии поддержанный большинством Linux систем. Многие считаеют систему эдаким ответом на ZFS. Ключевыми особенностями данной файловой системы являются технологии: copy-on-write, позволяющая сделать снимки областей диска (снапшоты), которые могут пригодится для последующего восстановления; контроль за целостностью данных и метаданных (с повышенной гарантией целостности); сжатие данных; оптимизированный режим для накопителей SSD (задаётся при монтировании) и прочие. Немаловажным фактором является возможность перехода с ext3 на Btrfs. С августа 2008 года данная система выпускается под GNU GPL.
Tux2 — известная, но так и не анонсированная публично файловая система. Создатель Дэниэл Филипс (Daniel Phillips), система базируется на алгоритме «Фазового Дерева», который как и журналирование защищает файловую систему от сбоев. Организована как надстройка на ext2.
Tux3 — наступая на пятки Btrfs, представлена новая файловая система. Система создана на основе FUSE (Filesystem in Userspace), специального модуля для создания файловых систем на *nix платформах. Данный проект ставит перед собой цель избавиться от привычного журналирования, взамен предлагая версионное восстановление (состояние в определённый промежуток времени). Преимуществом используемой в данном случае версионной системы, является способ описания изменений, где для каждого файла создаётся изменённая копия, а не переписывается текущая версия. Такой подход позволяет более гибко управлять версиями.
UPD: Xiafs — задумка и разработка данной файловой системы принадлежат Frank Xia, основана на файловой системе MINIX. В настоящее время считается устаревшей и практически не используется. Наряду с ext2 разрабатывалась, как замена системе ext. В декабре 1993 года система была добавлена в стандартное ядро Linux. И хотя система обладала большей стабильностью и занимала меньше дискового пространства под контрольные структуры — она оказалась слабее ext2, ведущую роль сыграли ограничения максимальных размеров файла и раздела, а так же способность к дальнейшему расширению.
UPD: ZFS (Zettabyte File System) — изначально созданная в Sun Microsystems файловая система, для небезызвестной операционной системы Solaris в 2005 году. Отличительные особенности — отсутствие фрагментации данных как таковой, возможности по управлению снапшотами (snapshots), пулами хранения (storage pools), варьируемый размер блоков, 64-х разрядный механизм контрольных сумм, а так же способность адресовать 128 бит информации! В Linux системах может использоваться посредствам FUSE.
Структура и типы файловых систем в Linux
Ядро операционной системы Linux содержит целый набор предустановленных файловых систем, каждая из которых помогает пользователю успешно решать стоящие перед ним задачи. В зависимости от того, что необходимо, — быстродействие, высокая гарантия восстановления данных или производительность, можно выбрать стандартную файловую систему для конкретного раздела, специальную или виртуальную. Разобрались, как устроены файловые системы Linux, чем они отличаются […]
Ядро операционной системы Linux содержит целый набор предустановленных файловых систем, каждая из которых помогает пользователю успешно решать стоящие перед ним задачи.
В зависимости от того, что необходимо, — быстродействие, высокая гарантия восстановления данных или производительность, можно выбрать стандартную файловую систему для конкретного раздела, специальную или виртуальную. Разобрались, как устроены файловые системы Linux, чем они отличаются и в каких случаях применяются.
Файловые системы в операционной системе Linux. Базовые понятия
ОС Linux предоставляет выбор еще на стадии установки: в ядро системы встроены разные файловые системы (ФС). При этом пользователь должен выбрать ту, что отвечает его требованиям и задачам. Перед теми, кто использует Windows, такой вопрос не стоит — эту ОС можно установить только на NTFS. Отличается от Windows и иерархическое устройство самих ФС, и структура каталогов.
Linux поддерживает деление жесткого диска на разделы. Для подсчета и определения физических границ используется специальная таблица разделов — GPT или MBR. Она содержит метку и номер раздела, а также адреса физического расположения точек начала и конца раздела.
Организация файловой системы Linux
В Linux на каждый раздел можно установить свою ФС, которая отвечает за порядок и способ организации информации. В основе файловых систем лежит набор правил, определяющий, где и каким образом хранятся данные. Следующий «слой» ФС — практический (технический) способ организации информации на каждом конкретном типе носителя (опять же, учитывая правила, заложенные в основу системы).
От выбора файловой системы зависят:
- скорость работы с файлами;
- их сохранность;
- скорость записи;
- размер файлов.
Тип ФС также определяет, будут ли данные храниться в оперативной памяти (ОП) и как именно пользователь сможет изменить конфигурацию ядра.
Файловая система (ФС) — архитектура хранения данных, которые могут находиться в разделах жесткого диска и ОП. Выдает пользователю доступ к конфигурации ядра. Определяет, какую структуру принимают файлы в каждом из разделов, создает правила для их генерации, а также управляет файлами в соответствии с особенностями каждой конкретной ФС.
ФС Linux — пространство раздела, поделенное на блоки определенного размера. Он определяется кратностью размеру сектора. Соответственно, это могут быть 1024, 2048, 4096 или 8120 байт. Важно помнить, что размер каждого блока известен изначально, ограничен максимальным размером ФС и зависит от требований, которые выдвигает пользователь к каждому из блоков.
Для обмена данными существует сразу два способа. Первый из них — виртуальная файловая система (VFS). С помощью данного типа ФС происходит совместная работа ядра и приложений, установленных в системе. VFS позволяет пользователю работать, не учитывая особенности каждой конкретной ФС. Второй способ — драйверы файловых систем. Именно они отвечают за связь между «железом» и софтом.
Список файловых систем, которые поддерживаются ядром, находится в файле /proc/filesystems:
Структура и иерархия файловой системы. Структура каталога
Файловая система в Linux определяет также организацию расположения файлов, по сути представляя собой иерархическую структуру «дерева»: начинается с корневого каталога «/» и разрастается ветвями в зависимости от работы системы.
ФС также характерно понятие целостности: в такой системе изменения, внесенные в один файл, не приведут к изменению другого файла, не связанного с первым. У всех данных есть собственная физическая память. В Linux целостность ФС проверяется специальной командой — fsck.
Типы файлов условно можно разделить на несколько групп. Некоторые из них такие же, как и в ОС Windows, — текстовые документы, медиа и изображения. Отличия начинаются с каталогов, которые являются отдельным типом файлов. Жесткие диски относят к блочным устройствам. Принтеры — к символьным. Отдельную группу составляют символические ссылки, о которых речь пойдет ниже. К типам файлов относится каналы межпроцессного взаимодействия — PIPE (FIFO), а также гнезда (разъемы центрального процессора).
Тип файла определяется с помощью команды ls (параметр -l).
В ФС каждый файл определяется конкретным индексом — Inode (от англ. index node — «индексный дескриптор»). Но при этом один файл (речь о физическом размещении) может иметь сразу несколько имен (или путей). И если в структуре ФС файлы будут отличаться, то на жестком диске им может соответствовать один файл. Это означает, что ФС Linux перекрестно-иерархична, а ветви дерева могут пересекаться.
Корневой раздел в Linux один — «/» (root, «корень)». Разделы называются подкаталогами, примонтированными к соответствующим каталогам. Типовая структура каталогов (первых двух уровней), примонтированных к корневому каталогу Linux для сервера, представленного компанией Selectel, выглядит так:
При монтировании происходит ассоциирование каталога с устройством, содержащим ФС (драйвер). Соответствующая ссылка на устройство передается драйверу. Именно он и определяет ФС. Если процедура завершается успешно, ядро заносит информацию (каким драйвером обслуживаются и где расположены файлы и каталоги) в таблицу монтирования. Она находится в файле /proc/mounts.
Данные о каждом файле содержит Inode — специфичный для UNIX-систем индексный дескриптор, хранящий различную метаинформацию (владелец файла, последнее время обращения, размер и так далее).
Когда файл (каталог) перемещается в другую ФС, его Inode тоже создается заново. И только потом удаляется исходный (в рамках той же системы меняется только путь файла). Также отметим, что файл (каталог) существует до того момента, пока хранится информация о его имени или пути к нему. После удаления всей информации блоки, отведенные под файл, становятся свободными (для выделения под другой файл).
Еще одна особенность Linux: существование сразу двух типов ссылок. Во-первых, жесткая ссылка (Hard-Link), которая представляет собой один из путей файла (команда ls -li). Во-вторых, символьная ссылка (Symbolic link) — это файл UNIX с текстовой строкой с путем к оригинальному файлу.
Общая информация о ФС хранится в суперблоке. Сюда относится суммарное число блоков и Inode, число свободных блоков, их размеры и так далее. Важно, чтобы суперблок сохранял свою целостность, поскольку от этого зависит стабильность и работоспособность системы в целом. В ОС создается сразу несколько копий, чтобы можно было восстановить всю необходимую информацию.
При загрузке ядро автоматически монтирует разделы после того, как корень уже примонтирован на чтение. Информацию ядро считывает из конфигурации /etc/fstab. Содержимое файла /etc/fstab с информацией о порядке монтирования разделов файловой системы на примере сервера Selectel:
В соответствии с этим файлом сначала монтируется корневой каталог / из раздела /dev/mapper/vg0-root / с файловой системой ext4. Потом каталог, на котором находится загрузчик /boot, из раздела с длинным именем UUID=196a5b2c-8d6b-4970-a9c8-4579ab46e220. И отдельно монтируется swap (иногда его называют разделом подкачки), но в структуре он не отображается.
Еще одна особенность: устройства монтируются по идентификатору. Это, в свою очередь, помогает не перенастраивать файл конфигурации, когда пользователь меняет блочное устройство.
Команды для работы с файлами в Linux
Команда | Что делает |
ls | Просматривает содержимое текущего каталога |
touch file_name | Создает файл file_name |
mkdir directory_name | Создает директорию directory_name |
cat file_name | Показывает содержимое файла file_name в терминале |
less file_name | Обеспечивает просмотр файла с помощью скроллинга |
rm file_name | Удаляет файл file_name |
rm -r | Удаляет рекурсивно все файлы из директории |
rmdir directory | Удаляет папку directory, которая находится в текущей папке |
ln -s /home/user/directory_name/ /home/user/test/ | Создает жесткие и символические ссылки на файлы или папки. Для создания символической ссылки используется опция -s |
pwd | Выводит каталога, в котором находится пользователь |
which program | Выводит каталог, в котором установлена программа |
mc | Запускает полнофункциональный файловый менеджер с псевдографическим интерфейсом на основе ncurses. Требуется установка mc в Ubuntu |
cd directory_name | Переходит в директорию directory_name |
cp file_name directory_name | Копирует file_name в директорию directory_name |
nano | Инициирует запуск простейшего текстового редактора командной строки Linux |
mv file_name directory_name | Перемещает file_name в директорию directory_name |
mv old_name new_name | Переименовывает файл/директориюold_name в new_name |
locate file_name | Выполняет быстрый поиск файла |
chmod 644 file_name | Изменяет права доступа к файлу или каталогу |
Типы файловых систем Linux. Какая из файловых систем используется ядром Linux
Как уже говорилось ранее, в Linux несколько предустановленных и доступных ФС. В зависимости от выбора пользователя будут меняться методы работы с файлами, обращения к конфигурации ядра и способы хранения данных в ОП. В зависимости от целей и задач пользователя (а также достоинств и недостатков самих ФС) можно выбрать любую файловую систему, доступную в дистрибутиве ОС.
Список основных файловых систем:
- Ext2;
- Ext3;
- Ext4;
- JFS;
- ReiserFS;
- XFS;
- Btrfs;
- ZFS.
ФС может являться корневой в различных разделах, Linux позволяет использовать разные системы одновременно.
Ext2, Ext3, Ext4
Первая группа ФС — Extended Filesystem (Ext2, Ext3, Ext4) — является стандартом для Linux. Как следствие, это самые распространенные системы. Они редко обновляются, но зато стабильны. Ext2 создавалась специально под Linux (изначально Extended Filesystem делали еще под Minix).
Эта группа ФС поддерживает наибольшее количество доступных функций из всех, предложенных на рынке. Ext3 (2001 г.) стала еще более стабильной, чем ее предшественница, за счет использования журналирования, а версия Ext3 (2006 г.) популярна и среди современных пользователей. Среди улучшений: увеличение максимального размера раздела до 1 Эксабайта.
Два типа файловых систем
Журналируемые — данный тип ФС сохраняет историю действий пользователя, а также план проверки системы в специальном файле. Особенности: устойчивость к сбоям и сохранение целостности информации.
Не журналируемые — не предусматривают хранение логов. Особенности: работают быстрее, но не гарантируют сохранность данных.
Чтобы узнать тип ФС, существует команда file -s.
Журналируемая ФС — первая альтернатива для ФС группы Ext. Ее разработали в IBM специально для операционной системы AIX UNIX. Главные плюсы этой системы: стабильность и минимальные требования для работы. Разработчики JFS ставили перед собой цель создать ФС, которая бы эффективно работала на многопроцессорных компьютерах. Кроме того, эта система также относится к журналируемым ФС. Но есть и очевидные недостатки. Если случится непредвиденный сбой в работе системы, ФС может использовать версии файлов, которые уже устарели. Причина заключается в том, что журнал сохраняет только метаданные.
ReiserFS
Эта ФС разработана под руководством Ганса Райзера и названа в честь него. Подходит исключительно под Linux, чаще всего ее используют в качестве возможной замены Ext3. Главные особенности: увеличенная производительность и более широкие возможности. Изменяющийся размер блока дает пользователю возможность объединять небольшие файлы в один блок, таким образом удается избежать фрагментации и повысить качество работы ФС в целом. Размер разделов можно менять прямо в процессе работы, однако эта ФС может показать нестабильные результаты и потерять данные, например, при отключении энергии.
Еще одна журналируемая ФС. Однако, в отличие от аналогов, в логи записывает исключительно те изменения, которые претерпевают метаданные. Разработана для ОС в Silicon Graphics. Важные особенности: быстро работает с файлами сравнительно большого размера, умеет выделять место в отложенном режиме, а также менять размеры разделов в процессе работы. Часто встречается в дистрибутивах на основе Red Hat. Минусы: нельзя уменьшить размер разделов, сложно восстанавливать данные и можно потерять информацию при отключении питания.
Btrfs
Современная ФС, главной особенностью которой является высокая отказоустойчивость. Из дополнительных «бонусов»: удобна для сисадминов и поддерживает сравнительно простой процесс восстановления данных. Поддерживает подтома, разрешает менять размеры разделов в динамическом режиме и позволяет делать снапшоты. Отличается высокой производительность. Применяется как ФС, установленная по умолчанию, в OpenSUSE и SUSE Linux. Главный минус — нестабильность (нарушена обратная совместимость, сложная для поддержки и так далее).
Flash-Friendly File System входит в состав ядра ОС Linux и предназначена для использования с хранилищем на основе флеш-памяти. Разработчик — корпорация Samsung. F2FS разбивает носитель на части, которые снова делятся, и так далее. Эти миниатюрные зоны используются вместо повторного использования одних и тех же размеченных участков.
OpenZFS
OpenZFS — ветвь ZFS, о которой мы пишем ниже). Разработчик — компания Sun для ОС Solaris. В 2016 году Ubuntu включила ее поддержку по умолчанию. Главные плюсы: защита от повреждения данных, поддержка больших файлов и автоматическое восстановление.
Традиционные для Windows ФС NTFS, FAT, HFS применяются в Linux, но пользователь не сможет установить в такие разделы корень, поскольку структура этих ФС для этого не приспособлена.
Специальные файловые системы
Для решения задач, связанных с предоставлением доступа пользователю или программам к настройкам ядру ОС, используются так называемые специальные файловые системы. Ядро использует несколько типов специальных ФС:
- tmpfs — записывает файлы в ОП. Для этого создается блочное устройство определенного объема, после чего оно подключается к папке.
- procfs — хранит данные о системных процессах и ядре.
- sysfs — изменяет настройки ядра ОС.
Виртуальные файловые системы: EncFS, Aufs, NFS и ZFS
Если пользователю необходимо решить задачи, которые не требуют непременного наличия ФС в ядре, применяется модуль FUSE (filesystem in userspace). Он создает ФС в пространстве пользователя. Виртуальные ФС, как правило, поддерживают шифрование и сетевое администрирование. Сегодня на рынке существует целый спектр виртуальных ФС для ряда задач:
Файловая система Linux
В этой статье мы поговорим про файловую систему Linux. Но здесь вы не найдете описания тонкостей работы с определенной файловой системой, например, ext4, а также не найдете команд для работы с какой-либо ФС. Мы остановимся на более общих понятиях и попытаемся разобраться что такое файловая система, и как она работает в целом.
Каждый компьютер сохраняет данные и результаты на жестком диске, твердотельном накопителе SSD или любом другом носителе информации, это неизбежно. Для этого есть несколько причин. Во-первых, содержимое RAM очищается при каждой перезагрузке компьютера. Конечно, есть быстрые энергонезависимые устройства хранения, такие как флеш память, но они стоят намного дороже, чем стандартные модули DDR3.
Вторая причина хранить данные на диске, это то, что оперативная память намного дороже чем более медленные, но вместительные жесткие диски. Фактически 16 Гб оперативной памяти будет стоить столько же, сколько жесткий диск на 2 Тб. Таким образом, мы видим, что оперативная память в 71 раза дороже чем HDD.
Что такое файловая система?
Люди могут подразумевать под файловой системой совсем разные понятия. Само словосочетание может иметь несколько значений и вам придется понимать о чем идет речь из контекста документа.
Давайте рассмотрим наиболее часто используемые значения слов файловая система. Мы не будем останавливаться на официальной трактовке, а попытаемся обратить внимание на сферу применения:
- Все структура каталогов Linux, начиная с корня (/);
- Конкретный формат раздела хранения данных, например, Ext3, Ext4, Btrfs, XFS и так далее. Ядро Linux поддерживает более 100 типов файловых систем, в том числе очень старых и новых. Каждый тип файловой системы использует свои структуры метаданных чтобы организовать работу с данными на диске;
- Раздел или логический том, отформатированный в определенный тип файловой системы, который можно примонтировать к определенной точке монтирования.
Дальше рассмотрим как выполнена организация файловой системы Linux и ее основные функции.
Основные функции файловой системы
Необходимость использования дисковых хранилищ приносит некоторые особенности работы файловых систем. Основная функция файловой системы — предоставление организованного пространства для хранения файлов на энергонезависимом запоминающем устройстве. Но есть несколько дополнительных функций, которые вытекают из основной.
Все файловые системы должны обеспечивать пространство имен. Оно определяет как будут называться файлы, ограничения на длину имени, используемые символы, а также логическую структуру данных на диске, например, использование каталогов для организации файлов, а не просто складывания их в одном месте.
Когда пространство имен определено, необходимо создать для него основу с помощью метаданных файловой системы. Она включает в себя структуры данных для создания иерархии каталогов, структуры для хранения занятых и свободных блоков на диске, структуры с именами файлов и каталогов, информацией о файлах, такой как размер, время создания, расположение файла на диске и так далее. В самих блоках файла на диске хранится только его содержимое, вся же остальная информация находится в метаданных.
Также метаданные используются для описания логических томов и подразделов, если таковые поддерживаются, и еще одни содержат информацию, описывающую файловую систему.
Для доступа к файлам также необходим набор функций API, с помощью которых программы могли бы управлять различными объектами файловой системы. Обычно должны существовать методы для создания, перемещения и удаления файлов.
Современные файловые системы также обеспечивают модель безопасности, которая представляет из себя схему прав доступа к файлам для пользователей. Модель безопасности ФС в Linux гарантирует что пользователи будут иметь доступ только к своим файлам.
Дальше, нам нужно программное обеспечение, которое будет выполнять все эти функции. Организация файловой системы linux состоит из двух частей:
Первая часть — это виртуальная файловая система. Она представляет собой единый набор команд ядра, с помощью которого разработчики могут получить доступ к любой из файловых систем. Виртуальной файловой системе необходим драйвер для работы с различными типами ФС. Драйвера файловой системы — это вторая часть реализации, в них реализован стандартный набор команд, выполняющих специфичные для файловой системы действия.
Структура каталогов
Намного проще найти файлы, если они хранятся небольшими группами, каждый на своем месте, а не все в одной куче. Структуру файловой системы Linux можно представить в виде простой иерархии. Все каталоги находятся в корневом каталоге (/) поэтому каждый адрес файла начинается с него. Например, /var/log/dmesg, /usr/share/, /bin.
Корневая файловая система Linux — это ФС верхнего уровня, она должна содержать все файлы, необходимые для загрузки Linux еще до того как другие файловые системы будут смонтированы. Здесь уже должны быть все исполняемые файлы и библиотеки, нужные для подключения других ФС. Во время загрузки другие файловые системы монтируются в четко определенные для них каталоги. Более детально предназначение каждого каталога Linux мы рассматривали в статье структура файловой системы Linux.
Каталоги /bin, /dev, /etc, /lib, /root, /sbin не могут быть примонтированы и должны быть доступны еще до загрузки, так как в них находятся все необходимые файлы. Что касается каталогов /media и /mnt, то они должны быть пустыми, поскольку это точки монтирования для других файловых систем. Остальные каталоги можно смело монтировать позже, они никак не повлияют на запуск.
В некоторых не Unix операционных системах разделам присваиваются отдельные буквы, например, C: или D:. В них каждый раздел будет иметь отдельную файловую систему. Чтобы найти нужный файл на диске C: вам необходимо сначала выполнить команду C:, а затем искать путь к файлу.
В Linux все физические диски и разделы, объеденные в одну файловую структуру. Она начинается с корня (/) в котором расположены все другие каталоги. Это работает потому что файловые системы /var, /home, /boot, /tmp и т д могут находиться на других физических дисках. Даже съемные диски подключаются в основную файловую систему.
И это очень хорошо, потому что при обновлении версии дистрибутива можно сохранить абсолютно все файлы и настройки в домашнем каталоге. Иногда полезно переформатировать корневой раздел чтобы убрать оттуда весь мусор, если /home находится на отдельном разделе, то вы ничего не потеряете. Есть и другие причины так поступать, например, защита корневой ФС от переполнения, что привело бы к неработоспособности системы.
Типы файловых систем
Как уже было сказано, Linux поддерживает более 10 различных файловых систем, но создавать и выполнять запись, возможно, только в некоторые из них. Зато можно подключить их все к корневой файловой системе. Под типом мы подразумеваем совокупность структур и метаданных, необходимых для хранения файлов.
Linux может монтировать и читать такие файловые системы:
Основная причина почему они поддерживаются — это попытка организовать максимальную совместимость с другими операционными системами. А вот основные файловые системы linux, которые можно создавать:
- btrfs;
- cramfs;
- ext2;
- ext3;
- ext4;
- fat;
- gfs2;
- hfsplus;
- minix;
- msdos;
- ntfs;
- reiserfs;
- vfat;
- xfs.
Мы более подробно рассматривали особенности некоторых из них в статье типы файловых систем Linux.
Монтирование файловых систем
Термин смонтировать появился еще в самом начале развития Linux, тогда было необходимо вставить кассету или съемный диск в специальный привод. Только после этого можно было получить доступ к файловой системе устройства.
Точка монтирования — это обычный каталог, как любая другая часть файловой системы. Например, домашняя папка смонтирована в каталог /home. И так далее.
Корневая файловая система ос Linux / подключается на раннем этапе загрузки. Другие файловые системы монтируются системой инициализации, например, SysVinit или Systemd. Точки монтирования настраиваются с помощью файла /etc/fstab. Также можно выполнять ручное монтирование в Linux с помощью команды mount. Каталог для монтирования необязательно должен быть пустым, он может содержать файлы, но тогда они будут просто скрыты.
Выводы
Эта статья была ориентирована на новичков и я надеюсь, что некоторые вопросы, касаемо термина файловая система linux были сняты. Теперь вы можете оценить элегантность, сложность и функциональность файловой системы Linux. Если у вас есть вопросы, спрашивайте в комментариях!
Обнаружили ошибку в тексте? Сообщите мне об этом. Выделите текст с ошибкой и нажмите Ctrl+Enter.