Логическая структура магнитного диска
Для того чтобы можно было загрузить с магнитного диска операционную систему, а уже с ее помощью организовать работу с файлами, были приняты специальные системные соглашения о структуре диска. Хранение данных на магнитном диске можно организовать различными способами. Можно поделить все дисковое пространство на несколько частей — разделов (partitions), а можно его и не делить. Деление НЖМД на разделы позволяет организовать на одном физическом устройстве несколько логических; в этом случае говорят о логических дисках. Следует, однако, заметить, что не во всех операционных системах используется понятие логического диска. Так, UNIX-системы не имеют логических дисков.
Разделение всего дискового пространства на разделы полезно по нескольким соображениям. Во-первых, это структурирует хранение данных. Например, выделе-
Организация внешней памяти на магнитных дисках___________________________ 147
ние отдельного раздела под операционную систему и программное обеспечение и другого раздела под данные пользователей позволяет отделить последние от системных файлов и не только повысить надежность системы, но и сделать более удобным ее обслуживание. Во-вторых, на каждом разделе может быть организована своя файловая система, что иногда бывает необходимо. Например, при установке операционной системы Linux нужно иметь не менее двух разделов, поскольку файл подкачки (страничный файл) должен располагаться в отдельном разделе. Наконец, в ряде случаев на компьютере может потребоваться установка более одной операционной системы.
Для того чтобы системное программное обеспечение получило информацию о том, как организовано хранение данных на каждом конкретном накопителе, нужно разместить в одном из секторов соответствующие данные. Даже если НЖМД используется как единственный логический диск, все равно нужно указать, что имеется всего один диск, и его размер. Структура данных, несущая информацию о логической организации диска, вместе с небольшой программой, с помощью которой можно ее проанализировать, а также найти и загрузить в оперативную память программу загрузки операционной системы, получила название главной загрузочной записи (Master Boot Record, MBR). MBR располагается в самом первом секторе НЖМД, то есть в секторе с координатами 0-0-1. Программа, расположенная в MBR, носит название внесистемного загрузчика (Non-System Bootstrap, NSB).
Вследствие того что сектор состоит только из 512 байт и помимо программы в нем должна располагаться информация об организации диска, внесистемный загрузчик очень прост, а структура данных, называемая таблицей разделов (Partition Table, РТ), занимает всего 64 байт. Таблица разделов располагается в MBR по смещению Ох 1 BE и содержит четыре элемента. Структура записи элемента таблицы разделов приведена в табл. 5.1. Каждый элемент этой таблицы описывает один раздел, причем двумя способами: через координаты C-H-S начального и конечного секторов, а также через номер первого сектора в спецификации LBA2 (Logical Block Addressing) и общее число секторов в разделе. Важно отметить, что каждый раздел начинается с первого сектора на заданных цилиндре и поверхности и имеет размер не менее одного цилиндра. Поскольку координаты MBR равны 0-0-1, то первый сектор первого раздела в большинстве случаев получается равным 0-1-1 (в координатах LBA это будет сектор 64).
Первым байтом в элементе таблицы разделов идет флаг активности раздела Boot Indicator (значение 0 — не активен, 128 (80(h)) — активен). Он позволяет определить, является ли данный раздел системным загрузочным. В результате процесс загрузки операционной системы осуществляется путем загрузки первого сектора
1 Практика показывает, что Linux и другие UNIX-подобные системы лучше всего устанавливать, разбив НЖМД на 6 разделов. Раздел подкачки (swap partition) служит для размещения файла подкачки. К основному (корневому) разделу, обозначаемому символом /, монтируются разделы /usr, /home, /var и /boot. Такое разбиение диска на разделы считается наиболее технологичным.
2 Способ указания блока данных, согласно которому все секторы диска считаются пронумерованными по следующему правилу: LBA= с х Н + h) x S + s - 1. Здесь Н — это максимальное число рабочих поверхностей в цилиндре; S — количество секторов на одной дорожке; с, h и s — «координаты» искомого сектора.
148_____________ Глава 5. Управление вводом-выводом в операционных системах
с такого активного раздела и передачи управления на расположенную в нем программу, которая и продолжает загрузку. Активным может быть только один раздел, и это обычно проверяется программой NSB, расположенной в MBR.
Таблица 5.1. Формат элемента таблицы разделов
Название записи элемента таблицы разделовДлина, байт
Флаг активности раздела 1
Номер головки начала раздела 1
Номера сектора и цилиндра загрузочного сектора раздела 2
Кодовый идентификатор операционной системы 1
Номер головки конца раздела 1
Номера сектора и цилиндра последнего сектора раздела 2
Младшее и старшее двухбайтовые слова относительного номера
начального сектора 4
Младшее и старшее двухбайтовые слова размера раздела в секторах 4
За флагом активности раздела следует байт номера головки, с которой начинается раздел. За ним следуют два байта, означающие соответственно номер сектора и номер цилиндра загрузочного сектора, где располагается первый сектор загрузчика операционной системы. Затем следует кодовый идентификатор System ID (длиной в один байт), указывающий на принадлежность данного раздела к той или иной операционной системе и на установку в этом разделе соответствующей файловой системы. Поскольку крайне сложно найти информацию по этим кодовым идентификаторам, которыми помечаются разделы дисков, в табл. 5.2 приведены не полтора десятка наиболее часто встречающихся, а все известные сигнатуры (кодовые идентификаторы).
Таблица 5.2.Кодовые идентификаторы разделов диска
Код Описание Код Описание
OOOh Раздел не использован 085h Linux Extended, XOSL
001 h FAT12 086h FAT16 volume set
002h Xenix root 087h NTFS volume set
003h Xenix/usr 08Ah AiR-Boot
004h FAT16(<32Mb) 08Bh FAT32 volume set
005h Extended 08Ch FAT32 LBA volume set
006h FAT16 08Dh Free FDISKFAT12
007h NTFS, HPFS 08Eh Linux LVM
008h AIXBoot 090h Free FDISK FAT16 (<32Mb)
009h AIXData 091h Free FDISK Extended
OOAh OS/2 Boot Manager 092h Free FDISK FAT16
OOBh FAT32 093h Amoeba native
Организация внешней памяти на магнитных дисках___________________________ 149
Код Описание Код Описание
OOCh FAT32LBA 094h Amoeba BBT
OOEh FAT16LBA 095h MITEXOPC
OOFh Extended LBA 097h Free FDISK FAT32
010h Opus 098h Free FDISK FAT32 LBA
011h Hidden FAT12 099h DCE376
012h Compaq Setup 09Ah Free FDISK FAT 16 LBA
013h B-TRON 09Bh Free FDISK Extended LBA
014h Hidden FAT16 (<32Mb) 09Fh BSDI
016h Hidden FAT16 OAOh Laptop hibernation
017h Hidden NTFS, HPFS 0A1h NEC hibernation
018h AST Windows Swap 0A5h Free BSD, BSD/386
019h Photon 0A6h Open BSD
01 Bh Hidden FAT32 0A7h NextStep
01Ch Hidden FAT32 LBA 0A8h Apple UFS
O1Eh Hidden FAT16 LBA 0A9h Net BSD
020h OFS1 OAah Olivetti service
022h Oxygen OAbh Apple Booter
024h NEC DOS OAeh ShagOS native
035h OS/2JFS OAfh ShagOS swap
035h Theos3.x OBOh BootStar Dummy
039h Theos 4.x spanned, Plan9 0B7h BSDI old native
03Ah Theos 4.x 4G 0B8h BSDI old swap
03Bh Theos 4.x Extended OBBh OS Selector
03Ch Partition Magic OBeh Solaris 8 boot
040h Venix 80286 OCOh CTOS, REAL/32 smal
041h Minix, PPC Boot 0C1h DR-DOSFAT12
042h LinuxSwp/DR-DOS, SFS, 0C6h DR-DOS FAT16, FAT16 set
Win2K DDM corrupt
043h LinuxNat/DR-DOS 0C2h Hidden Linux swap
045h Eumel/Ergos45h, Boot-US 0C3h Hidden Linux native
046h Eumel/Ergos 46h 0C4h DR-DOS FAT16 (<32Mb)
047h Eumel/Ergos 47h 0C7h Syrinx boot, NTFS set corrupt
048h Eumel/Ergos 48h OCBh DR-DOS FAT32
04Dh QNX 4.x first OCCh DR-DOS FAT32 LBA
04Eh QNX 4.x second OCDh CTOSmemdump
04Fh QNX 4.x third, Oberon OCeh DR-DOS FAT16 LBA
050h OnTrack DM R/O, Lynx RTOS ODOh REAL/32 big
продолжение
150_____________ Глава 5. Управление вводом-выводом в операционных системах
Таблица 5.2 (продолжение)
Код Описание Код Описание
051h DM6 Aux1,DMR/W 0D1h Multiuser DOS FAT12
052h CP/M, Microport System V 0D4h Multiuser DOS FAT16 (<32Mb)
053h OnTrack DM6 Aux3 0D5h Multiuser DOS Extended
054h OnTrack DM6 DDO 0D6h Multiuser DOS FAT16
055h EZ-Drive 0D8h CP/M-86
056h GoldenBowVfeature ODBh Concurrent DOS, CTOS
057h Drive Pro ODDh Hidden CTOS memdump
05Ch Priam Edisk ODFh DG/UX
061h Speed Stor OEOh STAVFS
063h Unix 0E1h Speed Stor FAT32
064h NetWare 2.x, PC-ARMOUR 0E3h Speed Stor R/O
065h NetWare 3.x 0E4h Speed Stor FAT16
067h Novell 67h OEbh BeOS
068h Novell 68h OEeh EFI header
068h Novell 69h OEfh EFI file system
070h DiskSecure Multi-Boot OFOh Linux/PA-RISC boot
074h ScramDisk 0F1h Storage Dimensions
075h PC/AX 0F2h DOS Secondary
078h XOSL 0F4h Speed Stor large, Prologue singl
07Eh F.I.X 0F5h Prologue multi
080h MINIX 1.1-1.4a OFBh VMware native
081h MINIX 1.4b+, ADM OFCh Vmware swap
082h Linux swap, Solaris OFDh Linux RAID
083h Linux native OFeh Speed Stor (>1024), LanStep
084h Hibernation, OS/2 C: Hidden OFFh Xenix BBT
Можно сказать, что таблица разделов — одна из наиболее важных структур данных на жестком диске. Если эта таблица повреждена, то не только не будет загружаться ни одна из установленных на компьютере операционных систем, но станут недоступными данные, расположенные в НЖМД, особенно если жесткий диск был разбит на несколько разделов.
Последние два байта MBR имеют значение 55AA(h), то есть чередующиеся значения 0 и 1. Эта сигнатура выбрана для того, чтобы проверить работоспособность всех линий передачи данных. Значение 55AA(h), присвоенное последним двум байтам, имеется во всех загрузочных секторах.
Разделы диска могут быть двух типов: первичные (primary) и расширенные (extended). Максимальное число первичных разделов равно четырем. Если первичных разделов несколько, то только один из них может быть активным. Именно загрузчику, расположенному в активном разделе, передается управление при вклю-
Организация внешней памяти на магнитных дисках___________________________ 151
чении компьютера с помощью внесистемного загрузчика. Для DOS-систем и иных операционных систем, использующих спецификации DOS, остальные первичные разделы в этом случае считаются невидимыми (hidden). Так ведут себя и операционные системы Windows 9x.
Согласно принятым спецификациям на одном жестком диске может быть только один расширенный раздел, который, в свою очередь, может быть разделен на большое количество подразделов — логических дисков (logical disks). В этом смысле термин «первичный» можно признать не совсем удачным переводом слова «primary» — лучше было бы перевести «простейший», или «примитивный». В этом случае становится понятным и логичным термин «расширенный». Расширенный раздел содержит вторичную запись MBR (Secondary MBR, SMBR), в состав которой вместо таблицы разделов входит аналогичная ей таблица логических дисков (Logical Disks Table, LDT). Таблица LDT описывает размещение и характеристики раздела, содержащего единственный логический диск, а также может специфицировать следующую запись SMBR. Следовательно, если в расширенном разделе создано К логических дисков, то он содержит К экземпляров SMBR, связанных в список. Каждый элемент этого списка описывает соответствующий логический диск и ссылается (кроме последнего) на следующий элемент списка.
Как мы уже сказали, загрузчик NSB служит для поиска с помощью таблицы разделов активного раздела, копирования в оперативную память компьютера системного загрузчика (System Bootstrap, SB) из выбранного раздела и передачи на него управления, что позволяет осуществить загрузку ОС.
Вслед за сектором MBR размещаются собственно сами разделы (рис. 5.4). В процессе начальной загрузки сектора MBR, содержащего таблицу разделов, работают программные модули BIOS. Начальная загрузка считается выполненной корректно только в том случае, если таблица разделов содержит допустимую информацию.
Рассмотрим еще раз процесс загрузки операционной системы. Процедура начальной загрузки (bootstrap loader) вызывается как программное прерывание (BIOS INT 19h).Эта процедура определяет первое готовое устройство из списка разрешенных и доступных (гибкий или жесткий диск, а в современных компьютерах это могут быть еще и компакт-диск, привод ZIP-drive компании Iomega, сетевой адаптер или еще какое-нибудь устройство) и пытается загрузить с него в оперативную память короткую главную программу-загрузчик. Для накопителей на жестких магнитных дисках— это уже известный нам главный, или внесистемный, загрузчик (NSB) из MBR, и ему передается управление. Главный загрузчик определяет на диске активный раздел, загружает его собственный системный загрузчик и передает управление ему. И наконец, этот загрузчик находит и загружает необходимые файлы операционной системы и передает ей управление. Далее операционная система выполняет инициализацию подведомственных ей программных и аппаратных средств. Она добавляет новые сервисы, вызываемые, как правило, тоже через механизм программных прерываний, и расширяет (пли заменяет) некоторые сервисы BIOS. Необходимо отметить, что в современных мультипрограммных операционных системах большинство сервисов BIOS, изначально расположенных в ПЗУ, как правило, заменяются собственными драйверами ОС,
152_____________ Глава 5. Управление вводом-выводом в операционных системах
поскольку они должны работать в режиме прерываний, а не в режиме сканирования готовности.
Рис.5.4. Разбиение диска на разделы
Согласно рассмотренному процессу, каждый раз при запуске компьютера будет загружаться одна и та же операционная система. Это не всегда нас может устраивать. Так называемые менеджеры загрузки (boot managers) предназначены для того, чтобы пользователь мог выбрать среди нескольких установленных на компьютере операционных систем желаемую и передать управление на загрузчик выбранной ОС. Имеется большое количество таких менеджеров. Одним из наиболее мощных менеджеров загрузки является OS Selector от фирмы Acronis. Эта программа имеет следующие основные особенности: □ поддержка большого количества операционных систем, включая различные
версии DOS (MS DOS, DR-DOS и др.), Windows (9x/ME, NT/2000/XP), OS/2,
Linux, FreeBSD, SCO Unix, BeOS и др.;
Организация внешней памяти на магнитных дисках___________________________ 153
- возможность установки на любой раздел FAT16/FAT32, в том числе и на от
дельный раздел, недоступный другим операционным системам;
- возможность с помощью меню загрузки, предоставляемого менеджером, осуществить загрузку с дискеты;
- автоматическая идентификация операционных систем как на первичных раз
делах, так и на логических дисках расширенного раздела всех НЖМД, доступ
ных через BIOS компьютера;
- поддержка нескольких операционных систем на одном разделе FAT16/FAT32, при этом предотвращаются конфликты по системным и конфигурационным файлам для систем, установленных на одном разделе;
- возможность дополнительной настройки конфигураций операционных систем и легкого их добавления и удаления;
- встроенная защита от загрузочных вирусов;
- легкое восстановление в случае повреждения MBR;
- поддержка больших жестких дисков во всех режимах современных подсистем BIOS;
- возможность установки паролей отдельно на меню загрузки и на выбранные конфигурации.
Формирование таблицы разделов осуществляется с помощью специальных утилит. Обычно их называют FDisk (от слов «Form Disk» — формирование диска). Хотя есть и иные программы, которые могут делать с разделами намного больше, чем простейшие утилиты FDisk от Microsoft. Надо признать, что в последнее время появилось большое количество утилит, которые предоставляют возможность более наглядно представить разбиение диска на разделы, поскольку в них используется графический интерфейс. Эти программы успешно и корректно работают с наиболее распространенными типами разделов (разделы под FAT, FAT32, NTFS). Однако созданы они в основном для работы в среде Win32API, что часто ограничивает возможность их применения. Одной из самых известных и мощных программ для работы с разделами жесткого диска является Partition Magic фирмы Power Quest.
Еще одной мощной утилитой такого рода является Администратор дисков, входящий в состав уже упоминавшегося менеджера загрузки OS Selector от Acronis. Эта утилита позволяет:
- создавать разделы любых типов и форматировать их под файловые системы FAT16, FAT32, NTFS, Ext2FS (Linux), Linux ReiserFS, Linux Swap, при этом можно выбирать точное или произвольное расположение раздела и указывать его параметры;
- получать подробную информацию о разделах и о самих жестких дисках;
- удалять любые разделы;
- преобразовывать разделы из FAT 16 в FAT32 и обратно;
копировать и перемещать разделы с FAT16, FAT32, NTFS, Linux Ext2FS, Linux ReiserFS и Linux Swap;
154_____________ Глава 5. Управление вводом-выводом в операционных системах
- изменять размеры разделов с вышеперечисленными файловыми системами;
- выбирать размер кластера вручную во время любой операции создания, копирования, перемещения или изменения размера раздела;
- посекторно редактировать содержимое жестких дисков и разделов с помощью встроенного многооконного редактора дисков.
В популярных операционных системах от Microsoft тоже имеются средства для просмотра и изменения структуры разделов жесткого диска. Так, в Windows NT 4.0 для управления дисками имеется программа Администратор дисков (Disk Manager); а в Windows 2000 и Windows XP — консоль управления с оснасткой под названием Управление дисками (Disk Management). Эти средства имеют графический интерфейс и позволяют создавать новые разделы, удалять разделы, переопределять букву (имя) логического диска и создавать наборы дисков, выступающие как один логический том.
Утилиты формирования дисков, входящие в состав MS DOS и Windows 95/98, а также утилита, встроенная в программу установки Windows NT, первым элементом таблицы разделов всегда делают первичный раздел. Вторым элементом становится расширенный раздел, в котором, в свою очередь, организуется один или несколько логических дисков. При этом создаваемые логические диски помимо известного буквенного именования (диски С:, D:, Е: и т. д.) получают еще и так называемые номера разделов. Диск С: получает в этом случае порядковый номер 1, диск D: — 2, диск Е: — 3, и т. д. Именно номера разделов используются в файле boot.ini, который указывает системному загрузчику Windows NT/2000/XP, где находятся файлы выбранной операционной системы.
Следует заметить, что в операционных системах типа Linux логические диски и разделы нумеруются и обозначаются иным способом. Жесткий диск с IDE-интерфейсом, подключенный к первому контроллеру как главный (master), имеет имя hda. Если это второй диск на том же шлейфе, то его именуют hdb1. Соответственно, имя hdc будет соответствовать диску, подключенному ко второму порту контроллера и имеющему адрес 0, то есть главному. И так далее. Если раздел диска указан посредством таблицы из MBR, то он имеет номер элемента таблицы разделов. Если же речь идет о логических дисках, созданных в пределах расширенного раздела, то их номера уже начинаются с 5. Тем самым указывается, что раздел описан в следующей (вторичной) записи MBR, то есть в SMBR.
Так, для рассматриваемого нами примера (см. рис. 5.4), раздел с номером 1 в Linux тоже будет иметь номер 1. Если мы имеем единственный накопитель, подключенный к первому порту контроллера, то этот раздел обозначается как hda1. А вот логический диск, по умолчанию именуемый в Windows диском D: и имеющий номер раздела 2, в Linux будет обозначаться как hda5. Логический диск Е:, имеющий в Windows номер раздела 3, станет в Linux диском с номером раздела 6 и будет обозначаться hda6. Чтобы понять причину такой нумерации, рассмотрим рис. 5.4
1 Главным является тот накопитель, который имеет адресацию 0 на IDE-интерфейсе, тогда как диск с адресом 1 обозначается как вспомогательный (slave). Адресация выставляется на одной из линий IDЕ-шлейфа (26 линия).
Организация внешней памяти на магнитных дисках___________________________ 155
более внимательно. Вслед за сектором с MBR размещаются собственно сами разделы. Поскольку на рисунке это в явном виде не показано, напомним, что любой раздел начинается с первого сектора. В таблице разделов имеется 4 элемента, но только два из них задействованы. Первый элемент описывает раздел с номером 1 и ему соответствует логический диск С:. Второй элемент указывает на запись SMBR, в которой первый элемент в таблице логических дисков описывает логический диск D:. И этот элемент является уже пятым элементом, если учесть четыре элемента в MBR. А далее нумерация разделов в Linux отходит от этой идеи. Диск Е: получает порядковый номер 6, а не 9, как следовало бы ожидать, если подсчитывать все имеющиеся элементы в таблицах разделов. И это логично, поскольку в каждой таблице дисков логический диск описывает только один элемент — первый. Таким образом, если бы расширенный раздел был разбит не на два, а на три логических диска, то последний подраздел (в системе Windows он именовался бы диском F:) получил бы номер 7.