Разметка диска

Материал из ALT Linux Wiki

Разметка диска

Подавляющее большинство накопителей энергонезависимой памяти сегодня разделены на блоки данных (исторически 512 байт размером). Те, что позволяют обращаться к каждому своему байту, всё равно для Linux прикидываются блочными. Это сначала было обусловлено физической базой хранящих информацию элементов, а после оказалось просто удобно: данные сбрасываются на накопитель и прочитываются оттуда группами, чтобы не нагружать устройство командами ввода-вывода и ускорить запись и чтение, и чаще это группы шире по размеру, чем блок.

Для ОС накопитель выглядит как линейная последовательность блоков; адрес блока, LBA — целое положительное число. Часть блоков не доступны пользователю машины, куда подключен накопитель (далее "диск", англ. disk), а используются для хранения метаданных. Например, если на диске размещено системное ПО (ОС, её загрузчик, бинарный транслятор привилегированного режима...), компьютер должен понять, откуда его читать; лучше не фиксировать принятие этого решения в аппаратуре, а прочесть с диска. Кроме того, диск может быть удобно разбить на зоны, с которыми машина работает по-разному. Для этого несколько причин:

  • на диске может быть несколько версий или копий размещённых данных;
  • разные участки диска можно подвергнуть разной дисциплине хранения:
    • кольцевой массив записей и очередь на нём
    • древовидная структура, или более сложный граф
    • файловая система
    • пространство подкачки
    • контрольные суммы или подписи данных из другого участка
    • пустое зарезервированное место

Разметка диска — это занесение на диск правильно оформленной информации о самом диске и зонах (разделах), на которые он разбит, а схема разделов — соглашение, по которому эта инфа оформлена. Бывают накопители и без схемы разделов вовсе, фактически они целиком выступают как один раздел. Зачастую так оформляют сменные носители.

От загрузочного диска с ОС ожидают, что на нём будет схема разделов.

Сложилось несколько распространённых соглашений о разделах:

  • GPT (GUID Partition Table), ныне самая популярная схема;
  • MBR (Master Boot Record, IBM PC, 1983 г.) была распространена на x86 до 2020 г.;
  • BSD, Sun, Amiga...

Инструменты в наших репозиториях (parted, util-linux) умеют все их читать на случай, если вы наткнётесь на существующий носитель с такими схемами.

Пример размеченного диска

% lsblk -o name,start,size,parttype,partuuid,uuid,label /dev/nvme0n1
NAME             START  SIZE PARTTYPE                             PARTUUID                             UUID                                 LABEL
nvme0n1                 1.8T                                                                                                                
|-nvme0n1p1       2048  300M c12a7328-f81f-11d2-ba4b-00a0c93ec93b fc892c92-19c7-48d7-b4aa-11a7d9ee8076 AC79-39F3                            SYSTEM
|-nvme0n1p2     616448   16M e3c9e316-0b5c-4db8-817d-f92df00215ae ed80b2a3-d821-4d0f-9b0a-b06f56487bf8                                      
|-nvme0n1p3     649216  120G ebd0a0a2-b9e5-4433-87c0-68b6b72699c7 f13041f1-cab9-4225-66c9-558df429ecb7                                      
|-nvme0n1p4  252307456 44.7G 0fc63daf-8483-4772-8e79-3d69d8477de4 702ad624-9e59-4fd7-b28b-a187b8a1c113                                      
|-nvme0n1p5  346030080   35G 0657fd6d-a4ab-43c4-84e5-0933c84b4f4f b8ff3637-321f-4a98-89b0-69d7ab51e5bd ee5d9140-0d14-49ec-865c-7441143a9fb1 
|-nvme0n1p6  419430400  1.6T 0fc63daf-8483-4772-8e79-3d69d8477de4 8d759ce8-5873-47ca-fb00-d007612c98b3 626d1460-1d0d-40f3-8f57-ca2bdddcb838 
`-nvme0n1p7 3904980992 1000M de94bba4-06d1-4d40-a16a-bfd50179d6ac 441adc14-5762-40c3-6cfa-a61ff66ad1e5 866B43F8939F3E6F                     Recovery

В поле Start указан адрес 512-байтного блока (называют сектором), с которого начинается раздел. Видно, что перед началом /dev/nvme0n1p1 отступили 2048 * 512 = 2**20 байт или 1M места, размер этого раздела 300M = (300 * 2048) * 512 = 614400 секторов, и первым сектором, не входящим в этот раздел, будет 614400 + 2048 = 616448. Далее видно, что этот же сектор является начальным для /dev/nvme0n1p2, и т. д. Утилита fdisk выводит в другом виде:

% fdisk -l /dev/nvme0n1
Disk /dev/nvme0n1: 1.82 TiB, 2000398934016 bytes, 3907029168 sectors
Disk model: MSI M461 2TB                            
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: CADBFD5B-4E1E-F370-5DFBF85AB33E5D461

Device              Start        End    Sectors  Size Type
/dev/nvme0n1p1       2048     616447     614400  300M EFI System
/dev/nvme0n1p2     616448     649215      32768   16M Microsoft reserved
/dev/nvme0n1p3     649216  252307455  251658240  120G Microsoft basic data
/dev/nvme0n1p4  252307456  346030079   93722624 44.7G Linux filesystem
/dev/nvme0n1p5  346030080  419430399   73400320   35G Linux swap
/dev/nvme0n1p6  419430400 3904980991 3485550592  1.6T Linux filesystem
/dev/nvme0n1p7 3904980992 3907028991    2048000 1000M Windows recovery environment

У раздела /dev/nvme0n1p5 parttype равен 0657fd6d-a4ab-43c4-84e5-0933c84b4f4f, что означает Linux swap; аналогично все остальные.

Хочу поставить альт вручную. Как разметить?

TODO: указать на риск потери данных от разметки

Лучший выбор на сегодня — GPT.

Все устройства, на которые можно установить Альт, могут грузиться с носителя, размеченного в соответствии с GPT. GUID Partition Table, в отличие от ряда альтернатив, не зависит от архитектуры и аппаратной платформы и может указывать на блоки адресом > 2T. Количество разделов формально не ограничено и фиксируется в момент создания таблицы. Для каждого раздела можно сохранить тип формата данных на нём, ID раздела, не зависящий от содержимого.

TODO: разжевать. Начнём работу с fdisk.

Есть ещё GNU PartEd; в чём-то она удобнее, иного не умеет. Ни parted, ни fdisk не превосходят друг друга.

Без -n, если схемы разделов нет, она создаст MBR (msdos):

fdisk -n /dev/vda

fdisk принимает команды с клавиатуры; ввод завершается клавишей Enter.

g

fdisk создаст пустую GPT.

n

fdisk задаст несколько вопросов (можно дать пустые ответы) и создаст раздел. Чтобы создать несколько разделов, команды надо повторить. Крайне желательно назначать разделам правильные типы по их назначению; в отличие от parted и gdisk, fdisk содержит встроенную справку по имеющимся типам и принимает для часто встречающихся типов осмысленные сокращения (uefi, home, swap...).

"Форматирование" разделов: создание файловых систем

TODO: указать на риск потери данных Расставить границы разделов недостаточно; чтобы использовать разделы, надо их отформатировать. На выбор:

mkfs --type ext4 -m 1 /dev/vda2
mkfs --type xfs /dev/vda2
mkfs --type btrfs /dev/vda2
mkfs --type vfat -L ESP /dev/vda1

Есть и другие типы файловых систем. mkfs.* для каждой файловой системы принимают свой набор опций, свойственных реализации этой ФС.

Чрезмерно умные файловые системы

Если вы решили применять btrfs, zfs или иную "ФС XXI века", то вот несколько советов.

Несмотря на то, что все такие ФС стремятся стать центром метаданных носителя, поддерживают объединение нескольких устройств в массив хранения и т. д., всё равно создайте схему разделов.

  • Если диск загрузочный, то вам понадобится хотя бы один второй раздел (в случае с MBR — формально неразмеченное пространство, где будет лежать загрузчик)
  • Её можно будет прочитать в системе, которая совсем ничего не знает про эту ФС.
  • На SSD для продления срока службы и уменьшения нагрузки на контроллер распределения блоков полезно оставлять 5-10% пространства неразмеченным; фактически это будут резервные ячейки.

Все такие ФС поддерживают subvolumes и snapshots. Если вы планируете полагаться на subvolumes, не монтируйте корень раздела в качестве корня; вместо этого положите туда ряд томов и монтируйте их:

mount PARTUUID=05af49e3-8d27-4c16-b012-3456789abcde -o subvol=/root /mnt
mount PARTUUID=05af49e3-8d27-4c16-b012-3456789abcde -o subvol=/home /mnt/home
  • Если вы видите смысл в том, чтобы делать снимки состояния конкретного поддерева файлов на ФС, вынесите его в отдельный subvolume (том)
  • Если нужно исключить поддерево файлов на ФС из снимков, вынесите его в отдельный том, но монтируйте как поддерево.
mount /dev/vda -o subvol=/var-cache /mnt/var/cache
mount /dev/vda -o subvol=/var-tmp /mnt/var/tmp