AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 793404
Accepted
Huckle
Huckle
Asked: 2025-04-07 06:05:07 +0800 CST2025-04-07 06:05:07 +0800 CST 2025-04-07 06:05:07 +0800 CST

O que está segurando um descritor de arquivo para este dispositivo de bloco, também conhecido como por que losetup -d não removeu um dispositivo de bloco

  • 772

Há uma série de postagens sobre losetup -d /dev/loop0não remover um dispositivo lookback, mesmo que ele tenha retornado um código de retorno bem-sucedido. Acredito que a causa raiz dessas postagens é que o dispositivo de bloco tem o autoclearsinalizador definido, então losetupapenas chama , LOOP_CLR_FDmas não LOOP_CTL_REMOVE. Algum outro processo ainda deve estar segurando um descritor de arquivo, então o dispositivo de loop não é desanexado nem removido. Isso é confirmado via strace:

$ sudo losetup -J -l  | jq '.'     
{
  "loopdevices": [
    {
      "name": "/dev/loop0",
      "sizelimit": 0,
      "offset": 0,
      "autoclear": true,
      "ro": false,
      "back-file": "/example/backing_file",
      "dio": false,
      "log-sec": 512
    }
  ]
}


$ sudo strace -ff losetup -d /dev/loop0
...
newfstatat(AT_FDCWD, "/dev/loop-control", {st_mode=S_IFCHR|0660, st_rdev=makedev(0xa, 0xed), ...}, 0) = 0
openat(AT_FDCWD, "/dev/loop0", O_RDONLY|O_CLOEXEC) = 3
ioctl(3, LOOP_CLR_FD)                   = 0
close(3)                                = 0
...

A resposta comum é (a) procurar por todos os arquivos abertos em qualquer sistema de arquivos montado a partir do dispositivo de loop e, então, (b) desmontar o dispositivo de loop. Normalmente lsofe /proc/**/fdsão recomendados.

Meu problema é que estou tendo esse problema para dispositivos de bloco que nunca foram montados em primeiro lugar. Não consigo, nem que a minha vida dependesse disso, descobrir qual processo está segurando um descritor de arquivo para esse dispositivo de loop e, portanto, não consigo fazê-lo fechar.

Um teste rápido do programa C mostra que posso remover o sinalizador de limpeza automática do dispositivo de bloco:

$ sudo strace -ff --verbose=ioctl /tmp/remove-autoclear
...
openat(AT_FDCWD, "/dev/loop0", O_RDONLY|O_CLOEXEC) = 3
ioctl(3, LOOP_CLR_FD)                   = 0
close(3)                                = 0

write(1, "INFO: Result of sending LOOP_CLR"..., 57) = 57
INFO: Result of sending LOOP_CLR_FD to /dev/loop0 was: 0

openat(AT_FDCWD, "/dev/loop-control", O_RDONLY|O_CLOEXEC) = 3
ioctl(3, LOOP_CTL_REMOVE, 0)            = -1 EBUSY (Device or resource busy)
write(2, "ERROR(16): Sending LOOP_CTL_REMO"..., 94) = 94
ERROR(16): Sending LOOP_CTL_REMOVE to /dev/loop-control for device 0: Device or resource busy

openat(AT_FDCWD, "/dev/loop0", O_RDONLY|O_CLOEXEC) = 4
ioctl(4, LOOP_GET_STATUS, {lo_number=0, lo_offset=0, lo_flags=LO_FLAGS_AUTOCLEAR, lo_name="/example/backing_file", ...}) = 0
write(1, "INFO: Autoclear bit for /dev/loo"..., 40) = 40
INFO: Autoclear bit for /dev/loop0 is 1

ioctl(4, LOOP_SET_STATUS, {lo_number=0, lo_offset=0, lo_flags=0, lo_name="/example/backing_file", ...}) = 0
ioctl(4, LOOP_GET_STATUS, {lo_number=0, lo_offset=0, lo_flags=0, lo_name="/example/backing_file", ...}) = 0
write(1, "INFO: Successfully removed autoc"..., 56) = 56
INFO: Successfully removed autoclear bit for /dev/loop0
close(4)                                = 0

ioctl(3, LOOP_CTL_REMOVE, 0)            = -1 EBUSY (Device or resource busy)
write(2, "ERROR(16): Sending LOOP_CTL_REMO"..., 94) = 94
ERROR(16): Sending LOOP_CTL_REMOVE to /dev/loop-control for device 0: Device or resource busy

exit_group(16)                          = ?
+++ exited with 16 +++







INFO: Result of sending LOOP_CLR_FD to /dev/loop0 was: 0
ERROR(16): Sending LOOP_CTL_REMOVE to /dev/loop-control for device 0: Device or resource busy
INFO: Autoclear bit for /dev/loop0 is 1
INFO: Successfully removed autoclear bit for /dev/loop0
ERROR(16): Sending LOOP_CTL_REMOVE to /dev/loop-control for device 0: Device or resource busy

$ sudo cat /sys/dev/block/7:0/loop/autoclear
0

Mas, curiosamente, isso não faz com que losetup -d /dev/loop0falhe com um erro grave. Isso parece ser porque LOOP_CLR_FDdefine o sinalizador de limpeza automática novamente. Isso não é relevante para encontrar o processo que mantém o descritor de arquivo aberto, eu apenas observei porque é "ação assustadora à distância" e explica por que losetupnunca tenta chamar LOOP_CTL_REMOVE.

Alguma dica sobre como encontrar o processo que contém um descritor de arquivo para /dev/loop0que eu possa limpá-lo corretamente sem reinicializar?

$ sudo ls -l /proc/**/fd | grep loop0       
$ sudo ls -l /proc/**/fd | grep backing_file
$ sudo lsof | grep loop0
$ sudo lsof | grep backing_file
$ sudo mount | grep loop
loop-device
  • 1 1 respostas
  • 55 Views

1 respostas

  • Voted
  1. Best Answer
    Hauke Laging
    2025-04-07T06:33:37+08:002025-04-07T06:33:37+08:00

    Dispositivos de bloco geralmente não são abertos com um descritor de arquivo, mas pelo kernel.

    Você pode ver alguns dos acessos (não montagens) pelo in

    ls -l /sys/block/loop0/holders
    

    Uma verificação muito simples é lsblk.

    Como se livrar do dispositivo de retenção

    dmsetup lsmostra qual nome pertence a qual número. Um dispositivo LVM regular é melhor removido com as ferramentas LVM. Mas como medida de último recurso, você sempre pode usar

    dmsetup remove "$dm_name"
    
    • 3

relate perguntas

  • Lostup pode ser eficiente com arquivos esparsos?

  • tabela de partição em uma partição de disco; como acessar?

  • `mount -oloop` usa IO direto por padrão (quando o kernel é novo o suficiente)?

  • As partições do dispositivo de loop não aparecem

  • Dispositivo LVM persistente com dispositivos de loopback por fstab

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Possível firmware ausente /lib/firmware/i915/* para o módulo i915

    • 3 respostas
  • Marko Smith

    Falha ao buscar o repositório de backports jessie

    • 4 respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    user12345 Falha ao buscar o repositório de backports jessie 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl Por que a maioria dos exemplos do systemd contém WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve