LINUX.ORG.RU

libblkid выдает неверные данные для GPT диска

 ,


0

2

Есть 3 диска в виртуалке. sda1 и sda2 имеют MBR, sda3 - GPT. Вот что показывает blkid.

root@LIN:/home/user# blkid
/dev/sdb2: UUID="36c5be34-179b-4af9-a677-9cd8239c9127" TYPE="swap" 
/dev/sdb1: UUID="cbfb2cad-8cc6-4497-a109-fd91e4b185d2" TYPE="ext4" 
/dev/sda1: UUID="eb047a72-374a-47ab-ab4a-2287f5f5001a" TYPE="ext3" 
/dev/sdc1: UUID="9269-9FCA" TYPE="vfat" 
/dev/sdc2: UUID="9275-D8F7" TYPE="vfat" 
/dev/sdc3: UUID="67CDA00432B128C5" TYPE="ntfs" 
/dev/sdc4: UUID="15FAB91367B9E2F7" TYPE="ntfs" 
Т.е. кривой UUID (и метка тома тоже).

Кроме того, я использую функцию blkid_partition_get_type() из libblkid в своей софтине, чтобы найти раздел EFI по типу 0xEF00, а получаю 0x0000 на всех разделах диска с GPT. Для MBR разбивки возвращаются нормальные значения, например 0x0083 для ext2.

С чем это может быть связано? Что использовать взамен libblkid?

Я не совсем понял, как sda[123] соотносятся с sda, sdb, sdc, но посмотрите, что показывает ″blkid -o udev″, неправильный uid показывается именно в ID_PART_ENTRY_UUID? blkid какой версии? В каталоге /dev/disk/by-partuuid/ есть для нужного диска записи или udev правила тоже не срабатывают?

mky ★★★★★
()
Последнее исправление: mky (всего исправлений: 1)
Ответ на: комментарий от mky

что показывает ″blkid -o udev″

# blkid -o udev
ID_FS_UUID=36c5be34-179b-4af9-a677-9cd8239c9127
ID_FS_UUID_ENC=36c5be34-179b-4af9-a677-9cd8239c9127
ID_FS_TYPE=swap

ID_FS_UUID=cbfb2cad-8cc6-4497-a109-fd91e4b185d2
ID_FS_UUID_ENC=cbfb2cad-8cc6-4497-a109-fd91e4b185d2
ID_FS_TYPE=ext4

ID_FS_UUID=eb047a72-374a-47ab-ab4a-2287f5f5001a
ID_FS_UUID_ENC=eb047a72-374a-47ab-ab4a-2287f5f5001a
ID_FS_TYPE=ext3

ID_FS_UUID=9269-9FCA
ID_FS_UUID_ENC=9269-9FCA
ID_FS_TYPE=vfat

ID_FS_UUID=9275-D8F7
ID_FS_UUID_ENC=9275-D8F7
ID_FS_TYPE=vfat

ID_FS_UUID=67CDA00432B128C5
ID_FS_UUID_ENC=67CDA00432B128C5
ID_FS_TYPE=ntfs

ID_FS_UUID=15FAB91367B9E2F7
ID_FS_UUID_ENC=15FAB91367B9E2F7
ID_FS_TYPE=ntfs

blkid какой версии?

# blkid --help
blkid: invalid option -- '-'
blkid from util-linux 2.20.1 (libblkid 2.20.0, 19-Oct-2011)

В каталоге /dev/disk/by-partuuid/ есть для нужного диска записи или udev правила тоже не срабатывают?

root@LIN:/dev/disk/by-uuid# ls -1l
итого 0
lrwxrwxrwx 1 root root 10 Сен 29 12:00 15FAB91367B9E2F7 -> ../../sdc4
lrwxrwxrwx 1 root root 10 Сен 28 19:50 36c5be34-179b-4af9-a677-9cd8239c9127 -> ../../sdb2
lrwxrwxrwx 1 root root 10 Сен 29 12:00 67CDA00432B128C5 -> ../../sdc3
lrwxrwxrwx 1 root root 10 Сен 29 12:00 9269-9FCA -> ../../sdc1
lrwxrwxrwx 1 root root 10 Сен 29 12:00 9275-D8F7 -> ../../sdc2
lrwxrwxrwx 1 root root 10 Сен 28 19:54 cbfb2cad-8cc6-4497-a109-fd91e4b185d2 -> ../../sdb1
lrwxrwxrwx 1 root root 10 Сен 28 19:50 eb047a72-374a-47ab-ab4a-2287f5f5001a -> ../../sda1
bugs-bunny
() автор топика
Ответ на: комментарий от pftBest

Почему кривой, это нормальный UUID для этих файловых систем

Для GPT-разделов такие обрубки? Там как раз есть куда запихнуть в 128-байтные элементы таблицы. Для меня загадка - откуда при MBR разбиении они берутся.

bugs-bunny
() автор топика

А вот кусок кода и ссылка, откуда взято было за основу.

    //if( 0xEF==((mbr_t*)buf)->pt[0].os ) // весь диск за MBR представлен как один раздел типа 0xEF == GPT разметка
    {
    	// https://stackoverflow.com/questions/8663643/linux-c-programming-how-to-get-a-devices-partition-infomation
    	blkid_partlist 	ls;
    	int				nparts;
    	blkid_probe 	pr = blkid_new_probe_from_filename(g_hdd_path);

    	printf("Тип MBR определен как \"Guard MBR\" для диска с GPT разметкой\r\n");
    	if(!pr)
    	{
    		printf("Error blkid_new_probe_from_filename(\"%s\")\r\n",g_hdd_path);
    		return -1;
    	}

    	ls = blkid_probe_get_partitions(pr);
    	nparts = blkid_partlist_numof_partitions(ls);
    	printf("Number of partitions:%d\n", nparts);

    	if (nparts <= 0){
    		printf("Please enter correct device name! e.g. \"/dev/sdc\"\n");
    		return;
    	}

    	// Get UUID, label and type
    	const char *uuid;
    	const char *label;
    	const char *type;
    	int			ntype;
    	blkid_partition par;

    	for (i = 0; i < nparts; i++)
    	{
    		char dev_name[20];

    		sprintf(dev_name, "%s%d", g_hdd_path, (i+1));

    		//*
                pr = blkid_new_probe_from_filename(dev_name);
    		blkid_do_probe(pr);

    		blkid_probe_lookup_value(pr, "UUID", &uuid, NULL);
    		blkid_probe_lookup_value(pr, "LABEL", &label, NULL);
    		blkid_probe_lookup_value(pr, "TYPE", &type, NULL);
    		// */

    		par = blkid_partlist_get_partition(ls, i);
    		ntype = blkid_partition_get_type(par);

    		printf("Name=%s, UUID=%s, LABEL=%s, TYPE=%s (%4.4X)\n", dev_name, uuid, label, type, ntype);
    		//printf("Name=%s Type=0x%4.4X\r\n",g_hdd_path,ntype);
    	}
    	blkid_free_probe(pr);
    	return 0;
    }
А это выхлоп, который код дает для /dev/sdb
root@LIN:/home/user/PROJECTS/RescueDisc/utils/jemmy# ./jemmy -b ./ /dev/sdb
Тип MBR определен как "Guard MBR" для диска с GPT разметкой
Number of partitions:2
Name=/dev/sdb1, UUID=cbfb2cad-8cc6-4497-a109-fd91e4b185d2, LABEL=(null), TYPE=ext4 (0083)
Name=/dev/sdb2, UUID=36c5be34-179b-4af9-a677-9cd8239c9127, LABEL=(null), TYPE=swap (0082)
... и /dev/sdc
root@LIN:/home/user/PROJECTS/RescueDisc/utils/jemmy# ./jemmy -b ./ /dev/sdc
Тип MBR определен как "Guard MBR" для диска с GPT разметкой
Number of partitions:4
Name=/dev/sdc1, UUID=9269-9FCA, LABEL=(null), TYPE=vfat (0000)
Name=/dev/sdc2, UUID=9275-D8F7, LABEL=(null), TYPE=vfat (0000)
Name=/dev/sdc3, UUID=67CDA00432B128C5, LABEL=(null), TYPE=ntfs (0000)
Name=/dev/sdc4, UUID=15FAB91367B9E2F7, LABEL=(null), TYPE=ntfs (0000)

bugs-bunny
() автор топика
Ответ на: комментарий от bugs-bunny

После добавления раздела ext3 /dev/sdc5

Number of partitions:5
Name=/dev/sdc1, UUID=9269-9FCA, LABEL=(null), TYPE=vfat (0000)
Name=/dev/sdc2, UUID=9275-D8F7, LABEL=(null), TYPE=vfat (0000)
Name=/dev/sdc3, UUID=67CDA00432B128C5, LABEL=(null), TYPE=ntfs (0000)
Name=/dev/sdc4, UUID=15FAB91367B9E2F7, LABEL=(null), TYPE=ntfs (0000)
Name=/dev/sdc5, UUID=d83da538-19a7-4ab2-9e09-fa1b6b2e51eb, LABEL=sdc5, TYPE=ext3 (0000)
Все равно численное значение типа ФС не определяется.

bugs-bunny
() автор топика
Ответ на: комментарий от bugs-bunny

-%% дела все немного правее двинь. И раза четыре всю виртуху свою ребутни .(!)

anonymous
()
Ответ на: комментарий от mandala

Это вообще какая-то лажа. Если посмотреть собственно GPT, там никакой похожей цифири и нет в структурах вида

GUID partition entry format Offset 	Length 	Contents
0 (0x00) 	16 bytes 	Partition type GUID
16 (0x10) 	16 bytes 	Unique partition GUID
32 (0x20) 	8 bytes 	First LBA (little endian)
40 (0x28) 	8 bytes 	Last LBA (inclusive, usually odd)
48 (0x30) 	8 bytes 	Attribute flags (e.g. bit 60 denotes read-only)
56 (0x38) 	72 bytes 	Partition name (36 UTF-16LE code units)
Это не из 1-го или 2-го поля, а из каких-то структур конкретных файловых систем. У FAT есть поле серийника 4 байт, вот похоже его как UUID и отдают.

Никаких типов 0xFE00 нет там, только GUID-ы типов файловых систем. Откуда тот же gdisk предлагает выбрать тип файловой системы как 0xFE00-EFI или 0x0700-NTFS? Видимо просто забито соответствие тип<=>GUID.

bugs-bunny
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.