У мене є 200 ГБ вільного місця на диску, 16 ГБ оперативної пам’яті (з яких ~ 1 ГБ займає робочий стіл і ядро) і 6 ГБ свопу.
У мене зовнішній SSD ємністю 240 Гб, 70 ГБ використано 1, а решта - безкоштовна, яку мені потрібно створити для резервного копіювання на диск.
Як правило, я б 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
; він стискається набагато швидше, лише з дещо нижчим коефіцієнтом стиснення. Я вважаю його ідеальним для зображень на диску, де швидкість стиснення може бути справжнім вузьким місцем.