Современные разработки в области виртуализации и управления виртуальными машинами сталкиваются с постоянными сложностями, связанными с производительностью и эффективным управлением данными. Особенно остро стоит вопрос быстрого создания снимков дисков виртуальных машин, что может существенно повлиять на скорость работы и опыт пользователя. В ответ на эти задачи команда разработчиков создала собственный файл-формат Blockdiff, ориентированный на быстрое, надежное и экономичное хранение изменений данных виртуальной машины на уровне блоков накопителя. Проблема традиционных методов создания снимков заключается в том, что наиболее распространенные решения требуют либо полного копирования диска виртуальной машины, либо длительной работы с тяжеловесными файловыми системами, что приводит к многоминутным задержкам и большим накладным расходам по дисковому пространству. Особенно остро это ощущается в средах с высокой частотой изменений и необходимостью работать в условиях ограниченной задержки, например, в развивающихся девелоперских средах или при частых переключениях между сессиями.
Концепция Blockdiff базируется на том, что виртуальный диск — это файл на уровне хоста, и разница между базовым образом операционной системы и текущим состоянием виртуальной машины сводится к определенному набору измененных блоков. Именно эти изменения и нужно хранить при создании снимка, игнорируя неизменные данные. Для реализации такой концепции разработчики использовали возможности современных Linux-систем, таких как Copy-on-Write (CoW) и поддержку reflink в файловой системе XFS. Это позволяет обращаться исключительно к метаданным файловой системы, а не к самим содержимым файлов, что существенно ускоряет операции снятия и применения снимков и снижает нагрузку на дисковые операции. Использование Blockdiff открывает новые возможности для гибкого управления жизненным циклом виртуальных машин.
В частности, становится возможным мгновенный откат состояния диска к предыдущему снимку, а также создание и накладывание серии инкрементальных снимков, позволяющих эффективно использовать дисковое пространство и уменьшать время на подготовку рабочих сред. Одним из ключевых преимуществ Blockdiff является компактность файлов снимков. Такой файл растет пропорционально объему изменений, а не полному размеру диска виртуальной машины – что особенно полезно в ситуациях, где основная часть окружения остается неизменной, а изменения затрагивают ограниченный объем данных. Это значительно снижает требования к хранению и передаче снимков, позволяя гораздо быстрее синхронизировать состояния рабочих сред между серверами или облачными хранилищами. Методика создания таких инкрементальных снимков основана на анализе extent-карт файлов – структуры, которая отображает логические и физические блоки файла.
С помощью FIEMAP-системного вызова под управлением Rust создается карта extents, показывающая, какие блоки файла vvм.img физически совпадают с блоками базового образа base.img, а какие — отличаются. Blockdiff записывает только различия, формируя структуру данных, содержащую заголовок информации о количестве и расположении этих блоков, а после него – собственно данные, начиная с выровненной границы блока размером 4 КБ. Эта методология позволяет проводить оперативные операции со снимками практически мгновенно, так как большинство операций сводится к работе с метаданными, а не с данными файловой системы.
В результате производительность процесса создания или применения снимков не зависит от полного размера диска виртуальной машины, что критично для масштабируемых и высоконагруженных инфраструктур. Blockdiff превосходит многие альтернативы, такие как OverlayFS, ZFS или qcow2, благодаря особому акценту на скорость и простоту без ущерба надежности. OverlayFS сталкивается с проблемами при работе с Docker и требует перезагрузки для инкрементальных снимков. ZFS по умолчанию ограничивается доменом внутри виртуальных машин и не обеспечивает полноценной системы быстрого создания снимков на уровне гипервизора. Формат qcow2, хотя и предназначен для виртуальных дисков, менее эффективен в обработке метаданных и более затратен по времени при больших объемах данных.
Практическое применение Blockdiff в гипервизоре Otterlink позволило существенно сократить время старта виртуальных машин, снизить время создания снимков до секунд и повысить общую производительность систем. Во многом это связано с тем, что Otterlink использует raw-образы дисков, оптимизированные для работы с CoW на уровне XFS и обладающие высокой степенью интеграции с файловой системой хоста. Помимо основного применения с виртуальными машинами, Blockdiff может использоваться и для других сценариев, в частности, для оптимизации хранения sparse-файлов — файлов с логическим размером, значительно превышающим фактическое занимаемое пространство. Благодаря метаданным и анализу extents удается «уплотнять» такие файлы, превращая их в компактные формы, что облегчает передачу по сети и сокращает время загрузки. Разработка Blockdiff показывает, насколько важно учитывать особенности современного программного и аппаратного обеспечения при создании эффективных решений.
В данном случае сочетание современных возможностей файловых систем и низкоуровневой работы с метаданными позволило создать легковесный, но мощный инструмент, который может стать стандартом для инкрементального управления состояниями виртуальных машин. Несмотря на уже значительные успехи, проект Blockdiff остается открытым к дальнейшему развитию. Одним из ключевых открытых вопросов является реализация быстрых откатов и замена дискового образа во время работы виртуальной машины, а также создание продвинутых систем кеширования образов в гипервизоре. Ещё одним направлением исследований становится инкрементальное и эффективное снятие снимков памяти виртуальной машины, что вместе с дисковыми снимками может обеспечить полный снимок состояния. Инструмент доступен в открытом доступе, исходный код реализован на языке Rust, что обеспечивает надежность и высокую производительность.