Linux. Циклическое устройство
20.08.2023
Теги: CLI • Linux • БлочноеУстройство • Команда • Файл • ФайловаяСистема
Linux позволяет создать специальное блочное устройство, которое может отображать блоки данных обычного файла или другого блочного устройства. Это может быть полезно для получения образа файловой системы, хранящейся в файле, в виде блочного устройства. Это блочное устройство может быть смонтировано с помощью команды mount
— для дальнейшей работы.
Первая часть
Давайте создадим файл, отобразим его блоки в loop-устройство, создадим разделы и файловые системы, запишем туда что-нибудь.
$ mkdir /home/evgeniy/data $ cd /home/evgeniy/data $ dd if=/dev/zero of=part-home-data bs=1M count=2000
Теперь у нас есть файл part-home-data
, у которого 2000 блоков размером 1Мб, заполненный нулями. Давайте создадим loop-устройство, которое будет отображать блоки нашего файла. Опция -f
позволяет найти первое неиспользуемое loop-устройство, чтобы использовать его для отображения файла.
$ sudo losetup -f part-home-data
-P
заставить ядро сканировать таблицу разделов на вновь созданном loop-устройстве — это полезно, если файл part-home-data
уже содержит разделы, которые были созданы ранее.
Опция -a
позволяет вывести список используемых loop-устройств
$ losetup -a /dev/loop0: []: (/home/evgeniy/data/part-home-data)
Теперь создаем таблицу разделов GPT и два раздела, каждый из которых будет занимать 50% места
$ sudo parted --align opt /dev/loop0 GNU Parted 3.4 Используется /dev/loop0 Добро пожаловать в GNU Parted! Наберите 'help' для просмотра списка команд. (parted) mktable gpt (parted) mkpart home 0% 50% (parted) mkpart data 50% 100% (parted) print Модель: Устройство типа loopback (loopback) Диск /dev/loop0: 2097MB Размер сектора (логич./физич.): 512B/512B Таблица разделов: gpt Флаги диска: Номер Начало Конец Размер Файловая система Имя Флаги 1 1049kB 1049MB 1048MB home 2 1049MB 2096MB 1048MB data (parted) quit
Теперь создаем в этих разделах файловые системы
$ sudo mkfs.ext4 /dev/loop0p1 mke2fs 1.46.5 (30-Dec-2021) Discarding device blocks: done Creating filesystem with 255744 4k blocks and 64000 inodes Filesystem UUID: 42d3f81d-0367-47cf-aacb-acb39154fd27 Superblock backups stored on blocks: 32768, 98304, 163840, 229376 Allocating group tables: done Сохранение таблицы inod'ов: done Создание журнала (4096 блоков): готово Writing superblocks and filesystem accounting information: готово
$ sudo mkfs.ext4 /dev/loop0p2 mke2fs 1.46.5 (30-Dec-2021) Discarding device blocks: done Creating filesystem with 255744 4k blocks and 64000 inodes Filesystem UUID: d2e9cd92-b455-4f6a-9b17-32df86b8aced Superblock backups stored on blocks: 32768, 98304, 163840, 229376 Allocating group tables: done Сохранение таблицы inod'ов: done Создание журнала (4096 блоков): готово Writing superblocks and filesystem accounting information: готово
Теперь создаем две точки монтирования, чтобы смонтировать в них два раздела
$ sudo mkdir /mnt/home $ sudo mkdir /mnt/data
Почти все готово, осталось только смонтировать и записать туда что-нибудь
$ sudo mount /dev/loop0p1 /mnt/home $ sudo mount /dev/loop0p2 /mnt/data
$ sudo touch /mnt/home/homefile $ sudo touch /mnt/data/part-home-data
Размонтируем файловые системы
$ sudo umount /mnt/home $ sudo umount /mnt/data
Вторая часть
Создание разделов необязательно — можно было просто создать файловую систему
$ cd /home/evgeniy/data $ dd if=/dev/zero of=filesystem bs=1M count=1000 $ sudo losetup -f filesystem $ losetup -a /dev/loop1: []: (/home/evgeniy/data/filesystem) /dev/loop0: []: (/home/evgeniy/data/part-home-data) $ sudo mkfs.ext4 /dev/loop1 # создаем файловую систему mke2fs 1.46.5 (30-Dec-2021) Discarding device blocks: done Creating filesystem with 256000 4k blocks and 64000 inodes Filesystem UUID: 4a2f80ea-1f2f-461c-aa00-8a69313af0c8 Superblock backups stored on blocks: 32768, 98304, 163840, 229376 Allocating group tables: done Сохранение таблицы inod'ов: done Создание журнала (4096 блоков): готово Writing superblocks and filesystem accounting information: готово $ sudo mkdir /mnt/filesystem # создаем точку монтирования $ sudo mount /dev/loop1 /mnt/filesystem # монтируем $ sudo touch /mnt/filesystem/somedata # создаем файл
Размонтируем файловую систему
$ sudo umount /mnt/filesystem
Третья часть
Освобождаем loop-устройства
$ sudo losetup -d /dev/loop0
$ sudo losetup -d /dev/loop1
Четвертая часть
Пример из второй части можно выполнить проще, если монтировать файл с файловой системой внутри, используя опцию монтирования loop
.
$ sudo mount -o loop /home/evgeniy/data/filesystem /mnt/filesystem
$ ls -la /mnt/filesystem итого 24 drwxr-xr-x 3 root root 4096 авг 20 12:12 . drwxr-xr-x 7 root root 4096 авг 20 13:16 .. drwx------ 2 root root 16384 авг 20 12:07 lost+found -rw-r--r-- 1 root root 0 авг 20 12:12 somedata
С примером из первой части будет сложнее — команде mount
нужно указать, где начинается файловая система и сколько места занимает.
$ sudo fdisk -l /home/evgeniy/data/part-home-data Диск /home/evgeniy/data/part-home-data: 1,95 GiB, 2097152000 байт, 4096000 секторов Единицы: секторов по 1 * 512 = 512 байт Размер сектора (логический/физический): 512 байт / 512 байт Размер I/O (минимальный/оптимальный): 512 байт / 512 байт Тип метки диска: gpt Идентификатор диска: 14C53831-DFE1-42B6-9CE4-E73AC046433E Устр-во Начало Конец Секторы Размер Тип /home/evgeniy/data/part-home-data1 2048 2047999 2045952 999M Файловая система Linux /home/evgeniy/data/part-home-data2 2048000 4093951 2045952 999M Файловая система Linux
Первая файловая система начинается с блока 2048, длина файловой системы 2045952 блока, каждый блок 512 байт.
$ echo $((2048 * 512)) $((2045952 * 512)) 1048576 1047527424
$ sudo mount -o loop,offset=1048576,sizelimit=1047527424 /home/evgeniy/data/part-home-data /mnt/home
$ ls -la /mnt/home итого 24 drwxr-xr-x 3 root root 4096 авг 20 11:58 . drwxr-xr-x 8 root root 4096 авг 23 16:36 .. -rw-r--r-- 1 root root 0 авг 20 11:58 homefile drwx------ 2 root root 16384 авг 20 11:45 lost+found
Вторая файловая система начинается с блока 2048000, длина файловой системы 2045952 блока, каждый блок 512 байт.
$ echo $((2048000 * 512)) $((2045952 * 512)) 1048576000 1047527424
$ sudo mount -o loop,offset=1048576000,sizelimit=1047527424 /home/evgeniy/data/part-home-data /mnt/data
$ ls -la /mnt/data итого 24 drwxr-xr-x 3 root root 4096 авг 20 11:58 . drwxr-xr-x 8 root root 4096 авг 23 16:36 .. -rw-r--r-- 1 root root 0 авг 20 11:58 datafile drwx------ 2 root root 16384 авг 20 11:47 lost+found
Все работает, все файлы, которые были созданы в первой и второй части на месте, можно размонтировать.
$ sudo umount /mnt/filesystem $ sudo umount /mnt/home $ sudo umount /mnt/data
Поиск: CLI • Linux • Команда • Файловая система • loop • losetup • Блочное устройство