Разметка диска
Разметка диска
Подавляющее большинство накопителей энергонезависимой памяти сегодня разделены на блоки данных (исторически 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