Блочные устройства и разделы
Блочное устройство — это диск, представленный как файл в /dev. lsblk показывает дерево устройств и разделов. Раздел — просто диапазон байт на устройстве; GPT и MBR — две схемы записи этих диапазонов.
Ты подключаешь второй диск к серверу. Linux сразу его видит — но прежде чем хранить на нём хоть один файл, нужно понять, что именно Linux тебе предоставляет, что такое «раздел» на самом деле и почему один и тот же диск может появиться как /dev/sda, /dev/nvme0n1 или /dev/vda в зависимости от железа. Без этой базы ты часами будешь разбираться в ошибках вроде «no medium found» или «device or resource busy», пытаясь форматировать или монтировать не тот узел.
Хранение данных в Linux строится в три отдельных слоя: raw block device → раздел → файловая система. Этот урок охватывает нижние два.
После этого урока ты сможешь читать вывод lsblk и различать диски и разделы, объяснить, что означают /dev/sda, /dev/sdb1 и /dev/nvme0n1p2, объяснить разницу между таблицами разделов GPT и MBR и когда какую использовать, описать, почему раздел — это просто диапазон байт на блочном устройстве.
Linux представляет каждое устройство хранения как файл в /dev. Это принцип «всё есть файл», применённый к железу. Файл блочного устройства позволяет ядру и программам с нужными правами читать и записывать сырые байты на устройство фиксированными порциями, называемыми блоками (обычно 512 байт или 4 КиБ).
# Список блочных устройств и их файлов
ls -l /dev/sd* /dev/nvme* 2>/dev/null
# brw-rw---- 1 root disk 8, 0 Jun 21 09:00 /dev/sda
# brw-rw---- 1 root disk 8, 1 Jun 21 09:00 /dev/sda1
# brw-rw---- 1 root disk 8, 2 Jun 21 09:00 /dev/sda2
# brw-rw---- 1 root disk 259, 0 Jun 21 09:00 /dev/nvme0n1
# brw-rw---- 1 root disk 259, 1 Jun 21 09:00 /dev/nvme0n1p1
# 'b' в начале = блочное устройство (vs 'c' = символьное, '-' = обычный файл)
# Числа (8, 0) — major:minor; major определяет драйвер, minor — конкретное устройствоСоглашение об именовании отражает тип железа:
/dev/sda— SCSI или SATA-диск (также USB-накопители и большинство VM);b= второй диск,c= третий./dev/nvme0n1— NVMe SSD;nvme0= первый контроллер NVMe,n1= первое пространство имён на нём./dev/vda— virtio-диск (KVM/QEMU VM)./dev/mmcblk0— eMMC или SD-карта (Raspberry Pi, встраиваемые устройства).
lsblk — правильный инструмент для понимания топологии дисков. Он выводит дерево блочных устройств и разделов с размерами и точками монтирования. Запускай его перед любыми манипуляциями с диском.
lsblk
# NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
# sda 8:0 0 500G 0 disk
# ├─sda1 8:1 0 512M 0 part /boot/efi
# ├─sda2 8:2 0 1G 0 part /boot
# └─sda3 8:3 0 498.5G 0 part /
# nvme0n1 259:0 0 1T 0 disk
# └─nvme0n1p1 259:1 0 1T 0 part /data
# Показать тип файловой системы и UUID (полезно перед редактированием fstab)
lsblk -f
# NAME FSTYPE FSVER LABEL UUID FSAVAIL FSUSE% MOUNTPOINTS
# sda
# ├─sda1 vfat FAT32 C7A2-1234 505.4M 1% /boot/efi
# ├─sda2 ext4 1.0 a1b2c3d4-... 800.5M 13% /boot
# └─sda3 ext4 1.0 e5f6a7b8-... 390.1G 17% /
# nvme0n1
# └─nvme0n1p1 xfs 9f8e7d6c-... 950.2G 5% /data
# Размеры в байтах (для скриптов)
lsblk -b -o NAME,SIZE,TYPEКлючевые столбцы: NAME (файл устройства), SIZE (по умолчанию в читаемом формате), TYPE (disk = целое устройство, part = раздел, lvm = логический том LVM), MOUNTPOINTS (куда смонтировано, если вообще смонтировано).
Раздел — не что иное, как диапазон байт на блочном устройстве. Таблица разделов в начале диска хранит список этих диапазонов: «раздел 1 начинается с сектора 2048, заканчивается на секторе 1050623». Ядро читает эту таблицу при загрузке и создаёт файл устройства для каждой записи (/dev/sda1, /dev/sda2 и т.д.).
# Просмотреть сырую таблицу разделов (GPT-диск)
sudo fdisk -l /dev/sda
# Disk /dev/sda: 500 GiB, 536870912000 bytes, 1048576000 sectors
# Disk model: Samsung SSD 870
# Units: sectors of 1 * 512 = 512 bytes
# Sector size (logical/physical): 512 bytes / 512 bytes
# Disklabel type: gpt
#
# Device Start End Sectors Size Type
# /dev/sda1 2048 1050623 1048576 512M EFI System
# /dev/sda2 1050624 3147775 2097152 1G Linux filesystem
# /dev/sda3 3147776 1048573951 1045426176 498.5G Linux filesystem
# Столбцы 'Start' и 'End' — номера секторов
# Размер раздела = (End - Start + 1) * sector_size
# sda1 = (1050623 - 2048 + 1) * 512 = 536 870 912 байт = 512 МиБЗачем вообще разбивать на разделы? Три причины:
- Изоляция: процесс, заполнивший
/var/log, не обрушит/и не остановит всю систему. - Разные опции монтирования:
/tmpсnoexec,/homeсnosuid. - Разные файловые системы:
/bootкакext4,/boot/efiкакvfat(требование UEFI).
GPT vs MBR: какой формат таблицы разделов используется на диске. Это важно, потому что у MBR есть жёсткие ограничения, которые GPT снимает.
# Проверить тип на диске
sudo fdisk -l /dev/sda | grep 'Disklabel type'
# Disklabel type: gpt
# Или через parted
sudo parted /dev/sda print | grep 'Partition Table'
# Partition Table: gpt
| Характеристика | MBR (Master Boot Record) | GPT (GUID Partition Table) |
|---|---|---|
| Макс. размер диска | 2 ТиБ | 9,4 ЗиБ (практически неограниченно) |
| Макс. разделов | 4 первичных (или 3 + расширенный) | 128 (по умолчанию) |
| Избыточность | Одна копия в секторе 0 | Заголовок + резервная копия в конце диска |
| Прошивка | BIOS (Legacy) | UEFI (современная); BIOS-GPT тоже работает |
| Введена | 1983 | 2000 (часть спецификации EFI) |
Правило: любой диск > 2 ТиБ обязан использовать GPT. Любая новая система с UEFI должна использовать GPT. MBR — только для старого железа или двойной загрузки с очень старыми системами.
Критическая ситуация: если случайно запустить fdisk в режиме MBR на диске с GPT, GPT-заголовок будет перезаписан MBR. Данные останутся, но таблица разделов исчезнет. Инструменты gdisk или gparted иногда могут восстановить резервную копию GPT с конца диска.
/dev/sda и /dev/sda1 — принципиально разные вещи. Целый диск vs раздел на нём. Форматирование или обнуление целого диска (/dev/sda) уничтожает таблицу разделов. Форматирование раздела (/dev/sda1) затрагивает только диапазон байт этого раздела.
# БЕЗОПАСНО: форматируем только раздел (здесь живёт файловая система)
sudo mkfs.ext4 /dev/sda3
# ОПАСНО: запись на сырой диск уничтожает таблицу разделов
# sudo mkfs.ext4 /dev/sda <-- НЕ делать, если не нужна FS без таблицы разделов
# Проверить монтирование перед любой операцией
mount | grep sda
# Если что-то показывается — сначала umount
# Санитарная проверка: lsblk перед любой деструктивной операцией
lsblk /dev/sda
# NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
# sda 8:0 0 500G 0 diskБыстрая проверка перед деструктивной операцией: lsblk целевого устройства, убедись, что размер совпадает с ожидаемым (перепутать /dev/sdb и /dev/sdc — классическая потеря данных), и убедись, что оно не смонтировано.
Сценарий: к серверу только что подключён новый NVMe-диск на 2 ТиБ, нужно подготовить его к работе.
# Шаг 1: убеждаемся, что ядро его увидело
lsblk
# NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
# nvme0n1 259:0 0 2T 0 disk <- новый диск, разделов нет
# nvme1n1 259:1 0 500G 0 disk
# └─nvme1n1p1 259:2 0 500G 0 part /
# Шаг 2: убеждаемся, что он не смонтирован, проверяем таблицу разделов
sudo fdisk -l /dev/nvme0n1
# Disk /dev/nvme0n1: 2 TiB, 2199023255552 bytes
# Disk /dev/nvme0n1 does not contain a recognized partition table.
# 2 ТиБ > ограничение MBR в 2 ТиБ — всегда используем GPT для новых дисков
# Шаг 3: создаём таблицу GPT и один раздел
sudo fdisk /dev/nvme0n1
# (внутри fdisk)
# g <- создать новую таблицу GPT
# n <- новый раздел
# 1 <- номер раздела 1
# (Enter) <- принять начальный сектор по умолчанию
# (Enter) <- принять конечный сектор по умолчанию (всё место)
# w <- записать и выйти
# Шаг 4: проверяем
lsblk /dev/nvme0n1
# NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
# nvme0n1 259:0 0 2T 0 disk
# └─nvme0n1p1 259:1 0 2T 0 part <- раздел готов для файловой системыДиск теперь разбит на разделы. Следующий шаг (следующий урок) — создание файловой системы внутри /dev/nvme0n1p1.
▸Почему это работает
На macOS диски называются /dev/disk0, /dev/disk1 и т.д., разделы — /dev/disk0s1, /dev/disk0s2. Команда diskutil list — macOS-эквивалент lsblk. macOS использует GPT на Intel Mac и Apple Silicon, форматирует разделы в APFS или HFS+. Никакого /dev/sda нет — именование полностью другое. Скрипты, жёстко задающие имена устройств Linux, на macOS будут молча падать или обращаться не к тому устройству.
▸Частая ошибка
Распространённая ошибка на облачных VM: корневой диск появляется как /dev/xvda (Xen) или /dev/vda (KVM), а не /dev/sda. Скрипты, предполагающие /dev/sda, упадут или, что хуже, попытаются работать с несуществующим устройством. Всегда используй lsblk для обнаружения реальных имён устройств в конкретной среде. Никогда не хардкодь /dev/sda в автоматизации.
Ты запускаешь lsblk и видишь /dev/nvme0n1 (2 ТиБ, TYPE=disk) без разделов. Что это означает и что нужно сделать первым, чтобы хранить файлы на этом диске?
Linux представляет каждое устройство хранения как файл блочного устройства в /dev. Соглашение об именах (sda, nvme0n1, vda) отражает тип интерфейса. lsblk — первая команда при работе с дисками: показывает дерево устройств и разделов с размерами и точками монтирования. Раздел — диапазон байт на устройстве, записанный в таблице разделов в начале диска. GPT — современный формат (поддерживает >2 ТиБ, 128 разделов, резервный заголовок), используй его на всех новых системах; MBR — для BIOS-систем и дисков до 2 ТиБ. Целый диск (/dev/sda) и раздел на нём (/dev/sda1) — разные вещи: форматирование диска уничтожает таблицу разделов. Перед любой деструктивной операцией запускай lsblk.
Практика
Начни сверху. Задачи идут от простого к сложному: вспомнить факт, применить к случаю, затем senior-уровень. Открой, попробуй, потом открой ответ.
Что-то непонятно?
Задай вопрос по этому уроку. Вопросы анонимны и попадают напрямую автору — урок станет лучше.