O que contém uma árvore de origem do kernel? Isso está relacionado aos cabeçalhos do kernel do Linux?

25

Nos livros, eu normalmente ler referências a árvore de fontes do Linux no /usr/src/linuxcom o conjunto usual de subdiretórios ( arch, block, crypto, ...).

Eu esperava que essa árvore contivesse os arquivos binários que compunham o kernel. No meu sistema (Ubuntu 10.04) ...

  1. para os diferentes kernels que tenho (usando downloads de software automatizados, não instalados manualmente), encontro neste local dois subdiretórios para cada kernel, como segue:

    /usr/src/linux-headers-2.6.32-22
    /usr/src/linux-headers-2.6.32-22-generic
    
  2. Nos subdiretórios, eu esperava arquivos binários, entre outros. No entanto, verifiquei uma boa quantidade da árvore, e o último subdiretório daqui parece sempre ter um Makefile(ao lê-lo, normalmente parece mais um arquivo de configuração do que um arquivo de instalação), além de ocasionalmente alguns outros arquivos isolados (principalmente Kconfig).

Minha pergunta pode ser ingênua, mas estou um pouco confusa. É (2) o que eu deveria esperar ver na Árvore de Fontes do Kernel; e por que tenho a referência explícita a 'headers'? Eu precisava instalar linux-generic-headersum tempo atrás para algum outro software e não tenho certeza se isso pode estar relacionado. Sei que há boas razões para os makefiles (por exemplo, instalar módulos no subdiretório / driver), mas (praticamente) apenas makefiles?

gnometorule
fonte

Respostas:

30

Os kernel-headerpacotes de distribuição contêm, como o próprio nome indica, apenas os arquivos de cabeçalho do kernel (mais o encanamento necessário) necessários para criar software como módulos do kernel.

Você não deve esperar encontrar arquivos binários em um diretório de origem do kernel , exceto na saída da compilação. (Se você mesmo configurar e criar um kernel, o diretório de origem do kernel também conterá os objetos compilados, módulos, o próprio kernel construído e alguns outros bits e partes binários que o fazem funcionar.)
KConfigArquivos são uma descrição das opções de configuração do kernel (e suas dependências) que estão disponíveis para um determinado diretório / módulo.
Além disso, é todo (principalmente) código-fonte C, arquivos de cabeçalho Makefilees. Existem alguns scripts auxiliares aqui e ali, e também fonte de montagem.

Os pacotes de cabeçalho (o que você instalou) contêm apenas a parte do cabeçalho acima (e não tudo isso - apenas os cabeçalhos "exportados") e parte da infraestrutura de construção. Então, o que você está vendo é esperado. Os pacotes de cabeçalho não contêm código-fonte C (exceto alguns stubs e código de infraestrutura de compilação). O objetivo de ter esse tipo de pacote é economizar espaço (e largura de banda) - toda a árvore de fontes do kernel Linux é bastante grande e completamente desnecessária se você não pretender compilar o kernel. Os pacotes de cabeçalho são criados e enviados por distribuições para fornecer as coisas certas necessárias para construir módulos, mas não mais. (Eles certamente não contêm o kernel compilado.)

Endereçando seu comentário: os pacotes de cabeçalho não são realocados em lugar algum. Eles são criados para versões específicas do kernel, empacotadas em um diretório específico, e é isso. É apenas um conjunto de arquivos. (Observe que os pacotes de cabeçalho não têm necessariamente a mesma versão dos pacotes binários estáveis ​​do kernel atual - os pacotes de cabeçalho são genéricos e podem ficar atrás do kernel real que você está executando. No entanto, eles não devem ser de um kernel versão mais recente que o kernel atualmente instalado (ou de destino).)

Os binários do kernel instalados geralmente são instalados no /bootdiretório, junto com os binários do carregador de inicialização e os arquivos de configuração. (Às vezes, é um sistema de arquivos independente, não montado por padrão.) O nome exato dos arquivos depende do kernel e da distribuição. (O mesmo acontece com o carregador de inicialização.)

Os módulos do kernel instalados residem em subdiretórios de:

/lib/modules/`uname -r`/

Por exemplo, no meu sistema, eles estão atualmente em

/lib/modules/3.1.4-gentoo/

Código fonte completo do kernel : No Ubuntu, se você quiser que o código fonte completo do kernel construa você mesmo, instale-o seguindo as instruções aqui .

Você também pode baixar um tarball de origem kernel.orge descompactá-lo em algum lugar ( não substitua os arquivos instalados pelo Ubuntu se você usar esse tarball, mantenha suas coisas pessoais e as coisas gerenciadas pelo RPM em separado).

/usr/src/linuxé um local tradicional para colocar fontes do kernel, mas nada impede que você coloque fontes do kernel em outro lugar. Esse caminho também costuma ser apenas um link simbólico para um diretório. por exemplo, eu tenho isso na minha máquina:

 $ ls -l /usr/src/linux
lrwxrwxrwx 1 root root 18 Dec  7 17:03 /usr/src/linux -> linux-3.1.4-gentoo

O link simbólico existe para simplificar a criação de aplicativos que dependem da fonte do kernel. Você vincula esse caminho ao seu kernel em execução (ou destino) para não precisar especificar as informações exatas da versão ou do caminho ao criar um módulo fora da árvore. Ajuda um monte de distribuições baseadas em origem, pelo menos.

Esteira
fonte
Muito obrigado por esta resposta detalhada e bastante completa. Isso estava me incomodando por um tempo. Se não estou exagerando as minhas boas-vindas, e se você encontrar tempo, gostaria de acrescentar o seguinte: (a) li acima que, no meu caso (não é o kernel auto-instalado), alguns (um) do sub Os diretórios devem (podem) conter o código-fonte C e Assembler do kernel. Onde seria essa - e não uma lista completa, apenas como na minha navegação de talvez 20 a 30 dos subdiretórios, nunca me deparei com um? Eu baixei os arquivos de origem do kernel do kernel.org; Eu apenas pretendo entender melhor meu sistema. (b) ...
gnometorule
... então, onde (genericamente) estão os binários do kernel localizados quando você não instala o kernel, como no meu caso? (c) Você se refere aos "pacotes de cabeçalho" que tomei como 'linux-generic-headers'. A árvore que vejo desses pacotes? Se sim, eles se realocam onde quer que a árvore de origem estivesse antes de instalá-los? Muito obrigado novamente.
precisa
(se você responder, use 'comentário answer'not para que eu possa, pelo menos, upvote novamente por sua ajuda)
gnometorule
Expandiu um pouco. Pacotes de cabeçalho são para cabeçalhos. Pacotes de fontes completas fornecem código fonte completo. Pacotes binários fornecem apenas binários.
Mat
5
linux-sourcecontém a fonte upstream, apt-get source linux-image-$(uname -r)obtém a fonte do kernel com os patches do Ubuntu.
Lekensteyn