Библиотека сайта rus-linux.net
Ошибка базы данных: Table 'a111530_forumnew.rlf1_users' doesn't exist
Загадка расширенного раздела
Почти детективная история
Алексей Дмитриев, 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'ов является единственным несомненным фактом во всем этом темном деле.
Дополнительные ссылки:
dd: Команда, которая не похожа на другие
О применениии команды fdisk можно прочитать в статье четвертой цикла "Как безопасно установить Линукс на ваш компьютер"