Revertendo o subvolume btrfs com subvolumes filhos

9

Existe uma maneira canônica de reverter para um instantâneo de subvolume que tenha subvolumes filhos. Então, por exemplo, este é o meu layout de volume btrfs:

ID 257 gen 59802 top level 5 path __active
ID 258 gen 59784 top level 5 path __snapshot
ID 259 gen 59802 top level 257 path home
ID 260 gen 36538 top level 257 path opt
ID 261 gen 59802 top level 257 path var

Assim, você pode ver que home, opt e var são subvolumes filhos de __active. Se eu capturar __active de forma que este seja meu novo layout:

ID 257 gen 59802 top level 5 path __active
ID 258 gen 59784 top level 5 path __snapshot
ID 259 gen 59802 top level 257 path home
ID 260 gen 36538 top level 257 path opt
ID 261 gen 59802 top level 257 path var
ID 416 gen 59784 top level 258 path __snapshot/__active

Se eu quiser reverter para a captura instantânea de __active, existe uma maneira de anexar novamente a página inicial, optar e var o novo __active?

Falmarri
fonte

Respostas:

3

Se você quer dizer com a recolocação que você btrfs subvolume listmostraria:

ID 257 gen 59802 top level 5 path __active
ID 258 gen 59784 top level 5 path __snapshot
ID 259 gen 59802 top level 416 path home
ID 260 gen 36538 top level 416 path opt
ID 261 gen 59802 top level 416 path var
ID 416 gen 59784 top level 258 path __snapshot/__active

então agora não há como fazer isso com o btrfs-progs.

Os subvolumes só podem ser excluídos se todos os subvolumes filhos (criados com btrfs subvolume create ...) estiverem vazios; no entanto, isso não é verdade para os instantâneos (criados com btrfs subvolume snapshot .... Os instantâneos sempre podem ser excluídos e, se você pudesse movê-los, haveria um problema com a remoção do instantâneo.

Embora os subvolumes filhos e os instantâneos apareçam na mesma estrutura em árvore e até compartilhem o btrfs subvolume delete ..comando, eles não agem da mesma maneira.

Anthon
fonte
1

Primeiro, ao fazer __snapshot/__active, os subvolumes (home, opt, var) não são capturados. Em vez disso, diretórios vazios são criados. Assim, __snapshot/__activepode ser facilmente removido, enquanto que __activenão pode.

Mas o ponto principal foi restaurar __activecom __snapshot/__active. Até onde eu sei, isso não pode ser feito atomicamente. Mas você pode capturar mvinstantaneamente e outros subvolumes felizes (desde que sejam graváveis). Então, por exemplo

mv __active __snapshot/__active.old
mv __snapshot/__active __active

restaura a __activepartir do instantâneo, mas movendo os subvolumes para __snapshot/__active.old/{home,opt,var}. Para recolocá-los, agora você pode usar

mv __snapshot/__active.old/{home,opt,var} __active/

e você receberá

ID 257 gen 59804 top level 258 path __snapshot/__active.old
ID 258 gen 59786 top level 5 path __snapshot
ID 259 gen 59802 top level 416 path home
ID 260 gen 36538 top level 416 path opt
ID 261 gen 59802 top level 416 path var
ID 416 gen 59784 top level 5 path __active

Caso seu instantâneo seja feito somente leitura, você pode fazer, por exemplo

mv __active __snapshot/__active.old
btrfs subvolume snapshot __snapshot/__active __active
mv __snapshot/__active.old/{home,opt,var} __active/
David
fonte