Sim, é específico para dispositivos de loop. Isso significa que quando o dispositivo de loop é desmontado, ele será automaticamente desassociado do arquivo de apoio.
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?))
Sim, é específico para dispositivos de loop. Isso significa que quando o dispositivo de loop é desmontado, ele será automaticamente desassociado do arquivo de apoio.
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:
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.
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
:
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:
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 é:
include/uapi/linux/loop.h
: contém a API do espaço de usuário visível, incluindo notavelmente o ioctl
struct struct loop_info64
no qual LO_FLAGS_AUTOCLEAR
é colocado drivers/block/loop.h
contém a implementação real Veja este exemplo mínimo Se você não estiver familiarizado com ioctl
: link
Testado no Ubuntu 18.04.
Tags 14.04 disk-utility loop-device