AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 437057
Accepted
Tim
Tim
Asked: 2018-04-12 07:37:48 +0800 CST2018-04-12 07:37:48 +0800 CST 2018-04-12 07:37:48 +0800 CST

Como um diretório raiz é usado para resolução de nomes de caminhos absolutos?

  • 772

APUE diz

Cada processo também possui um diretório raiz que é usado para resolução de nomes de caminhos absolutos. Este diretório raiz pode ser alterado com a função chroot.

Eu pensei que apenas nomes de caminhos relativos precisavam de resolução. Então eu estava me perguntando

  • o que significa resolução de nomes de caminhos absolutos?

  • como chrootusar um diretório raiz para resolução de nomes de caminho absolutos? Obrigado.

filenames chroot
  • 2 2 respostas
  • 373 Views

2 respostas

  • Voted
  1. Johan Myréen
    2018-04-12T08:33:20+08:002018-04-12T08:33:20+08:00

    Quando o kernel resolve, por exemplo /usr/share/man/man1/cat.1.gz, para um inode, ele terá que começar da raiz /e descer até cat.1.gz. No caso de um nome de caminho relativo, basta procurar o arquivo no diretório atual.

    Talvez você estivesse pensando em como obter o caminho absoluto para o diretório de trabalho atual? Para determinar o caminho, você terá que trabalhar desde o diretório atual, passando por todos os diretórios intermediários até a raiz. (Mas observe que o kernel não faz isso quando recebe um caminho relativo para um arquivo, por exemplo, como um parâmetro para o opensyscall.)

    • 2
  2. Best Answer
    G-Man Says 'Reinstate Monica'
    2018-04-13T11:59:33+08:002018-04-13T11:59:33+08:00

    Todos os nomes de caminho precisam de resolução. Obviamente, os processos passam nomes de caminho para o kernel como argumentos para chamadas de sistema como:

    • creatou open,
    • linkou rename,
    • unlinkou rmdir,
    • chmodou chown,
    • chdirou chroot,
    • execve,

    etc. Considere um nome de caminho que se pareça com

    …  a  /  b  /  c

    A maneira como o kernel interpreta isso é:

    Iniciando (em algum lugar no sistema de arquivos),
    procure um diretório chamado a1 .
        Se não for encontrado, retorna um erro.
        Se encontrado, procure nesse diretório por um subdiretório chamado b.
            Se não for encontrado, retorna um erro.
            Se encontrado, procure nesse diretório a entrada de diretório chamada c2 .
                Se não for encontrado, retorna um erro 3 .
                Se encontrado, retorne esse inode.

    Observe a ofuscação no início do nome do caminho e na primeira linha do algoritmo. É simples: se o caminho começa com uma barra (ou seja, é um “caminho absoluto”, por exemplo, /a/b/c), a busca começa no diretório raiz do processo, e se o caminho começa com qualquer outra coisa (ou seja, é um caminho relativo, por exemplo , a/b/c), a pesquisa começa no diretório de trabalho atual do processo.


    Você pode perguntar "Como isso é alcançado?" Bem, é claro, o kernel mantém muitas informações sobre cada processo, incluindo

    • PID, PPID e vários identificadores de grupos de processos,
    • UID e GID reais, efetivos e salvos e lista GID suplementar,
    • Abrir arquivos,
    • disposições de sinal,

    e mais. Deixei de fora muitas coisas porque são irrelevantes para esta questão. Deixei de fora as variáveis ​​de ambiente porque elas não são mantidas pelo kernel; eles são mantidos por programas de espaço do usuário. Tudo o que o kernel faz é oferecer suporte a um mecanismo para passar variáveis ​​de ambiente de um programa para outro por meio de arquivos execve.

    Duas coisas que deixei de fora da lista acima para fins dramáticos são:

    • diretório raiz do processo e
    • diretório de trabalho atual

    Estes são ponteiros para inodes. Espero que todos que chegaram até aqui entendam como o diretório de trabalho atual do processo é definido — o processo chama chdir, passando um nome de caminho como argumento; o kernel interpreta o nome do caminho (o resolve para um inode) seguindo o procedimento descrito acima e, após o sucesso, define o ponteiro do diretório atual para apontar para esse inode.

    O diretório raiz do processo é definido da mesma forma, exceto com a chrootchamada do sistema.

    (Observe que, em ambos os casos, se o argumento do nome do caminho começar com /, a resolução do nome do caminho começará no diretório raiz do processo em vigor quando a chamada do sistema for invocada . )

    Alguns exemplos:

    • Se o seu diretório atual for /home/tim (e o diretório raiz do processo for a raiz do sistema de arquivos), então
      • se você acessar /etc/services, você receberá /etc/services,
      • se você acessar .bashrc, você receberá /home/tim/.bashrc.
    • Se você fizer isso chroot /filesystem/tim (supondo que exista um diretório com esse nome e você tenha acesso a ele e tenha o privilégio necessário para chroot), então
      • se você acessar /etc/services, você receberá /filesystem/tim/etc/services,
      • se você acessar /, você vai conseguir /filesystem/tim, então
      • se você chroot /, nada mudará;
      • se você chroot /filesystem/john, ele tentará .chroot/filesystem/tim/filesystem/john

    Como o diretório raiz e o diretório atual são armazenados como ponteiros para inodes, o sistema não precisa “localizá-los”.
    __________
    1  ou seja, procure uma entrada de diretório que aponte para um inode cujo modo indica que é um diretório, ou seja, (i_mode & IFMT) == IFDIR.

    2  para o último segmento do nome do caminho, não importa que tipo de arquivo seja; pode ser um diretório, um arquivo simples, um pipe nomeado, um link simbólico, um dispositivo, … qualquer coisa.

    3  se o último segmento do nome do caminho não for encontrado, mas a chamada do sistema for ou (equivalente) , ou qualquer outra coisa que não possa criar uma entrada de diretório, a operação não falhará.creat(file, mode)open(file, O_CREAT, mode)

    • 2

relate perguntas

  • chroot um usuário para mais de um diretório em locais diferentes

  • O aureport pode mostrar o caminho completo para os arquivos?

  • Como adicionar localidades a um sistema chroot programaticamente?

  • A pasta da biblioteca Steam deve estar no sistema de arquivos executável

  • Dois pontos (..) ou dois traços (--) como delimitador nos nomes de arquivos e diretórios

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    ssh Não é possível negociar: "nenhuma cifra correspondente encontrada", está rejeitando o cbc

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    Como descarregar o módulo do kernel 'nvidia-drm'?

    • 13 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add retorna com: "Erro ao conectar ao agente: nenhum arquivo ou diretório" 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya Por que o Linux usa LF como caractere de nova linha? 2017-12-20 05:48:21 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve