Разбивка диска с помощью GPT
Немного истории :)
В далеком 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
Тут мы видим всю подробную информацию о разделах. Так-же тут видны метки и UUID разделов. UUID это дополнительный идентификатор, который присваивается каждому разделу при создании, по этому идентификатору так-же как и по метке можно обращаться к разделу, но через путь /dev/gptid/…UID…