Почему замороженный снимок ЛЖ постоянно меняется?

Перед установкой gcc-8.3.0 я делаю снимок корневого ("/") LV следующей командой:

lvcreate -L 20G -s vgsys/lvroot -n lvroot_gcc7

Затем я установил gcc-8.3.0 и сделал еще один снимок корневого LV следующим образом:

lvcreate -L 25G -s vgsys/lvroot -n lvroot_gcc8

Теперь моя система выглядит так:

root# lvs
LV          VG    Attr       LSize  Pool Origin Data%  Meta%  Move Log         Cpy%Sync Convert   
lvhome      vgsys -wi-ao---- 80.00g                
lvroot      vgsys owi-aos--- 64.00g                                   
lvroot_gcc7 vgsys swi-a-s--- 20.00g      lvroot 5.26  
lvroot_gcc8 vgsys swi-a-s--- 25.00g      lvroot 0.00

После того, как я некоторое время пользовался этой системой, я обнаружил, что процент использования (Data%) lvroot_gcc7 постоянно меняется так же, как lvroot_gcc8!

Теперь это состояние моей системы:

LV          VG    Attr       LSize  Pool Origin Data%  Meta%  Move Log    Cpy%Sync Convert
lvhome      vgsys -wi-ao---- 80.00g                
lvroot      vgsys owi-aos--- 64.00g                                   
lvroot_gcc7 vgsys swi-a-s--- 20.00g      lvroot 6.05                  
lvroot_gcc8 vgsys swi-a-s--- 25.00g      lvroot 0.86

Кстати, каждый раз, когда я делал снимки, я перезагружал систему с USB-флешки с установочным носителем Kubuntu 18.04.2 и делал снимки lvroot всегда, когда он не был установлен.

Почему lvroot_gcc7 все еще меняется после lvroot_gcc8 был создан?

Насколько я понимаю, после того, как я создал 1-й снимок lvroot, перед 2-м, если данные в lvroot будут перезаписаны, они сначала будут считаны и записаны в 1-й снимок. Но после того, как я создал 2-й снимок, данные, которые должны быть перезаписаны, должны быть считаны и записаны ТОЛЬКО во 2-й снимок, если только 2-й снимок недействителен или не заполнен, старые данные будут скопированы в 1-й снимок, Именно так системы LVM отслеживают изменения LV. Многие снимки одного и того же оригинального LV составляют ссылку таким образом. Если мое понимание правильное, 1-й снимок был заморожен после того, как был создан 2-й снимок, поэтому не должно быть никаких операций записи с 1-м, если у 2-го достаточно свободного места для отслеживания изменений в lvroot, и используемый размер 1-го НЕ должен постоянно меняться.

1 ответ

Снимки LVM копируются при записи. Это означает, что при его создании мгновенно создается моментальный снимок, но он поддерживается постоянным с помощью алгоритма копирования при записи: когда lvroot записывается, данные, которые будут записаны, сначала читаются и записываются в снимок. Таким образом, вы сохраняете исходные данные. Это, очевидно, стоит места, и именно поэтому снимок должен иметь достаточно места.

Это нормальное поведение. Это также означает снижение производительности на снимок.

Я также хотел бы предупредить вас о возможности фактического монтажа снимка вместо оригинального lvroot при загрузке. Часто времена /etc/fstab имеет UUID в них, чтобы однозначно идентифицировать файловые системы. Однако UUID файловых систем снимков идентичны, поэтому он может случайно смонтировать неправильный.

Вы можете смягчить это, добавив --permission r при создании снимка. Таким образом, вы сразу узнаете, когда используете неправильный, потому что вы получите ошибки о том, что он доступен только для чтения.

Что касается вашего дополнения к вашему вопросу: я никогда не использовал тонкие пулы, которые описывает AB, но традиционные снимки, взятые из корня, работают независимо друг от друга, могут быть объединены или удалены отдельно.

Другие вопросы по тегам