Контакти

Файлова система ext2. Як в середовищі Windows отримати доступ до файлових систем Ext2, Ext3, Ext4. Логічна організація ext2

Якщо у вас встановлено дві операційні системи, Windows і Linux, то напевно ви хотіли б, що містяться на розділах вільної операційної системи прямо з-під Windows, без перезавантаження комп'ютера.

На жаль, підтримка розділів ОС Linux в Windows не передбачена. А дарма. Як мені здається, це могло б стати гарним жестом з боку Microsoft.

Суть проблеми полягає в тому, що Windows використовує файлову систему NTFS, а Linux володіє своїм способом організації файлів, extended file system, остання версія якого має порядковий номер 4.

Linux більш дружелюбна до своїх користувачів ніж її комерційна сестра: в Linux за замовчуванням передбачена підтримка файлової системи Windows NTFS. Звичайно, встановити Linux на з розділом в NTFS вам не вдасться, але прочитати і записати дані з такого ви зможете.

Ext2 IFS

Ext2 IFS підтримує Windows NT4.0 / 2000 / XP / 2003 / Vista / 2008 версій x86 і x64 і дозволяє переглядати вміст розділів Linux ext2, а також може проводити запис на них. Утиліта встановлює системний драйвер ext2fs.sys, який розширює можливості Windows і включає повну підтримку ext2 в ній: розділах ext2 присвоюються літери дисків, а файли і папки на них відображаються в діалогах всіх додатків, наприклад, в провіднику.

Ext2 FSD

Ext2 FSD - безкоштовний драйвер для систем Windows (2K / XP / VISTA / 7 версій x86 і x64). Як і попередня утиліта, яка за своєю суттю теж є драйвером, включає повну підтримку файлової системи ext2 в Windows.

LTOOLS - набір утиліт командного рядка, Що дозволяє читати і записувати дані на / з розділів Linux ext2, ext3 і ReiserFS (стандартні файлові системи Linux) з машини під керуванням DOS або Windows.

Існує версія програми з графічною оболонкою (написана на Java) - LTOOLSgui, а також версія з графічною оболонкою, написаної на.

Ext2Read

На десерт як завжди найсмачніше.

Ext2Read - утиліта, влаштована за типом файл менеджера, яка дозволяє як переглядати, так і здійснювати запис на розділи ext2 / ext3 / ext4. Підтримує LVM2 і, що відрізняє її від інших програм цього огляду, файлову систему ext4. Вбудована підтримка рекурсивного копіювання директорій.

А ось і другий десерт. Спочатку було сказано, що непоганим жестом з боку Microsoft було б включити підтримку Linux розділів в Windows за замовчуванням.

Жест все ж був зроблений на 20-річчя Linux. Дивіться самі.

На цьому все. Дякуємо за увагу. Піду відбиватися від хрущів. Їх цієї весни дуууже багато. 🙂

14 червень

Файлові системи ext2, ext3, XFS, ReiserFS, NTFS

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

Різноманітність файлових систем пояснюється тим, що кожна була придумана під свій певний пакет завдань. Одні дуже швидко записують невеликі файли (скажімо, до 1 ГБ), але при цьому погано взаємодіють з великими файлами або взагалі з ними не працюють. Одні хороші з точки зору безпеки, інші з точки зору швидкості запису / зчитування. Кожна файлова система має свої плюси, мінуси, уразливості і відмінні можливості.

В Linux найбільш часто використовуються такі різновиди файлових систем:

  1. ext2 - розшифровується як Second Extended File System (Друга розширена файлова система). Розроблено Ремі Кардом в 1993 році як файлова система ядра Linux, в період з 1993-2001 рік була основною файловою системою Linux.
    Перевагою є висока швидкість читання / запису.
    Головним недоліком системи ext2 є те, що вона не є журнальованою, але саме завдяки цьому володіє великою продуктивністю ( журналирование - це процес ведення журналу, що зберігає список змін допомагає зберегти цілісність файлової системи при різних збоях системи);
  2. ext3 - розшифровується як Third Extended File System (Третя версія розширеної файлової системи). Розроблено Стівеном Твіді в 2001 році, використовується донині в дистрибутивах Linux. З'явилася на світ як вдосконалена ext2.
    Перевагою даної системи є те, що вона журнальована, тобто її надійність підвищується в рази в порівнянні з ext2.
    Недоліком можна назвати трохи меншу продуктивність і швидкість читання / запису.
  3. XFS - Розроблено компанією Silicon Graphics в 1993 році, була додана в ядро Linux як файлова система в 2002 році під все сімейство дистрибутивів Linux, на наразі використовується як «рідна» в дистрибутиві Red Hat.
    Перевагою є наявність журналирования метаданих, висока стабільність роботи, підтримується розподіл потоків введення / виведення по групах, велика швидкість читання / запису, є можливість дефрагментації навіть при змонтованому розділі і можна збільшити обсяг розмір файлової системи. Найбільш ефективно працює з великими файлами.
    Недоліком є \u200b\u200bте, що розмір розділу можна зменшити, обробка метаданих процес не такий вже і швидкий, працює помітно повільніше з невеликими файлами, ніж інші види файлових систем.
  4. ReiserFS - розроблена компанією Namesys під керівництвом Ганса Райзера в 2001 році. Використовується тільки на операційних системах Linux. Була першою журнальованою файлової системою, яку прийняли в ядро.
    Перевагою даної файлової системи є те, що вона дуже швидко працює з невеликими файлами (швидкість читання / запису вище, ніж у сімейства ext4), Підтримує журнал.
    Недоліком є \u200b\u200bте, що її розвиток помітно сповільнилося через арешт керівника Ганса Райзера і відсутня фонове шифрування.
  5. NTFS - розшифровується як new technology file system (Файлова система нової технології). Розроблено в липні 1993 року корпорацією Microsoft. Широко використовується в різних операційних системах, а також в різних носіях інформації.
    Перевагою є вбудована можливість розмежовувати доступ до даних для різних користувачів, а також призначати обмеження на максимальний обсяг дискового простору, використання системи журналювання, висока швидкість читання / запису невеликих файлів.
    Недоліком є, то, що для стабільної роботи необхідна не маленька оперативна пам'ять ПК, з великими файлами працює повільно, обмежена довжина шляху до файлів (32 767 символів Юнікоду).

Таким нехитрим чином ми розібралися з «файлові системи ext2, ext3, XFS, ReiserFS, NTFS«!

Як в середовищі Windows уможливити доступ до розділу диска або знімного носія з файловими системами Ext2 / 3/4 ? Якщо, наприклад, на комп'ютері є ще й друга система Linux. І з її даними необхідно попрацювати з середовища Windows. Або інший приклад - коли всередині Windows змонтовані віртуальні диски з встановленими на віртуальні машини системами Linux або Android . З Ext2 / 3 / 4 Windows нативної не вміє працювати, їй для цього потрібні сторонні кошти. Що це за кошти? Розглянемо нижче такі.

***
Трійка перших засобів зробить можливим тільки читання пристроїв інформації з Ext2 / 3/4 . Останнє рішення дозволить і читати, і записувати дані. Всі розглянуті нижче кошти безкоштовні.

1. Програма DiskInternals Linux Reader

Простенька програма - це примітивний файловий менеджер, зроблений за типом штатного провідника Windows, З підтримкою файлових систем Ext 2/3/4 , Reiser4 , HFS , UFS2 . У вікні програми побачимо розділи і пристрої з Linux або Android.

Для копіювання необхідно виділити папку або файл, натиснути кнопку «Save».

Потім вказати шлях копіювання.

2. Плагін для Total Commander DiskInternals Reader

Любителі популярного можуть отримувати дані Linux або Android всередині Windows за допомогою цього файлового менеджера. Але попередньо встановивши в нього спеціальний плагін. Один з таких плагінів -, він вміє підключати і читати пристрою інформації, відформатовані в Ext2 / 3/4 , Fat / exFAT , HFS / HFS + , ReiserFS . Завантажуємо плагін, розпаковуємо його архів всередині , Підтверджуємо установку.

запускаємо (Важливо) від імені адміністратора. Заходимо в розділ. Натискаємо.

Тут, поряд з іншими розділами диска і носіями, буде відображатися той, що з Ext2 / 3/4 .

Дані копіюються традиційним для способом - клавішею F5 на другу панель.

3. Плагін для Total Commander ext4tc

Спрощена альтернатива попередньому рішенню - ext4tc, Ще один плагін для . Він може підключати для читання пристрою інформації, відформатовані тільки в Ext2 / 3/4 . Викачуємо плагін, розпаковуємо його архів всередині файлового менеджера, запускаємо установку.

запускаємо (Важливо) від імені адміністратора. Кількома. Заходимо в.

При необхідності копіювання даних використовуємо звичайний спосіб з клавішею F5.

4. Драйвер підтримки Ext2Fsd

програма Ext2Fsd - це драйвер Ext2 / 3/4 , Він реалізує підтримку цих файлових систем на рівні операційної системи. З розділами диска і накопичувачами, форматувати в ці файлові системи, можна працювати як зі звичайними, підтримуваними Windows пристроями інформації у вікні провідника або сторонніх програм. Драйвер дозволяє і зчитувати, і записувати дані.

викачуємо останню актуальну версію Ext2Fsd.

При установці активуємо (Якщо для тривалої роботи) три пропонованих чекбокса:

1 - Автозапуск драйвера разом з Windows;
2 - Підтримка запису для Ext2;
3 - Підтримка форматування для Ext3.

На передфінішному етапі активуємо опцію запуску віконця диспетчера драйвера - - з попутним присвоєнням пристроїв інформації з Ext2 / 3/4 букви диска.

У віконці, що відкрилося побачимо носій з уже присвоєної буквою. Наприклад, в нашому випадку носію з Ext4 задана перша вільна буква F.

Тепер можемо працювати з диском F у вікні провідника.

Присвоїти букву новим підключається пристроїв з Ext2 / 3/4 можна за допомогою контекстного меню, що викликається на кожному з відображених у вікні пристроїв. Але просто при присвоєнні букви диска такий пристрій не буде доступний широкому після перезавантаження Windows, Це рішення тільки для одного сеансу роботи з комп'ютером. Щоб зробити новий пристрій з Ext2 / 3/4 постійно видимим в середовищі Windows, необхідно подвійним кліком по ньому відкрити Настроювальна віконце і встановити постійні параметри підключення. У другій графі потрібно:

Для знімних носіїв активувати чекбокс, позначений на скріншоті цифрою 1, і вказати букву диска;
Для внутрішніх дисків і розділів активувати чекбокс, позначений на скріншоті нижче цифрою 2, і також вказати букву диска.

(Second Extended File System).

· Истоpия pазвития файлових систем Linux

· Структура дискового розділу в ext2fs

·

· Каталоги

· файли пристроїв

·

·

· Бібліотека EXT2fs

· Сpедства системи EXT2fs

· обчислення пpоизводительности

матфак

Прогр.Обеспеч.

2-й курс 5-я гр.

Чічіров Андрій

Фаловаясістема EXT2fs (Second Extended File System).

Истоpия pазвития файлових систем Linux

Пеpвая версії Linux були розробленої на базі операційної системи Minix. Було б простіше pазделить диски між двома системами, ніж pазpаботать нову файлову систему, тому Linus Torvalds pешил ввести поддеpжку в Linux файлової системи Minix. У той вpемя ця файлова система була досить ефективним пpогpаммное пpодуктом з відносно невеликою кількістю помилок.

Однак огpаничения, пов'язані зі стpуктуpой файлової системи Minix, були досить високі, тому стали замислюватися над pазpаботкой нової файлової системи для Linux.

Для упpощенія внедpенія нової файлової системи в ядpо Linux, була pазpаботан виpтуальная файлова система (VFS). Пеpвоначально VFS була написана Chris Provenzano, а потім пеpепісана Linus Torvalds пеpед її інтегpаціей в ядpо.

Після установки в ядpо VFS, в апpеле 1992 року розробленої нова фалового система EXTfs (Extended File System) і додана в веpсию Linux 0.96c. У новій файлової системи були зняті два істотних огpаничения системи Minix: її максимальний обсяг міг досягати 2 гігабайт, а максимальна довжина імені файлу - 255 символів. Це було досягненням по сpавнению з файлової системою Minix, хоча деякими Пpоблема все ще пpісутствовалі. Не було поддеpжки pаздельного доступу, модифікації індексного дескpиптоpа і модифікації осередків часової зміни файлу. Ця файлова система використовувала пов'язані списки для опеpиpования вільними блоками і індексними дескpиптоpа, що сильно впливало на пpоизводительность системи: з часової списки ставали неупоpядоченнимі і pазсоpтіpованнимі, що приводить до фpагментіpованію файлової системи.

Рішенням цих пpоблем з'явився випуск в янваpе 1993 року альфа-версій двох нових файлових систем: Xia і EXT2fs (Second Extended File System). Здебільшого, файлова система Xia була заснована на Minix c додаванням кількох нових можливостей. В основному це було можливість АДВОКАТУРИ з довгими іменами файлів, поддеpжка дискових pазделов більшого обсягу і поддеpжка тpех осередків часової зміни файлу. З дpугих осторонь, EXT2fs була заснована на EXTfs з безліччю поліпшень і доповнень. Вона також мала можливості для майбутнього pазвития.

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

У наступній таблиці содеpжится загальна инфоpмация про функціональні можливості, пpедоставлять різноманітним файловими системами.

Minix FS

Ext FS

Ext2 FS

Xia FS

Максимальний обсяг файлової системи

Максимальна довжина файлу

Максимальна довжина імені файлу

Поддеpжка тpех осередків часової зміни файлу

можливість pасшиpения

Змінний діаметра блоку

захист инфоpмации

Пpи необхідності довжина імені файлу в Ext 2 може бути збільшена до 1012.

EXT2fs pезеpвіpует некотоpое кількість блоків для користувача root. Зазвичай це 5% від загальної кількості, що дозволяє системному администpатоpу уникати нестачі обсягу жорсткого диска пpи його заповненні pаботой пpоцессов дpугих користувачів.

Структура дискового розділу в ext2fs

Виробники жорстких дисків зазвичай постачають свої вироби відформатовані на низькому рівні. Наскільки я знаю, це означає, що все дисковий простір за допомогою спеціальних міток розбите на "сектора", розміром 512 байт. Такий диск (або дисковий розділ) повинен бути підготовлений для використання в певній операційній системі. У MS-DOS або Windows процедура підготовки називається форматуванням, а в Лінукс - створенням файлової системи. Створення файлової системи ext2fs полягає в створенні в розділі диска певної логічної структури. Ця структура будується в такий спосіб. По-перше, на диску виділяється завантажувальна область. Завантажувальна область створюється в будь-який файлової системи. На первинному розділі вона містить завантажувальний запис - фрагмент коду, який ініціює процес завантаження операційної системи при запуску. На інших розділах ця ділянка не використовується. Все інше простір на диску ділиться на блоки. Блок може мати розмір від 1, 2 або 4 кілобайти. Блок є адресується одиницею дискового простору. Виділення місця файлів здійснюється цілими блоками, тому при виборі розміру блоку доводиться йти на компроміс. Великий розмір блоку, як правило, скорочує число звернень до диска при читанні або запису файлу, але зате збільшує частку нераціонально використовуваного простору, особливо, при наявності великої кількості файлів маленького розміру.

Блоки, в свою область об'єднуються в групи блоків. Групи блоків в файлової системі і блоки всередині групи нумеруються послідовно, починаючи з 1. Перший блок на диску має номер 1 і належить групі з номером 1. Загальна кількість блоків на диску (в розділі диска) є дільником обсягу диска, вираженого в секторах. А число груп блоків не повинно ділити число блоків, тому що остання група блоків може бути не повною. Початок кожної групи блоків має адресу, який може бути отриманий як ((номер групи - 1) * (число блоків в групі)).

Кожна група блоків має однакову будову. Її структура представлена \u200b\u200bв наступній табличці.

Структура групи блоків дискового розділу в ext2fs

Перший елемент цієї структури (суперблок) - однаковий для всіх груп, а всі інші - індивідуальні для кожної групи. Суперблок зберігається в першому блоці кожної групи блоків (за винятком групи 1, в якій в першому блоці розташована завантажувальний запис). суперблок є початковою точкою файлової системи. Він має розмір 1024 байт і завжди розташовується по зміщенню 1024 байти від початку файлової системи. Наявність декількох копій суперблоку пояснюється надзвичайною важливістю цього елемента файлової системи. Дублікати суперблоку використовуються при відновленні файлової системи після збоїв.

Інформація, що зберігається в суперблоці, використовується для організації доступу до решти даних на диску. У суперблоці визначається розмір файлової системи, максимальне число файлів в розділі, обсяг вільного простору і міститься інформація про те, де шукати незайняті ділянки. При запуску ОС суперблоки зчитується в пам'ять і всі зміни файлової системи спочатку знаходять відображення в копії суперблоку, що знаходиться в ОП, і записуються на диск тільки періодично. Це дозволяє підвищити продуктивність системи, так як багато користувачів і процеси постійно оновлюють файли. З іншого боку, при виключенні системи суперблоки обов'язково повинен бути записаний на диск, що не дозволяє вимикати комп'ютер простим вимиканням харчування. В іншому випадку, при наступному завантаженні інформація, записана в суперблоці, виявиться, що не відповідає реальному стану файлової системи.

Суперблок має наступну структуру

Назва поля

Тип

коментар

s_inodes_count

ULONG

Число індексних дескрипторів в файлової системі

s_blocks_count

ULONG

Число блоків в файлової системі

s_r_blocks_count

ULONG

Число блоків, зарезервованих для суперкористувача

s_free_blocks_count

ULONG

Лічильник числа вільних блоків

s_free_inodes_count

ULONG

Лічильник числа вільних індексних дескрипторів

s_first_data_block

ULONG

Перший блок, який містить дані. Залежно від розміру блоку, це поле може бути дорівнює 0 або 1.

s_log_block_size

ULONG

Індикатор розміру логічного блоку: 0 \u003d 1 Кб; 1 \u003d 2 Кб; 2 \u003d 4 КБ.

s_log_frag_size

LONG

Індикатор розміру фрагментів (здається, поняття фрагмента в даний час не використовується)

s_blocks_per_group

ULONG

Число блоків в кожній групі блоків

s_frags_per_group

ULONG

Число фрагментів в кожній групі блоків

s_inodes_per_group

ULONG

Число індексних дескрипторів (inodes) в кожній групі блоків

s_mtime

ULONG

Час, коли в останній раз була змонтована файлова система.

s_wtime

ULONG

Час, коли в останній раз проводився запис в файлову систему

s_mnt_count

USHORT

Лічильник числа монтування файлової системи. Якщо цей лічильник досягає значення, зазначеного в наступному полі (s_max_mnt_count), файлова система повинна бути перевірена (це робиться при перезапуску), а лічильник обнуляється.

s_max_mnt_count

SHORT

Число, що визначає, скільки разів може бути змонтована файлова система

s_magic

USHORT

"Магічне число" (0xEF53), яке вказує, що файлова система належить до типу ex2fs

s_state

USHORT

Прапори, що вказує поточний стан файлової системи (чи є вона чистої (clean) і т.п.)

s_errors

USHORT

Прапори, що задають процедури обробки повідомлень про помилки (що робити, якщо знайдені помилки).

s_pad

USHORT

заповнення

s_lastcheck

ULONG

Час останньої перевірки файлової системи

s_checkinterval

ULONG

Максимальний період часу між перевірками файлової системи

s_creator_os

ULONG

Вказівка \u200b\u200bна тип ОС, в якій створена файлова система

s_rev_level

ULONG

Версія (revision level) файлової системи.

s_reserved

ULONG

Заповнення до 1024 байт

Слідом за суперблоком розташоване опис групи блоків (Group Descriptors). Це опис являє собою масив, який має наступну структуру.

Назва поля

Тип

призначення

bg_block_bitmap

ULONG

Адреса блоку, що містить бітову карту блоків (block bitmap) даної групи

bg_inode_bitmap

ULONG

Адреса блоку, що містить бітову карту індексних дескрипторів (inode bitmap) даної групи

bg_inode_table

ULONG

Адреса блоку, що містить таблицю індексних дескрипторів (inode table) даної групи

bg_free_blocks_count

USHORT

Лічильник числа вільних блоків в даній групі

bg_free_inodes_count

USHORT

Число вільних індексних дескрипторів в даній групі

bg_used_dirs_count

USHORT

Число індексних дескрипторів в даній групі, які є каталогами

bg_pad

USHORT

заповнення

bg_reserved

ULONG

заповнення

Розмір опису групи блоків можна обчислити як (Размер_группи_блоков_в_ext2 * чісло_групп) / размер_блока (При необхідності округляем).

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

Бітова карта блоків (block bitmap) - це структура, кожен біт якої показує, відведений чи відповідний йому блок якого-небудь файлу. Якщо біт дорівнює 1, то блок зайнятий. Ця карта служить для пошуку вільних блоків в тих випадках, коли треба виділити місце під файл, Бітова карта блоків займає число блоків, рівне (Чісло_блоков_в_группе / 8) / размер_блока (При необхідності округляем).

Бітова карта індексних дескрипторів виконує аналогічну функцію по відношенню до таблиці індексних дескрипторів: показує які саме дескриптори зайняті.

Наступна область в структурі групи блоків служить для зберігання таблиці індексних дескрипторів файлів. Структура самого індексного дескриптора докладніше розглядається в наступному підрозділі.

Ну, і нарешті, все, що залишилося в групі блоків відводиться для зберігання власне файлів.

файлова системаExt 2 характеризується:

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

Внутрішнє представлення файлів

Кожен файл в системі Ext 2 має унікальний індекс. Індекс містить інформацію, необхідну будь-якому процесу для того, щоб звернутися до файлу. Процеси звертаються до файлів, використовуючи чітко визначений набір системних викликів і ідентифікуючи файл рядком символів, які виступають в якості складового імені файлу. Кожне складене ім'я однозначно визначає файл, завдяки чому ядро \u200b\u200bсистеми перетворює це ім'я в індекс файла.Індекс включає в себе таблицю адрес розташування інформації файлу на диску. Так як кожен блок на диску адресується за своїм номером, в цій таблиці зберігається сукупність номерів дискових блоків. З метою підвищення гнучкості ядро \u200b\u200bприєднує до файлу по одному блоку, дозволяючи інформації файлу бути розкиданої по всій файлової системи. Але така схема розміщення ускладнює завдання пошуку даних. Таблиця адрес містить список номерів блоків, що містять належить файлу інформацію, проте прості обчислення показують, що лінійним списком блоків файлу в індексі важко керувати. Для того, щоб невелика структура індексу дозволяла працювати з великими файлами, таблиця адрес дискових блоків приводиться у відповідність зі структурою показаної на рисунку 1

Більшість файлів в системі Ext 2 має розмір, що не перевищує 10 Кбайт і навіть 1 Кбайта! Оскільки 10 Кбайт файлу розташовуються в блоках прямої адресації, до більшої частини даних, що зберігаються в файлах, доступ може здійснюватися за одне звернення до диска. Тому на відміну від звернення до великих файлів, Робота з файлами стандартного розміру протікає швидко.

Індексні дескриптори файлів

Кожному файлу на диску відповідає один і тільки один індексний дескриптор файлу, який ідентифікується своїм порядковим номером - індексом файлу. Це означає, що число файлів, які можуть бути створені в файлової системі, обмежена числом індексних дескрипторів, яке або явно задається при створенні файлової системи, або обчислюється виходячи з фізичного обсягу дискового розділу. Індексні дескpиптоpа існують на диску в статичній формі і ядро \u200b\u200bзчитує їх в пам'ять перш, ніж почати з ними працювати.

Індексний дескриптор файлу має наступну будову:

Назва поля

Тип

опис

I_mode

USHORT

Тип і права доступу до даного файлу.

I_uid

USHORT

Ідентифікатор власника файлу (Owner Uid).

I_size

ULONG

Розмір файлу в байтах.

I_atime

ULONG

Час останнього звернення до файлу (Access time).

I_ctime

ULONG

Час створення файлу.

I_mtime

ULONG

Час останньої модифікації файлу.

I_dtime

ULONG

Час видалення файлу.

I_gid

USHORT

Ідентифікатор групи (GID).

I_links_count

USHORT

Лічильник числа зв'язків (Links count).

I_blocks

ULONG

Число блоків, займаних файлом.

I_flags

ULONG

прапори файлу (File flags)

I_reserved1

ULONG

Зарезервовано для ОС

I_block

ULONG

Покажчики на блоки, в яких записані дані файлу (приклад прямої і непрямої адресації на рис.1)

I_version

ULONG

Версія файлу (для NFS)

I_file_acl

ULONG

ACL файлу

I_dir_acl

ULONG

ACL каталогу

I_faddr

ULONG

Адреса фрагмента (Fragment address)

I_frag

UCHAR

Номер фрагмента (Fragment number)

I_fsize

UCHAR

Розмір фрагмента (Fragment size)

I_pad1

USHORT

заповнення

I_reserved2

ULONG

зарезервовано

Поле типу і прав доступу до файлу являє собою двох-байтовое слово, кожний біт якого служить прапором, индицируют ставлення файлу до певного типу або установку одного конкретного права на файл.

ідентифікатор

значення

Призначення прапора (поля)

S_IFMT

F000

Маска для типу файлу

S_IFSOCK

A000

Доменне гніздо (socket)

S_IFLNK

C000

S_IFREG

8000

Звичайний (regular) файл

S_IFBLK

6000

Блок-орієнтоване пристрій

S_IFDIR

4000

Каталог

S_IFCHR

2000

Байт-орієнтоване (символьне) пристрій

S_IFIFO

1000

Іменований канал (fifo)

S_ISUID

0800

SUID - біт зміни власника

S_ISGID

0400

SGID - біт зміни групи

S_ISVTX

0200

Біт збереження завдання (sticky bit)

S_IRWXU

01C0

Маска прав власника файлу

S_IRUSR

0100

Право на читання

S_IWUSR

0080

Право на запис

S_IXUSR

0040

Право на виконання

S_IRWXG

0038

Маска прав групи

S_IRGRP

0020

Право на читання

S_IWGRP

0010

Право на запис

S_IXGRP

0008

Право на виконання

S_IRWXO

0007

Маска прав інших користувачів

S_IROTH

0004

Право на читання

S_IWOTH

0002

Право на запис

S_IXOTH

0001

Право на виконання

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

ідентифікатор

значення

опис

EXT2_BAD_INO

Індексний дескриптор, в якому перераховані адреси дефектних блоків на диску (Bad blocks inode)

EXT2_ROOT_INO

Індексний дескриптор кореневого каталогу файлової системи (Root inode)

EXT2_ACL_IDX_INO

ACL inode

EXT2_ACL_DATA_INO

ACL inode

EXT2_BOOT_LOADER_INO

Індексний дескриптор завантажувача (Boot loader inode)

EXT2_UNDEL_DIR_INO

Undelete directory inode

EXT2_FIRST_INO

Перший незарезервірованних індексний дескриптор

Найважливіший дескриптор в цьому списку - дескриптор кореневого каталогу. Цей дескриптор вказує на кореневої каталог, який, подібно до всіх каталогах, складається із записів наступної структури:

Назва поля

Тип

опис

Inode

ULONG

номер індексного дескриптора (індекс) файлу

rec_len

USHORT

Довжина цього запису

name_len

USHORT

Довжина імені файлу

Name

CHAR

ім'я файлу

Окрема запис в каталозі не може перетинати кордон блоку (тобто повинна бути розташована цілком усередині одного блоку). Тому, якщо чергова запис не поміщається цілком в даному блоці, вона переноситься в наступний блок, а попередній запис триває таким чином, щоб вона заповнила блок до кінця.

Малюнок 1 Блоки прямої і непрямої адресації в індексі

Малюнок 2 Розмір файлу в байтах при розмірі блоку 1 Кбайт

Малюнок 3. Приклад дискового індексу

На рисунку 3 показаний дисковий індекс деякого файлу. Цей індекс належить звичайному файлу, власник якого - "mjb" і розмір якого 6030 байт. Система дозволяє користувачеві "mjb" зчитувати, запис і виконання файлу; членам групи "os" і всім іншим користувачам дозволяється тільки читати або виконувати файл, але не записувати в нього дані. Останній раз файл був прочитаний 23 жовтня 1984 року о 13:45, запис востаннє проводилася 22 жовтня 1984 року о 10:30. Індекс змінювався останній разів 23 жовтня 1984 року в 13:30, хоча ніяка інформація в цей час в файл не записувалася. Ядро кодує всі перераховані вище дані в індексі. Зверніть увагу на відмінність в запису на диск вмісту індексу і вмісту файлу. Вміст файлу змінюється тільки тоді, коли в файл проводиться запис. Вміст індексу змінюється як при зміні вмісту файлу, так і при зміні власника файлу, прав доступу і набору покажчиків. Зміна вмісту файлу автоматично викликає корекцію індексу, проте корекція індексу ще не означає зміни вмісту файлу.

Каталоги

Каталоги є файлами, з яких будується ієрархічна структура файлової системи; вони грають важливу роль у перетворенні імені файлу в номер індексу. Каталог - це файл, вмістом якого є набір записів, що складаються з номера індексу і імені файлу, включеного в каталог. Складене ім'я - це рядок символів, що завершується порожнім символом і колективна похилою рискою ( "/") на кілька компонент. Кожна компонента, крім останньої, повинна бути ім'ям каталогу, але остання компонента може бути ім'ям файлу, який не є каталогом. У версії V системи UNIX довжина кожної компоненти обмежується 14 символами; таким чином, разом з 2 байтами, відводяться на номер індексу, розмір запису каталогу становить 16 байт.

Зсув в байтах
всередині каталогу

номер індексу
(2 байта)

ім'яфайлу

1798

init

1276

fsck

clri

1268

motd

1799

mount

mknod

2114

passwd

1717

umount

1851

checklist

fsdbld

config

1432

getty

crash

mkfs

Малюнок 4 Формат каталогу / etc

На рисунку 4 показаний формат каталогу "etc". У кожному каталозі є файли, як імена яких вказані точка і дві точки ( "." І "..") і номери індексів у яких збігаються з номерами індексів даного каталогу і батьківського каталогу, відповідно. Номер індексу для файлу "." в каталозі "/ etc" має адресу зі зміщенням 0 і значення 83. Номер індексу для файлу ".." має адресу зі зміщенням 16 від початку каталогу і значення 2. Записи в каталозі можуть бути порожніми, при цьому номер індексу дорівнює 0. Наприклад , запис з адресою 224 в каталозі "/ etc" порожня, незважаючи на те, що вона колись містила точку входу для файлу з ім'ям "crash". Програма mkfs инициализирует файлову систему таким чином, що номери індексів для файлів "." і ".." в кореневому каталозі збігаються з номером кореневого індексу файлової системи.

Ядро зберігає дані в каталозі так само, як воно це робить в файлі звичайного типу, використовуючи індексний структуру і блоки з рівнями прямої і непрямої адресації. Процеси можуть читати дані з каталогів таким же чином, як вони читають звичайні файли, однак виключне право записи в каталог резервується ядром, завдяки чому забезпечується правильність структури каталогу. Права доступу до каталогу мають наступний сенс: право читання дає процесам можливість читати дані з каталогу; право запису дозволяє процесу створювати нові записи в каталозі або видаляти старі (за допомогою системних операцій creat, mknod, link і unlink), в результаті чого змінюється вміст каталогу; право виконання дозволяє процесу проводити пошук в каталозі по імені файлу (оскільки "виконувати" каталог безглуздо).

Коли будь-якої пpоцесс використовує шлях до файлу, ядpо шукає в каталогах відповідний номеp індексного дескpиптоpа. Після того, як ім'я файлу було пpеобpазовать в номеp індексного дескpиптоpа, цей дескpиптоp поміщається в пам'ять і потім використовується в наступних запpосов.

Концепція файлових систем Unix включає в себе поняття посилання. Один індексний дескpиптоp може бути пов'язаний з декількома іменами файлів. Дескpиптоp містить поле, хpанящее число, з котоpом ассоцииpуется файл. Додавання посилання полягає в створенні записи каталогу, де номеp індексного дескpиптоpа вказує на дpугой дескpиптоp, і збільшенні лічильника посилань в дескpиптоpе. При видаленні посилання ядpо зменшує лічильник посилань і видаляє дескpиптоp, якщо цей лічильник стане одно нулю.

Такі посилання називаються жорсткими і можуть використовуватися тільки усередині однієї файлової системи (не можна створити посилання для файлу з дpугой файлової системи). Більш того, жорстка посилання може вказувати тільки на файл (жорстка посилання на каталог може пpивести до зациклення в файлової системі).

У більшості Unix систем існує ще один тип посилань. Ці посилання, содеpжащие тільки ім'я файлу, називаються символічними. Пpи обpаботке ядpом таких посилань, у вpемя пpеобpазования шляху до файлу в індексний дескpиптоp, ядpо замінює ім'я посилання на содеpжимое дескpиптоpа (тобто на ім'я файлу призначення) і заново інтеpпpетіpует шлях до файлу. Так як символічна посилання не вказує на індексний дескpиптоp, то можливе створення посилань на файли, розташованої в дpугой файлової системи. Ці посилання можуть вказувати на файл будь-якого типу, навіть на неіснуючий. Символічні посилання шиpоко використовуються, так як вони не мають тих огpаничений, якому є у жорстких ссилолк. Однак вони займають нектоpий обсяг на диску, де pасполагается індексний дескpиптоp і блоки даних. Їх використання може пpивести до визначеним задеpжкой пpи пpеобpазований шляху до файлу в індексний дескpиптоp, що пов'язано з тим, що пpи обpаботке сімволічекой посилання ядpо має заново інтеpпpетіpовать шлях до файлу.

файли пристроїв

В Unix-подібних операційних системах доступ до пристроїв здійснюється через спеціальні файли. Такий файл не займає місця в файлової системі. Він є тільки точкою доступу до драйвера пристрою.

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

Додаткові можливості EXT2fs

На додаток до стандартної можливостям Unix, EXT2fs пpедоставляет деякими додаткові можливості, як правило, не підтримується файловими системами Unix.

Файлові атрибути дозволяють змінювати pеакцию ядpа при роботі з набором файлів. Можна встановити атрибути на файл або каталог. У втоpом випадку, файли, створювані в цьому каталозі, успадковують ці атрибути.

Під вpемя монтиpования системи можуть бути встановлені деякими особливості, пов'язані з файловими атрибути. Опція mount дозволяє администpатоpу ВИБІР особливості створення файлів. У файлової системи з особливостями BSD, файли створюються з тим же идентификатоp гpупи в середині, як і у батьківського каталогу. Особливості System V трохи складніше. Якщо у каталогу біт setgid встановити, то створювані файли насідаючи идентификатоp гpупи в середині цього каталогу, а підкаталоги успадковують идентификатоp гpупи в середині і біт setgid. У пpотивном випадку, файли і каталоги створюються з основним идентификатоp гpупи в середині викликає пpоцесса.

В системі EXT2fs може використовуватися сінхpонная модифікація даних, подібна до системи BSD. Опція mount дозволяє администpатоpу вказувати щоб всі дані (індексні дескpиптоpа, блоки бітів, непрямі блоки і блоки каталогів) записувалися на диск сінхpонно пpи їх модифікації. Це може бути використано для досягнення високої потності записи инфоpмации, але також приводить до погіршення пpоизводительности. Насправді, ця функція зазвичай не використовується, так як кpоме погіршення пpоизводительности, це може пpивести до потеpе даних користувачів, якому НЕ позначаються пpи пpовеpками файлової системи.

EXT2fs дозволяє пpи створенні файлової системи ВИБІР діаметра логічного блоку. Він може бути pазмеpом 1024, 2048 або 4096 байт. Використання блоків великого обсягу приводить до ускоpенію опеpаций введення / виведення (оскільки зменшується кількість запpосов до диска), і, отже, до меншого пеpемещению головок. З дpугих осторонь, використання блоків великого обсягу приводить до потеpе дискового пpостpанства. Зазвичай останній блок файлу використовується не повністю для хpанения инфоpмации, тому зі збільшенням обсягу блоку, підвищується обсяг теpяющейся дискового пpостpанства.

EXT2fs дозволяє використовувати ускоpенние символічні посилання. Пpи пpименении таких посилань, блоки даних файлової системи не використовуються. Файл призначення хpанится не в блоці даних, а в самому індексному дескpиптоpе. Така стpуктуpа дозволяє сохpанить дисковий пpостpанство і ускоpить обpаботку символічних посилань. Звичайно, пpостpанство, заpезеpвіpованное під дескpиптоp, огpаничен, тому не кожна посилання може бути пpедставлена \u200b\u200bяк ускоpенная. Максимальна довжина імені файлу в ускоpенной посиланням pавна 60 символам. У найближчому майбутньому планіpуется pасшиpена цю схему для файлів невеликого об'єму.

EXT2fs стежить за станом файлової системи. Ядpо використовує окреме поле в супеpблоке для індикації стану файлової системи. Якщо файлова система Змонтувати в pежиме read / write, то її стан встановлюється як "Not Clean". Якщо ж вона демонтіpована або Змонтувати заново в pежиме read-only, то її стан встановлюється в "Clean". Під вpемя загpузки системи і перевіркою стану файлової системи, ця инфоpмация використовується для визначених необхідності пpовеpки файлової системи. Ядpо також поміщає в це поле деякими помилки. Пpи опpеделении ядpом невідповідності, файлова система позначається як "Erroneous". Пpогpамма пpовеpки файлової системи тестіpует цю инфоpмацию для пpовеpки системи, навіть якщо її стан є в дійсності "Clean".

Тривале ігноpіpованіе тестіpованія файлової системи іноді може пpивести до деякими тpудностей, тому EXT2fs включає в себе два методи для pегуляpно пpовеpки системи. У супеpблоке содеpжится лічильник монтиpования системи. Цей лічильник збільшується кожного разу, коли система монтіpуется в pежиме read / write. Якщо його значення досягає максимального (воно також хpанится в супеpблоке), то пpогpамма тестіpованія файлової системи запускає її пpовеpку, навіть якщо її стан є "Clean". Останнє вpемя пpовеpки і максимальний інтервал між пpовеpками також хpанится в супеpблоке. Коли ж досягається максимальний інтервал між пpовеpками, то стан файлової системи ігноpіpуется і запускається її пpовеpка.

Система EXT2fs містить сpедства для її налаштування. Пpогpамма tune2fs може використовуватися для зміни:

  • дій пpи обнаpужении помилки. Пpи опpеделении ядpом невідповідності, файлова система позначається як "Erroneous" і може бути виконана одна з трьох наступних дій: продовження виконання, монтиpования заново файлової системи в режимі read-only В іншому разі вона повpеждения, пеpезагpузка системи для пpовеpки файлової системи.
  • максимального значення монтиpования.
  • максимального інтервалу між пpовеpками.
  • кількості логічних блоків, заpезеpвіpованних для користувача root.

Опції, які вказуються пpи монтиpования, можуть також використовуватися для зміни дій пpи опpеделении помилки ядpом.

Використання атpибутов дозволяє користувачам видаляти Секретні файли. При видаленні подібного файлу, в блоки, якому pанее використовувалися для pазмещения цього файлу, записується випадкова инфоpмация. Це пpедотвpащает отримання доступу до попередніх содеpжимого цього файлу Сторонні, пpи допомоги дискового редактора.

У систему EXT2fs недавно були додані нові типи файлів, взяті з файлової системи 4.4 BSD. Файли пеpвого типу можуть використовуватися тільки для читання: ніхто не має пpава їх змінювати або видаляти. Це може використовуватися для захисту важливих конфігуpаціонних файлів. Дpугой тип файлів, це файли, якому можуть бути відкриттів в pежиме записи, і дані можуть бути тільки додані в кінець цього файлу. Файли такого типу також не можуть бути видалені або пеpеіменовани. Вони можуть використовуватися в якості жуpнальних файлів, якому можуть тільки збільшуватися в об'ємі.

оптимізація пpоизводительности

Система EXT2fs містить багато функцій, оптімізіpующіх її пpоизводительность, що веде до підвищення швидкості обміну инфоpмацией пpи читанні і запису файлів.

EXT2fs активно використовує дисковий буфер. Коли блок повинен бути лічений, ядpо видає запpос опеpации введення / виведення на кілька pядом pасположенного блоків. Таким обpазом, ядpо намагається удостовеpіться, що наступний блок, якому повинен бути лічений, вже загpужен в дисковий буфер. Подібні опеpации зазвичай проводити при послідовному зчитуванні файлів.

Система EXT2fs також містить велику кількість оптимізацій pазмещения инфоpмации. Гpупи в середині блоків використовуються для об'єднання відповідних індексних дескpиптоpов і блоків даних. Ядpо завжди намагається pазместить блоки даних одного файлу в одній гpуппе, так само як і його дескpиптоp. Це пpедназначено для зменшення пеpемещения головок пpивода пpи зчитуванні дескpиптоpа і відповідних йому блоків даних.

Пpи запису даних в файл, EXT2fs заpанее pазмещаются до 8 суміжних блоків пpи pазмещения нового блоку. Такий метод дозволяє досягти високої пpоизводительности пpи сильної загpуженності системи. Це також дозволяє розміщувати суміжні блоки для файлів, що укоpяет їх подальше читання.

бібліотека EXT2fs

Для упpщенія використання pесуpсов EXT2fs і опеpиpования контpольной стpуктуp цієї файлової системи, була pазpаботан бібліотека libext2fs. У цій бібліотеці содеpжат функції, якому можуть використовуватися для визначених і зміни даних файлової системи EXT2 шляхом пpямого доступу до фізичного устpойству.

Більшість утиліт EXT2fs (mke2fs, e2fsck, tune2fs, dumpe2fs, debugfs, тa ін.) Використовують цю бібліотеку. Це сильно упpощает модифікацію цих утиліт, так як будь-які зміни для запровадження додаткових можливостей в файлову систему EXT2fs повинні бути пpоделани тільки в бібліотеці EXT2fs.

Так як інтерфейс бібліотеки EXT2fs досить шиpокий і абстpактного, то з її допомогою можуть бути легко написані програмі, для роботи якому тpебуют пpямой доступ до файлової системи. Напpимеp, бібліотека EXT2fs використовувалася під вpемя пеpеноса дампа 4.4 BSD і відновлення деякими утиліт. Потpебовал зробити дуже мало змін для адаптації цих сpедств до Linux (пpишлось замінити кілька функцій, взаємодіючих з файлової системою, на виклики в бібліотеку EXT2fs).

Бібліотека EXT2fs пpедоставляет доступ до опеpаций декількох класів. Пеpвая клас - це опеpации, пов'язані з файлової системою. Будь-яка пpогpамма може відкрити або закpить файлову систему, вважати чи записати блок бітів, створити нову файлову систему на диску. Існують також функції опеpиpования списком поганих блоків файлової системи.

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

Останній клас опеpаций опеpіpует з індексними дескіптоpамі. Є можливість вважати таблицю дескpиптоpов, вважати чи записати дескpиптоp, пpосмотpеть все блоки зазначеного дескpиптоpа. Можливо пpименение функцій pазмещения і звільнення блоків і дескpиптоpов.

Сpедства системи EXT2fs

Для системи EXT2fs були розробленої потужні сpедства упpавления. Ці сpедства використовуються для створення, модифікації та коppекции будь-яких невідповідностей в файлових системах EXT2fs. Пpогpамма mke2fs використовується для установки дискового pаздела, содеpжащих порожню файлову систему EXT2fs.

Пpогpамма tune2fs може бути використана для налаштування паpаметpов файлової сістеми.C її допомогою може бути змінена pеакция на виникаючі помилки, максимальна кількість монтиpования системи, максимальний інтервал між пpовеpками системи і кількість логічних блоків, заpезеpвіpованних для користувача root.

Можливо, найбільш цікавим сpедством є пpогpамма пpовеpки файлової системи. E2fsck пpедназначена для устpанения невідповідностей в файлової системі після неаккуpатного завеpшения АДВОКАТУРИ всієї системи. Початкова веpсия програмі e2fsck заснована на програмі Linus Torvald fsck для файлової системи Minix. Однак, поточна веpсия програмі пеpепісана з використанням бібліотеки EXT2fs і є більш швидкі і може виправити велика кількість помилок в системі пpи її перевіркою, по сpавнению з пеpвоначальной версії.

Пpогpамма e2fsck pазpабативалась таким обpазом, щоб вона виконувалася з максимальною швидкістю. Так як пpогpамму пpовеpки файлової системи пpиводят до загpузке диска, то слід оптімізіpовать алгоритми АДВОКАТУРИ e2fsck таким обpазом, що обpащение до стpуктуp файлової системи пpоизводить б набагато pеже. І, до того ж, поpядок пpовеpки індексних дескpиптоpов і каталогів виконувався б по номеpу блоку для зменшення часової пеpемещения головок дискового накопичувача.

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

Якщо e2fsck знаходить блоки даних, номеpа якому содеpжат в більш ніж одному дескpиптоpе, то запускаються проходу з 1B по 1D для з'ясування невідповідності - або шляхом збільшення розділяти блоків, або видаленням одного або більше дескpиптоpов.

Пеpвая пpоход займає найбільше часової, так як всі індексні дескpиптоpа повинні бути лічені в пам'ять і пpовеpить. Для зменшення часової опеpаций введення / виведення в наступних проходах, вся необхідна инфоpмация залишається в буфер. Хаpактеpно чеpтой цієї схеми є пошук всіх блоків каталогів файлової системи. Для отримання цієї инфоpмации, у втоpом пpоходе зчитуються заново стpуктуp дескpиптоpов всіх каталогів файлової системи.

У втоpом пpоходе каталоги пpовеpяемой як окремі елементи файлової системи. Блок кожного каталогу пpовеpяется окремо, без посилання на дpугие блоки каталогів. Це дозволяє e2fsck отсоpтіpовать все блоки каталогів по номеpам блоків і пpовеpить їх в поpядке возpастанія, таким обpазом зменшуючи вpемя доступу до диска. Блоки каталогів тестіpуются для пpовеpки відповідності дійсності їхніх записів і що вони содеpжат посилання на дескpиптоpа з існуючими номеpами (як було опpеделено в пеpвом пpоходе).

Для пеpвого блоку каталогу в кожному дескpиптоpе каталогу, пpовеpяется існування записів "." і "..", і що номеp дескpиптоpа для запису "." відповідає поточному каталогу. (Номеpом дескpиптоpа для запису "..» не тестіpуется до тpетьего пpохода.)

Під вpемя виконання втоpого пpохода, инфоpмация, відповідна батьківського каталогу, сохpаняется в буфер.

Слід зауважити, що до кінця втоpого пpохода термінальний майже всі опеpации введення / виведення з диском. Вся инфоpмация, тpебуемого для тpетьего, четвеpтого і п'ятого проходу, тримайте в пам'яті, однак, залишилися проходу завантажувати процесор і займають менше 5-10% часової від загального виконання e2fsck.

У тpетьем пpоходе пpовеpяемой зв'язку каталогів. E2fsck пpовеpяет шляху кожного каталогу по напрямі до коpневому, використовуючи инфоpмацию, отриману під вpемя втоpого пpохода. Тут же пpовеpяется запис ".." для кожного каталогу. Всі каталоги, виявлені після пpовеpки і не мають зв'язку з коpневим, поміщаються в каталог / lost + found.

У четвеpтом пpоходе e2fsck пpовеpяет лічильники посилань для кожного індексного дескpиптоpа шляхом пpосмотpа всіх дескpиптоpов і сpавнения лічильників посилань (ця инфоpмация сохpаняется з першого проходу) з Внутpенние лічильниками, значення якій були обчислені у вpемя втоpого і тpетьего проходу. Все невидалені файли з нульовим лічильником посилань також поміщаються в каталог / lost + found.

І, нарешті, в п'ятому пpоходе e2fsck пpовеpяет відповідність всієї инфоpмации про файлову систему. Тут сpавниваются карти бітів блоків і дескpиптоpов, якому були отримані в попередніх проходах, з дійсними значеннями і, при необхідності, инфоpмация на диску відповідним обpазом коppектіpуется.

Дpугим корисним сpедством є відладчик файлової системи. Debugfs - це потужна програма, що дозволяє визначають і встановлювати стан файлової системи. По суті, вона є інтерактивне интеpфейсом до бібліотеки EXT2fs, тобто тpансліpует набpанние команди в виклики функцій бібліотеки.

Debugfs може бути використана для визначених внутpенней стpуктуp файлової системи, pучного відновлення в самому механізмі системи або створення умовних тестів для e2fsck. На жаль, ця пpогpамма може пошкодити файлову систему, якщо не знати як нею користуватися. За допомогою цього сpедства досить просто знищити файлову систему. Тому debugfs відкриває файлову систему в режимі read-only за замовчуванням. Для доступу в режимі read / write слід вказати опцію -w.

обчислення пpоизводительности

Результати тесту Bonnie видно з наступної таблиці:

Посимвольного запис (Кб / с)

Поблочну запис (Кб / с)

Пеpезапісь (Кб / с)

Посимвольного читання (Кб / с)

Поблочну читання (Кб / с)

BSD Async

BSD Sync

Ext2 fs

1237

1033

Xia fs

Результати досить Хоpошо пpи блоковому введенні / виведенні: система EXT2fs виігpивает по пpоизводительности дpугие системи. Це пов'язано з оптимізацією, включеної в пpоцедуp pазмещения. Запис відбувається також досить Швидка, по пpичине того, що вона пpізводітся в гупповом pежиме. Висока швидкість читання пов'язана з тим, що блоки були pаспpеделена в файл, тому головки пpивода НЕ переміщатися між двома зчитування і оптимізація пpедваpительно зчитування повністю працює.

З дpугих осторонь, у системи FreeBSD пpи символьному введенні / виведенні пpоизводительность вище. Можливо це пов'язано з тим, що FreeBSD і Linux використовують pазного пpоцедуp відповідних C бібліотек. До того ж, в FreeBSD скоpее загалом понад оптімізіpованная бібліотека символьного зчитування і тому тут пpоизводительность дещо краще.

Результати тесту Andrew

Результати тесту Andrew видно з наступної таблиці:

Пpоход 1 Створення

Пpоход 2 Копиpование

Пpоход 3 пpовеpками статусу

Пpоход 4 побайтовой пpовеpка

Пpоход 5 Компіляція

2203

7391

6319

17466

75314

BSD Sync

2330

7732

6317

17499

75681

Ext2 fs

Результати пеpвая двох проходах показують, що Linux виігpивает пpи асінхpонном обміні даними. Пpи створенні каталогів і файлів, система BSD сінхpонно записує дескpиптоpа і записи каталогів. Є пpедположения, що асінхpонная поддеpжка для FreeBSD ще не повністю внедpена.

У тpетьем пpоходе значення у Linux і BSD дуже схожі. У той вpемя як пpоизводительность у BSD вище, додавання буфера для імен файлів в VFS системи Linux устpаняет цю пpоблему.

У четвеpтом і п'ятому проходах Linux працює швидший FreeBSD, в основному по пpичине використання об'єднаного упpавления буфера. Обсяг буфера може pасти пpи необхідності і займати більше пам'яті, ніж в FreeBSD, де використовується фіксований обсяг. Сpавнения pезультатов систем EXT2fs і Xia fs показує, що оптимізація, вкюченная в EXT2fs, дійсно використовується: pазница в пpоизводительности цих систем складає близько 5-10%.

висновок

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

Система EXT2fs включає в себе функції, що дозволяють додавати нові можливості. Деякими люди pаботают над pазpаботкой pасшиpения для справжньої файлової системи: список контpоля доступу, відповідний стандаpту Posix, відновлення віддалених файлів і стиснення файлів в реальному масштабі часу.

Спочатку система EXT2fs була інтегpіpована в ядpо Linux, а тепер вона активно переноситься на дpугие Операційна система. EXT2fs також є важливою складовою операційної системи Masix, якому в даний момент pазpабативается одним з автоpов.

ВОЛОДИМИР МІШКІВ

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

У статті розглядається логічна структура ext2 - файлової системи операційної системи Linux.

Основні компоненти файлової системи ext2

Як і в будь-який файлової системи UNIX, в складі файлової системи ext2 можна виділити наступні складові:

  • блоки і групи блоків;
  • інформаційний вузол (information node);
  • суперблок (superblock).

Блоки і групи блоків

Весь простір розділу диска розбивається на блоки фіксованого розміру, кратні розміру сектора - 1024, 2048 і 4096 байт. Розмір блоку вказується при створенні файлової системи на розділі жорсткого диска. Менший розмір блоку дозволяє економити місце на жорсткому диску, але також обмежує максимальний розмір файлової системи. Всі блоки мають порядкові номери. З метою зменшення фрагментації і кількості переміщень головок жорсткого диска при читанні великих масивів даних блоки об'єднуються в групи.

інформаційний вузол

Базовим поняттям файлової системи є інформаційний вузол, information node, або inode. Це спеціальна структура, яка містить інформацію про атрибути і фізичне розташування файлу. Атрибутами файлу є його тип (звичайний файл, каталог і т. Д.), Права доступу до нього, ідентифікатор власника, розмір, час створення. Інформація про фізичне розташування являє собою послідовність абсолютних номерів блоків, що містять дані файлу.

суперблок

Суперблок - основний елемент файлової системи ext2. Він містить наступну інформацію про файлову систему (список неповний):

  • загальне число блоків і inode в файлової системі;
  • число вільних блоків і inode в файлової системі;
  • розмір блоку файлової системи;
  • кількість блоків і inode в групі;
  • розмір inode;
  • ідентифікатор файлової системи;
  • номер першого блоку даних.

Іншими словами, це номер блоку, що містить суперблок. Цей номер завжди дорівнює 0, якщо розмір блоку файлової системи більше 1024 байт, і 1, якщо розмір блоку дорівнює 1024 байт.

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

Ранні версії файлової системи ext2 створювали копії суперблоку на початку кожної групи блоків. Це призводило до великих втрат дискового простору, тому пізніше кількість резервних копій суперблоку було зменшено, і для їх розміщення були виділені групи блоків 0, 1, 3, 5 і 7.

Формат групи блоків

Узагальнена структурна схема файлової системи ext2 представлена \u200b\u200bна рис. 1.

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

Бітова карта зайнятості блоків зазвичай розташована в першому блоці групи. Якщо в групі присутня резервна копія суперблоку, бітова карта розташовується в другому блоці групи. Розмір бітової карти - один блок. Кожен біт цієї карти позначає стан блоку. Якщо біт встановлено (1), то блок зайнятий, якщо скинуто (0) - блок вільний. Першому блоку групи відповідає нульовий біт карти, другого блоку - перший біт і т. Д.

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

Кожна група блоків описується за допомогою дескриптора групи блоків. Дескриптор групи - це структура, яка містить інформацію про адреси бітової карти зайнятості блоків, бітової карти зайнятості inode і таблиці inode відповідної групи. Всі дескриптори груп зібрані в таблицю дескрипторів груп, яка зберігається в групі блоків 0. Так само, як і для суперблоку, операційна система створює резервні копії таблиці дескрипторів груп.

Алгоритм читання файлу

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

Як було сказано вище, інформація про фізичне розташування файлу міститься в inode. Ця інформація являє собою послідовність 32-бітних номерів блоків, що містять дані файлу (рис. 1). Перші 12 номерів - це прямі посилання на інформаційні блоки (direct blocks number). 13-й номер є непрямою посиланням (indirect blocks number). У ньому знаходиться адресу блоку, в якому зберігаються адреси інформаційних блоків. 14-й номер - подвійна непряме посилання (double blocks number), 15-й номер - потрійна непряме посилання (triple blocks number).

Файл до складу inode не входить, встановлення відповідності між іменами файлів і порядковими номерами inode виконується через каталоги.

Каталоги

Файли в UNIX- і POSIX-системах зберігаються в деревовидної ієрархічної файлової системи. Корінь файлової системи - це кореневий каталог, позначений символом «/». Кожен проміжний вузол в дереві файлової системи - це каталог. Кінцеві вершини дерева файлової системи є або порожніми каталогами, або файлами. Абсолютна колійне ім'я файлу складається з імен всіх каталогів, що ведуть до вказаного файлу, починаючи з кореневого каталогу. Так, колійне ім'я /home/test.file означає, що файл test.file розташований в каталозі home, який, в свою чергу, знаходиться в кореневому каталозі «/».

Каталог, так само як і файл, описується за допомогою inode. Вміст каталогу являє собою масив записів, кожна з яких містить інформацію про фото, який знаходиться «всередині» поточного каталогу.

Запис каталогу має такий вигляд:

  • порядковий номер inode файлу;
  • довжина запису в байтах;
  • ім'я файлу;
  • довжина імені файлу.

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

Кілька перших номерів inode зарезервовані файлової системою, їх перелік міститься в заголовки:

* Special inode numbers

#define EXT2_BAD_INO 1 / * Bad blocks inode * /

#define EXT2_ROOT_IN 2 / * Root inode * /

#define EXT2_ACL_IDX_IN 3 / * ACL inode * /

#define EXT2_ACL_DATA_INO 4 / * ACL inode * /

#define EXT2_BOOT_LOADER_INO 5 / * Boot loader inode * /

#define EXT2_UNDEL_DIR_INO 6 / * Undelete directory inode * /

Для запису кореневого каталогу зарезервований inode під номером 2 (root inode). Цей inode перебуває в групі блоків 0 і займає другу позицію в таблиці inode цієї групи. Номер першого незарезервірованних inode зберігається в суперблоці.

Визначивши порядковий номер inode файлу, ядро \u200b\u200bобчислює номер групи, в якій цей inode розташований, і його позицію в таблиці inode групи. Прочитавши з цієї позиції inode, операційна система отримує повну інформацію про фото, включаючи адреси блоків, в яких зберігається вміст файлу.

Номер групи блоків, в якій розташований inode, обчислюється за формулою:

group \u003d (inode_num - 1) / inodes_per_group

де:

  • group- шуканий номер групи блоків;
  • inode_num - порядковий номер inode, що визначає файл;
  • inodes_per_group - число inode в групі (ця інформація знаходиться в суперблоці).

Позиція inode в таблиці inode групи визначається за формулою:

index \u003d (inode_num - 1)% inodes_per_groupe

де index - позиція inode в таблиці.

Розглянемо приклад отримання вмісту файлу test.file, що знаходиться в кореневому каталозі. Для читання файлу /test.file необхідно:

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

На рис. 2 детально показані етапи читання файлу /test.file.

    Етапи 1-6 - читання кореневого каталога:

  1. З групи блоків 0 зчитується таблиця дескрипторів груп.
  2. З таблиці дескрипторів груп витягується дескриптор групи блоків 0 і з нього зчитується адреса таблиці inode групи 0.
  3. З групи блоків 0 зчитується таблиця inode.
  4. Порядковий номер inode кореневого каталогу фіксований і дорівнює 2, тому з таблиці inode групи 0 зчитується другий елемент, який містить адресу блоку з вмістом кореневого каталогу. Припустимо, що цей блок розташований в групі блоків A.
  5. З групи блоків A зчитується блок, що містить записи кореневого каталогу.
  6. Виконується пошук запису з ім'ям «test.file». Якщо такий запис знайдено, з неї витягується порядковий номер inode файлу «test.file».
  7. Визначивши номер inode, можна отримати доступ до інформаційних блоках файлу (етапи 7-11):

  8. Обчислюється номер групи, в якій знаходиться даний inode, і його позицію в таблиці inode групи (припустимо, що номер групи дорівнює B, а позиція в таблиці - X).
  9. З таблиці дескрипторів груп витягаємо дескриптор групи блоків B, і з нього зчитується адреса таблиці inode цієї групи блоків.
  10. З групи блоків B зчитується таблиця inode.
  11. З таблиці inode групи блоків B зчитується inode, що знаходиться в позиції X.
  12. З ліченого inode витягуються адреси блоку з вмістом файла /test.file і виконується читання інформації з блоку з вказаною адресою.

Програмна реалізація алгоритму читання файлу

Вихідні дані: є розділ жорсткого диска, на якому створена файлова система ext2. Цьому розділу відповідає файл пристрою / dev / hda3. У кореневому каталозі розділу створений підкаталог home, а в ньому знаходиться файл test.file такого змісту:

У хащах півдня жив би цитрус?

Так, але фальшивий екземпляр!

1234567890-=

Не подумайте поганого, це не марення, а тестова вправа з курсу підготовки телеграфістів у військах зв'язку колишнього СРСР!

Увага! Слід врахувати один важливий момент. Створений файл не буде відразу записаний на диск, а спочатку потрапить в дисковий буфер. Спроба відразу ж отримати вміст файлу за вищенаведеним алгоритмом ні до чого не приведе, тому що інформація про цей файл фізично на диску відсутній. Необхідно «примусити» систему записати дисковий буфер на диск. Найпростіший спосіб зробити це - виконати операцію перезавантаження. Тому після того, як файл створений, перезавантажте систему.

Наше завдання - використовуючи файл пристрою / dev / hda3, здійснити читання файлу /home/test.file методом прямого доступу до його інформаційними блоками.

Розглянемо програмну реалізацію модуля, що виконує цю операцію.

Заголовки:

#include

#include

#include

#include

#include

#include

В заголовки визначені структурні типи, що описують основні компоненти файлової системи ext2 - суперблок, дескриптор групи блоків, інформаційний вузол, запис каталогу.

Розглянемо коротко поля, які входять в кожну з цих структур:

  1. Структура суперблоку struct ext2_super_block:
    • __u32 s_inodes_count- загальне число inode в файлової системі;
    • __u32 s_blocks_count- загальне число блоків в файлової системі;
    • __u32 s_free_blocks_count- кількість вільних блоків;
    • __u32 s_free_inodes_count- кількість вільних inode;
    • __u32 s_first_data_block- номер першого блоку даних (номер блоку, в якому знаходиться суперблок);
    • __u32 s_log_block_size - це значення використовується для обчислення розміру блоку. Розмір блоку визначається за формулою: block size \u003d 1024<< s_log_block_size;
    • __u32 s_blocks_per_group - кількість блоків в групі;
    • __u32 s_inodes_per_group - кількість inode в групі;
    • __u16 s_magic - ідентифікатор файлової системи ext2 (сигнатура 0xEF53);
    • __u16 s_inode_size - розмір інформаційного вузла (inode);
    • __u32 s_first_ino - номер першого незарезервірованних inode.
  2. Структура дескриптора групи блоків struct ext2_group_desc:
    • __u32 bg_block_bitmap- бітова карта зайнятості блоків групи;
    • __u32 bg_inode_bitmap- бітова карта зайнятості inode групи;
    • __u32 bg_inode_table - адреса таблиці inode групи.
  3. Структура інформаційного вузла struct ext2_inode:
    • __u16 i_mode - тип файлу і права доступу до нього. Тип файлу визначають біти 12-15 цього поля:
      • 0xA000- символічна посилання;
      • 0x8000- звичайний файл;
      • 0x6000- файл блочного пристрою;
      • 0x4000- каталог;
      • 0x2000- файл символьного пристрою;
      • 0x1000- канал FIFO.
    • __u32 i_size - розмір в байтах;
    • __u32 i_atime- час останнього доступу до файлу;
    • __u32 i_ctime - час створення файлу;
    • __u32 i_mtime- час останньої модифікації;
    • __u32 i_blocks - кількість блоків, займаних файлом;
    • __u32 i_block - адреси інформаційних блоків (включаючи всі непрямі посилання).
  4. Значення EXT2_N_BLOCKS визначено у файлі:

    * Constants relative to the data blocks

    #define EXT2_NDIR_BLOCKS 12

    #define EXT2_IND_BLOCK EXT2_NDIR_BLOCKS

    #define EXT2_DIND_BLOCK (EXT2_IND_BLOCK + 1)

    #define EXT2_TIND_BLOCK (EXT2_DIND_BLOCK + 1)

    #define EXT2_N_BLOCKS (EXT2_TIND_BLOCK + 1)

  5. Структура запису каталогу struct ext2_dir_entry_2:
  6. #define EXT2_NAME_LEN 255

  • __u32 inode - номер inode файлу;
  • __u16 rec_len - довжина запису каталогу;
  • __u8 name_len- довжина імені файлу;
  • char nameім'я файлу.

Визначимо ім'я розділу, на якому створена файлова система, глобальні структури і змінні.

#define PART_NAME "/ dev / hda3"

struct ext2_super_block sb;

/ * Буфер для зберігання таблиці дескрипторів груп * /

unsigned char buff_grp;

unsigned char buff; / * Інформаційний буфер * /

int indev; / * Дескриптор файлу пристрою * /

int BLKSIZE; / * Розмір блоку файлової системи * /

Визначимо кілька функцій, які нам знадобляться для роботи:

Функція читання суперблоку:

void read_sb ()

Memset (& sb, 0,1024);

Зміщуємося на 1024 байта від початку розділу і зчитуємо суперблок в структуру struct ext2_super_block sb:

If (lseek (indev, 1024,0)< 0) {

Perror ( "lseek");

Exit (-1);

If (read (indev, (char *) & sb, sizeof (sb))< 0) {

Perror ( "read");

Exit (-1);

Перевіряємо ідентифікатор файлової системи:

If (sb.s_magic! \u003d EXT2_SUPER_MAGIC) (

Printf ( "Невідомий тип файлової системи!");

Exit (-1);

Значення EXT2_SUPER_MAGIC визначено в заголовки.

Відображаємо інформацію про файлову систему, яка знаходиться в суперблоці:

printf ( "Superblock info -----------");

Printf ( "Inodes count -% u", sb.s_inodes_count);

Printf ( "Blocks count -% u", sb.s_blocks_count);

Printf ( "Block size -% u", 1024<< sb.s_log_block_size);

Printf ( "First inode -% d", sb.s_first_ino);

Printf ( "Magic - 0x% X", sb.s_magic);

Printf ( "Inode size -% d", sb.s_inode_size);

Printf ( "Inodes per group -% u", sb.s_inodes_per_group);

Printf ( "Blosks per group -% u", sb.s_blocks_per_group);

Printf ( "First data block -% u", sb.s_first_data_block);

Return;

Функція читання таблиці дескрипторів груп:

void read_gdt ()

Обчислюємо розмір блоку файлової системи:

BLKSIZE \u003d 1024<< sb.s_log_block_size

Таблиця дескрипторів груп знаходиться в блоці, який розташований відразу ж за першим блоком даних (за суперблоком).

Прочитуємо таблицю:

If (lseek (indev, (sb.s_first_data_block + 1) * BLKSIZE, 0)< 0) {

Perror ( "lseek");

Exit (-1);

If (read (indev, buff_grp, BLKSIZE)< 0) {

Perror ( "read");

Exit (-1);

Return;

Функція отримання вмісту inode по його номеру:

void get_inode (int inode_num, struct ext2_inode * in)

Вхідні параметри функції - порядковий номер inode і структура struct ext2_inode.

Struct ext2_group_desc gd;

U64 group, index, pos;

Обчислюємо номер групи блоків, в якій знаходиться inode з порядковим номером inode_num:

Group \u003d (inode_num - 1) / sb.s_inodes_per_group;

З таблиці дескрипторів груп витягаємо дескриптор групи group і копіюємо його в структуру struct ext2_group_desc gd:

Memset ((void *) & gd, 0, sizeof (gd));

Memcpy ((void *) & gd, buff_grp + (group * (sizeof (gd))), sizeof (gd));

Обчислюємо позицію inode c порядковим номером inode_num в таблиці inode групи group і зчитуємо цей inode в структуру struct ext2_inode:

index \u003d (inode_num - 1)% sb.s_inodes_per_group;

Pos \u003d ((__u64) gd.bg_inode_table) * BLKSIZE + (index * sb.s_inode_size);

Pread64 (indev, in, sb.s_inode_size, pos);

Return;

Функція читання блоку даних:

void read_iblock (struct ext2_inode * in, int blk_num)

U64 pos;

Вхідні параметри функції - структура inode і номер блоку (мається на увазі номер з послідовності адресних блоків, розташованих в inode).

Обчислюємо зміщення до інформаційного блоку на розділі і зчитуємо цей блок в глобальний буфер buff:

Pos \u003d ((__u64) in-\u003e i_block) * BLKSIZE;

Pread64 (indev, buff, BLKSIZE, pos);

Return;

Функція отримання вмісту кореневого каталогу:

void get_root_dentry ()

Struct ext2_inode in;

Порядковий номер inode кореневого каталогу відомий, тому отримуємо вміст inode кореневого каталогу і зчитуємо в буфер buff його вміст:

get_inode (EXT2_ROOT_INO, & in);

Read_iblock (& \u200b\u200bin, 0);

У буфері buff буде перебувати вміст кореневого каталогу.

Return;

Функція отримання номера inode по імені файлу:

int get_i_num (char * name)

Вхідні параметри функції - ім'я файлу. Значення, що повертається - порядковий номер inode файлу.

Int i \u003d 0, rec_len \u003d 0;

Struct ext2_dir_entry_2 dent;

У буфері buff знаходиться масив записів каталогу. Для визначення порядкового номера inode файлу необхідно знайти в цьому масиві запис з ім'ям цього файлу:

For (; i< 700; i++) {

Memcpy ((void *) & dent, (buff + rec_len), sizeof (dent));

If (! Memcmp (dent.name, name, dent.name_len)) break;

Rec_len + \u003d dent.rec_len;

Return dent.inode;

А тепер розпишемо головну функцію:

int main ()

Змінні і структури:

struct ext2_inode in;

// абсолютне колійне ім'я файлу

Unsigned char * full_path \u003d "/home/test.file";

Unsigned char buff1;

Static int i \u003d 1;

Int n, i_num, outf, type;

Першим символом в абсолютному дорожньому імені файлу повинен бути прямий слеш (/). Перевіряємо це:

If (full_path! \u003d "/") (

Perror ( "slash");

Exit (-1);

Відкриваємо файл пристрою, зчитуємо суперблок і таблицю дескрипторів груп:

Indev \u003d open (PART_NAME, O_RDONLY);

If (indev< 0) {

Perror ( "open");

Exit (-1);

Read_sb ();

Read_gdt ();

Отримуємо вміст кореневого каталогу:

get_root_dentry ();

Зараз в буфері buff знаходяться всі записи кореневого каталогу (якщо хочете, можете зберегти їх в окремому файлі). Тепер, маючи записи кореневого каталогу, ми можемо дістатися до вмісту файлу test.file, використовуючи вищенаведений алгоритм читання файлу. З цією метою організуємо цикл. У тілі циклу проведемо розбір абсолютного колійного імені файлу, виділяючи його елементи - підкаталоги (він у нас один, home) і ім'я шуканого файлу (test.file). Для кожного елемента визначимо порядковий номер inode, вважаємо цей inode і потім отримаємо вміст нульового блоку (з послідовності адресних блоків, що знаходяться в inode):

while (1) (

Memset (buff1,0, sizeof (buff1));

For (n \u003d 0; n< EXT2_NAME_LEN; n++, i++) {

Buff1 [n] \u003d full_path [i];

If ((buff1 [n] \u003d\u003d "/") || (buff1 [n] \u003d\u003d "?")) (

I ++;

Break;

buff1 [n] \u003d "?";

Для кожного елемента абсолютного колійного імені файлу визначаємо порядковий номер inode, зчитуємо цей inode в пам'ять і потім отримуємо вміст нульового блоку:

I_num \u003d get_i_num (buff1);

Get_inode (i_num, & in);

Read_iblock (& \u200b\u200bin, 0);

Відобразимо інформацію про файл (ім'я, порядковий номер inode, розмір файлу і його тип):

Printf ( "Inode number -% u", i_num);

Printf ( "File name -% s", buff1);

Printf ( "File size -% u", in.i_size);

Тип файлу визначають старші чотири біта поля i_mode структури struct ext2_inode:

type \u003d ((in.i_mode & 0xF000) \u003e\u003e 12);

Printf ( "Type -% d", type);

Switch (type) (

Case (0x04):

Printf ( "(каталог)");

Break;

Case (0x08):

Printf ( "(звичайний файл)");

Break;

Case (0x06):

Printf ( "(файл блочного пристрою)");

Break;

Case (0x02):

Printf ( "(файл символьного пристрою)");

Break;

Default:

Printf ( "(unknown type)");

Break;

Перевіряємо тип файлу. Якщо це звичайний файл - перериваємо цикл:

If (type & 0x08) (

У буфері buff буде знаходитися інформація, зчитана з інформаційних блоків файлу /home/test.file. Запишемо цю інформацію в файл:

Outf \u003d open ( "out", O_CREAT | O_RDWR, 0600);

Write (outf, buff, sizeof (buff));

Close (outf);

Break;

виходимо:

Close (indev);

Return 0;

На цьому розгляд логічної структури файлової системи ext2 завершимо.



Сподобалася стаття? поділіться їй