201.2 Compilando o Kernel
Para compilar o Kernel do Linux vamos precisar seguir alguns passos simples:
Baixar o código fonte;
Configurar o ambiente para a compilação (Em suma
make conf
oumake menuconfig
);Compilar (
make
);Instalar nosso Kernel que foi compilado (Em suma
make install
, mas podemos fazer manualmente!).
Antes de prosseguirmos, precisamos instalar alguns pacotes que são necessários para a compilação, não só de pacotes em geral, mas alguns são mais necessários se formos compilar um Kernel.
Veja a relação de pacotes abaixo, na última linha, você encontrará todos os pacotes que devam ser instalados, mas no começo, terá uma explicação simples para cada pacote.
## Debian
# Em ambientes Debian ou Debian like, instale uma Suite de ferramentas para compilação e desenvolvimento:
$ sudo apt install build-essential
# Para que a compilação do Kernel não dê erros, instale os pacotes abaixo:
$ sudo apt install bison flex libncurses-dev libelf-dev bc libssl-dev
## Redhat
# Em ambientes Redhat ou Redhat like, instale uma Suite de ferramentas para compilação e desenvolvimento:
$ sudo dnf groupinstall "Development Tools"
## Para usar o xconfig (Qt) baixe os pacotes abaixo:
$ sudo apt install pkg-config g++ libqt4-dev bison flex
## Para usar o gconfig (GTK) baixe os pacotes abaixo:
$ sudo apt install libgtk2.0-dev libglib2.0-dev libglade2-dev
Configurando o Ambiente
Existem várias formas de compilar o Kernel, vou tentar passar por elas e demonstrar a melhor forma.
# Entre em '/usr/src':
$ cd /usr/src
# Agora vamos baixar o código fonte do Kernel (no caso a versão estável do momento):
$ sudo wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.14.8.tar.xz
# Vamos descompactar usando o 'tar':
$ sudo tar xvf linux-5.14.8.tar.xz
# Crie um link simbólico apontando para o diretório do novo Kernel,
# isso vai facilitar nosso trabalho:
$ sudo ln -s linux-5.14.8 linux
# Entre na pasta do Kernel novo:
$ cd linux
Nesse ponto precisamos configurar o ambiente (preparar o ambiente para compilação), existem algumas formas de fazer isso, as duas mais conhecidas são usando o make config
e o make menuconfig
.
Nessa etapa onde configuramos o ambiente, basicamente vamos preparar o ambiente para compilação informando quais módulos do Kernel vamos compilar junto com o Kernel, ativando funções que o Kernel poderia não ter anteriormente, ou podemos remover um módulo, desativando um funcionalidade do Kernel que antes estava habilitada. Fazemos isso para ter um Kernel mais personalizado possível com nosso ambiente.
Existem 3 tipo de load para uma aplicação quando vamos configurar o ambiente:
- As que só podem ser carregadas com o Kernel (são os módulos Built-in), escolhidas como
kernel-only
; - As que só podem ser usadas como módulo (são os módulos externos), escolhidas como
modules-only
; - E temos as aplicações que podemos escolher entre usar como módulo externo e módulo interno (Built-in).
Para relembrar isso, consulta a seção módulos da LPIC-1.
Formas de configurar o ambiente para a compilação
make config
É o modo mais root de configurar um ambiente para compilação, nele vamos responder o que colocar ou não junto com o Kernel, mas vamos responder pergunta por pergunta, no total são mais de 100 perguntas.
make menuconfig
Com isso será exibido um menu via cli para que possamos marcar e desmarcar os módulo que queremos ou não no Kernel. Vamos ver como as opções são apresentadas:
# Módulo será Built-in:
[*] built-in
# Módulo será removido da compilação:
[ ] excluded
# Módulo será carregado como um módulo:
<M> module
# Módulo será carregado como Built-in:
<*> moduleVocê pode clicar em
Save
(use oenter
para selecionar), repondaYes
para salvar, toda essas perguntas serão salvas num arquivo chamado.config
.$ sudo ls -l .config
-rw-r--r-- 1 root root 255979 Sep 26 17:17 .config
# Veja algumas linhas desse arquivo:
$ sudo head -50 .config
#
# Automatically generated file; DO NOT EDIT.
# Linux/x86 5.14.8 Kernel Configuration
#
CONFIG_CC_VERSION_TEXT="gcc (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0"
CONFIG_CC_IS_GCC=y
CONFIG_GCC_VERSION=90300
CONFIG_CLANG_VERSION=0
CONFIG_AS_IS_GNU=y
CONFIG_AS_VERSION=23400
CONFIG_LD_IS_BFD=y
CONFIG_LD_VERSION=23400
CONFIG_LLD_VERSION=0
CONFIG_CC_CAN_LINK=y
CONFIG_CC_CAN_LINK_STATIC=y
CONFIG_CC_HAS_ASM_GOTO=y
CONFIG_CC_HAS_ASM_INLINE=y
CONFIG_CC_HAS_NO_PROFILE_FN_ATTR=y
CONFIG_IRQ_WORK=y
CONFIG_BUILDTIME_TABLE_SORT=y
CONFIG_THREAD_INFO_IN_TASK=y
#
# General setup
#
CONFIG_INIT_ENV_ARG_LIMIT=32
# CONFIG_COMPILE_TEST is not set
CONFIG_LOCALVERSION=""
# CONFIG_LOCALVERSION_AUTO is not set
CONFIG_BUILD_SALT=""
CONFIG_HAVE_KERNEL_GZIP=y
CONFIG_HAVE_KERNEL_BZIP2=y
CONFIG_HAVE_KERNEL_LZMA=y
CONFIG_HAVE_KERNEL_XZ=y
CONFIG_HAVE_KERNEL_LZO=y
CONFIG_HAVE_KERNEL_LZ4=y
CONFIG_HAVE_KERNEL_ZSTD=y
# CONFIG_KERNEL_GZIP is not set
# CONFIG_KERNEL_BZIP2 is not set
# CONFIG_KERNEL_LZMA is not set
# CONFIG_KERNEL_XZ is not set
# CONFIG_KERNEL_LZO is not set
CONFIG_KERNEL_LZ4=y
# CONFIG_KERNEL_ZSTD is not set
CONFIG_DEFAULT_INIT=""
CONFIG_DEFAULT_HOSTNAME="(none)"
CONFIG_SWAP=y
CONFIG_SYSVIPC=y
CONFIG_SYSVIPC_SYSCTL=y
CONFIG_POSIX_MQUEUE=yOutra opção que temos aqui é o
load
, usado para importar um.config
já existente.
make oldconfig
Usado quando já temos um
.config
, esse arquivo pode ser uma instalação já padronizada, ou podemos pegar de outro Kernel que já foi configurado. Caso exista alguma nova pergunta que ainda não tem resposta, o configurador do ambiente irá fazer essa pergunta, isso acontece principalmente em novos Kernels.make xconfig
Utiliza um instalador gráfico baseado em Qt, é similar ao menuconfig, mas utiliza a interface gráfica.
make gconfig
Utiliza um instalador gráfico baseado em GTK, é similar ao menuconfig, mas utiliza a interface gráfica.
Makefile
Normalmente esse arquivo é criado ao rodarmos um script denominado ./configure
, mas como no Kernel não temos essa opção de configuração de ambiente, então ele já vem pré configurado para podemos iniciar a compilação e o que não está lá dentro, encontra-se dentro de .config
ou outros arquivos.
Uma das opções que podemos alterar nesse arquivo é o EXTRAVERSION =
para inserie mais uma versão ao nosso Kernel, criando uma versão nossa por exemplo. Vou deixar essa opção como EXTRAVERSION = -001
.
.config
Nesse arquivo .config
, podemos dar um nome ao nosso Kernel usando a opção config_local_version=
, por exemplo, vamos dar o nome de -maddogs, ficando assim: CONFIG_LOCALVERSION="-maddogs"
.
#### Ficando assim:
#
# General setup
#
CONFIG_LOCALVERSION="-maddogs"
Uma forma de pegar um .config
já existente é pegando do Kernel que já temos instalado:
$ ls /boot/config-$(uname -r)
/boot/config-5.4.0-86-generic
# Podemos copiar esse arquivo para a pasta onde temos o código fonte do Kernel:
$ sudo cp /boot/config-$(uname -r) .config
# Agora importe esse arquivo e salve novamente:
$ make menuconfig
## Clique em 'Load', depois 'Save' e saia.
Dessa forma, ja teremos um .config
pronto.
Compilando o Kernel
Agora vamos dar início ao processo de compilação do Kernel. Para que não tenha nenhum problema na compilaçãom você precisa de no mínimo 2GB de Ram e 20GB de espaço livre em disco.
# Para compilar o kernel use o comando abaixo, -j(N) significa que vamos usar N núcleos da CPU,
# bzImage é o formato do arquivo final do Kernel.
#
# Esse processo pode demorar dependendo da configuração de Hardware, então pode esperar bastante!
# Levei 3 minutos usando a conf de 5 núcleos e 6GB de Ram.
$ sudo make -j5 bzImage
Se você obter o erro abaixo, edite o .config
e deixe a opção CONFIG_SYSTEM_TRUSTED_KEYS
em branco, ficando assim CONFIG_SYSTEM_TRUSTED_KEYS=""
. O valor padrão pede um certificado que não temos.
# Erro:
DESCEND objtool
CALL scripts/atomic/check-atomics.sh
CALL scripts/checksyscalls.sh
CHK include/generated/compile.h
make[1]: *** No rule to make target 'debian/canonical-certs.pem', needed by 'certs/x509_certificate_list'. Stop.
make[1]: *** Waiting for unfinished jobs....
make: *** [Makefile:1858: certs] Error 2
make: *** Waiting for unfinished jobs....
Casoa compilação tenha dado certo, você verá a saída abaixo, deixarei apenas o final:
LZ4 arch/x86/boot/compressed/vmlinux.bin.lz4
MKPIGGY arch/x86/boot/compressed/piggy.S
AS arch/x86/boot/compressed/piggy.o
LD arch/x86/boot/compressed/vmlinux
ZOFFSET arch/x86/boot/zoffset.h
OBJCOPY arch/x86/boot/vmlinux.bin
AS arch/x86/boot/header.o
LD arch/x86/boot/setup.elf
OBJCOPY arch/x86/boot/setup.bin
BUILD arch/x86/boot/bzImage
Kernel: arch/x86/boot/bzImage is ready (#1)
Esse processo nos informa onde está a imagem do Kernel (arch/x86/boot/bzImage
), esse arquivo é o que vemos em /boot
com o nome de vmlinuz-*
.
Compilando os Módulos para o Kernel
Agora vamos compilar os módulos, esses que estão em .config
, nesse ponto os módulos serão Built-in ou Externos:
# Comece a conpilar os módulos, esse processo pode e vai demorar mais que o anterior, no meu caso demorou 30 minutos:
$ sudo make -j5 modules
Outras opções do MAKE
Existem outras opções do comando make
que podemos usar, veja abaixo quais são:
make clean
Usado para limpar a compilação que foi realizada, muito útil quando temos erro durante a compilação ou caso acabe o espaço em disco.
make mrproper
Igual a opção acima, mas remove o
.config
.
make distclean
Similar a opção
mrproper
, mas remove tudo que não veio com o código fonte (bakcups, dumps, temps e etc)
Instalação
Agora devemos instalar o que compilamos, no caso, o Kernel e os módulos.
Para instalar o módulos siga o processo abaixo:
# Use o comando abaixo para instalar os módulos:
$ sudo make INSTALL_MOD_STRIP=1 modules_install
Esse comando irá instalar os módulos em /lib/modules
com a versão do nosso Kernel. Esse argumento INSTALL_MOD_STRIP=1
fará com que os módulos sejam removidos após a instação, isso reduz drasticamente o tamanho do initrd
.
Veja este link para tentar reduzir o tamanho do initrd
, outra forma de reduzir o tamanho dele é usando um .config
com menos recursos, já que o gerado automaticamente vem com bastante coisa.
Para instalar o Kernel devemos ter no mínimo 1.5GB livre, caso não tenha seguido a recomendação de redução acima, caso não tenha, dará erro durante a criação do novo initd
, isso só vai acontecer se o /boot
estiver numa partição separada e com pouco espaço.
Podemos fazer de duas formas:
Usando o make
Siga os passos abaixo para instalar usando o comando
make
:$ sudo make install
arch/x86/Makefile:148: CONFIG_X86_X32 enabled but no binutils support
sh ./arch/x86/boot/install.sh \
5.14.8-001-maddogs arch/x86/boot/bzImage \
System.map "/boot"
run-parts: executing /etc/kernel/postinst.d/apt-auto-removal 5.14.8-001-maddogs /boot/vmlinuz-5.14.8-001-maddogs
run-parts: executing /etc/kernel/postinst.d/initramfs-tools 5.14.8-001-maddogs /boot/vmlinuz-5.14.8-001-maddogs
update-initramfs: Generating /boot/initrd.img-5.14.8-001-maddogs
run-parts: executing /etc/kernel/postinst.d/unattended-upgrades 5.14.8-001-maddogs /boot/vmlinuz-5.14.8-001-maddogs
run-parts: executing /etc/kernel/postinst.d/update-notifier 5.14.8-001-maddogs /boot/vmlinuz-5.14.8-001-maddogs
run-parts: executing /etc/kernel/postinst.d/xx-update-initrd-links 5.14.8-001-maddogs /boot/vmlinuz-5.14.8-001-maddogs
I: /boot/initrd.img is now a symlink to initrd.img-5.14.8-001-maddogs
run-parts: executing /etc/kernel/postinst.d/zz-update-grub 5.14.8-001-maddogs /boot/vmlinuz-5.14.8-001-maddogs
Sourcing file `/etc/default/grub'
Sourcing file `/etc/default/grub.d/init-select.cfg'
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-5.14.8-001-maddogs
Found initrd image: /boot/initrd.img-5.14.8-001-maddogs
Found linux image: /boot/vmlinuz-5.14.8-001-maddogs.old
Found initrd image: /boot/initrd.img-5.14.8-001-maddogs
Found linux image: /boot/vmlinuz-5.4.0-88-generic
Found initrd image: /boot/initrd.img-5.4.0-88-generic
Found linux image: /boot/vmlinuz-5.4.0-86-generic
done
# Agora reinicie e veja o novo Kernel:
$ uname -r
5.14.8-001-maddogs
Usando método manual
Siga os passos abaixo para fazer essa instalação manualmente.
# Instale o Kernel:
$ sudo cp arch/x86/boot/bzImage /boot/vmlinuz-5.14.8001
############################################
### Veja o antigo apontamento do vmlinuz ###
############################################
$ ls -lh /boot/vmlinuz
lrwxrwxrwx 1 root root 24 Sep 23 21:11 /boot/vmlinuz -> vmlinuz-5.4.0-86-generic
$ ls -lh /boot/vmlinuz.old
lrwxrwxrwx 1 root root 24 Sep 23 21:11 /boot/vmlinuz.old -> vmlinuz-5.4.0-66-generic
## Agora apague o 'vmlinuz.old':
$ sudo rm /boot/vmlinuz.old
# Renomeie o atual 'vmlinuz' para 'vmlinuz.old':
$ sudo mv /boot/vmlinuz /boot/vmlinuz.old
# Crie o apontamento para o novo Kernel:
$ cd /boot
$ sudo ln -s vmlinuz-5.14.8001 vmlinuz
## Agora vamos gerar um novo 'initrd' (5.14.8001 é a versão que nomeamos):
$ sudo mkinitramfs -o /boot/initrd.img-5.14.8001 5.14.8001
## Segue outro comando que podemos usar para gerar um 'initrd' (5.14.8001 é a versão que nomeamos):
$ sudo update-initramfs -c -k 5.14.8001
# Agora atualize o grub:
$ sudo update-grub
Sourcing file `/etc/default/grub'
Sourcing file `/etc/default/grub.d/init-select.cfg'
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-5.14.8001
Found initrd image: /boot/initrd.img-5.14.8001
Found linux image: /boot/vmlinuz-5.4.0-86-generic
Found initrd image: /boot/initrd.img-5.4.0-86-generic
Found linux image: /boot/vmlinuz-5.4.0-66-generic
Found initrd image: /boot/initrd.img-5.4.0-66-generic
Found linux image: /boot/vmlinuz-5.4.0-42-generic
Found initrd image: /boot/initrd.img-5.4.0-42-generic
done
# Agora reinicie e veja o novo Kernel ativo:
$ uname -r
5.14.8001
O initramfs
originalmente é compactado com CPIO
, mas em algumas distros também podemos encontrar ele compactado com gzip
.
Initrd vs Initramfs
Ambos possuem o mesmo propósito, o initrd
ou initramfs
servem para dar suporte ao Kernel no momento da inicialização do sistema. É um filesystem temporário que é carregador na memória ram e não no disco, muitas vezes chamado de disco RAM inicial.
O initramfs ou initrd é um arquivo que contém um sistema de arquivos raiz temporário que é usado durante o processo de inicialização. O principal objetivo de um arquivo desses é fornecer os módulos necessários para que o Kernel possa acessar o sistema de arquivos raiz "verdadeiro" do sistema operacional.
Logo que o sistema de arquivos raiz fica disponível, o kernel monta todos os sistemas de arquivos configurados em /etc/fstab
e, em seguida, executa o primeiro programa, um utilitário chamado init
. O programa init
é responsável por executar todos os scripts de inicialização e daemons do sistema. Depois que o programa init é carregado, o initramfs ou initrd é removido da RAM.
Coloquei sempre os dois para que você veja que ambos possuem o mesmo objetivo, porém, com limitações. O initramfs é o sistema usado nos dias de hoje, além de ser o sucessor do initrd.
Mesmo mudando o tipo de arquitetura/conteúdo desses arquivos, você sempre verá com o nome de initrd, mesmo sendo um initramfs, em algumas distros (como o ArchLinux) podem colocar com initramfs e não mais como initrd.
initrd
Possui o tipo de sistema de arquivo sendo
ramdev
;Possui a imagem de um FileSystem, por isso precisa de pelo menos um driver que tem que estar compilado em Kernel;
Um disco criado precisa ter um tamanho fixo;
É compactado com cpio e depois com gzip.
# Verificando o tipo de arquivo:
$ file initrd.image
initrd.image: gzip compressed data, from Unix, last modified: Sun Aug 14 22:45:56 2016
# Podemos descompactar e depois desagrupar com os comandos abaixo:
$ zcat initrd.image | cpio -i
106469 blocks
# Possui a arquitetura:
$ ls -lh | grep -v initrd.image
total 20M
drwxr-xr-x 2 vagrant vagrant 4.0K Oct 12 15:12 bin
drwxr-xr-x 3 vagrant vagrant 4.0K Oct 12 15:12 conf
drwxr-xr-x 8 vagrant vagrant 4.0K Oct 12 15:12 etc
-rwxr-xr-x 1 vagrant vagrant 6.6K Oct 12 15:12 init
drwxr-xr-x 7 vagrant vagrant 4.0K Oct 12 15:12 lib
drwxr-xr-x 2 vagrant vagrant 4.0K Oct 12 15:12 lib64
drwxr-xr-x 2 vagrant vagrant 4.0K Oct 12 15:12 run
drwxr-xr-x 2 vagrant vagrant 4.0K Oct 12 15:12 sbin
drwxr-xr-x 8 vagrant vagrant 4.0K Oct 12 15:12 scripts
drwxr-xr-x 3 vagrant vagrant 4.0K Oct 12 15:12 var
# Realmente sendo um filesystem completo.
initramfs
Possui o tipo de sistema de arquivo sendo
tmpfs
;O
tmpfs
não precisa de um driver porque está sempre no Kernel;É um arquivo agrupado com
CPIO
, mas em algumas distros também podemos encontrar ele compactado comgzip
.# Verificando o tipo de arquivo:
$ file initrd.img
initrd.img: ASCII cpio archive (SVR4 with no CRC)
# Podemos desagrupar com o comando abaixo (quando é CPIO):
$ sudo cpio -i < initrd.img
62 blocks
# Possui uma arquitetura assim:
$ tree
.
├── initrd.img
└── kernel
└── x86
└── microcode
└── AuthenticAMD.bin
3 directories, 2 files
Criação de um pacote de instalação do Kernel
Com a compilação em mãos, podemos criar um pacote para facilitar a instalação dele em outras máquinas, para isso, veja abaixo:
# Criando um pacote .deb do Kernel:
$ sudo make deb-pkg
## Criando um pacote .rpm do Kernel:
$ sudo make rpm-pkg
## Criando um pacote .rpm somente com a imagem do Kernel:
$ sudo make binrpm-pkg
Os pacotes ficarão em /usr/src
.
Pacotes | Descrição |
---|---|
*.desc | Usado para realizar o checksum. |
*.orig.tar.gz | Versão original do Kernel (código fonte). |
*headers* | Cabeçalhos para o novo Kernel. |
*image* | Imagem do Kernel. |
*libc-dev | Cabeçalhos das bibliotecas. |
*amd64.deb | Pacote do Kernel que vamos usar para instalar em outras máquinas. |
DKMS
O Dynamic Kernel Module Support (DKMS) é um programa/framework que nos permite gerar módulos para o kernel do Linux, onde as fontes não residam dentro da árvore principal de fontes, ou seja, cujo as fontes que vão gerar esse módulo não façam parte das fontes do Kernel em sí. O conceito aqui é poder ter alguns módulos automaticamente reconstruídos quando uma nova versão do kernel é instalada.
Um exemplo para isso são os módulos da NVIDIA (pelo menos no ArchLinux) e o DroidCam que devemos sempre construir novos módulos toda vez que um novo Kernel é instalado; onde esse processo de reconstruir um novo módulo para o Kernel novo é completamente manual.
Com o DKMS a reconstrução é automática ao instalar um novo Kernel.
Dependendo do pacote, ele pode vir pronto para trabalhar com o DKMS, como em
package_name-dkms
, nesse caso basta instalar e já temos o suporte ao DKMS nesse pacote ou pode não existir uma versão para isso, e vamos ter que adicionar esse pacote ao DKMS manualmente.
Instale o dkms:
$ sudo apt install dkms
Vejamos algumas opções do DKMS:
# Listando o status:
$› dkms status
nvidia, 460.91.03, 5.4.0-80-generic, x86_64: installed
nvidia, 460.91.03, 5.4.0-81-generic, x86_64: installed
nvidia, 460.91.03, 5.4.0-84-generic, x86_64: installed
nvidia, 460.91.03, 5.4.0-86-generic, x86_64: installed
nvidia, 460.91.03, 5.4.0-88-generic, x86_64: installed
virtualbox, 6.1.26, 5.4.0-81-generic, x86_64: installed
virtualbox, 6.1.26, 5.4.0-84-generic, x86_64: installed
virtualbox, 6.1.26, 5.4.0-86-generic, x86_64: installed
virtualbox, 6.1.26, 5.4.0-88-generic, x86_64: installed
Para que isso funcione, é instalado em /usr/src
o código fonte do programa que queremos habilitar o suporte do DKMS, com o arquivo de configuração do DKMS: /usr/src/nvidia-460.91.03/dkms.conf
.
# listando o conteúdo:
$ cat /usr/src/nvidia-460.91.03/dkms.conf
PACKAGE_NAME="nvidia"
PACKAGE_VERSION="460.91.03"
CLEAN="make clean"
BUILT_MODULE_NAME[0]="nvidia"
DEST_MODULE_LOCATION[0]="/kernel/drivers/char/drm"
PROCS_NUM=`nproc`
[ $PROCS_NUM -gt 16 ] && PROCS_NUM=16
MAKE[0]="unset ARCH; [ ! -h /usr/bin/cc ] && export CC=/usr/bin/gcc; env NV_VERBOSE=1 \
'make' -j$PROCS_NUM NV_EXCLUDE_BUILD_MODULES='' KERNEL_UNAME=${kernelver} IGNORE_XEN_PRESENCE=1 IGNORE_CC_MISMATCH=1 SYSSRC=$kernel_source_dir LD=/usr/bin/ld.bfd modules"
BUILT_MODULE_NAME[1]="nvidia-modeset"
DEST_MODULE_LOCATION[1]="/kernel/drivers/char/drm"
BUILT_MODULE_NAME[2]="nvidia-drm"
DEST_MODULE_LOCATION[2]="/kernel/drivers/char/drm"
AUTOINSTALL="yes"
PATCH[0]="disable_fstack-clash-protection_fcf-protection.patch"
#PATCH[1]="buildfix_kernel_5.6.patch"
#PATCH_MATCH[0]="^4.[6-7]"
BUILT_MODULE_NAME[3]="nvidia-uvm"
DEST_MODULE_LOCATION[3]="/kernel/drivers/char/drm"
#PATCH[2]="buildfix_kernel_4.9_amd64_only.patch"
Dracut
O Dracut é usado para gerar uma imagem initramfs em ambientes Redhat. Similiar ao update-initramfs
(que roda em Debian Like), mas o Dracut roda em sistemas RedHat.
Antigamente se usava o
mkinitrd
no ambiente Redhat, mas hoje foi substituído pelo Dracut.