Блочное устройство — это что
Linux абстрагирует физические носители (HDD, SSD, NVMe, виртуальные диски в облаке) в блочные устройства. Они появляются как файлы в /dev/: /dev/sda, /dev/nvme0n1, /dev/vda. «Блочное» — потому что чтение/запись идут блоками фиксированного размера (обычно 4 KiB), а не байтами.
Внутри блочного устройства могут жить разделы (partitions): /dev/sda1, /dev/sda2, /dev/nvme0n1p1. Раздел — это участок диска с собственной таблицей разделов (MBR или GPT). На каждом разделе создаётся файловая система (ext4, xfs, btrfs, vfat) — структура для хранения файлов и метаданных.
Чтобы пользоваться файловой системой, её нужно смонтировать — привязать к каталогу в дереве /. Эта операция превращает «raw bytes на разделе» в «папка, куда я могу cd-нуться и читать файлы».
Каждый уровень добавляет свой слой и свои команды для управления.
lsblk: блочные устройства в виде дерева
lsblk (list block devices) — твой главный инструмент для обзора. Показывает иерархию: диск -> разделы -> mountpoints.
$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
nvme0n1 259:0 0 476.9G 0 disk
|-nvme0n1p1 259:1 0 512M 0 part /boot/efi
|-nvme0n1p2 259:2 0 1.7G 0 part /boot
`-nvme0n1p3 259:3 0 474.7G 0 part /
sdb 8:16 0 1.8T 0 disk
`-sdb1 8:17 0 1.8T 0 part /data
sr0 11:0 1 1024M 0 rom
Читаем сверху вниз:
nvme0n1— основной NVMe-диск 477 ГБ, размечен на три раздела.nvme0n1p1— 512 МБ EFI System Partition (/boot/efi).nvme0n1p2— 1.7 ГБ/boot(Linux kernel и initramfs).nvme0n1p3— 475 ГБ корневой раздел/.sdb— второй диск SATA, 1.8 ТБ, целиком отдан под/data.
Колонки:
MAJ:MIN— major/minor номера устройства. Major 259 = NVMe, major 8 = SCSI/SATA, major 11 = SCSI CD-ROM.RM— removable (1 = USB-флешка, CD; 0 = внутренний).RO— read-only.TYPE—disk,part,rom,lvm,crypt.
lsblk -f: ещё и файловые системы
$ lsblk -f
NAME FSTYPE FSVER LABEL UUID FSAVAIL FSUSE% MOUNTPOINTS
nvme0n1
|-nvme0n1p1 vfat FAT32 AB12-CD34 388M 27% /boot/efi
|-nvme0n1p2 ext4 1.0 8a9c1234-5678-... 1.2G 29% /boot
`-nvme0n1p3 ext4 1.0 root d4e5f678-90ab-... 89G 78% /
sdb
`-sdb1 xfs data f1a2b3c4-d5e6-... 1.6T 11% /data
Видны UUID — уникальные идентификаторы файловой системы, генерируемые при mkfs. Они стабильны: если ты переткнёшь SATA-кабель, диск может сменить имя с sdb на sdc, но UUID останется. Поэтому в /etc/fstab рекомендуется использовать UUID=..., а не /dev/sdb1.
lsblk -d: только верхний уровень (только диски)
$ lsblk -d
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
nvme0n1 259:0 0 476.9G 0 disk
sdb 8:16 0 1.8T 0 disk
sr0 11:0 1 1024M 0 rom
Удобно для быстрого «какие диски вообще есть».
lsblk -o: выбрать колонки
$ lsblk -o NAME,SIZE,FSTYPE,MOUNTPOINTS
NAME SIZE FSTYPE MOUNTPOINTS
nvme0n1 476.9G
|-nvme0n1p1 512M vfat /boot/efi
|-nvme0n1p2 1.7G ext4 /boot
`-nvme0n1p3 474.7G ext4 /
sdb 1.8T
`-sdb1 1.8T xfs /data
Все доступные колонки — lsblk --help или lsblk -O.
mount: посмотреть, что куда смонтировано
Команда mount без аргументов выводит список всех смонтированных ФС:
$ mount
sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime)
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
udev on /dev type devtmpfs (rw,nosuid,relatime,size=8164532k,nr_inodes=2041133,mode=755)
/dev/nvme0n1p3 on / type ext4 (rw,relatime,errors=remount-ro)
/dev/nvme0n1p1 on /boot/efi type vfat (rw,relatime,fmask=0077,dmask=0077,codepage=437,...)
/dev/sdb1 on /data type xfs (rw,relatime,attr2,inode64,logbufs=8,logbsize=32k,noquota)
tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev,inode64)
tmpfs on /run type tmpfs (rw,nosuid,nodev,size=1632908k,mode=755,inode64)
Шаблон: DEVICE on MOUNTPOINT type FSTYPE (OPTIONS). Опции:
rw/ro— read-write / read-only.relatime— обновлять atime не на каждое чтение (default современных дистров).noexec— на смонтированной ФС нельзя запускать исполняемые файлы (типично для/tmp,/dev/shm).nosuid— SUID-биты игнорируются.nodev— не интерпретировать device-файлы.
Эти опции — не косметика. На production кластере DE часто видишь /data с noexec,nosuid — это hardening, чтобы загруженные туда .parquet случайно не оказались исполняемыми.
Альтернатива (на современных systemd-системах) — findmnt:
$ findmnt
TARGET SOURCE FSTYPE OPTIONS
/ /dev/nvme0n1p3 ext4 rw,relatime,errors=remount-ro
|-/sys sysfs sysfs rw,nosuid,nodev,noexec,relatime
|-/proc proc proc rw,nosuid,nodev,noexec,relatime
|-/dev udev devtmpfs rw,nosuid,relatime,size=8164532k,...
|-/boot /dev/nvme0n1p2 ext4 rw,relatime
| `-/boot/efi /dev/nvme0n1p1 vfat rw,relatime,fmask=0077,...
`-/data /dev/sdb1 xfs rw,relatime,attr2,inode64,...
findmnt рисует дерево — нагляднее, чем плоский список mount.
Монтирование вручную: mount DEVICE MOUNTPOINT
Чтобы подключить, например, новый диск:
# 1) Подключили физически или хотплаг
$ lsblk
NAME SIZE TYPE MOUNTPOINTS
sdb 1T disk
`-sdb1 1T part <- ещё не смонтирован
# 2) Создаём точку монтирования
$ sudo mkdir /mnt/extra
# 3) Монтируем
$ sudo mount /dev/sdb1 /mnt/extra
# 4) Проверяем
$ df -h /mnt/extra
Filesystem Size Used Avail Use% Mounted on
/dev/sdb1 1.0T 42M 973G 1% /mnt/extra
Mount требует root (или suid, или явного users в fstab) — обычный юзер не может монтировать произвольные ФС.
Чтение опций при mount
Если на разделе уже есть ФС, mount сам определит её тип через суперблок. Но можно указать явно:
$ sudo mount -t xfs /dev/sdb1 /mnt/extra
$ sudo mount -t ext4 -o ro,noexec /dev/sdb1 /mnt/extra
-o ro,noexec — read-only и без execute. Удобно для forensic-анализа диска, чтобы не модифицировать его случайно.
umount: размонтировать
$ sudo umount /mnt/extra
Можно по mountpoint, можно по device — оба работают:
$ sudo umount /dev/sdb1 # эквивалентно
Device busy: классическая проблема
$ sudo umount /mnt/extra
umount: /mnt/extra: target is busy.
Это значит: какой-то процесс держит файл-дескриптор или имеет cwd внутри этой ФС. Linux не даст размонтировать, пока ФС используется.
Кто виноват? Две команды:
$ sudo lsof +D /mnt/extra
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
python 4321 airflow cwd DIR 8,17 4096 2 /mnt/extra
python 4321 airflow 3w REG 8,17 1048576 131072 /mnt/extra/output.csv
lsof +D (capital D, recursive) показывает все процессы с открытыми файлами внутри. Здесь Python с PID 4321 держит /mnt/extra/output.csv.
Или fuser:
$ sudo fuser -m /mnt/extra
/mnt/extra: 4321c
c означает «current directory» процесса 4321 — кто-то сделал cd /mnt/extra и сидит там.
Решение:
- Найти процесс и убить (
kill 4321или вежливо попросить). - Заставить процесс отпустить (если это ssh-сессия с
cd /mnt/extra— простоcd ~). umount -l(lazy unmount) — отвяжет от namespace немедленно, но фактически отмонтирует, когда последний дескриптор закроется. Опасно: дальнейшие операции в/mnt/extraбудут писать «как бы в новую ФС» (или в исходную папку под mountpoint-ом — зависит от того, кто открыт).umount -f— force, для сетевых ФС (NFS), когда сервер недоступен.
/etc/fstab: постоянные монтирования при загрузке
Mount, сделанный руками, не переживёт reboot. Чтобы ФС монтировалась автоматически при старте, её нужно прописать в /etc/fstab.
$ cat /etc/fstab
# <file system> <mount point> <type> <options> <dump> <pass>
UUID=d4e5f678-90ab-cdef-1234-567890abcdef / ext4 errors=remount-ro 0 1
UUID=8a9c1234-5678-90ab-cdef-1234567890ab /boot ext4 defaults 0 2
UUID=AB12-CD34 /boot/efi vfat umask=0077 0 2
UUID=f1a2b3c4-d5e6-7890-abcd-ef1234567890 /data xfs defaults,noatime 0 2
/swap.img none swap sw 0 0
6 полей через пробелы/табы:
Каждое поле говорит ядру и systemd ровно об одной вещи.
Почему UUID, а не /dev/sdb1
Сценарий: ты добавил третий диск, и Linux переименовал устройства: sdb стал sdc, потому что новый диск занял sdb. Если /etc/fstab ссылается на /dev/sdb1, при загрузке mount попытается смонтировать новый диск под /data — и либо не сможет (другая ФС), либо положит туда мусор. С UUID=... такой проблемы нет: UUID привязан к файловой системе, а не к имени устройства.
Получить UUID:
$ sudo blkid /dev/sdb1
/dev/sdb1: UUID="f1a2b3c4-d5e6-7890-abcd-ef1234567890" BLOCK_SIZE="4096" TYPE="xfs"
# Или быстрее через lsblk:
$ lsblk -no UUID /dev/sdb1
f1a2b3c4-d5e6-7890-abcd-ef1234567890
Применить fstab без reboot
После редактирования /etc/fstab не нужно перезагружаться:
$ sudo mount -a
mount -a смонтирует все ФС из fstab, которые ещё не смонтированы. Если в fstab ошибка (опечатка в опции, неверный UUID), команда упадёт с понятным сообщением — это безопасный способ проверить fstab перед reboot.
Ошибка в /etc/fstab с корневой ФС или критичным разделом может сломать загрузку — система упадёт в emergency mode. Поэтому: всегда проверяй через mount -a после правки. Опция nofail спасает: даже если ФС недоступна, boot продолжится. Для всех некритичных mount-ов (NFS, второй диск) — добавляй nofail.
Файловые системы: ext4, xfs, btrfs, zfs
На Linux несколько ФС, и DE стоит понимать различия.
Каждая ФС оптимизирована под свои сценарии. Выбор зависит от размера данных и паттерна доступа.
Для DE-кейсов:
- Big files (parquet, avro, GB-files) — XFS обычно быстрее на параллельной записи. На современном ext4 разница невелика.
- Много мелких файлов (Spark _temporary, Kafka segments) — ext4 справляется отлично. На XFS allocation slowdown иногда заметен.
- Snapshots и rollback — btrfs или zfs. Если важно сделать
zfs snapshotперед массовой записью и откатить при ошибке — это они. - RAM-cache для intermediate данных — tmpfs, но помни о лимите RAM.
Создание ФС: mkfs
# ext4 — самый частый случай
$ sudo mkfs.ext4 -L data /dev/sdb1
# xfs
$ sudo mkfs.xfs -L data /dev/sdb1
# Внимание: это деструктивно — стирает старую ФС!
-L LABEL ставит метку, видную в lsblk -f. Можно использовать LABEL=data в fstab вместо UUID — короче.
После mkfs появится новый UUID — нужно обновить fstab.
Cloud-специфика: EBS, GCE persistent disk, Azure managed disk
На AWS EC2 EBS-том появляется как /dev/nvme1n1 (на Nitro-instances) или /dev/xvdf (на старых). На GCP/Azure аналогично — это просто блочное устройство. Все команды lsblk, mkfs, mount работают одинаково.
Особенности:
- Online grow: EBS можно увеличить через консоль, потом
growpart /dev/nvme1n1 1+xfs_growfs /data(для xfs) илиresize2fs /dev/nvme1n1p1(для ext4) — без размонтирования. Это критично для production, где downtime недопустим. - Snapshot: облачный snapshot — точка восстановления на уровне block device. Восстановление = создать новый volume из snapshot.
Подробнее про сетевые ФС (NFS) — в модуле 11-networking-tools. Про работу с архивами при бэкапе — в модуле 12-archives-compression.
Попробуй сам
- Посмотри все блочные устройства в виде дерева:
lsblk -f - Какие ФС сейчас смонтированы:
findmnt - UUID твоего корневого раздела:
sudo blkid $(findmnt -no SOURCE /) - Посмотри
/etc/fstabи сопоставь записи с реально смонтированным:cat /etc/fstab findmnt - Кто держит твою home-директорию занятой (полезно для понимания
device busy):sudo lsof +D ~ 2>/dev/null | head
macOS-различия
- На macOS блочные устройства видны через
diskutil list, неlsblk. - ФС — APFS (с 2017) или HFS+ (legacy). Команды
mkfs/mountтоже свои:diskutil eraseDisk,diskutil mount. /etc/fstabна macOS существует, но почти никогда не редактируется вручную — APFS-volumes управляются черезdiskutil.- Большинство DE используют Linux-контейнеры даже на Mac, так что эти различия редко мешают.
Главное
- Блочное устройство =
/dev/sda,/dev/nvme0n1. На нём могут быть разделы (sda1). - На разделе создаётся файловая система через
mkfs.ext4/mkfs.xfs. - ФС нужно смонтировать в каталог:
mount /dev/sdb1 /mnt/data(нужен root). lsblk— дерево устройств.lsblk -f— с типами и UUID.mountбез аргументов илиfindmnt— что куда смонтировано./etc/fstab— постоянные mounts при загрузке. Используй UUID, не/dev/sdb1.mount -aприменяет fstab без reboot — безопасный способ проверки.umountпадает с device busy — найди виновника черезlsof +Dилиfuser -m.- Файловые системы: ext4 (default), xfs (для больших файлов), btrfs/zfs (snapshots, advanced).
- На cloud EBS/PD/managed disk — то же самое: блочное устройство, mkfs, mount.