quarta-feira, 6 de agosto de 2025

A Grande Propaganda

   


   A Grande Propaganda, aquilo que chamam de Grande Mídia, é a personificação do Grande Irmão de Eric Arthur Blair, vulgo George Orwell. É um instrumento do poder cínico e cruel ao infinito, bem como está no livro "1984": "Não estamos interessados no bem dos outros; só nos interessa o poder em si. Nem riqueza, nem luxo, nem vida longa, nem felicidade: só o poder pelo poder, poder puro".

   Ainda que essas palavras não sejam exatas, pois elas são duplipensar porque, muitas vezes, da riqueza vem o Poder. O "poder", neste sentido, podemos definir como sendo o número de pessoas que te obedecem e/ou seguem você e fazem aquilo que você diz. Tendo riqueza, você pode pagar as pessoas para fazerem o que você quer e, de certo modo, corrompê-las.

   É preciso entender que, no contexto do livro, O'Brien almejava derrotar mental e emocionalmente a Winston, o que conseguiu, então usava e abusava das palavras, da Novilíngua (ou Novafala), do Duplipensar, etc, e isto tudo tinha de soar como se fosse idéia do próprio Winston. As duas frases finais do livro ilustram muito bem: "Ele conquistara a vitória sobre si mesmo. Winston amava o Grande Irmão".

   Adianto que expressões e conceitos como "duplipensar", "paralaxe cognitiva", "dissonância cognitiva", "efeito Dunning-Kruger", etc, nada mais são do que análises de um determinado aspecto da boa e velha Estupidez (burrice enorme - popularmente conhecida como 'burrice ao quadrado'). Ao longo da história, autores observam e analisam determinados fenômenos dentro do seu campo de ação e momento histórico, até porque, muitas vezes, não se tem como abarcar o fenômeno por completo, o que é óbvio.

   A Grande Propaganda, em especial aquela parte que chamam de "jornalismo", deturpou-se, porque de jornalismo tem mais nada há décadas, atualmente temos somente propagandismo feito por propagandistas. Aliás, desde que Johannes Gutenberg inventou a prensa em 1450 e depois veio a Imprensa, o verdadeiro Jornalismo sempre foi cultura de massas, pois é intrínseco o jornalismo ser das massas disformes. O Jornalismo nunca foi e nunca será coisa para intelectuais. Até pode ter um intelectual ou outro que escreva para uma coluna num determinado jornal para ter algum alcance, mas o jornalismo em si é cultura de massas.

   Antonio Gramsci, no volume 2 dos Cadernos do Cárcere, nos diz que "O tipo tradicional e vulgarizado do intelectual é dado pelo literato, pelo filósofo, pelo artista. Por isso, os jornalistas - que acreditam ser literatos, filósofos, artistas - crêem também ser os "verdadeiros" intelectuais" (página 53). Mais adiante, página 197, discorre sobre um "jornalismo que não somente pretende satisfazer todas as necessidades (de uma certa categoria) de seu público, mas pretende também criar e desenvolver estas necessidades e, em certo sentido, gerar seu público e ampliar progressivamente sua área", ou seja, um propagandismo mentiroso feito por "intelectuais orgânicos" (propagandistas, aqueles que, no Brasil, são conhecidos como "jornalistas").

   Além de outros, mais recentemente temos Ernesto Laclau, esse pregou que não precisamos mais observar as classes vindas da realidade, mas podemos e devemos criar e desenvolver as classes, ou seja, inventar classes e categorias com base na verossimilhança, entendeu... seu negacionista, machista, racista, fascista, homofóbico, esquerdopata, etc; o espectro político somente interessa quando é conveniente para levar vantagem. No mais, o negócio é criar uma confusão mental tremenda com uma rotatividade alucinante de "novas classes" onde qualquer propagandista imbecil ("propagandista imbecil" é redundância) inventa um termo ou uma palavra nova e, por ter alcance, a massa ignara ("massa ignara" também é redundância) acha engraçado e sai repetindo a expressão feito macaco (macaco vê, macaco faz; macaco vê, macaco repete). Como o ser humano é um animal dito racional dotado de um aparato vocal que lhe permite articular fonemas, ele, pela repetição constante, esvazia as palavras de significado transformando-as em meros xingamentos.

   "Tem uma palavra em Novafala", disse Syme, "que não sei se você conhece. Patofala, grasnar feito um pato. É uma dessas palavras interessantes com dois sentidos contraditórios. Quando aplicada a um adversário, é ofensa; aplicada a alguém com quem você concorda, é elogio."

   Lembrando que Saul D. Alinsky já tinha dado as regras de como usar a grande propaganda para promover as lutas de classes, então podemos considerar que na história do mundo parece ter uma sequência de idéias, aquilo que chamam de "corrente ideológica" onde um autor simpatiza com as loucuras de um autor anterior e desenvolve-as, muitas vezes adicionando novas loucuras próprias e dá sequência ao que, no início, parecia uma boa idéia... até um montão de gente morrer em decorrência e, então, dão uma nova roupagem e um novo perfume, mas, basicamente, a loucura é a mesma e o ciclo de loucuras continua.

   A linguagem jornalística é intrinsecamente genérica - e tem de ser assim, senão a maioria da população não entenderá e o jornalismo não terá alcance. Imaginem os jornalistas adotando uma linguagem científica ou intelectual como padrão no jornal inteiro, desde o editorial, passando pela coluna social e pela página policial, até o horóscopo!

   O jornalismo - lembrando que a palavra 'jornalismo' isolada por si só é o verdadeiro jornalismo; digo isso porque estúpidos não sabem mais nem o significado e o(s) sentido(s) das palavras, então tem de se acrescentar o adjetivo "verdadeiro": o verdadeiro jornalismo, a verdadeira política, a verdadeira verdade, etc, gerando um duplipensar -, o jornalismo baseia-se no alcance do jornal.

   O jornalismo baseia-se no alcance do jornal. Imaginem uma mentira onde eu invento que fulano de tal é um ladrão corrupto e, segundo dizem, é até "meio puto", e arremato: "se eu minto é por boca de outro, é o que dizem, mas eu não acredito nisso!"

   Num grupo pequeno de umas três ou quatro pessoas a tendência de tal mentira é durar uns 4 ou 5 dias, depois esvanece-se naturalmente.

   Imaginem agora se eu fosse um propagandista e contasse essa mesma mentira na minha coluna ou reportagem de um jornal de alcance nacional. A mentira ganhará força, crescerá exponencialmente. Claro que, para não dar na vista não usaria calão, apenas suscitaria dúvidas sobre a sexualidade do sujeito. O restante, o povão, a massa faria por mim, pois, afinal, sou um influenciador, um formador de opiniões, um propagandista.

   Hitler, em seu livro "Minha Luta", dedica um capítulo inteiro para A Propaganda de Guerra. Óbvio que a propaganda começa no título, pois Hitler usava a propaganda enviesada em tempos de paz, em tempos de guerra... o tempo todo, gerando um duplipensar, mas nominava de "Propaganda de Guerra" para os idiotas pensarem que ele usava somente em tempos de guerra. Mais ou menos como o PT (Partido Nacional-Socialista dos Trabalhadores Brasileiros) quando, em 2015, lançou seu caderno de teses "Um Partido para Tempos de Guerra". Mais ou menos quando o Diretor e ator José Wilker Almeida provou na década de 1980 que a Rede Globo de Televisão usava de técnicas nazistas para propaganda.

   Sobre a propaganda enviesada temos Edward Bernays, o sobrinho de Sigmund Freud. Sua propaganda era feita de forma oblíqua, enviesada – algo que hoje reconhecemos como manipulação. Sobre ele a propagandista Paula Schmitt tem um excelente texto, links ao final. O que não dizem (provavelmente não pesquisaram) é que durante um bom tempo Bernays sustentou seu tio Freud porque Freud era um perdulário, assim como Marx. Certos autores, além da sua afinidade literária, possuem uma afinidade de caráter e, por isso, um simpatiza com o outro.

   Sobre provar o que estamos dizendo em um texto, às vezes somos como Winston: "Às vezes, de fato, era possível apontar uma mentira específica. Não era verdade, por exemplo, que, como afirmavam os livros de história do Partido, o Partido tivesse inventado o avião. Winston se lembrava de que na sua mais tenra infância já existiam aviões. Só que era impossível provar o que quer que fosse. Nunca havia a menor prova de nada".

   Temos um exemplo real disso a respeito do Nelson Mandela onde nos mecanismos de busca, nos chats de IA e nos livros já não consta ele como terrorista e/ou criminoso quando fez parte da ANC e nem as barbaridades praticadas por ele e sua esposa. Quando tocam nesse assunto é de forma velada através de eufemismos justificando as atrocidades cometidas por ele como resposta à repressão violenta do Apartheid. Mesmo tendo alguém que lembra de Nelson Mandela na televisão nas décadas de 70 e 80 como praticante do "forno de pneus" onde queimavam as pessoas vivas, inclusive negros, mesmo assim essa pessoa será voto vencido. E que Mandela foi tirado da cadeia pelos Rockefeller para eleger-se presidente da África do Sul e assim permitir a exploração desumana das minas de diamantes. Aliás, o Filme "Diamantes de Sangue" retrata bem essa exploração, sendo que a carreira do ator Leonardo Di Caprio quase foi para o brejo por causa desse filme, ele levou anos para se reconciliar com a grande propaganda de Hollywood.

   A mesma coisa acontece com personagens como Stalin, Mao, etc. As informações são desencontradas de propósito e amenizadas. Tal fato está acontecendo com Hitler também no tocante ao número de mortos nos campos de concentração: falam somente nos 6 milhões de judeus, sendo que antigamente a informação era de que morreram em torno de 11 milhões de pessoas entre judeus, negros e ciganos.

   Talvez por isso que Orwell estava indeciso entre os títulos The Last Man in Europe e Nineteen Eighty-Four. "O Último Homem..." ilustra muito bem quando se é o único que procura falar a verdade em meio a um mundo de mentiras e, ao mesmo tempo, sugere a iminente extinção dessa espécie.

   O tal "conflito de gerações" serve aos interesses da grande propaganda porque os jovens, há décadas, não acreditam em nada do que os mais velhos falam, a não ser que tenham provas, porém, as provas estão escasseando-se. E, na maioria das vezes, nem é questão de prova, é questão de lógica pura e simples.

   E isto não é de hoje. A revolta judaica de 70 a.C, por exemplo, conhecida como Primeira Revolta Judaico-Romana, que culminou com a destruição do Segundo Templo pelo imperador Romano Nero e marcou o fim do judaísmo de Templo e o início do judaísmo Rabínico, foi o que motivou os Fariseus a escreverem o Talmude. O Talmude pertence à seita dos Fariseus, a única corrente antiga do Judaísmo pré-rabínico que sobreviveu à destruição do Segundo Templo. Os Fariseus foram o único grupo organizado no Judaísmo a sobreviver e, para preservar os ensinamentos com medo de se perderem ao longo dos anos, resolveram escrever as interpretações orais da Torá. O Talmude depois teve duas correntes: o Talmude Palestino e o Talmude Babilônico que, dos dois, é o mais influente e conhecido.

   Aliás, em 3.200 a.C, a humanidade já percebeu a importância da palavra escrita. Os primeiros textos escritos vem da escrita cuneiforme desenvolvida pelos Sumérios na Mesopotâmia. Platão e Aristóteles, em contra-ponto a Sócrates que era avesso à escrita, deixaram seus ensinamentos tanto na palavra falada quanto na palavra escrita. Não se pode estabelecer uma diferença hierárquica entre a palavra falada e a palavra escrita, as duas tem a mesma importância, cada qual no seu contexto.

   Por exemplo, Sócrates, que era assumidamente contra o conhecimento escrito e confiava somente no conhecimento por presença; caso Arístocles (conhecido como Platão), Aristófanes e Xenofonte não tivessem deixado escritos sobre os ensinamentos de Sócrates, principalmente Platão, hoje ninguém sequer saberia da existência de Sócrates como um dos grandes Filósofos da história da humanidade, quando muito, Sócrates seria uma nota de rodapé na filosofia Grega.

   A importância da palavra escrita reside no fato de que o conhecimento perdura ao longo dos anos e a importância da palavra falada está no convencimento imediato, porém, repito, não se pode estabelecer uma escala hierárquica entre as duas, pois as duas tem a mesma importância.

   O problema está quando falseiam e/ou mentem na palavra escrita adulterando a história, invertendo fatos transformando heróis em vilões e vice-versa. Isso causa um emburrecimento brutal na humanidade estupidificando-a de modo praticamente irreversível.

   Talvez seja este o admirável mundo novo que querem, talvez seja esta a formidável nova ordem mundial!

   Um mundo de estúpidos, pois estúpidos são facilmente controlados e manipulados. A mentira brutal, constante e avassaladora com o nome bonitinho de "revolução" ou "progressismo" altera os livros de história transformando heróis em vilões e vice-versa e depois reverte tudo num movimento constante onde a inteligência das pessoas vai laceando até perder a elasticidade tal como Winston ao chegar na conclusão de que amava o grande irmão.

   "E se o futuro não for progresso, mas repressão disfarçada de ordem?"

   Yuri Bezmenov, ex-espião da KGB, já nos alertava sobre isso na década de 1980. Ele dizia que uma população manipulada, mesmo tendo provas, não adianta nada apresentar provas tais como livros, fontes primárias, fotos, documentários, etc, eles não acreditarão e atacarão o mensageiro, somente acreditarão quando estiverem com a bota na cara. Contudo, já passamos de fase, atualmente mesmo com a bota na cara tem pessoas que ainda assim não acreditam. Vide o 08 de janeiro no Brasil. Pessoas condenadas a anos de prisão e ainda continuam defendendo seus algozes.

   A grande propaganda, aquilo que chamam de grande mídia, de um modo geral inclui o jornalismo, o entretenimento, futebol, filmes, peças de teatro, etc, tudo que movimenta massas, tudo que leva as pessoas a se prostituírem num comício ou, por exemplo, num show esperando horas para entrar, muitas vezes colocando barracas, ficando a noite inteira para idolatrar uma pessoa (ou pessoas) que sequer sabe(m) da sua existência e, depois de conseguirem entrar ficam pisando no barro, às vezes em fezes e urina, quando não levam um saco de urina pela Cabeça. E ainda pagam por isso.

   O problema de ser burro ou estúpido é que burros e estúpidos são malignos em si mesmos. Pessoas assim não pensam, elas somente agem. E suas ações sempre prejudicam os outros. Há no mundo e principalmente no Brasil a idéia de que pessoas burras ou estúpidas são coitadinhas. Nada mais errado! Todo burro ou estúpido é uma pessoa perigosíssima e não pode chegar em posições de poder.

   Não confunda inteligência com astúcia maligna. Inteligência está fortemente ligada ao bem, ao belo e ao verdadeiro. Decai a Inteligência decai a Moral e vice-versa, não importando qual decai primeiro, uma vem de arrasto da outra.

   Astúcia maligna vem da estupidez. Todo burro é astucioso maligno, pois só agirá em proveito próprio porque só consegue vislumbrar coisas simples. Seu campo de visão é limitadíssimo, então só consegue agir em proveito próprio para levar vantagem em tudo, mesmo se prejudicando sempre e sempre prejudicando os outros.

   Em construção...


https://julioseibei.blogspot.com/2025/01/estupidez-o-mal-da-modernidade.html

https://www.poder360.com.br/opiniao/edward-bernays-a-manipulacao-das-massas-e-a-manufatura-de-costumes/

https://observatoriodacomunicacao.org.br/clippings/edward-bernays-a-manipulacao-das-massas-e-a-manufatura-de-costumes/


quarta-feira, 30 de julho de 2025

Atualizar Debian Online de uma Versão para outra


PROLEGÔMENOS

Leia todo o artigo antes de sair executando comandos!
A atualização "online", ou seja, diretamente pelo sistema de uma versão atual para outra versão imediatamente superior do Debian, está muito boa desde o Debian 10 (Bullseye).
A vantagem é que você mantém o sistema sem precisar reinstalar do zero.
Não é recomendado atualizar pulando versões, por exemplo, do Debian 10 direto para o Debian 12, deve-se ir de uma versão para outra até chegar na mais atual.

Antes de realizar qualquer atualização é altamente recomendável fazer um backup dos dados para evitar perda em caso de problemas.
Escolha um horário no qual a internet esteja com pouco uso, de preferência quanto mais de noite ou de madrugada, melhor.
Caso fizer de madrugada, antes verifique se a operadora fará alguma manutenção na internet.

Ao utilizar esse tipo de atualização é necessário sempre observar o terminal durante a execução do comando "full-upgrade", esse comando é bastante seguro, porém, como é pela internet pode acontecer uma falha na rede e faltar algum pacote, corromper outro, etc, apesar de que o APT gerencia muito bem e retoma o download em caso de falha na rede.
Venho utilizando esse modo de atualização desde o Debian 9 (Stretch) e somente nessa época que tive alguns problemas, sendo que foram sanados manualmente depois, nada que exigisse muito esforço.
Atualmente essa atualização online do Debian está bastante segura.
Ela é desaconselhada para quem tem uma internet instável e/ou um hardware obsoleto (mais de 10 anos e sem upgrades).

Futuramente, caso for atualizar do Debian 12 (Bookworm) para o 13 (Trixie), basta seguir o algoritmo:

1- Atualizar o sistema atual;
2- Atualizar manualmente o arquivo /etc/apt/sources.list substituindo o conteúdo com os repositórios do novo sistema;
3- Executar os comandos de atualização.

O Debian segue há anos a mesma configuração de repositórios básicos bastando mudar o nome do sistema, por exemplo, do Debian 12 para o 13:

deb http://deb.debian.org/debian bookworm main contrib non-free non-free-firmware

ficará

deb http://deb.debian.org/debian trixie main contrib non-free non-free-firmware

Porém, sempre é bom conferir antes se não teve alguma mudança.
Você pode encontrar os repositórios atuais e maiores explicações no link abaixo: https://wiki.debian.org/pt_BR/SourcesList

Antes da atualização propriamente dita veremos algumas explicações.
Lembrando que o Debian tira dos filmes Toy Story os nomes que acompanham os números das versões.

O APT (Advanced Package Tool), além de ser uma biblioteca, é um projeto amplo cujos planos originais incluem uma interface gráfica e outras funcionalidades.
Ele é baseado numa biblioteca que contém as aplicações principais e o 'apt-get' é a primeira interface — em linha de comando — que foi desenvolvida dentro do projeto.

O 'apt' é uma interface de linha de comandos de alto nível para o sistema de gestão de pacotes e também é uma interface para a biblioteca APT.

O 'aptitude' é uma interface de linha de comando para o sistema de pacotes Debian GNU/Linux da biblioteca APT.
Ele permite ao usuário visualizar a lista de pacotes e executar tarefas de gerenciamento de pacotes, como instalação, atualização e remoção de pacotes.

O 'apt-get' é a ferramenta de linha de comando (terminal) para lidar com pacotes e pode ser considerado o "back-end" dos usuários para outras ferramentas que usam a biblioteca APT.

O 'dpkg' é uma ferramenta de nível médio para  instalar, compilar, remover e gerir pacotes .deb. O próprio dpkg é controlado inteiramente via parâmetros de linha de comandos o que consiste exatamente de uma ação com zero ou mais opções.
A ação diz ao dpkg o que fazer e as opções, quando tiver, controlam o comportamento da ação. O 'dpkg' pode também ser usado como "front-end" para dpkg-deb e dpkg-query.

No diretório /etc/apt/sources.list.d é onde ficam os arquivos dos repositórios externos para atualizações de pacotes/programas como PostgreSQL, Google-chrome, Opera, Skype, etc. Quando for necessário criar um arquivo '.list' para um programa que você está instalando, sempre crie-o dentro de /etc/apt/sources.list.d.

No arquivo /etc/apt/sources.list é onde ficam os links para os repositórios do Debian.
Utilize sempre repositórios oficiais recomendados pelo site oficial do Debian.

Comandos utilizados

update e upgrade
Em qualquer dos casos (apt-get, apt ou aptitude), a ação update somente sincroniza os arquivos de índices de pacotes (atualiza a lista de pacote disponíveis e baixa somente alguns arquivos de informações) e sempre deve ser usada antes de qualquer comando com apt-get, apt ou aptitude.
A ação upgrade é a que realmente atualiza os pacotes. Sempre devem ser executadas juntas e em sequência: primeiro update, depois upgrade.
Obs.: Antes de qualquer ação (upgrade, install, remove, etc) é recomendado executar update.

full-upgrade
Executa a função de upgrade, mas removerá pacotes atualmente instalados (caso for necessário) e atualizará o sistema como um todo observando pacotes e suas dependências.
O full-upgrade executa o dist-upgrade, no entanto, é um comando mais moderno com alguma segurança a mais e é um pouco mais do que um simples alias para dist-upgrade.
No man apt não consta mais dist-upgrade, no man apt-get tem dist-upgrade, todavia, o apt-get aceita "apt-get full-upgrade".

autoremove
Usado para remover pacotes que foram instalados automaticamente para satisfazer dependências de outros pacotes e que já não são necessários.

autoclean
Limpa o cache do repositório de arquivos para que não cresça demais. Remove apenas os pacotes que não podem mais ser baixados (por terem sumido dos espelhos Debian).

purge ~c
Os pacotes são removidos e purgados (quaisquer arquivos de configuração são também apagados). O comando purge não remove arquivos de configuração e dados armazenados nos diretórios "home" dos usuários, somente remove de todos os outros diretórios onde o pacote esteja instalado.
É um alias para "purge ?config-files".

dpkg --configure -a
Configura um pacote que foi desempacotado, mas ainda não configurado. Se for fornecido -a ou --pending em vez de 'pacote', todos os pacotes desempacotados, mas não configurados serão configurados.

ATUALIZANDO

1- Atualize e limpe o sistema atual
$ sudo apt update
$ sudo apt autoclean
$ sudo apt upgrade

2- Abra o terminal
Faça backup do arquivo:
$ sudo cp /etc/apt/sources.list /etc/apt/sources.list.bkp

Abra o arquivo:
$ sudo vim /etc/apt/sources.list <<< utilizo o vim, você use teu editor preferido.

Na atualização online sempre deixe somente os repositórios básicos, depois, caso quiser, incremente o arquivo sources.list (veja a sugestão na CONCLUSÃO).

Apague todo o conteúdo e coloque dentro:

deb http://deb.debian.org/debian/ bookworm main non-free-firmware
deb http://security.debian.org/debian-security bookworm-security main non-free-firmware
deb http://deb.debian.org/debian/ bookworm-updates main non-free-firmware

Salve e saia.

3- Execute:
$ sudo apt update
$ sudo apt autoclean
$ sudo apt full-upgrade

Aguarde, deverá terminar sem erros (pode demorar um pouco), depois reinicie o computador:
$ sudo reboot

4- Atualize o Debian 12, remova pacotes desnecessários e limpe o sistema:
$ sudo apt update
$ sudo apt upgrade
$ sudo apt autoremove
$ sudo apt purge ~c
$ sudo apt autoclean

Verifique:
$ cat /etc/os-release

PRETTY_NAME="Debian GNU/Linux 12 (bookworm)"
NAME="Debian GNU/Linux"
VERSION_ID="12"
VERSION="12 (bookworm)"
VERSION_CODENAME=bookworm
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support" BUG_REPORT_URL="https://bugs.debian.org/"

E terminamos a atualização online do Debian 11 para o 12.

Recomendações

Eu pessoalmente sempre executo no Debian, aproximadamente uma vez por semana no mínimo:
$ sudo apt update
$ sudo aptitude safe-upgrade

Antes você terá de  instalar o aptitude:
$ sudo apt update
$ sudo apt install aptitude

E o comando "sudo apt upgrade" substitua por:
$ sudo aptitude safe-upgrade

Os manuais recomendam apt-upgrade, pois dizem ele faz a mesma coisa que o "aptitude safe-upgrade" (faz uma atualização segura), mas por uma questão de tradição e por não estar convencido de que executam as mesmas ações (a documentação não é clara) eu continuo usando o aptitude para esta ação de atualização segura do sistema como um todo.

Uma sequência sugerida para manutenção regular do sistema (talvez a cada dois meses, depende do uso e caso aconteça alguma quebra de pacotes) é a seguinte (com sudo ou como root):
$ sudo apt -f install
$ sudo apt -f remove
$ sudo apt autoremove
$ sudo apt purge ~c
$ sudo apt autoclean
$ sudo dpkg --configure -a
$ sudo apt update
$ sudo aptitude safe-upgrade


CONCLUSÃO

SOURCES.LIST

Depois, caso queira incrementar o sources.list, substitua o conteúdo pelo seguinte:

#deb cdrom:[Debian GNU/Linux 12.11.0 _Bookworm_ - Official amd64 NETINST with firmware 20250517-09:51]/ bookworm contrib main non-free-firmware

deb http://deb.debian.org/debian/ bookworm main contrib non-free non-free-firmware
# deb-src http://deb.debian.org/debian/ bookworm main contrib non-free non-free-firmware

deb http://security.debian.org/debian-security bookworm-security main contrib non-free non-free-firmware
# deb-src http://security.debian.org/debian-security bookworm-security main contrib non-free non-free-firmware

# bookworm-updates, to get updates before a point release is made;
# see https://www.debian.org/doc/manuals/debian-reference/ch02.en.html

#_updates
deb http://deb.debian.org/debian/ bookworm-updates main contrib non-free non-free-firmware
# deb-src http://deb.debian.org/debian/ bookworm-updates main contrib non-free non-free-firmware

# Atualizações propostas para Debian 12
# deb https://deb.debian.org/debian/ bookworm-proposed-updates main contrib non-free-firmware non-free

# Backports, descomente se for estritamente necessário
# deb http://deb.debian.org/debian bookworm-backports main contrib non-free
# deb-src http://deb.debian.org/debian bookworm-backports main contrib non-free

# This system was installed using small removable media
# (e.g. netinst, live or single CD). The matching "deb cdrom"
# entries were disabled at the end of the installation process.
# For information about how to configure apt package sources,
# see the sources.list(5) manual.

Salve e saia.

Execute:
$ sudo apt update
$ sudo aptitude safe-upgrade

Maiores explicações sobre configuração e significado dos repositórios você encontra aqui:

Referências
man apt
man apt-get
man aptitude

segunda-feira, 28 de julho de 2025

Customizar a Instalação do Linux Debian com Preseed

INTRODUÇÃO

Veremos como customizar a imagem ISO do Debian.
Usarei para instalação via pendrive a imagem ISO do Debian baixada de:

Escolha:
debian-12.11.0-amd64-netinst.iso

Abriremos essa imagem ISO e a customizaremos com um script.

Nível: Intermediário.

Customizar implica em várias configurações diferentes a gosto do cliente e não poderei aqui abranger todos os aspectos, o que é óbvio.
Customizar uma imagem para depois instalá-la personalizada mostra a versatilidade do Linux.

Na penúltima seção do artigo tem um preseed comentado com maiores explicações.

A pré-configuração (preseed, pré-semente) permite definir respostas para perguntas feitas durante o processo de instalação sem a necessidade de inseri-las manualmente durante a instalação. Isso permite automatizar totalmente a maioria dos tipos de instalação e ainda oferece alguns recursos não disponíveis durante instalações normais.
O preseed.cfg é um arquivo de texto onde configuramos a instalação do Debian.
Quem trabalha com redes e/ou clusters, por exemplo, e cuida de vários laboratórios de informática, sabe a importância de instalações em massa personalizadas via rede interna.

Usaremos dois arquivos para essa customização em específico para instalação com pendrive: preseed.cfg e build-custom-iso.sh.
Esses arquivos, além dos outros, foram feitos a quatro mãos: eu e meu parceirão Chat "Jarvis" GPT com longos papos madrugada adentro!

Caso você queira somente instalar o Debian customizado com interface gráfica via pendrive máquina por máquina opte pela instalação: CUSTOMIZANDO A INSTALAÇÃO 1.
Caso você queira instalar o Debian customizado em rede via PXE ou iPXE veja a seção CUSTOMIZANDO A INSTALAÇÃO 6 - Método 2.
Na última seção PRESEED explicado tem informações importantes sobre preseed.

Citei o Chat GPT por uma questão de agradecimento, poderia não ter citado, poderia ter deixado implícito que fiz tudo sozinho, ninguém saberia mesmo.
Quem é adepto do software livre e gratuito sabe os perrengues que passa sem nem ter sequer um "obrigado" de retorno.

Muitas vezes você vê seu código circulando amplamente na internet sem ninguém saber de onde veio ou quem fez.
Mas tudo bem, software livre é isso mesmo!
A satisfação pessoal e dos familiares em saber que foi você quem fez é suficiente.
E por "satisfação pessoal" não estou falando de ego inflado, mas em satisfação pessoal mesmo... apesar de que satisfação pessoal não enche barriga!
Parabéns e obrigado ao pessoal do Chat GPT da OpenAI!

Este artigo é uma parte de um artigo completo que será chamado de Montagem de Cluster (atualizado).

Antes que alguém pergunte: Não!
Não tem como instalar um sistema via rede diretamente pela imagem ISO sem extrair os arquivos porque esse tipo de instalação não é suportada nativamente, ou seja, uma imagem ISO não é inicializável, ela é somente executável.

Aqui apresento uma solução estável e compatível com máquinas novas e antigas, utilizando:

Boot por iPXE dentro do menu PXE;

Preseed embutido diretamente no initrd.gz;
Ideal para instalações em larga escala como clusters e redes, podendo ser adaptada para instalações individuais.

Problemas Comuns com Preseed

Alguns dos obstáculos que encontrei ao tentar uma instalação via Preseed incluem:
-Falhas silenciosas causadas por tabulações ou espaços extras no particionamento (expert_recipe);
-A partição swap sendo ignorada se colocada fora de ordem;
-Problemas com compatibilidade em hardware mais antigo, principalmente com discos IDE ou BIOS legados;
-preseed.cfg sendo ignorado mesmo que especificado via kernel boot line.

Solução: Preseed Embutido no Initrd, com exceção do boot por PXE, porém, caso queira, no iPXE pode optar por não embutir o pressed e fazer as finalizações pelo late_command (é até recomendado)//.

Na forma como o sistema inicializa através do iPXE pode-se deixar o pressed por URL ou embutir no initrd.gz (optei embutir no initrd por questões didáticas).
No boot por PXE aconselho a deixar o preseed por URL sem embutir no initrd.

Passados os prolegômenos, vamos arregaçar as mangas, tomar uma (várias) chávena(s) de café e colocar a mão no mouse.

CUSTOMIZANDO A INSTALAÇÃO 1

ISO customizada COM Interface Gráfica para instalação via pendrive

O preseed.cfg aqui postado utiliza o Cinnamon como interface gráfica, porém, mais adiante tem informações como utilizar outra interface (Gnome, KDE, etc).
Lembrando que o arquivo preseed.cfg no caso de ser embutido no initrd.gz precisa obrigatoriamente ter o nome de preseed.cfg, nos outros casos o arquivo pode ter outro nome contanto que tenha a extensão .cfg.

Ao terminar o procedimento descrito aqui você terá uma imagem ISO pronta para instalação via pendrive.
Modificando o preseed você personaliza (customiza) a instalação, cria uma ISO de acordo com os programas que você utiliza constantemente.

Nesta parte do preseed (veja o preseed completo mais adiante):

### Pacotes ###
tasksel tasksel/first multiselect standard, cinnamon-desktop, ssh-server
d-i pkgsel/include string sudo vim curl wget net-tools mousepad aptitude libu2f-udev gnome-terminal firefox-esr

é onde você configura qual interface gráfica será instalada, basta mudar, por exemplo, para o Gnome:

### Pacotes ###
tasksel tasksel/first multiselect standard, task-gnome-desktop, ssh-server <<< nesta linha você coloca o básico padrão do Debian
d-i pkgsel/include string sudo vim curl wget net-tools mousepad aptitude libu2f-udev gnome-terminal firefox-esr <<< nesta linha você coloca os programas/pacotes adicionais.

Veja bem, essas são instalações limpas onde pacotes como Libre-office e Firefox não vem por padrão, portanto, você deve escrevê-los na linha ou instalar depois, caso queira.
Não tenho como abranger aqui todos os aspectos, você terá de se informar sobre preseed, mas verá que não é difícil, é um pouco trabalhoso, mas não é difícil.

Por exemplo, observe que o Google-Chrome não está em nenhuma das linhas, mas foi escrito no late_command (comandos pós-instalação) porque colocando o Chrome em uma das linhas "tasksel" ou "d-i pkgsel" a instalação falha com erro de "Falha na instalação de software" ou algo parecido. Essa foi uma das sugestões do parceirão Chat "Jarvis" GPT.
O preseed é xarope ao extremo nos sentidos de ordem de colocação, formatação e sintaxe.
Dependendo do pacote/programa você terá de ir na tentativa e no erro, porém, uma base forte é saber a ordem de instalação padrão do Debian, ou seja, basta observar em uma instalação com a interação do usuário o que vem primeiro: escolha do teclado, linguagem, rede, etc.
O preseed segue essa ordem e o que não estiver nessa ordem você coloca no late_command.

Para o Debian Bookworm que usa o Gnome 43, veja aqui pacotes para acrescentar na linha "d-i pkgsel":

Para o KDE veja aqui:

INICIANDO

Após baixar a ISO no link recomendado, o qual repito aqui:

escolha debian-12.11.0-amd64-netinst.iso, salve numa pasta de sua preferência e depois altere o caminho no script ou salve no mesmo diretório onde está o script build-custom-iso.sh.

Crie o arquivo:
$ sudo vim build-custom-iso.sh

Copie e cole o conteúdo:

#!/bin/bash

set -e

### Arquivo para ISO COM e SEM Interface Gráfica ###

## Modifique a seu gosto (caso souber o que está fazendo) ##

### Verificacao de Root ###
if [ "$EUID" -ne 0 ]; then
echo "Este script deve ser executado como root (use sudo)."
exit 1
fi

### Altere para o teu ambiente ###
ISO_ORIGINAL_PATH="$(pwd)/debian-12.11.0-amd64-netinst.iso"
ISO_CUSTOM="debian-12.11.0-customCOM.iso"
WORKDIR="$(pwd)/iso-build"
PRESEED="$(pwd)/preseed.cfg"

### Instalar Pacotes Necessarios ###
echo "Instalando pacotes..."
apt update
##aptitude safe-upgrade -y
apt install -y xorriso rsync syslinux syslinux-common pxelinux wget cpio unzip debconf-utils

### Verificar dependencias ###
for cmd in xorriso rsync; do
command -v $cmd >/dev/null || { echo "Erro: $cmd não está instalado."; exit 1; }
done

### Preparar diretorios ###
mkdir -p "$WORKDIR"/iso-original "$WORKDIR"/iso-custom
cd "$WORKDIR"

### Verificar ISO original ###
if [ ! -f "$ISO_ORIGINAL_PATH" ]; then
echo "ISO original não encontrada: $ISO_ORIGINAL_PATH"
exit 1
fi

### Extrair ISO original preservando estrutura e symlinks ###
xorriso -osirrox on -indev "$ISO_ORIGINAL_PATH" -extract / iso-original

### Copiar conteudo para ISO customizada ###
rsync -aHAX iso-original/ iso-custom/

### Copiar preseed.cfg para raiz da ISO ###
cp "$PRESEED" iso-custom/preseed.cfg

### Criar symlink /cdrom para o instalador localizar o preseed ###
rm -rf iso-custom/cdrom
ln -sf . iso-custom/cdrom

### Editar ISOLINUX (modo BIOS) ###
ISOLINUX_CFG="$WORKDIR/iso-custom/isolinux/txt.cfg"
GTK_CFG="$WORKDIR/iso-custom/isolinux/gtk.cfg"
MENU_CFG="$WORKDIR/iso-custom/isolinux/menu.cfg"

### Limpar entradas conflitantes ou duplicadas ###
sed -i '/^default /d' "$ISOLINUX_CFG"
sed -i '/^timeout/d' "$ISOLINUX_CFG"
sed -i '/^label auto$/,/^$/d' "$ISOLINUX_CFG"

### Remover qualquer definicao de 'default' e 'menu default' do gtk.cfg
sed -i '/^default /d' "$GTK_CFG"
sed -i '/^\s*menu default\s*$/d' "$GTK_CFG"

### Substitui menu.cfg por nova versao com entrada personalizada no topo ###
cat > "$MENU_CFG" <<EOF
default auto
prompt 1
timeout 0

menu hshift 4
menu width 70
menu title Debian GNU/Linux installer menu (BIOS mode)

label auto
menu label Auto install (kluster)
menu default
kernel /install.amd/vmlinuz
append auto=true file=/cdrom/preseed.cfg initrd=/install.amd/initrd.gz ---

include stdmenu.cfg
include gtk.cfg
include txt.cfg
EOF

### Editar GRUB (modo UEFI) ###
GRUB_CFG="$WORKDIR/iso-custom/boot/grub/grub.cfg"

### Remove qualquer definicao existente de timeout ###
sed -i '/^set timeout=/d' "$GRUB_CFG"

### Adiciona entrada de instalacao automatica no topo ###
TEMP_GRUB="$(mktemp)"

cat >> "$TEMP_GRUB" <<EOF
set timeout=-1

menuentry "Auto install (kluster)" {
set background_color=black
linux /install.amd/vmlinuz auto=true file=/cdrom/preseed.cfg ---
initrd /install.amd/initrd.gz
}
EOF

### Concatenar com o restante do grub.cfg ###
cat "$GRUB_CFG" >> "$TEMP_GRUB"
mv "$TEMP_GRUB" "$GRUB_CFG"

### Corrigir permiss&otilde;es de arquivos isolinux ###
chmod 644 iso-custom/isolinux/isolinux.bin
chmod 644 iso-custom/isolinux/boot.cat

### Gerar nova ISO com suporte a BIOS e UEFI ###
cd "$WORKDIR/iso-custom"

xorriso -as mkisofs \
-o "$WORKDIR/$ISO_CUSTOM" \
-isohybrid-mbr /usr/lib/ISOLINUX/isohdpfx.bin \
-c isolinux/boot.cat \
-b isolinux/isolinux.bin \
-no-emul-boot -boot-load-size 4 -boot-info-table \
-eltorito-alt-boot \
-e boot/grub/efi.img \
-no-emul-boot \
-isohybrid-gpt-basdat \
-r -J -l -cache-inodes .

echo "ISO personalizada criada com sucesso: $WORKDIR/$ISO_CUSTOM"

Salve e saia.

Permita a execução:
$ sudo chmod +x build-custom-iso.sh

Dentro do diretório /home/seu_usuario/pasta estarão os arquivos build-custom-iso.sh, debian-12.11.0-amd64-netinst.iso e preseed.cfg.
Depois de rodar o script build-custom-iso.sh criará uma pasta chamada iso-build e dentro dela estarão duas pastas (iso-custom e iso-original) e também a imagem ISO final debian-12.11.0-customCOM.iso pronta para instalação.

Nas pastas iso-custom e iso-original estará o conteúdo descompactado da ISO modificada e da ISO original.

$ sudo ./build-custom-iso.sh

Caso quiser pode excluir as duas pastas iso-custom e iso-original e salvar somente a imagem ISO custom num pendrive inicializável.
O menu de instalação reconhecerá se é BIOS ou UEFI e ficará assim:




ou assim (à sua escolha):



ARQUIVO PRESEED.CFG

$ sudo vim preseed.cfg

Coloque o conteúdo dentro:

#_preseed_V1
### Arquivo para ISO COM Interface Grafica ###

### Descomente as opcoes caso souber exatamente sem sombra nenhuma de duvida o que esta fazendo! ###

### Idioma / teclado ###
d-i debian-installer/locale string pt_BR.UTF-8
d-i console-setup/ask_detect boolean false
d-i keyboard-configuration/xkb-keymap select br
d-i time/zone string America/Sao_Paulo

### Rede com IP estatico - Altere ###
#d-i netcfg/disable_dhcp boolean true
##d-i netcfg/get_ipaddress string 192.168.1.X
##d-i netcfg/get_netmask string 255.255.255.0
##d-i netcfg/get_gateway string 192.168.1.X
d-i netcfg/get_nameservers string 1.1.1.1 9.9.9.9
##d-i netcfg/confirm_static boolean true
#d-i netcfg/get_hostname string no01
#d-i netcfg/get_domain string local
d-i netcfg/choose_interface select auto

### Configurar manualmente o hostname na instalacao ###
# Configurar automaticamente o dominio - DNS #
#d-i netcfg/get_hostname string cluster
#d-i netcfg/get_domain string cluster
#d-i netcfg/hostname string cluster
d-i netcfg/get_hostname seen false
d-i netcfg/get_domain string localdomain
d-i netcfg/get_domain seen true

### Espelho Debian fixo para evitar interacao - erro de release ###
d-i mirror/country string manual
d-i mirror/http/hostname string deb.debian.org
d-i mirror/http/directory string /debian
d-i mirror/http/proxy string

### Popularidade - Nao ###
popularity-contest popularity-contest/participate boolean false

### Usuario kluster com senha em grupo sudo ###
d-i passwd/user-fullname string Kluster User
d-i passwd/username string kluster
d-i passwd/user-password password cluster
d-i passwd/user-password-again password cluster
d-i passwd/user-default-groups string sudo

### Root tambem ativado ###
d-i passwd/root-password password cluster
d-i passwd/root-password-again password cluster

### Particionamento manual (usuario interage) ###
d-i partman-partitioning/confirm_write_new_label boolean true

### Pacotes ###
tasksel tasksel/first multiselect standard, cinnamon-desktop, ssh-server
d-i pkgsel/include string sudo vim curl wget net-tools mousepad aptitude libu2f-udev gnome-terminal firefox-esr

### GRUB ###
#d-i grub-installer/only_debian boolean true
#d-i grub-installer/with_other_os boolean true
d-i grub-installer/bootdev string /dev/sda

### Finalizacao ###
#d-i finish-install/reboot_in_progress note

### Personalizacoes com late_command ###
d-i preseed/late_command string \
in-target bash -c 'set -e; \
echo "deb [arch=amd64] https://dl.google.com/linux/chrome/deb/ stable main" > /etc/apt/sources.list.d/google-chrome.list; \
wget -q -O - https://dl.google.com/linux/linux_signing_key.pub | apt-key add -; \
sed -i 's/^allow-hotplug/auto/' /etc/network/interfaces; \
#echo "GRUB_CMDLINE_LINUX=\"net.ifnames=0 biosdevname=0\"" >> /etc/default/grub; \
#echo "net.ifnames=0 biosdevname=0" > /etc/kernel/cmdline || true; \
update-grub || true; \
update-initramfs -u || true; \
apt-get update || true; \
apt-get install -y sudo || true; \
apt-get install -y google-chrome-stable || true; \
mkdir -p /etc/sudoers.d; \
echo "kluster ALL=(ALL:ALL) ALL" > /etc/sudoers.d/kluster; \
chmod 0440 /etc/sudoers.d/kluster'
#echo \"auto lo\" > /etc/network/interfaces; \
#echo \"iface lo inet loopback\" >> /etc/network/interfaces; \
#echo \"\" >> /etc/network/interfaces; \
#echo \"auto eth0\" >> /etc/network/interfaces; \
#echo \"iface eth0 inet static\" >> /etc/network/interfaces; \
#echo \"address 192.168.1.4\" >> /etc/network/interfaces; \
#echo \"netmask 255.255.255.0\" >> /etc/network/interfaces; \
#echo \"gateway 192.168.1.3\" >> /etc/network/interfaces; \
#echo \"dns-nameservers 8.8.8.8 208.67.222.222\" >> /etc/network/interfaces'

Salve e saia.

O preseed acima instalará o Debian 12 com Cinnamon e já virá com o usuario "kluster" configurado com senha, sudo instalado, Google-chrome, além de outras configurações.
O Particionamento terá a intervenção do usuário, mas você pode configurar no preseed um particionamento automático, aliás, no preseed dá para configurar uma instalação totalmente automatizada sem intervenção nenhuma do usuário, como veremos adiante.
Na última seção tem o preseed comentado com várias explicações.

Nesta parte:

### Pacotes ###
tasksel tasksel/first multiselect standard, cinnamon-desktop, ssh-server
d-i pkgsel/include string sudo vim curl wget net-tools mousepad aptitude libu2f-udev gnome-terminal firefox-esr

é onde você configura qual interface gráfica será instalada, basta mudar, por exemplo, para o Gnome:

### Pacotes ###
tasksel tasksel/first multiselect standard, task-gnome-desktop, ssh-server <<< nessa linha você coloca o básico padrão do Debian
d-i pkgsel/include string sudo vim curl wget net-tools mousepad aptitude libu2f-udev gnome-terminal firefox-esr <<< nessa linha você coloca os programas/pacotes adicionais

Veja bem, essas são instalações limpas onde pacotes como Libre-office e Firefox não vem por padrão, portanto, você deve escrevê-los na linha ou  instalar depois, caso queira.
Por exemplo, observe que o Google-Chrome não está em nenhuma das linhas, mas foi escrito no late_command (comandos pós-instalação) porque colocando o Chrome em uma das linhas "tasksel" ou "d-i pkgsel" a instalação falha com erro de "Falha na instalação de software" ou algo parecido. Essa foi uma das sugestões do parceirão Chat "Jarvis" GPT.
O preseed é xarope ao extremo nesse sentido.
Dependendo do pacote/programa você terá de ir na tentativa e no erro.
Na página do Debian sobre o preseed, na teoria tudo funciona que é uma maravilha, mas na prática é diferente.
Para quem trabalha com redes, por exemplo, e cuida de vários laboratórios de informática, sabe a importância de instalações em massa personalizadas via rede.

Para o Debian Bookworm que usa o Gnome 43, veja aqui pacotes para acrescentar na linha "d-i pkgsel":

Para o KDE veja aqui:


CUSTOMIZANDO A INSTALAÇÃO 2

ISO customizada SEM Interface Gráfica para instalação via pendrive

O Arquivo build-custom-iso.sh é o mesmo da instalação com interface gráfica da seção anterior.

Somente tenha o cuidado de mudar o nome da ISO para melhor organização depois:
ISO_CUSTOM="debian-12.11.0-customSEM.iso"

O preseed.cfg é o seguinte:

#_preseed_V1
### Arquivo para ISO SEM Interface Grafica ###

### Descomente as opcoes caso souber exatamente sem sombra nenhuma de duvida o que esta fazendo! ###

### Idioma / teclado ###
d-i debian-installer/locale string pt_BR.UTF-8
d-i console-setup/ask_detect boolean false
d-i keyboard-configuration/xkb-keymap select br
d-i time/zone string America/Sao_Paulo

### Rede com IP estatico - Altere ###
#d-i netcfg/disable_dhcp boolean true
##d-i netcfg/get_ipaddress string 192.168.1.X
##d-i netcfg/get_netmask string 255.255.255.0
##d-i netcfg/get_gateway string 192.168.1.X
d-i netcfg/get_nameservers string 1.1.1.1 9.9.9.9
##d-i netcfg/confirm_static boolean true
#d-i netcfg/get_hostname string no01
#d-i netcfg/get_domain string local
d-i netcfg/choose_interface select auto

### Configurar manualmente o hostname na instalacao ###
# Configurar automaticamente o dom&iacute;nio - DNS #
#d-i netcfg/get_hostname string cluster
#d-i netcfg/get_domain string cluster
#d-i netcfg/hostname string cluster
d-i netcfg/get_hostname seen false
d-i netcfg/get_domain string localdomain
d-i netcfg/get_domain seen true

### Espelho Debian fixo para evitar interacao - erro de release ###
d-i mirror/country string manual
d-i mirror/http/hostname string deb.debian.org
d-i mirror/http/directory string /debian
d-i mirror/http/proxy string

### Popularidade - Nao ###
popularity-contest popularity-contest/participate boolean false

### Usuario kluster com senha em grupo sudo ###
d-i passwd/user-fullname string Kluster User
d-i passwd/username string kluster
d-i passwd/user-password password cluster
d-i passwd/user-password-again password cluster
d-i passwd/user-default-groups string sudo

### Root tambem ativado ###
d-i passwd/root-password password cluster
d-i passwd/root-password-again password cluster

### Particionamento manual (usuario interage) ###
d-i partman-partitioning/confirm_write_new_label boolean true

### Pacotes ###
tasksel tasksel/first multiselect standard, ssh-server
d-i pkgsel/include string sudo vim curl wget net-tools aptitude libu2f-udev

### GRUB ###
#d-i grub-installer/only_debian boolean true
#d-i grub-installer/with_other_os boolean true
d-i grub-installer/bootdev string /dev/sda

### Finalizacao ###
#d-i finish-install/reboot_in_progress note

### Personalizacoes com late_command ###
d-i preseed/late_command string \
in-target bash -c 'set -e; \
sed -i 's/^allow-hotplug/auto/' /etc/network/interfaces; \
#echo "GRUB_CMDLINE_LINUX=\"net.ifnames=0 biosdevname=0\"" >> /etc/default/grub; \
#echo "net.ifnames=0 biosdevname=0" > /etc/kernel/cmdline || true; \
update-grub || true; \
update-initramfs -u || true; \
apt-get update || true; \
apt-get install -y sudo || true; \
mkdir -p /etc/sudoers.d; \
echo "kluster ALL=(ALL:ALL) ALL" > /etc/sudoers.d/kluster; \
chmod 0440 /etc/sudoers.d/kluster'
#echo \"auto lo\" > /etc/network/interfaces; \
#echo \"iface lo inet loopback\" >> /etc/network/interfaces; \
#echo \"\" >> /etc/network/interfaces; \
#echo \"auto eth0\" >> /etc/network/interfaces; \
#echo \"iface eth0 inet static\" >> /etc/network/interfaces; \
#echo \"address 192.168.1.4\" >> /etc/network/interfaces; \
#echo \"netmask 255.255.255.0\" >> /etc/network/interfaces; \
#echo \"gateway 192.168.1.3\" >> /etc/network/interfaces; \
#echo \"dns-nameservers 8.8.8.8 208.67.222.222\" >> /etc/network/interfaces'

Salve e saia.

Tenha o cuidado de colocar os três arquivos (build-custom-iso.sh, preseed.cfg e debian-12.11.0-amd64-netinst.iso) no mesmo diretório antes de executar o script build-custom-iso.sh.
Ao final tem os links para aprofundar-se melhor em preseed, apesar de que a documentação nesse sentido é escassa.


CUSTOMIZANDO A INSTALAÇÃO 3

Instalação via PXE ou iPXE (Método 1)

Este método coloquei por questões didáticas e para melhor entendimento do processo, mas aconselho a optar pelo Método 2 na seção CUSTOMIZANDO A INSTALAÇÃO 6 pois é mais rápido, fácil e simples, porém, as devidas explicações estão nas seções 3 a 5.

Toda essa instalação deve ser feita no servidor (sendo ou não um cluster) e, tendo sucesso, será feita uma única vez e depois basta manter fazendo as devidas atualizações e/ou alterações que forem necessárias.

Instalação PXE e iPXE são pela rede, ou seja, nas opções de boot do BIOS da placa-mãe dos clientes você inicializa pela placa de rede.

PXE (Preboot eXecution Environment) é um ambiente de pré-inicialização que permite a inicialização de um computador através da rede, sem a necessidade de um dispositivo de armazenamento local (como um disco rígido).

iPXE é uma implementação de código aberto do PXE (Preboot eXecution Environment), uma tecnologia que permite inicializar computadores a partir da rede. Em resumo, é um bootloader que estende o PXE com mais recursos e flexibilidade permitindo a inicialização de máquinas sem dependência de discos rígidos ou mídia física.

Lembrando que inicializar por PXE (placa de rede) vai de acordo com o menu de boot de cada placa-mãe.
Você pode configurar o BIOS da placa-mãe para inicializar pelo PXE diretamente como primeira opção de boot ou pode teclar F_algum_numero para as opções de boot a cada inicialização, veja dois exemplos diferentes:




Na próxima seção tem os scripts para instalação automatizada e estudo de todo o conteúdo desta seção.
Nesta seção/página não darei explicações básicas sobre comandos, pois principia-se que tenha de ter um certo conhecimento sobre essa base no Linux.

Sinto muito caso um iniciante tentar fazer e não conseguir por não ter essas explicações básicas, mas o artigo tornar-se-ia muito extenso.
Essas partes básicas quem tiver interesse terá de pesquisar por conta.

Automatizar instalações do Debian via rede (iPXE) pode poupar horas de trabalho, especialmente em ambientes com dezenas ou centenas de máquinas.
Apesar de o Preseed ser um recurso poderoso do instalador Debian ele sofre com problemas de compatibilidade e formatação, especialmente ao lidar com particionamentos manuais e hardware legado.

Aqui apresento uma solução estável e compatível com máquinas novas e antigas, utilizando:
Boot por iPXE dentro do menu PXE;
Imagem netboot ISO do Debian (http://ftp.debian.org/debian/dists/stable/main/installer-amd64/current/images/netboot/), escolha netboot.tar.gz;
Preseed embutido diretamente no initrd.gz;
Ideal para instalações em larga escala como clusters e redes, podendo ser adaptada para instalações individuais.

Problemas Comuns com Preseed

Alguns dos obstáculos que encontrei ao tentar uma instalação sem intervenção via Preseed incluem:
-Falhas silenciosas causadas por tabulações ou espaços extras no particionamento (expert_recipe);
-A partição swap sendo ignorada se colocada fora de ordem;
-Problemas com compatibilidade em hardware mais antigo, principalmente com discos IDE ou BIOS legados;
-preseed.cfg sendo ignorado mesmo que especificado via kernel boot line.

A inicialização por iPXE é diferente de por PXE, então por iPXE você pode tanto embutir no initrd quanto deixar por URL. A vantagem de não embutir está na facilidade de alterar os arquivos sem que tenha de fazer todo o processo de embutimento cada vez, por exemplo, no caso de um cluster.

Estrutura do preseed.cfg

O preseed.cfg utilizado cobre, basicamente:

Localização, teclado, fuso horário;
Configuração de rede e hostname fixo;
Usuário root e padrão com senha;
Particionamento totalmente automatizado com expert_recipe detalhado;
Instalação de pacotes;
Comandos pós-instalação.

A parte completa do particionamento está abaixo, ao final tem o preseed.cfg completo e também o arquivo embed-preseed.sh que embute automaticamente o preseed no initrd.gz para instalação via iPXE:

### Instala e pre-carrega os modulos necessarios ###
d-i anna-install string btrfs-modules xfs-modules
d-i preseed/early_command string \
modprobe btrfs || true; \
modprobe xfs || true

### Configura o particionamento automatico ###
d-i partman-auto/method string regular
d-i partman-auto/choose_recipe select boot-root
d-i partman-auto/expert_recipe string \
boot-root :: \
40 50 512 ext4 \
$primary{ } $bootable{ } \
method{ format } format{ } \
use_filesystem{ } filesystem{ ext4 } \
mountpoint{ /boot } . \
4096 4096 4096 linux-swap \
$primary{ } \
method{ swap } format{ } . \
51200 51200 51200 btrfs \
$primary{ } \
method{ format } format{ } \
use_filesystem{ } filesystem{ btrfs } \
mountpoint{ / } . \
512 512 -1 xfs \
$primary{ } \
method{ format } format{ } \
use_filesystem{ } filesystem{ xfs } \
mountpoint{ /orangefs } .

### Confirma as acoes do particionador ###
d-i partman-partitioning/confirm_write_new_label boolean true
d-i partman/choose_partition select finish
d-i partman/confirm boolean true
d-i partman/confirm_nooverwrite boolean true

O ponto crítico do particionamento por preseed é que o expert_recipe é extremamente sensível à formatação.

Algumas observações práticas IMPORTANTES:

Não use tabulações, apenas espaços simples;
Jamais deixe espaços em branco no final das linhas do recipe;
A ordem das partições importa — por exemplo, a swap deve vir após /boot e antes de / (raiz);
No esquema de particionamento não pode ter comentários entre as linhas da string expert_recipe, aliás, não pode ter nada além do esquema de particionamento;
Um erro mínimo de formatação e/ou sintaxe pode resultar em falha silenciosa do instalador.

SCRIPT EMBED-PRESEED.SH

Esse script extrai, modifica e reempacota o initrd.gz embutindo o preseed.cfg de forma confiável.

Instale os pacotes necessários:
$ sudo apt update
$ sudo apt install -y wget cpio unzip
$ sudo vim embed-preseed.sh

#!/bin/bash

set -e

BOOT_DIR="/var/www/html/boot/debian-installer/amd64"
WORK_DIR="/tmp/initrd-work"
PRESEED_SOURCE="/var/www/html/boot/preseed.cfg"
OUTPUT_INITRD="$BOOT_DIR/initrd-custom.gz"

# === CHECAGENS INICIAIS ===
INITRD_ORIGINAL="$BOOT_DIR/initrd.gz"
if [ ! -f "$INITRD_ORIGINAL" ]; then
echo "Arquivo initrd.gz não encontrado em: $INITRD_ORIGINAL"
exit 1
fi
if [ ! -f "$PRESEED_SOURCE" ]; then
echo "Arquivo preseed.cfg não encontrado em: $PRESEED_SOURCE"
exit 1
fi

echo "Preparando o diretório de trabalho..."
rm -rf "$WORK_DIR"
mkdir -p "$WORK_DIR"
cd "$WORK_DIR"

echo "Fazendo backup do initrd original..."
cp "$INITRD_ORIGINAL" "${INITRD_ORIGINAL}.bak"

echo "Extraindo initrd.gz..."
gzip -dc "$INITRD_ORIGINAL" | cpio -id --quiet

echo "Copiando preseed.cfg para raiz do initrd..."
cp "$PRESEED_SOURCE" ./preseed.cfg

echo "Reempacotando initrd com preseed embutido..."
##find . | cpio --quiet -o -H newc | gzip -9 > "$OUTPUT_INITRD"
find . | cpio --quiet -o -H newc --owner=0:0 | gzip -9 > "$OUTPUT_INITRD"

echo "Novo initrd com preseed embutido foi criado com sucesso!"
echo "Local: $OUTPUT_INITRD"
echo
echo "Use esta linha no seu script iPXE:"
echo "initrd http:///boot/debian-installer/amd64/initrd-custom.gz"

Como usar:
$ sudo chmod +x embed-preseed.sh
$ sudo ./embed-preseed.sh

Exemplo de Boot via iPXE com label iPXE embutido dentro de menu PXE

LABEL debian-ipxe
MENU LABEL Instale o Debian via iPXE (netboot e preseed)
KERNEL ipxe.lkrn
APPEND dhcp && chain http://192.168.1.3/boot/debian.ipxe

Conteúdo do arquivo debian.ipxe:

#!ipxe
echo "Configuracao feita..."
echo
kernel http://192.168.1.3/boot/debian-installer/amd64/linux auto=true priority=critical
initrd http://192.168.1.3/boot/debian-installer/amd64/initrd-custom.gz
boot

Esse método provou-se confiável em servidores novos com UEFI e máquinas antigas com BIOS tradicional.

Testado com sucesso inclusive em hardware antigo com DDR2 e BIOS legado.
Evita depender de parâmetros instáveis em linha de kernel.
Pode ser adaptado para qualquer distribuição baseada no debian-installer.
O esquema total utilizado foi com label iPXE dentro de menu PXE com apache2, tftpd-hpa e isc-dhcp-server, mas pode ser utilizado com somente iPXE.

IPXE.LKRN

O iPXE é o principal firmware de inicialização de rede de código aberto. Ele oferece uma implementação PXE completa, aprimorada com recursos adicionais, como:

Inicializar a partir de servidor web via HTTP
Inicializar a partir de SAN iSCSI
Inicialização de SAN Fibre Channel via FCoE
Inicialização de SAN AoE
Inicializar a partir de uma rede sem fio
Inicializar a partir de uma rede de longa distância
Inicialização de uma rede Infiniband
Controlar o processo de inicialização com um script

Você pode usar o iPXE para substituir a ROM PXE existente na sua placa de rede ou pode fazer o chainload no iPXE para obter os recursos do iPXE sem ter de atualizar a ROM.
Basicamente, o ipxe.lkrn é um firmware de inicialização de rede de código aberto. Ele permite que computadores inicializem pela rede, mesmo quando o PXE (Preboot Execution Environment) integrado não é suportado ou quando se deseja funcionalidades adicionais além do PXE padrão. O ipxe.lkrn pode ser inicializado como um kernel Linux e pode ser usado para carregar outros programas e arquivos de inicialização da rede.

Exemplo de arquivo /var/lib/tftpboot/pxelinux.cfg/default (menu PXE):

DEFAULT debian
UI menu.c32
PROMPT 1
TIMEOUT 100
MENU TITLE PXE Boot Menu

LABEL debian-pxe
MENU LABEL Instale o Debian (PXE)
KERNEL vmlinuz
APPEND initrd=initrd.gz auto=true priority=critical preseed/url=http://192.168.1.3/debianiso/preseed.cfg ---

LABEL memtest
MENU LABEL Teste de RAM (Memtest86+ 7.20)
KERNEL memtest86+

LABEL clonezilla
MENU LABEL Clonezilla Live (Backup/Restore)
KERNEL clonezilla/vmlinuz
APPEND initrd=clonezilla/initrd.img boot=live union=overlay username=user config components noswap edd=on nomodeset ocs_live_run="ocs-live-general" ocs_live_keymap="none" ocs_live_batch="no" vga=788 fetch=tftp://192.168.1.3/clonezilla/filesystem.squashfs

LABEL debian-ipxe
MENU LABEL Instale o Debian via iPXE (netboot e preseed)
KERNEL ipxe.lkrn
APPEND dhcp && chain http://192.168.1.3/boot/debian.ipxe


preseed.cfg completo

#_preseed_V1
###Preseed para boot PXE sem Interface Grafica###

Este é o preseed ##
### Locale e linguagem ###
d-i debian-installer/locale string pt_BR.UTF-8
d-i console-setup/ask_detect boolean false

Configuracoes de teclado
d-i console-keymaps-at/keymap select br-abnt2 d-i keyboard-configuration/xkb-keymap select br
d-i keyboard-configuration/layout select br
d-i keyboard-configuration/model select abnt2
d-i keyboard-configuration/variant select abnt2
d-i keyboard-configuration/options string lv3:alt_switch,compose:rctrl
d-i keyboard-configuration/store_defaults_in_debconf_db boolean true
d-i time/zone string America/Sao_Paulo

### Hostname e rede ###
d-i netcfg/use_autoconfig boolean true
d-i netcfg/disable_dhcp_hostname boolean true
d-i netcfg/get_nameservers string 1.1.1.1 9.9.9.9
d-i netcfg/get_hostname string no01
d-i netcfg/get_hostname seen true
d-i netcfg/get_domain string localdomain
d-i netcfg/get_domain seen true
d-i netcfg/choose_interface select auto

### Repositorio Debian ###
d-i mirror/country string manual
d-i mirror/http/hostname string deb.debian.org
d-i mirror/http/directory string /debian
d-i mirror/http/proxy string

### Usuario ###
d-i passwd/root-password password cluster
d-i passwd/root-password-again password cluster
d-i passwd/user-fullname string Kluster User
d-i passwd/username string kluster
d-i passwd/user-password password cluster
d-i passwd/user-password-again password cluster
d-i passwd/user-default-groups string sudo

### Popularidade ###
popularity-contest popularity-contest/participate boolean false

### Pre-carrega os modulos necessarios
d-i anna-install string btrfs-modules xfs-modules
d-i preseed/early_command string \
modprobe btrfs || true; \
modprobe xfs || true

### Configura o particionamento automatico
d-i partman-auto/method string regular
d-i partman-auto/choose_recipe select boot-root
d-i partman-auto/expert_recipe string \
boot-root :: \
40 50 512 ext4 \
$primary{ } $bootable{ } \
method{ format } format{ } \
use_filesystem{ } filesystem{ ext4 } \
mountpoint{ /boot } . \
4096 4096 4096 linux-swap \
$primary{ } \
method{ swap } format{ } . \
51200 51200 51200 btrfs \
$primary{ } \
method{ format } format{ } \
use_filesystem{ } filesystem{ btrfs } \
mountpoint{ / } . \
512 512 -1 xfs \
$primary{ } \
method{ format } format{ } \
use_filesystem{ } filesystem{ xfs } \
mountpoint{ /orangefs } .

### Confirma as acoes do particionador
d-i partman-partitioning/confirm_write_new_label boolean true
d-i partman/choose_partition select finish
d-i partman/confirm boolean true
d-i partman/confirm_nooverwrite boolean true

### Pacotes ###
tasksel tasksel/first multiselect standard, ssh-server
d-i pkgsel/include string sudo vim curl wget net-tools aptitude libu2f-udev console-setup keyboard-configuration console-data

### GRUB ###
d-i grub-installer/bootdev string default

### Finalizacao ###
d-i finish-install/reboot_in_progress note

### Comandos pos-instalacao ###
d-i preseed/late_command string \
mkdir -p /target/root/.ssh; \
echo "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIM2+c+950T5ryZyco86ezUh8f1w9jz34ObqbowLK3DlC kluster@cservidor" > /target/root/.ssh/authorized_keys; \
chmod 700 /target/root/.ssh; \
chmod 600 /target/root/.ssh/authorized_keys; \
in-target bash -c 'echo "XKBMODEL=\"abnt2\"" > /etc/default/keyboard; \
echo "XKBLAYOUT=\"br\"" >> /etc/default/keyboard; \
echo "XKBVARIANT=\"abnt2\"" >> /etc/default/keyboard; \
echo "XKBOPTIONS=\"lv3:alt_switch,compose:rctrl\"" >> /etc/default/keyboard; \
echo "BACKSPACE=\"guess\"" >> /etc/default/keyboard'; \
in-target dpkg-reconfigure -f noninteractive keyboard-configuration; \
in-target setupcon --force; \
in-target update-initramfs -u; \
in-target bash -c 'set -e; \
apt-get clean || true; \
apt-get update || true; \
sed -i "s/^allow-hotplug/auto/" /etc/network/interfaces; \
update-grub || true; update-initramfs -u || true; \
mkdir -p /etc/sudoers.d; \
echo "kluster ALL=(ALL:ALL) ALL" > /etc/sudoers.d/kluster; \
chmod 0440 /etc/sudoers.d/kluster'

Para hostname dinâmico configure o arquivo /etc/dhcp/dhcpd.conf para detectar o MAC e mapear via DHCP fixo (ideal em redes e clusters).

Exemplo de configuração do isc-dhcp-server no seu PXE server com hostnames fixos baseados no MAC:

host no01 {
hardware ethernet 00:11:22:33:44:55;
fixed-address 111.222.33.4;
option host-name "no01";
}

O Debian usará o hostname passado pelo DHCP se netcfg/get_hostname não estiver definido no preseed.

Deixe comentadas estas linhas do preseed.cfg:

#d-i netcfg/get_hostname string no01
#d-i netcfg/get_hostname seen true

Caso queria definir um hostname no preseed descomente as duas linhas e não configure o /etc/dhcp/dhcpd.conf para fixar o IP e o hotsname pelo MAC, porém, caso você tenha 7 máquinas, ou mais, por exemplo, para instalar, terá de alterar o preseed e reembutir 7 vezes (ou mais) no initrd.


CUSTOMIZANDO A INSTALAÇÃO 4

Sequência de scripts

Toda a instalação explicada na seção anterior pode ser feita automatizada com a sequência de scripts a seguir.
Ao final da seção CUSTOMIZANDO A INSTALAÇÃO 5 tem um resumo dos arquivos que você deve revisar depois.
Toda essa instalação deve ser feita no servidor e, tendo sucesso, será feita uma única vez e depois basta manter fazendo as devidas atualizações e/ou alterações que forem necessárias.

1 - INSTALA-PXE.SH

Execute primeiro esse script que ele realizará a instalação e configuração dos pacotes necessários, inclusive isc-dhcp-server, apache2 e tftp-hpa.
Aconselho sempre que, mesmo as configurações sendo feitas por script, revise depois os arquivos como, por exemplo, /etc/dhcp/dhcpd.conf.

Lembrando que essas instalações são feitas somente no servidor.
Nos clientes você somente inicializa (boota) pela rede (PXE - placa de rede).

Esse script já deixa o ambiente pronto com o menu permitindo escolher instalação Debian PXE, realizar um Memetest86+, iniciar o Clonezilla ou instalar por iPXE.

Caso utilizar IP fixo por MAC no DHCP comente as 2 linhas do range do script e mais abaixo na subnet do DHCP comente a linha range $DHCP_RANGE_START $DHCP_RANGE_END.
Aconselho a executar o script como ele está e executar as instalações dos computadores e depois alterar manualmente o /etc/dhcp/dhcp.conf para IP fixo por MAC, mas isso vai da sua preferência de acordo com o teu ambiente.



$ sudo vim instala-pxe.sh

#!/bin/bash
set -e
if [ "$EUID" -ne 0 ]; then
echo "Este script deve ser executado como root (use sudo)."
exit 1
fi
### === CONFIGURAÇÕES ===
### Altere para o teu ambiente ###
### A interface a ser setada é a que vai para o switch da rede/cluster ###
### Caso utilizar IP fixo por MAC no DHCP comente as 2 linhas do range ###
##PRESEED_PATH="/home/aristotles/0-Montagem_de_Cluster/PXE/preseed.cfg"
PRESEED_PATH="/home/kluster/0-Montagem_de_Cluster/PXE/preseed.cfg"
INTERFACE="ens1"
SERVER_IP="192.168.1.3"
DHCP_SUBNET="192.168.1.0"
DHCP_NETMASK="255.255.255.0"
DHCP_RANGE_START="192.168.1.4"
DHCP_RANGE_END="192.168.1.12"
DHCP_ROUTER="192.168.1.3"
echo "Instalando pacotes..."
apt update
#aptitude safe-upgrade -y
apt install -y isc-dhcp-server tftpd-hpa apache2 syslinux syslinux-common pxelinux wget cpio unzip debconf-utils
### === CONFIGURAR PXE COM NETBOOT E TFTP ===
echo "Configurando PXE com netboot e TFTP..."
mkdir -p /var/lib/tftpboot
mkdir -p /var/lib/tftpboot/{pxelinux.cfg,EFI/boot,grub,clonezilla}
# Baixar os arquivos netboot do Debian (amd64)
NETBOOT_BASE_URL="http://deb.debian.org/debian/dists/bookworm/main/installer-amd64/current/images/netboot/debian-installer/amd64"
wget -q --show-progress "$NETBOOT_BASE_URL/linux" -O /var/lib/tftpboot/vmlinuz
wget -q --show-progress "$NETBOOT_BASE_URL/initrd.gz" -O /var/lib/tftpboot/initrd.gz
# Personalizar initrd.gz para incluir DNS dentro do initrd
echo "Personalizando initrd.gz para incluir DNS..."
cd /var/lib/tftpboot
mkdir -p initrd-temp
cd initrd-temp
gzip -dc ../initrd.gz | cpio -id --no-absolute-filenames
cat < etc/resolv.conf
nameserver 1.1.1.1
nameserver 9.9.9.9
EOF
# Recriar o initrd.gz customizado
find . | cpio -o -H newc | gzip -c > ../initrd-custom.gz
cd ..
rm -rf initrd-temp
mv initrd-custom.gz initrd.gz
echo "initrd.gz customizado com DNS inserido."
# Copiar arquivos PXELINUX essenciais
cp /usr/lib/PXELINUX/pxelinux.0 /var/lib/tftpboot/
cp /usr/lib/syslinux/modules/bios/libutil.c32 /var/lib/tftpboot/
cp /usr/lib/syslinux/modules/bios/libcom32.c32 /var/lib/tftpboot/
cp /usr/lib/syslinux/modules/bios/menu.c32 /var/lib/tftpboot/
cp /usr/lib/syslinux/modules/bios/ldlinux.c32 /var/lib/tftpboot/
### === BAIXAR E CONFIGURAR MEMTEST86+ 7.20 ===
TMPDIR="/var/lib/tftpboot/tmp"
rm -rf "$TMPDIR"
mkdir -p "$TMPDIR"
echo "Baixando Memtest86+ 7.20..."
wget -q --show-progress https://www.memtest.org/download/v7.20/mt86plus_7.20.binaries.zip -O "$TMPDIR/memtest.zip" || { echo "Falha no download do Memtest86+"; exit 1; }
unzip -o "$TMPDIR/memtest.zip" -d "$TMPDIR"
if [[ -f "$TMPDIR/memtest64.bin" ]]; then
cp "$TMPDIR/memtest64.bin" /var/lib/tftpboot/memtest86+
echo "Memtest86+ copiado como 'memtest86+' (usando memtest64.bin)"
else
echo "Arquivo memtest64.bin não encontrado após extração."
exit 1
fi
rm -rf "$TMPDIR"
### === BAIXAR E INSTALAR CLONEZILLA ===
CLONEZILLA_ZIP="/var/lib/tftpboot/clonezilla.zip"
CLONEZILLA_DIR="/var/lib/tftpboot/clonezilla"
TMP_CLONEZILLA_DIR="/var/lib/tftpboot/tmp/clonezilla-files"
echo "Verificando Clonezilla..."
if [[ -f "$CLONEZILLA_DIR/vmlinuz" && -f "$CLONEZILLA_DIR/initrd.img" && -f "$CLONEZILLA_DIR/filesystem.squashfs" ]]; then
echo "Clonezilla já está configurado em $CLONEZILLA_DIR. Pulando extração e cópia."
else
# Verifica se o zip existe e/ou se está corrompído antes de baixar
if [ -f "$CLONEZILLA_ZIP" ]; then
if unzip -tq "$CLONEZILLA_ZIP" >/dev/null 2>&1; then
echo "Arquivo $CLONEZILLA_ZIP existe e é válido. Pulando download."
else
echo "Arquivo $CLONEZILLA_ZIP está corrompido. Baixando novamente..."
rm -f "$CLONEZILLA_ZIP"
# Baixa o arquivo
wget -q --show-progress https://downloads.sourceforge.net/project/clonezilla/clonezilla_live_stable/3.2.2-5/clonezilla-live-3.2.2-5-amd64.zip -O "$CLONEZILLA_ZIP" || { echo "Falha no download do Clonezilla"; exit 1; }
fi
else
echo "Baixando Clonezilla..."
wget -q --show-progress https://downloads.sourceforge.net/project/clonezilla/clonezilla_live_stable/3.2.2-5/clonezilla-live-3.2.2-5-amd64.zip -O "$CLONEZILLA_ZIP" || { echo "Falha no download do Clonezilla"; exit 1; }
fi
mkdir -p "$TMP_CLONEZILLA_DIR"
unzip -o "$CLONEZILLA_ZIP" -d "$TMP_CLONEZILLA_DIR"
EXTRACTED_DIR=$(find "$TMP_CLONEZILLA_DIR" -type d -name live -exec dirname {} \; | head -n1)
if [ -z "$EXTRACTED_DIR" ]; then
echo "Diretório com subdiretório 'live' não encontrado após extração."
exit 1
fi
echo "Diretório detectado: $EXTRACTED_DIR"
if [[ -f "$EXTRACTED_DIR/live/vmlinuz" && -f "$EXTRACTED_DIR/live/initrd.img" && -f "$EXTRACTED_DIR/live/filesystem.squashfs" ]]; then
mkdir -p "$CLONEZILLA_DIR"
cp "$EXTRACTED_DIR/live/"{vmlinuz,initrd.img,filesystem.squashfs} "$CLONEZILLA_DIR/"
echo "Clonezilla copiado para $CLONEZILLA_DIR"
else
echo "Arquivos do Clonezilla não encontrados após extração."
exit 1
fi
rm -rf "$TMP_CLONEZILLA_DIR"
fi
# Criar Menu PXE BIOS
echo "Configurando o menu PXE..."
cat < /var/lib/tftpboot/pxelinux.cfg/default
DEFAULT debian
UI menu.c32
PROMPT 1
TIMEOUT 100
MENU TITLE PXE Boot Menu
LABEL debian
MENU LABEL Instale o Debian (PXE)
KERNEL vmlinuz
APPEND initrd=initrd.gz auto=true priority=critical preseed/url=http://$SERVER_IP/debianiso/preseed.cfg ---
LABEL memtest
MENU LABEL Teste de RAM (Memtest86+ 7.20)
KERNEL memtest86+
LABEL clonezilla
MENU LABEL Clonezilla Live (Backup/Restore)
KERNEL clonezilla/vmlinuz
APPEND initrd=clonezilla/initrd.img boot=live union=overlay username=user config components noswap edd=on nomodeset ocs_live_run="ocs-live-general" ocs_live_keymap="none" ocs_live_batch="no" vga=788 fetch=tftp://$SERVER_IP/clonezilla/filesystem.squashfs
LABEL debian-ipxe
MENU LABEL Instalar Debian via iPXE + ISO
KERNEL ipxe.lkrn
APPEND dhcp && chain http://$SERVER_IP/boot/debian.ipxe
EOF
### === CONFIGURAR UEFI PXE COM GRUB ===
echo "Configurando suporte a UEFI PXE com GRUB..."
apt install -y grub-efi-amd64-bin
#mkdir -p /var/lib/tftpboot/EFI/boot
cp /usr/lib/grub/x86_64-efi-signed/grubnetx64.efi.signed /var/lib/tftpboot/EFI/boot/bootx64.efi 2>/dev/null || \
cp /usr/lib/grub/x86_64-efi/grubnetx64.efi /var/lib/tftpboot/EFI/boot/bootx64.efi
#mkdir -p /var/lib/tftpboot/grub
cat < /var/lib/tftpboot/grub/grub.cfg set default=0
set timeout=10
menuentry "Instalação Automática Debian (PXE)" {
linux /vmlinuz auto=true priority=critical preseed/url=http://$SERVER_IP/debianiso/preseed.cfg ---
initrd /initrd.gz
}
menuentry "Teste de Memória RAM (Memtest86+ UEFI)" {
chainloader /memtest86+.efi
}
EOF
### === CONFIGURAR APACHE ===
echo "Configurando Apache para servir preseed.cfg..."
# Detecta o DocumentRoot do Apache
DOCROOT=$(grep -i "DocumentRoot" /etc/apache2/sites-enabled/000-default.conf | grep -v '#' | awk '{print $2}')
if [ -z "$DOCROOT" ]; then
echo "DocumentRoot não detectado. Usando /var/www/html como padrão."
DOCROOT="/var/www/html"
fi
mkdir -p "$DOCROOT/debianiso"
cp "$PRESEED_PATH" "$DOCROOT/debianiso/"
chmod 644 "$DOCROOT/debianiso/preseed.cfg"
chown www-data:www-data "$DOCROOT/debianiso/preseed.cfg"
# Reinicia o Apache
systemctl restart apache2
### === CONFIGURAR TFTP ===
echo "Configurando tftpd-hpa..." /etc/default/tftpd-hpa


cat < /dev/null
TFTP_USERNAME="tftp"TFTP_DIRECTORY="/var/lib/tftpboot"
TFTP_ADDRESS="0.0.0.0:69"
TFTP_OPTIONS="--secure --blocksize 512"
EOF
### === CONFIGURAR DHCP ===
echo "Configurando DHCP Server..."
echo "INTERFACESv4=$INTERFACE" > /etc/default/isc-dhcp-server
cp -n /etc/dhcp/dhcpd.conf /etc/dhcp/dhcpd.conf.bak
sed -i -E 's/^(option domain-name.*|option domain-name-servers.*)/# &/' /etc/dhcp/dhcpd.conf
if ! grep -qF "option arch code 93 = unsigned integer 16;" /etc/dhcp/dhcpd.conf; then
echo "option arch code 93 = unsigned integer 16;" >> /etc/dhcp/dhcpd.conf
fi
MARKER="# BEGIN SUBNET $DHCP_SUBNET"
if ! grep -qF "$MARKER" /etc/dhcp/dhcpd.conf; then
cat <> /etc/dhcp/dhcpd.conf
$MARKER # Definir opção de arquitetura PXE (REQUIRED for conditional checks) option arch code 93 = unsigned integer 16; subnet $DHCP_SUBNET netmask $DHCP_NETMASK {
range $DHCP_RANGE_START $DHCP_RANGE_END;
option routers $DHCP_ROUTER;
option domain-name-servers 1.1.1.1, 9.9.9.9;
if option arch = 00:07 {
filename "EFI/boot/bootx64.efi"; # UEFI 64-bit
} else {
filename "/pxelinux.0"; # BIOS
}
next-server $DHCP_ROUTER;
}
# END SUBNET $DHCP_SUBNET
EOF echo "Subnet adicionada no dhcpd.conf."
else
echo "Subnet já configurada, pulando adição."
fi
ifup "$INTERFACE"
systemctl restart isc-dhcp-server
systemctl restart tftpd-hpa
systemctl restart apache2
echo "Servidor PXE configurado com sucesso!"
echo "Menu PXE: Debian PXE | Memtest86+ | Clonezilla | Debian iPXE"
echo "Configure os clientes para bootar via PXE pela rede."

Salve e saia.

$ sudo chmod +x instala-pxe.sh
$ sudo ./instala-pxe.sh

Estrutura de Diretórios do PXE


Estrutura do Apache (/var/www/html/boot)


Ao selecionar no menu o Debian PXE o instalador procura o vmlinuz e o initrd.gz em /var/lib/tftpboot/ e o preseed.cfg em /var/www/html/debianiso/. O script deixa essa estrutura pronta, tenha somente o cuidado de ter certeza de que o preseed.cfg que você quer é o mesmo que está no caminho no início do script, pois é este que será copiado para a pasta debiansio.
Alterando o link na variável NETBOOT_BASE_URL você define a imagem que será baixada, descompactada e configurada.

Alterando o caminho na variável PRESEED_PATH você define o preseed que será utilizado ou você pode copiar manualmente para /var/www/html/debianiso/ cada preseed a cada instalação via PXE.


CUSTOMIZANDO A INSTALAÇÃO 5

2 - PRESEED.CFG

Crie o diretório boot na pasta padrão do Apache2 e coloque dentro o arquivo preseed.cfg, no caso ficou dentro da pasta boot que foi criada em /var/www/html/boot.
Caso você executar o script "3 - IPXE-DEBIAN.SH" com o conteúdo do preseed embutido não é necessário criar o preseed manualmente no diretório /var/www/html/boot.

 $ cd /var/www/html
 $ sudo mkdir -p boot
 $ cd boot
 $ sudo vim preseed.cfg

#_preseed_V1
###Preseed para boot PXE sem Interface Grafica###
##Preseed ideal para cluster, podendo ser adaptado##

### Locale e linguagem ###
d-i debian-installer/locale string pt_BR.UTF-8
d-i console-setup/ask_detect boolean false

Configuracoes de teclado br-abnt2
d-i console-keymaps-at/keymap select br-abnt2 d-i keyboard-configuration/xkb-keymap select br
d-i keyboard-configuration/layout select br
d-i keyboard-configuration/model select abnt2
d-i keyboard-configuration/variant select abnt2
d-i keyboard-configuration/options string lv3:alt_switch,compose:rctrl
d-i keyboard-configuration/store_defaults_in_debconf_db boolean true
d-i time/zone string America/Sao_Paulo

### Hostname e rede ###
d-i netcfg/use_autoconfig boolean true
d-i netcfg/disable_dhcp_hostname boolean true
d-i netcfg/get_nameservers string 1.1.1.1 9.9.9.9
#d-i netcfg/get_hostname string no01
#d-i netcfg/get_hostname seen true
d-i netcfg/get_domain string localdomain
d-i netcfg/get_domain seen true
d-i netcfg/choose_interface select auto

### Repositorio Debian ###
d-i mirror/country string manual
d-i mirror/http/hostname string deb.debian.org
d-i mirror/http/directory string /debian
d-i mirror/http/proxy string

### Usuario ###
d-i passwd/root-password password cluster
d-i passwd/root-password-again password cluster
d-i passwd/user-fullname string Kluster User
d-i passwd/username string kluster
d-i passwd/user-password password cluster
d-i passwd/user-password-again password cluster
d-i passwd/user-default-groups string sudo

### Popularidade ###
popularity-contest popularity-contest/participate boolean false

### Pre-carrega os modulos necessarios
d-i anna-install string btrfs-modules xfs-modules

### Garante que o módulo btrfs está disponivel antes do particionamento
d-i preseed/early_command string \
modprobe btrfs || true; \
modprobe xfs || true

### Configura o particionamento automatico
d-i partman-auto/method string regular
d-i partman-auto/choose_recipe select boot-root
d-i partman-auto/expert_recipe string \
boot-root :: \
40 50 512 ext4 \
primary{ } $bootable{ } \
method{ format } format{ } \
use_filesystem{ } filesystem{ ext4 } \
mountpoint{ /boot } . \
4096 4096 4096 linux-swap \
primary{ } \
method{ swap } format{ } . \
51200 51200 51200 btrfs \
primary{ } \
method{ format } format{ } \
use_filesystem{ } filesystem{ btrfs } \
mountpoint{ / } . \
512 512 -1 xfs \
primary{ } \
method{ format } format{ } \
use_filesystem{ } filesystem{ xfs } \
mountpoint{ /orangefs } .

### Confirma as acoes do particionador
d-i partman-partitioning/confirm_write_new_label boolean true
d-i partman/choose_partition select finish
d-i partman/confirm boolean true
d-i partman/confirm_nooverwrite boolean true

### Pacotes ###
tasksel tasksel/first multiselect standard, ssh-server
d-i pkgsel/include string sudo vim curl wget net-tools aptitude libu2f-udev console-setup keyboard-configuration console-data

### GRUB ###
d-i grub-installer/bootdev string default

### Finalizacao ###
d-i finish-install/reboot_in_progress note

### Comandos pos-instalacao ###
d-i preseed/late_command string \
in-target bash -c 'echo "XKBMODEL=\"abnt2\"" > /etc/default/keyboard; \
echo "XKBLAYOUT=\"br\"" >> /etc/default/keyboard; \
echo "XKBVARIANT=\"abnt2\"" >> /etc/default/keyboard; \
echo "XKBOPTIONS=\"lv3:alt_switch,compose:rctrl\"" >> /etc/default/keyboard; \
echo "BACKSPACE=\"guess\"" >> /etc/default/keyboard'; \
in-target dpkg-reconfigure -f noninteractive keyboard-configuration; \
in-target setupcon --force; \
in-target update-initramfs -u; \
in-target bash -c 'set -e; \
apt-get clean || true; \
apt-get update || true; \
sed -i "s/^allow-hotplug/auto/" /etc/network/interfaces; \
update-grub || true; update-initramfs -u || true; \
mkdir -p /etc/sudoers.d; \
echo "kluster ALL=(ALL:ALL) ALL" > /etc/sudoers.d/kluster; \
chmod 0440 /etc/sudoers.d/kluster'

Salve e saia.

Para hostname dinâmico configure o arquivo /etc/dhcp/dhcpd.conf para detectar o MAC e mapear via DHCP fixo (ideal em redes e clusters).

Exemplo de configuração do isc-dhcp-server no seu PXE server com hostnames fixos baseados no MAC:

host no01 {
hardware ethernet 00:11:22:33:44:55;
fixed-address 192.168.1.101;
option host-name "no01";
}

O Debian usará o hostname passado pelo DHCP se netcfg/get_hostname não estiver definido no preseed.

Deixe comentadas estas linhas do seu preseed.cfg:

#d-i netcfg/get_hostname string no01
#d-i netcfg/get_hostname seen true


3 - IPXE-DEBIAN.SH

O arquivo ipxe-debian.sh cria o diretório boot em /var/www/html; faz o download do arquivo netboot.tar.gz em /var/www/html/boot e descompacta ele; cria o preseed em /var/www/html/boot ou copia ele, caso você opte em criá-lo manualmente daí tenha o cuidado de descomentar e comentar os trechos no script; cria o script debian.ipxe em /var/www/html/boot e faz o download do kernel ipxe.lkrn para /var/lib/tftpboot.

$ sudo vim ipxe-debian.sh

#!/bin/bash
set -e
### === CONFIGURAÇÕES ===
HTTP_ROOT="/var/www/html" # Caminho do servidor Apache
BOOT_DIR="$HTTP_ROOT/boot"
SERVER_IP="192.168.1.3" # IP do servidor PXE/HTTP
TFTP_DIR="/var/lib/tftpboot"
PRESEED_DIR="/home/kluster/0-Montagem_de_Cluster/PXE"
NETBOOT_URL="https://deb.debian.org/debian/dists/stable/main/installer-amd64/current/images/netboot/netboot.tar.gz"
### === INSTALAR PACOTES NECESSÁRIOS ===
echo "Instalando pacotes..."
apt update
#aptitude safe-upgrade -y
apt install -y wget cpio unzip
echo "Criando diretório de boot em $BOOT_DIR..."
sudo mkdir -p "$BOOT_DIR"
cd "$BOOT_DIR"
echo "Baixando netboot.tar.gz..."
if [ ! -f "netboot.tar.gz" ]; then
sudo wget -q --show-progress "$NETBOOT_URL"
else
echo "netboot.tar.gz já existe, pulando download."
fi
echo "Extraindo netboot.tar.gz..."
if [ ! -d "$BOOT_DIR/debian-installer/amd64" ]; then
sudo tar -xzf netboot.tar.gz
sudo rm -f netboot.tar.gz
else
echo "Arquivos já extraídos, pulando extração."
fi
#echo "Copiando preseed.cfg para $BOOT_DIR..."
#if [ -f "$PRESEED_DIR/preseed.cfg" ]; then
# sudo cp "$PRESEED_DIR/preseed.cfg" "$BOOT_DIR"
#else
# echo "Arquivo preseed.cfg não encontrado em $PRESEED_DIR" >&2
# exit 1
#fi
echo "Criando PRESEED em $BOOT_DIR/preseed.cfg..."
sudo bash -c 'cat < '"$BOOT_DIR"'/preseed.cfg'
## Coloque aqui o conteúdo do preseed.cfg
EOF
echo "Criando script iPXE em $BOOT_DIR/debian.ipxe..."
sudo bash -c 'cat < '"$BOOT_DIR"'/debian.ipxe'
#!ipxe
echo "Configuracao feita..."
kernel http://192.168.1.3/boot/debian-installer/amd64/linux
initrd http://192.168.1.3/boot/debian-installer/amd64/initrd-custom.gz auto=true priority=critical
boot
EOF
echo "Baixando ipxe.lkrn para $TFTP_DIR..."
if [ ! -f "$TFTP_DIR/ipxe.lkrn" ]; then
sudo wget -q --show-progress https://boot.ipxe.org/ipxe.lkrn -O "$TFTP_DIR/ipxe.lkrn"
else
echo "ipxe.lkrn já existe em $TFTP_DIR, pulando download."
fi
echo ""
echo "Tudo pronto! No menu PXE, use a entrada:"
echo ""
echo "LABEL debian-ipxe"
echo " MENU LABEL Instalar Debian via iPXE (netboot + preseed)"
echo " KERNEL ipxe.lkrn"
echo " APPEND dhcp && chain http://SERVER_IP/boot/debian.ipxe"
echo ""

$ sudo chmod +x ipxe-debian.sh
$ sudo ./ipxe-debian.sh

Caso queira ter o iPXE no seu servidor para compilar os vários tipos faça o seguinte:

1- Instale as dependências:

$ sudo apt update
$ sudo apt install git build-essential libssl-dev
$ git clone https://github.com/ipxe/ipxe.git
$ cd ipxe/src

2- Compile a versão do iPXE para ser usada como Kernel:

$ make bin/ipxe.lkrn
ou
$ make bin/undionly.kpxe
etc.

Caso quiser compilar com arquivo ipxe embutido:
$ make bin/ipxe.lkrn EMBED=/caminho/para/arquivo.ipxe

Depois copie o kernel ipxe gerado para onde seu TFTP serve:
$ sudo cp bin/ipxe.lkrn /var/lib/tftpboot/

Maiores informações:


4 - EMBED-PRESEED.SH

Esse script embute o preseed na raiz do initrd.gz.
Lembrando que a imagem utilizada deve ser, neste caso, obrigatoriamente a netboot:

Escolha netboot.tar.gz

A imagem netboot.tar.gz deve ser descompactada na pasta padrão do Apache2 (no caso /var/www/html/) dentro da pasta boot que você criou em /var/www/html/boot.
Caso você tenha executado o script ipxe-debian.sh o netboot.tar.gz já estará descompactado na pasta.

Na descompactação será criada a pasta debian-installer, além de outros arquivos que serão utilizados na instalação via iPXE.
Caso você opte fazer manualmente instale os pacotes necessários, veja o conteúdo do script para saber quais são.

$ sudo vim embed-preseed.sh

#!/bin/bash
set -e
# === CONFIGURAÇÕES ===
BOOT_DIR="/var/www/html/boot/debian-installer/amd64"
WORK_DIR="/tmp/initrd-work"
PRESEED_SOURCE="/var/www/html/boot/preseed.cfg"
OUTPUT_INITRD="$BOOT_DIR/initrd-custom.gz"
# === CHECAGENS INICIAIS ===
INITRD_ORIGINAL="$BOOT_DIR/initrd.gz"
if [ ! -f "$INITRD_ORIGINAL" ]; then
echo "Arquivo initrd.gz não encontrado em: $INITRD_ORIGINAL"
exit 1
fi
if [ ! -f "$PRESEED_SOURCE" ]; then
echo "Arquivo preseed.cfg não encontrado em: $PRESEED_SOURCE"
exit 1
fi
echo "Preparando diretório de trabalho..."
rm -rf "$WORK_DIR"
mkdir -p "$WORK_DIR"
cd "$WORK_DIR"
echo "Fazendo backup do initrd original..."
cp "$INITRD_ORIGINAL" "${INITRD_ORIGINAL}.bak"
echo "Extraindo initrd.gz..."
gzip -dc "$INITRD_ORIGINAL" | cpio -id --quiet
echo "Copiando preseed.cfg para raiz do initrd..."
cp "$PRESEED_SOURCE" ./preseed.cfg
echo "Reempacotando initrd com preseed embutido..."
find . | cpio --quiet -o -H newc --owner=0:0 | gzip -9 > "$OUTPUT_INITRD"
echo "Novo initrd com preseed embutido foi criado com sucesso!"
echo "Local: $OUTPUT_INITRD"
echo
echo "Use esta linha no seu script iPXE:"
echo "initrd http:///boot/debian-installer/amd64/initrd-custom.gz"

Salve e saia.
$ sudo chmod +x embed-preseed.sh
$ sudo ./embed-preseed.sh

Basicamente, depois da descompactação de netboot.tar.gz deverão ter os seguintes diretórios e arquivos em /var/www/html/boot:

:/var/www/html/boot$ ls
debian-installer ldlinux.c32 preseed.cfg pxelinux.cfg version.info
debian.ipxe netboot.tar.gz pxelinux.0 splash.png

Os da sua criação serão somente debian.ipxe e preseed.cfg.

E dentro da pasta /var/www/html/boot/debian-installer/amd64 terá algo assim:

:/var/www/html/boot/debian-installer/amd64$ ls
bootnetx64.efi grub initrd-custom.gz initrd.gz.bak pxelinux.0
boot-screens grubx64.efi initrd.gz linux pxelinux.cfg

5 - DEBIAN.IPXE

Caso você tenha executado o script "2 - IPXE-DEBIAN.SH" o arquivo debian.ipxe já estará na pasta.
Senão crie manualmente em /var/www/html/boot com o seguinte conteúdo:

#!ipxe
echo "Configuracao feita..."

kernel http://192.168.1.3/boot/debian-installer/amd64/linux
initrd http://192.168.1.3/boot/debian-installer/amd64/initrd-custom.gz auto=true priority=critical
boot

Salve e saia.

O arquivo /etc/dhcp/dhcpd.conf deverá ter algo assim no final:

# BEGIN SUBNET 192.168.1.0
# Definir opção de arquitetura PXE (REQUIRED for conditional checks)
option arch code 93 = unsigned integer 16;

subnet 192.168.1.0 netmask 255.255.255.0 {
range 192.168.1.4 192.168.1.11;
option routers 192.168.1.3;
option domain-name-servers 1.1.1.1, 9.9.9.9;

if option arch = 00:07 {
filename "EFI/boot/bootx64.efi"; # UEFI 64-bit
} else {
filename "pxelinux.0"; # BIOS
}
next-server 192.168.1.3;
}
# END SUBNET 192.168.1.0

As configurações do Apache2 deixe no padrão do script instala-pxe.sh, a não ser que você tenha mudado a pasta padrão (/var/www/html), daí altere nos scripts.

São esses arquivos que você deverá cuidar:
$ sudo vim /etc/dhcp/dhcpd.conf
$ sudo vim instala-pxe.sh
$ sudo vim preseed.cfg
$ sudo vim embed-preseed.sh
$ sudo vim /var/lib/tftpboot/pxelinux.cfg/default
$ sudo vim /var/www/html/boot/debian.ipxe
$ sudo vim /etc/default/isc-dhcp-server
$ sudo vim /etc/default/tftpd-hpa

Este último deverá ter o seguinte conteúdo:

# /etc/default/tftpd-hpa

TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/var/lib/tftpboot"
TFTP_ADDRESS="0.0.0.0:69"
TFTP_OPTIONS="--secure --blocksize 512"

O arquivo do Kernel ipxe.lkrn, caso precisar fazer o download manualmente, obtenha aqui:
https://boot.ipxe.org/ipxe.lkrn
e salve ele na pasta /var/lib/tftpboot/ipxe.lkrn.

A coisa funciona assim: a entrada do iPXE no menu PXE (/var/lib/tftpboot/pxelinux.cfg/default) aponta para o DHCP e para o debian.ipxe:

LABEL debian-ipxe
MENU LABEL Instalar Debian via iPXE (netboot e preseed)
KERNEL ipxe.lkrn
APPEND dhcp && chain http://192.168.1.3/boot/debian.ipxe

O arquivo /etc/dhcp/dhcpd.conf aponta automaticamente para os arquivos EFI/boot/bootx64.efi ou pxelinux.0, caso for UEFI ou BIOS.
O arquivo debian.ipxe, por sua vez, aponta para o IP do servidor que você configurou indicando os caminhos para o aplicativo do instalador linux e para o initrd-custom.gz com o preseed.cfg que embutimos na raiz do initrd.


CUSTOMIZANDO A INSTALAÇÃO 6

Instalação via PXE ou iPXE (Método 2)

Utilize este método para instalação em rede, pois é totalmente automatizado sendo que terá de executar os scripts somente uma vez.
O preseed está sem interface gráfica porque é originalmente para cluster, caso queira a instalação em rede com interface gráfica basta alterar o preseed no arquivo ipxe-debian.sh.

Mais informações sobre como alterar para ter interface gráfica veja seção CUSTOMIZANDO A INSTALAÇÃO 1.

Adapte os arquivos para as suas necessidades, principalmente o particionamento e os sistemas de arquivos (usei o btrfs e o xfs).

Essa instalação é para os clientes (ou nós) e deve ser feita no servidor, sendo que depois o servidor acessará os clientes pela rede.
O processo de instalação e configuração do servidor não será demonstrado, pois julgo que o servidor esteja instalado e configurado.
Os clientes (ou nós) devem estar em rede com o servidor através de um switch ou outra solução adequada.

No artigo final será demonstrado o processo completo de Montagem de Cluster.

Nos testes, a placa de rede Broadcom BCM5761, por exemplo, não funciona muito bem com iPXE por causa do firmware dela, apesar de ser mais um pouco mais moderna em relação às placas de rede das máquinas com DDR2, pois essa placa Broadcom BCM5761 é onboard do HP Compaq 6005 Pro SFF que é DDR3.
No menu PXE você tem as duas opções: PXE e iPXE.
Nas máquinas HP Compaq, além de outras, a instalação deu-se via PXE, pois via iPXE dava erro de "No configurations Methods succeeded...", ou seja, a placa de rede não suporta UNDI (Universal Network Device Interface), sendo que o suporte UNDI é oferecido pelo firmware/BIOS da placa de rede, não pelo iPXE.
De qualquer maneira, com este método a instalação ocorre por PXE ou por iPXE (se não dá de um jeito dá do outro).

Utilize os arquivos desta seção.
Sequência de execução dos arquivos:
1º- instala-pxe.sh
2º- ipxe-debian.sh
3º- embed-preseed.sh

Na instalação via iPXE mantenha o preseed embutido no initrd, o arquivo debian.ipxe sem ser embutido no lkrn e para definir os hostnames altere o arquivo /var/www/html/boot/debian.ipxe.
Na instalação via PXE mantenha o preseed via URL (sem ser embutido no initrd) e o debian.ipxe sem ser embutido no lkrn e para setar os hostnames altere o arquivo /var/lib/tftpboot/pxelinux.cfg/default na seção "LABEL debian-pxe" na linha APPEND.

Resumindo: a cada instalação, como não se sabe o firmware da placa de rede, sugiro alterar os hostnames (netcfg/get_hostname=no0X) nos dois arquivos (debian.ipxe e default).

Depois de instalado o sistema no cliente basta acessar pelo servidor com o ssh:
kluster@cservidor:~$ ssh 192.168.1.12
The authenticity of host '192.168.1.12 (192.168.1.12)' can't be established.
ED25519 key fingerprint is SHA256:O/8uXCCGVqSsMNV3TWYzsRJpfBGGnHUByU1zrNVBBk8.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '192.168.1.12' (ED25519) to the list of known hosts.
kluster@192.168.1.12's password:
Linux no02 6.1.0-37-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.140-1 (2025-05-22) x86_64

The programs included with the Debian GNU/Linux system are free software;

the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Wed Jul 16 16:36:45 2025
kluster@no02:~$

Para acessar também pelo hostname utilizando o ssh você deverá configurar o arquivo /etc/hosts.

Exemplo PXE:

LABEL debian-pxe
MENU LABEL Instale o Debian (PXE)
KERNEL vmlinuz
APPEND initrd=initrd.gz auto=true priority=critical netcfg/get_hostname=no01 netcfg/get_domain=localdomain preseed/url=http://192.168.1.3/debianiso/preseed.cfg ---

Exemplo ipxe (com preseed embutido):

#!ipxe
dhcp
kernel http://192.168.1.3/boot/debian-installer/amd64/linux auto=true priority=critical netcfg/get_hostname=no01 netcfg/get_domain=localdomain ---
initrd http://192.168.1.3/boot/debian-installer/amd64/initrd-custom.gz
boot

1- INSTALA-PXE.SH

#!/bin/bash
set -e
### === VERIFICAÇÃO DE ROOT ===
if [ "$EUID" -ne 0 ]; then
echo "Este script deve ser executado usando sudo)."
exit 1
fi
### === CONFIGURAÇÕES ===
### ALTERE para o teu ambiente ###
##PRESEED_PATH="/home/aristotles/0-Montagem_de_Cluster/PXE/preseed.cfg"
PRESEED_PATH="/home/kluster/0-Montagem_de_Cluster/PXE/preseed.cfg"
INTERFACE="enp3s0"
SERVER_IP="192.168.1.3"
DHCP_SUBNET="192.168.1.0"
DHCP_NETMASK="255.255.255.0"
DHCP_RANGE_START="192.168.1.4"
DHCP_RANGE_END="192.168.1.12"
DHCP_ROUTER="192.168.1.3"
### === INSTALAR PACOTES NECESSÁRIOS ===
echo "Instalando pacotes..."
apt update
#aptitude safe-upgrade -y
apt install -y isc-dhcp-server tftpd-hpa apache2 syslinux syslinux-common pxelinux wget cpio unzip
### === CONFIGURAR PXE COM NETBOOT E TFTP ===
echo "Configurando PXE com netboot e TFTP..."
mkdir -p /var/lib/tftpboot
mkdir -p /var/lib/tftpboot/{pxelinux.cfg,EFI/boot,grub,clonezilla}
# Baixar os arquivos netboot do Debian (amd64)
NETBOOT_BASE_URL="http://deb.debian.org/debian/dists/bookworm/main/installer-amd64/current/images/netboot/debian-installer/amd64"
wget -q --show-progress "$NETBOOT_BASE_URL/linux" -O /var/lib/tftpboot/vmlinuz
wget -q --show-progress "$NETBOOT_BASE_URL/initrd.gz" -O /var/lib/tftpboot/initrd.gz
# Personalizar initrd.gz para incluir DNS dentro do initrd
echo "Personalizando initrd.gz para incluir DNS..."
cd /var/lib/tftpboot
mkdir -p initrd-temp
cd initrd-temp
gzip -dc ../initrd.gz | cpio -id --no-absolute-filenames
cat < etc/resolv.conf
nameserver 1.1.1.1
nameserver 9.9.9.9
EOF
# Recriar o initrd.gz customizado
find . | cpio -o -H newc | gzip -c > ../initrd-custom.gz
cd ..
rm -rf initrd-temp
mv initrd-custom.gz initrd.gz
echo "initrd.gz customizado com DNS inserido."
# Copiar arquivos PXELINUX essenciais
cp /usr/lib/PXELINUX/pxelinux.0 /var/lib/tftpboot/
cp /usr/lib/syslinux/modules/bios/libutil.c32 /var/lib/tftpboot/
cp /usr/lib/syslinux/modules/bios/libcom32.c32 /var/lib/tftpboot/
cp /usr/lib/syslinux/modules/bios/menu.c32 /var/lib/tftpboot/
cp /usr/lib/syslinux/modules/bios/ldlinux.c32 /var/lib/tftpboot/
### === BAIXAR E CONFIGURAR MEMTEST86+ 7.20 ===
TMPDIR="/var/lib/tftpboot/tmp"
rm -rf "$TMPDIR"
mkdir -p "$TMPDIR"
echo "Baixando Memtest86+ 7.20..."
wget -q --show-progress https://www.memtest.org/download/v7.20/mt86plus_7.20.binaries.zip -O "$TMPDIR/memtest.zip" || { echo "❌ Falha no download do Memtest86+"; exit 1; }
unzip -o "$TMPDIR/memtest.zip" -d "$TMPDIR"
if [[ -f "$TMPDIR/memtest64.bin" ]]; then
cp "$TMPDIR/memtest64.bin" /var/lib/tftpboot/memtest86+
echo "Memtest86+ copiado como 'memtest86+' (usando memtest64.bin)"
else
echo "Arquivo memtest64.bin não encontrado após extração."
exit 1
fi
rm -rf "$TMPDIR"
### === BAIXAR E INSTALAR CLONEZILLA ===
### Verifique em https://clonezilla.org/downloads/download.php?branch=stable a versao atual e altere abaixo nos wget o numero da versao se for o caso.
CLONEZILLA_ZIP="/var/lib/tftpboot/clonezilla.zip"
CLONEZILLA_DIR="/var/lib/tftpboot/clonezilla"
TMP_CLONEZILLA_DIR="/var/lib/tftpboot/tmp/clonezilla-files"
echo "Verificando Clonezilla..."
# Verifica se já está tudo copiado para o destino final
if [[ -f "$CLONEZILLA_DIR/vmlinuz" && -f "$CLONEZILLA_DIR/initrd.img" && -f "$CLONEZILLA_DIR/filesystem.squashfs" ]]; then
echo "Clonezilla já está configurado em $CLONEZILLA_DIR. Pulando extração e cópia."
else
# Verifica se o zip existe e/ou se está corrompido antes de baixar
if [ -f "$CLONEZILLA_ZIP" ]; then
if unzip -tq "$CLONEZILLA_ZIP" >/dev/null 2>&1; then
echo "Arquivo $CLONEZILLA_ZIP existe e é válido. Pulando download."
else
echo "Arquivo $CLONEZILLA_ZIP está corrompido. Baixando novamente..."
rm -f "$CLONEZILLA_ZIP"
# Baixa o arquivo
wget -q --show-progress https://downloads.sourceforge.net/project/clonezilla/clonezilla_live_stable/3.2.2-15/clonezilla-live-3.2.2-15-amd64.zip -O "$CLONEZILLA_ZIP" || { echo "❌ Falha no download do Clonezilla"; exit 1; }
fi
else
echo "Baixando Clonezilla..."
wget -q --show-progress https://downloads.sourceforge.net/project/clonezilla/clonezilla_live_stable/3.2.2-15/clonezilla-live-3.2.2-15-amd64.zip -O "$CLONEZILLA_ZIP" || { echo "❌ Falha no download do Clonezilla"; exit 1; }
fi
# Garante que o diretório temporário exista antes de extrair
mkdir -p "$TMP_CLONEZILLA_DIR"
# Extrai o zip na pasta temporária
unzip -o "$CLONEZILLA_ZIP" -d "$TMP_CLONEZILLA_DIR"
# Detecta o diretório que contém o subdiretório "live/"
EXTRACTED_DIR=$(find "$TMP_CLONEZILLA_DIR" -type d -name live -exec dirname {} \; | head -n1)
if [ -z "$EXTRACTED_DIR" ]; then
echo "Diretório com subdiretório 'live' não encontrado após extração."
exit 1
fi
echo "Diretório detectado: $EXTRACTED_DIR"
# Verifica se os arquivos essenciais existem dentro do subdiretório "live"
if [[ -f "$EXTRACTED_DIR/live/vmlinuz" && -f "$EXTRACTED_DIR/live/initrd.img" && -f "$EXTRACTED_DIR/live/filesystem.squashfs" ]]; then
mkdir -p "$CLONEZILLA_DIR"
cp "$EXTRACTED_DIR/live/"{vmlinuz,initrd.img,filesystem.squashfs} "$CLONEZILLA_DIR/"
echo "Clonezilla copiado para $CLONEZILLA_DIR"
else
echo "Arquivos do Clonezilla não encontrados após extração."
exit 1
fi
# Limpeza opcional dos temporários
rm -rf "$TMP_CLONEZILLA_DIR"
fi
# Criar Menu PXE BIOS
echo "Configurando o menu PXE..."
cat < /var/lib/tftpboot/pxelinux.cfg/default
DEFAULT debian
UI menu.c32
PROMPT 1
TIMEOUT 100
MENU TITLE PXE Boot Menu
LABEL debian-pxe
MENU LABEL Instale o Debian (PXE)
KERNEL vmlinuz
APPEND initrd=initrd.gz auto=true priority=critical netcfg/get_hostname=no01 netcfg/get_domain=localdomain preseed/url=http://$SERVER_IP/debianiso/preseed.cfg ---
LABEL memtest
MENU LABEL Teste de RAM (Memtest86+ 7.20)
KERNEL memtest86+
LABEL clonezilla
MENU LABEL Clonezilla Live (Backup/Restore)
KERNEL clonezilla/vmlinuz
APPEND initrd=clonezilla/initrd.img boot=live union=overlay username=user config components noswap edd=on nomodeset ocs_live_run="ocs-live-general" ocs_live_keymap="none" ocs_live_batch="no" vga=788 fetch=tftp://$SERVER_IP/clonezilla/filesystem.squashfs
LABEL debian-ipxe
MENU LABEL Instalar Debian via iPXE
KERNEL ipxe.lkrn
APPEND dhcp && chain http://$SERVER_IP/boot/debian.ipxe
EOF
### === CONFIGURAR UEFI PXE COM GRUB ===
echo "Configurando suporte a UEFI PXE com GRUB..."
# Instala o GRUB para gerar arquivos UEFI PXE (apenas se ainda não instalado)
apt install -y grub-efi-amd64-bin
# Cria diretório EFI/boot para UEFI PXE boot
#mkdir -p /var/lib/tftpboot/EFI/boot
# Copia o GRUB EFI executável padrão
cp
/usr/lib/grub/x86_64-efi-signed/grubnetx64.efi.signed /var/lib/tftpboot/EFI/boot/bootx64.efi 2>/dev/null || \
cp /usr/lib/grub/x86_64-efi/grubnetx64.efi /var/lib/tftpboot/EFI/boot/bootx64.efi
# Cria diretório de configuração do GRUB
#mkdir -p /var/lib/tftpboot/grub
cat < /var/lib/tftpboot/grub/grub.cfg
set default=0
set timeout=10
menuentry "Instalação Automática Debian (PXE)" {
linux /vmlinuz auto=true priority=critical preseed/url=http://$SERVER_IP/debianiso/preseed.cfg ---
initrd /initrd.gz
}
menuentry "Teste de Memória RAM (Memtest86+ UEFI)" {
chainloader /memtest86+.efi
}
EOF

### === CONFIGURAR APACHE ===
echo
"Configurando Apache para servir preseed.cfg..."
# Detecta o DocumentRoot do Apache
DOCROOT
=$(grep -i "DocumentRoot" /etc/apache2/sites-enabled/000-default.conf | grep -v '#' | awk '{print $2}')
# Se não encontrou, usa padrão seguro
if
[ -z "$DOCROOT" ]; then
echo "DocumentRoot não detectado. Usando /var/www/html como padrão."
DOCROOT="/var/www/html"
fi
# Cria diretório e copia o preseed
mkdir
-p "$DOCROOT/debianiso"
cp "$PRESEED_PATH" "$DOCROOT/debianiso/"
# Ajusta permissões
chmod
644 "$DOCROOT/debianiso/preseed.cfg"
chown www-data:www-data "$DOCROOT/debianiso/preseed.cfg"
# Reinicia o Apache
systemctl restart apache2

### === CONFIGURAR TFTP ===
echo
"Configurando tftpd-hpa..." /etc/default/tftpd-hpa
cat < /dev/nullTFTP_USERNAME="tftp"
TFTP_DIRECTORY="/var/lib/tftpboot"
TFTP_ADDRESS="0.0.0.0:69"
TFTP_OPTIONS="--secure --blocksize 512"
EOF
### === CONFIGURA DHCP ===
echo
"Configurando DHCP Server..."
# Define interface de rede onde o DHCP deve escutar (ajuste conforme necessário)
echo
"INTERFACESv4=$INTERFACE" > /etc/default/isc-dhcp-server
# Backup do dhcpd.conf original, se ainda não existir
cp
-n /etc/dhcp/dhcpd.conf /etc/dhcp/dhcpd.conf.bak
# Comentar opções DNS padrão, se existirem
sed
-i -E 's/^(option domain-name.*|option domain-name-servers.*)/# &/' /etc/dhcp/dhcpd.conf
# Adiciona opção de arquitetura PXE global, se não existir ainda
if
! grep -qF "option arch code 93 = unsigned integer 16;" /etc/dhcp/dhcpd.conf; then
echo "option arch code 93 = unsigned integer 16;" >> /etc/dhcp/dhcpd.conf
fi
MARKER="# BEGIN SUBNET $DHCP_SUBNET"
# Adicionar subnet 192.168.1.0/24 com marcador único, se ainda não estiver configurada
if
! grep -qF "$MARKER" /etc/dhcp/dhcpd.conf; then
cat <> /etc/dhcp/dhcpd.conf
$MARKER
# Definir opção de arquitetura PXE (REQUIRED for conditional checks)
option arch code 93 = unsigned integer 16;
subnet $DHCP_SUBNET netmask $DHCP_NETMASK {
range $DHCP_RANGE_START $DHCP_RANGE_END;
option routers $DHCP_ROUTER;
option domain-name-servers 1.1.1.1, 9.9.9.9;
if option arch = 00:07 {
filename "EFI/boot/bootx64.efi"; # UEFI 64-bit
} else {
filename "/pxelinux.0"; # BIOS
}
next-server $DHCP_ROUTER;
}
# END SUBNET $DHCP_SUBNET
EOF
echo "Subnet adicionada no dhcpd.conf."
else
echo "Subnet já configurada, pulando adição."
fi
### === REINICIAR SERVIÇOS ===
ifup "$INTERFACE"
systemctl restart isc-dhcp-server
systemctl restart tftpd-hpa
systemctl restart apache2
echo "Servidor PXE configurado com sucesso!"
echo "Menu PXE: Debian | Memtest86+ | Clonezilla | iPXE"
echo "Configure os clientes para bootar via PXE pela rede."


2- IPXE-DEBIAN.SH

#!/bin/bash
set -e
### === CONFIGURAÇÕES ===
HTTP_ROOT="/var/www/html" # Caminho do servidor Apache
BOOT_DIR="$HTTP_ROOT/boot"
SERVER_IP="192.168.1.3" # IP do servidor PXE/HTTP
TFTP_DIR="/var/lib/tftpboot"
PRESEED_DIR="/home/kluster/0-Montagem_de_Cluster/PXE"
NETBOOT_URL="https://deb.debian.org/debian/dists/stable/main/installer-amd64/current/images/netboot/netboot.tar.gz"
echo "Criando diretório de boot em $BOOT_DIR..."
sudo mkdir -p "$BOOT_DIR"
cd "$BOOT_DIR"
echo "Baixando netboot.tar.gz..."
if [ ! -f "netboot.tar.gz" ]; then
sudo wget -q --show-progress "$NETBOOT_URL"
else
echo "netboot.tar.gz já existe, pulando download."
fi
echo "Extraindo netboot.tar.gz..."
if [ ! -d "$BOOT_DIR/debian-installer/amd64" ]; then
sudo tar -xzf netboot.tar.gz
sudo rm -f netboot.tar.gz
else
echo "Arquivos já extraídos, pulando extração."
fi
#echo "Copiando preseed.cfg para $BOOT_DIR..."
#if [ -f "$PRESEED_DIR/preseed.cfg" ]; then
# sudo cp "$PRESEED_DIR/preseed.cfg" "$BOOT_DIR"
#else
# echo "Arquivo preseed.cfg não encontrado em $PRESEED_DIR" >&2
# exit 1
#fi
echo "Criando PRESEED em $BOOT_DIR/preseed.cfg..."
sudo tee "$BOOT_DIR/preseed.cfg" > /dev/null <<'EOF'
#_preseed_V1
###Preseed para boot PXE sem Interface Grafica###
###Este é o preseed###
###Locale e linguagem###
d-i debian-installer/locale string pt_BR.UTF-8
d-i console-setup/ask_detect boolean false
### Configuracoes de teclado ###
d-i console-keymaps-at/keymap select br-abnt2
d-i keyboard-configuration/xkb-keymap select br
d-i keyboard-configuration/layout select br
d-i keyboard-configuration/model select abnt2
d-i keyboard-configuration/variant select abnt2
d-i keyboard-configuration/options string lv3:alt_switch,compose:rctrl
d-i keyboard-configuration/store_defaults_in_debconf_db boolean true
d-i time/zone string America/Sao_Paulo

### Hostname e rede ###
d-i netcfg/use_autoconfig boolean true
d-i netcfg/disable_dhcp_hostname boolean true
d-i netcfg/get_nameservers string 1.1.1.1 9.9.9.9
d-i netcfg/choose_interface select auto
### Repositorio Debian ###
d-i mirror/country string manual
d-i mirror/http/hostname string deb.debian.org
d-i mirror/http/directory string /debian
d-i mirror/http/proxy string

### Usuario e senha ###
d-i passwd/root-password password cluster
d-i passwd/root-password-again password cluster
d-i passwd/user-fullname string Kluster User
d-i passwd/username string kluster
d-i passwd/user-password password cluster
d-i passwd/user-password-again password cluster
d-i passwd/user-default-groups string sudo
### Popularidade ###
popularity-contest popularity-contest/participate boolean false
### Pre-carrega os modulos necessarios ###
d-i anna-install string btrfs-modules xfs-modules
### Garante que os módulos btrfs e xfs estarao disponiveis antes do particionamento ###
d-i preseed/early_command string \
modprobe btrfs || true; \
modprobe xfs || true

### Configura o particionamento automatico ###
d-i partman-auto/method string regular
d-i partman-auto/choose_recipe select boot-root
d-i partman-auto/expert_recipe string \
boot-root :: \
40 50 512 ext4 \
$primary{ } $bootable{ } \
method{ format } format{ } \
use_filesystem{ } filesystem{ ext4 } \
mountpoint{ /boot } . \
4096 4096 4096 linux-swap \
$primary{ } \
method{ swap } format{ } . \
51200 51200 51200 btrfs \
$primary{ } \
method{ format } format{ } \
use_filesystem{ } filesystem{ btrfs } \
mountpoint{ / } . \
512 512 -1 xfs \
$primary{ } \
method{ format } format{ } \
use_filesystem{ } filesystem{ xfs } \
mountpoint{ /orangefs } .
### Confirma as acoes do particionador ###
d-i partman-partitioning/confirm_write_new_label boolean true
d-i partman/choose_partition select finish
d-i partman/confirm boolean true
d-i partman/confirm_nooverwrite boolean true
### Pacotes ###
tasksel tasksel/first multiselect standard, ssh-server
d-i pkgsel/include string sudo vim curl wget net-tools aptitude libu2f-udev console-setup keyboard-configuration console-data
### GRUB ###
d-i grub-installer/bootdev string default
### Finalizacao ###
d-i finish-install/reboot_in_progress note
### Comandos pos-instalacao ###
### Substitua a chave ssh publica que deverá ser gerada no servidor e copiada do ###
### arquivo /home/kluster/.ssh/id_ed25519.pub para o primeiro echo abaixo entre aspas ###
d-i preseed/late_command string \
mkdir -p /target/root/.ssh; \
echo "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIFcx6e2Zcm4agOhhb0h2hgHKEAYPCsHnTyOsipaNySEu kluster@cservidor" > /target/root/.ssh/authorized_keys; \
chmod 700 /target/root/.ssh; \
chmod 600 /target/root/.ssh/authorized_keys; \
in-target bash -c 'echo "XKBMODEL=\"abnt2\"" > /etc/default/keyboard; \
echo "XKBLAYOUT=\"br\"" >> /etc/default/keyboard; \
echo "XKBVARIANT=\"abnt2\"" >> /etc/default/keyboard; \
echo "XKBOPTIONS=\"lv3:alt_switch,compose:rctrl\"" >> /etc/default/keyboard; \
echo "BACKSPACE=\"guess\"" >> /etc/default/keyboard'; \
in-target dpkg-reconfigure -f noninteractive keyboard-configuration; \
in-target setupcon --force; \
in-target update-initramfs -u; \
in-target bash -c 'set -e; \
apt-get clean || true; \
apt-get update || true; \
sed -i "s/^allow-hotplug/auto/" /etc/network/interfaces; \
update-grub || true; update-initramfs -u || true; \
mkdir -p /etc/sudoers.d; \
echo "kluster ALL=(ALL:ALL) ALL" > /etc/sudoers.d/klustoer; \
chmod 0440 /etc/sudoers.d/klustoer'
EOF
echo "Criando script iPXE em $BOOT_DIR/debian.ipxe..."
sudo tee "$BOOT_DIR/debian.ipxe" > /dev/null <<'EOF'
#!ipxe
dhcp
echo "Obtido IP via DHCP!"
kernel http://192.168.1.3/boot/debian-installer/amd64/linux auto=true priority=critical netcfg/get_hostname=no01 netcfg/get_domain=localdomain ---
initrd http://192.168.1.3/boot/debian-installer/amd64/initrd-custom.gz
boot
EOF
echo "Baixando ipxe.lkrn para $TFTP_DIR..."
if [ ! -f "$TFTP_DIR/ipxe.lkrn" ]; then
sudo wget -q --show-progress https://boot.ipxe.org/ipxe.lkrn -O "$TFTP_DIR/ipxe.lkrn"
else
echo "ipxe.lkrn já existe em $TFTP_DIR, pulando download."
fi
echo ""
echo "Tudo pronto!"
echo ""

3- EMBED-PRESEED.SH

#!/bin/bash
set -e
### Use: sudo ./embed-preseed.sh
# === CONFIGURAÇÕES ===
BOOT_DIR="/var/www/html/boot/debian-installer/amd64"
WORK_DIR="/tmp/initrd-work"
PRESEED_SOURCE="/var/www/html/boot/preseed.cfg"
OUTPUT_INITRD="$BOOT_DIR/initrd-custom.gz"
# === CHECAGENS INICIAIS ===
INITRD_ORIGINAL="$BOOT_DIR/initrd.gz"
if [ ! -f "$INITRD_ORIGINAL" ]; then
echo "Arquivo initrd.gz não encontrado em: $INITRD_ORIGINAL"
exit 1
fi

if [ ! -f "$PRESEED_SOURCE" ]; then
echo "Arquivo preseed.cfg não encontrado em: $PRESEED_SOURCE"
exit 1
fi
echo "Preparando diretório de trabalho..."
rm -rf "$WORK_DIR"
mkdir -p "$WORK_DIR"
cd "$WORK_DIR"
echo "Fazendo backup do initrd original..."
cp "$INITRD_ORIGINAL" "${INITRD_ORIGINAL}.bak"
echo "Extraindo initrd.gz..."
gzip -dc "$INITRD_ORIGINAL" | cpio -id --quiet
echo "Copiando preseed.cfg para raiz do initrd..."
cp "$PRESEED_SOURCE" ./preseed.cfg
echo "Reempacotando initrd com preseed embutido..."
##find . | cpio --quiet -o -H newc | gzip -9 > "$OUTPUT_INITRD"
find . | cpio --quiet -o -H newc --owner=0:0 | gzip -9 > "$OUTPUT_INITRD"
echo "Novo initrd com preseed embutido criado com sucesso!"
echo "Local: $OUTPUT_INITRD"
echo

Vamos às considerações finais onde tem o arquivo preseed comentado com explicações importantes.


CONSIDERAÇÕES FINAIS

Caso você queria somente instalar o Debian customizado em uma única máquina opte pela instalação com a ISO (CUSTOMIZANDO A INSTALAÇÃO 1).

Talvez tenha ficado algum erro menor ou outro em algum script, procurei testar todos antes de postar, porém, como se trata de um artigo extenso e um pouco complexo, mesmo tendo esmero na realização, ainda assim pode escapar alguma coisa.
Caso a execução de algum script incorra em erro para você, observe o que o erro diz e caso tenha sido um erro seu de digitação ou um erro de formatação ao copiar e colar procure corrigir você mesmo ou poste nos comentários.

Darei algumas explicações sobre preseed, na medida do possível.
Nas referências logo abaixo tem material suficiente para você ter uma boa base, apesar da documentação escassa em alguns pontos cruciais.

Alguns dos obstáculos que encontrei ao tentar uma instalação sem intervenção via Preseed incluem:
Falhas silenciosas causadas por tabulações ou espaços extras no particionamento (expert_recipe);
A partição swap sendo ignorada se colocada fora de ordem;
Problemas com compatibilidade em hardware mais antigo, principalmente com discos IDE ou BIOS legados;
preseed.cfg sendo ignorado mesmo que especificado via kernel boot line.

Preseed Embutido
Embutir o preseed.cfg diretamente no initrd.gz quando for via PXE e/ou iPXE e preseed embutido na imagem ISO quando for via pendrive, garante que o instalador sempre o carregue — independentemente da forma como o sistema inicializa, porém, em instalações em rede com muitos computadores torna-se contraproducente porque terá de fazer o processo de embutimento a cada instalação.
Por isso, para instalações em rede opte pelo MÉTODO 2 na seção CUSTOMIZANDO A INSTALAÇÃO 6.

Durante a instalação você notará que mesmo com o preseed embutido no initrd.gz, quase ao final da instalação aparecerá uma mensagem "Executando o preseed..." ou algo parecido, porém, essa mensagem diz respeito somente aos comandos pós-instalação (late_command).

Para saber se tudo está correndo bem na instalação via iPXE com preseed embutido, observe logo no começo durante a instalação se o particionamento aplicado corresponde ao do preseed.

Particionamento: ponto crítico:
O expert_recipe é extremamente sensível à formatação.

Algumas observações práticas:
-Não use tabulações, apenas espaços simples;
-Jamais deixe espaços em branco no final das linhas;
-A ordem das partições importa — por exemplo, a swap deve vir após /boot e antes de / (raiz);
-No esquema de particionamento não pode ter comentários entre as linhas da string expert_recipe, aliás, não pode ter nada além do esquema de particionamento;
-Um erro mínimo de formatação e/ou sintaxe pode resultar em falha silenciosa do instalador.

Observações Finais
Esse método provou-se confiável em servidores novos com UEFI e máquinas antigas com BIOS tradicional.
Testado com sucesso inclusive em hardware antigo com DDR2 e BIOS legado.
Evita depender de parâmetros instáveis em linha de kernel.
Pode ser adaptado para qualquer distribuição baseada no debian-installer.
O esquema total utilizado foi com label iPXE dentro de menu PXE com apache2, tftpd-hpa e isc-dhcp-server, mas pode ser utilizado com somente iPXE.

Não mostrei aqui como configurar mirrors no servidor com esse mesmo esquema apache2/dhcp/tftpd, ou seja, como transformar o servidor em um espelho interno com os pacotes sempre atualizados para que não dependa tanto da internet ao instalar/reinstalar os sistemas na rede.

Trabalhando com imagens ISO e PXE/iPXE você pode  instalar Windows na sua rede, bastando para isso utilizar a própria imagem original do Windows e modificar ela com o NTLite:

Apesar de que para instalação em massa do Windows via rede interna o mais aconselhado é criar uma imagem com o Clonezilla (que é baseado no Debian) e instalar em vários computadores ao mesmo tempo com o próprio Clonezilla:

d-i significa Debian Installer.

PRESEED explicado

Abaixo repito o preseed, comentado, onde tem as seções em sequência com o título de cada configuração.

#_preseed_V1
###Preseed para boot PXE sem Interface Grafica###

Este é o preseed ##
O preseed segue uma sequência rígida que é pouco documentada e se você inverte alguma posição a instalação falha silenciosamente. O que se percebe é que, basicamente, a sequência das opções no preseed deve seguir a ordem do instalador do Debian, ou seja, a mesma ordem caso você fizesse tudo manualmente, o instalador pergunta primeiro o local, depois a linguagem e assim por diante.

### Locale e linguagem ###
d-i debian-installer/locale string pt_BR.UTF-8
d-i console-setup/ask_detect boolean false

Configuracoes de teclado ###
d-i console-keymaps-at/keymap select br-abnt2 d-i keyboard-configuration/xkb-keymap select br
d-i keyboard-configuration/layout select br
d-i keyboard-configuration/model select abnt2
d-i keyboard-configuration/variant select abnt2
d-i keyboard-configuration/options string lv3:alt_switch,compose:rctrl
d-i keyboard-configuration/store_defaults_in_debconf_db boolean true
d-i time/zone string America/Sao_Paulo

Na configuração da rede torna-se imprescindível estabelecer os DNSs, pois senão a instalação pode falhar com a mensagem de que não foi possível encontrar o espelho de rede e dá várias opções incertas do que pode ter acontecido.

### Hostname e rede ###
d-i netcfg/use_autoconfig boolean true
d-i netcfg/disable_dhcp_hostname boolean true
d-i netcfg/get_nameservers string 1.1.1.1 9.9.9.9
d-i netcfg/get_hostname string no01
d-i netcfg/get_hostname seen true
d-i netcfg/get_domain string localdomain
d-i netcfg/get_domain seen true
d-i netcfg/choose_interface select auto

### Repositorio Debian ###
d-i mirror/country string manual
d-i mirror/http/hostname string deb.debian.org
d-i mirror/http/directory string /debian
d-i mirror/http/proxy string

As configurações de usuário e senha são tranquilas e nunca deram problema.

### Usuario ###
d-i passwd/root-password password cluster
d-i passwd/root-password-again password cluster
d-i passwd/user-fullname string Kluster User
d-i passwd/username string kluster
d-i passwd/user-password password cluster
d-i passwd/user-password-again password cluster
d-i passwd/user-default-groups string sudo

### Popularidade ###
popularity-contest popularity-contest/participate boolean false

Caso tenha algum módulo/pacote/programa extra para instalar e pré-carregar coloque nesta parte.

### Instala e pre-carrega os modulos necessarios ###
d-i anna-install string btrfs-modules xfs-modules

Você pode criar vários early_command (pré-comandos), somente no caso de módulos extras tenha o cuidado colocar os módulos numa ordem lógica, senão a instalação falha caso você carregar um módulo antes de outro módulo que dependa deste.
Como utilizei btrfs na partição raiz fez-se necessário habilitar o módulo específico.
Com btrfs na partição raiz é obrigatório ter antes uma partição /boot bootável senão a instalação falha dizendo que não foi possível definir uma partição raiz.
Com o xfs, talvez por ser mais antigo, não é tão necessário, mas coloquei como garantia:

d-i preseed/early_command string \
modprobe btrfs || true; \
modprobe xfs || true

### Configura o particionamento automatico ###

No particionamento por preseed não pode ter espaços em branco após as linhas, procure evitar tabulação, use somente espaçamento com a barra de espaços e não pode ter comentários no esquema de particionamento.
Pode se observar que evitei colocar acentuação até nos comentários de todo o preseed.

A opções abaixo definem o método de particionamento:
regular: partições usuais para a arquitetura instalada;
lvm: para partições LVM;
crypto: para partições LVM com encriptação.

Podemos definir três tipos de receitas (recipe) pré-definidas:
atomic: todo o particionamento numa única partição;
home: partição /home separada;
multi: partições /home, /var e /tmp separadas.

E podemos também definir a nossa receita de particionamento, no caso, repete-se o nome que vem logo depois da linha "d-i partman-auto/expert_recipe string" que está em seguida:

d-i partman-auto/method string regular
d-i partman-auto/choose_recipe select boot-root

A partir daqui começa o recipe (receita) de particionamento.
Pode colocar em uma linha lógica só, sem barras no final, mas por uma questão de organização fica melhor com barras ao final de cada linha, porém, não abuse das barras, entre o final e a barra deve ter um espaço em branco e não pode ter espaço em branco após cada barra.
A receita segue uma ordem específica: a partição /boot ou /raiz (caso a partição /boot fique junto com a raiz) devem vir por primeiro e depois a swap.
Depois da swap vem as outras partições.
No caso eu "fechei" o disco colocando 4 partições primárias, mas pode criar partições lógicas.

O parâmetro $bootable{ } é o mesmo que "flag inicializável ligado" da instalação gráfica e só pode ter uma única partição bootável, caso você colocar duas ou mais o instalador falhará.
Os valores do tamanho de cada partição deve ser preferencialmente em MB (MegaBytes).
Entre as chaves sempre deve ter um espaço em branco não importando se tem escritos dentro das chaves, senão a instalação falha silenciosamente.

d-i partman-auto/expert_recipe string \
boot-root :: \
40 50 512 ext4 \
$primary{ } $bootable{ } \
method{ format } format{ } \
use_filesystem{ } filesystem{ ext4 } \
mountpoint{ /boot } . \
4096 4096 4096 linux-swap \
$primary{ } \
method{ swap } format{ } . \
51200 51200 51200 btrfs \
$primary{ } \
method{ format } format{ } \
use_filesystem{ } filesystem{ btrfs } \
mountpoint{ / } . \

Nesta parte abaixo os parâmetros 512 e -1 significam que é para utilizar todo o espaço vazio restante do SD/HD na partição ali definida com um mínimo de 512 MB, ou seja, a partição começará com 512 MB e ocupará todo o restante do disco.
O parâmetro mountpoint é o mesmo que escolher o tipo de partição ou "Definir manualmente a partição" ou algo parecido na instalação gráfica.

512 512 -1 xfs \
$primary{ } \
method{ format } format{ } \
use_filesystem{ } filesystem{ xfs } \
mountpoint{ /orangefs } .

### Confirma as acoes do particionador ###
d-i partman-partitioning/confirm_write_new_label boolean true
d-i partman/choose_partition select finish
d-i partman/confirm boolean true
d-i partman/confirm_nooverwrite boolean true

Esta parte instala a interface gráfica e pacotes/programas extras, como se pode perceber.
A linha tasksel destina-se aos pacotes básicos padrões do Debian.
A linha "d-i pkgsel" destina-se mais aos pacotes/programas adicionais/extras.
Na seção CUSTOMIZANDO A INSTALAÇÃO 1 tem mais algumas explicações logo no começo.

### Pacotes ###
tasksel tasksel/first multiselect standard, ssh-server
d-i pkgsel/include string sudo vim curl wget net-tools aptitude libu2f-udev console-setup keyboard-configuration console-data

Repetindo as linhas com instalação de interface gráfica, no caso, o Cinnamon:

### Pacotes ###
tasksel tasksel/first multiselect standard, cinnamon-desktop, ssh-server
d-i pkgsel/include string sudo vim curl wget net-tools mousepad aptitude libu2f-udev gnome-terminal firefox-esr console-setup keyboard-configuration console-data

Aqui instala-se o GRUB na partição /dev/sda ou default.
Coloquei default mesmo tendo um único disco, porém, com dois ou mais discos é necessário ser default porque daí o GRUB será instalado no mesmo disco onde o particionamento recebeu a partição /boot bootável ou a partição raiz bootável.

### GRUB ###
d-i grub-installer/bootdev string default

Neste parâmetro dizemos ao instalador para não perguntar e não parar a instalação com "Retire o disco de instalação e clique em Continuar" ou algo parecido.

### Finalizacao ###
d-i finish-install/reboot_in_progress note

Aqui temos os comandos pós-instalação onde faz-se as configurações extras ou reforça-se alguma configuração cujos d-i não satisfizeram, por exemplo, as configurações de teclado abnt2 tiveram de ser feitas aqui porque os parâmetros ## Configuracoes de teclado ### não foram aplicados, porém, caso se comentar os parâmetros o instalador para e pergunta as opções de teclado, não sei explicar o porquê disso.

### Comandos pos-instalacao ###
d-i preseed/late_command string \
in-target bash -c 'echo "XKBMODEL=\"abnt2\"" > /etc/default/keyboard; \
echo "XKBLAYOUT=\"br\"" >> /etc/default/keyboard; \
echo "XKBVARIANT=\"abnt2\"" >> /etc/default/keyboard; \
echo "XKBOPTIONS=\"lv3:alt_switch,compose:rctrl\"" >> /etc/default/keyboard; \
echo "BACKSPACE=\"guess\"" >> /etc/default/keyboard'; \
in-target dpkg-reconfigure -f noninteractive keyboard-configuration; \
in-target setupcon --force; \
in-target update-initramfs -u; \
in-target bash -c 'set -e; \
apt-get clean || true; \
apt-get update || true; \
sed -i "s/^allow-hotplug/auto/" /etc/network/interfaces; \
update-grub || true; update-initramfs -u || true; \
mkdir -p /etc/sudoers.d; \
echo "kluster ALL=(ALL:ALL) ALL" > /etc/sudoers.d/kluster; \
chmod 0440 /etc/sudoers.d/kluster'

Aqui tem o exemplo oficial (mas deficiente) do Debian:


Referências