Иногда при работе требуется создать полный образ блочного устройства со всеми разделами. Такой образ удобно "закатывать" назад на диск-источник, но работа с ним затруднительна. Впрочем, "затруднительна" это преувеличение. Действительно, просто так командой mount его не замонтируешь, но тем не менее предварительные действия для этого несложны.
Для примера - есть образ диска EEE701, содержащий несколько разделов:
# fdisk -l ./netbook.img
Disk ./netbook.img: 3,7 GiB, 4001292288 bytes, 7815024 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xa5cfec18
Device Boot Start End Sectors Size Id Type
./netbook.img1 * 63 7341704 7341642 3,5G 83 Linux
./netbook.img2 7341705 7807589 465885 227,5M 5 Extended
./netbook.img5 7341768 7807589 465822 227,5M 82 Linux swap / Solari
s
Его монтирование, естественно, не удаётся:
# mount ./father_netbook.img /mnt/temp
NTFS signature is missing.
Failed to mount '/dev/loop0': Invalid argument
The device '/dev/loop0' doesn't seem to have a valid NTFS.
Maybe the wrong device is used? Or the whole disk instead of a
partition (e.g. /dev/sda, not /dev/sda1)? Or the other way around?
Есть как минимум три варианта:
1) losetup автоматически
# losetup --partscan --find --show ./netbook.img
/dev/loop0
Это автоматически создаст нужные разделы:
# ls /dev/loop0*
/dev/loop0 /dev/loop0p1 /dev/loop0p2 /dev/loop0p5
$ blkid|grep loop0
/dev/loop0p1: UUID="3f298df7-d3b4-40c8-a4ed-07fa4fea2269" TYPE="ext4" PARTUUID="a5cfec18-01"
/dev/loop0p5: UUID="eebf860f-7893-4c61-808b-1761393a2c09" TYPE="swap" PARTUUID="a5cfec18-05"
/dev/loop0: PTUUID="a5cfec18" PTTYPE="dos"
Можно монтировать:
# mount /dev/loop0p1 /mnt/temp
# mount |grep /mnt/temp
/dev/loop0p1 on /mnt/temp type ext4 (rw,relatime,data=ordered)
2) losetup вручную
Вычисляем смещение, для чего множим стартовый сектор нужного раздела на размер сектора
# echo 63*512|bc
32256
подготавливаем loopback устройство с этим смещением
# losetup --offset 32256 $(losetup -f) ./netbook.img
и видим, что оно успешно подготовлено:
# losetup
NAME SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE
/dev/loop0 0 32256 0 0 /mnt/backup/f/netbook.img
# blkid|grep loop0
/dev/loop0: UUID="3f298df7-d3b4-40c8-a4ed-07fa4fea2269" TYPE="ext4"
можно монтировать:
# mount /dev/loop0 /mnt/temp/
# mount |grep loop0
/dev/loop0 on /mnt/temp type ext4 (rw,relatime,data=ordered)
3) device mapper
Но что если нужно работать с несколькими разделами сразу? Не уверен, правда, зачем, но вдруг? В этом случае нам поможет device mapper с его linear целью.
Подготавливаем блочное устройство "как есть":
$ losetup $(losetup -f) ./netbook.img
Создаём блочные устройства. Что удобно, fdisk уже подсказал нам нужные параметры, так что считать вручную нет нужды:
# dmsetup create netbook-root --table '0 7341642 linear /dev/loop0 63'
# dmsetup create netbook-swap --table '0 465822 linear /dev/loop0 7341768'
# blkid|grep netbook
/dev/mapper/netbook-root: UUID="3f298df7-d3b4-40c8-a4ed-07fa4fea2269" TYPE="ext4"
/dev/mapper/netbook-swap: UUID="eebf860f-7893-4c61-808b-1761393a2c09" TYPE="swap"
Можно монтировать:
# mount /dev/mapper/netbook-root /mnt/temp
# mount |grep netbook-root
/dev/mapper/netbook-root on /mnt/temp type ext4 (rw,relatime,data=ordered)