Список образов хранится в 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 новых образов.