Копирование разделов жёсткого диска средствами GNU/Linux: как обойтись загрузочной флешкой там, где раньше нужен был Акронис

С тех пор как до меня дошла благая весть о существовании операционной системы под названием GNU/Linux, которую используют все настоящие программисты, я несколько раз пытался заменить ей детище Билла Гейтса и несколько раз потерпел неудачу.

Гуру поблизости отсутствовали, доступ к интернету был жёстко ограничен и потому любая нетривиальная задача становилась в те времена совершенно нерешаемой.

Потом, когда появился безлимитный интернет, вследствие чего с получением софта и знаний стало существенно легче, я настроил себе дуал бут и стал осваивать Убунту.

Основные сложности в процессе переезда создались в первую очередь из за необходимости бросить знакомые практически с самого детства программки, которые попросту отсутствуют в операционной системе для настоящих программистов.

В большинстве случаев это было не фатально. Вместо привычного foobar всегда можно послушать музыку на Rhythmbox. Вместо Microsoft Office есть OpenOffice. Да, его совместимость с продуктом корпорации зла порой оставляет желать лучшего, но им вполне можно пользоваться для решения повседневных задач среднестатистического пользователя. Обо всяких Файрфоксах, Операх и Хромах я вообще молчу.

Но в некоторых случаях приходилось перезагружать компьютер, выбирать в меню загрузчика пункт Microsoft Windows и делать всё по старинке. Такой задачей было например снятие образа логического диска в целях переноса на другой физический носитель, потому как текущий уже изрядно поистрепался.

Программой, которая использовалась в таких ситуациях, был Acronis. Интуиция подсказывала, что на выяснение того, как обойтись без него, уйдёт не меньше недели, а результат обычно был нужен край через полчаса, поэтому выяснение откладывалось, откладывалось и откладывалось.

Но после очередной дружеской шутки про никому не нужный и ничего не умеющий, а потому бесплатный Линукс, я решил, что в следующий раз для создания образа диска мне не понадобится ничего, кроме загрузочной флешки и командной строки. И отправился гуглить.

Гугл создавал чёткое впечатление, что как клонировать диски средствами опенсорсных ОС, знает каждая собака. Увы, чёткие инструкции по осуществлению общеизвестных и элементарных вещей найти как правило сложнее всего. Какие-то мануалы в результате упорных поисков в конце концов обнаружились, но всё равно с ними пришлось туговато, ибо их явно писали грамотные люди, которые возятся с темой не первый и даже не второй день, и просто не помнят, что знаниями, почитаемыми ими за необходимый минимум, владеют далеко не все.

Теперь, когда ужасы гугления позади, я понимаю, что всё действительно достаточно просто и хочу оформить результаты своих изысканий в виде краткого руководства по работе с образами дисков в GNU/Linux, обращённого в первую очередь к тем, кто привык к Акронису или другой подобной ему программе. Мне в свое время такой документ бы очень сильно помог, надеюсь, что он поможет и кому-то ещё.

Acronis


В Акронисе всё было просто и понятно: оконный интерфейс, подсказки и предшествующий опыт работы с образами компакт дисков делали процесс несложным. Снял образ, вставил новый винт, развернул образ на него — даже и рассказывать то не о чем. В случае с Линуксом процесс захлебнулся на этапе снятия образа — как это сделать было абсолютно неясно. Специальной программки с подсказками не нашлось, программки, которая добавляла в список устройств виртуальный DVD — наподобие Daemon Tools тоже. Да и сам список устройств оказался достаточно проблематичен, поэтому начать можно прямо с него.

Просмотр перечня накопителей


Для каждого подключенного накопителя (винчестера, флешки) в директории /dev можно найти соотвествующий ему файл. Его название состоит из букв sd и буквы, обозначающей номер устройства. То есть винчестеру, подключенному к первому каналу, будет соответствовать файл sda, второму sdb и так далее. Соответственно самый простой способ посмотреть список устройств — ls -1 /dev/sd[a-z]. Эта команда покажет список накопителей, но не даст нам никакой информации о них. А нам нужно хотя бы увидеть список разделов.

Просмотр перечня разделов на накопителе


Каждому разделу в директории dev тоже соотвествует файл. Его название строится из названия файла, соотвествующего накопителю и номера раздела. То есть для накопителя sda, на котором есть 2 раздела, в директории /dev будет создано 2 файла — sda1 и sda2. Посмотреть перечень разделов на накопителе sda можно командой ls -1 /dev/sda[0-9] полный перечень разделов на всех устройствах получается на выводе команды ls -1 /dev/sd[a-z][0-9], а если есть необходимость включить в перечень и сами устройства, то можно просто написать ls -1 /dev/sd*, что значительно менее осмысленно, зато коротко и главное работает. Или, как подсказывают в комментариях, есть ещё вариант cat /proc/partitions

Часто владелец может опознать диск просто по такому перечню (это когда дисков у него не 452), но если этого недостаточно, то можно воспользоваться программой hdparm.

Конкретно hdparm -I /dev/sda выведет подробную информацию об устройстве /dev/sda.

Эту же информацию, но в рассеянном по разным файлам виде, можно найти в директории /sys/block/sda. Например модель диска находится в файле /dev/block/sda/device/model.

Если и этого недостаточно, то остается только по очереди монтировать устройства и смотреть что на них записано. Но это уже совсем другая история.

Снятие образа


Итак, устройство опознано и раздел, с которого нужно снять образ, найден. Теперь собственно процесс.

Общие рекомендации


Образом диска мы обычно называем копию диска на уровне разделов или всего устройства. И если пользователь Windows в ответ на вопрос, как эту копию сделать, обычно слышит рекомендацию воспользоваться специализированным софтом, то в Линуксе всё не так.

Как я уже говорил, здесь каждый диск и каждый раздел диска представлен конкретным файлом. И, так как образ представляет из себя файл с копией диска, логично предположить, что операция снятия образа и операция копирования файла раздела — это одно и то же.

Так оно и есть. Пусть нам надо снять образ раздела /dev/sda2 (на нём Windows 7 обычно держит диск С:) и сохранить его в файл с названием win_c.img.

Для этого достаточно написать cp /dev/sda2 win_c.img. Или cat /dev/sda2 >win_c.img. Короче можно воспользоваться любой программой или комбинацией программ, которая осуществляет копирование файлов.

Правильный способ


Как вы наверное уже догадываетесь, добиться желаемого можно не одним и даже не двумя, остроумными и не очень способами, но правильнее и проще всего на мой взгляд, использовать утилиту ddrescue. Что существенно важно — имеется в виду GNU ddrescue, а не давно уже устаревший оригинал.

Она, также как и cp, занимается копированием файлов, но в случае нахождения ошибок, ddrescue не прервёт работу с радостным сообщением о том, что пациент скорее мёртв, чем жив, а запомнит место с ошибкой, чтобы вернуться к нему позже и попробовать прочитать заново. Теперь уже медленно и нежно.

Используется ddrescue следующим образом:
ddrescue <ключи> <файл который копируем> <новый файл, в который скопируем старый> <лог файл>

ddrescue не способна принимать входные данные с конвейра, или передавать на конвейр результат работы, что впрочем неудивительно. Возможность пропускать места с ошибками при первой итерации и возвращение к ним в последующих циклах подразумевает наличие файлов на выходе и входе.

Команда, которая выполнит операцию, аналогичную описанной выше, будет выглядеть так:

ddrescue /dev/sda2 win_c.img win_c.img.log

Кстати, в данный момент я молчаливо подразумеваю, что жёсткий диск, с которого мы снимаем копию более-менее исправен и фокусов не выкидывает. Если с диском есть серьёзные проблемы, то лучше предварительно ознакомиться с подробностями использования ddrescue, например тут. и применить эти знания при снятии образа.

Неправильный способ


Часто можно встретить рекомендации использовать для копирования файла устройства или раздела программу под названием dd. Как правило, для снятия образа предлагается сделать что-то вот такое:

dd if=/dev/sda2 of=win_c.img

Не делайте так! Хотя семантически подход верен (произойдёт копирование одного файла в другой), последствия могут быть очень печальны. Да, dd превосходит cp в том отношении, что при обнаружении ошибки cp прекратит работу, а dd не прекратит, но если на диске есть битые или просто плохо читаемые сектора, то dd будет продолжать попытки считать их содержимое пока из винчестера не повалит дым.

Да, у dd есть аргумент noerror, но при его использовании копирование может быть выполнено с ошибками, попыток восстановления которых предпринято не будет. ddrescue в аналогичной ситуации после первого прохода вернётся к пропущенным местам и попробует прочитать их маленькими кусочками. И оставит лог файл, с помощью которого можно будет продолжать попытки вычитать сбойные места в будущем.

Короче, используйте ddrescue. А если кроме dd ничего нет, не забывайте про аргумент noerror.

Описанная выше процедура может применяться например для того, чтобы сохранить образ диска с только что установленной операционной системой для последующего восстановления. Да, настоящий линуксоид так поступать не станет, но среди пользователей операционной системы с другим названием это достаточно распространённая практика. И для периодического вдумчивого ремонта регулярно ломающегося компьютера какой нибудь симпатичной девушки её смело могут применять даже любители пингвинов. А если девушек больше некоторого, сугубо индивидуального для каждого самоделкина, количества, то данный метод просто незаменим. Главное не перепутать названия файлов с образами.

Просмотр содержимого образа раздела (логического диска)


Так как каждый раздел диска представлен файлом, можно предположить, что должен существовать штатный способ подключения файлов с образами к файловой системе. С определённой точки зрения так оно и есть. Конкретно для этого используется утилита mount, с помощью которой можно поместить дерево файлов, содержащееся в образе, в любую директорию на ваш выбор. Этот процесс называется монтированием.

Итак, у нас уже есть образ, снятый с диска C: операционной системы Windows 7. Мы назвали образ win_c.img и хотим увидеть его содержимое в заранее созданной директории /mnt/win_c. Для этого надо ввести команду mount -o loop win_c.img /mnt/win_c.

Вот так можно убедиться, что образ, который вы собираетесь накатить на винчестер очередного розового ноутбука, является образом именного того диска C: который ожидается увидеть на данной конкретной машине. Ну, или можно просто скопировать с него файлы без которых никак нельзя обойтись и отправить этот образ во внешнюю тьму. А на ноутбук поставить последнюю Убунту или Федору.

But we can go deeper.

Просмотр содержимого образа физического диска


А вот с монтированием образа диска целиком всё не так просто. Ужасная правда состоит в том, что монтировать файлы из произвольного места файловой системы ядро не умеет и аргумент -o loop, команды mount, сигнализирует о том, что сначала надо связать образ с файлом виртуального устройства в директории /dev, и потом уже присоединить содержимое этого устройства к файловой системе.

Файлы виртуальных устройств создаются заранее (на этапе загрузки системы) и имеют названия loop0, loop1, loop2 и так далее по нарастающей.

Связать образ раздела с одним из этих файлов можно командой losetup. Команда mount из предыдущего раздела на самом деле эквивалентна следующим двум командам.

losetup /dev/loop0 win_c.img
mount /dev/loop0 /mnt/win_c

Но вот для того, чтобы посмотреть содержимое образа в котором есть несколько разделов, этого недостаточно. Дело в том, что если выполнить команду losetup для такого файла, то с устройством /dev/loop0 будет связан весь образ целиком. То есть это устройство будет эквивалентом /dev/sda, а нам нужны эквиваленты /dev/sda1 и /dev/sda2.

Обладатели свежих версий программы losetup (читай гентушники и арчеводы) могут выполнить losetup c аргументом --partscan, что приведёт к автоматическому созданию в директории /dev файлов, соответствующих разделам образа. То есть /dev/loop0p1, /dev/loop0p2 и так далее до самого горизонта. И вот уже эти файлы можно отдавать команде mount.

losetup --partscan /dev/loop0 drive.img
mount /dev/loop0p2 /mnt/win_c

Те же, кому не так повезло с дистрибутивом, могут воспользоваться программой kpartx, которая сделает то же самое, но положит файлы соотвествующие разделaм не в директорию /dev, а в директорию /dev/mapper, откуда их можно монтировать и просматривать.

kpartx -a /dev/loop0 drive.img
mount /dev/mapper/loop0p2 /mnt/win_c

But we can go even deeper than that…

Автоматическое создание файлов разделов при выполнении команды losetup


Вообще-то ядро (а конкретно модуль loop) уже достаточно давно умеет искать в файле образа таблицу разделов и создавать соответствующие файлы, но по умолчанию эта функция отключена.

Включается она если параметр модуля loop max_part не равен нулю. Задать этот параметр можно только при загрузке модуля, поэтому если система уже запущена, модуль надо выгрузить из памяти и загрузить снова с уже заданным параметром. Для этого нужно выполнить следующие две команды.

modprobe -r loop
modprobe loop max_part=63

Однако в некоторых дистрибутивах (напривер в Убунте) модуль loop вкомпилирован в ядро намертво и поэтому для установки параметра придётся вписать loop.max_part=63 в командную строку ядра и перезагрузить систему.

Развёртывание образа на физический носитель


А теперь о том, как собственно накатить образ на другой диск. Как и раньше надо руководствоваться тем, что диски и разделы представлены в виде файлов. И если для снятия образа нужно было создать копию файла устройства или раздела, то для того, чтобы закатать этот образ обратно надо провести операцию копирования в обратную сторону. То есть вместо cp /dev/sda2 win_c.img написать cp win_c.img /dev/sda2. Ну и лучше помнить о советах, изложенных в руководстве по снятию образа. А именно пользоваться ddrescue и не пользоваться dd.

ddrescue --force win_c.img /dev/sda2 win_c_restore.img.log
Конечно следует помнить, что раздел в который мы восстанавливаем образ (в данном случае /dev/sda2) должен быть не меньше файла с образом. Eсли же раздел окажется больше этого файла, то проблем при восстановлении не будет, но в разделе останется неразмеченное пространство. И придётся либо смириться с этим фактом, либо увеличить размер файловой системы до размера раздела каким-нибудь специализированным софтом (увеличивать, впрочем, обычно гораздо проще и быстрее, чем уменьшать).

Сжатие образа раздела (логического диска)


Особенно приятной чертой Акрониса является способность не писать в файл образа куски диска или раздела, которые не содержат файлов. Это позволяет ужать образ до реального объёма данных в разделе или на диске.

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

Однако выход из положения есть. Правда для его использования файловая система, на которой будет храниться образ, должна поддерживать такую специфическую штуку, как sparse файлы.

Sparse файлы


Sparse файл это файл, в котором куски, содержащие нули, на диск не пишутся. То есть, если половина файла заполнена данными, а другая половина нулями — на диск будет записана только половина этого файла и ещё дополнительная информация об областях файла, заполненных нулями. Если область с нулями непрерывна и начинается в середине, то реально на диске файл будет заменять половину от своего теоретического объёма.

Подготовка раздела или устройства к сжатию


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

Но выяснять количество свободного места и передавать его программе, создающей файл, к счастью не обязательно, да и искать программу, создающую файл с нулями, не понадобится. В директории /dev есть безразмерный файл zero, который, как нетрудно догадаться по названию, является неисчерпаемым источником бинарных нулей. Остаётся только скопировать его в нужное место.

Так как файл безразмерен, копирование будет продолжаться до тех пор, пока копия не заполнит всё доступное ей пространство, то есть все свободное место в разделе, что нам собственно и требовалось.

Про то, как копировать файлы стандартными средствами операцинной системы, здесь написано столько раз, что руководство вполне могло бы называться «Искусство копирования файлов в окружении GNU», но так как истина от повторения не тукснеет, я, пожалуй, напишу ещё раз.

Для создания файла с бинарными нулями можно выполнить команду cp /dev/zero zerofile или cat /dev/zero > zerofile.

Создание sparse файла образа устройства или раздела


Большинство утилит для работы с файлами знают о существовании sparse файлов и умеют их создавать. Упомянутой ранее ddrescue, для того, чтобы образ оказался sparse файлом нужно передать ключ --sparse. Теперь результирующий файл будет занимать столько места, сколько ему необходимо, и не больше.

Как быть в случае сжатия образа повреждённого диска


Как известно, многие диски и в руки то брать страшно, какой уж может быть разговор о записывании туда многогигабайтных файлов. Если вам в руки попался именно такой диск, следует сначала снять образ, а потом уже сделать из него sparse файл. Для этого нужно смонтировать полученный образ, потом заполнить свободное место нулями и сделать с образа копию, которая уже будет полноценным sparse файлом. Исходный образ после этого можно удалить.

С копированием файла прекрасно справится cp, которая умеет делать sparse файлы не хуже ddrescue. cp --sparse win_c.img win_c_sparse.img

Конечно, для проведения этих операций потребуется много свободного пространства, но так всё-таки значительно лучше, чем вообще никак.

Заключение


А теперь в сжатом виде о том, что можно почерпнуть из данного руководства.

  1. В Линуксе каждому накопителю и каждому разделу на накопителе соответствует файл.
  2. Так как образ является побайтовой копией содержимого диска или раздела, для его создания достаточно сделать копию соответствующего файла любой программой, умеющей делать копии.
  3. Лучше всего для снятия копии файла, соотвествующего разделу или накопителю, подходит программа GNU ddrescue.
  4. Для восстановления образа достаточно скопировать его обратно.
  5. Для просмотра содержимого образа достаточно смонтировать его в директорию по выбору, также, как система монтирует устройства при загрузке.
  6. Образы разделов и образы накопителей целиком монтируются по разному и не совсем так, как монтируются реальные накопители и разделы.
  7. Для получения сжатого образа раздела нужно особым образом скопировать заранее подготовленный раздел в файловую систему, поддерживающую sparse файлы.

И о том, что из данного руководства почерпнуть нельзя.

  1. Существует специализированный программный комплекс под названием Clonezilla, а также основанный на нём дистрибутив, предназначенный для резервного копирования и восстановления разделов жёсткого диска.
  2. Существуют утилиты ntfsclone и partclone которые владеют знаниями об устройстве файловых систем и используют эти знания например для того, чтобы не писать в бэкап пустое пространство.

P.S. На всякий случай даю ссылку на Slax — дистрибутив, который я ставлю на загрузочные флешки. Он умеет копировать себя в оперативную память и в нём по умолчанию есть ddrescue.
Поделиться публикацией
Похожие публикации
AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Подробнее
Реклама
Комментарии 59
  • +1
    Просмотр перечня разделов на накопителе

    cat /proc/partitions
    fdisk -l

    Неправильный способ

    Вполне себе правильный, если вы уверены, что диск жив. А если еще учесть, что дисковые массивы на рабочих станциях или рабочие станции на виртуалках нынче не редкость, то тоже вполне рабочий способ

    И про netcat не забывайте. Чаще всего сам по себе образ не нужен бывает.
    • 0
      Я ограничился вариантами команды ls для просмотра списка устройств потому, что мне хотелось лишний раз сделать акцент на том, что каждому разделу и устройству соответствует файл. Хотя cat /proc/partitions наверное и вправду надо добавить.

      А вот по поводу уверенности что диск жив — я предпочитаю перестраховаться. Особенно если я этот диск в первый раз вижу.

      Что касается netcat — это наверное уже тема для отдельной статьи.
      • 0
        sd[a-z] это только sata/(возможно sas) диски. Например диски в KVM называются vd[a-z], в Xen xvd[a-z] (насколько помню). Есть флопики (fd), IDE диски (hd*). Поэтому смотреть листинг /dev не показательно. Лучше воспользоваться /proc/partitions
    • +3
      dd if=/dev/sda2 of=win_c.img bs=1000000
      ставлю параметр bs чтобы ускорить копирование. Сейчас редко пользуюсь копированием диска из-за повального внедрения raid массивов. А раньше нужно было только для миграции с одной машины на другу, вариантов с дохлым диском за все время было один или два и там dd проходил нормально.
      • +1
        Есть мнение, что лучше делать bs кратным размеру сектора диска. Т.е. где-нибудь 4096*N. Или даже (2^19)*N, если учитывать размер блоков стирания в SSD.

        Короче, пшиите bs=1048576 или bs=$((1024*1024)) и будет вам щасте (заодно с количеством ноликов сложнее промахнуться).
        • +11
          bs=16M
          • 0
            разве оптимально размер bs устанавливать равным размеру кеша устройства, на которое записывают?
          • +1
            Если диск заполнен не под завязку, размер образа можно уменьшить
            Пример 14. Создание резервного образа жесткого диска:

            # dd if=/dev/hda | gzip > /mnt/hdb1/system_drive_backup.img.gz

            Команда dd создает образ первого жесткого диска и по конвейеру (не забудьте про стандартный вывод по умолчанию) передает программе сжатия gzip. Сжатый образ затем помещается в файл system_drive_backup.img.gz, находящийся на другом диске (hdb1). Чтобы произвести обратное действие:

            # gzip -dc /mnt/hdb1/system_drive_backup.img.gz | dd of=/dev/hda

            Программа gzip распаковывает (опция -d) файл, передает результат на стандартный выход (опция -c), по конвейеру данные поступают программе dd, которая записывает выходной файл (устройство /dev/hda).

            Незаметно мы рассмотрели почти все значения (фильтры) операнда conv. Тут и ману конец. Но сначала несколько правил относящихся к взаимодействию операндов.

            Правило 1. Все операнды обрабатываются до начала чтения входных данных. В практическом смысле это значит, что можно писать операнды в любом порядке — результат будет один. Скажем команда:

            # dd if=/dev/hda of=/dev/sda conv=noerror,sync bs=4k

            равносильна команде

            # dd bs=4k conv=noerror,sync if=/dev/hda of=/dev/sda

            Правило 2. Если операнды (кроме conv=) указаны более одного раза, будет использоваться значение из последней пары операнд=значе

            rus-linux.net/lib.php?name=/MyLDP/consol/dd/dd-3.html#13
            • 0
              Такой образ к сожалению не получится смонтировать и посмотреть что там внутри. Его придётся сначала разжать.
              • 0
                Можно использовать SquashFS — специальную файловую систему для хранения файлов в сжатом виде.
          • 0
            И еще лайфхак: «раздвинуть» или «сжать» раздел можно с помощью gparted, параллельно смотря в details какие команды она для этого использует.
            • 0
              тот же gparted умеет копировать разделы. Есть загрузочный линукс Puppy, там gparted есть в стандартной поставке. Примечателен малым размером и стартует практически на любом железе.
              • +1
                У gparted есть один фатальный недостаток. Он, о ужас, работает в графическом режиме :).
                • 0
                  В случае десктопа графический режим совершенно не мешает, а наоборот. И потом… Его интерфейс работает в графическом режиме, а исполнение конкретных команд идет просто в терминальной сессии.
                  Опять же, подсмотрев в details gparted, можно выполнить последовательность операций на сервере в терминале ручками. Хотя это уже лишнее — не надо сервер лечить с помощью dd, только если там что-то действительно очень ценное. И то… Снять образ, и закинуть данные на новый, хорошо настроенный сервер.
                  • 0
                    Дело вкуса наверное. Но тут у меня вся статья именно о том, как сделать в консоли. Я в самом начале об этом написал.
                  • 0
                    Можно его консольный backend юзануть, есть не лень
                    • 0
                      parted? Там, насколько я помню, после версии 2.4 убрали возможность копирования, изменения размера и вообще всего, что требовало знаний об устройстве файловой системы. Можно конечно пользоваться старым, но мне больше нравится использовать для ресайза утилиты, разработанные для конкретных файловых систем.
              • +2
                Комментарий удалён — я ошибся веткой.
                • +1
                  Хорошо, что в матчасти разобрались, а так есть специализированный дистрибутив с возможностью создания загрузочной флешки — Clonezilla
                  • 0
                    Она еще и по сети все лить умеет, и файловые системы архивировать, не трогая неиспользуемые блоки (благодаря отдельному инструменту — partimage).
                    • 0
                      Последний раз когда я интересовался partimage — возможности монтировать созданные образы ещё не было. Может конечно сейчас что-то изменилось.
                    • 0
                      Partimage (или partclone, не помню точно) — как раз та штука, благодаря которой Clonezilla до сих пор не умеет разворачивать образ на диск меньшего размера, хотя задача сама по себе весьма тривиальна. Разумеется я имею в виду случай, когда на физический диск размером 500ГБ установлена система, занимающая 5ГБ. Clonezilla хранит данные о геометрии диска сразу в нескольких местах, в том числе и в самом образе partclone, причём в обязательно порядке сверяется с его данными вне зависимости от выставленных флагов при восстановлении. Было дело провозился несколько часов, вручную исправляя геометрию в конфигах образа клонзиллы, и даже успешно восстановил диск С, но запоролся на диске Д. Может кто сталкивался с такой проблемой?

                      По материалам статьи. До того, как я начал работать с клонзиллой я делал образы связкой dd и rsync — через dd копировал MBR, монтировал сам раздел, копировал его rsync'ом, и сжимал в tar-архив. Образы получались равными или меньшими по размеру, чем исходные данные, плюс с ними было удобно работать как с обычными папками в том числе модифицировать. Именно таким образом я забэкапил диск восстановления Windows 8 с новенького ноутбука (т.к. изначально не планировалось оставлять Windows, но админское чутьё заставило сделать копию). Кому будет интересно можете прочитать тут.
                  • 0
                    Префикс s в /dev/sda используется для raid, sata-винчестеров и флешек, а префикс h для IDE-винчестеров, например /dev/hda.
                    • +3
                      Это было так до того, как в ядре перешли на libata, уже давно и IDE-диски /dev/sd*.
                      • 0
                        Если так, то спасибо за информацию.
                      • +1
                        а префикс h для IDE-винчестеров, например /dev/hda

                        Это с некоторых пор уже не обязательно так.
                      • +4
                        А вот с монтированием образа диска целиком всё не так просто
                        Все очень просто:
                        $ /sbin/fdisk -lu disk.img
                        You must set cylinders.
                        You can do this from the extra functions menu.

                        Disk disk.img: 0 MB, 0 bytes
                        255 heads, 63 sectors/track, 0 cylinders, total 0 sectors
                        Units = sectors of 1 * 512 = 512 bytes

                        Device Boot Start End Blocks Id System
                        disk.imgp1 * 63 96389 48163+ 83 Linux
                        disk.imgp2 96390 2056319 979965 82 Linux swap / Solaris
                        disk.imgp3 2056320 78140159 38041920 5 Extended
                        disk.imgp5 2056383 3052349 497983+ 83 Linux
                        disk.imgp6 3052413 10859939 3903763+ 83 Linux
                        disk.imgp7 10860003 68372639 28756318+ 83 Linux
                        disk.imgp8 68372703 76180229 3903763+ 83 Linux
                        disk.imgp9 76180293 78140159 979933+ 83 Linux

                        mount -o loop,offset=$((10860003 * 512)) disk.img /mnt
                        • +1
                          Можно еще проще утилитой kpartx она читает список разделов файла disk.img и подключает в ввиде блочных устройств в папку /dev/mapper
                          • 0
                            Про неё в статье писали, но я не понял чем же она хуже losetup:
                            Те же, кому не так повезло с дистрибутивом, могут воспользоваться программой kpartx
                            • 0
                              kpartx в данном случае ничем не хуже. Свежий дистрибутив по моему лучше несвежего.
                              А вообще у losetup область применения пошире.
                          • 0
                            Так и вправду можно. Но в тексте по ссылке как раз написано, что это всё очень муторно и неудобно. Настолько неудобно, что автор сделал утилиту, которая занимается тем же, что kpartx и последние версии losetup с аргументом --partscan.
                            Поэтому насчёт простоты вопрос спорный.
                          • 0
                            Решения Акронис есть и под Linux =)
                            • +4
                              И лично мне особенно приятно, что тут можно обойтись и без них :).
                            • 0
                              — уже написали
                              • +1
                                Clonezilla на вас обиделась.
                                • +1
                                  Я как-то думал на тему opensource-решения, которое бы не сильно уступало Acronis.
                                  Вышло вот что:
                                  — Структуру разделов сохраняем через sfdisk для mbr или sgdisk для gpt
                                  — Загрузчик для mbr сохраняем копированием в образ всего пространства с начала диска до начала первого раздела (заодно будет вторая копия таблицы разделов)

                                  С ФС сложнее, нужно, чтобы было как в Acronis:
                                  — образ поддерживает сжатие на лету, а не через gzip и пайп
                                  — в образ попадают только используемые сектора
                                  — образ можно смонтировать и вытащить из него отдельные файлы

                                  Делаем так:
                                  — через qemu-img создаем образ в формате qcow2 в режиме thin-provisioning с логическим размером во весь диск
                                  — монтируем образ в блочное устройство
                                  — форматируем его в btrfs
                                  — монтируем btrfs, включаем на btrfs сжатие файлов
                                  — утилитой partclone копируем разделы (она поддерживает даже vmfs)
                                  — размонтируем все

                                  Получаем контейнер, который можно смонтировать, а потом через imagemount смонтировать и образ partimage. Imagemount может монтировать раздел и на запись, но нужен еще и временный файл, в который она будет скидывать изменения.

                                  И да, посмотреть разделы на диске можно через blkid / lsblk / fsarchiver probe
                                  • 0
                                    Я тут уже признал один комментарий лучшим в топике, но ваш похоже первый кандидат на победителя в номинации «Самый полезный». Странно, что я заметил его так поздно — видимо пропустил.
                                    Единственное, что мне не совсем понятно, зачем через qemu-img создавать образ в формате qcow2 в режиме thin-provisioning с логическим размером во весь диск. Подозреваю для того, чтобы в образ попадали только используемые сектора, но не уверен. Надо читать маны наверное.
                                    В любом случае огромное спасибо!
                                  • 0
                                    Во-первый в большинстве случаев достаточно одной команды dd, для любителей графического интерфейса (меня, например), в той же Ubuntu есть дисковая утилита, через которую можно и образы снимать, и заливать их обратно.
                                    Монтируются образы открытием файла в файловом менеджере.
                                    Чаще всё на много проще, чем кажется.
                                    • 0
                                      В большинстве случаев хватит даже cp. А насчёт программы для любителей графического интерфейса любопытно. Название не подскажете?
                                      • 0
                                        «Disk» введите в Dash:)
                                        gnome-disks называется, есть во многих дистрибутивах з Unity/GNOME
                                    • +1
                                      Хм. Я линуксовые разделы бэкапил простым rsync -axv в каталог на другом диске. Плюсы — даже монтировать ничего не надо, чтобы посмотреть содержимое. Иногда нужно глянуть старый конфиг или еще что-то. Точно так же подменяется содержимое целевого диска резервной копией. Главное, чтобы MBR указывал на загрузочный раздел правильно.
                                      • 0
                                        Ну и не забудьте про мгновенные снапшоты lvm/btrfs с CoW. Для долгосрочного хранения не так удобны, но для экспериментов (например переход на нестабильную ветку дистрибутива) — панацея.
                                        • 0
                                          Я как-то на обычном ext4 привык. Для экспериментов у меня сервер с KVM-машинами.
                                          • 0
                                            Для смелых есть btrfs send/receive.
                                        • +5
                                          Автор, вы смешали в одну кучу обычное копирование и копирование с поврежденных дисков.
                                          Когда вам удобно, вы переходите с одного на другое.
                                          Например, вы пишете про обычное копирование и предлагаете cp, cat.
                                          Потом вы пишете про копирование с поврежденных дисков, и тут вы не рекомендуете dd, предлагая ddrescue.

                                          Это очень разные задачи и для них нужно использовать свои инструменты.
                                          При работе с поврежденным разделом cp и cat так же не рекомендуются, как и dd.
                                          Да и acronis тут тоже может быть не уместен.

                                          А при работе с рабочим разделом, как раз лучшие инструменты — это dd, parted/gparted, partclone/partimage/ntfsclone и тот же clonezilla.
                                          У dd параметр bs позволяет хорошо поднять скорость копирования, особенно на быстрых дисках с большим кешем.
                                          parted/gparted позволяет это делать в пару команд.
                                          partclone/partimage/ntfsclone позволяет ужимать раздел без всяких sparse.
                                          А clonzilla — отличный opensourse заменитель acronis в нише livecd.

                                          В этом минус смешивания целей — неправильно оцениваются инструменты.
                                          Теперь представьте, как вашу статью читают новички и запоминают использовать ddrescue на рабочих разделах.
                                          А dd станет для них «неправильной» командой.

                                          В остальном интересно, особенно способ ужать раздел через «cat /dev/zero >» и "--sparse".
                                          • 0
                                            Дело в том, что я действительно считаю dd неправильной командой которую можно использовать только если хорошо знаешь, что делаешь. Это как с оператором goto. Дийкстра предложил считать его вредным давным давно и ныне с этим мало кто спорит. Тем не менее, goto широко используется в узких кругах с исключительно мирными целями.

                                            Если диск хороший, то можно использовать cp, cat или dd или что-то ещё. И, за исключением отдельных случаев, ddrescue тут ничем не хуже любых других вариантов, включая dd. Важно помнить, что устройствам и разделам соответствуют файлы, а дальше дело пойдёт само :). Я вот нередко использую pv просто потому, что мне нравится ползунок.

                                            Но что если насчёт диска полной уверенности нет? Тогда cp существенно лучше, чем dd без аргумента noerror, так как dd потенциально может испортить диск. А с аргументом noerror dd лучше чем ddrescue только тем, что в состоянии отправить результаты работы в пайп. Если вы готовы ради этой возможности отказаться от автоматической вычистки сбойных мест, то наверное у вас есть на то веские причины и вы чётко знаете, что делаете. То есть вы видимо не новичок.

                                            А вот новичкам типа меня думаю имеет смысл знать о существовании dd но прибегать к этой программе исключительно как к последнему средству. В том числе из-за нестандартного способа передачи аргументов. ddrescue, с моей точки зрения, даёт дополнительные гарантии безопасности не привнося дискомфорта.

                                            Ну и коротко об остальном.
                                            parted c версии 3.0 по моему отказался от всего, что не связано непосредственно с разметкой дисков. Я считаю оно и к лучшему.
                                            Про partclone, ntfsclone и clonezilla я упомянул в послесловии. Не сказать про них вообще было невозможно, но подробный рассказ привнёс бы изрядный кусок хаоса в статью, которая и так, как вы справедливо заметили, смешивает обычное копирование и копирование с повреждённых дисков. Кроме того хотелось описать какой-то дубовый способ, который будет работать вообще везде. В том числе поэтому в статье подробно разобран вариант с использованием losetup, хотя kpartx в общем-то решает проблему.
                                            • 0
                                              Честно говоря, из ваших слов непонятно, в чем неправильность dd при работе с рабочим диском.
                                              Ну и чем cat и cp лучше при битом разделе? Тем, что выдают ошибку?
                                              Если у вас есть подозрения насчет диска, диск можно проверить на ошибки перед копированием.
                                              И по результатам проверки, станет ясно, какая перед вами стоит задача — копирование, или спасение.
                                              А так вы функции детектирования переносите на cat и cp (которые для этого не предназначены и могут обмануть).

                                              Имхо, у пользователей типичный случай — у пользователя есть два рабочих жестких диска и нужно перекинуть раздел.
                                              Например, пользователь купил более ёмкий диск и ему нужно перенести раздел со старого диска на новый.
                                              Скорее всего на старом диске ошибок нет, диск рабочий и просто заменяется на новый.
                                              В таком типичном случае dd отлично справляется со своей ролью, развивая бОльшую скорость, чем cp.
                                              Ну а *clone ещё быстрее, по понятным причинам.
                                              Если на диске идут такие ошибки, что чтение будет спотыкаться, пользователь об этом узнает ещё до копирования.
                                              Щелкающий диск, тормоза в работе системы и т.д.
                                              И выберет другие инструменты.

                                              Вообще файлы устройств — это не обычные файлы, это блочные файлы.
                                              Например, вот краткое описание типов файлов: www.linuxcenter.ru/lib/books/kostromin/gl_04_04.phtml
                                              При работе с ними, я бы не рекомендовал использовать cp.
                                              Вот тут cp можно назвать неправильной командой — некоторые файлы она просто не сможет скопировать.
                                              Тут уместнее cat, или dd (как продвинутый вариант cat).

                                              P.S.
                                              Я тут подумал, возможно в вашей практике вам чаще приходится работать с битыми дисками?
                                              Тогда ваша точка зрения станет более понятна.
                                              • 0
                                                Да, я считаю, что в случае с разделом, у которого чисто теоретически могут быть проблемы, cp лучше dd тем, что просто прервёт работу, а не ушатает диск вусмерть. Если с разделом по какой-то причине не справилась cp то видимо придётся иcпользовать ddrescue. Поэтому лучше начать сразу с неё, так как накладные издержки вообще отсутствуют.
                                                У меня в основном получается что типичный случай это когда я диск раньше никогда не видел. И можно конечно его проверить, но наверное он нормальный. Однако на случай, если там есть незначительные проблемы, я предпочитаю перестраховаться. И, как показывает практика, не зря. Несколько раз нарывался на проблемные устройства.

                                                Насчёт скорости интересный вопрос. Думаю, что если задать dd неправильный размер блока, можно эту скорость сильно снизить. cp неправильный размер блока задать вроде бы нельзя. Но допустим dd настроена идеально. Любопытно каким будет выигрыш в скорости. Я об этом как-то не думал.

                                                И хочется немного отвлечься от cp vs dd. Скажите, вы видите какие-нибудь причины использовать не ddrescue, а dd? Я придумал только большую распространённость последней, а также возможность направить результаты её работы в пайп.

                                                • 0
                                                  У меня практически не было ситуаций, когда нужно слить данные с битого диска, поэтому ddrescue я пользовался 1-2 раза.
                                                  Современные винты, даже десктопные, вроде бы редко обзаводятся битыми областями, если их не ронять.
                                                  У серверных винтов другая проблема — умирает контроллер и уже никакие данные не считать.
                                                  Хотя на серверных винтах обычно рейд, поэтому и данные снимать нужды почти не возникает.
                                                  Чаще образы нужно копировать при работе с виртуалками.
                                                  А там обычные операции — в стиле «dd | gzip | ssh 'cat — > file'».
                                                  Когда у рейд контроллера большая память dd bs=1g работает куда быстрее, чем без bs.
                                          • +1
                                            устаревший оригинал GNU ddrescue это вы в сторону dd_rescue ( Latest version is 1.46 (2014-08-09) )киваете? а ну ка перекиньте мне гну-той версией образ в рилтайме по сети и с сжатием?)
                                            • +1
                                              Ваш комментарий официально признан мной лучшим комментарием в этом топике!
                                              Я кивал именно в сторону dd_rescue. И я был совершенно не в курсе. Эта новость для меня прямо как гром с ясного неба. В общем да, неловко как-то получилось.
                                              В своё оправдание хочу сказать, что судя по чейнджлогу, в развитии программы была длинная пауза с 2006 по 2010 или около того.
                                              Огромное спасибо за информацию! Я изучу вопрос подробнее и, если dd_rescue действительно делает то, о чём вы говорите без каких нибудь неприятных побочных эффектов, то я добавлю упоминание об этом в статью и напишу отдельную публикацию, посвященную отличиям актуальной гнутой версии от актуальной версии оригинала.
                                            • 0
                                              Весь вопрос в том, для чего именно нужна копия диска.
                                              Если для того, чтобы вытаскивать оттуда файлы — то клон строго говоря не нужен. Достаточно сделать из диска squashfs — и плюшки вроде сжатия и возможности произвольного доступа будут налицо. К тому же (достаточно часто) squashfs окажется быстрее, чем клонирование (чистый io записи «копии» меньше).
                                              Физическое клонирование может быть нужно, например, в случае потери данных — чтобы потом не спеша выковыривать их из секторов образа.
                                              А вот sparse — это must have для ssd-дисков (особенно для разворачивания клона обратно на диск). Потому что в противном случае нулевые секторы, записанные на диск — это всё же данные, а не «незанятое место». Соответственно, они будут занимать ячейки (меньше пространства для вейеринга); они контроллер будет честно их считывать и выдавать в шину, вместо того, чтобы пускать туда дефолтный поток нулей, зная, что ячейки не заняты.
                                              • 0
                                                Для тех, кто перешел на рейды с lvm, ls /dev/sd* не поможет в выяснении конфигурации конечных разделов. Мне совсем недавно открыли команду lsblk — рекомендую.
                                                • 0
                                                  Совпадение или вдохновение? :)
                                                  • +1
                                                    Не плохая сатья, но уже не актуальная, с появлением fsarchiver. Работает очень быстро, сильно сжимает и самое главное что можно снимать образа с используемых разделов.
                                                    Пример использования:
                                                    fsarchiver -e '*.log* swap /var/lib/postgresql/9.1/main/base/4339358/* /usr/src/*'
                                                    -v -a -A savefs backup.fsa
                                                    /dev/md0
                                                    /dev/mapper/vgroot-lvroot
                                                    /dev/mapper/vghome-lvhome
                                                    Создаст архив файловых систем backup.fsa с разделами md0, vgroot-lvroot, vghome-lvhome и исключит '*.log* swap /var/lib/postgresql/9.1/main/base/4339358/* /usr/src/*'
                                                    Так можно посмотреть что в архиве
                                                    fsarchiver archinfo backup.fsa

                                                    Так восстанавливаем:
                                                    fsarchiver restfs backup.fsa id=0,dest=/dev/sda1
                                                    Извлекаем образ с номером -0 (/dev/md0) на устройство /dev/sda1
                                                    Восстанавливать можно на раздел с меньшим объемом, но места должно хватать для распаковки.

                                                    ПС с lvm образа работающих разделов можно снимать при помощи snapshot-ов.

                                                    • 0
                                                      Есть удобный скрипт, который позволяет сразу же ремаппить сбойные сектора (диска, откуда читаем) контроллером винта (во всяком случае, если место под ремап в служебной области осталось). Потому что практика подсказывает, что, если сектор не прочитался с первого раза — шансы его прочитать без засовывания винта в холодильник почти нулевые.

                                                      Вот он: https://techoverflow.net/blog/2015/01/07/fixing-bad-blocks-on-hdds-using-fixhdd.py/
                                                      Зеркало: https://github.com/unxed/fixhdd

                                                      Запускать так:
                                                      sudo fixhdd.py --loop /dev/sda
                                                      где /dev/sda — (потенциально) сбойный диск, с которого читаем.

                                                      При этом скрипт будет висеть в памяти и раз в 5 секунд сканировать системный лог на предмет сообщений об ошибках чтения, извлекать оттуда LBA-адреса сбойных секторов и писать в эти сектора нули, чтобы контроллер винта мог смело заремаппить сектор (при чтении-с-ошибками контроллер этого сделать не может, так как это — гарантированная потеря данных, которые, возможно, всё же есть какой-то маленький шанс считать).

                                                      Опыт показывает, что в случае сбойных винтов этот способ существенно повышает вероятность того, что работа ddrescue вообще когда-нибудь завершится.

                                                      Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.