No aplicativo Disks (Disk Utility) em 14.04, o que a configuração de limpeza automática faz?

4

Estou jogando com algumas imagens de disco por meio de dispositivos de loopback (por exemplo, /dev/loop0 ). Quando visto no aplicativo Discos (Utilitário de Disco), há uma configuração denominada "Limpar automaticamente", que está definida como DESATIVADA.

O que essa configuração faz? É específico para dispositivos de loopback?

(E como eu mesmo encontrei a resposta? Tentei usar Disks > Help, mas não parece apoiar a pesquisa de maneira sensata e não sabia qual das opções de nível superior selecionar ( .. tabela de conteúdo alguém?))

    
por RobM 25.06.2015 / 23:16

3 respostas

2

Sim, é específico para dispositivos de loop. Isso significa que quando o dispositivo de loop é desmontado, ele será automaticamente desassociado do arquivo de apoio.

    
por psusi 26.06.2015 / 00:17
0

Eu não sou especialista em dispositivos de loop, mas posso orientá-lo sobre o que fiz para descobrir algumas coisas.

Depois de procurar por "auto-clear loop" em um mecanismo de busca bem conhecido, eu encontrei - além desta questão - o patch que adicionou o recurso ao gnome-disk-utility.

Eu não conseguia entender o código, mas decidi que a parte crucial provavelmente envolvia a função udisks_loop_call_set_autoclear .

Eu procurei por isso, encontrei o UDisks Reference Manual e vi que ele invocava algo chamado SetAutoclear , o que acontece, define o " AutoClear " propriedade. O que aparentemente significa:

% bl0ck_qu0te%

Procurando por "clear loop device" (ou pesquisando man losetup para 'clear') não foi excessivamente útil, então neste momento eu estou supondo que "clear" é apenas um sinônimo para "detach".

Eu não consegui encontrar nada sobre os loops de auto-desanexação na manpage, então decidi que talvez isso aconteça no nível de montagem.

Olhando para man mount e pesquisando por 'loop', encontrei esta frase:

% bl0ck_qu0te%

Eu estou supondo que "auto-destruição" é basicamente outro sinônimo para "auto-clear".

Assim, a partir de uma versão do kernel 2008, todos os loops criados automaticamente por mount serão apagados automaticamente quando desmontados. Mas, aparentemente, você pode ignorar isso ao ativar um switch no Gnome Disk Utility.

Estou presumindo que há uma maneira de controlar isso também na linha de comando, e essa seria a resposta que eu gostaria de dar a você, mas não consigo encontrá-lo facilmente.

Eu provavelmente teria que percorrer mais código (talvez procurar por outros projetos onde funções similares são chamadas), ou aprender mais sobre dispositivos de loop ou o kernel.

    
por mwfearnley 18.02.2017 / 17:15
0

Exemplo mínimo executável

Primeiro, criamos um sistema de arquivos de teste como explicado aqui :

mkdir sysroot
dd if=/dev/urandom of=sysroot/myfile bs=1024 count=1024
virt-make-fs --format=raw --type=ext2 sysroot sysroot.ext2

Agora:

$ mkdir mnt
$ # mount can deduce "-o loop -t ext2" nowadays.
$ sudo mount sysroot.ext2 mnt
$ # Mount worked fine.
$ cmp mnt/myfile sysroot/myfile
$ losetup
NAME       SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE               DIO LOG-SEC
/dev/loop0         0      0         1  0 /home/ciro/sysroot.ext2   0     512
$ # I don't trust userland.
$ cat /sys/devices/virtual/block/loop0/loop/autoclear
1
$ sudo umount
$ losetp
$

Portanto, vemos que mount :

  • cria um dispositivo de loop
  • define AUTOCLEAR para ele por padrão -o loop -t ext2

e quando umount vê AUTOCLEAR ser definido, ele destrói automaticamente o arquivo.

Exemplo de contador mínimo

Criando o dispositivo de loop manualmente com losetup , podemos ver o que acontece quando o AUTOCLEAR não está definido:

$ sudo losetup /dev/loop0 sysroot.ext2
losetup: sysroot.ext2: Warning: file does not fit into a 512-byte sector; the end of the file will be ignored.
$ losetup
NAME       SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE               DIO LOG-SEC
/dev/loop0         0      0         0  0 /home/ciro/sysroot.ext2   0     512
$ cat /sys/devices/virtual/block/loop0/loop/autoclear
0
$ sudo mount /dev/loop0 mnt
$ cmp mnt/myfile sysroot/myfile
$ sudo umount mnt
$ losetup
NAME       SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE               DIO LOG-SEC
/dev/loop0         0      0         0  0 /home/ciro/sysroot.ext2   0     512
$ sudo mount /dev/loop0 mnt
$ sudo umount -d mnt
$ losetup

Então, vemos isso:

  • umount sem opções não apagou o dispositivo de loop para nós
  • umount -d apagou

Alternativamente, podemos também separar o dispositivo de loop com:

sudo mount /dev/loop0 mnt
sudo umount mnt
sudo losetup -d /dev/loop0

Perdao automática no sistema de arquivos usado

man losetup diz:

% bl0ck_qu0te%

e nós verificamos com:

$ sudo losetup /dev/loop0 sysroot.ext2
$ sudo mount /dev/loop0 mnt
$ cat /sys/devices/virtual/block/loop0/loop/autoclear
0
$ sudo losetup -d /dev/loop0
$ cat /sys/devices/virtual/block/loop0/loop/autoclear
1
$ # Still mounted.
$ cmp mnt/myfile sysroot/myfile
$ sudo umount mnt
$ losetup
$

Então, vemos que, se você usar losetup -d antes de umount , definirá autoclear automaticamente.

Visualização de baixo nível

Um rápido:

sudo strace mount sysroot.ext2 mnt

mostra que as principais chamadas do sistema são:

openat(AT_FDCWD, "/dev/loop0", O_RDWR|O_CLOEXEC) = 4
ioctl(4, LOOP_SET_STATUS64, {lo_offset=0, lo_number=0, lo_flags=LO_FLAGS_AUTOCLEAR, lo_file_name="/home/ciro/sysroot.ext2", ...}) = 0
mount("/dev/loop0", "/home/ciro/test/libguestfs/mnt", "ext2", MS_MGC_VAL, NULL) = 0

, então vemos que losetup operações são basicamente feitas através de ioctl .

A fonte do kernel v4.17 de interesse é:

Veja este exemplo mínimo Se você não estiver familiarizado com ioctl : link

Testado no Ubuntu 18.04.