Як FreeBSD зберігає дані. Принципи розбиття диска., Linux, Операційні системи, статті

Станіслав Лапшанскій

Стаття є перекладом тексту Dru Lavigne, опублікованого за адресою: www.onlamp.com/pub/a/bsd/2001/02/21/FreeBSD_Basics.html.

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

Як всі інші UNIX-системи, FreeBSD для зберігання відомостей про місцезнаходження файлів на дисках, використовує inode-таблиці (індексні таблиці). Однак перед тим, як буде створена перша індексна таблиця, диск повинен бути розбитий на логічні блоки. Цей процес здійснюється за допомогою декількох утиліт, які застосовуються в наступному порядку:


  1. Використовуючи fdisk можна створити (і подивитися структуру існуючої) BIOS’овскую таблицю розділів, в якій можна визначити до чотирьох «слайсів» (термінологія FreeBSD відрізняється від загальноприйнятої і розділ диска в ній називається slice – «шматок» – прим. перекладача).
  2. Утиліта disklabel застосовується для створення та перегляду вмісту UNIX’вих таблиць розділів, у кожній з яких може бути створено до восьми «партіцій». (Таким чином у кожному з чотирьох дискових розділів (Слайсів), може бути створено по вісім UNIX-партіцій. Всього 32 штуки. – Прим. перекладача).
  3. Команда newfs призначена для створення файлової системи на будь-який UNIX-партіціі (оскільки тільки що створена партиція зазвичай містить тільки «сміття» – прим. Перекладача).
  4. Після цього кожна файлова система містить індексні таблиці.

Зауважте, що ваша FreeBSD-система обов’язково має обидві таблиці, та BIOS’овскую і Unix’ов. Це необхідно через те, що FreeBSD, будучи UNIX-системою розуміє і використовує Unix’ов таблицю розділів, проте FreeBSD так само є системою, яка змушена працювати на PC (персональному комп’ютері). Персональний комп’ютер обов’язково має спеціальне програмне забезпечення, так званий BIOS, який необхідний для правильної ініціалізації комп’ютера, визначення параметрів жорстких дисків, а так само для пошуку програмного забезпечення, яке завантажує операційну систему.

Отже однією з функцій BIOS’а є перегляд вмісту першого сектора першого жорсткого диска. Цей сектор має розмір 512 байт. Крім іншого в ньому відведено 64-х байтним ділянку для зберігання BIOS’овской таблиці розділів. Кожен запис цієї таблиці займає 16 байт, таким чином всього у таблиці є місце тільки для чотирьох записів.

Як уже було згадано, BIOS’овская таблиця розділів може бути переглянута і змінена програмою fdisk. Коли ви, використовуючи fdisk, змінюєте BIOS’овскую таблицю розділів, ви, насправді «нарізати» ваш фізичний диск на максимум чотири логічних. Користувачі FreeBSD воліють назвати ці логічні диски слайсами, для того, щоб не переплутати їх з «партіциямі», які описуються в Unix’ов таблиці розділів.

Можливо ви вже добре знайомі з програмою fdisk, що поставляється в складі DOS. Я порівняю її з утилітою fdisk з FreeBSD, для того що б ви змогли побачити схожість цих двох програм. Я покажу результати своєї роботи на одній з моїх персоналок. Я завантажив її з завантажувального DOS-диска, а потім, з командного рядка, запустив утиліту fdisk:


Microsoft Windows 95
Fixed Disk Setup Program
(C)Copyright Microsoft Corp/ 1983 – 1995
FDISK Options
Current fixed disk drive: 1
Choose one of the following:
1. Create DOS partition or Logical DOS Drive
2. Set active partition
3. Delete partition or Logical DOS Drive
4. Display partition information
Enter choice: [4]

Ми опинилися в головному меню програми fdisk для DOS. Оскільки я не хочу міняти таблицю розділів, я виберу 4 пункт, для того що б просто подивитися її вміст.


Display Partition Information
Current fixed disk drive: 1
Partition Status Type Volume Label Mbytes System Usage
C: 1 A PRI DOS 204 FAT16 3%
2 Non-DOS 3193 52%
3 EXT DOS 2753 45%
Total disk space is 6150 Mbytes (1 Mbyte = 1048576 bytes)
The Extended DOS Partition contains Logical DOS Drives.
Do you want to display the logical drive information (Y/N)……?[Y]

Зверніть увагу, що я розбив мій диск на три слайс, які в DOS називаються партіціі (partition). Перший слайс має ознаку «A» що означає, що в ньому записано завантажувальний код, необхідний для правильної завантаження операційної системи. Цей розділ має об’єм 204 Мб і відформатовано в системі FAT16.

Другий слайс, об’ємом 3139 Мб містить мою FreeBSD. DOS-версія утиліти fdisk не в змозі правильно визначити тип файлової системи на цьому розділі, тому вона просто називає її «non-DOS» (не-DOS).

Третій слайс це 2753 мегабайтний додатковий розділ (extended partition). Зауважте, що для того що б подивитися структуру додаткового розділу, вам доведеться увійти в інший екран програми fdisk. Додатковий розділ був придуманий для того, що б ви могли розбити ваш жорсткий диск більше ніж на чотири розділи. Додатковий розділ, це просто посилання на область диска, яка містить ще одну таблицю розділів, в якій описуються логічні розділи знаходяться в додатковому розділі. На жаль ці логічні розділи справді «логічні» – більшість операційних систем не можуть бути встановлені на логічний розділ, оскільки він не може містити завантажувального коду. Я натиснув «Y» для того що б потрапити на екран, що відображає вміст додаткового розділу.


Display Logical DOS Drive Information
Drv Volume Label Mbytes System Usage
D: 1396 FAT16 51%
E: 361 FAT16 13%
Total Extended DOS Partition size is 2753 Mbytes (1 Mbyte = 1048576 bytes)

Давайте резюмуємо інформацію, яку ми з так ретельно добували за допомогою DOS-івського fdisk’а. Отже цей комп’ютер має жорсткий диск об’ємом 6150 Мб. Він розбитий на розділи наступним чином:



























Буква DOS-диска Тип розділу Розмір розділу Файлова система
C: Основний 204 Мб FAT16
D: Логічний 1,396 Мб FAT16
E: Логічний 361 Мб FAT16
Немає Невідомо 3,193 Мб Невідомо

DOS використовує наступну схему іменування розділів:


  1. Основні розділи іменуються в першу чергу, починаючи з букви «C», оскільки літери «A» і «B» зарезервовані для дисководів гнучких дисків.
  2. Коли всі основні розділи пойменовані, іменуються логічні диски.
  3. Додатковий розділ, а так само розділи невідомих типів не називаються.

Тепер давайте порівняємо fdisk’а для DOS з висновком fdisk для FreeBSD. Якщо ви просто надрукуєте fdisk в запрошенні командного інтерпретатора, то він виведе вам вміст BIOS’овской таблиці розділів. Однак якщо ви спробуєте зробити це від імені звичайного користувача, ви отримаєте тільки таке повідомлення:


fdisk
fdisk: can’t open device /dev/ad0
fdisk: cannot open disk /dev/ad0: Permission denied

Тільки суперкористувач має дозвіл на доступ до пристрою, яким представлений мій перший IDE жорсткий диск. Це гарна ідея, оскільки fdisk дає можливість змінювати розділи визначені на жорсткому диску. Якщо ви зміните інформацію про розподіл, ви втратите на ньому всі дані. Однак не переживайте, суперкористувач не змінить дані про розділи, якщо просто введе команду fdisk без параметрів, для того що б переглянути інформацію. Для того що б що-небудь змінити, суперкористувач повинен вказати пристрій і ключі в командному рядку програми fdisk. Я став суперкористувачем і спробував знову виконати команду fdisk:


fdisk
******* Working on device /dev/ad0 *******
parameters extracted from in-core disklabel are:
cylinders=784 heads=255 sectors/track=63 (16065 blks/cyl)
parameters to be used for BIOS calculations are:
cylinders=784 heads=255 sectors/track=63 (16065 blks/cyl)
Media sector size is 512
Warning: BIOS sector numbering starts with sector 1
Information from DOS bootblock is:
The data for partition 1 is:
sysid 6,(Primary “big” DOS (> 32MB))
start 63, size 417627 (203 Meg), flag 80 (active)
beg: cyl 0/ sector 1/ head 1;
end: cyl 25/ sector 63/ head 254
The data for partition 2 is:
sysid 165,(FreeBSD/NetBSD/386BSD)
start 417690, size 6538455 (3192 Meg), flag 0
beg: cyl 26/ sector 1/ head 0;
end: cyl 432/ sector 63/ head 254
The data for partition 3 is:
sysid 5,(Extended DOS)
start 6956145, size 5638815 (2753 Meg), flag 0
beg: cyl 433/ sector 1/ head 0;
end: cyl 783/ sector 63/ head 254
The data for partition 4 is:
>UNUSED<

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

Жорсткий диск розбивається на логічні блоки, які називаються циліндрами і секторами. Мій FreeBSD-розділ (номер 2) починається з першого сектора 26 циліндра, а закінчується в 63 секторі 432 циліндра. Оскільки циліндр складається з 63 секторів, ми почали з початку 26 циліндра і закінчили кінцем 432-го. Разом FreeBSD-розділ містить 407 циліндрів. Ми ще побачимо інформацію про циліндрах, коли будемо розглядати вміст Unix’ов таблиці розділів. Так само ви можете подивитися коротку інформацію про таблицю розділів за допомогою команди fdisk, виконавши її з ключем-s:


fdisk -s
/dev/ad0: 784 cyl 255 hd 63 sec
Part Start Size Type Flags
1: 63 417627 0x06 0x80
2: 417690 6538455 0xa5 0x00
3: 6956145 5638815 0x05 0x00

Цей висновок знову показує нам інформацію про всіх трьох існуючих дискових розділах. Так само там можна побачити початковий адресу кожного з слайсів, а так само їх розмір, зазначений в секторах. Типи файлових систем слайсів вказані в шістнадцятковій системі числення, на що вказує префікс 0x перед кожним числом. Шістнадцяткове число a5 еквівалентно десятковим 165, яке є «магічним числом» визначальним файлову систему FreeBSD. Шістнадцяткове число 06 одно десятковим шести і визначає файлову систему FAT16. Легко здогадатися що шістнадцяткове 05 в десятковій системі рано п’яти. Номер п’ять позначає додатковий розділ DOS. Тільки один розділ може мати прапор 0x80, оскільки він вказує на «активність» слайс, а BIOS’овская таблиця розділів має тільки один завантажувальний слайс.

Давайте резюмуємо наші відомості про BIOS’овской таблиці розділів. Отже вона використовується BIOS’ом персонального комп’ютера для визначення фізичної геометрії жорсткого диска, який може бути розбитий на логічні диски (до чотирьох). Зазвичай користувачі розбивають жорсткий диск на декілька слайсів тоді, коли вони хочуть використовувати на своєму комп’ютері декілька операційних систем. Якщо слайс містить наприклад операційну систему фірми Microsoft, то на початку він повинен бути відформатований у відповідній файловій системі, яка повинна бути зрозуміла цій операційній системі. Процес форматування створить на цьому слайс таблицю, яка буде використовуватися файловою системою для відстеження місцезнаходження даних на слайс.

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

Якщо слайс містить операційну систему FreeBSD, то на нього буде записана Unix’ов таблиця розділів. Слайс FreeBSD може містити до восьми розділів і кожен з них може мати свою файлову систему або бути розділом свопінгу.

Якщо ви запустите утиліту disklabel без ключів, ви зможете безпечно подивитися вміст Unix’ов таблиці розділів. Проте як і у випадку з fdisk’ом без прав суперкористувача не обійтися, оскільки тільки він має право на доступ до дискового пристрою. Моя персоналка працює під управлінням FreeBSD 4.2, IDE жорсткий диск має в ній ім’я ad. Жорсткі диски нумеруються з нуля, і оскільки у мене система стоїть на першому диску, то зазначимо пристрій ad0:


disklabel ad0
# /dev/ad0c:
type: ESDI
disk: ad0s2
label:
flags:
bytes/sector: 512
sectors/track: 63
tracks/cylinder: 255
sectors/cylinder: 16065
cylinders: 407
sectors/unit: 6538455
rpm: 3600
interleave: 1
trackskew: 0
cylinderskew: 0
headswitch: 0 # milliseconds
track-to-track seek: 0 # milliseconds
drivedata: 0
8 partitions:
# size offset fstype [fsize bsize bps/cpg]
a: 102400 0 4.2BSD 0 0 0 # (Cyl. 0 – 6*)
b: 270976 102400 swap # (Cyl. 6*- 23*)
c: 6538455 0 unused 0 0 # (Cyl. 0 – 406)
e: 40960 373376 4.2BSD 0 0 0 # (Cyl. 23*- 25*)
f: 6124119 414336 4.2BSD 0 0 0 # (Cyl. 25*- 406*)

Unix’ов таблиця розділів разюче відрізняється від BIOS’овской. Всі ці розділи живуть в одному FreeBSD-слайс, який BIOS бачить як розділ номер 2. Зверніть увагу, що один цей слайс позначений п’ятьма буквами, однак буква файлова системи закріплена за «c» позначена як «невживана» (unused). За внутрішньосистемної угодою буква «c» завжди означає весь слайс цілком, а реальні файлові системи закріплюються за літерами «ab» і «de». Цей FreeBSD-слайс містить в собі три файлові системи, позначені буквами «a», «e» та «f». Буквою «b» позначений розділ свопінгу.

Кожна файлова система визначається своєю групою циліндрів, яка представляє з себе простий безперервний ділянку згрупованих разом циліндрів. Кожна файлова система відповідає за дані тільки тієї групи циліндрів, які їй належать. Отже, файлова система «a» знаходиться на просторі від нульового до шостого циліндра, файлова система «e» розташовується на протязі 23-25 ​​циліндрів і, нарешті, файлова система «f» знаходиться на 25-406 циліндрах. Зверніть увагу, що весь слайс (позначений буквою «c») розміщується на циліндрах 0-406, що в сумі дає обсяг в 407 циліндрів, які і показує нам утиліта fdisk для FreeBSD.

З верхніх рядків виводу команди disklabel ми можемо зробити висновок про те, яким чином диск розбитий на логічні блоки: циліндри розбиті на сектори і треки, кожен трек складається за 63 секторів, а кожен сектор в свою чергу має розмір 512 байт. Якщо ви незнайомі з секторами і треками, то хороша ілюстрація є тут.

Нарешті, трохи математики і ми зможемо підрахувати наскільки великий наш слайс в мегабайтах. Отже наш слайс складається з 6538455 секторів, при цьому розмір кожного сектора – 512 байт. Якщо ми помножимо кількість секторів на кількість байт в секторі, то ми отримаємо обсяг слайс в байтах (ох-ох-ох … це безсумнівно варто пояснювати детально – прим. перекладача). Якщо ми розділимо отримане число на 1024, то отримаємо розмір слайс в кілобайтах. А якщо ми ще раз розділимо результат на 1024, то отримаємо шуканий розмір слайс в мегабайтах:

 6,538,455 x 512 = 3,347,688,960 байт 3,347,688,960 / 1,024 = 3,269,227 кілобайт 3,269,227 / 1,024 = 3,192 мегабайт

що повністю збігається з даними програми fdisk.

Утиліта disklabel може використовуватися для створення Unix’ов розділів, проте не може насправді створювати файлові системи. Натомість ця утиліта створює спеціальні дискові мітки, які читає програма newfs. Ця утиліта називається співзвучно своєї функції – створення файлових систем (newfs – new file system – нова файлова система – прим перекладача), вона-то і створює файлову систему і її індексні таблиці. Ми детальніше зупинимося на утиліті newfs та індексних таблицях в наступній статті циклу.

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


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

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

Ваш отзыв

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

*

*