Разбивка диска с помощью GPT — различия между версиями

Материал из megapuper
Перейти к: навигация, поиск
Строка 129: Строка 129:
 
  # newfs /dev/da0p*
 
  # newfs /dev/da0p*
  
<spoiler>
+
 
Детальная информация хранящаяся в GPT  
+
Детальная информация хранящаяся в GPT
root@test:/home # gpart list da0
+
root@test:/home # gpart list da0
Geom name: da0
+
Geom name: da0
modified: false
+
modified: false
state: OK
+
state: OK
  fwheads: 255
+
fwheads: 255
fwsectors: 63
+
fwsectors: 63
last: 204800002014
+
last: 204800002014
first: 34
+
first: 34
entries: 128
+
entries: 128
scheme: GPT
+
scheme: GPT
Providers:
+
Providers:<spoiler>
1. Name: da0p1
+
1. Name: da0p1
    Mediasize: 524288 (512k)
+
  Mediasize: 524288 (512k)
    Sectorsize: 512
+
  Sectorsize: 512
    Stripesize: 0
+
  Stripesize: 0
    Stripeoffset: 17408
+
  Stripeoffset: 17408
    Mode: r0w0e0
+
  Mode: r0w0e0
    rawuuid: 10ae9e6a-05bd-11e2-aa6b-029027563214
+
  rawuuid: 10ae9e6a-05bd-11e2-aa6b-029027563214
    rawtype: 83bd6b9d-7f41-11dc-be0b-001560b84f0f
+
  rawtype: 83bd6b9d-7f41-11dc-be0b-001560b84f0f
    label: bootloader
+
  label: bootloader
    length: 524288
+
  length: 524288
    offset: 17408
+
  offset: 17408
    type: freebsd-boot
+
  type: freebsd-boot
    index: 1
+
  index: 1
    end: 1057
+
  end: 1057
    start: 34
+
  start: 34
2. Name: da0p2
+
2. Name: da0p2
    Mediasize: 2147483648 (2.0G)
+
  Mediasize: 2147483648 (2.0G)
    Sectorsize: 512
+
  Sectorsize: 512
    Stripesize: 0
+
  Stripesize: 0
    Stripeoffset: 1048576
+
  Stripeoffset: 1048576
    Mode: r0w0e0
+
  Mode: r0w0e0
 
     rawuuid: 6c5ee645-05be-11e2-aa6b-029027563214
 
     rawuuid: 6c5ee645-05be-11e2-aa6b-029027563214
 
     rawtype: 516e7cb6-6ecf-11d6-8ff8-00022d09712b
 
     rawtype: 516e7cb6-6ecf-11d6-8ff8-00022d09712b

Версия 20:20, 3 декабря 2013

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

В далеком 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 Geom name: da0 modified: false state: OK

fwheads: 255

fwsectors: 63 last: 204800002014 first: 34 entries: 128 scheme: GPT Providers:Spoiler


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