FastNetMon

Thursday, 19 May 2011

Неизвестный losetup и создание дискового раздела в файле

О том, что можно создать дисковое устройство в файле, уверен, знают многие. Сделать это несложно, смотрим пример ниже.


Создаем пустой файл заполненный нулями:
dd if=/dev/zero of=partition.img bs=512 count=1000000
1000000+0 records in
1000000+0 records out
512000000 bytes (512 MB) copied, 1.6735 s, 306 MB/s

Теперь совершенно стандартным способом создаем файловую систему в файле:
mkfs.ext3 partition.img
mke2fs 1.41.12 (17-May-2010)
partition.img is not a block special device.
Proceed anyway? (y,n) y
warning: 287 blocks unused.

Filesystem label=
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
Stride=0 blocks, Stripe width=0 blocks
125416 inodes, 499713 blocks
25000 blocks (5.00%) reserved for the super user
First data block=1
Maximum filesystem blocks=67633152
61 block groups
8192 blocks per group, 8192 fragments per group
2056 inodes per group
Superblock backups stored on blocks:
8193, 24577, 40961, 57345, 73729, 204801, 221185, 401409

Writing inode tables: done
Creating journal (8192 blocks): done
Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 22 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.

Утилита file подтверждает наличие файловой системы в файле:
file partition.img
partition.img: Linux rev 1.0 ext3 filesystem data, UUID=9b90cdcd-967c-452c-baa4-e1ac839f6bde

А утилита mount его прекрасно монтирует:
{code}mount -o loop partition.img /mnt
{code}

df -h | egrep 'File|loop'
Filesystem Size Used Avail Use% Mounted on
/dev/loop0 473M 11M 438M 3% /mnt

Отмонтируем:
umount /dev/loop0

Но как представить обычный файл как полноценное блочное устройство без создания на нем какой-либо файловой системы? Тут нам на помощь приходит losetup!

Создаем пустой бинарный файл как и в предыдущий раз:
dd if=/dev/zero of=partition.img bs=512 count=1000000
1000000+0 records in
1000000+0 records out
512000000 bytes (512 MB) copied, 1.66248 s, 308 MB/s

И подключаем его как полноценное блочное устройство:
losetup /dev/loop0 partition.img

Вуаля, теперь с содержимым файла можно работать как с обычным блочным устрйоством:
file /dev/loop0
/dev/loop0: block special

Создаем файловую систему:
mkfs.ext3 /dev/loop0
mke2fs 1.41.12 (17-May-2010)
warning: 287 blocks unused.

Filesystem label=
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
Stride=0 blocks, Stripe width=0 blocks
125416 inodes, 499713 blocks
25000 blocks (5.00%) reserved for the super user
First data block=1
Maximum filesystem blocks=67633152
61 block groups
8192 blocks per group, 8192 fragments per group
2056 inodes per group
Superblock backups stored on blocks:
8193, 24577, 40961, 57345, 73729, 204801, 221185, 401409

Writing inode tables: done
Creating journal (8192 blocks): done
Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 36 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.


Монтируем:
mount /dev/loop0 /mnt

И получаем тот же самый эффект, что и при прямом монтировании файла:
df -h | grep loop
/dev/loop0 473M 11M 438M 3% /mnt

Но при этом, мы можем работать с образом напрямую, без файловой системы и любыми утилитами, которые поддерживают работы с блочными устройствами (но при этом, ничего не знают о файлах).

Теперь пришел черед отмонтировать файл от блочного устройства, получаем список всех файлов, подключенных таким образом:
losetup -a
/dev/loop0: [0902]:4358159 (/root/partition.img)

Отключаем:
losetup -d /dev/loop0

5 comments :

  1. Хорошо всё понятно написано, спасибо!

    ReplyDelete
  2. Вместо dd можно сделать так:
    truncate -s 512M partition.img

    Гораздо быстрее получится.

    ReplyDelete
  3. Ок, а как сохранить это всё после перезагрузки? Дистр Debian

    ReplyDelete

Note: only a member of this blog may post a comment.