LINUX.ORG.RU
решено ФорумAdmin

dd работет неправильно

 , , ,


0

1

Привет!

Все расхваливают dd, типа это офигенная штука. Так вот есть GNU / Linux Debian 8. boot-раздел размером 492MB, из которых занято 30МБ.
Команда:

xwicked@debian:~$ sudo dd if=/dev/sda1 conv=sync,noerror bs=1M | gzip > /mnt/data/s1/sda1.img.gz
Даёт архив размером 472МБ. КАРЛ! В инете пишут, что 320ГБ винты бекапят по 12,5ГБ рамером архивы получаются.
Что в уме в статьях остаётся о чём я должен был догадаться?
Без сжатия образ 519МБ весит.
Попробовал раздел с системой в 10ГБ занятого пространства заархивировать, так на 15ГБ я прервал его, так как общий размер >200ГБ.
Помогите новичку! Благодарю!

★★☆

Последнее исправление: xwicked (всего исправлений: 2)

dd работет неправильно

Нет, dd как раз работает правильно, читает что записано на диске, пишет это в stdout. Если раздел имеет размер n Гб то прочитано будет n Гб, и записано будет n Гб. Если ты хочешь чтобы содержимое пространства раздела не используемое размещённой на нём файловой системой не занимало места в бекапе то тебе нужно убедиться что это пространство содержит очень хорошо сжимаемые данные (например нули)

MrClon ★★★★★
()
Ответ на: комментарий от MrClon

Нет, dd как раз работает правильно, читает что записано на диске, пишет это в stdout. Если раздел имеет размер n Гб то прочитано будет n Гб, и записано будет n Гб. Если ты хочешь чтобы содержимое пространства раздела не используемое размещённой на нём файловой системой не занимало места в бекапе то тебе нужно убедиться что это пространство содержит очень хорошо сжимаемые данные (например нули)

Может лучше TrueImage? Или как мне это реализовать с нулями? Никто ни в одной статье об этом не говорит.

xwicked ★★☆
() автор топика

conv=sync

а это зачем надо?

я понимаю если бы ты виндовый диск бэкапил.. но это ж линукс.. почему не tar? или это раздел без неопределённой ФС с загрузчиком?

anonymous
()
Ответ на: комментарий от xwicked

Может лучше TrueImage?

ХЗ. Бекапить разделы целиком это не по моей части. Только один раз так делал, когда нужно было винду забекапить. Я бы создал на бекапируемом разделе новый файл и забил-бы его нулями из /dev/zero на всё свободное место, а потом удалил. На один раз сойдёт

MrClon ★★★★★
()
Ответ на: комментарий от xwicked

Или как мне это реализовать с нулями?

mount /dev/sda1 /mnt/sda1
dd if=/dev/zero of=/mnt/sda1/zeroes bs=2M
rm /mnt/sda1/zeroes
umount /dev/sda1
anonymous
()
Ответ на: комментарий от anonymous

Вроде bs сейчас подбирать уже не обязательно, помнится эксперементировал с этим, толком не влияет на скорость

MrClon ★★★★★
()
Ответ на: комментарий от MrClon

влияет. 2М это цифра соответствовала размеру кеша винчестера несколько лет назад, когда я тестил. слишком малинький размер - трудозатраты ОС будут дороже полезной работы, слишком большой - ненужный оферхед

anonymous
()

Нестыковка размеров 492MB и 519МБ вызвана скорее всего тем, что вы смотрите размеры разными программами и одна из них считает в мегабайтах, а другая в мибибайтах (519000000/1024/1024~=495). Размеры в байтах скорее всего сойдутся.

dd сохраняет «сырое» содержимое всего раздела, не вдаваясь в то, что на нём записано. У вас там файловая система на весь раздел и 30 МБ файлов на ней, но всё незанятое место не обязано быть «чистым». Если вы специально не зануляли раздел той же dd перед созданием файловой системы, там скорее всего не нули, там остатки бывших файлов или даже файловых систем, проще говоря — мусор. Вот он то и занял основное место в вашем архиве.

unterwulf
()
Ответ на: комментарий от unterwulf

Как в таком случае, зная размер занятых данных в байтах, заставить dd забить остальной мусор нулями? Или просто читать не более тех занятых байт? Как?

anonymous
()
Ответ на: комментарий от MrClon

ЛОРовец со стажем так тупит

видимо аккаунты от лора продают на каком-то секретном аукционе.

хотя, всем известно, что самый ценный акк на лоре - это anonymous

anonymous
()
Ответ на: комментарий от MrClon

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

anonymous
()
Ответ на: комментарий от unterwulf

вангую следующий топик: «как спасти данные уничтоженные „интересным вариантом для SSD“

anonymous
()

Рыдал с этой темы.

anonymous
()

Зачем тебе побайтовая копия? Для резервного копирования отлично подходит старый добрый tar.gz архив.

rumgot ★★★★★
()

Есть специальная утилита dumpe2fs, которая делает снимок без незанятого места, но там ман надо читать.

legolegs ★★★★★
()
Ответ на: комментарий от anonymous

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

ionanahin ★★★
()

Если для целей бэкапа, то есть fsarchiver. Он как раз заточен под эту задачу, и не надо ничего велосипедить.

lu4nik ★★★
()

(xfs)dump/(xfs)restore наше всё

futurama ★★★★★
()
Ответ на: комментарий от burato

А может это gzip барахлит?

Сейчас попробую максимальную степень сжатия поставить и отпишусь. И как сделать с 7za? Запускал

7za -mx9
и ничего не заработало.

xwicked ★★☆
() автор топика

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

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

Если там у тебя linux, то можешь вообще снять не дамп файловой системы, а архив самих файлов с сохранением прав доступа.

Если у тебя там Ntfs, то используй ntfsclone.

kostik87 ★★★★★
()
Ответ на: комментарий от xwicked
xwicked@debian:~$ sudo dd if=/dev/sda1 conv=sync,noerror bs=1M | gzip -9cf > /mnt/data/s1/sda1.img.gz
517+0 записей получено
517+0 записей отправлено
 скопировано 542113792 байта (542 MB), 57,7018 c, 9,4 MB/c
xwicked ★★☆
() автор топика

Вот пример статьи, где с поросячьей радостью описывается:

Например, заполненный на около 5Гб NTFS-раздел объемом 31Гб в сжатом состоянии занимает всего 1.7Гб. ...
В ходе тестов на различных разделах степень компрессии несколько шокировала. Например, FAT-16 раздел размером 40Гб был сжат до 30МБ (контрольные суммы проверил - они совпали)!!!

Шок! Разоблачение! Ваши статьи херня!
Попробуйте каждый отписавшийся сделать тоже самое со своим бутом, у кого отдельно, и результаты сюда, пожалуйста напишите.

xwicked ★★☆
() автор топика
Ответ на: комментарий от xwicked

7zip установил хоть?

sudo apt-get install p7zip-full p7zip-rar
7z a <имя_архива> <список_файлов>

УМВР.

burato ★★★★★
()
Ответ на: комментарий от xwicked

Ты играешь в дурачка? На /boot нечего сжимать, там kernel/initrd уже сжат, остальное мелочь. Свободное пространство занули для сжатия.

futurama ★★★★★
()
Ответ на: комментарий от futurama

Ты играешь в дурачка? На /boot нечего сжимать, там kernel/initrd уже сжат, остальное мелочь. Свободное пространство занули для сжатия.

Вы в дурачка играете? Покажите мне статьи с занулением, если только это не проплачено всё M$ как видимость альтернативы ваши dd. Должен размер быть 31МБ максимум, но не по размеру раздела.

xwicked ★★☆
() автор топика
Ответ на: комментарий от futurama

ПНХ, чудак! Если ты не знаешь как работает dd это твоя проблема.

Получается что никто не знает? Как тогда у них целиком разделы сжимаются без зануления даже NTFS?

xwicked ★★☆
() автор топика
Ответ на: комментарий от xwicked

На /boot при установке ставится ядро, initrd и файлы загрузчика, при каждом обновлении системы, а точнее обновлении ядер туда помещаются файлы нового ядра и Initrd, в зависимости от скриптов старые ядра удаляются не сразу, а со временем.

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

Хватит лить воду, забанят тебя так.

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

# df -h /boot
Файловая система Размер Использовано  Дост Использовано% Cмонтировано в
/dev/sdd1          463M         163M  297M           36% /boot
# umount /boot/
# dd if=/dev/sdd1 bs=4M | gzip -9c > /tmp/boot.gz
121+1 записей получено
121+1 записей отправлено
 скопировано 509935104 байта (510 MB), 47.5266 c, 10.7 MB/c
# ls -lsh /tmp/boot.gz
279M -rw-r--r-- 1 root root 279M мар 21 10:32 /tmp/boot.gz

Вот, не плачь.

kostik87 ★★★★★
()
Ответ на: комментарий от xwicked

«Они» меня не интересуют. dd читает поблочно и ничего о файлах не знает. Какой у тебя мусор на разделе (в блоках) так он и сожмется. Всё!

futurama ★★★★★
()
Ответ на: комментарий от kostik87

Пусть поплачет

# df -h /boot
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda2       229M   94M  124M  44% /boot

# ls -lh /tmp/boot.dump.gz 
-rw-r--r-- 1 root root 85M Mar 21 09:32 /tmp/boot.dump.gz

# ls -lh /tmp/boot.dd.gz 
-rw-r--r-- 1 root root 98M Mar 21 09:38 /tmp/boot.dd.gz

futurama ★★★★★
()
Последнее исправление: futurama (всего исправлений: 1)
Ответ на: комментарий от kostik87

Теперь мне стало понятно, что у меня сжатие не работает. Почему? Что мне проверить?
Вам бы только банить всех.

xwicked ★★☆
() автор топика
Ответ на: комментарий от xwicked

У тебя мозги не работают или ты попросту тролль. Без разницы что и где было написано, а, скорее всего, ты это выдумал, dd снимает образ целиком.

В последний раз опишу.

Допустим есть некоторая файловая система, допустим 100 Мб, на неё записали файлы:

  • file1 - 10Mb ;
  • file2 - 20Mb
  • file3 - 25Mb
  • file4 - 25Mb

Потому удалили файлы: file3 и file4, в выводе df будет видно, что занято 30 Мб, при снятии посекторного образа dd будут прочитаны все 100 Мб, при сжатии сжаты тоже будут 100 Мь, но т.к. данные удалённых файлов всё равно остались на файловой системе, они не были перезаписаны нулями, удалились только указатели на них, только имя, то размер сжатого архива будет не плюс-минус 30Мб, а чуть меньше 100Мб.

Что бы использовать dd и хорошо сжимать файловую систему запиши в начале всё свободное пространство на файловой системе нулями, например вот так:

dd if=/dev/zero /boot/zero.file
как только займётся всё свободное место удали файл zero.file, теперь можешь снять образ dd и сжать его, сжатый в архив образ будет примерно 30 Мб.

Либо поищи утилиты или другой метод для записи нулями свободного пространства.

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

Вот пример:

# df -h /boot/
Файловая система Размер Использовано  Дост Использовано% Cмонтировано в
/dev/sdd1          463M         163M  297M           36% /boot

# dd if=/dev/zero of=/boot/zero.file
dd: запись в «/boot/zero.file»: На устройстве не осталось свободного места
604697+0 записей получено
604696+0 записей отправлено
 скопировано 309604352 байта (310 MB), 4.42798 c, 69.9 MB/c
# rm /boot/zero.file 
# umount /boot/
(reverse-i-search)`dd if': ^C if=/dev/zero of=/boot/zero.file
# dd if=/dev/sdd1 bs=4M | gzip -9 > /tmp/boot_zero.gz
140M -rw-r--r-- 1 root root 140M мар 21 11:05 /tmp/boot_zero.gz
Если не перестанешь нести чушь забанят.

Удачи.

kostik87 ★★★★★
()
Последнее исправление: kostik87 (всего исправлений: 2)
Ответ на: комментарий от kostik87

У меня файловая система, так же как и у тебя записана один раз. Перед каждой установкой я форматирую все разделы. Что я буду в отдельный boot-раздел сам писать и удалять? Усёк?
Вангую, что манипуляция с нулями мне не поможет, но попробую и отпишусь. И то, что кто-то думает, что я «со стажем» - это не даёт мне практического опыта. Блондинку, если посадить за руль и показать как ездить от работы до дома, она так и будет ездить не сворачивая. У меня такая же фигня с линупсом. ОЧень тяжено даётся что-то специфичное.

xwicked ★★☆
() автор топика
Ответ на: комментарий от kostik87

Спасибо, братан, помогло! 23,3МБ. Не знаю почему. Тема закрыта.

xwicked ★★☆
() автор топика
Ответ на: комментарий от MrClon

Очень влияет, по дефолту оно пишет очень мелкими кусочками по 512 байт, читаей, пишет, читает, пишет... Понимаешь? Это как миллионы мелких файлов, может на супер-пупер-ssd и не влияет, но не у всех супер-пупер.

mandala ★★★★★
()
Ответ на: комментарий от xwicked

Перед каждой установкой я форматирую все разделы.

Форматирование это просто запись служебной информации, необходимой для файловой системы. Никакой мусор при этом на разделе не зануляется, а так и остаётся лежать в неизменном виде.

imul ★★★★★
()
Ответ на: комментарий от xwicked

Перед каждой установкой я форматирую все разделы.

это ничего не значит

Вангую, что манипуляция с нулями мне не поможет
помогло! 23,3МБ. Не знаю почему.

Шок!

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

onlybugs ★★
()
Ответ на: комментарий от onlybugs

...Нужно только почитать ман к инструменту и файловой системе

Понятно, если вы позиционируете, что система линукс только для одминов, то это справидливо, отчасти, а типичный хомячок вот будет удивлён, когда его полтеребайтный раздел /home нипомищаецца на флешку, хотя там ничего почти не занято. Вот смех где начинается. Если линукс хочет уйти от 1%, то и инструкции «для всех» нужно писать для всех, а не для таких же бородатых как и он сам.

xwicked ★★☆
() автор топика

Товарищи, зачем в линукс делать образы? Систему ведь можно бэкапить обычным tar-ом.

rumgot ★★★★★
()

Можно сделать иначе. Сперва сделать при помощи partclone.ext4 с ключом -D файл битовой карты занятого места, а потом этот раздел по этой карте скопировать а файл при помощи ddrescue с ключом --sparse. Тогда файл будет содержать только занятые участки. Пример: копируем /dev/sda1, содержащую ext4.


# partclone.ext4 -D -s /dev/sda1 -O ~/sda1_domain
# ddrescue -d -f --sparse --domain-logfile=~/sda1_domain /dev/sda1 ~/sda1.img ~/sda1.log

В результате получишь образ sda1.img и лог, в котором указаны непрочитанные участки, если есть.

olegkrutov ★★
()
Ответ на: комментарий от rumgot

Товарищи, зачем в линукс делать образы? Систему ведь можно бэкапить обычным tar-ом.

Это ты предлагаешь такой способ, где архивируются только нужные папочки, а ненужные в архиве, при развёртывании, нужно создавать самому заново?
Увольте, это извращение!
Да и загрузчик всё равно dd придётся сливать.

xwicked ★★☆
() автор топика
Последнее исправление: xwicked (всего исправлений: 1)
Ответ на: комментарий от xwicked

типичный хомячок

Ну я хомячок. Не админ, не программист. При этом слышал, например, что xfs боится внезапных выключений, на ext4 часто по умолчанию резервируется место для рута (что стоит учитывать при забивании нулями как в этом треде).

/home нипомищаецца на флешку

для этого rsync или что-то для бекапа (если такая цель стоит)

хотя там ничего почти не занято

Откуда узнал, что dd нужно использовать для копирования файлов? Спрашивай у того, что эту чудо-инструкцию написал. Есть инструмент - есть мануал.

одминов
справидливо
полтеребайтный
нипомищаецца

язабан

onlybugs ★★
()
Ответ на: комментарий от onlybugs

справидливо

прости, очепятался, спешил.

xwicked ★★☆
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.