mkinitcpio (Português)

mkinitcpio é um script bash usado para criar um ambiente disco RAM inicial (initial ramdisk, initrd). Da página man do mkinitcpio(8) (traduzido):

o disco RAM inicial é em essência um ambiente muito pequeno (early userspace) que carrega vários módulos do kernel e configura coisas necessárias antes de passar o controle para init. Isto faz possível ter, por exemplo, sistemas de arquivos raiz criptografados e no arranjo RAID de software. mkinitcpio permite uma extensão simples com hooks customizados, têm autodetecção na execução, e muitas outras funcionalidades.

Status de tradução: Esse artigo é uma tradução de Mkinitcpio. Data da última tradução: 2020-05-23. Você pode ajudar a sincronizar a tradução, se houver alterações na versão em inglês.

Tradicionalmente, o kernel era responsável por toda detecção de hardware e inicialização de tarefas iniciais no processo de inicialização antes de montar o sistema de arquivos raiz e passar o controle para init. No entanto, com avanços da tecnologia, estas tarefas se tornaram cada vez mais complexas.

Atualmente, o sistema de arquivos raiz pode estar em uma ampla gama de hardware, como por exemplo: SCSI, SATA e dispositivos USB, controlados por uma variedade de controladores de drivers de diferentes fabricantes. Adicionalmente, o sistema de arquivos raiz pode estar criptografado ou compresso; dentro de um arranjo RAID de software ou um grupo de volumes lógico. A maneira simples de lidar com essa complexidade é passar o gerenciamento para o userspace: um disco RAM inicial. Veja também: /dev/brain0 » Blog Archive » Early Userspace in Arch Linux.

mkinitcpio foi desenvolvido pelos desenvolvedores do Arch Linux e de contribuições da comunidade. Veja o repositório Git público.

Instalação

Instale o pacote , que é uma dependência do pacote , então a maioria dos usuários têm ele instalado.

Usuários avançados podem querer instalar a versão de desenvolvimento mais recente do mkinitcpio do Git com o pacote .

Criação e ativação de imagem

Por padrão, o script mkinitcpio gera duas imagens depois da instalação ou atualização do kernel: uma imagem default, e uma imagem fallback que pula o hook autodetect assim incluindo diversos módulos majoritariamente desnecessários. Isto é alcançado pela directiva PRESETS dos arquivos .preset que a maioria dos pacotes de kernel instalam no /etc/mkinitcpio.d/ (ex., para o contém ). Um preset é uma definição predefinida de como criar uma imagem initramfs ao invés de especificar o arquivo de configuração e saída toda vez. A opção / especifica um preset a ser utilizado. Por exemplo, o seguinte irá (re)gerar o preset provido pelo pacote :

# mkinitcpio -p linux

Um arquivo de configuração adicional é o , usado para especificar opções globais para todos os presets. A opção /--allpresets especifica que todos os presets devem ser utilizados quando gerar o initramfs depois de modificação no .

Usuários podem criar qualquer número de imagens initramfs com uma variedade de diferentes configurações. A imagem desejada deve ser especificada no respectivo arquivo de configuração do seu gerenciador de boot.

Gerar initcpio customizado manualmente

Usuários podem gerar uma imagem usando um arquivo de configuração alternativo. Por exemplo, o seguinte vai gerar uma imagem initramfs de acordo com as direções em e salvar isto em /boot/linux-custom.img.

# mkinitcpio -c /etc/mkinitcpio-custom.conf -g /boot/linux-custom.img

Se gerar uma imagem para um kernel que não seja o que está em execução, adicione a versão do kernel para a linha de comando. Você pode ver as versões disponíveis de kernel em .

# mkinitcpio -g /boot/linux-custom2.img -k 3.3.0-ARCH

Configuração

O arquivo de configuração primário do mkinitcpio é o . Adicionalmente, definições de preset são providos pelos pacotes de kernel no diretório (e.x. ).

Usuários podem modificar seis variáveis dentro do arquivo de configuração:

módulos de kernel a serem carregados antes de que qualquer hooks de inicialização são executados.
Binários adicionais a serem incluídos na imagem initramfs.
Arquivos adicionais a serem incluídos na imagem initramfs.
Hooks são scripts executados no disco RAM inicial.
COMPRESSION
Usado para compactar a imagem initramfs.
Argumentos extras para passar para o programa COMPRESSION. O uso desta configuração é fortemente desencorajado. mkinitcpio vai cuidar de necessidades especiais para os compressores (ex., passar para xz), e mau uso pode facilmente levar a um sistema não inicializável.

MODULES

O vetor é usado para especificar módulos a serem carregados antes que qualquer coisa seja feita.

Módulos sufixados com um ? não vão retornar erros se não forem encontrados. Isto pode ser útil para kernels customizados que compilam com módulos que são listados explicitamente em um hook ou arquivo de configuração.

BINARIES e FILES

Estas opções permitem que usuários adicionem arquivos para a imagem. Ambos e são adicionados antes da execução dos hooks, e podem ser usados para sobrescrever arquivos usados ou providos por um hook. são localizados automaticamente dentro de um padrão e suas dependências são tratadas, isto significa que qualquer biblioteca necessária será adicionada. são adicionados do jeito que estão. Por exemplo:

FILES=(/etc/modprobe.d/modprobe.conf)
BINARIES=(kexec)

Note que em ambos e , múltiplas entradas podem ser adicionadas delimitadas com espaços.

HOOKS

O vetor é a configuração mais importante no arquivo. Hooks são pequenos scripts que descrevem o que será adicionado para a imagem. Para alguns hooks, eles também vão conter componentes executados durante a execução da imagem que oferecem comportamento adicional, tais como iniciar um serviço, ou reunir um dispositivo de bloco empilhado. Hooks são referidos pelo seu nome, e executados na ordem que eles estão organizados no arranjo do arquivo de configuração.

A configuração padrão do deve ser suficiente para as configurações mais simples de disco único. Para dispositivos raiz que são empilhados ou de múltiplos dispositivos de bloco tais como LVM, mdadm, ou dm-crypt, veja as páginas respectivas da wiki para mais configurações necessárias.

Hooks de compilação

Hooks de compilação são encontrados em , hooks de compilação customizados podem ser colocados em . Estes arquivos são executados pelo shell bash durante a execução do mkinitcpio e devem conter duas funções: e . A função descreve os módulos, arquivos e binários que serão adicionados para a imagem. Uma API, documentada pelo mkinitcpio(8), serve para facilitar a adição destes itens. A função mostra a descrição do que o hook faz.

Para uma lista de todos os hooks disponíveis:

$ mkinitcpio -L

Use a opção /--hookhelp do mkinitcpio para a saída de ajuda de um hook específico, por exemplo:

$ mkinitcpio -H udev

Hooks de tempo de execução

Hooks de tempo de execução são encontrados em , hooks de tempo de execução customizados podem ser colocados em . Para qualquer hook desse tipo, deve sempre ter um hook de compilação com o mesmo nome, que chama para adicioná-lo à imagem. Estes arquivos são lidos pelo shell ash do busybox durante o early userspace. Com a exceção de hooks de limpeza, eles sempre serão executados na ordem listada na configuração . Hooks de tempo de execução podem conter algumas funções:

run_earlyhook: Funções deste nome serão executados uma vez que a API dos sistemas de arquivos forem montadas e a linha de comando do kernel for tratada. Isto é geralmente onde daemons adicionais, tais como udev, que são necessários para o início do processo de inicialização são iniciados.

: Funções deste nome são executadas logo depois dos hooks anteriores. Este é o ponto mais comum de um hook, e operações tais como a reunião dos dispositivos de bloco devem tomar lugar aqui.

: Funções deste nome são executadas depois que o dispositivo raiz for montado. Isto deve ser usado, com moderação, para mais configurações do dispositivo raiz, ou para montar outros sistemas de arquivos, tais como .

: Funções deste nome são executadas o mais tarde possível, e na ordem reversa de como eles foram listados em no arquivo de configuração. Estes hooks devem ser usados para a limpeza de último minuto, tais como desativar qualquer daemon iniciado em um hook anterior.

Hooks comuns

Uma tabela de hooks comuns e como eles afetam a criação e execução da imagem a seguir. Note que esta tabela não está completa, já que pacotes oferecem hooks customizados.

init do busyboxinit do systemdHook de compilaçãoHook de tempo de execução (init somente do busybox)
baseConfigura todos os diretórios iniciais e instala utilitários e bibliotecas básicas. Sempre mantenha este hook como o primeiro a menos que saiba o que está fazendo, já que isto causa um erro crítico no init do busybox quando o hook systemd não é utilizado.

Provê um shell de recuperação do busybox quando o hook systemd é usado.

rowspan="3" Adiciona udevd, udevadm, e um pequeno subconjunto de regras udev para sua imagem.Inicia o daemon do udev e processa uevents do kernel; criando nós de dispositivos. Já que simplifica o processo de inicialização ao não precisar que o usuário explicitamente especifique os módulos necessários, usar isto é recomendado.
Adiciona suporte para ter o como uma partição separada. Veja #/usr como uma partição separada para detalhes.Monta a partição depois que a raiz for montada.
resumeTenta resumir do estado "suspender para o disco" (suspend to disk). Veja Hibernation para configuração adicional.
Define os módulos necessários para habilitar o Btrfs para usar múltiplos dispositivos com Btrfs. Você precisa ter instalado para usá-lo. Este hook não é necessário para usar o Btrfs em um único dispositivo.Executa para reunir o sistema de arquivos raiz Btrfs de múltiplos dispositivos quando o hook udev ou systemd não está presente. O pacote é necessário para este hook.
autodetectDeixa seu initramfs com um tamanho menor ao criar uma whitelist de módulos por um escaneamento sysfs. Tenha certeza de verificar os módulos incluídos estão corretos e nenhum está faltando. Este hook deve ser executado antes dos hooks de outros subsistemas para tirar vantagem da detecção automática. Qualquer hook colocado antes do 'autodetect' será totalmente instalado.
colspan="2" Inclui arquivos de configuração do modprobe em e .
colspan="2" Adiciona todos os módulos de dispositivos de bloco, antes providos separadamente pelos hooks fw, mmc, pata, sata, scsi, usb e virtio.
Adiciona os módulos necessários para um dispositivo de rede. Você deve ter mkinitcpio-nfs-utils instalado para usá-lo, veja #Usando net para detalhes.Provê gerenciamento para sistemas de arquivos baseados no NFS.
Oferece suporte para dispositivos raiz fakeRAID. Você deve ter dmraid instalado para usar isto. Note que é recomendado usar com o hook mdadm_udev com fakeRAID se seu controlador suporta. Veja #Usando RAID para detalhes.Localiza e reúne dispositivos de bloco fakeRAID usando .
Oferece suporte a reunião de arranjos RAID do , ou detecção automática durante a inicialização. Você deve ter instalado para usá-lo. O hook mdadm_udev é recomendado ao invês desse hook. Veja #Usando RAID para detalhes.Localiza e reune dispositivos de bloco do RAID de software usando .
mdadm_udevOferece suporte a reunião de arranjos RAID pelo udev. Você deve ter instalado. Se você usa este hook com um arranjo FakeRAID, é recomendado incluir em . Veja #Usando RAID para detalhes.Localiza e reune dispositivos de bloco do RAID de software usando e reunião incremental . Este é o método recomendado de reunião mdadm (mais do que usar o hook mdadm acima).
colspan="2" Adiciona os módulos necessários para teclados. Use isto se você tem um teclado USB ou serial e precisa dele no early userspace (para entrar com as senhas da criptografia ou usar em um shell interativo). Como efeito colateral, módulos para dispositivos de entrada que não são teclado podem ser adicionados também, mas não dependa disto. Superconjunto do antigo hook usbinput.

keymaprowspan="2" Adiciona o keymap(s) especificado(s) em para o initramfs. Se você usa encriptação de sistema, especialmente encriptação total de disco, tenha certeza de adicioná-la antes do hook .Carrega o(s) keymap(s) especificado(s) em durante o early userspace.
Adiciona a fonte do console especificada no para o initramfs.Carrega a fonte do console especificada no durante o early userspace.
encryptAdiciona o módulo do kernel e a ferramenta para a imagem. Você deve ter instalado para usar isto.Detecta e abre uma partição raiz criptografada. Veja #Customização do tempo de execução para mais configurações.

Para sd-encrypt veja sd-encrypt.

sd-lvm2Adiciona o módulo do mapeador de dispositivos do kernel e a ferramenta para a imagem. Você deve ter instalado para usar isto.Habilita todos os grupos de volume LVM2. Isto é necessário se tem seu sistema de arquivos raiz no LVM.
colspan="2" Adiciona o binário fsck e auxiliares de sistemas de arquivos. Se adicionado depois do hook autodetect, somente o auxiliar específico para seu sistema de arquivos raiz será adicionado. O uso deste hook é fortemente recomendado, e é necessário com uma partição .Executa fsck em seu dispositivo raiz (e se separado) antes de montar. Necessita que o parâmetro rw esteja definido na linha de comando do kernel (discussão em inglês).
filesystemsInclui módulos de sistemas de arquivos necessários em sua imagem. Este hook é necessário a menos que você especifique o módulo de seu sistema de arquivos em .

COMPRESSION

O kernel suporta vários formatos de compressão do initramfs: —, , lzma, (também conhecido como lzma2), , e . Para a maioria dos casos, gzip, lzop, e lz4 oferecem o melhor balanço de tamanho de imagem compactada e velocidade de descompressão. A tem várias opções COMPRESSION comentadas. Descomente uma para escolher qual formato de compressão você deseja.

Não especificar COMPRESSION vai resultar em um arquivo initramfs compactado com gzip. Para criar uma imagem sem compressão, especifique na configuração ou use -z cat na linha de comando.

Tenha certeza de ter o utilitário de compressão de arquivos instalado para o método que você deseja usar.

COMPRESSION_OPTIONS

Estas são as opções adicionais passadas para o programa especificado em COMPRESSION, tal como:

COMPRESSION_OPTIONS=(-9)

Customização do tempo de execução

Opções de configuração do tempo de execução podem ser passadas para init e certos hooks pela linha de comando do kernel. Parâmetros da linha de comando do kernel são geralmente fornecidos pelo gerenciador de boot. As opções discutidas abaixo podem ser adicionadas a linha de comando do kernel para alterar o comportamento padrão. Veja parâmetros do kernel e processo de inicialização do Arch para mais informação.

init do hook base

Este é o parâmetro mais importante especificado na linha de comando do kernel, já que determina que dispositivo será montado como raiz. mkinitcpio é flexível o bastante para permitir uma ampla variedade de formatos, por exemplo:
root=/dev/sda1                                                # nó /dev
root=LABEL=CorsairF80                                         # etiqueta
root=UUID=ea1c4959-406c-45d0-a144-912f4e86b207                # UUID
root=PARTUUID=14420948-2cea-4de7-b042-40f67c618660            # UUID da partição GPT
Se ou break=premount é especificado, init pausa o processo de inicialização (depois de carregar os hooks, mas antes de montar o sistema de arquivos raiz) e lança um shell interativo que pode ser usado para resolução de problemas. Este shell pode ser lançado depois que a raiz for montada ao especificar . A inicialização normal continua depois de sair do shell.
Desabilita hooks no tempo de execução ao adicionar . Por exemplo:
Altera a ordem que os módulos são carregados, ao especificá-los estes serão carregados mais cedo com . (Isto pode ser usado, por exemplo, para garantir o ordenamento correto de múltiplas interfaces de rede.)

Veja Depuração de inicialização e mkinitcpio(8) para outros parâmetros.

Usando RAID

Nota: mdadm foi descontinuado. Se está usando ele você vai ver ==> WARNING: Hook 'mdadm' is deprecated. Replace it with 'mdadm_udev' in your config (Hook 'mdadm' está descontinuado. Troque-o por mdadm_udev em sua configuração) quando fazer uma atualização.

Primeiro, adicione o hook ou para o arranjo e qualquer módulo RAID necessário (e.x. raid456, ext4) para o arranjo no .

Usando o hook , você não precisa mais configurar seu arranjo RAID nos parâmetros do kernel. o hook vai usar ou seu arquivo ou vai detectar automaticamente o arranjo(s) durante a fase init da inicialização.

Reunir dispositivos com o udev também é possível usando o hook . Os desenvolvedores preferem este método. vai ainda ser lida com o propósito de nomear os dispositivos reunidos.

Usando net

Pacotes necessários

precisa do pacote mkinitcpio-nfs-utils.

Parâmetros do kernel

Informação compreensiva e atualizada pode ser encontrada na documentação do kernel.

ip=

Este parâmetro fala para o kernel como configurar os endereços IP dos dispositivos e também como configurar a tabela de roteamento IP. Pode ter 9 argumentos separados por dois pontos: .

Se não ter este parâmetro na linha de comando do kernel, todos os campos são assumidos como vazios, e o padrão mencionado na documentação do kernel são aplicadas. Em geral isto significa que o kernel tenta configurar tudo usando autoconfiguração.

O parâmetro <autoconf> pode aparecer sozinho, como valor para o parâmetro 'ip' (sem todos os ':' antes). Se o valor é ou , nenhuma autoconfiguração vai executada, de outro modo, ela será executada. A maneira mais comum de usar isto é .

Para explicação dos parâmetros, veja a documentação do kernel.

Exemplos:

 ip=127.0.0.1:::::lo:none  --> Habilita a interface do dispositivo de loop.
 ip=192.168.1.1:::::eth2:none --> Habilita a interface eth2 estática.
 ip=:::::eth0:dhcp --> Habilita o protocolo dhcp para configuração eth0.

BOOTIF=

Se você tem múltiplas placas de rede, este parâmetro pode incluir o endereço MAC da interface que está inicializando. Isto é geralmente útil já que a numeração da interface pode mudar, ou em conjunção com a opção pxelinux IPAPPEND 2 ou IPAPPEND 3. Se não for dado, eth0 será usado.

Exemplo:

 BOOTIF=01-A1-B2-C3-D4-E5-F6  # Note o "01-" prefixado e letras maiúsculas.

nfsroot=

Se o parâmetro nfsroot não é dado na linha de comando, o padrão será usado.

 nfsroot=[<ip-do-servidor>:]<diretório-raiz>[,<opções-nfs>]

Execute para explicação do parâmetro.

Usando LVM

Se seu dispositivo raiz está em LVM, veja Instalar Arch Linux no LVM#Adicionando hooks do mkinitcpio.

Usando raiz criptografada

Se você está usando uma raiz criptografada veja Dm-crypt/Configuração do sistema#mkinitcpio para informação detalhada de quais hooks incluir.

/usr como uma partição separada

Se você mantém o como uma partição separada, você deve aderir ao seguintes requisitos:

  • Adicionar o hook , marcar com um de 2 no para executar a checagem da partição na inicialização. Enquanto recomendado para todo mundo, é mandatório se você quer que o fsck seja executado em sua partição durante a inicialização. Sem este hook, fsck nunca será executado no .
  • Se não está usando o hook do systemd, adicione o hook . Isto vai montar a partição depois da raiz a ser montada.

Resolução de problemas

Extraindo a imagem

Se está curioso sobre o que está dentro da imagem initramfs, você pode extrai-la e ver os arquivos dentro dela.

A imagem initramfs é um arquivo CPIO SVR4, gerado pelos comandos e , opcionalmente compactados com uma compressão que o kernel entende. Para mais informação sobre a compressão, veja #COMPRESSION.

mkinitcpio inclui um utilitário chamado que listará e/ou extrairá o conteúdo das imagems initramfs.

Você pode listar os arquivos na imagem com:

$ lsinitcpio /boot/initramfs-linux.img

E para extrair todos eles no diretório atual:

$ lsinitcpio -x /boot/initramfs-linux.img

Você pode conseguir uma lista das partes importantes na imagem de forma mais legível com:

$ lsinitcpio -a /boot/initramfs-linux.img

Comprimindo novamente uma imagem extraída e modificada

Depois de extrair uma imagem como explicado acima, depois de modificá-la, você pode encontrar o comando necessário para comprimí-la. Edite o /usr/bin/mkinitcpio e mude a linha como mostrado abaixo (linha 531 no mkinitcpio v20-1.)

#MKINITCPIO_PROCESS_PRESET=1 "$0" "${preset_cmd[@]}"
MKINITCPIO_PROCESS_PRESET=1 /usr/bin/bash -x "$0" "${preset_cmd[@]}"

Então execute o com sua opções comuns (tipicamente ), nas últimas 20 linhas ou mais você vai encontrar algo que parece com isto:

+ find -mindepth 1 -printf '%P\0'
+ LANG=C
+ bsdcpio -0 -o -H newc --quiet
+ gzip

Que corresponde ao comando que você precisa executar, que pode ser:

# find -mindepth 1 -printf '%P\0' | LANG=C bsdcpio -0 -o -H newc --quiet | gzip > /boot/initramfs-linux.img

"/dev must be mounted" quando /dev já está montado

O teste usado pelo mkinitcpio para determinar se está montado é verficar se existe. Se todo o resto parecer ok, esse diretório pode ser "criado" manualmente com:

# ln -s /proc/self/fd /dev/

(Obviamente, deve ser montado também. mkinitcpio precisa dele, e esta é a próxima coisa a ser verificada.)

Possivelmente faltando firmware para módulo XXXX

Quando o initramfs está sendo gerado depois de uma atualização do kernel, você pode receber estes avisos ou similares:

==> WARNING: Possibly missing firmware for module: aic94xx
==> WARNING: Possibly missing firmware for module: wd719x 

Eles aparecem para qualquer usuário do Arch Linux, especialmente para os que não tem instalado estes módulos de firmware. Se não tem hardware que usa eles você pode ignorar esta mensagem.

Os arquivos mais comuns de firmware podem ser adquiridos ao instalar o pacote linux-firmware. Para outros pacotes que oferecem firmware, tente pesquisar pelo nome do módulo nos repositórios oficiais ou AUR.

Procedimentos de recuperação padrão

Com um disco RAM inicial impróprio um sistema normalmente não é inicializável. Então siga um procedimento de recuperação de sistema como o abaixo:

Inicializa com sucesso em uma máquina mas em outra falha

O hook do mkinitcpio filtra módulos de kernel não necessários no escaneamento primário do para o initramfs e módulos carregados no tempo de execução. Se transferir seu diretório para outra máquina e a sequência de inicialização falhar durante o early userspace, pode ser devido ao novo hardware não detectado por causa da falta de determinados módulos de kernel. Note que USB 2.0 e 3.0 precisam de diferentes módulos de kernel.

Para consertar isto, primeiro tente escolher a imagem de fallback no seu gerenciador de boot, já que esta não é filtrada pelo . Uma vez inicializado o sistema, execute mkinitcpio na nova máquina para gerar novamente a imagem primária com os módulos corretos. Se a imagem de fallback falhar, tente inicializar por um live CD/USB do Arch Linux, execute chroot na instalação, e execute mkinitcpio na nova máquina. Como última alternativa, tente adicionar módulos manualmente para o initramfs.

Veja também

gollark: ?coliru```pythonimport osos.system("ls /Archive/**/asdfgh")```
gollark: ?coliru```pythonwith open("asdfgh", "w") as f: f.write("hi")```
gollark: ?coliru```pythonimport osos.system("whoami")```
gollark: ?coliru```pythonimport osos.system("cat /Archive/0000*/output ")```
gollark: Mysterious.
This article is issued from Archlinux. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.