Разбивка диска с помощью GPT

Материал из megapuper
Версия от 16:01, 1 августа 2014; Root (обсуждение | вклад)
(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к: навигация, поиск

Немного истории :)

В далеком 1983 году для разбиения диска не несколько логических для компьютеров IBM был разработан формат MBR, в дальнейшем он претерпел ряд небольших изменений (чтобы соответствовать современным требованиям). Аббревиатура MBR обозначает Master Boot Record - главная загрузочная запись. В самом начале MBR хранится загрузчик, его длина в в первой версии MBR не превышает 446 байт, а в следующих версиях он существенно меньше. После загрузчика оставшееся место занимает партиционная таблица (таблица разделов), которая может содержать до 4х разделов.

В общей сложности MBR занимает всего 512 байт. Во времена DOS не было никаких проблем с загрузчиком на 440 байт, однако очевидно что 440 байт совершенно недостаточно для загрузчика современных операционных систем. Кроме того, 4х разделов в последнее время тоже часто недостаточно.

Для решения первой проблемы (с загрузкой) разработчики операционных систем стали помещать вторые загрузчики(ntldr, Lilo, Grub, и др.) в первые сектора разделов, в которых находится операционная система, в этом случае размер загрузчика практически не ограничен, загрузчику из MBR в этом случае требуется только найти раздел, загрузить в память начало второго загрузчика и передать ему управление.

Со второй проблемой каждый производитель стал бороться по своему, но смысл у всех одинаковый: создается раздел, внутри которого имеется партиционная таблица в своем формате, внутри нее находятся разделы: у Microsoft это Extended Partition (расширенный раздел) у FreeBSD, Solaris и ряда других это BSD Disklabel, у остальных производителей ряд менее известных форматов, таких как Apple Partition Map, Logical Disk Manager, VTOC (Volume Table Of Contents). Однако с ростом объема дисков появилась третья проблема: по скольку в MBR используется 32 битная адресация, то при размере сектора 512 байт мы наблюдаем лимит в 2 ТБ (не надо мне говорить о 4кб секторах у новых дисков, с ними, в большинстве случает, MBR тоже не дружит :)). Итак, встречаем GPT (GUID Partition Table).

Сам по себе GPT существенно больше, он может содержать огромное кол-во разделов (65535, но многие ОС накладывают дополнительные ограничения, обычно это 128 разделов, в FreeBSD лимит можно установить при создании GPT), для каждого раздела можно задать метку. Кроме того для каждого раздела и всего диска вцелом имеются уникальные идентификаторы, и теперь при любых перемещениях дисков найти нужный диск по идентификатору не составит проблем. Для загрузчика, обычно, выделяется отдельный раздел, и лимитов на размер загрузчика в этом случае нет. Кроме того, GPT использует 64 битную адресацию, что позволяет адресовать диски до 8 Зетабайт (8589934592 ТБ) при размере сектора 512 байт(при больших секторах - максимальный размер, соответственно, увеличивается).

В FreeBSD исторически для разметки дисков используется утилита fdisk, а затем, для создания разделов внутри BSD Disklabel утилита disklabel. В FreeBSD использование disklabel является обязательным для загрузочного раздела на MBR. Разделы, загрузка с которых не требуется, могут находиться на любом поддерживаемом разделе. С появлением GPT в FreeBSD появилась замечательная утилита gpart, которая поддерживает не только GPT, но и MBR, APM, BSD, LDM, PC98 и VTOC8.


И так перейдём к практике. Для просмотра состояния винтов воспользуемся командой gpart show:

root@test:/ # gpart show
=>        34  2930274988  ada0  GPT  (1.4T)
          34         128     1  freebsd-boot  (64k)
         162    16777216     2  freebsd-swap  (8.0G)
    16777378    33554432        - free -  (16G)
    50331810   209715200     4  freebsd-ufs  (100G)
   260047010     8388608     3  freebsd-ufs  (4.0G)
   268435618    16777216     5  freebsd-ufs  (8.0G)
   285212834    33554432     6  freebsd-ufs  (16G)
   318767266  2610954240     7  freebsd-ufs  (1.2T)
  2929721506      553516        - free -  (270M)

=>        63  4294967232  da0  MBR  (95T)
          63  4294967232       - free -  (2T)


Тут мы наблюдаем что имеется 2 диска, на 1.4Тб и 95Тб (массив). Диск 95 Тб сейчас размечен MBR и использовать можно всего 2Тб. Удаляем с него MBR и создадём там GPT.

root@test:/home # gpart destroy da0
da0 destroyed
root@test:/home # gpart create -s GPT da0
da0 created
root@test:/home # gpart show da0
=>          34  204800001981  da0  GPT  (95T)
            34  204800001981       - free -  (95T)


Теперь видно что все 95 Тб диска доступны для использования. Теперь, предположим, что требуется на этот диск установить ОС, разделив корень, /usr /home /var и /tmp и сделать пару больших разделов под данные. Итак, для загрузки надо создать маленький раздел с загрузчиком в начале диска. В начале диска его необходимо размещать, для совместимости с материнскими платами, которые еще не поддерживают загрузку с больших дисков. На новых материнских платах с EFI этот раздел размещать можно где угодно. Затем в этот раздел запишем загрузчик.

root@test:/home # gpart add -t freebsd-boot -l bootloader -s 512K da0
da0p1 added
root@test:/home # gpart bootcode -b /boot/pmbr -p /boot/gptboot -i 1 da0
bootcode written to da0
root@test:/home # gpart show da0
=>          34  204800001981  da0  GPT  (95T)
            34          1024    1  freebsd-boot  (512k)
          1058  204800000957       - free -  (95T)


Итак, что мы имеем: мы создали раздел 512Кб, указав тип freebsd-boot и дали ему метку bootloader. Затем записали 2 загрузчика: первый загрузчик из файла /boot/pmbr в то место, где загрузчик находится в случае MBR (это для материнских плат не поддерживающих или не полностью поддерживающих GPT) и второй загрузчик /boot/gptboot мы кладем в раздел номер 1 (-i 1). Кроме того, наименование разделов тоже становится другим, с MBR разделы именовались da0s1, da0s2a, da0s2b…, теперь da0p1, da0p2, da0p3, а поскольку необходимость в BSD Disklabel теперь пропадает то меток a,b,d,… от disklabel больше нет.


Создадим остальные разделы для нашей ОС:

root@test:/home # gpart add -t freebsd-ufs -l rootfs -b 1M -s 2G da0
da0p2 added
root@test:/home # gpart add -t freebsd-ufs -l temp -s 10G da0
da0p3 added
root@test:/home # gpart add -t freebsd-ufs -l var -s 20G da0
da0p4 added
root@test:/home # gpart add -t freebsd-ufs -l usr -s 100G da0
da0p5 added
root@test:/home # gpart add -t freebsd-swap -l swap0 -s 32G da0
da0p6 added
root@test:/home # gpart add -t freebsd-ufs -l home -s 500G da0
da0p7 added
root@test:/home # gpart show da0
=>          34  204800001981  da0  GPT  (95T)
            34          1024    1  freebsd-boot  (512k)
          1058           990       - free -  (495k)
          2048       4194304    2  freebsd-ufs  (2.0G)
       4196352      20971520    3  freebsd-ufs  (10G)
      25167872      41943040    4  freebsd-ufs  (20G)
      67110912     209715200    5  freebsd-ufs  (100G)
     276826112      67108864    6  freebsd-swap  (32G)
     343934976    1048576000    7  freebsd-ufs  (500G)
    1392510976  203407491039       - free -  (94T)


Итак, первый раздел мы создали, отступив от начала 1Мб (для правильного выравнивания раздела в случае диска с 4КБ секторами), далее создаем по порядку необходимые нам разделы. gpart сам посчитает начальные блоки и длину из указанных ему размеров. Кроме того на всех разделах мы задали метку, и обращаться к таким разделам теперь можно через /dev/gpt/… root@test:/home # ls /dev/gpt bootloader home rootfs swap0 temp usr var

Что очень удобно, это будет работать независимо от компьютера, контроллера и даже, независимо от отперационной системы (если ОС поддерживает GPT и метки).


Ну и наконец заполним оставшееся место

root@test:/home # gpart add -t freebsd-ufs -l data da0
da0p8 added
root@test:/home # gpart show da0
=>          34  204800001981  da0  GPT  (95T)
            34          1024    1  freebsd-boot  (512k)
          1058           990       - free -  (495k)
          2048       4194304    2  freebsd-ufs  (2.0G)
       4196352      20971520    3  freebsd-ufs  (10G)
      25167872      41943040    4  freebsd-ufs  (20G)
      67110912     209715200    5  freebsd-ufs  (100G)
     276826112      67108864    6  freebsd-swap  (32G)
     343934976    1048576000    7  freebsd-ufs  (500G)
    1392510976  203407491039    8  freebsd-ufs  (94T)


Как видим раздел занял все оставшееся место. Немного подумав, решаем создать там 2 раздела.

root@test:/home # gpart delete -i 8 da0
da0p8 deleted
root@test:/home # gpart add -t freebsd-ufs -l data_ufs -s 40T da0
da0p8 added
root@test:/home # gpart add -t freebsd-zfs -l data_zfs  da0
da0p9 added
root@test:/home # gpart show da0
=>          34  204800001981  da0  GPT  (95T)
            34          1024    1  freebsd-boot  (512k)
          1058           990       - free -  (495k)
          2048       4194304    2  freebsd-ufs  (2.0G)
       4196352      20971520    3  freebsd-ufs  (10G)
      25167872      41943040    4  freebsd-ufs  (20G)
      67110912     209715200    5  freebsd-ufs  (100G)
     276826112      67108864    6  freebsd-swap  (32G)
     343934976    1048576000    7  freebsd-ufs  (500G)
    1392510976   85899345920    8  freebsd-ufs  (40T)
   87291856896  117508145119    9  freebsd-zfs  (54T)


Ну вот, теперь осталось созданные разделы отформатировать

# newfs /dev/da0p*


Детальная информация хранящаяся в GPT

root@test:/home # gpart list da0

Spoiler


Тут мы видим всю подробную информацию о разделах. Так-же тут видны метки и UUID разделов. UUID это дополнительный идентификатор, который присваивается каждому разделу при создании, по этому идентификатору так-же как и по метке можно обращаться к разделу, но через путь /dev/gptid/…UID…