Список образов хранится в etcd в ключах /vitastor/config/inode/<pool>/<inode>.

Вы можете даже создавать образы вручную:

etcdctl --endpoints=<etcd> put /vitastor/config/inode/<pool>/<inode> '{"name":"<name>","size":<size>[,"parent_id":<parent_inode_number>][,"readonly":true]}'

Например:

etcdctl --endpoints=http://10.115.0.10:2379/v3 put /vitastor/config/inode/1/1 '{"name":"testimg","size":2147483648}'

Если вы зададите parent_id, то образ станет CoW-клоном, т.е. все новые запросы записи пойдут в новый инод, а запросы чтения будут проверять сначала его, а потом родительские слои по цепочке вверх. Чтобы случайно не перезаписать данные в родительском слое, вы можете переключить его в режим “только чтение”, добавив флаг "readonly":true в его запись метаданных. В таком случае родительский образ становится просто снапшотом.

Таким образом, для создания снапшота вам нужно просто переименовать предыдущий inode (например, из testimg в testimg@0), сделать его readonly и создать новый слой с исходным именем образа (testimg), ссылающийся на только что переименованный в качестве родительского.

vitastor-cli и драйвера K8s, OpenStack и т.п. также хранят обратный маппинг в ключах /vitastor/index/image/<name> в JSON-формате: {"id":<inode>,"pool_id":<pool>} и счётчики ID /vitastor/index/maxid/<pool> в виде просто чисел для упрощения генерации ID новых образов.