Como o Linux se forma ao executar? [duplicado]

5

Quando você corre

sudo rm -rf --no-preserve-root /

Seu sistema excluirá todos os arquivos, um por um. No entanto, isso também inclui processos em execução e o próprio sistema operacional, acabando excluindo rm .

Como o Linux pode continuar a rodar se arquivos de programas estiverem sendo deletados? O sistema operacional não possui arquivos críticos?

Além disso, como rm continua a ser executado se for excluído?

    
por Frank 17.06.2015 / 21:58

3 respostas

6

Apesar de seu nome, rm não remove o arquivo. Na verdade, ele desvincula - remove o arquivo de referência de entrada de diretório. Se ainda houver links para esse arquivo, os dados serão mantidos intactos.

Quando o programa é executado, o Kernel mantém um tipo de hard links dentro (todos são tratados como o mesmo inode object), portanto os dados serão mantidos até o último processo fechar o arquivo desvinculado.

Observe como a desvinculação da chamada do sistema é descrita:

If that name was the last link to a file and no processes have the file open the file is deleted and the space it was using is made available for reuse.

If the name was the last link to a file but any processes still have the file open the file will remain in existence until the last file descriptor referring to it is closed.

Por exemplo:

# cp /bin/sleep ./sleep
# ln ./sleep ./sleep2
# ./sleep 1000 &
[1] 24399
# rm ./sleep

Neste ponto, os dados ainda são acessíveis através do hardlink, e o inode ainda é conhecido pelo kernel como (task_struct)->mm->exe_file :

# ls -lh ./sleep2
-rwxr-xr-x 1 myaut users 31K Jun 17 23:10 ./sleep2
# > ls -l /proc/24399/exe 
lrwxrwxrwx 1 myaut users 0 Jun 17 23:11 /proc/24399/exe -> /tmp/test/sleep (deleted)

Mesmo após a exclusão do segundo hardlink, os dados são mantidos (BTW, se você remover o plugue e seu sistema perder energia neste momento, você receberá vazamento de espaço do FS):

# rm ./sleep2
# ls -l /proc/24399/exe
/proc/24399/exe -> /tmp/test/sleep (deleted)

Agora eu mato processo, e só neste momento disco (ou tmpfs) espaço será desalocado:

# kill 24399
    
por 17.06.2015 / 22:15
2

Quase todos os programas hoje em dia têm seus programas executados a partir da memória (RAM) para que eles não precisem acessar o disco depois de carregados. Portanto, sua imagem no disco pode ser excluída sem nenhum problema.

    
por 17.06.2015 / 22:00
2

Quando você rm a um arquivo, o arquivo não é excluído imediatamente. rm invoca internamente a chamada do sistema unlink() para concluir seu trabalho de remoção de arquivo e para citar a página do manual para unlink() (consulte man 2 unlink para lê-lo na íntegra):

   unlink()  deletes  a  name  from the filesystem. If that name was the
   last link to a file and no processes have the file open the  file  is
   deleted and the space it was using is made available for reuse.

   If  the name was the last link to a file but any processes still have
   the file open the file will remain in existence until the  last  file
   descriptor referring to it is closed.

Essa é a resposta. Se um programa tiver um identificador para um arquivo que obtenha rm ed, esse arquivo ainda existirá no sistema de arquivos como um blob sem nome. Não tem mais um caminho, mas ainda existe e ainda está ocupando espaço. O programa pode continuar lendo e escrevendo para ele. Somente quando todas as alças para esse arquivo são eliminadas (porque os programas fecham o identificador de arquivo ou o próprio programa é encerrado), os arquivos são realmente removidos do sistema de arquivos.

    
por 17.06.2015 / 22:21

Tags