Ниже приведена информация, которую я получаю с помощью команды (g)parted
или fdisk
.
Device Boot Start End Sectors Size Id Type
/dev/sda1 * 2048 196265983 196263936 93.6G 83 Linux
/dev/sda2 196268030 229468159 33200130 15.9G 5 Extended
/dev/sda5 196268032 229468159 33200128 15.9G 82 Linux swap / Solaris
Доступна ли информация на основе системного вызова или файловой системы (/sys/block и т. д.), чтобы узнать, является ли раздел расширенным/первичным, а иерархия sda5 находится в sda2 и т. д.? Если да, есть ли способ узнать, какие логические разделы находятся под выбранным расширенным разделом?
Я хочу избежать синтаксического анализа вывода команд(ы). Я пытался прочитать код fdisk, но он слишком сложен для меня, чтобы понять его.
Редактировать 1: Прочитав комментарии и ответы, я понял, что не знал о MBR/GPT и т. д. Итак, я решил прочитать о внутренностях MBR и EBR https://thestarman.pcministry.com/asm/mbr/ PartTables2.htm#ebr и написал код для получения информации о разделах диска.
Этот вопрос четко не определен.
Если диск отформатирован с помощью GPT, то расширенных разделов нет, а значит, нет и иерархии.
Если диск отформатирован с использованием MBR таким образом, что ОС Microsoft может получить к нему доступ, то существует не более 1 расширенного раздела, а всего до 4 основных и дополнительных разделов. Они будут иметь имена вида /dev/sdf[0 -3]. Если есть какие-либо логические разделы, они будут иметь номера разделов больше 4. Чтобы иметь логические разделы, вы должны иметь расширенный раздел для их хранения.
Однако ничто не требует, чтобы система Linux имела не более одного расширенного раздела, и ничто не говорит о том, что не может быть перекрытия не -расширенных разделов, если только вы их не используете.
Так, в частности, у вас может быть раздел 1, являющийся небольшим загрузочным разделом, раздел 2, покрывающий все, чего не было в разделе 1, раздел 3, покрывающий первую половину раздела 2 и имеющий тип «расширенный», а раздел 4 является вторая половина раздела 2. Внутри раздела 3 у вас могут быть разделы 5 и 6, каждый из которых занимает половину раздела 3. Все это будет работать нормально, если вы на самом деле не пытаетесь использовать раздел 2. Однако разделы 5 и 6 находятся в оба раздела 2 и 3, поэтому «иерархия» не является DAG (Направленный ациклический граф ), и поэтому «потребность клиента» не может быть удовлетворена.
Мой совет таким клиентам: удвойте комиссию.
«Тип» раздела для основного/расширенного записывается в MBR, поэтому вы можете использовать код, подобный dd bs=1 skip=446 count=64 if=/dev/sdf | hexdump -C
, чтобы получить что-то вроде этого
00000000 00 20 21 00 83 df 13 0c 00 08 00 00 00 20 03 00 |. !............|
00000010 00 df 14 0c 05 19 0d cc 00 28 03 00 00 e0 2e 00 |.........(......|
00000020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000030 00 19 0e cc 83 15 50 05 00 08 32 00 00 f8 0d 00 |......P...2.....|
и вы можете выбрать 5-й байт (83, 05, 00, 83 ), чтобы получить 4 значения. Обычный «тип» расширенного раздела — 05, но также используются 0f и 85. См.https://www.win.tue.nl/~aeb/partitions/partition_types-1.htmlдля получения дополнительной информации.
Таким образом, вы видите, есть ли расширенный раздел (, второй в данном случае ), и тогда вы знаете, что в нем есть разделы с номерами больше 4.
При использовании стиля разбиения MBR Linux резервирует первые 4 слота раздела (, например.sd*[1-4]
)для первичных разделов. Чтобы вообще иметь логические разделы, один из этих 4 необходимо использовать для расширенного раздела. И тогда логические разделы всегда будут появляться, начиная со слота 5 и далее.
Диск с разделами MBR -обычно должен иметь не более одного расширенного раздела :если есть два или более расширенных раздела со своими собственными цепочками логических отображать большое предупреждение и не продолжать дальше, так как разные ОС могут иметь разные представления о том, как его анализировать.
В месте, указанном вашим /sys/block/sda/sda2/start
, вы должны найти Расширенную загрузочную запись раздела (EPBR ), которая по сути является урезанной -версией MBR. Его первая запись в таблице разделов должна идентифицировать начало и размер первого логического раздела. Если есть дополнительные логические разделы, запись о втором разделе в EPBR будет указывать на другой EPBR и так далее. Чтобы полностью проанализировать структуру диска, вам может потребоваться пройти по цепочке (и )EPBR.
Похоже, вы просто хотите parted -l
. Вот что я получаю в одной из своих систем с таблицами MBR и расширенными разделами:
$ sudo parted -l
Model: ASMT ASM1156-PM (scsi)
Disk /dev/sda: 1500GB
Sector size (logical/physical): 512B/4096B
Partition Table: msdos
Disk Flags:
Number Start End Size Type File system Flags
1 32.3kB 10.5GB 10.5GB primary ntfs boot
3 10.5GB 1500GB 1490GB primary ext4
Model: ASMT ASM1156-PM (scsi)
Disk /dev/sdb: 2000GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:
Number Start End Size Type File system Flags
1 1049kB 1963GB 1963GB primary ext4 boot
2 1963GB 2000GB 37.7GB primary ext4
Model: SD USD (sd/mmc)
Disk /dev/mmcblk0: 16.0GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:
Number Start End Size Type File system Flags
1 4194kB 1686MB 1682MB primary fat32 lba
2 1686MB 16.0GB 14.3GB extended
5 1686MB 1720MB 33.6MB logical ext4
6 1720MB 1792MB 72.4MB logical fat32 lba
7 1795MB 16.0GB 14.2GB logical ext4
Это ясно показывает, является ли раздел первичным, расширенным или логическим (разделами, созданными внутри расширенного ). Другая полезная команда — lsblk
, которая в той же системе выводит:
$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 1.4T 0 disk
├─sda1 8:1 0 9.8G 0 part
└─sda3 8:3 0 1.4T 0 part /media/pi/movies
sdb 8:16 0 1.8T 0 disk
├─sdb1 8:17 0 1.8T 0 part /media/pi/bigboy
└─sdb2 8:18 0 35.2G 0 part
mmcblk0 179:0 0 14.9G 0 disk
├─mmcblk0p1 179:1 0 1.6G 0 part
├─mmcblk0p2 179:2 0 1K 0 part
├─mmcblk0p5 179:5 0 32M 0 part
├─mmcblk0p6 179:6 0 69M 0 part /boot
└─mmcblk0p7 179:7 0 13.2G 0 part /
Здесь вы можете узнать, что раздел расширен, так как его размер пренебрежимо мал (mmcblk02
, расширенный раздел отображается как 1 КБ ).