Я занимаюсь восстановлением данных с жесткого диска. На диске около 300 ГБ данных, но мне не хватает другого жесткого диска, на котором было бы 300 ГБ свободного места.
У меня три жестких диска, свободно на 150, 40 и 120 ГБ.
Для создания первого чанка я собирался сделать следующее:
sudo dd if=/dev/sdf1 bs=4096 count=150G | gzip > img1.gz
Что мне следует запустить на других машинах, чтобы «продолжить с того места, где я остановился»?
Простым решением может быть просто использование «/ usr / bin / split». Он просто разбивает файлы на части. Вы можете использовать «-» в качестве имени входного файла для чтения со стандартного ввода. Преимущество разделения в том, что оно простое, оно никак не влияет на цепочку инструментов, и вы можете «соединить» файлы, просто используя «cat», чтобы объединить их вместе (или передать их другому приложению).
Это моя командная строка:
dd if=/dev/sda bs=4M | gzip -c | split -b 2G - /mnt/backup_sda.img.gz
Он создаст файлы размером 2 ГБ следующим образом:
backup_sda.img.gz.aa
backup_sda.img.gz.ab
backup_sda.img.gz.ac
Восстановить:
cat /mnt/UDISK1T/backup_sda.img.gz.* | gzip -dc | dd of=/dev/sda bs=4M
Надеюсь, поможет.
Вы, вероятно, захотите рассмотреть возможность использования tar
, как говорит KPWINC, но чтобы напрямую ответить на ваш вопрос, вы хотите использовать dd
вариант "пропустить".
Если ваша первая команда, как указано, следующая:
sudo dd if=/dev/sdf1 bs=4096 count=150GB | gzip > img1.gz
Тогда ваш второй будет:
sudo dd if=/dev/sdf1 bs=4096 skip=150GB count=40GB | gzip > img2.gz
и третье:
sudo dd if=/dev/sdf1 bs=4096 skip=190GB count=120GB | gzip > img3.gz
Тем не менее, я не уверен, что суффикс «GB» делает то, что вы намереваетесь. Я думаю, что он просто вычисляет исходный номер корня, а не выясняет, как получить столько гигабайт из указанного вами размера блока. Я бы сделал что-то вроде этого:
dd if=/dev/sdf1 bs=`expr 10 * 1024 * 1024` count=`expr 15 * 1024 * 1024 * 1024`
просто чтобы быть уверенным в математике.
Да, и убедитесь, что ваше устройство не меняется под вами, когда вы его копируете. Это было бы плохо.
Вот пара вещей. Во-первых, указанная вами команда, вероятно, не будет работать так, как вы ожидаете. Похоже, вы пытаетесь достичь 150 ГБ, но вам нужно учитывать как размер блока, так и количество (количество - это количество блоков размера блока). Так что, если вы хотите 150 ГБ, вы можете сделать bs=1GB count=150
. Затем вы можете продолжить с того места, на котором остановились, добавив skip=150
чтобы пропустить 150 блоков (каждый по 1 ГБ) при втором запуске. Кроме того, чтобы gzip отправлял свой вывод на стандартный вывод, вам необходимо передать ему -c
вариант.
Однако прежде чем вы это сделаете, у вас есть еще пара вопросов. Вы используете здесь dd, потому что файловая система повреждена / повреждена / и т. Д., И вам нужна ее побитовая копия образа диска? Или вы просто пытаетесь получить данные? Инструмент, поддерживающий файловую систему, может быть более эффективным. В частности, если исходная файловая система не заполнена. Параметры включают tar, или вы можете изучить что-то вроде Clonezilla, Partclone, Partimageили для более специфичной для Windows опции прямого доступа к файловой системе Windows, Linux-NTFS (обратите внимание, что ранее упомянутые инструменты также могут обрабатывать файловые системы Windows в различной степени).
Если вы настроены на работу с разделом с помощью программы, не поддерживающей файловую систему, то использование вашей строки dd (как указано выше, чтобы быть правильным), вероятно, будет работать. Трудно сказать, насколько хорошо он будет сжиматься, но он должен быть меньше исходной файловой системы. Если у вас есть доступ для чтения и записи к исходной файловой системе, стоит заполнить свободное пространство файлом, записанным из / dev / zero, чтобы обнулить неиспользуемое пространство, прежде чем сохранять его с помощью dd. Это улучшит способность gzip сжимать свободное пространство в образе диска.
Чтобы работать со вторым блоком, просто добавьте skip=XXX
бит для вашего второго вызова dd, где "XXX" равно count=
ценность, которую вы дали ему в первый раз. Если вы хотите использовать 150 ГБ на первом и 40 на втором, вы можете сделать:
sudo dd if=/dev/sdf1 bs=1GB count=150 | gzip -c > img1.gz
с последующим:
sudo dd if=/dev/sdf1 bs=1GB skip=150 count=40 | gzip -c > img2.gz
деготь
Я могу решить вашу проблему. Он имеет возможность разбивать файлы на несколько томов.
Посмотрите эту ссылку:
Со страницы:
Два дополнительных параметра командной строки, которые необходимо использовать помимо стандартного синтаксиса, - это -M (--multi-volume), который сообщает Tar, что вы хотите разделить файл на несколько мультимедийных дисков. Затем вам нужно сообщить Tar, насколько велик этот носитель, чтобы он мог создавать файлы правильного размера. Для этого вы используете опцию --tape-length, где значение, которое вы передаете, - число x 1024 байта.
Пример ниже показывает используемый синтаксис. Допустим, размер largefile.tgz составляет 150 мегабайт, и нам нужно разместить файл на двух 100-мегабайтных Zip-дисках.
tar -c -M --tape-length = 102400 --file = disk1.tar largefile.tgz
Значение 102400 равно 1024 x 100, что создаст файл размером 100 мегабайт с именем disk1.tar, а затем Tar предложит ввести том 2, как показано ниже: -
Подготовьте том # 2 для disk1.tar и нажмите return:
Во времена ленточных накопителей вы бы вынули первую ленту из машины, вставили бы новую ленту и нажали бы возврат, чтобы продолжить. Поскольку мы хотим, чтобы Tar создал оставшиеся 50 мегабайт в отдельном файле, мы выполняем следующую команду: -
n disk2.tar
Это указывает Tar продолжить запись оставшихся 50 мегабайт файла largefile.tgz в файл с именем disk2.tar. Затем вам будет предложено ввести строку ниже, и теперь вы можете нажать «Return», чтобы продолжить.
Подготовьте том # 2 для disk2.tar и нажмите return:
Вы должны повторять этот процесс до тех пор, пока ваш большой файл не будет полностью обработан, увеличивая номер диска в имени файла каждый раз, когда вам будет предложено.
Опаздываю на вечеринку, но мне пришлось сделать такой сценарий для резервного копирования неизвестной файловой системы на карту FAT32.
У меня работает этот простой скрипт:
# Sets pipefail so failed dd makes the whole pipe command fail
set -o pipefail
dd_result=0
split=0
filenameSplit=
while [ $dd_result == 0 ]
do
cmd="dd if=/dev/sdX bs=2G count=1 skip=$split | pigz --fast > \"2G.$filenameSplit.myharddisk.gz\""
echo $cmd
eval $cmd
dd_result=$?
split=$((split + 1))
filenameSplit=$split
done
РЕДАКТИРОВАТЬ: загрузили базовый сценарий восстановления из резервной копии, который использует сжатие dd, pigz или gzip и разбивает файлы на фрагменты, которые можно установить в командной строке. Скрипт найден здесь: github.com/deajan/linuxscripts