Conclusões

Conclusões

PXE (ambiente de execução de pré-boot) é um ambiente cliente-servidor que possibilita a inicialização e instalação de sistemas operacionais sem a necessidade de mídia física. A ideia principal é bastante simples: em um estágio muito inicial, um cliente recebe um endereço IP de um servidor DHCP e baixa os arquivos necessários para executar o processo de inicialização via tftp Protocolo (FTP trivial). Neste tutorial, usaremos o Dnsmasq Aplicação: pode ser usado como um servidor DHCP primário ou em Proxy DHCP modo se houver outro servidor DHCP na rede; Ele também fornece o serviço TFTP usado para transferir arquivos.

Neste tutorial, você aprenderá:

  • Como configurar o pxelinux e criar um menu de inicialização
  • Como extrair arquivos de um ISO e configurar a estrutura de arquivo apropriada
  • Como configurar o dnsmasq como um servidor DHCP padrão ou proxy
  • Como configurar o servidor TFTP incorporado em dnsmasq
  • Como permitir o tráfego através das portas necessárias usando UFW
Raspberry Pi como um servidor de inicialização PXE

Requisitos de software e convenções usadas

Requisitos de software e convenções de linha de comando Linux
Categoria Requisitos, convenções ou versão de software usada
Sistema Raspberry Pi OS (anteriormente conhecido como Raspbian)
Programas Dnsmasq, pxelinux, syslinux-efi
Outro Permissões de raiz
Convenções # - requer que os comandos linux -comidos sejam executados com privilégios de raiz diretamente como usuário root ou por uso de sudo comando
$-exige que o Linux-Commands seja executado como um usuário não privilegiado regular

Instalando pacotes

A primeira coisa que devemos fazer é instalar alguns pacotes essenciais:

  • Dnsmasq
  • pxelinux
  • Syslinux-Efi

Dnsmasq fornece o DHCP e o tftp Serviços; Pxelinux é um membro do carregador de inicialização do SysLinux família, e é projetada especificamente para o ambiente PXE; O pacote syslinux-efi_ contém bibliotecas necessárias para apoiar Efi clientes. Para instalar os pacotes no Raspberry Pi OS, podemos executar:

$ sudo apt-get update && sudo apt-get install dnsmasq pxelinux syslinux-efi 

Estrutura de arquivo

Depois que os pacotes necessários forem instalados, podemos prosseguir e configurar a estrutura do arquivo. Para o bem deste tutorial, a raiz de toda a configuração será o /mnt/data/netboot diretório, que também será usado como o tftp root (definido dentro do arquivo de configuração DNSmasq); Todos os arquivos necessários serão armazenados dentro dele.

Arquivos e módulos SysLinux

Queremos poder apoiar a inicialização dos clientes em BIOS e Efi Modo, portanto, a primeira coisa que precisamos fazer é criar dois diretórios com o nome das arquiteturas dentro /mnt/data/netboot:

$ mkdir/mnt/data/netboot/bios, efi64 


Cada arquitetura precisa de algumas bibliotecas específicas do SysLinux para funcionar. Nós os copiamos nos diretórios apropriados:

$ cp \/usr/lib/syslinux/modules/bios/ldlinux, vesamenu, libcom32, libutil.C32 \/usr/lib/pxelinux/pxelinux.0 \/mnt/data/netboot/bios $ cp \/usr/libs/syslinux/modules/efi64/ldlinux.e64 \/usr/lib/syslinux/modules/efi64/vesamenu, libcom32, libutil.C32 \/usr/lib/syslinux.EFI/EFI64/SYSLINUX.efi \/mnt/data/netboot/efi64 

Arquivos de distribuição

Neste ponto, precisamos criar o diretório que hospedará as distribuições que queremos disponibilizar em nosso menu de inicialização. Vamos chamá -lo bota:

$ mkdir/mnt/data/netboot/bota 

Neste tutorial, exatamente como exemplo, trabalharemos com uma imagem do Debian Netinstall. Por conveniência, suponho que um ISO verificado anteriormente (dê uma olhada em nosso artigo sobre como verificar a integridade e a assinatura de uma imagem de distribuição com GPG se quiser saber como verificar a integridade e a assinatura de uma imagem de distribuição) para estar disponível no sistema de arquivos RPI no /mnt/dados/isos diretório.

Criamos o caminho apropriado dentro /mnt/data/netboot/bota, Nomeação de diretórios após a arquitetura, nome e versão do sistema que queremos fornecer em nosso menu (neste caso AMD64 - Debian 10):

$ mkdir -p/mnt/data/netboot/boot/amd64/debian/10 

Essa escolha de caminho é arbitrária, então fique à vontade para criar o seu próprio. Neste ponto, devemos montar o ISO de distribuição e copiar os arquivos no diretório de destino. Para montar o ISO que corremos:

$ sudo monte -o loop -t iso9660/mnt/data/isoS/Debian -10.4.0-AMD64-NETINST.iso /mídia 

Depois que o ISO estiver montado, seus arquivos estarão acessíveis em /meios de comunicação. Eu gosto de usar rsync Para copiá -los:

$ sudo rsync -av/mídia//mnt/data/netboot/boot/amd64/debian/10 

Depois que os arquivos são copiados, podemos desmontar o ISO:

$ sudo umount /mídia 

Na próxima etapa, veremos como criar um menu de inicialização usando a sintaxe syslinux.

Criando o menu de inicialização

Agora que temos os arquivos de distribuição, podemos criar o menu de inicialização. dentro do nosso TFTP Root, (/mnt/data/netboot no nosso caso), criamos o pxelinux.cfg diretório:

$ mkdir/mnt/data/netboot/pxelinux.cfg 

Dentro de pxelinux.cfg diretório, criamos um arquivo chamado padrão e cole a seguinte configuração dentro dela:

Menu Título PXE Boot Menu Vesamenu padrão.C32 Label Local Rótulo Bot de gravadora da unidade local Localboot 0xffff Menu Comece a Amd64 Título do menu AMD64 BEGN DEBIAN MENU Título Debian Label Stret.AMD/VMLINUZ APENDE VGA = 788 initrd = :: boot/amd64/debian/10/install.AMD/GTK/Initrd.GZ --- Rótulo silencioso Rótulo do menu Instalar ^Instalar kernel :: boot/amd64/debian/10/instalar.AMD/VMLINUZ APENDE VGA = 788 initrd = :: boot/amd64/debian/10/install.AMD/initrd.GZ --- Menu de término tranquilo final do menu 

A configuração acima gerará um menu aninhado construído seguindo o caminho do diretório que criamos dentro do bota diretório. Novamente, o acima é apenas um exemplo. Você pode criar e estruturar o menu como desejar; Tudo o que você precisa fazer é usar a sintaxe apropriada, conforme explicado na página dedicada do Wiki SysLinux.

O menu contém uma entrada para deixar o usuário inicializar do disco rígido local, um submenu com o AMD64 etiqueta e duas entradas para a distribuição Debian, installgui e instalar. O primeiro lança o instalador de distribuição no modo gráfico, o último em um modo textual que parece usar ncurses Bibliotecas.

Como podemos saber os parâmetros exatos a serem usados ​​no NÚCLEO e ACRESCENTAR linhas? Podemos dar uma olhada na configuração do menu que existe dentro do conteúdo de distribuição que extraímos do ISO. No nosso caso, por exemplo, /mnt/data/netboot/boot/amd64/debian/10/isolinux/menu.cfg. Infelizmente, nem todas as distribuições usam a mesma sintaxe; portanto, devemos prestar atenção e adaptar a configuração conforme necessário.

Uma coisa que tivemos que nos adaptar da configuração original é o caminho do vmlluz e initrd.gz arquivos. Lembre -se de que estamos acessando esses arquivos via tftp!

Normalmente, o caminho dos arquivos é interpretado como relativo para o diretório raiz do TFTP, mas na configuração acima, como você pode observar, usamos o :: sintaxe (por exemplo, escrevemos :: boot/amd64/debian/10/install.AMD/VMLINUZ para referir a imagem do kernel). Por que fizemos isso?

Desde que criamos dois diretórios que mantêm as bibliotecas que fornecem suporte para BIOS e efi64 modo e queremos usar a mesma configuração de menu para ambos, precisamos vincular o pxelinux.cfg diretório em ambos, portanto, precisamos referir o tftp raiz de uma maneira "absoluta". O :: O símbolo nos permite fazer exatamente isso: é uma maneira de fazer referência ao caminho absoluto para a raiz tftp.

Supondo que nosso diretório de trabalho atual seja /mnt/data/netboot, Para vincular a configuração do menu nos diretórios mencionados acima, podemos emitir o seguinte comando:

$ ln -rs pxelinux.CFG BIOS && ln -rs pxelinux.CFG EFI64 


Aqui usamos o -r opção do ln comando para criar relativo Links simbólicos. Neste ponto, nossa árvore de diretório deve ficar assim:

/mnt/data/netboot ├── BIOS │ ├── LDLINUX.C32 │ ├── Libcom32.C32 │ ├── Libutil.C32 │ ├── Pxelinux.0 │ ├── Pxelinux.CFG ->… /pxelinux.cfg │ └── Vesamenu.C32 ├── bota │ └── amd64 │ └── debian │ └─— 10 ├── efi64 │ ├── ldlinux.e64 │ ├── Libcom32.C32 │ ├── Libutil.C32 │ ├── Pxelinux.CFG ->… /pxelinux.cfg │ ├── syslinux.efi │ └── Vesamenu.C32 └── Pxelinux.CFG └── Padrão 

Agora podemos configurar o dnsmasq.

Configure o dnsmasq

O arquivo de configuração do dnsmasq é /etc/dnsmasq.conf. Alguns dos parâmetros que podem ser definidos dentro dele são comentados; Mais informações sobre eles podem ser encontradas consultando o Dnsmasq manual. Vamos considerar apenas os necessários para a nossa configuração.

Desativando a funcionalidade DNS

A primeira coisa que queremos fazer é desativar o serviço DNS incorporado em Dnsmasq: precisamos apenas das funcionalidades DHCP e TFTP oferecidas pelo aplicativo. Para atingir nosso objetivo, podemos usar o porta Opção: é usado para determinar qual porta deve ser usada para DNS; definindo seu valor para 0 desativa o serviço. Podemos anexar a instrução no final do arquivo de configuração.

porta = 0 

Especifique a interface de rede para solicitações de DHCP

A segunda coisa que queremos fazer é especificar a interface de rede que será usada para ouvir para solicitações DHCP. No nosso caso, a interface é eth0, Então, escrevemos:

interface = eth0 

Se não queremos usar uma interface específica, podemos especificar um endereço IP, usando o Ouça-se-address opção em vez disso.

Especificando o intervalo IP/modo de proxy

Esta etapa de configuração é muito importante e as mudanças, dependendo da configuração da nossa rede.

Se o serviço DHCP fornecido por Dnsmasq for o único Na rede, nesta etapa, devemos simplesmente configurar o intervalo de endereços IP que serão atribuídos aos clientes e, opcionalmente, um tempo de arrendamento por exemplo:

DHCP-RANGE = 192.168.0.100.192.168.0.200,12h 

Na linha acima, o intervalo de endereços IP disponíveis é definido separando os limites inferiores e mais altos por uma vírgula. Nesse caso, definimos um intervalo que vai de 192.168.0.100 para 192.168.200; nós também definimos um tempo de arrendamento de 12h.

O segundo caso é provavelmente o mais comum em uma configuração padrão/residencial, onde geralmente o serviço DHCP é fornecido por um roteador. Se for esse o caso, o dnsmasq deve ser definido para ser executado no modo proxy para evitar conflitos. Nesses casos, podemos escrever:

DHCP-RANGE = 192.168.0.0, proxy 

Entramos em dois elementos separados por uma vírgula: o primeiro é o endereço da sub -rede (192.168.0.0), o segundo é a palavra -chave "proxy".

Permitindo o servidor TFTP

Neste ponto, precisamos ativar o Dnsmasq Servidor TFTP incorporado: nós o usaremos para servir os arquivos necessários para os clientes inicializar. Tudo o que precisamos fazer para realizar esta tarefa é anexar a seguinte linha ao arquivo de configuração:

Ativar-tftp 

Também devemos definir o diretório que deve ser usado como o TFTP Root. Este diretório, como já discutimos, hospedará os arquivos compartilhados. No nosso caso, este diretório é /mnt/data/netboot (o padrão é /var/ftpd):

tftp-root =/mnt/data/netboot 

Defina o arquivo de inicialização com base na arquitetura do cliente

O pxelinux O BootLoader é capaz de trabalhar no modo EFI e BIOS, por isso temos que encontrar uma maneira de servir o arquivo apropriado, dependendo do modo usado pelo cliente. A questão é: como o cliente comunica essas informações?

O DHCP usa uma série de opções para troca de informações: opção 93 (Client-Arch) é usado para passar informações sobre a arquitetura do cliente. A tabela abaixo exibe os valores de opção numérica e string e as arquiteturas que eles fazem referência:

Valor da opção Valor da string Arquitetura
0 x86pc Intel x86pc
1 PC98 NEC/PC98
2 IA64_EFI Efi Itanium
3 Alfa DEC Alpha
4 ARC_X86 Arco x86
5 Intel_LEAN_CLIENT Intel Lean Client
6 IA32_EFI EFI IA32
7 BC_EFI Efi BC
8 Xscale_efi EFI XSCALE
9 X86-64_EFI EFI X86-64

Para especificar qual arquivo deve ser fornecido para o modo apropriado usado pelo cliente, podemos usar o PXE-Service opção. Para x86pc Podemos entrar na seguinte linha:

PXE-Service = X86pc, "Pxelinux (BIOS)", BIOS/PXELinux 


Fornecemos três valores separados por uma vírgula para a opção: o primeiro é o tipo de sistema do cliente (x86pc), o segundo é o Texto do menu e o terceiro é o arquivo que será baixado pelo cliente para executar a inicialização. O caminho do arquivo é em relação à raiz tftp. Nesse caso, é encontrado dentro do BIOS diretório que criamos antes e é chamado pxelinux.0: o nome deve ser relatado sem o .0 extensão, como você pode ver acima.

Para o EFI X86-64 modo, em vez disso, adicionamos:

PXE-Service = x86-64_EFI, "pxelinux (efi)", efi64/syslinux.efi 

Configuração de log

Outra coisa que é útil para ativar é Dnsmasq registro, para acompanhar a atividade DHCP e TFTP. Para realizar esta tarefa, adicionamos o quadros de log instrução para nossa configuração e defina o arquivo que deve ser usado para armazenar as mensagens com o Facilidade de log instrução:

Log-Queries Log-Facility =/var/log/dnsmasq.registro 

Salve a configuração e o reinício do serviço

Neste ponto, nossa configuração deve ficar assim:

porta = 0 interface = eth0 dhcp-fange = 192.168.0.0,proxy enable-tftp tftp-root=/mnt/data/netboot pxe-service=x86PC,"PXELINUX (BIOS)",bios/pxelinux pxe-service=x86-64_EFI,"PXELINUX (EFI)",efi64/syslinux.EFI Log-Queries Log-Facility =/var/log/dnsmasq.registro 

Podemos salvar as mudanças que fizemos no /etc/dnsmasq.conf arquivar e finalmente reiniciar o Dnsmasq serviço:

$ sudo systemctl reiniciar dnsmasq 

Configuração do firewall

Para que nossa configuração funcione corretamente, também devemos permitir o tráfego de entrada através do nosso firewall por meio de algumas portas específicas. Neste tutorial, assumirei o uso do ufw front-end. As portas pelas quais devemos permitir o tráfego de entrada são:

  • 67/UDP
  • 69/UDP
  • 4011/UDP

Para permitir o tráfego, podemos executar o seguinte comando:

$ sudo ufw permitir 67/udp $ sudo ufw permitir 69/udp $ sudo ufw permitir 4011/udp 

Inicialização

Neste ponto, se a máquina cliente estiver conectada à rede via Ethernet e a opção de inicialização PXE for escolhida como inicialização "fonte" (verifique se a funcionalidade está ativada!), devemos poder ver o menu de inicialização do PXE:

O menu de inicialização do PXE

Depois de selecionarmos AMD64 -> Debian -> Instalação gráfica Os arquivos apropriados serão baixados e o instalador do Debian deve aparecer:

Instalador gráfico Debian

Agora é possível prosseguir com a instalação.

Conclusões

Neste tutorial, vimos como executar as etapas necessárias para transformar um Raspberry Pi em um servidor de inicialização PXE: vimos como instalar e configurar o DNSmasq e o pxelinux bootloader; Também aprendemos a criar um menu SysLinux e a estrutura de arquivo apropriada; Finalmente, vimos quais portas abrirem para a configuração funcionar. Dúvidas? Questões? Sinta -se à vontade para comentar e pedir ajuda!

Tutoriais do Linux relacionados:

  • Como se conectar a um servidor FTP usando o Python
  • Configurar servidor FTP no Linux
  • Lista de clientes FTP e instalação no Ubuntu 22.04 Linux…
  • Lista de clientes FTP e instalação no Ubuntu 20.04 Linux…
  • Como configurar o servidor e o cliente FTP/SFTP no Almalinux
  • OpenLitesPeed como proxy reverso
  • Tutorial de configuração de proxy de lula no Linux
  • Como executar o Raspberry Pi OS em uma máquina virtual com…
  • Coisas para instalar no Ubuntu 20.04
  • Instale o proxy no Ubuntu 20.04 Linux