Linux. Циклическое устройство

20.08.2023

Теги: CLILinuxБлочноеУстройствоКомандаФайлФайловаяСистема

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 • Блочное устройство

Каталог оборудования
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Производители
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Функциональные группы
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.