Por que é necessário um dispositivo de loop?

15

Anteriormente, eu costumava criar arquivos de imagem usando dd, configurar um sistema de arquivos neles usando mkfse mountacessá-los como partições montadas. Mais tarde, vi na internet que muitos exemplos usam losetupanteriormente para fazer uma entrada de dispositivo de loop /deve montá-la. Eu não sabia dizer por que seria praticamente necessário que um arquivo de imagem se comportasse como um dispositivo de loop e tivesse sua própria /deventrada, enquanto o mesmo comportamento pode ser obtido sem todo esse aborrecimento.

Resumo: Em um cenário da vida real, por que precisamos que uma /dev/loopXentrada esteja presente, quando podemos apenas montar a imagem fs sem ela? Para que serve um dispositivo de loop?

corsel
fonte
9
"... enquanto o mesmo comportamento pode ser obtido sem todo o aborrecimento." - Você está errado aí;) - no Linux, um arquivo não pode ser montado sem o "incômodo" de um dispositivo de loop. Hoje em dia mounté inteligente o suficiente para causar problemas para você. (como Stephen Harris mostra em sua resposta)
marcelm 17/10
1
Possível duplicata Qual é a diferença entre montar e montar -o loop
Dmitry Grigoryev

Respostas:

22

Normalmente, as montagens devem ser feitas em dispositivos de bloco. O driver de loop coloca um front-end de dispositivo de bloco no seu arquivo de dados.

Se você montar um loop sem losetupo SO, ele executa um em segundo plano.

por exemplo

$ dd if=/dev/zero of=/tmp/foo bs=1M count=100
100+0 records in
100+0 records out
104857600 bytes (105 MB) copied, 0.0798775 s, 1.3 GB/s
$ mke2fs /tmp/foo
mke2fs 1.42.9 (28-Dec-2013)
....


$ losetup    
$ mount -o loop /tmp/foo /mnt1    
$ losetup
NAME       SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE
/dev/loop0         0      0         1  0 /tmp/foo
$ umount /mnt1
$ losetup
$ 

Pode ser necessário ligar losetupdiretamente se a imagem do arquivo tiver partições incorporadas.

por exemplo, se eu tiver esta imagem:

$ fdisk -l /tmp/foo2      

Disk /tmp/foo2: 104 MB, 104857600 bytes, 204800 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x1f25ff39

     Device Boot      Start         End      Blocks   Id  System
/tmp/foo2p1            2048      204799      101376   83  Linux

Não consigo montar isso diretamente

$ mount -o loop /tmp/foo2 /mnt1
mount: /dev/loop0 is write-protected, mounting read-only
mount: wrong fs type, bad option, bad superblock on /dev/loop0,
       missing codepage or helper program, or other error

Mas se eu usar losetupe kpartxacessar as partições:

$ losetup -f /tmp/foo2
$ losetup
NAME       SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE
/dev/loop0         0      0         0  0 /tmp/foo2
$ kpartx -a /dev/loop0
$ mount /dev/mapper/loop0p1 /mnt1
$
Stephen Harris
fonte
Você não precisa explícito losetup, basta usar mount -o loop,offset=$((512*2048)), onde 512está o tamanho do setor e 2048é o que fdiskdeu Startna partição.
Ruslan #
Sim, este foi apenas um exemplo de uso. Neste exemplo específico, pode ser mais fácil fazer o cálculo do deslocamento, mas pode haver casos de uso (por exemplo, várias partições que você deseja montar ao mesmo tempo) em que pode ser mais fácil justar losetupe kpartx. Deixe as ferramentas fazer o trabalho duro :-)
Stephen Harris
18

Os sistemas de arquivos esperam ler e gravar nos dispositivos de bloqueio, mas os arquivos de imagem não são dispositivos de bloqueio. Os dispositivos de loop fornecem um dispositivo de bloco em cima de um arquivo (ou outro dispositivo de bloco, opcionalmente com remapeamento).

Não há necessidade de considerar dispositivos de loop ao montar imagens em muitos casos, porque mountcuida de tudo para você; mas dispositivos de loop ainda estão envolvidos. losetup -l -amostrará a eles.

Consulte também Qual é a diferença entre mount e mount -o loop .

Stephen Kitt
fonte
Portanto, a bloco de dispositivo é implicitamente manipulada por mount?
#
2
Sim, mountcuida losetup, acrescentando -o loopetc.
Stephen Kitt
@ corel, Na maioria dos casos, ter uma montagem de chamada perdida para você funciona bem, mas há exceções, como montar várias partições a partir de uma imagem de disco.
Hildred 18/10/19
11

Você parece estar no Linux e o Linux usa um nome errado para esse recurso.

Inventei esse recurso em 1988 no SunOS-4.0 e chamo esse recurso fbk- File emula dispositivo BlocK.

O plano de fundo é que o driver de dispositivo emula um dispositivo de bloco em cima de um arquivo simples. Você precisa disso, pois um sistema de arquivos não pode usar um arquivo simples como armazenamento em segundo plano para um sistema de arquivos. Ele precisa de um dispositivo de bloco e é isso que fbkemula.

Já que algumas pessoas tornaram o programa mountum pouco mais inteligente e existem implementações de montagem que criam automaticamente uma fbkinstância para um arquivo, caso o mountprograma detecte que o argumento que se espera que seja um dispositivo de bloco pareça ser um arquivo de plano.

esperto
fonte
3
CV muito impressionante que você tem no seu perfil. Respeito ...
corsel 17/10
11
Sua postagem é um pouco mais fácil. Você pode ter escrito a primeira implementação, mas o Linux usa uma implementação diferente, portanto, não está usando o nome 'errado', apenas um nome diferente do que você escolheu para sua implementação.
Austin Hemmelgarn
4
Eu nunca disse que eles usavam o nome certo, apenas disse que afirmar que estava errado faz você parecer um elitista opinativo.
Austin Hemmelgarn
9
O nome 'loop' é abreviação de "loopback" 'e refere-se à maneira como as operações no dispositivo de bloco são "retornadas" ao VFS. O Solaris 8 introduziu um lofi("arquivo de loopback") que funcionava da mesma forma; O BSD os introduziu sob o nome vnd("vnode disk"), de modo que o conceito teve muitos nomes diferentes ao longo dos anos.
Caf
2
Os dois problemas mais difíceis no CS: coerência de cache, nomeação de identificador e erros pontuais.
Jens
1

Mesmo que não seja necessário em segundo plano para montar sistemas de arquivos a partir de arquivos, você ainda precisará dele para qualquer configuração usando um driver ou programa que absolutamente espere um dispositivo de bloco. Pense em servidores nbd (dispositivo de bloco de rede), drivers de dispositivo de bloco composto como mdraid, lvm etc.

rackandboneman
fonte