Table of Contents

Requirements

HW: 2 nic device

OS: Ubuntu server 17.10

apt install bash debootstrap schroot syslinux nfs-kernel-server tftpd-hpa xorriso pigz  zfsutils-linux

Optional config

apt install isc-dhcp-server 

network config nano /etc/netplan/01-netcfg.yaml

# This file describes the network interfaces available on your system
# For more information, see netplan(5).
network:
  version: 2
  renderer: networkd
  ethernets:
    ens3:
      dhcp4: no
      addresses: [10.1.22.2/24]
      gateway4: 192.168.122.1
      nameservers:
        addresses: [8.8.8.8,8.8.4.4]
    ens4:
      dhcp4: yes


netplan apply

Build livenet environment

Preparazione dell'ambiente zfs

zpool create livenet /dev/sdb
zfs create livenet/images
zfs create livenet/boot

Download package git clone https://github.com/scipioni/livenet-server.git edit /etc/default/livenet like this

# folder that contains livenet system
BASE=/livenet
IMAGES=${BASE}/images
BOOT=${BASE}/boot

Trivial FTP

edit /etc/default/tftp-hpa

TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/zfsp_livenet/boot"
TFTP_ADDRESS="0.0.0.0:69"
TFTP_OPTIONS="--secure"
mkdir /livenet/boot/pxelinux.cfg

cp -a /usr/lib/syslinux/* /livenet/boot

cp /livenet/boot/modules/efi64/* /livenet/boot 

edit /livenet/boot/pxelinux.cfg/default

default menu.c32
prompt 0
#timeout 100

menu title PXE Special Boot Menu
MENU AUTOBOOT Starting Livenet in # seconds

label bootlocal
   menu label ^Boot local disk
   menu default
   localboot 0

label nfs
   menu label Ubuntu 18.04 - diskless
   kernel /bionic/kernel
   append initrd=/bionic/initrd ro livenet_root=10.1.22.2:/zfsp_livenet/images/bionic livenet_profile=default

label nfs
   menu label Ubuntu 14.04 - install
   kernel /trusty/kernel
   append initrd=/trusty/initrd ro livenet_root=10.0.254.240:/images/trusty livenet_profile=default livenet_action=install livenet_action_end=reboot

BUILD IMAGE CLIENT

zfs create livenet/images/bionic debootstrap –arch amd64 bionic /zfsp_livenet/images/bionic/ http://archive.ubuntu.com/ubuntu

cd /livenet/images run ….

R=bionic
cat > ${R}/etc/hosts <<QWK
127.0.0.1   localhost livenet-host
::1     localhost ip6-localhost ip6-loopback
ff02::1     ip6-allnodes
ff02::2     ip6-allrouters
QWK

chroot ${R} lsb_release -c | awk '{print $2}' > ${R}/etc/debian_chroot
chroot bionic/
chroot ${R} apt-get -y -q install locales dialog
chroot ${R} locale-gen en_GB.UTF-8
chroot ${R} locale-gen it_IT.UTF-8
chroot ${R} update-locale LANG=it_IT.UTF-8 LANGUAGE=it:en_US:en
echo Europe/Rome > ${R}/etc/timezone
cp ${R}/usr/share/zoneinfo/Europe/Rome ${R}/etc/localtime
cat > ${R}/usr/sbin/policy-rc.d <<QWE
#!/bin/sh

# dpkg/apt not start any daemons when things are installed in the chroot

if [ ! "\\\`cat /etc/hostname\\\`" = "\\\`hostname\\\`" ]; then
    exit 101
fi
QWE

chmod +x ${R}/usr/sbin/policy-rc.d
mount --bind /zfsp_livenet/images/bionic/boot/ /zfsp_livenet/boot/bionic
DISTR=bionic

cat > /etc/apt/sources.list <<QWE
#############################################################
################### OFFICIAL UBUNTU REPOS ###################
#############################################################
###### Ubuntu Main Repos
deb http://archive.ubuntu.com/ubuntu/ ${DISTR} main restricted universe multiverse 
###### Ubuntu Update Repos
deb http://archive.ubuntu.com/ubuntu/ ${DISTR}-security main restricted universe multiverse 
deb http://archive.ubuntu.com/ubuntu/ ${DISTR}-updates main restricted universe multiverse 
deb http://archive.ubuntu.com/ubuntu/ ${DISTR}-proposed main restricted universe multiverse 
deb http://archive.ubuntu.com/ubuntu/ ${DISTR}-backports main restricted universe multiverse 
###### Ubuntu Partner Repo
deb http://archive.canonical.com/ubuntu ${DISTR} partner
QWE
apt update apt -y upgrade
apt -y install initramfs-tools  python-passlib pv screen byobu lsof pigz rsync nfs-common libpam-script xloadimage conntrack

install livenet client package

# copiare /home/scipio/.netrv e /home/scipio/.gitconfig in <chroot>/root/
cd /root
git clone  https://github.com/scipioni/livenet-client.git
cd livenet-client
git checkout bionic
mv .git /
git status
find / -maxdepth 1 > .gitignore

inside git directory

rsync -avb etc/ /etc/
rsync -avb usr/ /usr/
rsync -avb debian /
rsync -avb README.md /
apt-get -y install linux-generic

etc/initramfs-tools/hooks/livenet

#!/bin/sh -e
# initramfs hook for livenet
#set -x
PREREQ=""

# Output pre-requisites
prereqs()
{
       echo "$PREREQ"
}

case "$1" in
    prereqs)
       prereqs
       exit 0
       ;;
esac

. /usr/share/initramfs-tools/hook-functions

rm ${DESTDIR}/bin/cpio # importante! altrimenti rimane un cpio troppo semplificato
copy_exec /bin/cpio /bin

mkdir -p ${DESTDIR}/conf
cp /etc/livenet/livenet.conf ${DESTDIR}/conf
[ -f /etc/livenet/livenet.conf.override ] && cp /etc/livenet/livenet.conf.override ${DESTDIR}/conf
cp /etc/initramfs-tools/scripts/functions-livenet ${DESTDIR}/conf

manual_add_modules aufs
manual_add_modules overlayfs
auto_add_modules net
auto_add_modules nfsv4

# pulizia di firmware non necessario e pesante
set +e
rm -f ${DESTDIR}/lib/firmware/* >/dev/null 2>&1
set -e

### qui sotto andrebbe commentato in produzione ###

# tastiera italiana in initram
# attivata da do_debug_shell (loadkeys /etc/boottime.kmap.gz)
#cp -au /etc/console-setup/cached.kmap.gz ${DESTDIR}/etc/boottime.kmap.gz

# nfs4
#copy_exec /usr/sbin/rpc.idmapd /bin
#copy_exec /sbin/mount.nfs /bin
#cp -au /etc/netconfig ${DESTDIR}/etc/netconfig

#cat > ${DESTDIR}/etc/passwd <<EOF
#nobody::65534:65534:nobody:/nonexistent:/bin/sh
#EOF
#cat > ${DESTDIR}/etc/group <<EOF
#nogroup:x:65534:
#EOF

# debug purpose ################
# ricordati di mettere FRAMEBUFFER=n in /etc/initramfs-tools/conf.d/splash
#copy_exec /sbin/ifconfig
#copy_exec /sbin/lsmod /bin
#copy_exec /usr/bin/lspci /bin
#################################

# wireless #####################
#copy_exec /sbin/iwconfig
#copy_exec /sbin/iwlist
#copy_exec /sbin/iwpriv
#copy_exec /sbin/iwevent
#copy_exec /sbin/iwgetid
#copy_exec /sbin/iwspy
#copy_exec /usr/sbin/rfkill
#cp -au /lib/firmware/iwl*-[13].ucode ${DESTDIR}/lib/firmware
#################################

Rebuild initramfs image

ln-mng –kernel

DHCP

Abilitare dhcpd su specifica scheda

Editare la riga in

/etc/default/isc-dhcp-server

INTERFACESv4="ens3"

Configurazione dhcpd

editare il file /etc/dhcp/dhcpd.conf al termine service isc-dhcp-service restart

ddns-update-style none;
authoritative;

option domain-name              "livenet";
option domain-name-servers      8.8.8.8;

allow bootp;
allow booting;
 
option space PXE;
# Code 1: Multicast IP address of bootfile
option PXE.mtftp-ip code 1 = ip-address;
# Code 2: UDP port that client should monitor for MTFTP responses
option PXE.mtftp-cport code 2 = unsigned integer 16;
# Code 3: UDP port that MTFTP servers are using to listen for MTFTP requests
option PXE.mtftp-sport code 3 = unsigned integer 16;
# Code 4: Number of secondes a client must listen for activity before trying
#         to start a new MTFTP transfer
option PXE.mtftp-tmout code 4 = unsigned integer 8;
option PXE.mtftp-delay code 5 = unsigned integer 8;
# Code 5: Number of secondes a client must listen before trying to restart
#         a MTFTP transfer
option PXE.discovery-control code 6 = unsigned integer 8;
option PXE.discovery-mcast-addr code 7 = ip-address;
set vendor-string = option vendor-class-identifier;

class "PXE" {
   match if substring(option vendor-class-identifier, 0, 9) = "PXEClient";
   option vendor-class-identifier "PXEClient";
   vendor-option-space PXE;
   option PXE.mtftp-ip 0.0.0.0;
}

class "Etherboot" {
   match if substring(option vendor-class-identifier, 0, 9) = "Etherboot";
   option vendor-class-identifier "Etherboot";
   vendor-option-space PXE;
   option PXE.mtftp-ip 0.0.0.0;
}

class "LIVENET" {
    match if (substring(option vendor-class-identifier,0,7) = "LIVENET") or (substring(option vendor-class-identifier,0,9) = "PXEClient") or (substring(option vendor-class-identifier,0,9) = "Etherboot");
    log ( info, "Packet from PXE or LIVENET client");
}

shared-network "clients" {
  subnet 10.1.22.0 netmask 255.255.255.0 {
  option subnet-mask 255.255.255.0;
  option routers 10.1.22.2;
  #default-lease-time 28800;
  #max-lease-time 86400;

  pool {
      # restringe il lease solo alla classe LIVENET
      allow members of "LIVENET";
      range 10.1.22.10 10.1.22.100;
      filename "/pxelinux.0";
      next-server 10.1.22.2;
      }
  }
}