У меня есть 200 ГБ свободного дискового пространства, 16 ГБ ОЗУ (из которых ~ 1 ГБ занято рабочим столом и ядром) и 6 ГБ подкачки.
У меня есть внешний SSD на 240 ГБ, из которых 1 используется 70 ГБ, а остальное свободно, и мне нужно сделать резервную копию на моем диске.
Обычно я dd if=/dev/sdb of=Desktop/disk.imgсначала выполняю диск, а затем сжимаю его, но создание образа сначала не вариант, так как для этого потребуется гораздо больше места на диске, чем у меня, даже несмотря на то, что этап сжатия приведет к сжатию свободного пространства, поэтому Конечный архив легко помещается на моем диске.
ddзаписывает в STDOUT по умолчанию и gzipможет читать из STDIN, поэтому теоретически я могу писать dd if=/dev/sdb | gzip -9 -, но gzipчтение байтов занимает значительно больше времени, чем ddможет их произвести.
От man pipe:
Данные, записанные в конец записи канала, буферизуются ядром до тех пор, пока они не будут прочитаны из конца чтения канала.
Я представляю себя |как настоящий канал - одно приложение помещает данные, а другое - как можно быстрее выводит данные из очереди канала.
Что, когда программа на левой стороне записывает больше данных быстрее, чем другая сторона канала, может рассчитывать на их обработку? Будет ли это вызывать чрезмерное использование памяти или подкачки, или ядро попытается создать FIFO на диске, заполнив тем самым диск? Или он просто потерпит неудачу, SIGPIPE Broken pipeесли буфер слишком велик?
По сути, это сводится к двум вопросам:
- Каковы последствия и результаты добавления большего количества данных в канал, чем считывается за раз?
- Какой надежный способ сжать поток данных на диск, не помещая весь несжатый поток данных на диск?
Примечание 1: я не могу просто скопировать точно первые 70 использованных ГБ и ожидать получить работающую систему или файловую систему из-за фрагментации и других вещей, которые потребуют целостности всего содержимого.
lzopвместо gzip; он сжимается намного быстрее, с чуть более низкой степенью сжатия. Я нахожу это идеальным для образов дисков, где скорость сжатия может быть реальным узким местом.