У меня есть 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
; он сжимается намного быстрее, с чуть более низкой степенью сжатия. Я нахожу это идеальным для образов дисков, где скорость сжатия может быть реальным узким местом.