По аналогии с #23848 надо сделать выравнивание начала создаваемых разделов на границу мегабайта/2048s (4K-диски, SSD, striped RAID). Похоже, plugins/gpt/gptsegmgr.c до сих пор грезит цилиндрами. Коммит для dos ptbl: 0298c9007d712b36a1f0eacd840a0e4d28025893
Created attachment 6849 [details] для архива: не сработало Кажется, победил по мотивам 0298c9007d712b36a1f0eacd840a0e4d28025893. Надо патч почистить от первой попытки, в которой попытался проехаться на работающих по цилиндрам функциях -- прилагаю её на всякий...
Просьба к заинтересованным глянуть http://webery.altlinux.org/task/171543 Патч: http://git.altlinux.org/people/mike/packages/?p=evms.git;a=commitdiff;h=fb0b2536cca20fc3ee718900c4670481495078d4 Вот как выглядят у меня два созданных acc гигабайтных раздела на предварительно созданной gdisk'ом GPT: # fdisk -l /dev/sdb Диск /dev/sdb: 111,8 GiB, 120034123776 байт, 234441648 секторов Единицы: секторов по 1 * 512 = 512 байт Размер сектора (логический/физический): 512 байт / 512 байт Размер I/O (минимальный/оптимальный): 512 байт / 512 байт Тип метки диска: gpt Идентификатор диска: 2798949D-1C1E-4025-A350-4FC351F43A95 Устр-во начало Конец Секторы Размер Тип /dev/sdb1 2048 2097151 2095104 1023M Microsoft basic data /dev/sdb2 2097152 4192255 2095104 1023M Microsoft basic data # parted /dev/sdb align-check opt 2 2 выровнен # parted /dev/sdb align-check opt 1 1 выровнен # _
evms-2.5.5-alt35.3 -> sisyphus: * Fri Oct 28 2016 Michael Shigorin <mike@altlinux> 2.5.5-alt35.3 - gpt plugin: just round_up_to_min_boundary() of 1MB/2048s either (closes: #32679) * Fri Oct 28 2016 Michael Shigorin <mike@altlinux> 2.5.5-alt35.2 - dos plugin: just round_up_to_min_boundary() of 1MB/2048s * Thu Oct 27 2016 Michael Shigorin <mike@altlinux> 2.5.5-alt35.1 - revert 2.5.5-alt29 patches by timonbl4@ to avoid collisions * Thu Oct 27 2016 Michael Shigorin <mike@altlinux> 2.5.5-alt35 - apply stanv@'s patch, see #26925 comment 5 (closes: #26925)
В VirtualBox у меня: # fdisk -l /dev/sda Диск /dev/sda: 25 GiB, 26834665472 байт, 52411456 секторов Единицы: секторов по 1 * 512 = 512 байт Размер сектора (логический/физический): 512 байт / 512 байт Размер I/O (минимальный/оптимальный): 512 байт / 512 байт Тип метки диска: gpt Идентификатор диска: 810B0A4C-A02B-DB4B-B210-11AC14C4ABD0 Устр-во начало Конец Секторы Размер Тип /dev/sda1 2048 524287 522240 255M EFI /dev/sda2 524288 538623 14336 7M BIOS boot /dev/sda3 538624 3604479 3065856 1,5G Microsoft basic data /dev/sda4 3604480 35230544 31626065 15,1G Microsoft basic data /dev/sda5 35231744 39178239 3946496 1,9G Microsoft basic data /dev/sda6 39178240 43698175 4519936 2,2G Microsoft basic data /dev/sda7 43698176 47480831 3782656 1,8G Microsoft basic data /dev/sda8 47480832 52402175 4921344 2,4G Microsoft basic data [root@localhost ~]# parted /dev/sda GNU Parted 3.2.46-e4ae Используется /dev/sda Добро пожаловать в GNU Parted! Наберите 'help' для просмотра списка команд. (parted) align-check opt 1 1 выровнен (parted) align-check opt 2 2 выровнен (parted) align-check opt 3 3 выровнен (parted) align-check opt 4 4 выровнен (parted) align-check opt 5 5 выровнен (parted) align-check opt 6 6 выровнен (parted) align-check opt 7 7 выровнен (parted) align-check opt 8 8 выровнен
Спасибо!
Поправил крайние случаи в свежих изменениях, прошу протестировать task 171819 и перечитать код (чем показывать патчи -- там 3 содержательных, остальные косметичесие -- проще чистый код этого кусочка показать): /* * End segment on a minimum alignment boundary. */ { const lba_t next_free_lba = freespace->start + sector_offset + size; seg_end_lba = ( next_free_lba > seg_start_lba ) ? next_free_lba - 1 : seg_start_lba; const lba_t rounded_next_free_lba = round_down_to_min_boundary(next_free_lba); if ( rounded_next_free_lba > seg_start_lba ) seg_end_lba = rounded_next_free_lba - 1; }