Como posso listar os arquivos que impedem / sejam remontados para somente leitura?
A) fuser
pode ser encontrado no psmisc
pacote; este é um caso de uso em que acho que fuser
brilha e é mais útil que lsof
.
# fuser -v -m / 2>&1 | grep '[Ff]r.e'
Isso mostrará todos os processos que têm arquivos abertos em / para leitura (f) e gravação (F). Os arquivos que impediriam / sejam remontados para somente leitura são aqueles que são abertos para gravação (F).
Mate os processos que são executáveis sendo executados com os arquivos do diretório raiz abertos para gravação .
# for fupid in $(fuser -v -m / 2>&1 | grep Fr.e | awk '{print $2}'); do kill $fupid; done
Isso está acima dos systemd
comentários com uma ressalva. Se systemd
for, init
então fuser
o verá e há outras considerações. Com a systemd
execução, ele pode (re) iniciar processos pelas suas costas, mesmo que apenas tenham sido identificados e eliminados fuser
. systemd
é muito mais avançado que o tradicional sysvinit
.
B) O UPDATE na descrição indica que o sistema possui apenas ... init
e getty
ainda está em execução ...
Eu vejo o comentário que diz que o sistema não está usando systemd
, está usando init
. No trecho, systemd
é init
. O comentário não disse explicitamente sysvinit
, portanto, suponho que o sistema em questão possa estar usando a extensão padrão systemd
para init
. Ou que outras pessoas que tropeçam neste post, que usam trecho desystemd
, acham essa parte útil.
De acordo com o Wiki Debian ,
O processo de inicialização do sistema é tratado pelo daemon init. No squeeze e nas versões anteriores, esse daemon é fornecido pelo pacote sysvinit e nenhuma alternativa é suportada. No wheezy , o daemon init padrão ainda está disponívelsysvinit
, mas uma "visualização de tecnologia" do systemd está disponível. No jessie and stretch , o sistema init padrão ésystemd
, mas a mudança para o sysvinit é suportada.
Desde Jessie, apenas o systemd é totalmente suportado; O sysvinit é suportado principalmente, mas os pacotes Debian não são necessários para fornecer scripts de início do sysvinit. O runit também é empacotado, mas não recebeu o mesmo nível de teste e suporte que os outros, e atualmente não é suportado pelo PID 1.
Com systemd
execução, há algumas etapas adicionais que devem ser tomadas para liberar / para que possam ser remontadas sem problemas.
É provável que system.slice
esteja mantendo arquivos abertos para systemd-journald.service
ou systemd-udevd.service
(ambos com dependências de soquete). Ou, se NetworkManager
estiver em execução ele pode reaparecer dhclient
que escreve locações para / var / ... (& / var / nem sempre é seu próprio dispositivo), etc. fuser
pode encontrar e você matar dhclient
, mas NetworkManager
começa-lo de volta para cima.
A moral é que muitas coisas são automatizadas que poderiam 'querer' / (e mais ainda com systemd
).
Para ter certeza, se possível, o systemd
equivalente ao nível de execução 1 é correspondido por rescue.target
(e runlevel1.target
é um link simbólico para rescue.target
).
1) Comece isolando o sistema para rescue.target
# systemctl isolate rescue.target
Deve solicitar que você digite a senha root; siga as instruções na tela.
2) No shell de resgate, descubra o que quer /.
# systemctl show -p Wants /
Normalmente, é system.slice
; pare tudo o que quiser. por exemplo
# systemctl stop system.slice
3) Neste ponto, a remontagem não deve relatar mount: / is busy
e mount -o remount,ro /
deve funcionar. Caso contrário, verifique novamente com fuser
.
4) FWIW; Também vi vezes quando umount
falha quando / se outro dispositivo é montado em um subdiretório de outra montagem, ou seja, montagens aninhadas. Por exemplo, umount /
falharia se / var / ou / boot / estivesse em outro dispositivo (e montado). Embora mount -o remount,ro /
ainda deva funcionar neste caso.
lsblk
pode ser útil para visualizar montagens aninhadas.
Por que lsof + L1 não lista mais os arquivos abertos que foram desvinculados?
Como eles não estão disponíveis (soquetes ou a maioria dos FIFOs e pipes), não são mais arquivos abertos (o processo pai fechou o descritor de arquivos) ou eles ainda têm uma contagem de links maior que 1.
man lsof (8) detalhes ...
+ | -L [l]
Esta opção ativa ('+') ou desativa ('-') a listagem das contagens de links de arquivos, onde elas estão disponíveis - por exemplo, elas não estão disponíveis para soquetes ou para a maioria dos FIFOs e tubulações.
Quando + L for especificado sem um número a seguir, todas as contagens de links serão listadas. Quando -L for especificado (o padrão), nenhuma contagem de links será listada.
Quando + L é seguido por um número, apenas os arquivos com uma contagem de links menor que esse número serão listados . (Nenhum número pode seguir -L.) Uma especificação no formato '' + L1 '' selecionará arquivos abertos que foram desvinculados. Uma especificação do formulário +aL1 <file_system>
selecionará arquivos abertos não vinculados no sistema de arquivos especificado.
w
ouu
naFD
coluna dalsof
saída, ouF
na saída defuser -vm /
, por exemplo. Mas não posso lhe dar uma lista exaustiva. Você também pode instalar o pacote needrestart .