Я занимаюсь восстановлением данных с жесткого диска. На диске около 300 ГБ данных, но мне не хватает другого жесткого диска, на котором есть 300 ГБ свободного места.
У меня есть три жестких диска, на которых свободно 150, 40 и 120 ГБ.
Для создания первого блока я думал сделать следующее:
sudo dd if=/dev/sdf1 bs=4096 count=150G | gzip > img1.gz
Что я должен запустить на других машинах, чтобы "продолжить работу"?
Простым решением может быть просто использование "/usr/bin/split". Она просто разбивает файлы на части. Вы можете использовать "-" в качестве имени входного файла для чтения из стандартного ввода. Хорошая вещь в split - это простота, она никак не влияет на цепочку инструментов, и вы можете "соединить" файлы, просто используя "cat", чтобы собрать их вместе (или передать их в другое приложение).
Возможно, вам стоит рассмотреть возможность использования tar
, как говорит KPWINC, но чтобы ответить на ваш вопрос напрямую, вы хотите использовать dd
's "skip" опцию.
Если ваша первая команда, как указано, это:
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`
чтобы быть уверенным в математике.
О, и убедитесь, что ваше устройство не меняется под вами во время копирования. Это было бы плохо.
тар
I tar может решить вашу проблему. В нем есть возможность разбивать файлы на несколько томов.
Посмотрите эту ссылку:
Со страницы:
Два дополнительных параметра командной строки, которые вам необходимо использовать сверх стандартного синтаксиса, это -M (--multi-volume), которая сообщает Tar, что вы > хотите разделить файл на несколько частей. хотите разделить файл на несколько > носителей. мультимедийных дисков. Затем вам нужно указать Tar. какого размера эти носители, чтобы он мог > создать файлы на > нескольких > дисках. создать файлы нужного размера. Чтобы сделать это, вы используете опцию --tape-length опцию, где значение, которое вы передаете. число x 1024 байта.
В примере ниже показан синтаксис. используется. Допустим, размер файла bigfile.tgz составляет. 150 мегабайт, и нам нужно поместить файл на два 100-меговых диска Zip.
tar -c -M --tape-length=102400 --file=disk1.tar bigfile.tgz
Значение 102400 равно 1024 x 100, что создаст 100-меговый файл под названием disk1.tar, а затем Tar запросит. том 2, как показано ниже.
Подготовить том #2 для disk1.tar и нажмите кнопку return:
Во времена ленточных накопителей вы бы вынули первую кассету из машины, вставляли новую кассету и нажимали кнопку return для продолжения. Поскольку мы хотим. Tar создать оставшиеся 50 мегабайт в отдельном файле, мы выдаем следующую команду :-
n disk2.tar
Это дает команду Tar продолжить запись оставшиеся 50 мегабайт файла bigfile.tgz в файл с именем disk2.tar. Вам будет затем появится строка ниже, и теперь вы можете нажать кнопку return, чтобы > продолжить. продолжить.
Подготовьте том №2 для файла disk2.tar и нажмите кнопку return:
Вы будете повторять этот процесс до тех пор. ваш большой файл не будет полностью обработан, увеличивая номер диска в имени файла каждый раз, когда вам >. запросе.
Здесь есть несколько моментов. Во-первых, команда, которую вы перечислили, вероятно, не будет работать так, как вы ожидаете. Похоже, что вы пытаетесь достичь 150 ГБ, но вам нужно учитывать как размер блока, так и количество блоков (количество блоков в блоке). Поэтому, если вам нужно 150 ГБ, вы можете сделать bs=1GB count=150
. Затем вы можете продолжить работу, добавив skip=150
, чтобы пропустить 150 блоков (каждый размером 1 ГБ) во время второго запуска. Также, чтобы gzip отправлял свой вывод в стандартный аут, вам нужно передать ему опцию -c
.
Однако прежде чем вы это сделаете, задайте еще пару вопросов. Вы используете dd, потому что файловая система повреждена/повреждена/etc и вам нужна точная копия образа диска бит-в-бит? Или вы просто пытаетесь удалить данные? Инструмент с поддержкой файловой системы может быть более эффективным. Особенно если исходная файловая система не заполнена. В качестве вариантов можно использовать 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
.
С опозданием, но мне пришлось сделать такой сценарий для резервного копирования неизвестной файловой системы на флешке 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
EDIT: Я загрузил базовый сценарий восстановления резервной копии, который использует сжатие dd, pigz или gzip и разбивает файлы на фрагменты, которые можно задать в командной строке. Скрипт находится здесь: github.com/deajan/linuxscripts