FastNetMon

Показаны сообщения с ярлыком dd. Показать все сообщения
Показаны сообщения с ярлыком dd. Показать все сообщения

среда, 15 июня 2011 г.

Как просмотреть статус копирования команды dd?

Итак, есть долго работающая команда dd:

dd if=/dev/sdb3 of=/dev/zero bs=1M &

Как просмотреть, в каком состоянии сейчас копирование? Легко!

Узнаем pid процесса dd:
ps aux | grep dd
root 2 0.0 0.0 0 0 ? S< 09:54 0:00 [kthreadd] root 32228 17.0 0.0 5916 1624 pts/0 D 14:39 0:01 dd if /dev/sdb3 of /dev/zero bs 1M root 32239 0.0 0.0 4848 772 pts/0 S+ 14:39 0:00 grep dd




Посылаем процессу сигнал USR1:
kill -USR1 32228

В ответ на это dd выласт текущий прогресс копирования:
25289+0 записей считано
25288+0 записей написано
скопировано 26516389888 байт (27 GB), 417,757 c, 63,5 MB/c

пятница, 20 мая 2011 г.

Создание полноценной таблицы разделов в файле

Очевидный подход - создать файл, заполненный нулями, и попробовать создать в нем таблицу разделов. Итак, платформа: Debian 6 Squeeze.

Пробуем:
dd if=/dev/zero of=whole_disk.img bs=512 count=10000000
10000000+0 records in
10000000+0 records out
5120000000 bytes (5.1 GB) copied, 34.7126 s, 147 MB/s

Создаем таблицу разделов:
parted whole_disk.img mklabel msdos

Создаем 1 раздела:
parted whole_disk.img mkpart primary ext3 1 1024
parted whole_disk.img mkpart primary ext3 1024 100%

И в результате получили два аккуратненьких раздела:
parted whole_disk.img
GNU Parted 2.3
Using /root/whole_disk.img
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) p
Model: (file)
Disk /root/whole_disk.img: 5161MB
Sector size (logical/physical): 512B/512B
Partition Table: msdos

Number Start End Size Type File system Flags
1 1049kB 1024MB 1023MB primary
2 1024MB 5160MB 4136MB primary

(parted)

Но fdisk на них орет благим матом:
fdisk -l whole_disk.img
You must set cylinders.
You can do this from the extra functions menu.

Disk whole_disk.img: 0 MB, 0 bytes
4 heads, 32 sectors/track, 0 cylinders
Units = cylinders of 128 * 512 = 65536 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x0003e6d7

Device Boot Start End Blocks Id System
whole_disk.img1 17 15632 999424 83 Linux
Partition 1 has different physical/logical endings:
phys=(1023, 3, 32) logical=(15631, 3, 32)
whole_disk.img2 15633 78736 4038656 83 Linux
Partition 2 has different physical/logical beginnings (non-Linux?):
phys=(1023, 3, 32) logical=(15632, 0, 1)
Partition 2 has different physical/logical endings:
phys=(1023, 3, 32) logical=(78735, 3, 32)

Но если файл смонтировать как диск:
losetup /dev/loop0 whole_disk.img

То с выдачей fdisk станет все ок:
fdisk -l /dev/loop0

Disk /dev/loop0: 5120 MB, 5120000000 bytes
4 heads, 32 sectors/track, 78125 cylinders
Units = cylinders of 128 * 512 = 65536 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000a619a

Device Boot Start End Blocks Id System
/dev/loop0p1 17 15632 999424 83 Linux
/dev/loop0p2 15633 78112 3998720 83 Linux

Теперь нам нужно каким-то образом подключить массивы на этом диске к системе. Для этого установим kpartx:
apt-get install kpartx

Для начала получим список имеющихся массивов:
kpartx -l /dev/loop0
loop0p1 : 0 1998848 /dev/loop0 2048
loop0p2 : 0 7997440 /dev/loop0 2000896

Отлично, теперь подключим их к системе через device mapper:
kpartx -a /dev/loop0

После этого у нас появятся два раздела в системе:
ls -al /dev/mapper/
total 0
drwxr-xr-x 2 root root 100 May 20 01:17 .
drwxr-xr-x 18 root root 3.2K May 20 01:17 ..
crw------- 1 root root 10, 59 May 19 21:41 control
lrwxrwxrwx 1 root root 7 May 20 01:17 loop0p1 -> ../dm-0
lrwxrwxrwx 1 root root 7 May 20 01:17 loop0p2 -> ../dm-1

Это как раз разделы с нашего виртуального жесткого диска. Все, теперь с ними можно работать как угодно!

После окончания работ отмонтируем все:
kpartx -d /dev/loop0

Все ок:
ls -al /dev/mapper/
total 0
drwxr-xr-x 2 root root 60 May 20 01:19 .
drwxr-xr-x 18 root root 3.1K May 20 01:19 ..
crw------- 1 root root 10, 59 May 19 21:41 control

Неизвестный 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