O que é o comando sed no /etc/init.d/umountfs do Debian para fazer?

1

/etc/init.d/umountfs é executado durante o desligamento para desmontar a maioria dos sistemas de arquivos. Ele contém isso:

PROTECTED_MOUNTS="$(sed -n ':a;/^[^ ]* \(\/\|\/usr\) /!{H;n;ba};{H;s/.*//;x;s/\n//;p}' /proc/mounts)"

Este comando aparentemente seleciona um subconjunto das linhas em /proc/mounts , que então ficam isentas de serem desmontadas posteriormente no script.

Ele combina linhas com / ou /usr no segundo campo (o ponto de montagem) e, em seguida, o que ele faz em seguida envolve muitos recursos exóticos de sed para eu descobrir qual é a intenção.

Isso faria sentido se estivesse apenas selecionando as linhas / e /usr , já que elas são desmontadas em um script diferente. Mas isso não faz isso. Quando eu o executo no meu% real/proc/mounts, $PROTECTED_MOUNTS acaba contendo quase todas as linhas, incluindo a linha /home . Não é bom se /home não for desmontado, então isso não pode estar certo.

O que o escritor desse comando sed poderia ter feito, com toda essa ramificação e espaço no espaço?

    
por Wumpus Q. Wumbley 22.08.2017 / 03:49

1 resposta

3

Vou tentar ...

Isso retornará todas as linhas até a última ocorrência de / ou /usr . AKA isso tira tudo depois da última ocorrência de qualquer um deles.

:a;/^[^ ]* \(\/\|\/usr\) /!{H;n;ba};

Isso indica que, para linhas que não contêm exatamente / ou /usr na segunda coluna (delimitado por espaço em branco), acrescente H old space, busque n ext linha, loop b ack para rotular a .

{H;s/.*//;x;s/\n//;p}

Só chegaremos aqui se encontrarmos uma linha com / ou /usr . Em seguida, anexamos a H old space (que tem tudo desde a primeira seção), clear pattern space, e x change espaço com espaço padrão, remove primeiro newline do espaço padrão e p rint it.

Depois de vermos a última linha / ou /usr (e já imprimimos tudo até esse ponto), passamos a primeira parte e sugamos todas as linhas não correspondentes restantes ... mas eles nunca são impressos, já que não entramos na segunda parte.

Eu fiz um pouco de testes e isso foi consistente com a minha afirmação.

É evidente que isso depende de algum tipo de pedido sendo mantido em /proc/mounts . Mas a lista é simplesmente criada de acordo com a ordem em que os pontos de montagem são criados . Então, onde quer que isso seja feito, deve ser mantido ou essa coisa vai quebrar, eu acho. Tudo parece terrivelmente frágil para mim.

    
por 22.08.2017 / 04:43

Tags