Что это
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/<vg>/<lv> или /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 - главная команда
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:
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)
Размер и геометрия
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 (современный стандарт):
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):
sudo fdisk /dev/sda # интерактивный
sudo sgdisk /dev/sda --print # GPT-aware fdisk
После создания раздела нужно сообщить ядру:
sudo partprobe /dev/sda
I/O scheduler
Ядро сортирует I/O-запросы перед отправкой на диск:
- none / noop - для NVMe: они сами хороший scheduler
- mq-deadline - справедливый, default на серверах
- bfq - для desktop, приоритеты процессов
- kyber - низкая latency, для SSD
cat /sys/block/sda/queue/scheduler
echo mq-deadline | sudo tee /sys/block/sda/queue/scheduler
Loop device - файл как диск
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-образы.