Por que o kernel do Linux suporta “umount /”?

0

Por que o Linux suporta isso:

umount /

Por que alguém escreveria isso em vez disso:

mount / -oremount,ro

Estou vendo o código do kernel aqui:

if (&mnt->mnt == current->fs->root.mnt && !(flags & MNT_DETACH)) {
    /*
     * Special case for "unmounting" root ...
     * we just try to remount it readonly.
     */
    if (!ns_capable(sb->s_user_ns, CAP_SYS_ADMIN))
        return -EPERM;
    down_write(&sb->s_umount);
    if (!sb_rdonly(sb))
        retval = do_remount_sb(sb, SB_RDONLY, NULL, 0);

link

    
por sourcejedi 03.09.2018 / 11:51

1 resposta

2

Luciano Andress Martini indica:

First time I have a problem in a filesystem in linux I received a message by fsck like "/dev/hda2 is mounted read-write". In that epoch (1999), I did not understand what that means. I am 11 y.o. The only thing that come to my mind was: umount /, and it works (as it remounted read-only).

(Isso requer que não haja arquivos abertos para escrita. Por exemplo, ele pode funcionar quando o sistema está sendo executado no modo de usuário único. Observe que após executar o fsck, para reparar um sistema de arquivos que ainda está montado no modo somente leitura, deve sempre reiniciar por razões de segurança).

Em outras palavras, se você nem sabe que existe um comando para remontar um sistema de arquivos somente leitura, você pode tentar os mesmos comandos como se você precisasse fsck (consertar) /dev/fd0 ou seu /home filesystem . O caso especial permite que isso funcione, mesmo que o comando fsck esteja no sistema de arquivos que você aparentemente desmontou :-). É legal que o Linux possa ser útil assim, quando você tenta reparar um sistema corrompido.

Há outro uso deste caso especial: umount -a , usado em scripts antigos de desligamento. Isso é definido simplesmente para desmontar todos os sistemas de arquivos na ordem inversa, terminando com o sistema de arquivos raiz. Ele garante que todos os sistemas de arquivos estejam em um estado consistente no disco, portanto, eles não exigem um fsck na próxima inicialização. O kernel Linux não encerra qualquer sistema de arquivos automaticamente; você precisa ter algum programa de desligamento ou "sistema de inicialização" que faça isso.

Não sei porque esse caso especial está no kernel, e não no comando umount . Uma razão pode ser que kernels antigos aceitam o nome do dispositivo montado, em vez do diretório no qual o sistema de arquivos foi montado. Talvez isso tenha parecido mais simples ou mais confiável colocar esse código no kernel.

O caso especial não está documentado nas man pages atuais de umount(2) ou umount(8) . Portanto, a página do manual atual indica que umount -a sempre mostrará um erro, mas esse não é o caso. Eu suspeito que umount -a não é muito usado hoje em dia.

Existe um comentário de código muito semelhante nas versões anteriores do Linux incluindo 0,99. 10 (1993) .

Isso não parece ser um padrão para o UNIX tradicional. O kernel do FreeBSD retorna um erro em vez . Não tenho certeza porque há uma verificação de erro específica para este caso, separada da verificação de erro geral para desmontar um sistema de arquivos que está atualmente em uso. O equivalente do FreeBSD de umount -a está ciente deste problema e pára antes de desmontar o primeiro sistema de arquivos, ou seja, a raiz. (O código é aqui , mas você precisa entender como for loops e índices de array funcionam em C: -).

Os scripts antigos que dependem do umount -a contrastam com os scripts atuais do SysVinit, por exemplo, no Debian. /etc/init.d/umount_root remonta explicitamente / como readonly. O restante das montagens são processadas individualmente, por /etc/init.d/umountfs e /etc/init.d/umountnfs.sh .

umount -a não é ideal em sistemas modernos. É mais simples deixar um sistema de arquivos /proc montado para que /proc/mounts ainda possa ser usado. E /dev é geralmente um sistema de arquivos montado separado, que mostrará um erro de desmontagem porque /dev/console ainda está aberto.

Para um exemplo de um script antigo de desligamento, consulte o script de referência etc/rc.d/rc.0 no antigo SysVinit-2.4.tar.z / SysVinit-2.4.tar.gz .

#! /bin/sh
#
# brc       This file is executed by init(8) when the system is being
#       shutdown (i.e. set to run at level 0).  It usually takes
#       care of un-mounting al unneeded file systems.
#
# Version:  @(#)/etc/brc        2.01    02/17/93
#
# Authors:  Miquel van Smoorenburg, <[email protected]>
#       Fred N. van Kempen, <[email protected]>
#

  PATH=/bin:/etc:/usr/bin
  echo Unmounting file systems.....
  umount -a
  echo Done.
    
por 03.09.2018 / 11:51