LINUX.ORG.RU
решено ФорумAdmin

Выравнивание геометрии диска

 ,


1

1

Имею диск

Disk /dev/sda: 1000GB
Sector size (logical/physical): 512B/4096B
Partition Table: gpt
На нем создал разделы (parted):
Number  Start   End     Size    File system  Name                 Flags
 1      20.5kB  1069kB  1049kB               BIOS boot partition  bios_grub
 2      1069kB  1000GB  1000GB               Linux RAID           raid
или в секторах (gdisk):
Number  Start (sector)    End (sector)  Size       Code  Name
   1              40            2087   1024.0 KiB  EF02  BIOS boot partition
   2            2088      1953525134   931.5 GiB   FD00  Linux RAID
Вопрос

  • Необходимо ли выравнивать «честные» винчестеры, которые не эмулируют реальный физический сектор 4096B в виртуальный 512B?
  • Если да, то верно ли выровнен представленный диск (Подозреваю что нет, нужно пару секторов выкинуть что бы все стало делиться на 8)?
★★★★★

Последнее исправление: cetjs2 (всего исправлений: 2)
Ответ на: комментарий от petav

Не увидел в статье, что это справедливо ТОЛЬКО для WD. Выравнивать 4Кб диски лучше всегда. Разделы у тебя выровнены. единственное - это последний сектор на втором разделе «не полный»-4Кб.

Chumka ★★★
()
Ответ на: комментарий от Kroz

fdisk не работает с GPT, не для моего случая. А статью видел!

petav ★★★★★
() автор топика
Ответ на: комментарий от Chumka

Так все ровно

Total free space is 12 sectors (6.0 KiB)

Number  Start (sector)    End (sector)  Size       Code  Name
   1              40            2087   1024.0 KiB  EF02  BIOS boot partition
   2            2088      1953525128   931.5 GiB   FD00  Linux RAID
petav ★★★★★
() автор топика
Ответ на: комментарий от Kroz

Выравнено по 4кб. Если выравнивать по мегабайту, то EndSector должен быть 2047.

А зачем по нему?

P. S. В чем достоинство GPT?

Во-первых msdos больше 2T не адресует и скоро выйдет из обихода. Во-вторых скорость работы.

petav ★★★★★
() автор топика
Ответ на: комментарий от petav

А зачем по нему?

Ну, согласно той статье. То есть чтобы один раз запомнить и потом не париться: SSD у тебя, рейд или что-то еще.

Опять же - мой мессадж был таков: если ты хотел выравнивать по 4кб - то да!

Во-вторых скорость работы.

В каких случаях? Когда проявляется?

Kroz ★★★★★
()
Ответ на: комментарий от Kroz

Информацией не обладаю. Надо тестить или готовые тесты искать. Вот для затравки.

petav ★★★★★
() автор топика

Необходимо ли выравнивать «честные» винчестеры, которые не эмулируют реальный физический сектор 4096B в виртуальный 512B?

Да, необходимо, иначе просто не сможешь прочитать данные. А те, которые рапортуют logical sector size в 4096 байт, существуют только в виде инженерных образцов.

i-rinat ★★★★★
()
Ответ на: комментарий от i-rinat

Что-то я понять не могу. Один диск Partitions will be aligned on 8-sector boundaries

Command (? for help): p
Disk /dev/sda: 1953525168 sectors, 931.5 GiB
Logical sector size: 512 bytes
Disk identifier (GUID): 2710D8EF-4BA5-417E-9A71-F29508281DE6
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 1953525134
Partitions will be aligned on 8-sector boundaries
Total free space is 6 sectors (3.0 KiB)

Number  Start (sector)    End (sector)  Size       Code  Name
   1              40            2087   1024.0 KiB  EF02  BIOS boot partition
   2            2088      1953525134   931.5 GiB   FD00  Linux RAID

Второй Partitions will be aligned on 2048-sector boundaries
Command (? for help): p
Disk /dev/sdb: 1953525168 sectors, 931.5 GiB
Logical sector size: 512 bytes
Disk identifier (GUID): F396F739-049C-4EFE-AFD3-B11E062988F6
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 1953525134
Partitions will be aligned on 2048-sector boundaries
Total free space is 4067 sectors (2.0 MiB)

Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048            4096   1.0 MiB     EF02  BIOS boot partition
   2            6144      1953525128   931.5 GiB   FD00  Linux RAID

Что то я не пойму как это получилось. Нам надо по 4 сектора выравнивать ведь? P.S.: Зря сразу написал. надо бы еще подумать

petav ★★★★★
() автор топика
Ответ на: комментарий от petav

Нам надо по 4 сектора выравнивать ведь?

8 секторов по 512 байт == 4096 байт

Что то я не пойму как это получилось

формально достаточно выравнивать на 8 секторов. Но часто гранулярность выбирают в 1 МиБ.

i-rinat ★★★★★
()
Ответ на: комментарий от i-rinat

Но часто гранулярность выбирают в 1 МиБ.

Пользуюсь gdisk. 4 одинаковых железки, две он выбрал по 2048-sector, 2 по 8-sector. Методов воздействия на скорую руку не нашел

petav ★★★★★
() автор топика
Ответ на: комментарий от petav

Методов воздействия на скорую руку не нашел

Анализирует существовавшие на момент запуска программы разделы, как я понял.

// Compute sector alignment based on the current partitions (if any). Each
// partition's starting LBA is examined, and if it's divisible by a power-of-2
// value less than or equal to the DEFAULT_ALIGNMENT value (adjusted for the
// sector size), but not by the previously-located alignment value, then the
// alignment value is adjusted down. If the computed alignment is less than 8
// and the disk is bigger than SMALLEST_ADVANCED_FORMAT, resets it to 8. This
// is a safety measure for WD Advanced Format and similar drives. If no partitions
// are defined, the alignment value is set to DEFAULT_ALIGNMENT (2048) (or an
// adjustment of that based on the current sector size). The result is that new
// drives are aligned to 2048-sector multiples but the program won't complain
// about other alignments on existing disks unless a smaller-than-8 alignment
// is used on big disks (as safety for WD Advanced Format drives).
// Returns the computed alignment value.
uint32_t GPTData::ComputeAlignment(void) {
   uint32_t i = 0, found, exponent = 31;
   uint32_t align = DEFAULT_ALIGNMENT;

   if (blockSize > 0)
      align = DEFAULT_ALIGNMENT * SECTOR_SIZE / blockSize;
   exponent = (uint32_t) log2(align);
   for (i = 0; i < numParts; i++) {
      if (partitions[i].IsUsed()) {
         found = 0;
         while (!found) {
            align = UINT64_C(1) << exponent;
            if ((partitions[i].GetFirstLBA() % align) == 0) {
               found = 1;
            } else {
               exponent--;
            } // if/else
         } // while
      } // if
   } // for
   if ((align < MIN_AF_ALIGNMENT) && (diskSize >= SMALLEST_ADVANCED_FORMAT))
      align = MIN_AF_ALIGNMENT;
   sectorAlignment = align;
   return align;
} // GPTData::ComputeAlignment()
i-rinat ★★★★★
()
Ответ на: комментарий от i-rinat

gdisk выравнивает только стартовые сектора, конечные самостоятельно.

petav ★★★★★
() автор топика
Ответ на: комментарий от teod0r

с чего это? 2048!

Потому что сектора нумеруются с нуля.

Kroz ★★★★★
()

Все бестолку, не победил поддержку gpt биосом, партицировал msdos

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