# Guia de Configuração Geral de um Servidor tftp ## Instalação do NFS-COMMON e NFS-KERNEL-SERVER ``` $ apt install nfs-server $ apt install nfs-kernel-server $ systemctl enable nfs-server && systemctl start nfs-server ``` Configurar **/etc/exports** da seguinte forma: ``` /srv/nfs 192.168.100.0/24(rw,async,no_root_squash,no_subtree_check) # lembrando que o ip acima é fictício, substitua pelao da sua rede ``` ## Estrutura de diretórios └── srv/       ├── nfs             ├── homes/             ├── images/                   ├── debian/       ├── tftp/             ├── pxelinux.cfg/ ## Configuração de IP Estático Alterar: ``` /etc/network/interfaces.d/enp2s0 ``` Para: ``` auto enp2s0 iface enp2s0 inet static address 192.168.100.8 netmask 255.255.255.0 network 192.168.100.0 broadcast 192.168.100.255 gateway 192.168.100.1 dns-nameservers 200.17.209.1 200.17.209.123 192.168.100.8 ``` Alterar: ``` /etc/resolv.conf ``` Para: ``` nameserver 127.0.0.1 nameserver 8.8.8.8 ``` **Observações**: Os ips na configuração do arquivo descrito acima são fictícios, com exceção dos dns-servers com inicio em 200 que são servidores dns da UFPR. Os demais com **198** são ips de responsabilidade do leitor de configurar corretamente. Para saber o ip de sua máquina basta executar em um terminal **"ip a"**. A interface **enp2s0** também deve ser alterada pela que for listada no comando **"ip a"**. ## DHCP && DNSMASQ ### Instalação: ``` $ sudo apt install dnsmasq ``` ### Configuração: Alterar **dnsmasq.conf** para incluir a pasta de config: ``` /etc/dnsmasq.conf ``` Para: ``` # descomentar a última linha do arquivo #conf-dir=/etc/dnsmasq.d/,*.conf # deve ser conf-dir=/etc/dnsmasq.d/,*.conf ``` Criar o arquivo dhcp.conf: ``` $ touch /etc/dnsmasq.d/dhcp.conf ``` E editá-lo para a seguinte configuração: ``` # Set the interface on which dnsmasq operates. # If not set, all the interfaces are used. # interface=eth0 # Enable dnsmasq's DHCP server functionality. dhcp-range=192.168.100.3,192.168.100.254,1h # Set static ip of other PCs and router # Router dchp-host=14:CC:20:C6:93:B3,192.168.100.8,192.168.100.1,infinite # Set gateway as router dhcp-option=3,192.168.100.1 # Set DNS server as the DHCP server dhcp-option=6,192.168.100.8 # Logging log-facility=/var/log/dnsmasq.log log-async log-queries log-dhcp ``` Para verificar se o serviço está rodando execute: ``` $ systemctl restart dnsmasq ``` **Em caso de erros, podemos descobrir com mais detalhes a sua causa checando o log do sistema:** ``` $ journalctl -xe ``` ## Instalação da e configuração da imagem de client no Servidor ### Instalação Estaremos utilizando a versão debian stretch, caso queira, pode ser instalado outras distros também ou outras versões mais recentes do debian: ``` $ apt install debootstrap $ debootstrap stretch /srv/nfs/images/debian http://debian.c3sl.ufpr.br/debian ``` Após a instalação terminar, fazer as configuração iniciais da imagem: ``` $ cd /srv/nfs/images/debian/ $ mount -t sysfs sys sys/ $ mount -o bind /dev dev/ $ mount -t proc proc proc/ $ chroot . ``` ### Configurando o Client instalado Editar /etc/apt/sources.list e deixar o conteúdo como: ``` deb http://debian.c3sl.ufpr.br/debian stretch main deb http://deb.debian.org/debian stretch main deb-src http://deb.debian.org/debian stretch main deb http://ftp.debian.org/debian stretch main contrib non-free ``` Installação dos pacotes: ``` $ apt-get update $ apt-get install vim ssh nfs-common autofs busybox locales man $ drivers do firmware $ apt-get install firmware-realtek firmware-linux-nonfree firmware-linux-free # instalar o kernel # procurar a versão mais recente de linux-image # executando apt search linux-image # ou use o pacote 'linux-generic' $ apt-get install linux-image-4.9.0-8-amd64 ``` Set e geração de localidade: ``` $ sed -i -e 's/# pt_BR.UTF-8 UTF-8/pt_BR.UTF-8 UTF-8/g' /etc/locale.gen $ sed -i -e 's/# en_US.UTF-8 UTF-8/en_US.UTF-8 UTF-8/g' /etc/locale.gen $ locale-gen $ update-locale LANG=en_US.UTF-8 UTF-8 # timezone $ ln -sf /usr/share/zoneinfo/America/Sao_Paulo /etc/localtime ``` Montagem de diretórios de /etc/fstab: ``` # adicionar as linhas /dev/nfs / nfs tcp,nolock 0 0 proc /proc proc defaults 0 0 none /tmp tmpfs defaults 0 0 none /var/tmp tmpfs defaults 0 0 none /media tmpfs defaults 0 0 none /var/log tmpfs defaults 0 0 ``` Configuração da interface de rede: ``` # como na configuração de ip, executar a linha abaixo para descobrir a interface de rede $ ip a # criar e editar o arquivo $ vim /etc/network/interfaces.d/enp2s0 # substituir enp2s0 pela sua interface ``` O arquivo de interface de rede deve conter o seguinte contéudo, não esqueça de substituir **enp2s0** pela sua interface de rede: ``` auto enp2s0 iface enp2s0 inet dhcp ``` Configuração do autofs: ``` # adicionar em /etc/auto.master a linha /home /etc/auto.homes ``` ``` # criar o arquivo /etc/auto.home $ touch /etc/auto.home $ echo "* -fstype=nfs,rw 192.168.100.8:/srv/nfs/homes/&" > /etc/auto.home ``` Configuração do **/etc/initramfs-tools/modules**: ``` # adicionar: nfs nfs2 nfs3 overlay ``` Editar configurações de módulos e boot em **/etc/initramfs-tools/initramfs.conf**: ``` # trocar MODULES=most # para MODULES=netboot # adicionar BOOT=nfs ``` Criar o arquivo **/etc/initramfs-tools/scripts/init-bottom/init-bottom-overlay.sh** com o seguinte conteúdo: ``` #!/bin/sh PREREQ="" prereqs() { echo "$PREREQ" } case $1 in prereqs) prereqs exit 0 ;; esac if grep -q -E '(^|\s)skipoverlay(\s|$)' /proc/cmdline; then exit 0 fi mkdir -p /overlay mount -t tmpfs tmpfs /overlay mkdir -p /overlay/upper mkdir -p /overlay/work mkdir -p /overlay/lower # make the readonly root available mount -n -o move ${rootmnt} /overlay/lower mount -t overlay overlay -olowerdir=/overlay/lower,upperdir=/overlay/upper,workdir=/overlay/work ${rootmnt} #mkdir -p ${rootmnt}/overlay #mount -n -o rbind /overlay ${rootmnt}/overlay exit 0 ``` Gerar initrd, a versão do kernel **PRECISA** ser especificada: ``` $ mkinitramfs -o /boot/initrd.pxe 4.9.0-8-amd64 ``` Trocar senha do root ``` $ passwd ``` ## Configuração do tftp dentro do DNSMASQ Caso ainda esteja dentro do **chroot** pressiona Ctrl+D para sair. ### Configurar TFTP e os arquivos de boot pxe ``` $ cp /srv/nfs/images/debian/boot/initrd.pxe /srv/tftp/initrd.pxe $ cp /srv/nfs/images/debian/boot/vmlinuz-4.9.0-8-amd64 /srv/tftp/vmlinuz.pxe $ wget http://archive.ubuntu.com/ubuntu/dists/eoan/main/installer-amd64/current/images/netboot/ubuntu-installer/amd64/pxelinux.0 $ mv pxelinux.0 /srv/tftp/ # Atenção, pois os seguintes arquivos podem estar em diretórios diferentes dos aqui usados $ cp /usr/lib/syslinux/modules/bios/ldlinux.c32 /srv/tftp/ $ cp /usr/lib/syslinux/modules/bios/menu.c32 /srv/tftp/ $ cp /usr/lib/syslinux/modules/bios/libutil.c32 /srv/tftp/ $ chmod 775 -R /srv/tftp ``` Criar e editar o arquivo **/srv/tftp/pxelinux.cfg/default** com o seguinte conteúdo: ``` DEFAULT Debian LABEL Debian KERNEL vmlinuz.pxe PROMPT 1 TIMEOUT 3 APPEND rw initrd=/srv/tftp/initrd.pxe root=/dev/nfs ip=dhcp nfsroot=192.168.100.8:/srv/nfs/images/debian ``` Editar novamente **/etc/dnsmasq.d/dhcp.conf** e adicionar no final do arquivo: ``` # TFTP Server enable-tftp tftp-no-fail tftp-root=/srv/tftp pxe-prompt="What system shall I boot?" pxe-service=x86PC,"Debian (Stretch)",pxelinux.0 ``` Liberar as portas e firewall: ``` $ dpkg -l | grep iptables # se estiver instalado, rodar o comando abaixo para liberar a porta do tftp: $ iptables -I INPUT -j ACCEPT -p udp -m udp --dport 69 # possívelmente, pode estar instalado outro firewall ao invés de iptables. firewalld é um outro possível. em qualquer caso, deve ser liberada a porta 69 ``` ## Referências - https://hackmd.io/@tn82fIwvQXuIbkD01-Zu5A/S1hsNMxO4