воскресенье, 24 мая 2015 г.

Работа с образами дисков в GNU/Linux

В этой статье описываются основные принципы в работе с образами жестких дисков и CD/DVD. Первоначально статья была написана очень давно для Wiki Калиниградской группы пользователей Linux, но так часто выручала меня, что решил перенести и сюда. Со временем, вероятно, будет дополнена материалом по работе с образами в контексте одноплатных компьютеров типа Raspberry PI.

Создать образ CD/DVD очень просто:
dd if=/dev/sr0 of=/path/to/image.iso
/dev/sr0 - имя привода;
/path/to/image.iso - путь, куда сохранить образ диска с именем image.iso;
Таким образом всё содержимое диска скопируется один-в-один со всеми данными и файловой системой. Теперь вероятно вам понадобится смонтировать этот образ локально и работать с ним как со смонтированным диском:
mount -o loop /path/to/image.iso /path/to/mount
/path/to/mount - каталог, куда нужно смонтировать образ;

В случае с образами жестких дисков всё несколько сложнее.

Сохранить в образ один раздел жесткого диска можно так же просто как и в случае с CD/DVD, только указав номер раздела вместо всего устройства:
dd if=/dev/sda1 of=/path/to/image
Теперь этот файл-образ раздела sda1 можно смонтировать так же как и образ CD/DVD.
А если, вы хотите создать образ всего жесткого диска со всеми разделами и со всей информацией на них? Опять обращаемся к dd:
dd if=/dev/sda of=/path/to/image
Эта команда сохранит всё содержимое диска sda в файл image. Удобно для переноса системы на другой диск, или для резервной копии системы.
Теперь если вам понадобится получить доступ к файлам на этом образе диска, то делается это так:
С помощью fdisk узнаем начальный сектор нужного раздела на образе (у нас ведь весь диск с разделами)
fdisk -lu /path/to/image
Вывод будет выглядеть примерно так:
Вы должны установить цилиндры.
Вы можете сделать это из меню дополнительных функций.
Диск /mnt/disk2/backup/system_root/image: 0 МБ, 0 байт
255 heads, 63 sectors/track, 0 cylinders, всего 0 секторов
Units = секторы of 1 * 512 = 512 bytes
Disk identifier: 0x00013488
                                          Устр-во Загр     Начало       Конец       Блоки   Id  Система
/mnt/disk2/backup/system_root/image1   *          63    20498939    10249438+  83  Linux
/mnt/disk2/backup/system_root/image2        20498940    76967414    28234237+   f  W95 расшир. (LBA)
/mnt/disk2/backup/system_root/image3        76967415    78236549      634567+  82  Linux своп / Solaris
/mnt/disk2/backup/system_root/image5        20499003    76967414    28234206   83  Linux
Вот видно какие разделы существуют в этом образе диска. Почему есть 1, 2, 3 и 5, но нет 4 раздела? Потому что используется MBR и 5 - логический диск на расширенном разделе 2. Подробнее об этом можете узнать из других источников. Давайте смонтируем 5-й раздел. fdisk говорит нам, что в каждом секторе 512 байт и даны начальные сектора каждого раздела. В отличии от реального диска с реальной геометрией к файлу нельзя обратится по номеру сектора, поэтому нужно узнать начало нужного раздела в байтах:
20499003*512 = 10495489536
Это значит, что раздел #5 начинается с 10495489536-го байта в файле.
Монтируем его:
mount -o loop,offset=$((20499003*512)) /path/to/image /path/to/mount

Опция offset означает, что монтировать образ нужно не с начала, а со смещением равным (20499003*512). Тип файловой системы и конец раздела mount узнает из загрузочного сектора раздела, поэтому больше опций как правило не требуется.
А что если нужно изменить размеры разделов или отформатировать раздел на образе диска?
Просто так натравить программу по разметке дисков на файл нельзя. В этом поможет losetup:
losetup /dev/loop /path/to/image
Теперь файл-образ диска как-бы примонтирован к устройству /dev/loop0 и с ним можно работать как с обычным диском (двигать разделы, форматировать и т.д.).
fdisk -l /dev/loop0
Диск /dev/loop0: 40.0 ГБ, 40060403712 байт
255 heads, 63 sectors/track, 4870 cylinders
Units = цилиндры of 16065 * 512 = 8225280 bytes
Disk identifier: 0x00013488
Устр-во Загр     Начало       Конец       Блоки   Id  Система
/dev/loop0p1   *           1        1276    10249438+  83  Linux
/dev/loop0p2            1277        4791    28234237+   f  W95 расшир. (LBA)
/dev/loop0p3            4792        4870      634567+  82  Linux своп / Solaris
/dev/loop0p5            1277        4791    28234206   83  Linux%%
 
Обратите внимание, что файлов устройств разделов (loop0p1 и т.д.) не существует. Если нужно будет "примонтировать" какой-то раздел из образа, то опять же надо использовать смещение:
losetup /dev/loop0 /path/to/image -o $((20499003*512))
Проверяем что там получилось:
file -s /dev/loop0
/dev/loop0: Linux rev 1.0 ext3 filesystem data (large files)
Теперь /dev/loop0 можно смонтировать с помощью mount и так же получить доступ к файлам.

Применительно к резервным копиям с помощью dd полезная статья http://mydebianblog.blogspot.ru/2008/03/dd.html

Комментариев нет:

Отправить комментарий