Наши партнеры








Книги по Linux (с отзывами читателей)

Библиотека сайта rus-linux.net

Ошибка базы данных: Table 'a111530_forumnew.rlf1_users' doesn't exist
На главную -> MyLDP -> Тематический каталог -> Аппаратное обеспечение

Загадка расширенного раздела

Почти детективная история

Алексей Дмитриев, 3 декабря 2009

Глава 1. Завязка тайны.

Сразу хочу предупредить, что все события, описанные в данном исследовании, относятся только к миру Линукс; все действующие в истории программы - программы Линукс; и ни одна софтина от Микрософта в ходе экспериментов не пострадала.

А началось все со спора автора с редактором, я не стану называть никаких имен, но, поверьте, что по крайней мере редактор - весьма авторитетный в Линукс сообществе человек.

Спор завязался относительно механизма создания и функционирования логических разделов на жестких дисках. Суть дела вкратце такова.

Всем известно, что главная таблица разделов (Partition Table - PT), находящаяся в Главном загрузочном секторе (MBS или MBR), содержит только четыре строки, по 16 байтов каждая, для описания разделов жесткого диска. Соответственно и разделов этих (они называются первичными) может быть только четыре. Меньше - пожалуйста, а вот больше - никак. По мере роста объемов жестких дисков, встала проблема увеличения количества разделов, ведь жесткие диски были очень дороги, а разбив их на разделы, можно было как бы увеличить их количество. Да и информацию удобно было "разложить по полочкам" разных разделов.

Тогда придумали такой механизм: один из первичных разделов (только один) объявляется расширенным. При этом он теряет все основные свойства раздела - его нельзя отформатировать (создать файловую систему), нельзя хранить на нем информацию, нельзя установить на него операционную систему. Но взамен он приобретает свойство содержать в себе некоторое количество других разделов - они получили название логических, которые почти ничем не отличаются от первичных, кроме того, что их нельзя сделать загрузочными. Для некоторых операционных систем это важно - располагаться на загрузочном разделе, для других (в том числе и для Линукс) - безразлично.

Предметом нашего спора стал механизм создания и адресации этих самых логических разделов.

Автор утверждал, что внутри расширенного раздела может быть создано любое разумное число логических разделов (вплоть до десятков) При этом он не слишком задумывался о механизме их создания и адресации.

Редактор же, как человек более опытный, и даже сам когда-то писавший на эту тему, имел сложившееся убеждение, что:

"Первый сектор расширенного раздела тоже содержит таблицу разделов, подобную таблице из MBR. Однако из четырех возможных указателей на разделы используется только два: один используется для задания логического раздела, другой - для определения еще одного расширенного раздела. Два оставшихся указателя не используются. Каждый следующий расширенный раздел имеет свою таблицу разбиения, в которой, как и в первичном расширенном разделе, используются только две строки, задающие один логический и один расширенный раздел.
Таким образом, получается цепочка из таблиц разделов, где первая описывает три основных раздела, а каждая следующая - один логический раздел и положение следующей таблицы. Эта цепочка и определяет разбиение диска на разделы. Еще раз подчеркнем, что расширенный раздел как на физическом диске, так и в расширенном разделе вложенного расширенного раздела (предыдущего уровня) может быть только один..."

Редактор требовал исправления статьи в духе своих убеждений.

Но совершенно очевидно, что формально автор не допустил никакой ошибки: ведь, если даже схема редактора соответствовала действительности, то все равно все его вторичные, третичные, и прочие звенья цепочки находились внутри первичного расширенного раздела как внутри коробки. Если не принимать во внимание механизм создания всех этих разделов, получалось, что внутри расширенного раздела можно создавать любое разумное число логических разделов, и при этом совсем неважно, какая там внутри цепочка. Мы же говорим - "У этой женщины десять детей", - и даем ей медаль "Материнская Слава", при этом нас не интересует, сразу она их родила, или по очереди.

Автор тоже пошел на принцип, дескать, статья будет опубликована только в авторской редакции, или не будет опубликована вообще, короче говоря, спор разгорелся.

Глава вторая. "О чем лай, бояре?"

С такого вопроса, якобы, начинал некий царь, входя в боярскую думу. Он вовсе не сравнивал государственных мужей с собаками, а в тогдашней простой манере интересовался предметом спора.

Вот и читатель может поинтересоваться - " О чем спорить-то? Ну, опубликуйте авторский вариант, коли формальных ошибок в нем нет, а стройная теория редактора, так и останется в его собственных статьях".

Статья, кстати, так и была опубликована. Она только вскользь затрагивала данный вопрос, и была написана совсем про другое, причем на очень простом уровне. А вот вопрос о создании логических разделов крепко автора заинтересовал. Дело в том, что в теории редактора было одно слабое место: отсутствие этих самых вторичных, третичных и прочих расширенных разделов. Чтобы это лучше объяснить, нужно вспомнить, что такое раздел.

Разделом называется часть жесткого диска, организованная как самостоятельная структура. Раздел обладает всеми свойствами отдельного жесткого диска: представлен файлом в директории /dev, может иметь загрузочный сектор (BS) с обычной сигнатурой (55аа) в первом секторе. На разделе может размещаться собственная файловая система, может быть установлена операционная система (независимо от других разделов). Раздел может быть удален, изменен, увеличен, уменьшен (если есть место на диске) безо всякого влияния на остальные разделы. Как уже было сказано, всего на диске может быть создано четыре первичных раздела. Они полностью равноправны, если один из них не объявлен расширенным.

Расширенный раздел по структуре также является первичным, он может (и должен) занимать часть жесткого диска, быть представлен соответствующим файлом, иметь загрузочный сектор, таблица разделов в котором называется расширенной загрузочной записью (Extended Boot Record, кратко - EBR). Но на этом сходства кончаются и начинаются различия. Расширенный раздел нельзя отформатировать, в нем нельзя установить операционную систему, но зато его можно поделить на вторичные - логические разделы, чего нельзя сделать с обычным первичным разделом.

Когда я только начинал свое знакомство с разделами, однажды, по незнанию, приказал программе партиционирования (не помню какой, но для Windows) создать второй расширенный раздел. Программа долго думала, затем выбросила совершенно человеческий вопль: "Но ведь тогда их будет два!" Я нажал ENTER. И программа умерла. Подвис компьютер, а после перезагрузки программу пришлось переустанавливать.

Но вернемся к нашей интриге.

Расширенный раздел может быть поделен на логические. Как же происходит этот процесс? Чем автору не понравилась гипотеза цепочки из таблиц расширенных разделов, каждая их которых описывает саму себя и следующий раздел, если таковой создан. Дело в том, что эти таблицы должны где-то располагаться физически. Для их записи нужно реальное место - один сектор - 512 байт - минимальная адресуемая часть жесткого диска.

Редактор утверждал, что создается вторичный расширенный раздел, внутри которого располагается логический. Там же находится и таблица расширенного раздела (EBR), имеющая две записи - для логического раздела, и для следующего расширенного раздела (уже третьего уровня), если таковой создан.

При этом редактор ссылался на вывод команды sfdisk, которая умеет показывать цепочки таблиц расширенных разделов. Эта распечатка получила в споре кодовое имя "листинг 3", как я и здесь стану его называть. вот он целиком:

Листинг 3.

[root]# /sbin/sfdisk -l -x /dev/hda
Disk /dev/hda: 77545 cylinders, 16 heads, 63 sectors/track
Warning: extended partition does not start at a cylinder boundary.
DOS and Linux will interpret the contents differently.
Units = cylinders of 516096 bytes, blocks of 1024 bytes, counting from 0

   Device Boot Start    End     #cyls    #blocks  Id System
/dev/hda1         0+   1051-   1052-    530113+  82 Linux swap
/dev/hda2  *   1051+   5115-   4065-   2048287+   b W95 FAT32
/dev/hda3      5115+   5323-    208-    104422+  83 Linux
/dev/hda4      5323+  77544   72222-  36399825    f W95 Ext'd (LBA)

/dev/hda5      5323+   8367-   3044    1534176   83 Linux
   -           8367+  12431-   4065-   2048287+   5 Extended
   -           5323+   5323-      0          0    0 Empty
   -           5323+   5323-      0          0    0 Empty

/dev/hda6      8367+  12431-   4064    2048256   83 Linux
   -          12431+  36815-  24385-  12289725    5 Extended
   -           8367+   8367-      0          0    0 Empty
   -           8367+   8367-      0          0    0 Empty

/dev/hda7     12431+  36815-  24385-  12289693+  83 Linux
   -          36815+  77535-  40721-  20523037+   5 Extended
   -          12431+  12431-      0          0    0 Empty
   -          12431+  12431-      0          0    0 Empty

/dev/hda8     36815+  77535-  40721-  20523006    c W95 FAT32 (LBA)
   -          77535+  77544      10-      4567+   5 Extended
   -          36815+  36815-      0          0    0 Empty
   -	      36815+  36815-      0          0    0 Empty

Рассмотрим запись о любом из логических разделов (они начинаются с пятого), скажем /dev/hda6. Действительно, после строки:

/dev/hda6      8367+  12431-   4064    2048256   83 Linux

описывающей логический раздел hda6, занимающий 4064 цилиндров с 8367+ по 12431- и имеющий идентификатор 83 (Линукс), следует строка:

   -          12431+  36815-  24385-  12289725    5 Extended

Что она описывает? Раздел? Но где номер этого раздела, его файл? А в то же время указаны размеры 24385- цилиндров, с 12431+ и по 36815- , а самое главное - тип раздела - 5 (расширенный). Запись о разделе? Но где находится эта запись?

Тут мнения и разделились. Редактор верил в свои вторичные и третичные расширенные разделы, закрывая глаза на то, что файлов этих разделов в природе (а точнее в директории /dev) нет. А нет файла, нечего и просмотреть, чтобы обнаружить запись (кроме листинга 3).

Подтверждал он свою правоту man'ом команды sfdisk, где белым по черному прописано:

Each partition has a type, its `Id', and if this type is 5 or f (`extended partition') the starting sector of the partition again contains 4 partition descriptors. MSDOS only uses the first two of these: the first one an actual data partition, and the second one again an extended partition (or empty). In this way one gets a chain of extended partitions. Other operating systems have slightly different conventions.

Перевод:

"Разделы имеют идентификаторы, или типы, и если раздел помечен типом 5 или f (расширенный раздел), то в первом секторе такого раздела снова будет находиться 4 дескриптора разделов. MSDOS использует только первые два из них: один для раздела, предназначенного для данных, а второй опять для расширенного раздела (или пустой). Таким образом, создается цепочка расширенных разделов. Другие операционные системы ведут себя сходным образом".

Казалось бы, все кристально ясно, но ответа на вопрос - "А где же мальчик?", то есть файлы разделов, этот man не давал.

И тогда автор придумал свою теорию: никаких вторичных расширенных разделов нет, а есть только записи о них в EBR'ах, которые находятся в первом секторе логического раздела. Эту гипотезу легко проверить, достаточно просмотреть первые сектора логических разделов при помощи команды dd. На своем рабочем компьютере автор просмотрел первые сектора всех девяти логических разделов, но ни в одном не обнаружил EBR (который легко опознать по сигнатуре 55аа). Тогда, решив, что дело в недавнем перемещении всех разделов, вызванных ликвидацией Windows Vista, автор решил поставить чистый эксперимент.

Глава 3. Как были обнаружены разделы-призраки

Для эксперимента автор взял обычную флешку на 1 Гб. Вполне хватит, если делать небольшие разделы.

На первом этапе была уничтожена вся информация на диске (флешке), путем заполнения ее нулями от первого до последнего сектора. Если бы этого не было сделано, многие сектора случайно могли быть заполнены схожими байтами.

# dd if=/dev/zero of=/dev/sdb bs=1M

dd: writing `/dev/sdb': No space left on device
984+0 records in
983+0 records out
1031798272 bytes (1.0 GB) copied, 219.164 s, 4.7 MB/s

Затем проверили содержимое MBS:

# dd if=/dev/sdb count=1 conv=swab 2>/dev/null | hexdump

0000000 0000 0000 0000 0000 0000 0000 0000 0000
*
0000200 

32 строки одних нулей! Теперь можно в чистом поле создавать разделы. Но сначала надо восстановить MBR. Оказывается, программа fdisk делает это полуавтоматически:

# fdisk -u /dev/sdb

Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
Building a new DOS disklabel with disk identifier 0xf7ebdb60.
Changes will remain in memory only, until you decide to write them.
After that, of course, the previous content won't be recoverable.

Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)
Попробуем записать:
Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.
Посмотрим, что программа записала нам в MBS?
# dd if=/dev/sdb count=1 conv=swab 2>/dev/null | hexdump

0000000 0000 0000 0000 0000 0000 0000 0000 0000
*
00001b0 0000 0000 0000 0000 60db ebf7 0000 0000
00001c0 0000 0000 0000 0000 0000 0000 0000 0000
00001d0 0000 0000 0000 0000 0000 0000 0000 0000
00001e0 0000 0000 0000 0000 0000 0000 0000 0000
00001f0 0000 0000 0000 0000 0000 0000 0000 55aa
0000200

А вписала она первым делом сигнатуру (55аа) и, как она выражается, "a new DOS disklabel with disk identifier 0xf7ebdb60" (60db ebf7 - то же число, только в little-endian). Таблица разделов (последние четыре строки) пуста, можно ее заполнять.

Я обращаю ваше внимание на то, что автор использовал команду fdisk -u, которая выводит и принимает данные в секторах, размер которых известен - 512 байт, а не в цилиндрах, как по умолчанию. Какие там во флешке цилиндры?! Правда и секторов там нет, но 512 байт дают возможность ориентироваться. Этот выбор единиц измерения предопределил успех всего предприятия, ведь цилиндры слишком крупные единицы, чтобы заметить то, что удалось заметить. Но, терпение.

Я также принимаю за аксиому, что мои читатели знакомы с такими командами как fdisk и dd и мне не надо объяснять каждую опцию. В приложении я дам ссылки на статьи, подробно описывающие применение этих команд.

Итак, за дело!

# fdisk -u /dev/sdb

Command (m for help):
Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 1
First sector (62-2015230, default 62):
Using default value 62
Last sector, +sectors or +size{K,M,G} (62-2015230, default 2015230): +200M

Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
e
Partition number (1-4): 2
First sector (409663-2015230, default 409663):
Using default value 409663
Last sector, +sectors or +size{K,M,G} (409663-2015230, default 2015230):
Using default value 2015230

Command (m for help): n
Command action
   l   logical (5 or over)
   p   primary partition (1-4)
l
First sector (409725-2015230, default 409725):
Using default value 409725
Last sector, +sectors or +size{K,M,G} (409725-2015230, default 2015230): +200M

Command (m for help): n
Command action
   l   logical (5 or over)
   p   primary partition (1-4)
l
First sector (819388-2015230, default 819388):
Using default value 819388
Last sector, +sectors or +size{K,M,G} (819388-2015230, default 2015230): +200M

Command (m for help): n
Command action
   l   logical (5 or over)
   p   primary partition (1-4)
l
First sector (1229051-2015230, default 1229051):
Using default value 1229051
Last sector, +sectors or +size{K,M,G} (1229051-2015230, default 2015230): +200M

Command (m for help): n
Command action
   l   logical (5 or over)
   p   primary partition (1-4)
l
First sector (1638714-2015230, default 1638714):
Using default value 1638714
Last sector, +sectors or +size{K,M,G} (1638714-2015230, default 2015230): +200M
Value out of range.
Last sector, +sectors or +size{K,M,G} (1638714-2015230, default 2015230):
Using default value 2015230

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.


# fdisk -u /dev/sdb

Command (m for help): p

Disk /dev/sdb: 1031 MB, 1031798272 bytes
32 heads, 62 sectors/track, 1015 cylinders, total 2015231 sectors
Units = sectors of 1 * 512 = 512 bytes
Disk identifier: 0x58293268

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1              62      409662      204800+  83  Linux
Partition 1 does not end on cylinder boundary.
/dev/sdb2          409663     2015230      802784    5  Extended
Partition 2 does not end on cylinder boundary.
/dev/sdb5          409725      819325      204800+  83  Linux
/dev/sdb6          819388     1228988      204800+  83  Linux
/dev/sdb7         1229051     1638651      204800+  83  Linux
/dev/sdb8         1638714     2015230      188258+  83  Linux

Вот какие разделы автор создал на своем диске:

Первичный    /dev/sdb1
Расширенный  /dev/sdb2
Логический   /dev/sdb5
Логический   /dev/sdb6
Логический   /dev/sdb7
Логический   /dev/sdb8

Теперь посмотрим EBR на расширенном разделе:

dd if=/dev/sdb2 count=1 conv=swab 2>/dev/null | hexdump
0000000 0000 0000 0000 0000 0000 0000 0000 0000
*
00001b0 0000 0000 0000 0000 0000 0000 0000 0007
00001c0 0651 830a 0ba2 1500 0000 0150 0000 000a
00001d0 0ca2 0502 11f4 1650 0000 1650 0000 0000
00001e0 0000 0000 0000 0000 0000 0000 0000 0000
00001f0 0000 0000 0000 0000 0000 0000 0000 55aa
0000200

Полный порядок: два раздела: один Линукс (83 - выделен цветом), второй расширенный (05 - выделен цветом). Последние две строки заполнены нулями, как и предсказывает гипотеза. Осталось просмотреть EBR на логических разделах - и гипотеза станет теорией! Вперед!

# dd if=/dev/sdb5 count=1 conv=swab 2>/dev/null | hexdump
0000000 0000 0000 0000 0000 0000 0000 0000 0000
*
0000200

# dd if=/dev/sdb6 count=1 conv=swab 2>/dev/null | hexdump
0000000 0000 0000 0000 0000 0000 0000 0000 0000
*
0000200

# dd if=/dev/sdb7 count=1 conv=swab 2>/dev/null | hexdump
0000000 0000 0000 0000 0000 0000 0000 0000 0000
*
0000200

Но что это? Первые сектора логических разделов заполнены нулями, в них даже сигнатуры нет.

А есть ли вообще EBR'ы на диске /dev/sdb?

# dd if=/dev/sdb  conv=swab 2>/dev/null | hexdump | grep 55aa

00001f0 0000 0000 0000 0000 0000 0000 0000 55aa
c807ff0 0000 0000 0000 0000 0000 0000 0000 55aa
1900fdf0 0000 0000 0000 0000 0000 0000 0000 55aa
25817bf0 0000 0000 0000 0000 0000 0000 0000 55aa
3201f9f0 0000 0000 0000 0000 0000 0000 0000 55aa

Есть, ровно пять штук, как и должно быть: один в MBR, второй в /dev/sdb2, а вот где прячутся еще три?.

Помнится, редактор вскользь говорил что-то о промежутках между разделами? В этих промежутках и таилась разгадка. Но если бы программу fdisk не использовали с опцией -u, то заметить эти промежутки не удалось бы - ведь цилиндры слишком велики, чтобы показать такую малость. Давайте выкинем все лишнее из таблицы разделов:

   Device Boot      Start         End         Id  System

/dev/sdb1              62      409662        83  Linux
/dev/sdb2          409663     2015230         5  Extended

/dev/sdb5          409725      819325        83  Linux
/dev/sdb6          819388     1228988        83  Linux
/dev/sdb7         1229051     1638651        83  Linux
/dev/sdb8         1638714     2015230        83  Linux

Раздел /dev/sdb5 заканчивается сектором 819325, а /dev/sdb6 начинается аж сектором 819388. А что находится в этих в этих 63 секторах? Проверим, используя абсолютную адресацию от первого сектора диска /dev/sdb:

# dd if=/dev/sdb count=63 skip=819325 conv=swab 2>/dev/null | hexdump
0000000 0000 0000 0000 0000 0000 0000 0000 0000
*
00003b0 0000 0000 0000 0000 0000 0000 0000 001f
00003c0 7b9c 830e 996b 3e00 0000 0140 0600 000e
00003d0 9a6b 051d f639 7e80 0c00 3f40 0600 0000
00003e0 0000 0000 0000 0000 0000 0000 0000 0000
00003f0 0000 0000 0000 0000 0000 0000 0000 55aa
0000400 0000 0000 0000 0000 0000 0000 0000 0000
*
0007e00

Есть сигнатура! Попалась рыбка! Теперь только вычислить, в каком именно секторе сидит EBR. Не буду вас утомлять перебором, хотя он и невелик:

# dd if=/dev/sdb count=1 skip=819326 conv=swab 2>/dev/null | hexdump
0000000 0000 0000 0000 0000 0000 0000 0000 0000
*
00001b0 0000 0000 0000 0000 0000 0000 0000 001f
00001c0 7b9c 830e 996b 3e00 0000 0140 0600 000e
00001d0 9a6b 051d f639 7e80 0c00 3f40 0600 0000
00001e0 0000 0000 0000 0000 0000 0000 0000 0000
00001f0 0000 0000 0000 0000 0000 0000 0000 55aa
0000200

EBR оказался в 819327 секторе от начала диска. Проверим нашу удачу - к последнему сектору шестого раздела прибавим единицу и пропустим столько секторов (1228988 + 1 = 1228989):

# dd if=/dev/sdb count=1 skip=1228989 conv=swab 2>/dev/null | hexdump
0000000 0000 0000 0000 0000 0000 0000 0000 0000
*
00001b0 0000 0000 0000 0000 0000 0000 0000 000f
00001c0 9a6b 831d f639 3e00 0000 0140 0600 001d
00001d0 f739 0517 edf7 bdc0 1200 03bf 0500 0000
00001e0 0000 0000 0000 0000 0000 0000 0000 0000
00001f0 0000 0000 0000 0000 0000 0000 0000 55aa
0000200

Прямое попадание! Сектор 1228990.

В седьмом уже всего одна запись (сектор 1638653):

# dd if=/dev/sdb count=1 skip=1638652 conv=swab 2>/dev/null | hexdump
0000000 0000 0000 0000 0000 0000 0000 0000 0000
*
00001b0 0000 0000 0000 0000 0000 0000 0000 001e
00001c0 f739 8317 edf7 3e00 0000 c5be 0500 0000
00001d0 0000 0000 0000 0000 0000 0000 0000 0000
*
00001f0 0000 0000 0000 0000 0000 0000 0000 55aa
0000200

А в последнем восьмом - ни одной.

Выпишем все номера секторов, содержащих EBR:

819327
1228990
1638653

Между ними по 409 663 сектора или по 209 747 456 байт, в то время как соответствующие логические разделы имеют размер 409601 секторов. Интересно, что ровно столько секторов от начала расширенного раздела 2 до первого сектора, содержащего EBR. Это можно видеть при помощи команды:

# sfdisk -uS -lx /dev/sdb

Disk /dev/sdb: 1015 cylinders, 32 heads, 62 sectors/track
Warning: extended partition does not start at a cylinder boundary.
DOS and Linux will interpret the contents differently.
Units = sectors of 512 bytes, counting from 0

   Device Boot    Start       End   #sectors  Id  System
/dev/sdb1            62    409662     409601  83  Linux
/dev/sdb2        409663   2015230    1605568   5  Extended
/dev/sdb3             0         -          0   0  Empty
/dev/sdb4             0         -          0   0  Empty

/dev/sdb5        409725    819325     409601  83  Linux
    -            819326   1228988     409663   5  Extended
    -            409663    409662          0   0  Empty
    -            409663    409662          0   0  Empty

/dev/sdb6        819388   1228988     409601  83  Linux
    -           1228989   1638651     409663   5  Extended
    -            819326    819325          0   0  Empty
    -            819326    819325          0   0  Empty

/dev/sdb7       1229051   1638651     409601  83  Linux
    -           1638652   2015230     376579   5  Extended
    -           1228989   1228988          0   0  Empty
    -           1228989   1228988          0   0  Empty

/dev/sdb8       1638714   2015230     376517  83  Linux
    -           1638652   1638651          0   0  Empty
    -           1638652   1638651          0   0  Empty
    -           1638652   1638651          0  
 

Выяснив точно, в каких по счету от начала диска секторах находятся EBR'ы, необходимо понять, в каких именно разделах они расположены - это разрешит спор.

Уже ясно, что это не логические разделы, так что версия автора оказалась неверной. Остается расширенный раздел /dev/sdb2. Это легко проверить:

# dd if=/dev/sdb2 conv=swab 2>/dev/null | hexdump | grep 55aa

00001f0 0000 0000 0000 0000 0000 0000 0000 55aa

Как ни странно, но бесстрастная команда dd ясно показывает, что во всем втором разделе лишь один сектор имеет сигнатуру, и это первый сектор расширенного раздела. Это очень странно, ведь все найденные EBR'ы, находятся на "территории", занятой именно расширенным разделом /dev/sdb2. Но, возможно, эта территория изменилась? Это тоже легко проверить, заменив все нулевые байты (помните, мы первым делом обнулили все байты на всем диске) в указанном разделе на псевдослучайные байты, исключив, разумеется, первый сектор данного раздела:

# dd if=/dev/urandom  of=/dev/sdb2 seek=1 conv=swab | hexdump

dd: writing to `/dev/sdb2': No space left on device
2+0 records in
1+0 records out
512 bytes (512 B) copied, 0.0122939 s, 41.6 kB/s

Программа dd сообщает, что ей удалось записать только один сектор, кроме пропущенного, за неимением места на разделе. Получается, что /dev/sdb2 состоит всего из двух секторов! Просмотрим их:

# dd if=/dev/sdb2  conv=swab 2>/dev/null | hexdump
0000000 0000 0000 0000 0000 0000 0000 0000 0000
*
00001b0 0000 0000 0000 0000 0000 0000 0000 0010
00001c0 1ece 831e 7a9c 3e00 0000 0140 0600 001e
00001d0 7b9c 050e 996b 3f40 0600 3f40 0600 0000
00001e0 0000 0000 0000 0000 0000 0000 0000 0000
00001f0 0000 0000 0000 0000 0000 0000 0000 55aa

0000200 e998 716c 3a3f 2a60 3705 b8ac af7f 90f5
0000210 a6f5 22d3 3f1b 1975 bbe1 c3a6 6688 0932
0000220 2656 3633 0ddb eac1 07fc ae55 c7e9 300f
0000230 f8fb d8a9 a479 fc74 0c90 bc87 b2ff 878f
0000240 355c a1d3 8c7b ad82 95a8 bdb7 cd94 80b2
0000250 2011 0430 75e9 263f 7dce cb5e 4451 960b
0000260 9bb5 5c37 e842 cb05 5644 dee1 201b 4c43
0000270 475b 98d3 7434 19f5 6826 8a9b 266e 3129
0000280 ab66 18c2 3adc 0512 889b e417 cdc4 a4f9
0000290 e10d 5bfe 6fe5 6fa4 d625 1d9a 76de 999f
00002a0 2406 5ccc 63a2 bc86 d4fe 5fba 2475 54d7
00002b0 7cf9 fff8 447d f1d3 bc2b 3d42 0349 ae1c
00002c0 b207 517e dc6c 2f76 5b68 583d 9586 9450
00002d0 839f 4d80 6905 535c a284 4499 3195 be70
00002e0 2b8d 5c60 08f9 3ebb 24ed a8d0 3a4e 90d4
00002f0 30b2 341f 74b6 54ee 1052 ae64 21e9 fdc9
0000300 f4d3 a15e e70c 2315 cb1b c15f 59d2 952b
0000310 3603 93cf 47e7 1f7b a8b2 756c b4c7 3f94
0000320 5898 127c c690 1b8b b40d 7c80 f0dc f363
0000330 ada2 0a1b fdda 2dba dfe3 efa7 dd3b af10
0000340 8c12 b157 92c2 ad8c bcc3 6037 415c b104
0000350 9afd 0296 1229 bbe9 6f50 ce3c adb9 f4d5
0000360 5768 bab5 240f e6b2 0651 1d3e 084c 8690
0000370 f2ce 53f0 9f9d 638a c1a2 c6ff 4a3f 31d5
0000380 f562 aea8 16d2 02ad 61de fd11 611c 18e1
0000390 b5d3 f2dc 48fa 99d1 e431 d51d 5e2d 5dc1
00003a0 082b b741 457a 8a48 6166 4141 2864 aa11
00003b0 c97d d5b1 841f ea70 3cb3 de28 d87e f64c
00003c0 b25d 47e4 a4de d962 ec96 85e0 9434 9b4d
00003d0 9bf6 05c8 af8e 3fb7 dfd7 ddd7 06d4 97ce
00003e0 e1bf e853 7161 0301 402d 492b 9066 3e29
00003f0 7f69 a4d4 ceed dd57 645f f670 d153 26cf
0000400

Первый сектор содержит EBR и заканчивается сигнатурой, а второй сектор заполнен псевдослучайными байтами. Куда же девался весь второй раздел размером 800 Мб?

Приходится признать, что он был растащен на куски разделами-призраками, существующими только в таблицах разделов. Почему они призраки? Потому что не имеют соответствующих файлов в директории /dev. Потому что их нельзя адресовать. Потому что они не имеют ни одного свойства раздела, кроме свойства содержать в себе один логический раздел. Но зато каждый имеет EBR.

Глава 4. Какие можно сделать выводы

Один постулат оказался неверным: это постулат редактора о том, что расширенный раздел может быть только один на каждом уровне. Редактор считал, что вторичный расширенный раздел займет пространство от конца пятого логического и до конца диска (до конца первичного расширенного раздела, который в нашем случае совпадает с концом диска). Внутри второго уровня создается расширенный раздел третьего уровня, снова занимающий все пространство от конца логического раздела 6 до конца диска, и так далее.

Вернее сказать, этот постулат окажется неверным, если разделы-призраки считать расширенными разделами. Они все расположены на одном уровне, внутри первичного расширенного раздела (/dev/sdb2) бок о бок, как шпроты в банке, без каких-либо промежутков. Один кончается сектором 1228988, следующий начинается сектором 1228989 и так далее. Тогда выходит, что расширенный раздел первого уровня содержит неограниченное количество расширенных разделов второго уровня, а никакого третьего и последующих уровней нет.

Если же не считать разделы-призраки расширенными разделами, то получится, что расширенный раздел может быть только один (вообще один на всем диске), и может он содержать энное количество разделов-призраков (их можно назвать вторичными разделами), каждый из которых содержит логический раздел и указание на местоположение следующего вторичного раздела-призрака.

Таким образом, пресловутая цепочка EBR'ов является единственным несомненным фактом во всем этом темном деле.


Дополнительные ссылки:

Extended boot record

dd: Команда, которая не похожа на другие

О применениии команды fdisk можно прочитать в статье четвертой цикла "Как безопасно установить Линукс на ваш компьютер"




Средняя оценка 4 при 1 голосовавших

Комментарии