Насколько я понимаю, снимки LVM заключаются в следующем: когда блок изменяется в источнике, блок сначала копируется (до изменения) в снимок. Затем блок изменяется в исходной точке, как обычно.
Теоретически, когда снимок создается впервые, он не должен содержать ничего. затем, когда в исходной точке происходят изменения, эти блоки начинают заполнять снимок.
Однако, если в целях тестирования я создаю небольшой LV 1G и помещаю на него пару файлов; затем я создаю снимок размером 200 МБ. Как и ожидалось, lvs показывает размер LSize 200M для привязки и 1G для origin. Но когда я монтирую том моментального снимка, df показывает его размером 1G. Когда я просматриваю его содержимое, я обнаруживаю, что он содержит все, что есть в исходном томе, даже несмотря на то, что исходные файлы не были изменены.
Почему это? Я предполагаю, что в команде «mount» есть какая-то логика для сравнения между исходным LV и снимком LV? Может кто-нибудь объяснить, как это работает. Если я посмотрю на номера inode для файла на каждом томе (origin и snap), они будут разными (как и ожидалось, потому что каждый является своей собственной уникальной файловой системой), но я предполагаю, что есть какие-то «указатели» на то, что снимок используется для ссылки на неизмененные блоки в источнике.
В том же духе я предполагаю, что если я скопирую сам логический том моментального снимка в другое место, я получу подмножество исходных файлов - только те, которые были изменены. ... Но если я сначала смонтирую файловую систему моментального снимка, а затем сделаю копию на уровне файловой системы (cp), я получу все в источнике, как это было при создании моментального снимка. Правильно?
Моментальный снимок LVM работает, сохраняя список измененных блоков и их содержимого в томе моментального снимка, одновременно передавая все запросы на чтение неизмененных данных нижележащему блочному устройству. Весь этот интеллект встроен в LVM, в ядро и mount
не знает об этом. Так далеко как что-нибудь в пользовательском пространстве доступны два блочных устройства, оба имеют одинаковый размер (1G, в вашем примере). Тот факт, что один том является исходным LVM, а другой является моментальным снимком, никого не волнует, кроме тех битов системы dm (device mapper), которые имеют дело с этим.
Размер снимка 200 МБ - это количество измененных данных, которое снимок может сохранить, прежде чем он разорвет свои швы и не рассыпает блоки данных по всему полу.
Если вы скопируете том моментального снимка либо как блочное устройство, либо путем копирования файлов в нем, вы в любом случае получите полное содержимое.
Все это сопровождается предупреждением: вы жестяная банка проникните внутрь метаданных в shapshot LV и сделайте «фанковые» вещи, такие как высокоэффективный rsync на уровне устройства. Я упоминаю об этом, потому что написал lvmsync чтобы сделать именно это, и, судя по тону вашего вопроса, похоже, что вам нужна такая функциональность.
Моментальные снимки являются частью подсистемы LVM, блоков данных, которые являются уровнем абстракции под файловой системой.
Моментальный снимок - это полная копия исходного тома, поэтому он будет иметь тот же размер при подключении. Оба будут по 1 ГБ.
За исключением того факта, что снимок выполняет некоторые хитрости, поэтому вам не нужно полностью копировать весь этот 1 ГБ. по факту ничего не копируется в то время, когда вы делаете снимок, поэтому он и очень быстрый, и поэтому изначально почти не занимает места.
Вместо этого моментальный снимок начинает копирование данных только тогда, когда исходные данные изменяются (копирование при записи). Но тогда только "собирается быть измененным" копируются исходные данные (блоки) и больше ничего. 200 МБ пространства снимка - это объем пространства, зарезервированного для этих копий. Другими словами, вы можете отслеживать изменения на 200 МБ в вашем снимке.
Уловка заключается в том, что моментальный снимок начинается как набор указателей на исходные блоки данных. Каждое изменение в исходном томе запускает копию этого исходного блока данных в таблицу COW (медленно заполняя выделенные для этого 200 МБ) и соответственно обновляет указатель. При чтении моментального снимка отслеживаются эти указатели, и либо неизмененные данные из исходного тома возвращаются, следуя указателям там, либо указатель отслеживается на скопированный блок в таблице COW.