# Block devices - диски в Linux _Файловая система · LinuxLab Knowledge Base_ **TL;DR:** Block device - устройство которое читается/пишется блоками фиксированного размера (обычно 512B или 4K). Диски, SSD, NVMe - всё block devices в `/dev/`. ## Что это Linux представляет диски как **block devices** - файлы в `/dev/` через которые ядро даёт доступ к хранилищу блоками. В отличие от **character devices** (терминалы, /dev/null), block devices умеют seek по адресам и I/O запрашивается порциями по N байт. ## Имена устройств | Тип | Префикс | Пример | |---|---|---| | SATA / SCSI / USB-диск | `/dev/sd*` | `/dev/sda`, `/dev/sdb1` | | NVMe (PCIe SSD) | `/dev/nvme*` | `/dev/nvme0n1`, `/dev/nvme0n1p1` | | virtio (виртуалка) | `/dev/vd*` | `/dev/vda` | | IDE (старое) | `/dev/hd*` | `/dev/hda` | | LVM logical volume | `/dev//` или `/dev/mapper/...` | `/dev/vg0/root` | | Loop (файл как диск) | `/dev/loop*` | `/dev/loop0` | | RAID (md) | `/dev/md*` | `/dev/md0` | Цифра в конце - **раздел**: `/dev/sda1` = первый раздел на `/dev/sda`. У NVMe схема `nvme0n1p1`: контроллер 0, namespace 1, partition 1. ## lsblk - главная команда ```bash lsblk # дерево всех block devices с разделами и mount-точками lsblk -f # +T тип ФС, UUID, label lsblk -o NAME,SIZE,TYPE,FSTYPE,MOUNTPOINT,UUID lsblk -d # только сами диски, без разделов ``` Вывод дерева: ``` NAME SIZE TYPE FSTYPE MOUNTPOINT sda 512G disk ├─sda1 512M part vfat /boot/efi ├─sda2 1G part ext4 /boot └─sda3 511G part LVM2 - └─vg0-root 50G lvm ext4 / ``` ## Стабильные идентификаторы Имена `sda`/`sdb` могут меняться между загрузками (зависит от порядка обнаружения). В `/etc/fstab` использовать **UUID** или **label**: ```bash blkid # UUID и label каждого раздела blkid /dev/sda1 ls -l /dev/disk/by-uuid/ # симлинки uuid → /dev/sd* ls -l /dev/disk/by-label/ ls -l /dev/disk/by-id/ # стабильное по железу (модель + serial) ``` ## Размер и геометрия ```bash cat /proc/partitions # размер в 1K-блоках fdisk -l /dev/sda # таблица разделов + размер blockdev --getsize64 /dev/sda # размер в байтах cat /sys/block/sda/queue/rotational # 1 = HDD, 0 = SSD cat /sys/block/sda/queue/scheduler # текущий I/O scheduler ``` ## Создание разделов Для GPT (современный стандарт): ```bash sudo parted /dev/sda print # текущая разметка sudo parted /dev/sda mklabel gpt # создать GPT (СТИРАЕТ всё!) sudo parted -a optimal /dev/sda mkpart primary ext4 0% 100% ``` Для MBR (legacy, до 2 TB): ```bash sudo fdisk /dev/sda # интерактивный sudo sgdisk /dev/sda --print # GPT-aware fdisk ``` После создания раздела нужно **сообщить ядру**: ```bash sudo partprobe /dev/sda ``` ## I/O scheduler Ядро сортирует I/O-запросы перед отправкой на диск: - **none / noop** - для NVMe: они сами хороший scheduler - **mq-deadline** - справедливый, default на серверах - **bfq** - для desktop, приоритеты процессов - **kyber** - низкая latency, для SSD ```bash cat /sys/block/sda/queue/scheduler echo mq-deadline | sudo tee /sys/block/sda/queue/scheduler ``` ## Loop device - файл как диск ```bash dd if=/dev/zero of=disk.img bs=1M count=100 # сделать 100MB-файл sudo losetup -f --show disk.img # привязать к /dev/loopX sudo mkfs.ext4 /dev/loop0 # создать ФС sudo mount /dev/loop0 /mnt # смонтировать sudo umount /mnt && sudo losetup -d /dev/loop0 ``` Так Docker раньше делал контейнерные ФС; так же монтируются `.iso`-образы. ## Команды ```bash lsblk -f ``` Все диски, разделы, ФС, mount-точки, UUID - главная команда обзора ```bash blkid /dev/sda1 ``` UUID и тип ФС конкретного раздела - для /etc/fstab ```bash sudo fdisk -l ``` Подробно по всем дискам с разделами и геометрией ```bash cat /sys/block/sda/queue/rotational ``` 1 = HDD, 0 = SSD - определить тип диска ```bash sudo partprobe /dev/sda ``` Перечитать таблицу разделов после правки fdisk/parted ## См. также - [lsblk и blkid - block-устройства и UUID](/kb/cmd-lsblk-blkid.md) - [mount и /etc/fstab - подключение ФС](/kb/mount-and-fstab.md) - [LVM - Logical Volume Manager](/kb/lvm.md) - [RAID - software-raid через mdadm](/kb/raid.md) - [Sparse-файлы - дыры и apparent size](/kb/sparse-files.md)