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

Загальний інтерфейс для всіх типів файлових систем можливий тільки завдяки тому, що в ядрі реалізований узагальнюючий рівень, який приховує низькорівневий інтерфейс файлових систем Даний узагальнюючий рівень дозволяє операційній системі Linux підтримувати різні файлові системи, навіть якщо ці файлові системи істотно відрізняються один від одного своїми функціями і особливостями роботи Це в свою чергу стає можливим завдяки тому, що підсистема VFS реалізує загальну файлову модель, яка в змозі уявити загальні функції та особливості роботи потенційно можливих файлових систем Звичайно, ця модель має ухил у бік файлових систем в стилі Unix (що представляють собою файлові системи в стилі Unix, буде розказано в наступному розділі) Незважаючи на це в ОС Linux підтримується досить великий діапазон різних файлових систем

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

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

У свою чергу, ядро ​​легко може працювати з усіма файловими системами, і відповідно, експортований ядром інтерфейс користувача також дозволяє аналогічно працювати з усіма файловими системами

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

write(f, &ampbuf, len)

Цей системний визоп записує len байт з області памяті за адресою & buf в файл, представлений за допомогою дескриптора f, починаючи з поточної позиції файлу Цей системний виклик спочатку обробляється загальною функцією ядра sys_writ e (), яка визначає функцію запису у файл для тієї файлової системи, на якій знаходиться файл, представлений дескриптором f Далі загальний системний виклик викликає знайдену функцію, яка є частиною реалізації файлової системи і служить для запису даних на фізичний носій (або для інших дій, які файлова система виконує при записі файлу) На рис 122 показана діаграма виконання операції запису, починаючи від користувача функції writ e () і закінчуючи надходженням даних на фізичний носій Далі в цій главі буде показано, як підсистема VFS дозволяє досягти необхідної абстракції і які для цього забезпечуються інтерфейси

ФайловиесістемиUnix

Історично так склалося, що ОС Unix забезпечує чотири абстракції, повязані з файловими системами: файли, елементи каталогів (directory entry), індекси (inode) і точки монтування (mount point)

Файлова система – це ієрархічне сховище даних певної структури Файлові системи містять файли, каталоги і відповідну керуючу інформацію Звичайні операції, які виконуються з файловими системами, – це створення (create), видалення (delete) і монтування (mount) В ОС Unix файлові системи монтуються на певну точку монтування в загальній іерархіі1, яка називається простором імен (namespace)Це дозволяє всі файлові системи зробити елементами однієї деревовидної структури2

Файл (file) – це впорядкований потік байтів Перший байт відповідає початку файлу, а останній байт кінця файлу Кожному файлу присвоюється удобочитаем імя, по якому файл ідентифікується як користувачами, так і системою Звичайні файлові операції-це читання (read), запис (write), створення (create) і видалення (delete)

1 Зараз в операційно й системі Linux ця ієрархічна структура є унікальною для кожного процесу, тобто кожен процес має свій простір імен За замовчуванням кожен процес успадковує просторів про име н свого родітельског про процесу, тому здається, чт про існує одне глобальний простір імен

2 На відміну від вказівки букви, котора я відповідає певному диску, наприме р С: В останньому випадку просторів про імен разбіваетс я на частини, які е відповідають різні м пристроям мул і розділах пристроїв Оскільки тако е разделени е виполняетс я випадковим чином, як представлення для користувача його можна вважати не самим ідеальним варіантом

Файли поміщаються в каталогах (directory) Каталог – це аналог папки, яка звичайно містить повязані між собою файли Каталоги можуть містити підкаталоги У цьому звязку каталоги можуть бути вкладені один в одного і утворюють шляхи (path) Кожен компонент шляху називається елементом каталогу (directory entry) Приклад шляхи-/ home / wolfman / foo. Кореневий каталог /, каталоги home і wolfman, a також файл f оо – це елементи каталогів, які називаються dentry В операційній системі Unix каталоги являють собою звичайні файли, які просто містять список файлів каталогу Так як каталог по відношенню до віртуальної файлової системи – це файл, то з каталогами можна виконувати ті ж операції, що і з файлами

Unix-подібні операційні системи відрізняють концепцію файлу від будь-якої інформації про цей файл (права доступу, розмір, власник, час створення тощо) Последняяинформацияиногданазываетсяметаданниміфайла (file, metadata),теданние про дані, і зберігається окремо від файлів в спеціальних структурах, які називаються індексами (inode) Це скорочена назва від index node (Індексний вузол), хоча в наші дні термін inode використовується значно частіше

Вся зазначена інформація, а також повязана з нею інформація про саму файлової системі зберігається в суперблоці (superblock) Суперблок-це структура даних, яка містить інформацію про файлову систему в цілому Іноді ці загальні дані називаються метаданими файлової системи Метадані файлової системи містять інформацію про індивідуальні файлах і про файлову систему в цілому

Традиційно файлові системи ОС Unix реалізують ці поняття як структури даних, які певним чином розташовані на фізичних дисках Наприклад, інформація про файли зберігається в індексі, в окремому блоці диска, каталоги є файлами, інформація з управління файловою системою зберігається централізовано в суперблоці і тд Підсистема VFS операційної системи Linux розрахована на роботу з файловими системами, в яких підтримуються аналогічні концепції Чи не Unix-подібні файлові системи, такі як FAT або NTFS, також працюють в ОС Linux, проте їх програмний код повинен забезпечити наявність аналогічних концепцій Наприклад, якщо файлова система не підтримує окремі індекси файлів, то код повинен побудувати в оперативній памяті структури даних таким чином, щоб здавалося, що така підтримка працює Якщо файлова система розглядає каталоги як обєкти спеціальних типів, для VFS каталоги повинні представлятися як звичайні файли Часто коду не файлових систем не в стилі Unix вимагає виконувати деяку додаткову обробку щоб укластися в парадигму Unix і вимоги VFS Такі файлові системи також підтримуються, і зазвичай якість не особливо страждає

write()

sys_write () Метод запису файлової системи

Простір користувача

VFS Файлова система

Фізичний носій

Рис, 122 Схема проходження даних з простору користувача, де викликається функція wri te (), через загальний системний виклик VFS, до специфічного методу записи файлової системи і, нарешті, надходження па фізичний носій

Джерело: Лав, Роберт Розробка ядра Linux, 2-е видання : Пер з англ – М: ТОВ «ІД Вільямс »2006 – 448 с : Ил – Парал тит англ

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*