Блочные устройства, разделы и монтирование
Устройства в /dev
Драйверы устройств доступны процессам как специальные файлы в /dev:
$ ls -l /dev/sda /dev/tty1 /dev/null
brw-rw---- 1 root disk 8, 0 окт 25 /dev/sda
crw--w---- 1 root tty 4, 1 окт 25 /dev/tty1
crw-rw-rw- 1 root root 1, 3 окт 25 /dev/null
b— блочное: доступ блоками фиксированного размера в произвольном порядке, через кеш; на нём можно создать файловую систему (диски, разделы, SSD).c— символьное: поток байтов (терминалы,/dev/null,/dev/random, мыши).- Числа
8, 0— старший (major: какой драйвер) и младший (minor: какое устройство этого драйвера) номера. Они хранятся в inode специального файла (i_rdev).
При open("/dev/sda") VFS видит, что inode — блочное устройство, и подставляет операции драйвера.
Разделы
Диск делится на разделы — непрерывные участки, каждый со своей ФС. Разметка хранится в начале диска:
| Таблица | Особенности |
|---|---|
| MBR (msdos) | первые 512 байт; до 4 основных разделов (или расширенный с логическими), диски до 2 ТиБ |
| GPT | до 128 разделов, огромные диски, резервная копия в конце диска, используется с UEFI |
sudo fdisk -l # показать разделы всех дисков
sudo fdisk /dev/sdb # интерактивно: n — новый, d — удалить, p — показать, w — записать
lsblk # дерево дисков и разделов
Задача 2: fdisk
fdisk — обычная программа режима пользователя (утилита администратора — прикладной уровень). Она не управляет диском напрямую, а открывает файл блочного устройства /dev/sdX и читает/пишет секторы с таблицей разделов через системные вызовы — то есть пользуется услугами ядра (VFS → блочный уровень → драйвер). Объект её работы — физическое устройство и его разметка.
Создание ФС и монтирование
sudo mkfs.ext4 /dev/sdb1 # записать суперблок, группы блоков, таблицы inode
sudo mkdir -p /mnt/data
sudo mount /dev/sdb1 /mnt/data # подключить
mount | grep sdb1 # проверить
sudo umount /mnt/data # отключить (нельзя, если файлы открыты: EBUSY)
Монтирование при загрузке — /etc/fstab:
# устройство точка тип опции dump fsck
UUID=3f1c...-... /mnt/data ext4 defaults,noatime 0 2
tmpfs /tmp tmpfs size=1G 0 0
Что происходит в VFS при монтировании
- Ядро находит драйвер ФС по типу (
ext4), тот читает суперблок с устройства и создаётstruct super_block. - Создаётся объект монтирования (
struct vfsmount/mount), связывающий корень новой ФС с каталогом — точкой монтирования. - dentry точки монтирования помечается: при разборе пути VFS, дойдя до этого каталога, переходит в корень смонтированной ФС.
Поэтому:
- старое содержимое точки монтирования скрыто, пока ФС смонтирована;
- файл однозначно определяется парой (устройство, номер inode) — номера в разных ФС повторяются (
st_devиst_inoвstat); - жёсткие ссылки между ФС невозможны (
EXDEV).
Кеш страниц и запись на диск
Чтение и запись файлов идут через кеш страниц в памяти. write лишь помечает страницу грязной; на диск её позже запишут потоки writeback. Принудительно — fsync(fd), sync. Поэтому флешку нужно корректно размонтировать: umount записывает все грязные данные.
Итог
- Устройства — специальные файлы: блочные (диски) и символьные (терминалы); major/minor номера.
- Разделы описывает таблица MBR или GPT;
fdisk— пользовательская утилита, правящая её через/dev/sdX. mkfsсоздаёт ФС,mountподключает её к дереву;/etc/fstab— при загрузке.- При монтировании VFS связывает точку монтирования с корнем новой ФС; файл определяется парой (устройство, inode).
Практика решено 0 из 5
Символьное или блочное устройство?
| Символьное | Блочное | |
|---|---|---|
| /dev/sda (диск) | ||
| /dev/tty1 (терминал) | ||
| /dev/null | ||
| /dev/nvme0n1p1 (раздел SSD) | ||
| Доступ блоками произвольно, через кеш, на нём можно создать ФС | ||
| Поток байтов, обычно последовательный |
Что делает утилита fdisk?
Расставьте по порядку шаги подготовки нового диска /dev/sdb:
- Добавить строку в /etc/fstab, чтобы монтировать при загрузке
-
mkfs.ext4 /dev/sdb1— создать файловую систему (суперблок, таблицы inode) -
mkdir /mnt/data— создать точку монтирования -
mount /dev/sdb1 /mnt/data— подключить ФС к дереву каталогов -
fdisk /dev/sdb— создать таблицу разделов и раздел /dev/sdb1
Каталог /mnt/data содержал файл old.txt. На него смонтировали другую ФС. Виден ли old.txt по пути /mnt/data/old.txt? (да/нет)
Почему после mount номер inode корня смонтированной ФС обычно 2, а в / — тоже 2?
Войдите, чтобы отмечать пройденные уроки.