“Mount: / is busy” ao tentar montar como somente leitura para que eu possa executar o zerofree

36

Estou tentando rodar zerofreeno Ubuntu 11.04 para compactar a imagem do VirtualBox vdi usando:

VBoxManage modifyhd Ubuntu.vdi --compact

Para executar, zerofreea imagem do disco foi montada como somente leitura. Estou seguindo estas instruções, que dizem usar isso para remontar como somente leitura no modo de recuperação (prompt do shell Drop to root):

mount -n -o remount,ro -t ext2 /dev/sda1 /

Mas quando faço isso, recebo o erro:

mount: / is busy

Algumas ideias em como fazer isso?

Acompanhamento : Seguir a resposta da Jari e esta postagem executando esses comandos resolve o problema.

service rsyslog stop
service network-manager stop
killall dhclient
Caranguejo ondulado
fonte
4
A página de manual do zerofree sugere execução telinit 1e isso resolveu o problema para mim.
Alex Ryan

Respostas:

23

Alguns processos estão mantendo os arquivos abertos para gravação. Podem ser, por exemplo, programas que gravam logs, como rsyslogdferramentas de rede, como dhclientou qualquer outra coisa. Desligá-los um por um e tentar a remontagem pode funcionar.

Você pode encontrar processos que usam determinados arquivos usando o programa fuser. Por exemplo, fuser -v -m /retornará uma lista de processos. No entanto, não tenho certeza se é um deles que mantém o sistema de arquivos ocupado.

Jari Laamanen
fonte
2
Os processos que têm arquivos abertos no modo de gravação terão capital Fnos sinalizadores de acesso na fusersaída.
Jan Hudec 11/02
21

Você só pode remontar o sistema de arquivos somente leitura se não houver um processo que tenha um arquivo aberto para gravação. Execute lsof /para ver quais processos têm arquivos abertos no sistema de arquivos raiz. Os arquivos abertos para gravação serão indicados na FDcoluna. Você pode filtrá-los com

lsof / | awk '$4 ~ /[0-9].*w/'

Para filtrar os IDs do processo automaticamente, analise a saída de lsof -F pa:

lsof -F pa /home | awk '/^p/ {pid = substr($0, 2)} /^a.*w/ {print pid}'
Gilles 'SO- parar de ser mau'
fonte
11
Tentei com esta solução, ainda ocupada, pois alguns recursos não podem ser exibidos dessa maneira. Após interromper alguns serviços em execução, é possível remontar os fs como somente leitura.
Sam Liao
Fechei todos os processos que tinham um arquivo aberto para leitura, gravação ou ambos ( u) e ele ainda diz ocupado.
Hubro 15/03/19
12

Melhorando a resposta de Pedro:

Não pude matar processos que usam meu ponto de montagem. Então, eu fiz isso:

  • Editar /etc/fstabpara iniciar em somente leitura na próxima inicialização. Ex:/dev/sda1 / ext2 ro 0 1
  • Reinicie e abra um shell (chave do host + F2, por exemplo)
  • Execute zerofree

Para "recuperar" seu sistema:

  • Montagem com opção de leitura e gravação: $ mount -o remount,rw /dev/sda1
  • Edite /etc/fstabnovamente, restaurando seu valor original

Extra: se necessário, abra o modo de recuperação em qualquer etapa:

  • Reiniciar
  • Mantenha a tecla Shift enquanto a VM está carregando
  • Opções avançadas> Opção de kernel com modo de recuperação> Prompt de entrada para shell raiz
Topera
fonte
2
O capitão Óbvio deseja adicionar: Certifique-se de instalar o zerofree ANTES de reiniciar no modo ro
Xosofox 4/17/17
usando "Drop to Root Shell Prompt" e zerofree: filesystem montado em rw. Mas não tive problema em outra VM
Pawel Cioch
Isso só funcionou para mim quando a /dev/sda1 / ext2 ro 0 1entrada estava no topo da lista. Quando o coloquei como a última entrada, eu ainda tinha o erro de ponto de montagem ocupado.
afilina 26/09
6

Às vezes, existem tantos processos mantendo a montagem ocupada, que pode ser mais fácil simplesmente reiniciar com a montagem somente leitura.

Altere a entrada para o sistema de arquivos raiz em /etc/fstab, por exemplo:

/dev/sda1 / ext2 relatime,rw,errors=remount-ro 0 1

torna-se:

/dev/sda1 / ext2 noatime,ro 0 1

Na reinicialização, o sistema de arquivos será montado como somente leitura, para que você possa executá zerofree-lo.

Quando terminar, remonte o sistema de arquivos para leitura / gravação novamente ( mount -o remount,rw /) e desfaça suas alterações em /etc/fstab.

Inspirado por https://wiki.debian.org/ReadonlyRoot#Enable_readonly_root

Peter Nowee
fonte
Ótimo! Para sua informação, usei exatamente isso /dev/sda1 / ext2 ro 0 1e consegui inicializar no modo somente leitura.
Topera 17/09/16
5

Se você ainda não conseguir desmontar ou remontar o dispositivo após interromper todos os serviços e processos com arquivos abertos, poderá haver um arquivo de troca ou partição de troca mantendo o dispositivo ocupado. Isso não aparecerá com fuserou lsof. Desative a troca com:

sudo swapoff -a

Você pode verificar previamente e mostrar um resumo de quaisquer partições de troca ou arquivos de troca com:

swapon -s

ou:

cat /proc/swaps

Como alternativa ao uso do comando sudo swapoff -a, você também pode desativar a troca interrompendo um serviço ou unidade systemd . Por exemplo:

sudo systemctl stop dphys-swapfile

ou:

sudo systemctl stop var-swap.swap

No meu caso, era necessário desativar a troca, além de interromper quaisquer serviços e processos com arquivos abertos para gravação, para que eu pudesse remontar minha partição raiz como somente leitura, a fim de executar fsckna minha partição raiz sem reiniciar. Isso foi necessário em um Raspberry Pi executando Raspbian Jessie.

Simon Gould
fonte
4

Se você usar o systemd, as gravações em disco serão interrompidas parando o systemd-journald.

# systemctl stop systemd-journald.socket
# systemctl stop systemd-journald.service
# mount -o ro,remount /
Artur Pędziwilk
fonte
11
Para mim, ambas as unidades são reiniciadas imediatamente.
rld.
trabalhou para mim em "Opções avançadas> Opção de kernel com modo de recuperação> Prompt de entrada para shell raiz"
Pawel Cioch
3

Ok, tem o que eu fiz

Primeiro, meu objetivo era reduzir minha partição /( ROOT) para adicionar outra no meu disco.

  • Da execução da sessão, uma vez que tudo foi limpo e feito backup:

    init 1
    

    Minha área de trabalho desaparece e agora estou no console Linux ...

    ...
    Give root password for maintenance or press CTRL+D to continue
    TheRootPassword_SomethingLike1234
    
  • Agora, tentando montar /no modo somente leitura :

    mount -o remount,ro /
    mount: / is busy
    
  • Ok, a partir de agora, estou no modo teoricamente de usuário único , mas ps axmostro muitos outros processos !!

    Matá-los todos não é realmente possível ou perigoso ... ( kill 1é proibido ... não tenho tempo para jogar psdoom :-)

    A única coisa que posso fazer é System Request, por isso, conhecer duas maneiras: (veja o Documentation/sysrq.txtarquivo nos documentos do kernel):

    1. primeiro usando a magic SysRq keyarmadilha do kernel do teclado:

      • mantenha pressionado AltGr, então mantenha pressionado,
      • bata PrtScnapenas uma vez, mas não solte AltGr,
      • pressionado sapenas uma vez, isso enviará uma Emergency syncsolicitação ao kernel e
      • hit u, isso enviará uma Umount allsolicitação, remontará todos os sistemas de arquivos montados somente leitura,
      • então solte AltGr
    2. Ou por linha de comando:

      echo s >/proc/sysrq-trigger
      echo u >/proc/sysrq-trigger
      
  • Então agora eu poderia

    fsck -fC0 /dev/mapper/MyDisk-ROOT
    

    ....

...

F. Hauri
fonte
Nota: Se tudo fsckfoi feito com êxito, eu inicializei um Live USB para poder executar resize2fs... Esse recurso ainda não está implementado ...
F. Hauri
Meu fscknão sabe-f ; o que isso faria, zero blocos não referenciados?
ᴠɪɴᴄᴇɴᴛ
11
@ ᴠɪɴᴄᴇɴᴛ: É ext2a fsckopção: -f force a verificação mesmo se o sistema de arquivos parecer limpo.
F. Hauri
1

Para qualquer pessoa que esteja apenas procurando uma solução rápida para colar no seu terminal ...

(Antes de seguir os comandos abaixo, verifique se você completou as outras etapas, como telinit 1.)

Encontrou isto :

fuser -mv /dev/sda1 > /tmp/sda1.pids
kill `cat /tmp/sda1.pids`

Os comandos podem matar sua sessão, mas depois que você volta, sua partição está pronta para ser remontada.

DustWolf
fonte
1

Anexe o arquivo vdi como volume adicional e não pertencente ao sistema a outro VirtualBox. Lá você pode (re) montá-lo conforme necessário e executar o zerofree.

Digamos que você deseja compactar o disco VDI da VM1 (Máquina Virtual 1). Então você precisa de uma segunda VM2 . Isso é, :

  • Verifique se nem a VM1 nem a VM2 estão em execução;
  • No VirtualBox Manager:

    • Selecione VM2,
    • "Configurações" -> "Armazenamento" -> "Adicionar disco rígido":"Selecione-o como disco adicional" ,

    • selecione o arquivo vdi da VM1, que você deseja compactar. Dica: verifique se o disco rígido adicionado à VM2 fica em segundo na ordem de inicialização após o disco original da VM2.

    • inicie a VM2: agora você pode (re) montar o volume da VM1 como disco adicional para a VM2, porque nenhum processo a está usando na VM2. Dica: primeiro, abra o volume com o seguidor do Linux, que monta automaticamente o volume. Em seguida, use mount -lpara ver qual é _Device_o comando sudo mount -o remount,ro _Device_. No meu caso, era / dev / sdb1 . Então o comando foi (1) sudo mount -o ro,remount /dev/sdb1e depois (2) sudo zerofree /dev/sdb1.

Em vez de VM2, deve-se conseguir inicializar e instalar discos como imagem .iso e obter o mesmo, mas ainda não tentei.

leo
fonte
0

Presumo que você tente executar o mountcomando na VM. De qualquer forma, você provavelmente tem uma partição raiz diferente da do autor da publicação no fórum.

Experimentar:

mount -o ro,remount /

O que não depende da opção fs ou mount. Se isso não funcionar, você também pode tentar determinar seus fs raiz com grep " / " /proc/mountsou cat /proc/cmdline. Se o seu sistema de arquivos raiz for, por exemplo, / dev / mapper / system-rootfs, você poderá usar:

mount -o ro,remount /dev/mapper/system-rootfs /
Ulrich Dangel
fonte
0

Eu tive esse problema que me impediu de colocar minha máquina no modo somente leitura. Resolver o problema demorou mais do que eu gostaria de admitir ... Acredito que meu problema foi que deixei o Apache-Zeppelin em execução e esqueci. Verifique se você não está fazendo o mesmo com outro serviço do tipo hospedagem. Para resolver o problema, eu costumava fuser -kill /encerrar todos os processos que poderiam estar causando o problema e isso me permitiu voltar ao modo ro.

ob1
fonte
0

A solução para mim foi reiniciar o sistema operacional e escolher "modo de recuperação" no menu de inicialização do GRUB. No "modo de recuperação", há menos processos em execução e a remontagem somente leitura funciona bem.

Se o sistema tiver um arquivo de troca no sistema de arquivos raiz (em vez de uma partição de troca), também será necessário desativar temporariamente o arquivo de troca com swapoff -a.

Boann
fonte