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

Материал из megapuper
Перейти к: навигация, поиск

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


В общей сложности 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
Geom name: da0
modified: false
state: OK
 fwheads: 255
fwsectors: 63
last: 204800002014
first: 34
entries: 128
scheme: GPT
Providers:
1. Name: da0p1
   Mediasize: 524288 (512k)
   Sectorsize: 512
   Stripesize: 0
   Stripeoffset: 17408
   Mode: r0w0e0
   rawuuid: 10ae9e6a-05bd-11e2-aa6b-029027563214
   rawtype: 83bd6b9d-7f41-11dc-be0b-001560b84f0f
   label: bootloader
   length: 524288
   offset: 17408
   type: freebsd-boot
   index: 1
   end: 1057
   start: 34
2. Name: da0p2
   Mediasize: 2147483648 (2.0G)
   Sectorsize: 512
   Stripesize: 0
   Stripeoffset: 1048576
   Mode: r0w0e0
   rawuuid: 6c5ee645-05be-11e2-aa6b-029027563214
   rawtype: 516e7cb6-6ecf-11d6-8ff8-00022d09712b
   label: rootfs
   length: 2147483648
   offset: 1048576
   type: freebsd-ufs
   index: 2
    end: 4196351
   start: 2048
3. Name: da0p3
   Mediasize: 10737418240 (10G)
   Sectorsize: 512
   Stripesize: 0
   Stripeoffset: 2148532224
   Mode: r0w0e0
   rawuuid: 9c5dcb02-05be-11e2-aa6b-029027563214
   rawtype: 516e7cb6-6ecf-11d6-8ff8-00022d09712b
   label: temp
   length: 10737418240
   offset: 2148532224
   type: freebsd-ufs
   index: 3
   end: 25167871
   start: 4196352
4. Name: da0p4
   Mediasize: 21474836480 (20G)
   Sectorsize: 512
   Stripesize: 0
   Stripeoffset: 1048576
   Mode: r0w0e0
   rawuuid: b2ef99b9-05be-11e2-aa6b-029027563214
   rawtype: 516e7cb6-6ecf-11d6-8ff8-00022d09712b
   label: var
   length: 21474836480
   offset: 12885950464
   type: freebsd-ufs
   index: 4
   end: 67110911
   start: 25167872
5 . Name: da0p5
   Mediasize: 107374182400 (100G)
   Sectorsize: 512
   Stripesize: 0
   Stripeoffset: 1048576
   Mode: r0w0e0
   rawuuid: d803658f-05be-11e2-aa6b-029027563214
   rawtype: 516e7cb6-6ecf-11d6-8ff8-00022d09712b
   label: usr
   length: 107374182400
   offset: 34360786944
   type: freebsd-ufs
   index: 5
    end: 276826111
   start: 67110912
6. Name: da0p6
   Mediasize: 34359738368 (32G)
   Sectorsize: 512
   Stripesize: 0
   Stripeoffset: 1048576
   Mode: r0w0e0
   rawuuid: e630677a-05be-11e2-aa6b-029027563214
   rawtype: 516e7cb5-6ecf-11d6-8ff8-00022d09712b
   label: swap0
   length: 34359738368
   offset: 141734969344
   type: freebsd-swap
   index: 6
   end: 343934975
    start: 276826112
7. Name: da0p7
   Mediasize: 536870912000 (500G)
   Sectorsize: 512
   Stripesize: 0
   Stripeoffset: 1048576
   Mode: r0w0e0
   rawuuid: f9ec88c7-05be-11e2-aa6b-029027563214
   rawtype: 516e7cb6-6ecf-11d6-8ff8-00022d09712b
   label: home
   length: 536870912000
   offset: 176094707712
   type: freebsd-ufs
   index: 7
   end: 1392510975
   start: 343934976
8. Name: da0p8
   Mediasize: 43980465111040 (40T)
   Sectorsize: 512
   Stripesize: 0
   Stripeoffset: 1048576
   Mode: r0w0e0
   rawuuid: 5fef5839-05c0-11e2-aa6b-029027563214
   rawtype: 516e7cb6-6ecf-11d6-8ff8-00022d09712b
   label: data_ufs
   length: 43980465111040
   offset: 712965619712
   type: freebsd-ufs
   index: 8
   end: 87291856895
   start: 1392510976
 9. Name: da0p9
   Mediasize: 60164170300928 (54T)
   Sectorsize: 512
   Stripesize: 0
   Stripeoffset: 1048576
   Mode: r0w0e0
   rawuuid: 67aa36f6-05c0-11e2-aa6b-029027563214
   rawtype: 516e7cba-6ecf-11d6-8ff8-00022d09712b
   label: data_zfs
   length: 60164170300928
   offset: 44693430730752
   type: freebsd-zfs
   index: 9
   end: 204800002014
   start: 87291856896
   Consumers:
1. Name: da0
   Mediasize: 104857601048576 (95T)
   Sectorsize: 512
   Mode: r0w0e0

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