# 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