<
  • Главная
Статьи

Анатомія файлової системи Linux

  1. Базова архітектура файлової системи
  2. Що таке файлова система?
  3. Файлові системи як протоколи
  4. монтування
  5. Лістинг 1. Створення Ініціалізувати файлу
  6. Лістинг 2. Створення файлової системи ext2 на пристрої loop
  7. Лістинг 3. Створення точки монтування і монтування файлової системи за допомогою пристрою loop
  8. Лістинг 4. Створення нової файлової системи loop в уже існуючій
  9. Архітектура файлової системи
  10. Архітектура високого рівня
  11. Малюнок 1. Архітектурне подання компонентів файлової системи Linux
  12. Що таке блоковий пристрій?
  13. Основні структури
  14. Рівень віртуальної файлової системи
  15. Малюнок 2. Файлова система, зареєстрована в ядрі
  16. Малюнок 3. Список змонтованих файлових систем
  17. Малюнок 4. Структура системного блоку і робота вузлів inode
  18. Вузли inode і dentry
  19. Малюнок 5. Структура inode і пов'язані з нею операції
  20. буферний кеш
  21. Цікаві файлові системи
  22. висновок
  23. Ресурси для скачування

Огляд багаторівневої структури

Базова архітектура файлової системи

Архітектура файлової системи Linux являє собою цікавий зразок абстрагування складнощів. Єдиний набір функцій API дозволяє підтримувати безліч файлових систем на безлічі пристроїв зберігання. Візьмемо, наприклад, виклик функції read, яка дозволяє зчитувати певну кількість байт з заданого дескриптора файлу. Функція read нічого не знає про типах файлових систем, будь то ext3 або NFS. Вона також не знає про носія, на якому змонтована файлова система, будь то диск, підключений через інтерфейс ATA, послідовному інтерфейсу SCSI (SAS) або послідовному інтерфейсу ATA (SATA). І, незважаючи на це, при виконанні функції read для відкритого файлу ми отримуємо, як нам і хотілося, дані. У цій статті буде описано, як це досягається, а також будуть розглянуті основні структури рівня файлової системи Linux.

Що таке файлова система?

Я почну з найбільш загального питання - визначення файлової системи. Файлової системою називається деяка організація даних і метаданих на пристрої зберігання. Ви розумієте, що при такому нечіткому визначенні код, його реалізує, буде дуже цікавим. Як я вже казав, існує безліч типів носіїв і файлових систем. Варто очікувати, що при такому різноманітті інтерфейс файлової системи Linux буде реалізований з використанням багаторівневої архітектури, яка відділяє рівень інтерфейсу користувача від реалізації файлової системи і від драйверів, які керують пристроями зберігання.

Файлові системи як протоколи

Альтернативний спосіб полягає в тому, щоб розглядати файлову систему як протокол. Так само, як мережеві протоколи (наприклад, IP) надають сенс потокам даних, що передаються через Інтернет, файлова система надає значення даними на певному носії.

монтування

Процес зв'язування файлової системи з пристроєм в Linux називається монтуванням (mounting). Для підключення файлової системи до існуючої ієрархії файлових систем (корені) використовується команда mount. При монтуванні вказується файлова система, її тип і точка монтування.

Щоб продемонструвати можливості рівня файлової системи Linux (і монтування), створимо файлову систему в файлі, розташованому в існуючої файлової системи. Це можна зробити шляхом створення файлу заданого розміру за допомогою dd (копіювання файлу з джерела / dev / zero) - іншими словами, ініціалізувавши файл нулями, як показано в лістингу 1.

Лістинг 1. Створення Ініціалізувати файлу

$ Dd if = / dev / zero of = file.img bs = 1k count = 10000 10000 + 0 records in 10000 + 0 records out $

Тепер у нас є файл file.img розміром 10 МБ. Зв'яжемо з файлом блоковий пристрій-заглушку (loop) за допомогою команди losetup (щоб він виглядав як блоковий пристрій, а не як звичайний файл файлової системи):

$ Losetup / dev / loop0 file.img $

Тепер, маючи файл, який виглядає як блоковий пристрій (представлений / dev / loop0), створимо на цьому пристрої файлову систему за допомогою mke2fs. Ця команда створює нову файлову систему ext2 певного нами розміру, як видно з лістингу 2.

Лістинг 2. Створення файлової системи ext2 на пристрої loop

$ Mke2fs -c / dev / loop0 10000 mke2fs 1.35 (28-Feb-2004) max_blocks 1024000, rsv_groups = 1250, rsv_gdb = 39 Filesystem label = OS type: Linux Block size = 1024 (log = 0) Fragment size = 1024 (log = 0) 2512 inodes, 10000 blocks 500 blocks (5.00%) reserved for the super user ... $

Тепер файл file.img, представлений блоковим пристроєм (/ dev / loop0), змонтований в точці / mnt / point1 за допомогою команди mount. Зверніть увагу, що зазначений тип файлової системи - ext2. Після монтування ви можете звертатися до точки монтування як до нової файлової системи за допомогою команди ls, як видно з лістингу 3.

Лістинг 3. Створення точки монтування і монтування файлової системи за допомогою пристрою loop

$ Mkdir / mnt / point1 $ mount -t ext2 / dev / loop0 / mnt / point1 $ ls / mnt / point1 lost + found $

Як показано в лістингу 4, цей процес можна продовжити, створюючи новий файл в новій файлової системи, пов'язуючи його з пристроєм loop і створюючи в ньому ще одну файлову систему.

Лістинг 4. Створення нової файлової системи loop в уже існуючій

$ Dd if = / dev / zero of = / mnt / point1 / file.img bs = 1k count = 1000 1000 + 0 records in 1000 + 0 records out $ losetup / dev / loop1 /mnt/point1/file.img $ mke2fs -c / dev / loop1 1000 mke2fs 1.35 (28-Feb-2004) max_blocks 1024000, rsv_groups = 125, rsv_gdb = 3 Filesystem label = ... $ mkdir / mnt / point2 $ mount -t ext2 / dev / loop1 / mnt / point2 $ ls / mnt / point2 lost + found $ ls / mnt / point1 file.img lost + found $

З цього простого прикладу легко зрозуміти, наскільки великі можливості надає файлова система (і пристрій loop) в Linux. Аналогічним чином за допомогою пристрою loop можна створювати в файлі файлові системи з шифруванням. Це може бути корисно для захисту ваших даних; при необхідності такий файл можна швидко змонтувати за допомогою пристрою loop.

Архітектура файлової системи

Тепер, коли ви побачили створення файлової системи в дії, давайте повернемося до архітектури рівня файлової системи Linux. У цій статті файлова система Linux розглядається з двох точок зору. Перша точка зору - це високорівнева архітектура. Друга точка зору розглядає рівень файлової системи глибше і ширше, з боку основних структур, що складають його.

Архітектура високого рівня

Хоча більша частина коду файлової системи реалізована в ядрі (за винятком файлових систем простору користувача, про які я розповім нижче), архітектура, показана на малюнку 1, характеризує відносини між основними компонентами файлової системи, як в просторі користувача, так і в ядрі.

Малюнок 1. Архітектурне подання компонентів файлової системи Linux
Огляд багаторівневої структури   Базова архітектура файлової системи   Архітектура файлової системи Linux являє собою цікавий зразок абстрагування складнощів

У просторі користувача розміщуються додатки (в цьому прикладі - користувач файлової системи) і бібліотека GNU C (glibc), які надають інтерфейс для виклику файлової системи (відкриття, читання, запис, закриття). Інтерфейс системних викликів діє як комутатор, що направляє системні виклики з простору користувача у відповідну точку простору ядра.

VFS є основним інтерфейсом до файлових систем нижнього рівня. Цей компонент експортує набір інтерфейсів і після цього абстрагує їх в окремі файлові системи, образ поведінки яких може бути дуже різним. Для об'єктів файлової системи (вузлів inodes і записів dentries) існують два кеша, про які я скоро розповім. Кожен з них надає пул недавно використаних об'єктів файлової системи.

Реалізація кожної файлової системи, наприклад, ext2, JFS і так далі, експортує загальний масив інтерфейсів, який використовується (і очікується) VFS. Буферний кеш буферизирует запити між файловими системами і блоковими пристроями, якими вони можуть управляти. Наприклад, через буферний кеш проходять запити на читання і запис до драйверів пристроїв. Це дозволяє кешувати запити для більш швидкого доступу (замість звернення до фізичного пристрою). Буферний кеш управляється набором списків останніх використаних елементів (least recently used, LRU). Зверніть увагу, що командою sync можна скинути буферний кеш на носій (примусово відправити все незаписані дані на драйвери пристроїв і, в подальшому, на пристрої зберігання).

Що таке блоковий пристрій?

Блоковим називається пристрій, дані на яке і з якого передаються блоками (наприклад, секторами диска), і яке підтримує такі атрибути, як буферизація і прямий доступ (пристрій не вимагає послідовного доступу до блоків при читанні - будь-який блок може бути доступний в будь-який час) . До блоковим пристроям ставляться жорсткі диски, CD-ROM і диски в оперативній пам'яті. Вони є протилежністю символьним пристроїв, відмінність яких полягає в тому, що у них немає носія з фізичної адресацією. До символьним пристроїв відносяться послідовні порти і стрічкові пристрої, в яких дані передаються посимвольний.

Це був спільний погляд на компоненти файлової системи і VFS. Давайте тепер розглянемо основні структури, що складають цю підсистему.

Основні структури

У Linux все файлові системи розглядаються з точки зору загального набору об'єктів. До цих об'єктів належать системні блоки, вузли inode, записи dentry і файли. Коренем кожної файлової системи є системний блок, який описує і підтримує стан файлової системи. Кожен об'єкт, з яким працює файлова система (файл або директорія) представлений в Linux вузлом inode. Вузол inode зберігає в собі всі метадані для управління об'єктами файлової системи (в тому числі і можливих операціях з ним). Інша безліч структур, яке називають записами dentry, використовується для здійснення перетворення між назвами і вузлами inode, для чого існує кеш директорій, в якому зберігаються останні використані записи. У записах dentry також зберігаються відносини між папками і файлами для обходу файлових систем. І, нарешті, файл VFS є відкритий файл (містить стан відкритого файлу, в тому числі зсув для запису і т.п.).

Рівень віртуальної файлової системи

VFS діє як кореневої рівень інтерфейсу файлової системи. VFS стежить за всіма підтримуваними і всіма змонтованими на даний момент файловими системами.

Файлові системи в Linux можна динамічно додавати й видаляти за допомогою декількох функцій реєстрації. В ядрі зберігається список підтримуваних файлових систем, який можна переглянути з простору користувача за допомогою файлової системи / proc. У цьому віртуальному файлі також показані пристрої, пов'язані на поточний момент з файловими системами. Для того, щоб додати нову файлову систему в Linux, викликається register_filesystem. Ця команда має один аргумент - посилання на структуру файлової системи (file_system_type), яка визначає назву файлової системи, набір атрибутів і дві функції системних блоків. Файлова система також може бути незареєстрованої.

Реєстрація нової файлової системи полягає в додаванні цієї системи і відноситься до неї інформації в список file_systems (див. Малюнок 2 і linux / include / linux / mount.h). Цей список визначає підтримувані файлові системи. Переглянути його можна, ввівши в командному рядку cat / proc / filesystems.

Малюнок 2. Файлова система, зареєстрована в ядрі

Інший структурою, яку підтримує VFS, є змонтовані файлові системи (див. Малюнок 3). Вона надає список змонтованих на даний момент файлових систем (див. Linux / include / linux / fs.h). Вона посилається на структуру системного блоку superblock, про який я розповім нижче.

Малюнок 3. Список змонтованих файлових систем

Системний блок

Системним блоком (superblock) називається структура, що представляє файлову систему. У неї входить інформація, необхідна для управління файловою системою під час роботи. До такої інформації належить назва файлової системи (наприклад, ext2), розмір файлової системи і її стан, посилання на блоковий пристрій і інформацію метаданих (наприклад, списки вільних блоків і т.п.). Як правило, системний блок зберігається на носії, але якщо його немає, він може бути створений в реальному часі. Структуру системного блоку (див. Малюнок 4) можна знайти в ./linux/include/linux/fs.h.

Малюнок 4. Структура системного блоку і робота вузлів inode

Одним з найважливіших елементів системного блоку є визначення його операцій. Ця структура визначає набір функцій для управління вузлами inodes файлової системи. Наприклад, inodes можуть виділятися за допомогою alloc_inode і віддалятися за допомогою destroy_inode. Ви можете зчитувати і записувати inodes за допомогою команд read_inode і write_inode і синхронізувати файлову систему за допомогою команди sync_fs. Структура super_operations розташована в ./linux/include/linux/fs.h. У кожній файлової системи є власні методи inode, які реалізують роботу і виконують загальну абстракцію на рівень VFS.

Вузли inode і dentry

Вузол inode представляє об'єкт файлової системи з унікальним ідентифікатором. Кожна файлова система надає методи перетворення імен файлів в унікальні ідентифікатори inode і потім - в посилання на inode. На малюнку 5 показана частина структури inode разом з кількома пов'язаними структурами. Зверніть увагу, зокрема, на inode_operations і file_operations. Кожна з цих структур посилається на окремі операції, які можуть виконуватися з inode. Наприклад, inode_operations визначає операції, які працюють безпосередньо з inode, а file_operations відноситься до методів, які працюють з файлами і директоріями (стандартні системні виклики).

Малюнок 5. Структура inode і пов'язані з нею операції

Останні використані вузли inodes і записи dentries зберігаються в кеші inode і кеші директорій відповідно. Зверніть увагу, що кожному inode в кеші inode відповідає запис dentry в кеші директорій. Структури inode і dentry визначені в ./linux/include/linux/fs.h.

буферний кеш

За винятком окремих реалізацій файлових систем (які можна знайти в ./linux/fs), в нижній частині рівня файлової системи розташовується буферний кеш. Тут зберігаються запити на читання і запис від окремих файлових систем і фізичних пристроїв (за допомогою драйверів пристроїв). З міркувань продуктивності в Linux передбачено кеш запитів, що дозволяє не звертатися по кожному запиту до фізичного пристрою. Замість цього в ньому кешуються останні використані буфери (сторінки), які можуть бути швидко надані окремим файловим системам.

Цікаві файлові системи

У цій статті не розповідається про конкретні окремих файлових системах, доступних в Linux, але тут буде корисно їх згадати, хоча б мимохідь. Linux підтримує безліч файлових систем, починаючи від найстаріших - MINIX, MS-DOS і ext2. Linux також підтримує нові файлові системи з журналювання, до яких відносяться ext3, JFS і ReiserFS. Крім того, в Linux підтримуються файлові системи з шифруванням, такі як CFS, і віртуальні файлові системи, такі як / proc.

І, нарешті, окремо варто відзначити файлову систему Filesystem in Userspace або FUSE. Це цікавий проект, який дозволяє вам направляти запити до файлової системи через VFS назад в простір користувача. Тому, якщо ви замислювалися про створення власної файлової системи, то це відмінний шанс для того, щоб почати.

висновок

Незважаючи на те, що реалізація файлової системи аж ніяк не тривіальна, вона є чудовим прикладом розширюваної і масштабованої архітектури. Архітектура файлової системи розвивалася роками, при цьому підтримуючи безліч типів файлових систем і безліч типів пристроїв зберігання. Буде цікаво подивитися на розвиток в найближчому майбутньому файлової системи Linux, що використовує архітектуру доповнень з декількома рівнями перетворення функцій.

Ресурси для скачування

Схожі теми

  • Оригінал статті " Anatomy of the Linux file system "(EN).
  • Файлова система proc надає нову схему зв'язку простору користувача та ядра за допомогою віртуальної файлової системи. У статті " Доступ до ядра Linux за допомогою файлової системи / proc "(EN) (developerWorks, березень 2006 року) описується віртуальна файлова система / proc і демонструються приклади її використання.
  • Інтерфейс системних викликів Linux надає засоби управління переходом між простором користувача і ядром для виклику функцій API ядра. У статті " Команди ядра з використанням системних викликів Linux "(EN) (developerWorks, 2007) описується інтерфейс системних викликів Linux.
  • На сайті Yolinux.com ведеться величезний список файлових систем Linux, кластерних файлових систем і високопродуктивних обчислювальних кластерів. Крім того, повний список файлових систем Linux можна знайти в File systems HOWTO . На сайті Xenotime представлені описи безлічі файлових систем.
  • Більш детальну інформацію про програмуванні Linux в просторі користувача можна знайти в книзі Розробка додатків GNU / Linux (EN), написаної автором цієї статті. (EN)
  • В розділі Linux сайту developerWorks можна знайти додаткові ресурси для розробників Linux, а також познайомитися з найпопулярнішими статтями і проводами . (EN)
  • файлова система Filesystem in Userspace (FUSE) є модулем ядра, який дозволяє розробляти файлові системи в просторі користувача. Реалізація драйвера файлової системи направляє виклики VFS назад в простір користувача. Це відмінний спосіб для проведення експериментів з розробкою файлової системи без розробки ядра. Якщо ви використовуєте Python, ви можете створювати файлові системи за допомогою цієї мови і за допомогою LUFS-Python . (EN)
  • Ознайомтеся з усіма порадами Linux і посібниками Linux на developerWorks.
  • завантажте ознайомчі версії продуктів IBM і отримаєте інструменти розробки і системне програмне забезпечення від DB2®, Lotus®, Rational®, Tivoli®, and WebSphere®. (EN)

Підпишіть мене на повідомлення до коментарів

Що таке файлова система?
Що таке блоковий пристрій?


Новости
  • Виртуальный хостинг

    Виртуальный хостинг. Возможности сервера распределяются в равной мере между всеми... 
    Читать полностью

  • Редизайн сайта

    Редизайн сайта – это полное либо частичное обновление дизайна существующего сайта.... 
    Читать полностью

  • Консалтинг, услуги контент-менеджера

    Сопровождение любых интернет ресурсов;- Знание HTML и CSS- Поиск и обновление контента;-... 
    Читать полностью

  • Трафик из соцсетей

    Сравнительно дешевый способ по сравнению с поисковым и контекстным видами раскрутки... 
    Читать полностью

  • Поисковая оптимизация

    Поисковая оптимизация (англ. search engine optimization, SEO) — поднятие позиций сайта в результатах... 
    Читать полностью