From 115f587156018949fd01674435384617e8c3f25e Mon Sep 17 00:00:00 2001 From: Georges Khaznadar Date: Thu, 23 Oct 2025 20:03:28 +0200 Subject: [PATCH 1/9] beginning i18n and l10n to French --- doc/Makefile | 64 +- doc/fai-guide.html | 4319 ++++++++++++++ doc/fai-guide.pdf | Bin 0 -> 281933 bytes doc/fai-guide.text | 2785 +++++++++ doc/fai-guide_fr.html | 4397 ++++++++++++++ doc/fai-guide_fr.pdf | Bin 0 -> 286965 bytes doc/fai-guide_fr.text | 2829 +++++++++ doc/fai-guide_fr.txt | 2737 +++++++++ ... Guide (Fully Automatic Installation).html | 3844 ++++++++++++ doc/fr-old/fai_guide.txt | 2830 +++++++++ doc/po/fai-guide.pot | 4159 +++++++++++++ doc/po/fr.po | 5136 +++++++++++++++++ 12 files changed, 33087 insertions(+), 13 deletions(-) create mode 100644 doc/fai-guide.html create mode 100644 doc/fai-guide.pdf create mode 100644 doc/fai-guide.text create mode 100644 doc/fai-guide_fr.html create mode 100644 doc/fai-guide_fr.pdf create mode 100644 doc/fai-guide_fr.text create mode 100644 doc/fai-guide_fr.txt create mode 100644 doc/fr-old/FAI Guide (Fully Automatic Installation).html create mode 100644 doc/fr-old/fai_guide.txt create mode 100644 doc/po/fai-guide.pot create mode 100644 doc/po/fr.po diff --git a/doc/Makefile b/doc/Makefile index 8bfa7b1ec..980a5ef97 100644 --- a/doc/Makefile +++ b/doc/Makefile @@ -4,32 +4,70 @@ DOC = fai-guide MISC_DOC = classes_description.txt changelog.old DOC2DIR = $(shell pwd)/../debian/fai-setup-storage/usr/share/doc/fai-setup-storage OPT = --dblatex-opts "-P latex.output.revhistory=0" - +LANGUAGES = fr +POFILES = $(patsubst %, po/%.po, $(LANGUAGES)) +HTML_LANG_FILES = $(patsubst %, $(DOC)_%.html, $(LANGUAGES)) +PDF_LANG_FILES = $(patsubst %, $(DOC)_%.pdf, $(LANGUAGES)) +TEXT_LANG_FILES = $(patsubst %, $(DOC)_%.text, $(LANGUAGES)) +DOC_LANG_FILES = $(patsubst %, $(DOC)_%.doc, $(LANGUAGES)) +# kill conversion to doc when it is too long +TIMEOUT = 10 free: text html pdf # echo "`grep -c FIXME $(DOC).txt` FIXMEs left to fix:" # grep FIXME $(DOC).txt +potfile: $(DOC).txt + [ -d po ] || mkdir po + txt2po $< -o po/$(DOC).pot --pot + +updatepo: potfile + for l in $(LANGUAGES); do \ + [ -f po/$$l.po ] || cp po/$(DOC).pot po/$$l.po ; \ + pot2po po/$(DOC).pot -o po/$$l.po.tmp -t po/$$l.po || \ + mv po/$$l.po.tmp po/$$l.po ; \ + done + +translate: $(DOC).txt $(POFILES) + for l in $(LANGUAGES); do \ + po2txt -i po/$$l.po -t $(DOC).txt -o $(DOC)_$$l.txt ; \ + done + + images: ln -fs /usr/share/asciidoc/images images -html: $(DOC).txt images - asciidoc -a toc2 -a toclevels=3 --theme=flask $(DOC).txt +%.html : %.txt + @echo "$< ==> $@" + @asciidoc -a toc2 -a toclevels=3 --theme=flask $< + +html: $(DOC).html $(HTML_LANG_FILES) + +%.pdf: %.txt + @echo "$< ==> $@" + @a2x $(OPT) -L --icons -a toc -a toclevels=3 -f pdf $< + @prefix=$$(echo $< | sed 's/\.txt//'); rm -f $$prefix.xml $$prefix.fo + +pdf: $(DOC).pdf $(PDF_LANG_FILES) -pdf: $(DOC).txt images - a2x $(OPT) -L --icons -a toc -a toclevels=3 -f pdf $(DOC).txt - rm -f $(DOC).xml $(DOC).fo # a2x uses lynx, maybe use w3m instead # which texwidth for text output? # asciidoc --doctype=article -a "toc" -a "toclevels=3" -f /etc/asciidoc/text.conf -b html4 -o - "f-guide.txt" | lynx -dump -stdin >"./f-guide.text" -text: $(DOC).txt - a2x $(OPT) -L -a toc -a toclevels=3 -f text $(DOC).txt +%.text: %.txt + @echo "$< ==> $@" + @a2x $(OPT) -L -a toc -a toclevels=3 -f text $< + +text: $(DOC).text $(TEXT_LANG_FILES) # for openoffice -doc: html - unoconv --show >/dev/null 2>&1 || exit "Please install the unoconv package." - unoconv -f doc $(DOC).html +%.doc: %.html + @echo "$< ==> $@" + @unoconv --show >/dev/null 2>&1 || exit "Please install the unoconv package." + @timeout $(TIMEOUT) unoconv -f doc $< || \ + echo "$@ could not be generated after $(TIMEOUT) s." + +doc: $(DOC).doc $(DOC_LANG_FILES) .NOTPARALLEL: free all: free @@ -41,10 +79,10 @@ install: clean: rm -rf images .a2x-icons grohtml-*.png - rm -f $(DOC).text $(DOC).html $(DOC).doc $(DOC).pdf $(DOC).xml $(DOC).ps* docbook-xsl.css + rm -f *.text *.html *.doc *.pdf *.xml *.ps* docbook-xsl.css test: asciidoc --version > /dev/null 2>&1 || exit "Please install the asciidoc package." -.PHONY: all test clean +.PHONY: all test clean free html pdf text doc diff --git a/doc/fai-guide.html b/doc/fai-guide.html new file mode 100644 index 000000000..71178f544 --- /dev/null +++ b/doc/fai-guide.html @@ -0,0 +1,4319 @@ + + + + + + +FAI Guide (Fully Automatic Installation) + + + + + +
+
+
+

An older French version of this guide is available at https://fai-project.org/fai-guide-fr.

+
+
+
+

Abstract

+
+

FAI is a non-interactive system to install, customize and manage Linux +systems and software configurations on computers as well as virtual +machines and chroot environments, from small networks to large +infrastructures and clusters.

+

This manual describes the Fully Automatic Installation software. This +includes the installation of the packages, setting up the server, creating of the +configuration and how to deal with errors.

+

(c) 2000-2025 Thomas Lange

+
Copyright

This manual is free software; you may redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version.

+

This is distributed in the hope that it will be useful, but without +any warranty; without even the implied warranty of merchantability or +fitness for a particular purpose. See the GNU General Public License +for more details.

+

A copy of the GNU General Public License is available as +/usr/share/common-licenses/GPL in the Debian GNU/Linux distribution +or on the World Wide Web at the +GNU website You can also obtain it by writing to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.

+
+
+
+
+

Introduction

+
+
+

Availability

+
+
+Homepage +
+
+

+https://fai-project.org +

+
+
+FAI wiki +
+
+

+https://wiki.fai-project.org +

+
+
+Download +
+
+

+https://fai-project.org/download +

+
+
+Entry for sources.list +
+
+

+deb https://fai-project.org/download bookworm koeln +

+
+
+Manual pages +
+
+

+https://fai-project.org/doc/man/ +

+
+
+Mailing list +
+
+

+https://lists.uni-koeln.de/mailman/listinfo/linux-fai +

+
+
+Feedback +
+
+

+Send feedback and comments to fai@fai-project.org or +to the mailing list. +

+
+
+Bugs +
+
+

+Use the Debian bug tracking system (BTS) https://bugs.debian.org/src:fai +

+
+
+User visible changes +
+
+

+https://fai-project.org/NEWS +

+
+
+Source tree via git +
+
+

+git clone git://github.com/faiproject/fai.git +

+
+
+View source tree via https +
+
+

+https://github.com/faiproject/fai +

+
+
+

The man pages always include up-to-date information and a lot of +details of all FAI commands. So, don’t forget to read them carefully. +Now read this manual, then enjoy the fully automatic installation and +your saved time.

+
+
+

Motivation

+

Have you ever performed identical installations of an operating system +several times? Would you like to be able to install a Linux cluster +with dozens of nodes single handedly?

+

Repeating the same task again and again is boring — and will surely +lead to errors. Also a whole lot of time could be saved if the +installations were done automatically. An installation process with +manual interaction does not scale. But clusters have the habit of +growing over the years. Think long-term rather than planning just a +few months into the future.

+

In 1999, I had to perform an installation of a Linux cluster with one +server and 16 clients. Since I had much experience doing automatic +installations of Solaris operating systems on SUN SPARC hardware, the +idea to build an automatic installation for Debian was born. Solaris +has an automatic installation feature called JumpStart +
[Solaris 8 Advanced Installation Guide at +https://docs.oracle.com/cd/E19455-01/806-0957/806-0957.pdf +]
. In conjunction with the auto-install scripts +from Casper Dik +
[http://www.science.uva.nl/pub/solaris/auto-install]
, I could +save a lot of time not only for every new SUN computer, but also for +re-installation of existing workstations. For example, I had to build +a temporary LAN with four SUN workstations for a conference, which +lasted only a few days. I took these workstations out of our normal +research network and set up a new installation for the conference. +When it was over, I simply integrated the workstations back into the +research network, rebooted just once, and after half an hour, +everything was up and running as before. The configuration of all +workstations was exactly the same as before the conference, because +everything was performed by the same installation process. I also used +the automatic installation for reinstalling a workstation after a +damaged hard disk had been replaced. It took two weeks until I +received the new hard disk but only a few minutes after the new disk +was installed, the workstation was running as before. And this is why +I choose to adapt this technique to a PC cluster running Linux.

+
+
+

How does FAI work

+

The install client which will be installed using FAI, is booted via +network card or from CD or USB stick. It gets an IP address and boots +a Linux kernel which mounts its root file system via NFS (the nfsroot) +from the +install server. After the kernel is started, the FAI startup script +performs the automatic installation which doesn’t need any +interaction. First, the hard disks will be partitioned, file systems +are created and then software packages are installed. After that, the +new installed operating system is configured to your local needs using +some scripts. Finally, the new operating system will be booted from the +local disk.

+

The details of how to install the computer (the configuration) are +stored in the configuration space on the install server. Configuration +files are shared among groups of computers if they are similar using +the class concept. So you need not create a configuration for every +new host. Hence, FAI is a scalable method to install a big cluster +with a great number of nodes even if their configuration is not identical.

+

FAI can also be used as a rescue system or for hardware inventory. You can boot your +computer, but it will not perform an installation. Instead it will run +a fully functional Debian GNU/Linux without using the local hard +disks. Then you +can do a remote login and backup or restore a disk partition, check a +file system, inspect the hardware or do any other task.

+
+
+

Features

+
    +
  • +

    +A fully automated installation can be performed. +

    +
  • +
  • +

    +Very quick unattended installation. +

    +
  • +
  • +

    +Flexible system through easy class concept. +

    +
  • +
  • +

    +Update of running systems without re-installation. +

    +
  • +
  • +

    +Cloud images for virtualization environment. +

    +
  • +
  • +

    +Hosts can boot from network card, CD, USB stick. +

    +
  • +
  • +

    +Simple creation of an installation or live ISO. +

    +
  • +
  • +

    +PXE with DHCP boot method is supported. +

    +
  • +
  • +

    +ReiserFS, ext3/ext4, btrfs and XFS file system support. +

    +
  • +
  • +

    +Software RAID and LVM support. LUKS support. +

    +
  • +
  • +

    +Automatic hardware detection. +

    +
  • +
  • +

    +You can deploy Debian, Ubuntu, Rocky Linux, CentOS, AlmaLinux, SuSE +

    +
  • +
  • +

    +Remote login via ssh during installation process possible. +

    +
  • +
  • +

    +All similar configurations are shared among all install clients. +

    +
  • +
  • +

    +Log files for all installations are saved to the installation server. +

    +
  • +
  • +

    +Shell, Perl, Python, Ruby, expect and CFEngine scripts are supported during the customization step. +

    +
  • +
  • +

    +Support for many protocols like NFS, FTP, HTTPS, git. +

    +
  • +
  • +

    +Can be used as a rescue system and for hardware inventory. +

    +
  • +
  • +

    +Diskless client support. +

    +
  • +
  • +

    +Cross-architecture support e.g. for embedded devices. +

    +
  • +
  • +

    +Easily add your own functions via hooks or change the default behavior. +

    +
  • +
  • +

    +Cloning machines using disk images is supported. +

    +
  • +
+
+
+

Installation times

+

The installation time is determined by the amount of software and +the speed of the hard disk. Here are some sample +times. All install clients had a 1Gbit network card installed.

+
+ ++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
CPU RAM Disk Software installed time

i7-3770T 2.50GHz

8GB

SSD

6 GB software

8.5 min

Core-i7 3.2GHz

6GB

SATA disk

4.3GB software

7 min

Core-i7 3.2GHz

6GB

SATA disk

471 MB software

77sec

Intel Core2 Duo

2GB

SATA disk

3 GB software

14 min

+
+
+
+
+
+

Quickstart - For the impatient user

+
+
+

My first installation

+

Without further ado, this section will provide a quick and easy demonstration of a fully automatic installation using the FAI CD and a virtual machine.

+

Just download the CD ISO image from https://fai-project.org/fai-cd and boot +your VM using this CD. You will see a grub menu where you can select +from different installation types.

+

This installation will run without an install server. The CD +installation is the same as when run in a network environment using +the FAI install server and can also be used from USB stick on a real +computer.

+

You can also create yourself a custom fully automated installation +image on the webpage https://fai-project.org/FAIme without the need of +installing FAI on your computer.

+
+
+

My first server installation

+

We will create a private network and start two virtual machines. One +will become your own FAI server, the other will be an install client.

+

If you intend to use VMware or VirtualBox, ensure that your client +uses a bridged network connection. A detailed description is in the +FAI wiki +
[https://wiki.fai-project.org/index.php/VirtualBox_for_your_first_FAI_installation]
. Also, +it is not possible to use +bridged network interfaces over wireless, as most WiFi network cards +do not support this feature.

+

When using Qemu/KVM and the fai-kvm wrapper you can create the +network using the command fai-mk-network. First install some packages

+
+
+
# apt-get install qemu-system-gui qemu-kvm qemu-utils
+
+

The next command sets up a private network with a software bridge with several tap devices +that belong to the user <username>.

+
+
+
fai-mk-network <username>
+
+

After that, you can use fai-kvm (-h will give you some help) for +starting virtual machines using KVM that are connected to this private +network. Be careful. By default, fai-kvm will create the disk images +for the virtual machines in /tmp, which is a RAM disk on most +systems. It’s no problem to create an empty 20G disk image in /tmp +(even if this partition is of 4GB size), but while the VM is writing +data to its disk, this will start to consume space in /tmp.

+

Start the first virtual host, which will become the FAI server +
[This installation will consume about 2GB of space in +/tmp.]
:

+
+
+
fai-kvm -Vn -s20 -u 1 cd faicd64-small.iso
+
+

In the grub menu select faiserver, using internal DHCP and a fixed IP. This will install a host called +faiserver with IP 192.168.33.250 which contains all software needed +for a FAI server. It will also set up a local package cache (using +apt-cacher-ng). Once the installation is finished, reboot the +machine. During the first boot of the new system, it will +automatically set up the nfsroot. This may take some minutes.

+

After that you can start additional hosts using network boot. For +every new host, you have to use a different value for -u, which will be used for +generating different MAC addresses and using different disk image file +names.

+
+
+
fai-kvm -Vn -u 2 pxe
+
+

Those install clients will show you a menu, where you can select which +type of installation you like to perform. If the install client does +not find the server, it is usually because fai-monitor is no longer +running on it. This can happen, if you reboot the faiserver after the +installation. To remedy this, simply run fai-monitor on the faiserver +and re-attempt the client boot.

+

Another client could be started with:

+
+
+
fai-kvm -Vn -u 3 pxe
+
+

You can start as many machines in the network as tap devices are +available. All these machines can connect to the outside internet but are +only reachable from your host machine.

+
+
+
+
+

Overview and Concepts

+
+

FAI is a non-interactive system to install, customize and manage Linux +systems and software configurations on computers as well as virtual +machines and chroot environments, from small networks to large +infrastructures and clusters. You can take one or more virgin PCs, +turn on the power and after a few minutes Linux is installed, +configured and running on the whole cluster, without any interaction +necessary. Thus, it’s a scalable method for installing and updating a +cluster unattended with little effort involved. FAI uses the +Linux operating system and a collection of shell and Perl scripts for +the installation process. Changes to the configuration files of the +operating system can be made by CFEngine, shell (bash and zsh), Perl, +Python, Ruby and expect scripts.

+

FAI’s target group are system administrators who have to install Linux +onto one or even hundreds of computers. Because it’s a general purpose +installation tool, it can be used for installing a Beowulf cluster, a +rendering farm or a Linux laboratory or a classroom. Also large-scale +Linux networks with different hardware or different installation +requirements are easy to establish using FAI. But don’t forget to plan +your installation. Chapter [plan] has some useful hints for this +topic.

+
+

Important Terms

+

First, some terms used in this manual are described.

+
+
+install server +
+
+

+It provides DHCP, TFTP and NFS services and the configuration data for +all install clients. In the examples of this manual this host is +called faiserver. The host where the package fai-server is installed. +

+
+
+install client +
+
+

+A host which will be installed using FAI and a configuration provided +by the install server. Also called client for short. In this manual, +the example hosts are called demohost, xfcehost, gnomehost … +This computer should boot from its network interface using PXE. +

+
+
+configuration space +
+
+

+A subdirectory structure containg several files. Those files describe +the details of how the installation of the clients will be +performed. All configuration data is stored here. It’s also called +config space for short. It includes information about: +

+
    +
  • +

    +Hard disk layout in a format similar to fstab +

    +
  • +
  • +

    +Local file systems, their types, mount points and mount options +

    +
  • +
  • +

    +Software packages +

    +
  • +
  • +

    +Keyboard layout, time zone, Xorg configuration, remote file + systems, user accounts, printers … +

    +
  • +
+

The package fai-doc includes a sample configuration space including +examples for hosts using the XFCE and GNOME environment amongst other +examples. Calling fai-mk-configspace copies these examples to +/srv/fai/config. It’s recommended to study those config files and +scripts for easier understanding how FAI works.

+
+
+nfsroot, NFS-Root +
+
+

+A file system located on the install server. During the installation +process it’s the complete file system for the install clients. All +clients share the same nfsroot, which they mount read only. The +nfsroot needs about 1.1GB of free disk space. +

+
+
+TFTP +
+
+

+Serves clients the initrd and kernel that is used for the installation process. +Along with the file system served by NFS, these two make up a temporary +OS in which the installations are performed. +

+
+
+FAI classes +
+
+

+Classes are names which determine which configuration file is +selected. If a client belongs to class WEBSERVER, it will be configured +as a webserver, the class DESKTOP for e.g. determines which software +packages will be installed. +

+
+
+profile +
+
+

+A FAI profile is just a list of FAI classes assiged to a profile name, +which is extended by a description of this profile. I.e. one could have +two "Webserver" profiles, one including the APACHE class another including the NGINX class, +to then install the respective webserver solution. +

+
+
+tasks +
+
+

+The installation of a client consists of several parts, which are called tasks. +Tasks are predefined subroutines which perform a certain part of the +FAI. The following FAI tasks are performed during an installation +on the install clients. +

+
+
+
+
+
+
+
confdir               # get the config space
+setup                 # some initialization, start sshd on demand
+defclass              # define FAI classes
+defvar                # define variables
+action                # evaluate FAI_ACTION
+install               # Start the installation
+partition             # partition the harddisks, create file systems
+mountdisks            # mount the file systems
+extrbase              # extract the base.tar.xz
+debconf               # do the Debian debconf preseeding
+repository            # prepare access to the package repository
+updatebase            # Set up package tools and update packages
+instsoft              # install software packages
+configure             # call customization scripts
+finish                # do some cleanup, show installation statistics
+tests                 # call tests if defined
+chboot                # call fai-chboot on the install server
+savelog               # save log files to local and remote location
+faiend                # reboot host, eject CD if needed
+
+
+
+
+
+
+

These are tasks, which are only executed when a different action is performed

+
+
+
dirinstall           # install a chroot environment
+softupdate           # only do the system configuration
+sysinfo              # print detailed system information
+inventory            # print short hardware inventory list
+
+
+
+
+

For a more in-depth description of tasks , see [tasks].

+

Note that you are not limited to the FAI tasks. You can also define additional programs or scripts which will be run +on particular occasions. They are called hooks.

+
+
+hooks +
+
+

+Hooks are plugins, they can add additional functionality to the installation process +or even replace entire tasks of FAI. Hooks are explained in detail in +[hooks]. +

+
+
+
+
+

The class concept

+

Classes are used in nearly all tasks of the installation. Classes +determine which configuration files to choose from a list of available +alternatives. To determine which config files to use, FAI searches the +list of defined classes and uses all configuration files that match a +class name
[It’s also possible to use only the configuration +file with the highest priority since the order of classes define a +priority from low to high within the list of classes. ]
. The following loop implements +this function in pseudo shell code:

+
+
+
for class in $all_classes; do
+   if [ -r $config_dir/$class ]; then      # if a file with name $class exists
+      your_command $config_dir/$class      # call a command with this file name
+      # exit if only the first matching file is needed
+   fi
+done
+
+

The very nice feature of this is that you can add a new configuration +alternative and it will automatically be used by FAI without changing +the code, if the configuration file uses a class name.

+

This is because the loop automatically detects new configuration files +that should be used. +The idea of using classes in general and using certain files matching +a class name for a configuration is adopted from the installation +scripts by Casper Dik for Solaris. This technique proved to be very +useful and easy.

+

You can group multiple hosts that share the same configuration +files by using the same class. You can also split the whole +configuration data for all clients into several classes and use them +like lego bricks and build the entire configuration for a single +client by assembling the bricks together.

+

If a client belongs to class A, we say the class A +is defined for this client. A class has no value, it is just defined or +undefined.

+

Classes determine how the installation is performed. For example, an install +client can be configured to get the XFCE desktop by just adding the +class XFCE to it. Naturally, also more granular configurations are possible. For instance, classes can describe how the hard disk should be partitioned, they can +define which software packages will be installed, or which +customization steps are performed.

+

Often, a client configuration is created by only changing or appending the +classes to which this client belongs, making the installation of a new +client very easy. Thus no additional information needs to be added to +the configuration space if the existing classes suffice for your +needs.

+

As you can see, classes are a central pillar of customizing your configuration space and with that your client installation. On how to define your own classes, refer to [defining classes].

+
+
+
+
+

Setup your faiserver

+
+

Here’s how to set up the install server in a few minutes. Following +steps are needed:

+
    +
  1. +

    +Set up the install server +

    +
      +
    1. +

      +Install FAI packages +

      +
    2. +
    3. +

      +Create the nfsroot +

      +
    4. +
    5. +

      +Copy the examples to the config space +

      +
    6. +
    7. +

      +Configure network daemons +

      +
    8. +
    9. +

      +Create the PXELINUX configurations +

      +
    10. +
    +
  2. +
  3. +

    +Boot and install clients +

    +
  4. +
+
+

Install the FAI packages

+
    +
  • +

    +Install the key of the FAI project package repository. +

    +
  • +
  • +

    +Add the URL of the package repository of the FAI project. +

    +
  • +
  • +

    +Install the package fai-quickstart on your install server. +

    +
  • +
+

Use these commands for installing:

+
+
+
# wget -O /etc/apt/trusted.gpg.d/fai-project.gpg https://fai-project.org/download/2BF8D9FE074BCDE4.gpg
+# echo "deb http://fai-project.org/download bookworm koeln" > /etc/apt/sources.list.d/fai.list
+
+

or

+
+
+
# apt install extrepo ; extrepo enable fai
+
+

and then

+
+
+
# apt-get update
+# aptitude install fai-quickstart
+
+

This will also install the packages for DHCP, TFTP and NFS server daemons.

+
+
+

Create the nfsroot

+
    +
  • +

    +Also enable the package repository of the FAI project in a different + sources.list file which is used when building the nfsroot. Then, + enable the log user for FAI. +

    +
  • +
+
+
+
# sed -i -e 's/^#deb/deb/' /etc/fai/apt/sources.list
+# sed -i -e 's/#LOGUSER/LOGUSER/' /etc/fai/fai.conf
+
+
    +
  • +

    +By default, FAI uses http://deb.debian.org as package + mirror, which should attempt to find a fast package repository for you.
    [If you want to use a faster mirror, adjust the URL + in /etc/fai/apt/sources.list and FAI_DEBOOTSTRAP in /etc/fai/nfsroot.conf before calling fai-setup.]
    +Now, we can run fai-setup(8)
    [This will call fai-make-nfsroot(8) internally.]
    +and check if everything went well. +The log file is written to /var/log/fai/fai-setup.log. +

    +
  • +
+
+
+
# fai-setup -v
+
+
+
+
+
FAI packages and related packages inside the nfsroot:
+dracut             059-4
+dracut-live        059-4
+dracut-network     059-4
+dracut-squash      059-4
+fai-client         6.2
+fai-nfsroot        6.2
+fai-setup-storage  6.2
+Waiting for background jobs to finish
+fai-make-nfsroot finished properly.
+Log file written to /var/log/fai/fai-make-nfsroot.log
+Adding line to /etc/exports: /srv/fai/config 192.168.33.250/24(async,ro,no_subtree_check)
+Adding line to /etc/exports: /srv/fai/nfsroot 192.168.33.250/24(async,ro,no_subtree_check,no_root_squash)
+Reloading nfs-kernel-server configuration (via systemctl): nfs-kernel-server.service.
+
+Your initial config space is now located in /srv/fai/config
+Please don't forget to fill out the FAI questionnaire after you've finished your project with FAI.
+
+FAI setup finished.
+Log file written to /var/log/fai/fai-setup.log
+
+
    +
  • +

    +fai-setup has created the LOGUSER, the nfsroot and has added + additional lines to /etc/exports. The subdirectories added to + /etc/exports are exported via NFS v3, so all install clients in the + same subnet can mount them via NFS. +

    +
  • +
+
+
+

Creating the configuration space

+

Install the simple examples into the configuration space +
[These files need not belong to the root account.]
.

+
+
+
$ fai-mk-configspace
+
+

These examples contain configuration for some sample +hosts. Depending on the host name used, your computer will be +configured as follows:

+
+
+demohost +
+
+

+A machine which needs only a small hard disk. This machine is +configured with network as DHCP client, and an account demo is +created. +

+
+
+xfcehost +
+
+

+A XFCE desktop is installed, using LVM, and the account demo is created. +

+
+
+gnomehost +
+
+

+A GNOME desktop is installed, and the account demo is created. +

+
+
+ubuntuhost +
+
+

+A Ubuntu desktop will be installed, and the account demo is created. +

+
+
+other host names +
+
+

+Hosts with another host name will most notably use the classes FAIBASE, +DHCPC and GRUB. +

+
+
+

All hosts will have an account called demo with password fai. The +root account also has the password fai.

+

If the FAI flag menu is added, instead of using the host name for +determing the type of installation, a menu is presented, and the user +can choose a profile for the installation.

+
+
+

Configure the network daemons

+

For booting the install client via PXE, the install server needs a DHCP and a +TFTP daemon running. The package fai-quickstart has already installed the +software packages for those daemons. Additionally the package of the NFS +server for exporting the nfsroot and the config space was installed.

+
+

Configuration of the DHCP daemon

+

Ideally, your faiserver should also be your DHCP server. If that is +not the case, instruct the admin responsible of the DHCP server to +configure it according to this section. Optionally, it is possible to +avoid that by using the [autodiscover] feature released in FAI 5.0.

+

An example for dhcpd.conf(5) is provided with the fai-doc +package. Start using this example and look at all options used therein.

+
+
+
# cp /usr/share/doc/fai-doc/examples/etc/dhcpd.conf /etc/dhcp/
+
+

The only FAI specific information inside this configuration file is to +set filename (DHCP option 67) to fai/pxelinux.0 and to set +next-server (DHCP option 66, also called TFTP server name) and +server-name to the name of your install server. All other +information is only network related data, which is used in almost all +DHCP configurations. Adjust these network parameters to your local +needs.

+
+
+
deny unknown-clients;
+option dhcp-max-message-size 2048;
+use-host-decl-names on;
+
+subnet 192.168.33.0 netmask 255.255.255.0 {
+   option routers 192.168.33.250;
+   option domain-name "my.example";
+   option domain-name-servers 192.168.33.250;
+   option time-servers faiserver;
+   option ntp-servers faiserver;
+   server-name faiserver;
+   next-server faiserver;
+   filename "fai/pxelinux.0";
+}
+
+

If you make any changes to the DHCP configuration, you must +restart the daemon.

+
+
+
# invoke-rc.d isc-dhcp-server restart
+
+

If you have multiple network interfaces, you +can define on which interface the server will listen in +/etc/default/isc-dhcp-server. By default, the DHCP daemon writes its +log messages to /var/log/daemon.log.

+
+
+

Adding a host entry to DHCP

+

The MAC address is given by the hardware of the network card. For each +install client you collect its MAC address and to map it to an IP address and to a host +name. First, we add the IP address and the hostname to /etc/hosts +
[You may also add this into your Domain Name System (DNS)]
.

+
+
+
192.168.33.100    demohost
+
+

The mapping from the MAC address to the IP address is done in the +dhcpd.conf file. Here, we add a host entry using the command dhcp-edit(8). +Here you have to replace 01:02:03:AB:CD:EF ith the MAC you have found.

+
+
+
# dhcp-edit demohost 01:02:03:AB:CD:EF
+
+

After calling this command, this is what the host entry in +dhcpd.conf will look like:

+
+
+
host demohost {hardware ethernet 01:02:03:AB:CD:EF;fixed-address demohost;}
+
+
+
+

TFTP

+

Normally, you do not need any changes to the TFTP dameon +configuration. The files which are provided by TFTP are located in +/srv/tftp/fai.

+
+
+

NFS

+

The command fai-setup has already set up the NFS daemon and added +some lines to the configuration file /etc/exports. +It exports the directories using NFS v3.

+
+
+
+

Creating the PXELINUX configuration

+

The last step before booting your client for the first time +is to specify what configuration the client should boot when doing PXE +boot. We use the command fai-chboot(8) to create a pxelinux +configuration for each install client. This includes information about +the kernel, the initrd, the config space and some boot parameters. You +should read the manual page, which gives you some good examples. +Here’s the command for starting the installation for the host demohost.

+
+
+
$ fai-chboot -IFv -u nfs://faiserver/srv/fai/config demohost
+
+Booting kernel vmlinuz-4.19.0-5-amd64
+ append initrd=initrd.img-4.19.0-5-amd64 ip=dhcp
+   FAI_FLAGS=verbose,sshd,createvt FAI_CONFIG_SRC=nfs://faiserver/srv/fai/config
+
+demohost has 192.168.33.100 in hex C0A82164
+Writing file /srv/tftp/fai/pxelinux.cfg/C0A82164 for demohost
+
+

At this point, you should have a working faiserver setup and your clients should boot into FAI and be able to install one of the examples.

+

In the following section, you can read about planning your installation, tailoring your configuration space to your particular needs and extending FAI using hooks.

+
+
+

Custom server

+

The faiserver and its setup is by no means static. It is possible to customize and extend your server. For this, please refer to the [Customizing your install server setup] section in [advanced].

+
+
+
+
+

Plan your installation

+
+

Before starting your installation, you should invest a lot of time into +planning your installation. Once you’re happy with your installation +concept, FAI can do all the boring and repetitive tasks to turn your +plans into reality. FAI can’t do good installations if your concept is +imperfect or lacks some important details. Start planning the +installation by answering the following questions:

+
    +
  • +

    +Will I create a Beowulf cluster, or do I have to install some desktop machines? +

    +
  • +
  • +

    +What does my LAN topology look like? +

    +
  • +
  • +

    +Do I have uniform hardware? Will the hardware stay uniform in the future? +

    +
  • +
  • +

    +Does the hardware need a special kernel? +

    +
  • +
  • +

    +How should the hosts be named? +

    +
  • +
  • +

    +How should the local hard disks be partitioned? +

    +
  • +
  • +

    +Which applications will be run by the users? +

    +
  • +
  • +

    +Do the users need a queuing system? +

    +
  • +
  • +

    +What software should be installed? +

    +
  • +
  • +

    +Which daemons should be started, and what should the configuration for these look like? +

    +
  • +
  • +

    +Which remote file systems should be mounted? +

    +
  • +
  • +

    +How should backups be performed? +

    +
  • +
+

You also have to think about user accounts, printers, a mail system, +cron jobs, graphic cards, dual boot, NIS, NTP, timezone, keyboard +layout, exporting and mounting directories via NFS and many other +things. So, there’s a lot to do before starting an installation. And +remember that knowledge is power, and it’s up to you to use +it. Installation and administration is a process, not a product. FAI +can’t do things you don’t tell it to do.

+

You don’t need to start from scratch. Look at the files and scripts in +the configuration space. There are a lot of things you can use for +your own installation. A good paper called "Bootstrapping an +Infrastructure" with more aspects of building an infrastructure is +available at http://www.infrastructures.org/papers/bootstrap/bootstrap.html

+
+

The configuration space and its subdirectories

+

The configuration space is the collection of information about how exactly +to install a client. The central configuration space for all install +clients is located on the install server in /srv/fai/config and its +subdirectories. This will be mounted by the install clients to +/var/lib/fai/config. The main installation command fai(8) uses all +these subdirectories in the order listed except for hooks.

+
+
+class/ +
+
+

+Scripts and files to +define classes and variables. +

+
+
+disk_config/ +
+
+

+Configuration files for disk partitioning, software RAID, LVM and file system creation. +

+
+
+basefiles/ +
+
+

+Normally the file base.tar.xz (located inside the nfsroot) is extracted on the install +client after the new file systems are created and before package are +installed. This is a minimal base image, created right after calling +debootstrap during the creation of the nfsroot on the install +server. If you want to install another distribution than the nfsroot +is, you can put a tar file into the subdirectory basefiles/ and name +it after a class. Then the command ftar(8) is used to extract the +tar file based on the classes defined. Thus the file has to be named CLASS.tar.xz not CLASS.base.tar.xz. This is done in task +extrbase. Use this if you want to install another distribution or +version than that running during the installation. +

+

This basefile can also be received based on FAI classes via HTTP/HTTPS or FTP +by defining the variable FAI_BASEFILEURL. FAI will download a file +CLASSNAME.tar.xz (or tgz, or tar.gz,…) from this URL, if CLASSNAME +matches a FAI class.

+

Example:

+
+
+
+
+
FAI_BASEFILEURL=https://fai-project.org/download/basefiles/
+
+

The folder must support directory listing. FAI will not probe for potentially matching files.

+

See chapter [otherdists] for how to install different distributions.

+
+
+debconf/ +
+
+

+This directory holds all debconf(7) data. The format is the same +that is used by debconf-set-selections(1). +

+
+
+package_config/ +
+
+

+Files with class names contain lists of software packages to be +installed or removed by install_packages(8). Files named +<CLASS>.gpg are added to the list of keys used by apt +for trusted package repositories. +

+
+
+pkgs/ +
+
+

+This directory can contain subdirectories named by classes. You can +put .deb or .rpm files into these subdirectories. FAI will then +install these packages without the need of creating the metadata of a +package repository. +

+
+
+scripts/ +
+
+

+Scripts for your local site customization. Used by fai-do-scripts(1). +

+
+
+files/ +
+
+

+Files used by customization scripts. Most files are located in a +subtree structure which reflects the ordinary directory tree. For +example, the templates for nsswitch.conf are located in +$FAI/files/etc/nsswitch.conf and are named according to the classes +that they should match: $FAI/files/etc/nsswitch.conf/NIS is the +version of /etc/nsswitch.conf to use for the NIS class. Note that +the contents of the files directory are not automatically copied to +the target machine, rather they must be explicitly copied by +customization scripts using the fcopy(8) command. +

+
+
+hooks/ +
+
+

+Hooks are user defined programs or scripts, which are called during +the installation process. They can extend or replace the default tasks. +The file name must be of format taskname.CLASSNAME[.sh]. +A hook called updatebase.DEBIAN is executed prior to the task updatebase +and only if the install client belongs to the class DEBIAN. +

+
+
+
+
+

Defining classes

+

There are different possibilities to define classes:

+
    +
  1. +

    +Some default classes are defined for every host: DEFAULT, LAST and its host name. +

    +
  2. +
  3. +

    +Classes may be listed within a file (by default in class/<hostname>) +

    +
  4. +
  5. +

    +Classes may be dynamically defined by scripts. +

    +
  6. +
+

The last option is a very nice feature, since these scripts will +define classes in a very flexible way. For example, several classes +may be defined only if certain hardware is identified or a class is +defined depending on the network subnet information.

+

All names of classes, except the host name, are written in +uppercase. They must not contain a hyphen, a hash, a semicolon or a +dot, but may contain underscores and digits.

+

The task defclass calls the command fai-class(1) to define +classes. All scripts matching ^[0-9][0-9]* (they start with two +digits) in the subdirectory +$FAI/class are executed for defining classes. Everything that is printed +to STDOUT is automatically defined as a class. For more +information on defining class, read the manual pages for +fai-class(1). The script 50-host-classes (see below a stripped +version) is used to define classes depending on the host name.

+
+
+
# use a list of classes for our demo machines
+case $HOSTNAME in
+    demohost)
+        echo "FAIBASE GRUB DEMO" ;;
+    xfcehost)
+        echo "FAIBASE GRUB DEMO XORG XFCE LVM";;
+    faiserver)
+        echo "FAIBASE DEBIAN DEMO FAISERVER" ;;
+    ubuntuhost)
+        echo "FAIBASE DEBIAN DEMO UBUNTU JAMMY JAMMY64 XORG";;
+    *)
+        echo "FAIBASE DEBIAN DEMO" ;;
+esac
+
+

Host names should rarely be used for the configuration files in the +configuration space. Instead, a class should be defined and then added +for a given host. This is because most of the time the configuration +data is not specific for one host, but can be shared among several +hosts.

+

The order of the classes is important because it defines the priority +of the classes from low to high.

+
+
+

Defining variables

+

The task defvar defines the variables for the install +client. Variables are defined by scripts in class/*.var. All global +variables can be set in DEFAULT.var. For groups of hosts use +a class file. For a single host use the file $HOSTNAME .var. Also +here, it’s useful to study all the examples.

+

The following variables are used in the examples and may also be +useful for your installation:

+
+
+FAI_ACTION +
+
+

+Set the action FAI should perform. Normally this is done by +fai-chboot(8). If you can’t use this command, define this variable +i.e. in the script LAST.var. +

+
+
+FAI_ALLOW_UNSIGNED +
+
+

+If set to 1, FAI allows the installation of packages from unsigned +repositories. +

+
+
+CONSOLEFONT +
+
+

+Is the font which is loaded during installation by setfont(8). +

+
+
+KEYMAP +
+
+

+Defines the keyboard map files in /usr/share/keymaps and +$FAI/files. You don’t need to specify the full path, since this file +will be located automatically. +

+
+
+ROOTPW +
+
+

+The encrypted root password for the new system. You can use +crypt(3), md5 and other hash types for the password. Use +mkpasswd(1) for creating the hash for a certain password. +For example, to generate a md5 hash for the password use +

+
+
+
+
+
$ echo "yoursecrectpassword" | mkpasswd -m yescrypt -s
+
+
+
+UTC +
+
+

+Set hardware clock to UTC if UTC=yes. Otherwise set clock to local +time. See clock(8) for more information. +

+
+
+TIMEZONE +
+
+

+Is the file relative to /usr/share/zoneinfo/ which indicates your +time zone. E.g.: TIMEZONE=Europe/Berlin. +

+
+
+MODULESLIST +
+
+

+A list of kernel modules which are loaded during boot of the new system (written to +/etc/modules). +

+
+
+
+
+

Hard disk configuration

+

The tool setup-storage(8) reads a file in $FAI/disk_config for the +disk configuration. This file describes how +all the local disks will be partitioned, which file system types should be +created (like ext3/4, xfs, btrfs), and where they are +mounted to. You can also create software RAID and LVM setups using this +config file. It’s also possible to preserve the disk layout or to +preserve the data on certain partitions.

+

During the installation process all local file systems are mounted +relative to /target. For example if you specify the mount point +/home in a disk configuration file this will be the directory +/target/home during the installation process and will become /home +for the new installed system.

+
+
+

Extract base file

+

A base file is only needed when installing a distribution which is +different from the one in the nfsroot.

+
+
+

Debconf preseeding

+

You can use the format described in debconf-set-selections(1).

+
+
+

Access to the package repository

+

FAI supports http, https and NFS for accessing the package mirror. Set +the variable $FAI_DEBMIRROR for using NFS.

+
+
+

Software package configuration

+

Before installing packages, FAI will add the content of all files +named package_config/class.gpg to the list of apt keys. If your local +repository is signed by your keyid AB12CD34 you can easily add this key, +so FAI will use it during installation. Use this command for creating +the CLASS.gpg file:

+
+
+
faiserver$ gpg --export AB12CD34 > /srv/fai/config/package_config/MYCLASS.gpg
+
+

The script install_packages(8) installs the selected software +packages. It reads all configuration files in $FAI/package_config +whose file name matches a defined class. The syntax is very simple.

+
+
+
# an example package class
+
+PACKAGES taskinst
+german
+
+PACKAGES install-norec
+adduser nmap
+less zstd
+
+PACKAGES remove
+gpm xdm
+
+PACKAGES install GRUB_PC
+grub-pc
+
+

Comments are starting with a hash (#) and are ending at the end of the +line. Every package command begins with the word PACKAGES followed by a +command name, which maps to a different package tool like apt-get, +aptitude or dnf for e.g. The command defines which command will be used to +install the packages named after this command. The list of all +available commands can be listed using install_packages -H. +Supported package tools are: apt, apt-get, aptitude, smart, yast, +dnf, rpm, zypper

+
+
+hold +
+
+

+Put a package on hold. This package will not be handled by dpkg, e.g +not upgraded. +

+
+
+install +
+
+

+Install all packages (using apt-get) that are specified in the following lines. If a +hyphen is appended to the package name (with no intervening space), +the package will be removed, not installed. All package names are +checked for misspellings. Any package which does not exist, will be +removed from the list of packages to install. So be careful not to +misspell any package names. +

+
+
+install-norec +
+
+

+Like install but without installing the recommended packages. +

+
+
+remove +
+
+

+Remove all packages that are specified in the following lines. Append +a + to the package name if the package should be installed. +

+
+
+taskinst +
+
+

+Install all packages belonging to the tasks that are specified in the +following lines using tasksel(1). You can also use aptitude for +installing tasks. +

+
+
+aptitude +
+
+

+Install all packages with the command aptitude. This will be the +default in the future and may replace apt-get and taskinst. Aptitude +can also install task packages. +

+
+
+aptitude-r +
+
+

+Same as aptitude with option --with-recommends. +

+
+
+unpack +
+
+

+Download package and unpack only. Do not configure the package. +

+
+
+dselect-upgrade +
+
+

+Set package selections using the following lines and install or remove +the packages specified. These lines are the output of the command +dpkg --get-selections. It’s not recommended to use this format, +since you are also specifying all packages which are only installed +because of a dependency or a recommends. It’s better just to specify +the pacakge you like to have, and to let FAI (and apt-get) resolve the +dependencies. +

+
+
+

Multiple lines with lists of space separated names of packages follow +the PACKAGES lines. All dependencies are resolved. Packages with +suffix - (eg. lilo-) will be removed instead of installed. The +order of the packages doesn’t matter. If you like to install +packages from another release than the default, you can append the +release name to the package name like in +openoffice.org/etch-backports. You can also specify a certain +version like apt=0.3.1. More information on these features are +described in aptitude(8).

+

You can specify additional parameters for the package manager adding +key=value after PACKAGES <command>. Currently we support +release=<name> which will add -t <name> when installing packages.

+

Example:

+
+
+
PACKAGES install-norec release=testing
+nvidia-smi
+
+

This will install the nvidia-smi package from the testing release, +including the dependencies. Don’t forget to add an entry into +sources.list. You may also want to adjust the apt pinning (see +apt_references(5)).

+

A line which contains the PRELOADRM commands, downloads a file using +wget(1) into a directory before installing the packages. Using the +file: URL, this file is copied from $FAI_ROOT to the download +directory. For example the package realplayer needs an archive to +install the software, so this archive is downloaded to the directory +/root. After installing the packages this file will be removed. If +the file shouldn’t be removed, use the command PRELOAD instead.

+

You can add an arbitrary boolean expression using FAI classes to +define when the list of packages should be installed. Here, the +packages are only installed if the class XORG is defined but the class +MINT is not defined.

+

Example:

+
+
+
PACKAGES install UBUNTU && XORG && ! MINT
+ubuntu-standard
+ubuntu-desktop
+
+

The old way of adding some logic in the PACKAGES lines is still supported: +It’s possible to append a list of class names after the command for +apt-get. So this PACKAGES command will only be executed when at least +one of the corresponding classes is defined (logical OR). So you can +combine many small files into the file DEFAULT.

+

If you want to remove a package name from a certain class was part of +this class before, you should not remove the package name from the +class file, but instead append a dash (-) to it. This will make sure +that the package is removed during a softupdate on hosts which were +installed using the old class definition which included this package +name.

+

If you specify a package that does not exist this package will be +removed automatically from the installation list only if the command install is used.

+

The concept of classes priority allows a higher priority class (one +that comes later in the sequence of classes) to override the selection +of packages of a lower priority class. For this to work correctly, +the higher priority class must use the same PACKAGES command (e.g. +PACKAGES install-norec instead of just PACKAGES install) as the one +used by the class it is trying to override. This is useful to suppress +installation of a package, for example, to avoid installing the linuxlogo +package installed by class FAIBASE:

+
+
+
# example of how to override:
+#
+# On FAIBASE we have:
+#    PACKAGES install-norec
+#    linuxlogo
+#
+# We want to _not_ install linuxlogo, and it is in a
+# install-norec section, so we must also use install-norec.
+
+PACKAGES install-norec
+linuxlogo-
+
+
+
+

Customization scripts

+

The command fai-do-scripts(1) is called to execute all scripts in +this directory. If a directory with a class name exists, all scripts +matching ^[0-9][0-9]* are executed in alphabetical order. So it’s +possible to use scripts of different languages (shell, cfengine, +Perl, Python, Ruby, expect,..) for one class.

+

Thoses scripts write their output to sripts.log. The file status.log +contains the names of all scripts executed and their exit status.

+
+

Shell scripts

+

Most scripts are Bourne shell scripts. Shell scripts are useful if the +configuration task only needs to call some shell commands or create a +file from scratch. In order not to write many short scripts, it’s +possible to use the ifclass command for testing if certain classes +are defined.

+
+
+
ifclass -o A B C
+
+

checks if one of classes A, B or C are defined. Using -a (logical +AND) checks if all classes of a list are defined. The command ifclass +C checks if only class C is defined.

+

For copying files with classes, use the command +fcopy(8). If you want to extract an archive using classes, use +ftar(8). For appending lines to a configuration file use ainsl(1) +instead of just echo string >> filename.

+

FAI also supports zsh(1) scripts during the +customization task. Within scripts, the variable $classes holds a space +separated list with the names of all defined classes.

+
+
+

Cfengine scripts

+

CFEngine has a rich set of functions to edit existing configuration +files, e.g LocateLineMatching, ReplaceAll, InsertLine, +AppendIfNoSuchLine, HashCommentLinesContaining. But it can’t handle +variables which are undefined. If a variable is undefined, the whole +cfengine script will abort.

+

More information can be found in the manual page cfengine(8) or at +the cfengine homepage https://www.cfengine.com.

+
+
+
+

Hooks

+

Hooks let you specify functions or programs which are run at certain +steps of the installation process. Before a task is called, +FAI searches for existing hooks for this task and executes them. As +you might expect, classes are also used when calling hooks. Hooks are +executed for every defined class. You only have to create the hook +with the name for the desired class and it will be used. If several +hooks for a task exists, they are called in the order defined by the +classes. If debug is included in $FAI_FLAG the option -d is +passed to all hooks, so you can debug your own hooks. If some default +tasks should be skipped, use the subroutine skiptask and a list of +default tasks as parameters. In the examples provided, the hooks of +the class CENTOS skips some Debian specific tasks.

+

The directory $FAI/hooks/ contains all hooks. A hook is an executable +file following the naming scheme taskname.CLASSNAME[.sh] (e.g. +repository.CENTOS or 'savelog.LAST.sh). The +task name specifies which task to precede executing this hook, if the +specified class is defined for the installing client. See section +[tasks] for a complete list of default tasks that can be used.

+

A hook of the form hookprefix.classname can’t define variables for +the installation script, because it’s a subprocess. But you can use +any binary executable or any script you wrote. Hooks that have the +suffix .sh (e.g. partition.DEFAULT.sh) must be Bourne +shell scripts and are sourced. So it’s possible to redefine variables +for the installation scripts.

+

In the first part of FAI, all hooks with prefix confdir are called. +Those hooks can not be located in the config space, since it’s not yet +available. Therefore these hooks are the only hooks located in +$nfsroot/$FAI/hooks on the install server. All other hooks are +found in $FAI_CONFIGDIR/hooks on the install server.

+

All hooks that are called before classes are defined can only use the +following classes: DEFAULT $HOSTNAME LAST. If a hook for class +DEFAULT should only be called if no hook for class $HOSTNAME is +available, insert these lines to the default hook:

+
+
+
hookexample.DEFAULT:
+
+#! /bin/sh
+
+# skip DEFAULT hook if a hook for $HOSTNAME exists
+scriptname=$(basename $0 .DEFAULT)
+[-f $FAI/hooks/$scriptname.$HOSTNAME ] && exit
+# here follows the actions for class DEFAULT
+.
+.
+
+

Some examples for what hooks could be used:

+
    +
  • +

    +Load kernel modules before classes are defined in $FAI/class. +

    +
  • +
  • +

    +Send an email to the administrator if the installation is finished. +

    +
  • +
  • +

    +Install a diskless client and skip local disk partitioning. +

    +
  • +
  • +

    +Have a look at hooks/debconf.IMAGE for how to clone a machine using a file system image. +

    +
  • +
+
+
+

FAI flags

+

The variable $FAI_FLAGS contains a space separated list of +flags. Flags are normally defined in the pxelinux.cfg file which +should be created by fai-chboot(1). The following flags are known:

+
+
+verbose +
+
+

+Create verbose output during installation. This should always be the +first flag, so consecutive definitions of flags will be verbosely +displayed. +

+
+
+debug +
+
+

+Create debug output. No unattended installation is performed. During +package installation you have to answer all questions of the +postinstall scripts on the client’s console. A lot of debug +information will be printed out. This flag is only useful for FAI +developers. +

+
+
+sshd +
+
+

+Start the ssh daemon to enable remote logins. +You can then log in as root to all install clients during the +installation. The default password is fai and can be changed by +setting FAI_ROOTPW in nfsroot.conf(5). To log in from your server +to the install client (named demohost in this example) use: +

+
+
+
+
+
$ ssh root@demohost
+Warning: Permanently added 'demohost,192.168.33.100' to the list of known hosts.
+root@demohost's password:
+
+

This is only the root password during the +installation process, not for the new installed system. You can also +log in without a password when using $SSH_IDENTITY.

+
+
+createvt +
+
+

+Create two virtual terminals and execute a bash if ctrl-c is typed +in the console terminal. The additional terminals can be accessed by +typing Alt-F2 or Alt-F3. Otherwise, no terminals are available and +typing ctrl-c will reboot the install client. Setting this flag is +useful for debugging. If you want an installation which should not be +interruptible, do not set this flag. +

+
+
+menu +
+
+

+This enables a user menu for selecting a profile. All files +class/*.profile are read and a curses based menu will be created. +

+
+
+screen +
+
+

+Run FAI inside a screen(1) session. The session is called FAI. +If you log in via ssh from remote you can attach to the session using: +

+
+
+
+
+
$ screen -x
+
+
+
+tmux +
+
+

+Run FAI inside a tmux(1) session. The session is called FAI. +If you log in via ssh from remote you can attach to the session using: +

+
+
+
+
+
$ tmux attach
+
+
+
+reboot +
+
+

+Reboot the install client after installation is finished without +typing RETURN on the console. If this flag is not set, and error.log +contains anything, the install client will stop and wait that you +press RETURN. If no errors occurred, the client will always reboot +automatically. +

+
+
+halt +
+
+

+Halt the install client at the end of the installation, instead of +rebooting into the new system. +

+
+
+initial +
+
+

+Used by setup-storage(8). Partitions marked with preserve_reinstall +are preserved unless this flag is set. Often, this flag is set in a +file class/*.var by using setting flag_initial=1. +

+
+
+
+
+
+
+

FAI installs your plan

+
+
+

The early part of an installation

+

After the kernel has booted, it mounts the root file system via NFS +from the install server and starts the script +/usr/sbin/fai
[Since the root file system on the clients is mounted via +NFS, fai is located in +/srv/fai/nfsroot/usr/sbin on the install +server.]
. This script controls the sequence of the +installation. No other scripts in /etc/init.d/ are used.

+

The configuration space is made available via the configured method +(an NFS mount by default) from the install server to the path defined +in $FAI
[$FAI is an internal variable used by the FAI +scripts. By default the path is /var/lib/fai/config.]

+
+
+

Boot messages

+

When booting the install client from network card with PXE you will see some +messages like this:

+
+
+
Managed PC Boot Agent (MBA) v4.00
+Pre-boot eXecution Environment (PXE) v2.00
+DHCP MAC ADDR: 00 A2 A3 04 05 06
+DHCP.../
+
+CLIENT MAC ADDR: 00 A2 A3 04 05 06  GUID: 3D6C4552
+CLIENT IP: 192.168.33.100 MASK: 255.255.255.0  DHCP IP: 192.168.33.250
+GATEWAY IP: 192.168.33.1
+
+!PXE entry point found (we hope) at 9854:0106 via plan A
+UNDI code segment at: 9854 len 5260
+UNDI data segment at: 921D len 63A2
+Getting cached packet  01 02 03
+My Ip address seems to be C0A82164 192.168.33.100
+ip=192.168.33.100:192.168.33.250:192.168.33.1:255.255.255.0
+BOOTIF=01-00-A2-A3-04-05-06
+SYSUUID=
+TFTP prefix: fai/
+Trying to load pxelinux.cfg/C0A82164
+
+Loading vmlinuz-6.1.0-17-amd64..................
+Loading initrd.img-6.1.0-17-amd64......................ready.
+
+

At this point the install client has successfully received the network +config via DHCP and the kernel and initrd via TFTP. It now boots the +Linux kernel and the initrd. If everything went right, the initrd +mounts the nfsroot
[/srv/fai/nfsroot from the install +server via NFS]
and the FAI scripts are started. The first +thing you see is the red FAI copyright message.

+
+
+
             -------------------------------------------------
+                   Fully Automatic Installation  -  FAI
+
+                   6.2           (c) 1999-2024
+                   Thomas Lange  <lange@cs.uni-koeln.de>
+             -------------------------------------------------
+
+Calling task_confdir
+Kernel currently running: Linux 6.1.0-17-amd64 x86_64 GNU/Linux
+Kernel parameters: BOOT_IMAGE=vmlinuz-6.1.0-17-amd64 initrd=initrd.img-6.1.0-17-amd64 \
+  ip=dhcp rw root=192.168.33.250:/srv/fai/nfsroot rootovl FAI_FLAGS=verbose,sshd,createvt
+  FAI_ACTION=install FAI_CONFIG_SRC=nfs://faiserver/srv/fai/config
+Reading /tmp/fai/boot.log
+FAI_FLAGS: verbose sshd createvt
+Monitoring to server faiserver enabled.
+FAI_CONFIG_SRC is set to nfs://faiserver/srv/fai/config
+Configuration space faiserver:/srv/fai/config mounted to /var/lib/fai/config
+Source hook: setup.DEFAULT.sh
+setup.DEFAULT.sh     OK.
+Calling task_setup
+FAI_FLAGS: verbose sshd createvt
+Press ctrl-c to interrupt FAI and to get a shell
+Starting FAI execution - 20240117_194012
+Calling task_defclass
+fai-class: Defining classes.
+Executing /var/lib/fai/config/class/01-classes.
+01-classes           OK.
+Executing /var/lib/fai/config/class/10-base-classes.
+10-base-classes      OK.
+Executing /var/lib/fai/config/class/20-hwdetect.sh.
+ens3             UP             52:54:00:11:23:01 <BROADCAST,MULTICAST,UP,LOWER_UP>
+ens3             UP             192.168.33.101/24 fe80::5054:ff:fe11:2301/64
+New disklist: vda
+20-hwdetect.sh       OK.
+Executing /var/lib/fai/config/class/40-parse-profiles.sh.
+40-parse-profiles.sh OK.
+Executing /var/lib/fai/config/class/41-warning.sh.
+41-warning.sh        OK.
+Executing /var/lib/fai/config/class/50-host-classes.
+50-host-classes      OK.
+Executing /var/lib/fai/config/class/60-misc.
+60-misc              OK.
+Executing /var/lib/fai/config/class/85-efi-classes.
+85-efi-classes       OK.
+List of all classes:  DEFAULT LINUX AMD64 DHCPC FAIBASE DEBIAN DEMO GRUB_PC demohost2 LAST
+
+

You can also see the list of FAI classes, that are defined for this +host. This list is very important for the rest of the installation.

+

The first task is called confdir, which is responsible for getting +access to the config space. Here, we use an NFS mount from the install +server as you can see on the console (and later in the logs).

+
+
+
FAI_CONFIG_SRC is set to nfs://faiserver/srv/fai/config
+Configuration space faiserver:/srv/fai/config mounted to /var/lib/fai/config
+
+

Before the installation is started ($FAI_ACTION=install) the computer +beeps three times. So, be careful when you hear three beeps but you do +not want to perform an installation and let FAI erase all yout data on +the local disk!

+
+
+

Rebooting the computer into the new system

+

For rebooting the computer during or at the end of the installation you +should use the command faireboot in favour of the normal reboot command. +Use faireboot also if logged in from remote. If the installation +hasn’t finished, use faireboot -s, so the log files are also copied +to the install server.

+

If the installation has finished successfully, the computer should boot a +small Debian system. You can login as user demo or root with password fai.

+
+
+

Starting FAI (task confdir)

+

After the install client has booted only the script /usr/sbin/fai is +executed. It will do some minimal initialization. The variable +$FAI_CONFIG_SRC
[It is defined on the kernel command line]
+is used to get access to the FAI configuration space which is then +available in the directory $FAI
[/var/lib/fai/config]
. FAI +will not proceed without the config space.

+

You can access the config space using different methods. Supported +methods are: nfs:, file:, cvs:, svn: git:, hg:, http: and detect:. +See fai.conf(5) for a detailed description of these methods.

+
+
+

Defining classes and variables (tasks defclass and defvar)

+

The command fai-class(1) executes scripts in $FAI/class for defining +classes. If the scripts write a string to stdout, this will be defined +as a class. Read all the details in the man page of fai-class(1).

+

After defining the classes, every file matching .var with a prefix +which matches a defined class is sourced to define variables. It must +contain valid shell code.

+
+
+

Partitioning local disks, creating file systems (task partition)

+

For the disk partitioning exactly one disk configuration file from +$FAI/disk_config is selected using classes.

+

The format of the disk configuration is similar to a fstab file.

+

The partitioning tool setup-storage(8) performs all commands +necessary for creating the disk partition layout, software RAID, LVM +and for creating the file systems. Disks and partitions may easily be +referenced by disk1.1, disk2.4 etc. Read the manual page of +setup-storage(8) for a detailed description and some examples of the +format.

+
+
+

Debconf preseeding (task debconf)

+

Files in $FAI/debconf are used for the usual debconf(7) preseeding +if the file names match a class name.

+
+
+

Installing software packages (task instsoft)

+

The command install_packages(8) reads the config files from +$FAI/package_config in a class based manner and installs software +packages on the new file system.

+

It installs the packages using apt-get(8), aptitude(1), yum or other +package tools without any manual interaction needed. Package +dependecies are also resolved by the package tools.

+

The format of the configuration files is described in [packageconfig].

+

Additionaly FAI will install packages (.deb or .rpm') from the +directories $FAI/pkgs/<CLASSNAME>.

+
+
+

Site specific customization (task configure)

+

Often the default configurations of the software packages will not +meet your site-specific needs. You can call arbitrary scripts which +adjust the system configuration. Therefore the command +fai-do-scripts(1) executes scripts in $FAI/scripts in a class +based manner. It is possible to have several scripts of different +types (shell, cfengine, …) to be executed for one class.

+

The default set of scripts in $FAI/scripts include examples for +installing Debian and Rocky Linux machines. They set the root password, add +a user account (set by '$username, default to demo), set the timezone, configure the network for DHCP +or using a fixed IP address, setup grub and more. +They should do a reasonable job for your installation. You can edit +them or add new scripts to match your local needs.

+

More information about these scripts are described in [cscripts].

+
+
+

Saving log files (task savelog)

+

When all tasks are finished, the log files are written to +/var/log/fai/$HOSTNAME/install/ +
[/var/log/fai/localhost/install/ is a link to this +directory.]
on the new system and to the account on the install server +if $LOGUSER is defined (you have to enable this in +/srv/fai/config/class/FAIBASE.var). It is also possible to specify +another host as log saving destination through the variable +$LOGSERVER. If $LOGSERVER is not defined, FAI uses the variable +$SERVER which is only defined during an initial installation (by +get-boot-info).

+

Additionally, two symlinks will be created to indicated the last +directory written to. The symlink last points to the log directory +of the last FAI action performed. The symlinks last-install and +last-sysinfo point to the directory of the last corresponding +action. By default log files will be copied to the log +server using scp. You can use the variable $FAI_LOGPROTO in file +fai.conf(5) to choose another method for saving logs to the remote +server. Here’s an example of the symlink structure:

+
+
+
lrwxrwxrwx   1 fai fai   23 Dec  2  2013 last-sysinfo -> sysinfo-20131202_161237
+drwxr-xr-x   2 fai fai 4096 Dec  2  2013 sysinfo-20131202_161237
+drwxr-xr-x   2 fai fai 4096 Feb 14  2014 install-20140214_142150
+drwxr-xr-x   2 fai fai 4096 Dec  2 11:47 install-20141202_113918
+lrwxrwxrwx   1 fai fai   23 Dec  4 13:22 last-install -> install-20141204_131351
+lrwxrwxrwx   1 fai fai   23 Dec  4 13:22 last -> install-20141204_131351
+drwxr-xr-x   2 fai fai 4096 Dec  4 13:22 install-20141204_131351
+
+

Examples of the log files can be found at https://fai-project.org/logs.

+
+
+

Reboot the new installed system

+

Before rebooting, the install client calls fai-chboot -d <hostname> +on the install server, to disable its own PXELINUX +configuration. Otherwise, it would restart the installation during the +next boot. Normally this should boot the new installed system from +its second boot device, the local hard disk.

+

At the end, the system is automatically rebooted if "reboot" was added to +$FAI_FLAGS.

+
+
+
+
+

Advanced FAI topics

+
+
+

Checking parameters received from DHCP servers

+

If the install client boots you can check +if all information from the DHCP daemon are received +correctly. The received information is written to +/tmp/fai/boot.log. An example of the result of a DHCP request can be +found in the sample log files.

+
+
+

Monitoring multiple client installations

+

You can monitor the installation of all install clients with the +command fai-monitor(8). All clients check if this daemon is running +on the install server (or the machine defined by the variable +$monserver). Each time a task starts or ends, a message is sent. The +FAI monitor daemon prints this messages to standard output. There’s +also a graphical frontend available, called fai-monitor-gui(1).

+
+
+
$  fai-monitor | fai-monitor-gui - &
+
+
+
+

Collecting Ethernet addresses for multiple hosts

+

You have to collect all Ethernet (MAC) addresses of the install +clients and assign a host name and IP address to each client. To +collect the MAC addresses, boot your install clients. +You can already do this before any DHCP daemon is running in your +subnet. They will fail to boot (because of the missing DHCP or missing TFTP), +but you can still collect the MAC addresses.

+

While the install clients are booting, they send broadcast packets to the +LAN. You can log the MAC addresses of these hosts by running the +following command simultaneously on the server:

+
+
+
faiserver# tcpdump -qtel broadcast and port bootpc >/tmp/mac.list
+
+

After the hosts have been sent some broadcast packets abort tcpdump +by typing ctrl-c. You get a list of all +unique MAC addresses with these commands:

+
+
+
faiserver$ perl -ane 'print "\U$F[0]\n"' /tmp/mac.list|sort|uniq
+
+

After that, you only have to assign these MAC addresses to host names +and IP addresses (/etc/ethers and /etc/hosts or corresponding NIS +maps). With this information you can configure your DHCP +daemon (see the section [bootdhcp]).
[I recommend to write the MAC +addresses (last three bytes will suffice if you have network cards +from the same vendor) and the host name in the front of each chassis.]

+
+

Debugging the network traffic

+

If the client can’t successfully boot from the network card, use +tcpdump(8) to look for Ethernet packets between the install server +and the client. Search also for entries in several log files made by +tftpd(8) and dhcpd(8) :

+
+
+
faiserver$ egrep "tftpd|dhcpd" /var/log/*
+
+
+
+
+

Details of PXE booting

+

Here we describe the details of PXE booting, which are only needed if +you have problems when booting your install clients.

+

Almost all modern bootable network cards support the PXE boot environment. +PXE is the Preboot Execution Environment. +This requires the PXELINUX bootloader and a special version of the TFTP +daemon, which is available in the Debian packages pxelinux and +tftpd-hpa. PXE booting also needs a DHCP server, so that the network +card can configure its IP parameters. This is the sequence of a PXE boot:

+
    +
  • +

    +Network card of the client sends its MAC address +

    +
  • +
  • +

    +DHCP server replies with IP configuration for the client +

    +
  • +
  • +

    +Network card configures IP +

    +
  • +
  • +

    +Install client gets the pxelinux.0 binary via TFTP +

    +
  • +
  • +

    +Get the pxelinux.cfg/C0A8210C configuration file via TFTP +

    +
  • +
  • +

    +C0A8210C is the IP address of the client in hexadecimal +

    +
  • +
  • +

    +This configuration contains kernel, initrd and additional kernel +command line parameters, which was created by fai-chboot. +

    +
  • +
  • +

    +Get the kernel and initrd via TFTP. +

    +
  • +
+

Example of a pxelinux.cfg file:

+
+
+
default fai-generated
+
+label fai-generated
+kernel vmlinuz-6.1.0-17-amd64
+append initrd=initrd.img-6.1.0-17-amd64 ip=dhcp root=/srv/fai/nfsroot rootovl FAI_FLAGS=verbose,sshd,createvt FAI_CONFIG_SRC=nfs://faiserver/srv/fai/config FAI_ACTION=install
+
+

See /usr/share/doc/syslinux/pxelinux.doc for more detailed +information about PXELINUX. FAI uses the lpxelinux.0 binary which also +supports loading the kernel and initrd via FTP or HTTP. The command +fai-chboot(8) supports this with the option -U.

+
+
+

Customizing your install server setup

+
    +
  • +

    +local/faster package mirror +

    +
  • +
  • +

    +different loguser +

    +
  • +
  • +

    +local root pw inside nfsroot +

    +
  • +
+

The configuration for the FAI package (not the configuration data for +the install clients) is defined in fai.conf(5). Definitions that are +only used for creating the nfsroot are located in +nfsroot.conf(5). Check these important variables in nfsroot.conf +before calling fai-setup or fai-make-nfsroot.

+
+
+FAI_DEBOOTSTRAP +
+
+

+Building the nfsroot uses the command debootstrap(8). It needs the location of a Debian mirror and the +name of the distribution (like bullsseye, bookworm, sid) for which the basic Debian +system should be built. Do not use different distributions here and in +/etc/fai/apt/sources.list. This will create a broken nfsroot. +

+
+
+NFSROOT_ETC_HOSTS +
+
+

+This variable is only needed if the clients do not have access to a DNS server. +This multiline variable is added to /etc/hosts inside the +nfsroot. Then the install clients can access those hosts by name +without using DNS. +

+
+
+

The content of /etc/fai/apt/sources.list is +used by the install server and also by the clients. If your install +server has multiple network cards and different host names for each +card (as for a Beowulf server), use the install server name which is +known by the install clients.

+

If you have problems running fai-setup, they usually stem from +fai-make-nfsroot(8) which is called by former command. Adding -v +gives you a more verbose output which helps you pinpoint the +error. The output is written to +/var/log/fai/fai-make-nfsroot.log.
[For debugging purpose +it may help to enter the chroot environment manually using this +command. faiserver# chroot /srv/fai/nfsroot bash]

+

The setup also creates the account fai (defined by $LOGUSER) if +not already available. So you can add a user before calling +fai-setup(8) using the command adduser(8) and use this as your +local account for saving log files. The log files of all install +clients are saved to the home directory of this account. You should +change the primary group of this +account, so this account has write permissions to /srv/tftp/fai in +order to call fai-chboot for creating the PXE configuration for the hosts.

+

When you make changes to fai.conf, nfsroot.conf the +nfsroot has to be rebuilt by calling fai-make-nfsroot(8). If you +only like to install a new kernel package to the nfsroot add the flags -k or +-K to fai-make-nfsroot. This will not recreate your nfsroot, but +only updates your kernel and kernel modules inside the nfsroot or add +additional packages into the nfsroot.

+
+
+

Creating a FAI CD or and USB stick

+

You can easily create an installation CD (or USB stick) of your +network installation setup. This will perform the same installation +and configuration from CD without the need of the install server. +Therefore you need to create a partial mirror of all Debian packages +needed for your FAI classes (using fai-mirror(1)). Then the command +fai-cd(8) will put this mirror, the nfsroot and the config space +onto a bootable CD. That’s it!

+

To easily create the installation CD, you can use the following command +(for more tuning details see fai-cd(8)):

+
+
+
 faiserver# fai-cd -m <partialMirrorDir> fai-cd.iso
+
+

This installation CD contains all data needed for the +installation. The command fai-cd(8) puts the nfsroot, the +configuration space and a subset of the Debian mirror onto a +CD-ROM. A partial package mirror is created using the command +fai-mirror(1) which contains all packages that are used by the +classes used in your configuration space. A sample ISO image is +available at https://fai-project.org/fai-cd.

+

Using the command dd(1) you can also create a bootable USB +stick by just writing the content of the ISO file to your USB stick +(here the stick is /dev/sdf).

+
+
+
 faiserver# dd if=fai-cd.iso of=/dev/sdf bs=1M
+
+

mk-data-partition is a tool that extends an ISO (that will be copied +to an USB stick) or an USB stick containing an ISO with +an ext4 or exFAT partition and sets the file system label to MY-DATA. +This partition is automatically mounted to /media/data by FAI. +You can copy your own .deb packages into this data partition und the +subdiretories pkgs/<CLASSNAME>. FAI will then install these packages +if the equivalent class is defined.

+

Example how to use mk-data-partition:

+
+
+
# mk-data-partition -s 1G -c faicd-large.iso A B
+
+

The former command creates the data partition of size 1 Gbytes inside +the ISO file and copy directories A and B to it. You can then copy the modified ISO +onto an USB stick.

+

If the ISO is already on the USB stick and if it’s available as +dev/sdf, you can add a data partition of type exFAT will will use +the whole remaining part of the USB stick by using this command:

+
+
+
# mk-data-partition -F /dev/sdf
+
+
+
+

Creating VM disk images using FAI

+

The command fai-diskimage(8) creates disk +images, which can be used with a virtual machine like KVM, VMware, +VirtualBox or a cloud service like OpenStack, GCE, EC2 and others. The +installation process performs the normal FAI tasks on a raw disk +image. After the installation you can boot the disk image and have a +running system. The disk image can also be converted to qcow2 format. +You do not need to setup the FAI nfsroot when only using +fai-diskimage. But you need a basefile in your configuration +space. Setting the variable $FAI_BASEFILEURL will automatically +download an appropriate base file into your config space.

+

Here’s an example how to create a raw disk image for a host called +cloud3, with a small set of software packages:

+
+
+
# export FAI_BASEFILEURL=https://fai-project.org/download/basefiles/
+# fai-diskimage -vu cloud3 -S2G -cDEBIAN,BOOKWORM64,AMD64,FAIBASE,GRUB_PC,DHCPC,DEMO,CLOUD,LAST disk.raw
+
+

This command will create a disk image called ubuntu.qcow2 for a Ubuntu 16.04 desktop +with hostname set to foobar.

+
+
+
# export FAI_BASEFILEURL=https://fai-project.org/download/basefiles/
+# cl=DHCPC,UBUNTU,JAMMY,JAMMY64,AMD64,XORG,LAST
+# fai-diskimage -Nvu foobar -S5G -c$cl ubuntu.qcow2
+
+

You can give disk images a try without installing FAI, if you visit +https://fai-project.org/FAIme/cloud

+
+
+

Creating a bootable live image

+

Creating a bootable live ISO is easy with FAI. You only need two +steps. First, create your live environment using the command fai +dirinstall. Don’t forget to add the class LIVEISO. +Then create the live ISO using fai-cd:

+
+
+
# cl="DEBIAN,BOOKWORM64,AMD64,FAIBASE,XFCE,XORG,DHCPC,DEMO,LIVEISO,LAST"
+# LC_ALL=C fai -v dirinstall -u xfce33 -c $cl \
+    -s file:///srv/fai/config /srv/xfce
+# fai-cd -s500 -MH -d none -g /etc/fai/grub.cfg.live \
+    -n /srv/xfce live.iso
+
+

The nfsroot is not needed for a live ISO. +Currently there’s no live ISO of the install server available.

+
+
+

Building cross-architecture disk images

+

Starting FAI 5.4 it’s now possible to build a disk image for +different architectures than the host is running. For example you can +build an image for 64-bit ARM architecture (aarch64) on a host running on amd64 +architecture. Here are the steps do to:

+
+
+
# apt install qemu-system-arm qemu-user-static fai-server fai-setup-storage fai-doc qemu-utils
+# fai-mk-configspace
+
+# export FAI_BASEFILEURL=https://fai-project.org/download/basefiles/
+# fai-diskimage -vu armhost -S2G -cDEFAULT,DHCPC,DEBIAN,ARM64,BUSTER_ARM64,FAIBASE,DEMO,CLOUD,LAST arm64.raw
+# chown your_user_id arm64.raw
+# cp /var/log/fai/armhost/last/vmlinuz* vmlinuz
+# cp /var/log/fai/armhost/last/initrd.img* initrd
+
+

Then you can run qemu as a normal user:

+
+
+
> qemu-system-aarch64 -m 1000 -M virt,gic_version=3 -cpu cortex-a57 -drive file=arm64.raw,if=virtio,index=1 -no-reboot -nographic -name ARM64 -net nic,name=eth0,model=virtio -net user,name=eth0,-kernel vmlinuz -initrd initrd -append "console=ttyAMA0 rw ip=dhcp root=/dev/vda1 net.ifnames=0"
+
+

This works similar for other architectures. +Keep in mind, that qemu network setup will have poor performance if +not using the virtio driver as above or tap devices.

+

You can find the base files for many architectures at +https://fai-project.org/download/basefiles/, or use mk-basefile to +create your own.

+
+
+

FAI rescue system

+

If you set the variable $FAI_ACTION to sysinfo (for e.g. by using +fai-chboot -S), the client will not install a new system, but will +collect a lot of system information. +If you set $FAI_ACTION to inventory you will only get a few +hardware information. +Both actions can be used for FAI as a rescue system.

+

Type ctrl-c to get a shell or use Alt-F2 or Alt-F3 and you will get +another console terminal, if you have added createvt to $FAI_FLAGS.

+

You now have a running Linux system on the install client without +using the local hard disk. Use this as a rescue system if your local +disk is damaged or the computer can’t boot properly from hard +disk. You will get a shell and you can execute various commands +(dmesg, lsmod, df, lspci, …). Look at the log file in +/tmp/fai. There you can find much information about the boot +process.

+

FAI mounts all file systems it finds on the local disks read only. It +also tells you on which partition a file /etc/fstab exists. When +only one file system table is found, the partitions are mounted +according to this information. Here’s an example:

+
+
+
demohost:~# df -h
+
+Filesystem                Size  Used Avail Use% Mounted on
+devtmpfs                  4.0M     0  4.0M   0% /dev
+tmpfs                     2.0G     0  2.0G   0% /dev/shm
+tmpfs                     783M   18M  766M   3% /run
+tmpfs                     5.0M     0  5.0M   0% /run/lock
+LiveOS_rootfs             783M   18M  766M   3% /
+192.168.33.250:/srv/fai/config   59G   23G   24G  49% /var/lib/fai/config
+/dev/mapper/vg1-root      7.3G  1.8G  5.2G  26% /target
+/dev/vda1                 459M   53M  378M  13% /target/boot
+/dev/mapper/vg1-home      1.4G   72K  1.3G   1% /target/home
+
+

This method can be used as a rescue environment! If you need a file +system with read-write access use the rwmount command:

+
+
+
demohost# rwmount /target/home
+
+
+
+

FAI without NFS

+

To boot into FAI and begin the installation sequence +without using the NFS protocol, you boot the client machine using PXE as +usual and then retrieve an image containing the nfsroot via http.

+

To create an image, use fai-cd’s -S argument and -M to avoid setting up +a partial mirror within the image.

+
+
+
faiserver# fai-cd -M -S squash.img
+
+

Move this image to a directory from which it can be requested via http +(usually a directory served by the webserver)

+

To now request the squashfs image, add the following to your kernel +command line, e.g. in your pxelinux configuration file for the client +with fai-chboot.

+
+
+
root=live:http://faiserver/cskoeln/squash.img FAI_CONFIG_SRC=file:///var/lib/fai/config
+
+

Replace faiserver with the domain name or IP of the machine your +squash image is served from.

+
+
+

Installing other distributions using a Debian nfsroot

+

You can install all sorts of Linux distributions from a single Debian +nfsroot. Therefore you have to create a base.tar.xz of the distribution +you like to install and place it into the basefiles directory. Then +name it UBUNTU2204.tar.xz for example. An install client which belongs +to the class UBUNTU2204 then extracts this base file into its empty +file system. Additionally you have to adjust the sources.list or +similar configuration files which are needed for specifying the +location of the package repository.

+

The tool rinse(8) is used for creating base files for distribution +like Rocky Linux, CentOS, openSUSE or Fedora. +Some basefiles can be downloaded from +https://fai-project.org/download/basefiles/.

+

The script mk-basefile in +/usr/share/doc/fai-doc/examples/simple/basefiles/ helps creating +this base files.

+
+
+

Creating chroot and virtualization environments

+

If you have to create some chroot environments, or a virtualization +environment where you neither can nor want to run a normal Debian +Installer in to get to a working system (for example, Xen guest +domains), there is the FAI action dirinstall. +By calling

+
+
+
faiserver# fai <options> dirinstall <target-directory>
+
+

and using either the option -c <classes> or -N you get a FAI +installation, without the partitioning action, right into the target +directory. The host name for the target installation can be specified +using -u <host-name>

+

This, for example, can be used to combine FAI with the tool +xen-tools, which helps you to build Xen guest domains. xen-tools +are very nice for generating configuration files and block devices for +new guests based on simple commands and/or configuration files, but +they can only assign one role per installation for customization. +FAI-users need and want more, as they are used to have the class +system. They get them even in xen-tools installations, by using the +following code as a xen-tools role script:

+
+
+
#!/bin/sh
+TARGET=$1
+CMD="fai -N  -v -u ${hostname} dirinstall $TARGET"
+echo running $CMD
+$CMD
+
+

Then, you should set the variable install=0 in the config of +xen-tools for that host.

+
+
+

Using FAI for updates

+

FAI can also do updates of already running systems, without a +re-installation from scratch. +This is called softupdate. A FAI softupdate skips the tasks which are +not suitable for updating a running system, like partitioning the +hard disks and creating file systems. Instead, it only executes the +tasks for updating and installing software packages and calling the +customization scripts.

+

To run a softupdate call:

+
+
+
# fai -v -s nfs://faiserver/srv/fai/config softupdate
+
+

By default, a softupdate uses the list of classes defined during the +initial installation. Make sure to set the variable $LOGSERVER (done +in a class/*.var file) if FAI should save the log files to a remote +machine.

+

It’s up to you, how to start a softupdate on a bigger number of hosts. +You may do the softupdate on a regular basis via cron or you can use tools +like clusterssh(1) to start a softupdate via a push on a list of +hosts.

+

Keep in mind, that the customization scripts are run every time you do +a softupdate. That means, they have to be idempotent i.e. the result +of their operation should always produce the same result, even when +they run more than once.

+

For example appending a line to a file must not done via this code:

+
+
+
$ echo "some strings" >> /etc/fstab
+
+

Instead use the command ainsl(1) in a shell script or use cfengine’s +function AppendIfNoSuchLine.

+

All commands in the customization script must be capable of modifying +the target file system wether it’s available in /target during the +initial installation or wether it’s the normal file system relative to +/ during softupdate.

+

Here are some variable that help writing these scripts:

+
+
+$target +
+
+

+Points to the root directory of the client, which +is /target during installation and / during a softupdate. +

+
+
+$FAI_ROOT +
+
+

+It’s the same value as $target. For historic reasons +we have both these variables in FAI. +

+
+
+$ROOTCMD +
+
+

+In case of the installation this is an alias for chroot $target in case of +softupdate it’s just empty. You can prepend this to commands if you need to run a +command inside the clients target file system via chroot. +

+
+
+$FAI_ACTION +
+
+

+If you need to call code depending on the FAI action performed, you +can use this variable. It contains the currently executed action: +install, softupdate, dirinstall, sysinfo, inventory or your +own defined action. +

+
+
+
+
+

How to install 32-bit OS from a 64-bit OS

+

To install a computer with a 32-bit OS, you need an i386 nfsroot. +Creating this 32-bit nfsroot on an install server running amd64 is +quite simple. Install and set up the FAI packages. Then copy your FAI +config files to a new subdirectory.

+
+
+
faiserver# cp -a /etc/fai /etc/fai-i386
+
+

Edit the variable $FAI_DEBOOTSTRAP_OPTS in +/etc/fai-i386/nfsroot.conf and add the option --arch +i386. Also choose a different directory for your new nfsroot. Here +are the two lines after editing.

+
+
+
NFSROOT=/srv/fai/nfsroot-i386
+FAI_DEBOOTSTRAP_OPTS="--arch i386 --exclude=info --include=aptitude""
+
+

Now call fai-make-nfsroot which creates the 32-bit nfsroot in +/srv/fai/nfsroot-i386

+
+
+
faiserver# fai-make-nfsroot -v -C/etc/fai-i386
+
+

Creating a partial mirror using fai-mirror(1) that is needed for +a bootable CD or USB stick is also possible on a different architecture. +You have to specify the architecture when calling fai-mirror.

+
+
+
$ fai-mirror -m800 -B -a i386 -v -cDEFAULT,DEBIAN,FAIBASE,I386 /srv/mirror-i386
+
+

That’s all!

+
+
+

Aborting the installation when an error occurs

+

Every task and hook can call the function task_error +to send an error value to the installation. This error will appear in +the log file and can be shown in the fai-monitor-gui(1). +The error value is also checked against the variable $STOP_ON_ERROR +which is set to 700 by default. If the error value +is greater than $STOP_ON_ERROR the installation will stop +immediately. In a hook, just add a call like this:

+
+
+
task_error <value>
+
+

It is comfortable to call task_error with $? as second parameter, for +e.g. if you want to set an error value of 123 use this

+
+
+
<some command>
+task_error 123 $?
+
+

Then the task error is only set if the preceding command failed with +some error. The same syntax can be used by the scripts in the class +subdirectory ending in .sh.

+

A special case are scripts inside the class/ subdirectory that does +not end in .sh. In those scripts you have to call task_error with 1 as +third parameter. As an example you can use those two variants for +setting the value to 123

+
+
+
task_error 123 $? 1
+
+

or

+
+
+
task_error 123 1 1
+
+

The latter command always sets the task error to 123 regardless of +the value of $?. If the error value is greater than $STOP_ON_ERROR, +the installation will abort immediately.

+

The error values are grouped into four categories

+
+
+
normal or info messages:       1xx, 2xx
+warnings:                      3xx, 4xx
+minor errors:                  5xx, 6xx
+errors:                        7xx, 8xx
+
+

The fai-monitor-gui has 4 different icons for these error categories.

+
+
+
+
+

Various hints and details

+
+
+

The list of tasks

+

Most tasks of the installation are defined as subroutines which are +defined in /usr/lib/fai/subroutines (e.g. task_instsoft). +Some are external shell scripts located in /usr/lib/fai/. +They are called via a superior subroutine called task. +This subroutine calls hooks if available and then calls the task (defined as +task_<name>). A task and its hooks can be +skipped on demand by using the command skiptask().

+

Now follows the description of all tasks, listed in the order +they are executed.

+
+
+confdir +
+
+

+The kernel appended parameters may define variables, the syslog daemon is +started. Network parameters are fetched from a DHCP +server and are stored in boot.log. The DNS resolver configuration file is created. +

+

The location of the configuration space is defined by the variable +$FAI_CONFIG_SRC.

+

After that, the file $FAI/hooks/subroutines is sourced if it +exists. Using this file, you can define your own subroutines or +override the definition of FAI’s subroutines.

+
+
+setup +
+
+

+This task sets the system time, all $FAI_FLAGS are defined and two +additional virtual terminals are opened on demand. A secure shell +daemon is started on demand for remote logins. +

+
+
+defclass +
+
+

+Calls fai-class(1) to define classes using scripts and files in +$FAI/class and classes from /tmp/fai/additional-classes and the +variable $ADDCLASSES. The list of all defined classes is stored in +the variable $classes and saved to /tmp/fai/FAI_CLASSES. +

+
+
+defvar +
+
+

+Sources all files $FAI/class/*.var for every defined class. If a +hook has written some variable definitions to the file +$LOGDIR/additional.var, this file is also sourced. +

+
+
+action +
+
+

+Depending on the value of $FAI_ACTION this subroutine decides which +action FAI should perform. The default available actions are: +sysinfo, install, inventory, dirinstall and softupdate. If $FAI_ACTION has another +value, a user defined action is called if a file +$FAI/hooks/$FAI_ACTION exists. So you can easily define your own +actions. +

+
+
+sysinfo +
+
+

+Called when no installation is performed but the action is +sysinfo. It shows information about the detected hardware and mounts +the local hard disks read only to /target/partitionname or with +regard to a fstab file found inside a partition. Log files are +stored to the install server. +

+
+
+inventory +
+
+

+A short list of system information is printed. +

+
+
+install +
+
+

+This task controls the installation sequence. You will hear three +beeps before the installation starts. The major work is to call other +tasks and to save the output to /tmp/fai/fai.log. If you have any +problems during installation, look at all files in /tmp/fai/. You +can find examples of the log files +at https://fai-project.org/logs/. +

+
+
+dirinstall +
+
+

+Install into a directory, not onto a local disk. Use this for creating +chroot environments. +

+
+
+softupdate +
+
+

+This task, executed inside a running system via the fai(8) command +line interface, performs a softupdate. See chapter [softupdate] for +details. +

+
+
+partition +
+
+

+Calls setup-storage(8) to partition the hard +disks and to create file systems. The task writes variable definitions +for the root and boot partition and device ($ROOT_PARTITION, +$BOOT_PARTITION, $BOOT_DEVICE) to /tmp/fai/disk_var.sh and creates +a fstab file for the new system. +

+
+
+mountdisks +
+
+

+Mounts the created partitions according to the created +/tmp/fai/fstab file relative to $FAI_ROOT. +

+
+
+extrbase +
+
+

+Extracts a minimal system after that a chroot can be made into it. By +default the base tar file /var/tmp/base.tar.xz will be +extracted. Also files matching a class name in $FAI/basefiles/ are used for unpacking a +different tar file depending on classes defined. This can be used for +installing different Linux distributions than the one used for +creating the nfsroot. The default file base.tar.xz is a snapshot of a +basic Debian system created by debootstrap(8). +This task uses the variable FAI_BASEFILEURL for fetching the base +file via FTP, HTTPS or HTTP if it’s defined. +

+
+
+debconf +
+
+

+Calls fai-debconf(1) to set the values for the debconf preseeding database. +

+
+
+repository +
+
+

+Prepare access to the package repository by preparing the apt +configuration. This can also add repository keys +in a class based manner from files like CLASSNAME.gpg +in the directory package_config. +

+
+
+updatebase +
+
+

+Updates the base packages of the new system and updates the list of +available packages. It also fakes some commands (called diversions) +inside the new installed system using dpkg-divert(8), so no daemons +will be started during the installation. +

+
+
+instsoft +
+
+

+Installs the desired software packages using class files in +$FAI/package_config/. +

+
+
+configure +
+
+

+Calls scripts in $FAI/scripts/ and its subdirectories for every +defined class. +

+
+
+tests +
+
+

+Calls test scripts in $FAI/tests/ and its subdirectories for every +defined class. +

+
+
+finish +
+
+

+Unmounts all file systems in the new installed system and removes +diversions of files using the command fai-divert. +

+
+
+chboot +
+
+

+Changes the PXE configuration for a host on the install server which +indicates which PXELINUX configuration to load on the next boot from network +card via TFTP. Therefore the fai-chboot(8) command is executed +remotely on the install server. +

+
+
+savelog +
+
+

+Saves log files to local disk and to the account $LOGUSER on +$LOGSERVER (defaults to the install server). +

+
+
+faiend +
+
+

+Wait for background jobs to finish (e.g. emacs compiling lisp files) +and automatically reboots the install clients or waits for manual +input before reboot. +

+
+
+
+
+

Automated tests

+

After the customization scripts are executed, FAI will execute some +tests if available. Using these test, you can check for errors of the +installation. Test scripts are called via +fai-do-scripts(1) and should append its messages to +$LOGDIR/test.log. A Perl module including some useful subroutines +can be found in Faitest.pm. A test can also define a new class for +executing another tests during next boot via the variable +$ADDCLASSES.

+
+
+

Autodiscover

+

In FAI 5.0 we released a feature that allows clients to search for the +faiserver in their respective subnetwork. This lifts the necessity of +having to collect every client’s MAC address and configuring the DHCP +daemon.

+

This is done by booting from a small FAI autodiscover bootmedium (CD, +USB, etc.), which can be created via the command:

+
+
+
faiserver# fai-cd -A autodiscover.iso
+
+

The image is roughly 25MB in size and scans the subnet for +a FAI server. By default it shows a menu with all profiles available +in the configuration space in the same manner as the menu flag +does. From this menu, you can select the installation type you wish to +perform.

+

For the clients to find the faiserver, the faiserver must run +fai-monitor.

+
+
+

Changing the boot device

+

Changing the boot sequence is normally done in the BIOS setup. But you +can’t change the BIOS from a running Linux system.

+

So, the boot sequence of the BIOS will remain unchanged and +your computer should always boot first from its network card and the +second boot device should be the local disk. Then you can +change the boot device of the client by creating different PXELINUX +configurations. This will define if an installation +should be performed, or if the client should to boot from local +disk. This is done using fai-chboot(8).

+
+
+

How to create a local Debian mirror

+

The utility mkdebmirror
[You can find the script in +/usr/share/doc/fai-doc/examples/utils/]
can be used for creating +your own local Debian mirror. This script uses debmirror(1). A partial Debian mirror for amd64 architecture for +Debian 11 and 12 (aka bullseye and bookworm) without the source packages needs about +180GB of disk space. +Accessing the mirror via HTTP will be the +default way in most cases. To see more output from the script call +mkdebmirror -v. A root account is not necessary to create and +maintain the Debian mirror.

+

To use HTTP access to the local Debian mirror, install a web server +and create a symlink to the local directory where your mirror is +located:

+
+
+
faiserver# apt-get install apache2
+faiserver# ln -s /files/scratch/debmirror /var/www/html/debmirror
+
+

Create a file sources.list(5) in /etc/fai/apt which gives access +to your Debian mirror. Also add the IP-address of the +HTTP server to the variable $NFSROOT_ETC_HOSTS in +nfsroot.conf if the install clients have no DNS resolving.

+
+
+

Small hints

+
    +
  • +

    +When using HTTP access to a Debian mirror, the local /var partition +on all install clients must be big enough to keep the downloaded +Debian packages. Do not try with less than 250 Mbytes unless you know +why. You can limit the number of packages installed at a time with the +variable $MAXPACKAGES. +

    +
  • +
  • +

    +You can remove the red logo on the install client by simply calling +reset once. If will also not appear if you create a file using this +command on the install server: +

    +
  • +
+
+
+
touch /srv/fai/nfsroot/.nocolorlogo
+
+
    +
  • +

    +A list of variables used by FAI can be found at +https://wiki.fai-project.org/index.php/Variables. +

    +
  • +
  • +

    +You can shorten some customization scripts by using one single fcopy +command fcopy -r /. +

    +
  • +
  • +

    +If you rebuild the nfsroot, you will create a new ssh host key inside +the nfsroot. Then logging in to an install client may fail, because +the host key changes. You can use this: +

    +
  • +
+
+
+
$ ssh -o StrictHostKeyChecking=no root@installclient
+
+
    +
  • +

    +You can also delete the host entry on your install client in your +~/.ssh/known_hosts file by using the ssh-keygen -R command. +

    +
  • +
  • +

    +In the tasks chboot and savelog, a connection using secure shell is +opened to the FAI server (see [isavelog]). To ensure that this works +non-interactively, a proper entry in NFSROOT/root/.ssh/known_hosts +must be created. When using fai-setup, this is done automatically, but +it may require manual editing in case the name of your FAI server was +not determined correctly. If you stumble over ssh connections that +require typing "yes" to accept the host key during installation, +please check the contents of your NFSROOT/root/.ssh/known_hosts file +

    +
  • +
  • +

    +A list of all local hard disks is +stored in $disklist. It’s defined after set_disk_info is called. +

    +
  • +
  • +

    +There are multiple functions for generating a customized disk +list. See fai-disk-info for an example. +

    +
      +
    • +

      +set_bootstick() +

      +
    • +
    • +

      +grepv_disks() +

      +
    • +
    • +

      +grep_disks() +

      +
    • +
    • +

      +notmatchdisks() +

      +
    • +
    • +

      +matchdisks() +

      +
    • +
    • +

      +smallestdisk() +

      +
    • +
    • +

      +largestdisk() +

      +
    • +
    • +

      +all_disks_by_size() +

      +
    • +
    • +

      +all_disks_and_size() +

      +
    • +
    • +

      +once_only() +

      +
    • +
    • +

      +checkdisk() +

      +
    • +
    • +

      +disks_by_id() +

      +
    • +
    +
  • +
  • +

    +Use fai-divert -a if a postinst script calls a configuration +program, e.g. the postinst script for package apache calls +apacheconfig, which needs manual input. You can fake the configuration +program so the installation can be fully automatic. +

    +
  • +
  • +

    +Sometimes the installation seems to stop, but often there’s only a +postinstall script of a software package that requires manual input +from the console. Change to another virtual terminal and look which +process is running with tools like top(1) and pstree(1). You can +add debug to FAI_FLAGS to make the installation process show all +output from the postinst scripts on the console and get its input also +from the console. +

    +
  • +
  • +

    +How can I define classes on the kernel command line? +

    +

    Read the man page of fai-class(8). If you like to define some +additional classes (for e.g. A,B,C) on the kernel command line add this: ADDCLASSES=A,B,C

    +
  • +
  • +

    +How to use a custom kernel inside the nfsroot? +

    +

    Build your customized kernel by building a kernel package using +make-kpkg(8) and use the option --initrd. Copy this Debian package +to a local repository and add it to /etc/fai/sources.list. Add the +name of your package to /etc/fai/NFSROOT. Then call

    +
    +
    +
    # fai-make-nfsroot -k
    +
    +
  • +
  • +

    +How to use the nfsroot as system for diskless clients? +

    + +
  • +
  • +

    +How to serve multiple nfsroot directories on one FAI server? +

    +

    If you want to serve multiple nfsroot directories, +you need to create specific config directories in /etc for FAI, like +/etc/fai-buster and /etc/fai-bookworm. Then you need to set the +$NFSROOT variables to different directories and run

    +
  • +
+
+
+
faiserver#fai-make-nfsroot -C /etc/fai-buster
+
+
+
+

flag_reboot (FAI_FLAGS)

+

If flag_reboot is set, by adding "reboot" to $FAI_FLAGS, your client +machine will reboot after the task faiend has finished. This is true +for network as well as bootmedium installations.

+
+
+

Log files

+

FAI is creating several log files. During installation they are stored +in /tmp/fai on the install client itself. At the end of the +installation they will be copied to the install server (see +[isavelog]). After the install client rebooted into his newly +installed system, you can find the FAI logs in /var/log/fai. +Log files are also created when doing the softupdate or dirinstall +action.

+

On the faiserver, you can find the (remote) log files under the ~fai +directory.

+

Sample log files from successfully installed computers are +available on https://fai-project.org/logs. +These a some log files which are created by FAI.

+
+
+FAI_CLASSES +
+
+

+Contains a list of all classes defined. +

+
+
+dmesg.log +
+
+

+Output of the dmesg command. Contains useful messages of the kernel +ring buffer. +

+
+
+fai.log +
+
+

+The main log file. Contains all important information. You should +always read this file. +

+
+
+boot.log +
+
+

+A list of variables of network parameters, mostly defined by the DHCP daemon. +

+
+
+format.log +
+
+

+Output of the partition tool setup-storage(8). +

+
+
+scripts.log +
+
+

+Output of all scripts, that are used for customization. +

+
+
+variables.log +
+
+

+A list of all shell variables which are available during an +installation. +

+
+
+error.log +
+
+

+A summary of possible errors in all log files. +

+
+
+disk_var.sh +
+
+

+A list of variables that contain information about devices and +partitions to boot from, the root partition and a list of swap +devices. These information is used by some customization scripts +(e.g. GRUB_PC/10-setup). +

+
+
+

If the installation process finishes, the hook savelog.LAST.sh +searches all log files for common errors and writes them to the file +error.log. So, you should first look into this file for errors. Also +the file status.log give you the exit code of the last command +executed in a script. To be sure, you should look for more details in +all log files.

+
+
+

How to use HTTP for PXE boot

+

fai-make-nfsroot now uses the lpxelinux.0 binary which already +supports transfer of the kernel and initrd via http (additional to tftp). +You only have to enable HTTP access to the tftp directory:

+
+
+
cd /var/www/html
+ln -s /srv/tftp/fai
+
+

Add -U URL to the fai-chboot call. For example:

+
+
+
fai-chboot -U http://faiserver/fai -IFv .......
+
+
+
+
+
+

Troubleshooting

+
+
+

Boot errors

+

The following error message indicates that your install client doesn’t +get an answer from a DHCP server. Check your cables or start the +dhcpd(8) daemon with the debug flag enabled.

+
+
+
+
+
PXE-E51: No DHCP or BOOTP offers received
+Network boot aborted
+
+
+
+
+

If you do not see the following message, the install kernel could not +detect your network card, for example because of a missing driver:

+
+
+
Starting dhcp for interface eth0
+dhcp: PREINIT eth0 up
+dhcp: BOND setting eth
+
+

Check the initrd in the nfsroot (lsinird) if the kernel driver of your network +card is included there and check if you like to add the package +firmware-linux-nonfree in /etc/fai/NFSROOT and rebuild the initrd +by calling fai-make-nfsroot -k. +You may also add a driver to /srv/fai/nfsroot/etc/dracut.conf in +the line add_drivers+=.

+

This is the error message you will see, when your network card is +working, but the install server does not export the nfsroot +directory to the install clients, This is often caused by missing +NFS permissions on the server side.

+
+
+
Starting dhcp for interface eth0
+dhcp: PREINIT eth0 up
+dhcp: BOND setting eth
+mount.nfs: access denied by server while mounting 192.168.33.250:/srv/fai/nfsroot
+.
+.
+dracut Warning: Could not boot
+.
+Dropping to debug shell
+dracut:/#
+
+

Now, you are inside the emergency shell of the initrd which was created +by dracut(8). You will get a shell prompt, and can look at the log files. +For more information about debugging the early boot process using +dracut see dracut.cmdline(7)

+

Use the following command on the install server to see which directories are exported +from the install server (named faiserver):

+
+
+
$ showmount -e faiserver
+
+
+
+
+
+

+ + + diff --git a/doc/fai-guide.pdf b/doc/fai-guide.pdf new file mode 100644 index 0000000000000000000000000000000000000000..e1ca2a5806173e1d0457775ec6374454e58ff479 GIT binary patch literal 281933 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

()_b>x;hk@m7KNnY1EwYrdYp7-@MVC4+y2 zBxzFsXcmWuN?oF-?y~V}RZ~N7CIn)j{qY7v;6drkH!bURqRgasinON|MLGqU#zmg; z_tT>JT(ao2dEb~FSEaFyZb_nACl-t&Ti90V#;jpA#~i0#Xi;%I8ed?%?i3u%Tv%Z2 zLfu&YcY%OnPX|m7_s^h@A&kBpVctDQ6<^s}fgmJ_cpZ2j-2v0rr(B-cNZ!iD7^mv= zBBl(1I-|K=op{ek|2cnZ@*a)ks&{nx+?FO!pTb$PKgzUCr7sN3%~f+Lb(j9xsu_N3 z@N2iW7@mNO7<5CUD7^#xJbQgV@V07HRjosVE4l%FC>kvFQ-X}DdDX`3b~6?BCM`#) zdCw{=bEsb(ipc-2xeg~^xqIxKEotOjGe*UF$_zNns!Ak|jgy873%gwIK&O_}M0-$A zHM%6*j%CKRtHUToAn#`q!5k0)BA)AaMR;gCP@%IP*yI-*QBWJczeZE_j3E3n=eSC3 ziI$cxmNbgtwqjRQ_d*iMj1?!Us{DCnmpToT7fNLu!NWHFH~!Wcuu|z(6w#?S0@~@G zO849%0)llknKsCq{K`@)G9E0vN?s_MNc~J`B(rs8YXr8owx{7&{7PzDeLztQtraVz zHni$+QgB>mL)`S3(O>vhY1}F3e`*w~voz%-hlHWwQfp2Q2r9z$MMgq82O^UiiuXf@>68BF zhtPlXH>K#UJ516~ir6^)hNyrGb31()*C?)PWJxLr1B+Kkxk!PKt)-Bv$xFL@tVnV! zpmq7Bw`$x`At=-<5AE>iBV_eeQDwe$hW~)JX9Gzi7rWt|>GaX&#s>3qw)$U<4)2+A zU%VT4D}j{`WF&In$kxHMui8HSiF{X)mSl{@#9(5EM}A9U;$^bA;f615ud9ghMl_ZN z{~+ipEH7IA3%P^lmY%1P`tnIgV#U2;F>ya&w=9V49>wFXSL)T*>^(M%7y01#r7psLGH68@`ac&+lMop(FV%Cp!GJa#SZc! zZE<9T=OMRKtq*{W7{P3>AXJZTz#M$vE!X^ z0*yKD%)BC=X^aD9vcU`#my2>^8MC%OFR?-R7g%ii?hZ7DdAmGvm*VCe(jzyEfR#5k z0Xl-}9W(|V{MsMO;QA)os{)BCw=ddj?GW_ver6Q=%@Cy9i2YmSNCiTnqd3OX94Ms@ zs0WA&;FqFGzmel4NQ3mdtHTpC@9p!#=52T3GGy%&9s_fgCx(c#0!CpNJoIlrxNDz~ zTF^Xs?tEuXiQzjmksol_{xtS{rM<->%lla10k7_%YW~tv1`ijy-a)wp*@jtKG5951 zsM9p>@lVJ)zQSYi-2J6qZcr&)4S4RBg?8FtNB=i&%0D>@`RWI;Xn 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 Zx_kP#!@nu<3keJGgRxmz<<%6h{~y9`^CSQO literal 0 HcmV?d00001 diff --git a/doc/fai-guide.text b/doc/fai-guide.text new file mode 100644 index 000000000..e8cce4ed8 --- /dev/null +++ b/doc/fai-guide.text @@ -0,0 +1,2785 @@ + +--------------------------------------------------------------------- + +FAI Guide (Fully Automatic Installation) + +--------------------------------------------------------------------- + +Thomas Lange + + + +Revision History +Revision 6.4 10 Apr 2025 TL + +--------------------------------------------------------------------- + +Table of Contents + +1. Introduction + 1.1. Availability + 1.2. Motivation + 1.3. How does FAI work + 1.4. Features + 1.5. Installation times +2. Quickstart - For the impatient user + 2.1. My first installation + 2.2. My first server installation +3. Overview and Concepts + 3.1. Important Terms + 3.2. The class concept +4. Setup your faiserver + 4.1. Install the FAI packages + 4.2. Create the nfsroot + 4.3. Creating the configuration space + 4.4. Configure the network daemons + 4.5. Creating the PXELINUX configuration + 4.6. Custom server +5. Plan your installation + 5.1. The configuration space and its subdirectories + 5.2. Defining classes + 5.3. Defining variables + 5.4. Hard disk configuration + 5.5. Extract base file + 5.6. Debconf preseeding + 5.7. Access to the package repository + 5.8. Software package configuration + 5.9. Customization scripts + 5.10. Hooks + 5.11. FAI flags +6. FAI installs your plan + 6.1. The early part of an installation + 6.2. Boot messages + 6.3. Rebooting the computer into the new system + 6.4. Starting FAI (task confdir) + 6.5. Defining classes and variables (tasks defclass and defvar) + 6.6. Partitioning local disks, creating file systems (task + partition) + 6.7. Debconf preseeding (task debconf) + 6.8. Installing software packages (task instsoft) + 6.9. Site specific customization (task configure) + 6.10. Saving log files (task savelog) + 6.11. Reboot the new installed system +7. Advanced FAI topics + 7.1. Checking parameters received from DHCP servers + 7.2. Monitoring multiple client installations + 7.3. Collecting Ethernet addresses for multiple hosts + 7.4. Details of PXE booting + 7.5. Customizing your install server setup + 7.6. Creating a FAI CD or and USB stick + 7.7. Creating VM disk images using FAI + 7.8. Creating a bootable live image + 7.9. Building cross-architecture disk images + 7.10. FAI rescue system + 7.11. FAI without NFS + 7.12. Installing other distributions using a Debian nfsroot + 7.13. Creating chroot and virtualization environments + 7.14. Using FAI for updates + 7.15. How to install 32-bit OS from a 64-bit OS + 7.16. Aborting the installation when an error occurs +8. Various hints and details + 8.1. The list of tasks + 8.2. Automated tests + 8.3. Autodiscover + 8.4. Changing the boot device + 8.5. How to create a local Debian mirror + 8.6. Small hints + 8.7. flag_reboot (FAI_FLAGS) + 8.8. Log files + 8.9. How to use HTTP for PXE boot +9. Troubleshooting + 9.1. Boot errors + +An older French version of this guide is available at https:// +fai-project.org/fai-guide-fr. + +Abstract + +FAI is a non-interactive system to install, customize and manage +Linux systems and software configurations on computers as well as +virtual machines and chroot environments, from small networks to +large infrastructures and clusters. + +This manual describes the Fully Automatic Installation software. This +includes the installation of the packages, setting up the server, +creating of the configuration and how to deal with errors. + +(c) 2000-2025 Thomas Lange + +Copyright. This manual is free software; you may redistribute it and/ +or modify it under the terms of the GNU General Public License as +published by the Free Software Foundation; either version 2, or (at +your option) any later version. + +This is distributed in the hope that it will be useful, but without +any warranty; without even the implied warranty of merchantability or +fitness for a particular purpose. See the GNU General Public License +for more details. + +A copy of the GNU General Public License is available as /usr/share/ +common-licenses/GPL in the Debian GNU/Linux distribution or on the +World Wide Web at the GNU website You can also obtain it by writing +to the Free Software Foundation, Inc., 51 Franklin Street, Fifth +Floor, Boston, MA 02110-1301, USA. + + +--------------------------------------------------------------------- + +1. Introduction + +--------------------------------------------------------------------- + + +1.1. Availability + +-------------- + +Homepage + https://fai-project.org +FAI wiki + https://wiki.fai-project.org +Download + https://fai-project.org/download +Entry for sources.list + deb https://fai-project.org/download bookworm koeln +Manual pages + https://fai-project.org/doc/man/ +Mailing list + https://lists.uni-koeln.de/mailman/listinfo/linux-fai +Feedback + Send feedback and comments to fai@fai-project.org or to the + mailing list. +Bugs + Use the Debian bug tracking system (BTS) https://bugs.debian.org/ + src:fai +User visible changes + https://fai-project.org/NEWS +Source tree via git + git clone git://github.com/faiproject/fai.git +View source tree via https + https://github.com/faiproject/fai + +The man pages always include up-to-date information and a lot of +details of all FAI commands. So, don’t forget to read them carefully. +Now read this manual, then enjoy the fully automatic installation and +your saved time. + + +1.2. Motivation + +-------------- + +Have you ever performed identical installations of an operating +system several times? Would you like to be able to install a Linux +cluster with dozens of nodes single handedly? + +Repeating the same task again and again is boring — and will surely +lead to errors. Also a whole lot of time could be saved if the +installations were done automatically. An installation process with +manual interaction does not scale. But clusters have the habit of +growing over the years. Think long-term rather than planning just a +few months into the future. + +In 1999, I had to perform an installation of a Linux cluster with one +server and 16 clients. Since I had much experience doing automatic +installations of Solaris operating systems on SUN SPARC hardware, the +idea to build an automatic installation for Debian was born. Solaris +has an automatic installation feature called JumpStart ^[1]. In +conjunction with the auto-install scripts from Casper Dik ^[2], I +could save a lot of time not only for every new SUN computer, but +also for re-installation of existing workstations. For example, I had +to build a temporary LAN with four SUN workstations for a conference, +which lasted only a few days. I took these workstations out of our +normal research network and set up a new installation for the +conference. When it was over, I simply integrated the workstations +back into the research network, rebooted just once, and after half an +hour, everything was up and running as before. The configuration of +all workstations was exactly the same as before the conference, +because everything was performed by the same installation process. I +also used the automatic installation for reinstalling a workstation +after a damaged hard disk had been replaced. It took two weeks until +I received the new hard disk but only a few minutes after the new +disk was installed, the workstation was running as before. And this +is why I choose to adapt this technique to a PC cluster running +Linux. + + +1.3. How does FAI work + +-------------- + +The install client which will be installed using FAI, is booted via +network card or from CD or USB stick. It gets an IP address and boots +a Linux kernel which mounts its root file system via NFS (the +nfsroot) from the install server. After the kernel is started, the +FAI startup script performs the automatic installation which doesn’t +need any interaction. First, the hard disks will be partitioned, file +systems are created and then software packages are installed. After +that, the new installed operating system is configured to your local +needs using some scripts. Finally, the new operating system will be +booted from the local disk. + +The details of how to install the computer (the configuration) are +stored in the configuration space on the install server. +Configuration files are shared among groups of computers if they are +similar using the class concept. So you need not create a +configuration for every new host. Hence, FAI is a scalable method to +install a big cluster with a great number of nodes even if their +configuration is not identical. + +FAI can also be used as a rescue system or for hardware inventory. +You can boot your computer, but it will not perform an installation. +Instead it will run a fully functional Debian GNU/Linux without using +the local hard disks. Then you can do a remote login and backup or +restore a disk partition, check a file system, inspect the hardware +or do any other task. + + +1.4. Features + +-------------- + + * A fully automated installation can be performed. + * Very quick unattended installation. + * Flexible system through easy class concept. + * Update of running systems without re-installation. + * Cloud images for virtualization environment. + * Hosts can boot from network card, CD, USB stick. + * Simple creation of an installation or live ISO. + * PXE with DHCP boot method is supported. + * ReiserFS, ext3/ext4, btrfs and XFS file system support. + * Software RAID and LVM support. LUKS support. + * Automatic hardware detection. + * You can deploy Debian, Ubuntu, Rocky Linux, CentOS, AlmaLinux, + SuSE + * Remote login via ssh during installation process possible. + * All similar configurations are shared among all install clients. + * Log files for all installations are saved to the installation + server. + * Shell, Perl, Python, Ruby, expect and CFEngine scripts are + supported during the customization step. + * Support for many protocols like NFS, FTP, HTTPS, git. + * Can be used as a rescue system and for hardware inventory. + * Diskless client support. + * Cross-architecture support e.g. for embedded devices. + * Easily add your own functions via hooks or change the default + behavior. + * Cloning machines using disk images is supported. + + +1.5. Installation times + +-------------- + +The installation time is determined by the amount of software and the +speed of the hard disk. Here are some sample times. All install +clients had a 1Gbit network card installed. + ++-----------------------------------------------------+ +|CPU |RAM|Disk | Software| time| +| | | | installed| | +|---------------+---+--------+-----------------+------| +|i7-3770T |8GB|SSD | 6 GB software| 8.5| +|2.50GHz | | | | min| +|---------------+---+--------+-----------------+------| +|Core-i7 3.2GHz |6GB|SATA | 4.3GB software| 7 min| +| | |disk | | | +|---------------+---+--------+-----------------+------| +|Core-i7 3.2GHz |6GB|SATA | 471 MB software| 77sec| +| | |disk | | | +|---------------+---+--------+-----------------+------| +|Intel Core2 Duo|2GB|SATA | 3 GB software|14 min| +| | |disk | | | ++-----------------------------------------------------+ + +--------------------------------------------------------------------- + +2. Quickstart - For the impatient user + +--------------------------------------------------------------------- + + +2.1. My first installation + +-------------- + +Without further ado, this section will provide a quick and easy +demonstration of a fully automatic installation using the FAI CD and +a virtual machine. + +Just download the CD ISO image from https://fai-project.org/fai-cd +and boot your VM using this CD. You will see a grub menu where you +can select from different installation types. + +This installation will run without an install server. The CD +installation is the same as when run in a network environment using +the FAI install server and can also be used from USB stick on a real +computer. + +You can also create yourself a custom fully automated installation +image on the webpage https://fai-project.org/FAIme without the need +of installing FAI on your computer. + + +2.2. My first server installation + +-------------- + +We will create a private network and start two virtual machines. One +will become your own FAI server, the other will be an install client. + +If you intend to use VMware or VirtualBox, ensure that your client +uses a bridged network connection. A detailed description is in the +FAI wiki ^[3]. Also, it is not possible to use bridged network +interfaces over wireless, as most WiFi network cards do not support +this feature. + +When using Qemu/KVM and the fai-kvm wrapper you can create the +network using the command fai-mk-network. First install some packages + +# apt-get install qemu-system-gui qemu-kvm qemu-utils + +The next command sets up a private network with a software bridge +with several tap devices that belong to the user . + +fai-mk-network + +After that, you can use fai-kvm (-h will give you some help) for +starting virtual machines using KVM that are connected to this +private network. Be careful. By default, fai-kvm will create the disk +images for the virtual machines in /tmp, which is a RAM disk on most +systems. It’s no problem to create an empty 20G disk image in /tmp +(even if this partition is of 4GB size), but while the VM is writing +data to its disk, this will start to consume space in /tmp. + +Start the first virtual host, which will become the FAI server ^[4]: + +fai-kvm -Vn -s20 -u 1 cd faicd64-small.iso + +In the grub menu select faiserver, using internal DHCP and a fixed +IP. This will install a host called faiserver with IP 192.168.33.250 +which contains all software needed for a FAI server. It will also set +up a local package cache (using apt-cacher-ng). Once the installation +is finished, reboot the machine. During the first boot of the new +system, it will automatically set up the nfsroot. This may take some +minutes. + +After that you can start additional hosts using network boot. For +every new host, you have to use a different value for -u, which will +be used for generating different MAC addresses and using different +disk image file names. + +fai-kvm -Vn -u 2 pxe + +Those install clients will show you a menu, where you can select +which type of installation you like to perform. If the install client +does not find the server, it is usually because fai-monitor is no +longer running on it. This can happen, if you reboot the faiserver +after the installation. To remedy this, simply run fai-monitor on the +faiserver and re-attempt the client boot. + +Another client could be started with: + +fai-kvm -Vn -u 3 pxe + +You can start as many machines in the network as tap devices are +available. All these machines can connect to the outside internet but +are only reachable from your host machine. + + +--------------------------------------------------------------------- + +3. Overview and Concepts + +--------------------------------------------------------------------- + +FAI is a non-interactive system to install, customize and manage +Linux systems and software configurations on computers as well as +virtual machines and chroot environments, from small networks to +large infrastructures and clusters. You can take one or more virgin +PCs, turn on the power and after a few minutes Linux is installed, +configured and running on the whole cluster, without any interaction +necessary. Thus, it’s a scalable method for installing and updating a +cluster unattended with little effort involved. FAI uses the Linux +operating system and a collection of shell and Perl scripts for the +installation process. Changes to the configuration files of the +operating system can be made by CFEngine, shell (bash and zsh), Perl, +Python, Ruby and expect scripts. + +FAI’s target group are system administrators who have to install +Linux onto one or even hundreds of computers. Because it’s a general +purpose installation tool, it can be used for installing a Beowulf +cluster, a rendering farm or a Linux laboratory or a classroom. Also +large-scale Linux networks with different hardware or different +installation requirements are easy to establish using FAI. But don’t +forget to plan your installation. Chapter [plan] has some useful +hints for this topic. + + +3.1.  Important Terms + +-------------- + +First, some terms used in this manual are described. + +install server + It provides DHCP, TFTP and NFS services and the configuration + data for all install clients. In the examples of this manual this + host is called faiserver. The host where the package fai-server + is installed. +install client + A host which will be installed using FAI and a configuration + provided by the install server. Also called client for short. In + this manual, the example hosts are called demohost, xfcehost, + gnomehost … This computer should boot from its network interface + using PXE. +configuration space + + A subdirectory structure containg several files. Those files + describe the details of how the installation of the clients will + be performed. All configuration data is stored here. It’s also + called config space for short. It includes information about: + + o Hard disk layout in a format similar to fstab + o Local file systems, their types, mount points and mount + options + o Software packages + o Keyboard layout, time zone, Xorg configuration, remote file + systems, user accounts, printers … + + The package fai-doc includes a sample configuration space + including examples for hosts using the XFCE and GNOME environment + amongst other examples. Calling fai-mk-configspace copies these + examples to /srv/fai/config. It’s recommended to study those + config files and scripts for easier understanding how FAI works. + +nfsroot, NFS-Root + A file system located on the install server. During the + installation process it’s the complete file system for the + install clients. All clients share the same nfsroot, which they + mount read only. The nfsroot needs about 1.1GB of free disk + space. +TFTP + Serves clients the initrd and kernel that is used for the + installation process. Along with the file system served by NFS, + these two make up a temporary OS in which the installations are + performed. +FAI classes + Classes are names which determine which configuration file is + selected. If a client belongs to class WEBSERVER, it will be + configured as a webserver, the class DESKTOP for e.g. determines + which software packages will be installed. +profile + A FAI profile is just a list of FAI classes assiged to a profile + name, which is extended by a description of this profile. I.e. + one could have two "Webserver" profiles, one including the APACHE + class another including the NGINX class, to then install the + respective webserver solution. +tasks + The installation of a client consists of several parts, which are + called tasks. Tasks are predefined subroutines which perform a + certain part of the FAI. The following FAI tasks are performed + during an installation on the install clients. + + confdir # get the config space + setup # some initialization, start sshd on demand + defclass # define FAI classes + defvar # define variables + action # evaluate FAI_ACTION + install # Start the installation + partition # partition the harddisks, create file systems + mountdisks # mount the file systems + extrbase # extract the base.tar.xz + debconf # do the Debian debconf preseeding + repository # prepare access to the package repository + updatebase # Set up package tools and update packages + instsoft # install software packages + configure # call customization scripts + finish # do some cleanup, show installation statistics + tests # call tests if defined + chboot # call fai-chboot on the install server + savelog # save log files to local and remote location + faiend # reboot host, eject CD if needed + + These are tasks, which are only executed when a different action + is performed + + dirinstall # install a chroot environment + softupdate # only do the system configuration + sysinfo # print detailed system information + inventory # print short hardware inventory list + +For a more in-depth description of tasks , see [tasks]. + +Note that you are not limited to the FAI tasks. You can also define +additional programs or scripts which will be run on particular +occasions. They are called hooks. + +hooks + Hooks are plugins, they can add additional functionality to the + installation process or even replace entire tasks of FAI. Hooks + are explained in detail in [hooks]. + + +3.2. The class concept + +-------------- + +Classes are used in nearly all tasks of the installation. Classes +determine which configuration files to choose from a list of +available alternatives. To determine which config files to use, FAI +searches the list of defined classes and uses all configuration files +that match a class name ^[5]. The following loop implements this +function in pseudo shell code: + +for class in $all_classes; do + if [ -r $config_dir/$class ]; then # if a file with name $class exists + your_command $config_dir/$class # call a command with this file name + # exit if only the first matching file is needed + fi +done + +The very nice feature of this is that you can add a new configuration +alternative and it will automatically be used by FAI without changing +the code, if the configuration file uses a class name. + +This is because the loop automatically detects new configuration +files that should be used. The idea of using classes in general and +using certain files matching a class name for a configuration is +adopted from the installation scripts by Casper Dik for Solaris. This +technique proved to be very useful and easy. + +You can group multiple hosts that share the same configuration files +by using the same class. You can also split the whole configuration +data for all clients into several classes and use them like lego +bricks and build the entire configuration for a single client by +assembling the bricks together. + +If a client belongs to class A, we say the class A is defined for +this client. A class has no value, it is just defined or undefined. + +Classes determine how the installation is performed. For example, an +install client can be configured to get the XFCE desktop by just +adding the class XFCE to it. Naturally, also more granular +configurations are possible. For instance, classes can describe how +the hard disk should be partitioned, they can define which software +packages will be installed, or which customization steps are +performed. + +Often, a client configuration is created by only changing or +appending the classes to which this client belongs, making the +installation of a new client very easy. Thus no additional +information needs to be added to the configuration space if the +existing classes suffice for your needs. + +As you can see, classes are a central pillar of customizing your +configuration space and with that your client installation. On how to +define your own classes, refer to [defining classes]. + + +--------------------------------------------------------------------- + +4. Setup your faiserver + +--------------------------------------------------------------------- + +Here’s how to set up the install server in a few minutes. Following +steps are needed: + + 1. Set up the install server + + a. Install FAI packages + b. Create the nfsroot + c. Copy the examples to the config space + d. Configure network daemons + e. Create the PXELINUX configurations + 2. Boot and install clients + + +4.1. Install the FAI packages + +-------------- + + * Install the key of the FAI project package repository. + * Add the URL of the package repository of the FAI project. + * Install the package fai-quickstart on your install server. + +Use these commands for installing: + +# wget -O /etc/apt/trusted.gpg.d/fai-project.gpg https://fai-project.org/download/2BF8D9FE074BCDE4.gpg +# echo "deb http://fai-project.org/download bookworm koeln" > /etc/apt/sources.list.d/fai.list + +or + +# apt install extrepo ; extrepo enable fai + +and then + +# apt-get update +# aptitude install fai-quickstart + +This will also install the packages for DHCP, TFTP and NFS server +daemons. + + +4.2. Create the nfsroot + +-------------- + + * Also enable the package repository of the FAI project in a + different sources.list file which is used when building the + nfsroot. Then, enable the log user for FAI. + +# sed -i -e 's/^#deb/deb/' /etc/fai/apt/sources.list +# sed -i -e 's/#LOGUSER/LOGUSER/' /etc/fai/fai.conf + + * By default, FAI uses http://deb.debian.org as package mirror, + which should attempt to find a fast package repository for you. ^ + [6] Now, we can run fai-setup(8) ^[7] and check if everything + went well. The log file is written to /var/log/fai/fai-setup.log. + +# fai-setup -v + + * These are some of the lines you will see at the end of fai-setup. + A complete example of fai-setup.log is available on the FAI web + page at https://fai-project.org/logs/fai-setup.log. + +FAI packages and related packages inside the nfsroot: +dracut 059-4 +dracut-live 059-4 +dracut-network 059-4 +dracut-squash 059-4 +fai-client 6.2 +fai-nfsroot 6.2 +fai-setup-storage 6.2 +Waiting for background jobs to finish +fai-make-nfsroot finished properly. +Log file written to /var/log/fai/fai-make-nfsroot.log +Adding line to /etc/exports: /srv/fai/config 192.168.33.250/24(async,ro,no_subtree_check) +Adding line to /etc/exports: /srv/fai/nfsroot 192.168.33.250/24(async,ro,no_subtree_check,no_root_squash) +Reloading nfs-kernel-server configuration (via systemctl): nfs-kernel-server.service. + +Your initial config space is now located in /srv/fai/config +Please don't forget to fill out the FAI questionnaire after you've finished your project with FAI. + +FAI setup finished. +Log file written to /var/log/fai/fai-setup.log + + * fai-setup has created the LOGUSER, the nfsroot and has added + additional lines to /etc/exports. The subdirectories added to / + etc/exports are exported via NFS v3, so all install clients in + the same subnet can mount them via NFS. + + +4.3. Creating the configuration space + +-------------- + +Install the simple examples into the configuration space ^[8]. + +$ fai-mk-configspace + +These examples contain configuration for some sample hosts. Depending +on the host name used, your computer will be configured as follows: + +demohost + A machine which needs only a small hard disk. This machine is + configured with network as DHCP client, and an account demo is + created. +xfcehost + A XFCE desktop is installed, using LVM, and the account demo is + created. +gnomehost + A GNOME desktop is installed, and the account demo is created. +ubuntuhost + A Ubuntu desktop will be installed, and the account demo is + created. +other host names + Hosts with another host name will most notably use the classes + FAIBASE, DHCPC and GRUB. + +All hosts will have an account called demo with password fai. The +root account also has the password fai. + +If the FAI flag menu is added, instead of using the host name for +determing the type of installation, a menu is presented, and the user +can choose a profile for the installation. + + +4.4. Configure the network daemons + +-------------- + +For booting the install client via PXE, the install server needs a +DHCP and a TFTP daemon running. The package fai-quickstart has +already installed the software packages for those daemons. +Additionally the package of the NFS server for exporting the nfsroot +and the config space was installed. + +4.4.1. Configuration of the DHCP daemon + +Ideally, your faiserver should also be your DHCP server. If that is +not the case, instruct the admin responsible of the DHCP server to +configure it according to this section. Optionally, it is possible to +avoid that by using the [autodiscover] feature released in FAI 5.0. + +An example for dhcpd.conf(5) is provided with the fai-doc package. +Start using this example and look at all options used therein. + +# cp /usr/share/doc/fai-doc/examples/etc/dhcpd.conf /etc/dhcp/ + +The only FAI specific information inside this configuration file is +to set filename (DHCP option 67) to fai/pxelinux.0 and to set +next-server (DHCP option 66, also called TFTP server name) and +server-name to the name of your install server. All other information +is only network related data, which is used in almost all DHCP +configurations. Adjust these network parameters to your local needs. + +deny unknown-clients; +option dhcp-max-message-size 2048; +use-host-decl-names on; + +subnet 192.168.33.0 netmask 255.255.255.0 { + option routers 192.168.33.250; + option domain-name "my.example"; + option domain-name-servers 192.168.33.250; + option time-servers faiserver; + option ntp-servers faiserver; + server-name faiserver; + next-server faiserver; + filename "fai/pxelinux.0"; +} + +If you make any changes to the DHCP configuration, you must restart +the daemon. + +# invoke-rc.d isc-dhcp-server restart + +If you have multiple network interfaces, you can define on which +interface the server will listen in /etc/default/isc-dhcp-server. By +default, the DHCP daemon writes its log messages to /var/log/ +daemon.log. + +4.4.2. Adding a host entry to DHCP + +The MAC address is given by the hardware of the network card. For +each install client you collect its MAC address and to map it to an +IP address and to a host name. First, we add the IP address and the +hostname to /etc/hosts ^[9]. + +192.168.33.100 demohost + +The mapping from the MAC address to the IP address is done in the +dhcpd.conf file. Here, we add a host entry using the command +dhcp-edit(8). Here you have to replace 01:02:03:AB:CD:EF ith the MAC +you have found. + +# dhcp-edit demohost 01:02:03:AB:CD:EF + +After calling this command, this is what the host entry in dhcpd.conf +will look like: + +host demohost {hardware ethernet 01:02:03:AB:CD:EF;fixed-address demohost;} + +4.4.3. TFTP + +Normally, you do not need any changes to the TFTP dameon +configuration. The files which are provided by TFTP are located in / +srv/tftp/fai. + +4.4.4. NFS + +The command fai-setup has already set up the NFS daemon and added +some lines to the configuration file /etc/exports. It exports the +directories using NFS v3. + + +4.5. Creating the PXELINUX configuration + +-------------- + +The last step before booting your client for the first time is to +specify what configuration the client should boot when doing PXE +boot. We use the command fai-chboot(8) to create a pxelinux +configuration for each install client. This includes information +about the kernel, the initrd, the config space and some boot +parameters. You should read the manual page, which gives you some +good examples. Here’s the command for starting the installation for +the host demohost. + +$ fai-chboot -IFv -u nfs://faiserver/srv/fai/config demohost + +Booting kernel vmlinuz-4.19.0-5-amd64 + append initrd=initrd.img-4.19.0-5-amd64 ip=dhcp + FAI_FLAGS=verbose,sshd,createvt FAI_CONFIG_SRC=nfs://faiserver/srv/fai/config + +demohost has 192.168.33.100 in hex C0A82164 +Writing file /srv/tftp/fai/pxelinux.cfg/C0A82164 for demohost + +At this point, you should have a working faiserver setup and your +clients should boot into FAI and be able to install one of the +examples. + +In the following section, you can read about planning your +installation, tailoring your configuration space to your particular +needs and extending FAI using hooks. + + +4.6. Custom server + +-------------- + +The faiserver and its setup is by no means static. It is possible to +customize and extend your server. For this, please refer to the +[Customizing your install server setup] section in [advanced]. + + +--------------------------------------------------------------------- + +5. Plan your installation + +--------------------------------------------------------------------- + +Before starting your installation, you should invest a lot of time +into planning your installation. Once you’re happy with your +installation concept, FAI can do all the boring and repetitive tasks +to turn your plans into reality. FAI can’t do good installations if +your concept is imperfect or lacks some important details. Start +planning the installation by answering the following questions: + + * Will I create a Beowulf cluster, or do I have to install some + desktop machines? + * What does my LAN topology look like? + * Do I have uniform hardware? Will the hardware stay uniform in the + future? + * Does the hardware need a special kernel? + * How should the hosts be named? + * How should the local hard disks be partitioned? + * Which applications will be run by the users? + * Do the users need a queuing system? + * What software should be installed? + * Which daemons should be started, and what should the + configuration for these look like? + * Which remote file systems should be mounted? + * How should backups be performed? + +You also have to think about user accounts, printers, a mail system, +cron jobs, graphic cards, dual boot, NIS, NTP, timezone, keyboard +layout, exporting and mounting directories via NFS and many other +things. So, there’s a lot to do before starting an installation. And +remember that knowledge is power, and it’s up to you to use it. +Installation and administration is a process, not a product. FAI +can’t do things you don’t tell it to do. + +You don’t need to start from scratch. Look at the files and scripts +in the configuration space. There are a lot of things you can use for +your own installation. A good paper called "Bootstrapping an +Infrastructure" with more aspects of building an infrastructure is +available at http://www.infrastructures.org/papers/bootstrap/ +bootstrap.html + + +5.1. The configuration space and its subdirectories + +-------------- + +The configuration space is the collection of information about how +exactly to install a client. The central configuration space for all +install clients is located on the install server in /srv/fai/config +and its subdirectories. This will be mounted by the install clients +to /var/lib/fai/config. The main installation command fai(8) uses all +these subdirectories in the order listed except for hooks. + +class/ + Scripts and files to define classes and variables. +disk_config/ + Configuration files for disk partitioning, software RAID, LVM and + file system creation. +basefiles/ + + Normally the file base.tar.xz (located inside the nfsroot) is + extracted on the install client after the new file systems are + created and before package are installed. This is a minimal base + image, created right after calling debootstrap during the + creation of the nfsroot on the install server. If you want to + install another distribution than the nfsroot is, you can put a + tar file into the subdirectory basefiles/ and name it after a + class. Then the command ftar(8) is used to extract the tar file + based on the classes defined. Thus the file has to be named + CLASS.tar.xz not CLASS.base.tar.xz. This is done in task extrbase + . Use this if you want to install another distribution or version + than that running during the installation. + + This basefile can also be received based on FAI classes via HTTP/ + HTTPS or FTP by defining the variable FAI_BASEFILEURL. FAI will + download a file CLASSNAME.tar.xz (or tgz, or tar.gz,…) from this + URL, if CLASSNAME matches a FAI class. + + Example: + +FAI_BASEFILEURL=https://fai-project.org/download/basefiles/ + +The folder must support directory listing. FAI will not probe for +potentially matching files. + +See chapter [otherdists] for how to install different distributions. + +debconf/ + This directory holds all debconf(7) data. The format is the same + that is used by debconf-set-selections(1). +package_config/ + Files with class names contain lists of software packages to be + installed or removed by install_packages(8). Files named + .gpg are added to the list of keys used by apt for trusted + package repositories. +pkgs/ + This directory can contain subdirectories named by classes. You + can put .deb or .rpm files into these subdirectories. FAI will + then install these packages without the need of creating the + metadata of a package repository. +scripts/ + Scripts for your local site customization. Used by fai-do-scripts + (1). +files/ + Files used by customization scripts. Most files are located in a + subtree structure which reflects the ordinary directory tree. For + example, the templates for nsswitch.conf are located in $FAI/ + files/etc/nsswitch.conf and are named according to the classes + that they should match: $FAI/files/etc/nsswitch.conf/NIS is the + version of /etc/nsswitch.conf to use for the NIS class. Note that + the contents of the files directory are not automatically copied + to the target machine, rather they must be explicitly copied by + customization scripts using the fcopy(8) command. +hooks/ + Hooks are user defined programs or scripts, which are called + during the installation process. They can extend or replace the + default tasks. The file name must be of format taskname.CLASSNAME + [.sh]. A hook called updatebase.DEBIAN is executed prior to the + task updatebase and only if the install client belongs to the + class DEBIAN. + + +5.2. Defining classes + +-------------- + +There are different possibilities to define classes: + + 1. Some default classes are defined for every host: DEFAULT, LAST + and its host name. + 2. Classes may be listed within a file (by default in class/ + ) + 3. Classes may be dynamically defined by scripts. + +The last option is a very nice feature, since these scripts will +define classes in a very flexible way. For example, several classes +may be defined only if certain hardware is identified or a class is +defined depending on the network subnet information. + +All names of classes, except the host name, are written in uppercase. +They must not contain a hyphen, a hash, a semicolon or a dot, but may +contain underscores and digits. + +The task defclass calls the command fai-class(1) to define classes. +All scripts matching ^[0-9][0-9]* (they start with two digits) in the +subdirectory $FAI/class are executed for defining classes. Everything +that is printed to STDOUT is automatically defined as a class. For +more information on defining class, read the manual pages for +fai-class(1). The script 50-host-classes (see below a stripped +version) is used to define classes depending on the host name. + +# use a list of classes for our demo machines +case $HOSTNAME in + demohost) + echo "FAIBASE GRUB DEMO" ;; + xfcehost) + echo "FAIBASE GRUB DEMO XORG XFCE LVM";; + faiserver) + echo "FAIBASE DEBIAN DEMO FAISERVER" ;; + ubuntuhost) + echo "FAIBASE DEBIAN DEMO UBUNTU JAMMY JAMMY64 XORG";; + *) + echo "FAIBASE DEBIAN DEMO" ;; +esac + +Host names should rarely be used for the configuration files in the +configuration space. Instead, a class should be defined and then +added for a given host. This is because most of the time the +configuration data is not specific for one host, but can be shared +among several hosts. + +The order of the classes is important because it defines the priority +of the classes from low to high. + + +5.3. Defining variables + +-------------- + +The task defvar defines the variables for the install client. +Variables are defined by scripts in class/*.var. All global variables +can be set in DEFAULT.var. For groups of hosts use a class file. For +a single host use the file $HOSTNAME .var. Also here, it’s useful to +study all the examples. + +The following variables are used in the examples and may also be +useful for your installation: + +FAI_ACTION + Set the action FAI should perform. Normally this is done by + fai-chboot(8). If you can’t use this command, define this + variable i.e. in the script LAST.var. +FAI_ALLOW_UNSIGNED + If set to 1, FAI allows the installation of packages from + unsigned repositories. +CONSOLEFONT + Is the font which is loaded during installation by setfont(8). +KEYMAP + Defines the keyboard map files in /usr/share/keymaps and $FAI/ + files. You don’t need to specify the full path, since this file + will be located automatically. +ROOTPW + The encrypted root password for the new system. You can use crypt + (3), md5 and other hash types for the password. Use mkpasswd(1) + for creating the hash for a certain password. For example, to + generate a md5 hash for the password use + +$ echo "yoursecrectpassword" | mkpasswd -m yescrypt -s + +UTC + Set hardware clock to UTC if UTC=yes. Otherwise set clock to + local time. See clock(8) for more information. +TIMEZONE + Is the file relative to /usr/share/zoneinfo/ which indicates your + time zone. E.g.: TIMEZONE=Europe/Berlin. +MODULESLIST + A list of kernel modules which are loaded during boot of the new + system (written to /etc/modules). + + +5.4. Hard disk configuration + +-------------- + +The tool setup-storage(8) reads a file in $FAI/disk_config for the +disk configuration. This file describes how all the local disks will +be partitioned, which file system types should be created (like ext3/ +4, xfs, btrfs), and where they are mounted to. You can also create +software RAID and LVM setups using this config file. It’s also +possible to preserve the disk layout or to preserve the data on +certain partitions. + +During the installation process all local file systems are mounted +relative to /target. For example if you specify the mount point /home +in a disk configuration file this will be the directory /target/home +during the installation process and will become /home for the new +installed system. + + +5.5. Extract base file + +-------------- + +A base file is only needed when installing a distribution which is +different from the one in the nfsroot. + + +5.6. Debconf preseeding + +-------------- + +You can use the format described in debconf-set-selections(1). + + +5.7. Access to the package repository + +-------------- + +FAI supports http, https and NFS for accessing the package mirror. +Set the variable $FAI_DEBMIRROR for using NFS. + + +5.8. Software package configuration + +-------------- + +Before installing packages, FAI will add the content of all files +named package_config/class.gpg to the list of apt keys. If your local +repository is signed by your keyid AB12CD34 you can easily add this +key, so FAI will use it during installation. Use this command for +creating the CLASS.gpg file: + +faiserver$ gpg --export AB12CD34 > /srv/fai/config/package_config/MYCLASS.gpg + +The script install_packages(8) installs the selected software +packages. It reads all configuration files in $FAI/package_config +whose file name matches a defined class. The syntax is very simple. + +# an example package class + +PACKAGES taskinst +german + +PACKAGES install-norec +adduser nmap +less zstd + +PACKAGES remove +gpm xdm + +PACKAGES install GRUB_PC +grub-pc + +Comments are starting with a hash (#) and are ending at the end of +the line. Every package command begins with the word PACKAGES +followed by a command name, which maps to a different package tool +like apt-get, aptitude or dnf for e.g. The command defines which +command will be used to install the packages named after this +command. The list of all available commands can be listed using +install_packages -H. Supported package tools are: apt, apt-get, +aptitude, smart, yast, dnf, rpm, zypper + +hold + Put a package on hold. This package will not be handled by dpkg, + e.g not upgraded. +install + Install all packages (using apt-get) that are specified in the + following lines. If a hyphen is appended to the package name + (with no intervening space), the package will be removed, not + installed. All package names are checked for misspellings. Any + package which does not exist, will be removed from the list of + packages to install. So be careful not to misspell any package + names. +install-norec + Like install but without installing the recommended packages. +remove + Remove all packages that are specified in the following lines. + Append a + to the package name if the package should be + installed. +taskinst + Install all packages belonging to the tasks that are specified in + the following lines using tasksel(1). You can also use aptitude + for installing tasks. +aptitude + Install all packages with the command aptitude. This will be the + default in the future and may replace apt-get and taskinst. + Aptitude can also install task packages. +aptitude-r + Same as aptitude with option --with-recommends. +unpack + Download package and unpack only. Do not configure the package. +dselect-upgrade + Set package selections using the following lines and install or + remove the packages specified. These lines are the output of the + command dpkg --get-selections. It’s not recommended to use this + format, since you are also specifying all packages which are only + installed because of a dependency or a recommends. It’s better + just to specify the pacakge you like to have, and to let FAI (and + apt-get) resolve the dependencies. + +Multiple lines with lists of space separated names of packages follow +the PACKAGES lines. All dependencies are resolved. Packages with +suffix - (eg. lilo-) will be removed instead of installed. The order +of the packages doesn’t matter. If you like to install packages from +another release than the default, you can append the release name to +the package name like in openoffice.org/etch-backports. You can also +specify a certain version like apt=0.3.1. More information on these +features are described in aptitude(8). + +You can specify additional parameters for the package manager adding +key=value after PACKAGES . Currently we support release= + which will add -t when installing packages. + +Example: + +PACKAGES install-norec release=testing +nvidia-smi + +This will install the nvidia-smi package from the testing release, +including the dependencies. Don’t forget to add an entry into +sources.list. You may also want to adjust the apt pinning (see +apt_references(5)). + +A line which contains the PRELOADRM commands, downloads a file using +wget(1) into a directory before installing the packages. Using the +file: URL, this file is copied from $FAI_ROOT to the download +directory. For example the package realplayer needs an archive to +install the software, so this archive is downloaded to the directory +/root. After installing the packages this file will be removed. If +the file shouldn’t be removed, use the command PRELOAD instead. + +You can add an arbitrary boolean expression using FAI classes to +define when the list of packages should be installed. Here, the +packages are only installed if the class XORG is defined but the +class MINT is not defined. + +Example: + +PACKAGES install UBUNTU && XORG && ! MINT +ubuntu-standard +ubuntu-desktop + +The old way of adding some logic in the PACKAGES lines is still +supported: It’s possible to append a list of class names after the +command for apt-get. So this PACKAGES command will only be executed +when at least one of the corresponding classes is defined (logical +OR). So you can combine many small files into the file DEFAULT. + +If you want to remove a package name from a certain class was part of +this class before, you should not remove the package name from the +class file, but instead append a dash (-) to it. This will make sure +that the package is removed during a softupdate on hosts which were +installed using the old class definition which included this package +name. + +If you specify a package that does not exist this package will be +removed automatically from the installation list only if the command +install is used. + +The concept of classes priority allows a higher priority class (one +that comes later in the sequence of classes) to override the +selection of packages of a lower priority class. For this to work +correctly, the higher priority class must use the same PACKAGES +command (e.g. PACKAGES install-norec instead of just PACKAGES install +) as the one used by the class it is trying to override. This is +useful to suppress installation of a package, for example, to avoid +installing the linuxlogo package installed by class FAIBASE: + +# example of how to override: +# +# On FAIBASE we have: +# PACKAGES install-norec +# linuxlogo +# +# We want to _not_ install linuxlogo, and it is in a +# install-norec section, so we must also use install-norec. + +PACKAGES install-norec +linuxlogo- + + +5.9.  Customization scripts + +-------------- + +The command fai-do-scripts(1) is called to execute all scripts in +this directory. If a directory with a class name exists, all scripts +matching ^[0-9][0-9]* are executed in alphabetical order. So it’s +possible to use scripts of different languages (shell, cfengine, +Perl, Python, Ruby, expect,..) for one class. + +Thoses scripts write their output to sripts.log. The file status.log +contains the names of all scripts executed and their exit status. + +5.9.1. Shell scripts + +Most scripts are Bourne shell scripts. Shell scripts are useful if +the configuration task only needs to call some shell commands or +create a file from scratch. In order not to write many short scripts, +it’s possible to use the ifclass command for testing if certain +classes are defined. + +ifclass -o A B C + +checks if one of classes A, B or C are defined. Using -a (logical +AND) checks if all classes of a list are defined. The command ifclass +C checks if only class C is defined. + +For copying files with classes, use the command fcopy(8). If you want +to extract an archive using classes, use ftar(8). For appending lines +to a configuration file use ainsl(1) instead of just echo string >> +filename. + +FAI also supports zsh(1) scripts during the customization task. +Within scripts, the variable $classes holds a space separated list +with the names of all defined classes. + +5.9.2. Cfengine scripts + +CFEngine has a rich set of functions to edit existing configuration +files, e.g LocateLineMatching, ReplaceAll, InsertLine, +AppendIfNoSuchLine, HashCommentLinesContaining. But it can’t handle +variables which are undefined. If a variable is undefined, the whole +cfengine script will abort. + +More information can be found in the manual page cfengine(8) or at +the cfengine homepage https://www.cfengine.com. + + +5.10. Hooks + +-------------- + +Hooks let you specify functions or programs which are run at certain +steps of the installation process. Before a task is called, FAI +searches for existing hooks for this task and executes them. As you +might expect, classes are also used when calling hooks. Hooks are +executed for every defined class. You only have to create the hook +with the name for the desired class and it will be used. If several +hooks for a task exists, they are called in the order defined by the +classes. If debug is included in $FAI_FLAG the option -d is passed to +all hooks, so you can debug your own hooks. If some default tasks +should be skipped, use the subroutine skiptask and a list of default +tasks as parameters. In the examples provided, the hooks of the class +CENTOS skips some Debian specific tasks. + +The directory $FAI/hooks/ contains all hooks. A hook is an executable +file following the naming scheme taskname.CLASSNAME[.sh] (e.g. +repository.CENTOS or 'savelog.LAST.sh). The task name specifies which +task to precede executing this hook, if the specified class is +defined for the installing client. See section [tasks] for a complete +list of default tasks that can be used. + +A hook of the form hookprefix.classname can’t define variables for +the installation script, because it’s a subprocess. But you can use +any binary executable or any script you wrote. Hooks that have the +suffix .sh (e.g. partition.DEFAULT.sh) must be Bourne shell scripts +and are sourced. So it’s possible to redefine variables for the +installation scripts. + +In the first part of FAI, all hooks with prefix confdir are called. +Those hooks can not be located in the config space, since it’s not +yet available. Therefore these hooks are the only hooks located in +$nfsroot/$FAI/hooks on the install server. All other hooks are found +in $FAI_CONFIGDIR/hooks on the install server. + +All hooks that are called before classes are defined can only use the +following classes: DEFAULT $HOSTNAME LAST. If a hook for class +DEFAULT should only be called if no hook for class $HOSTNAME is +available, insert these lines to the default hook: + +hookexample.DEFAULT: + +#! /bin/sh + +# skip DEFAULT hook if a hook for $HOSTNAME exists +scriptname=$(basename $0 .DEFAULT) +[-f $FAI/hooks/$scriptname.$HOSTNAME ] && exit +# here follows the actions for class DEFAULT +. +. + +Some examples for what hooks could be used: + + * Load kernel modules before classes are defined in $FAI/class. + * Send an email to the administrator if the installation is + finished. + * Install a diskless client and skip local disk partitioning. + * Have a look at hooks/debconf.IMAGE for how to clone a machine + using a file system image. + + +5.11. FAI flags + +-------------- + +The variable $FAI_FLAGS contains a space separated list of flags. +Flags are normally defined in the pxelinux.cfg file which should be +created by fai-chboot(1). The following flags are known: + +verbose + Create verbose output during installation. This should always be + the first flag, so consecutive definitions of flags will be + verbosely displayed. +debug + Create debug output. No unattended installation is performed. + During package installation you have to answer all questions of + the postinstall scripts on the client’s console. A lot of debug + information will be printed out. This flag is only useful for FAI + developers. +sshd + Start the ssh daemon to enable remote logins. You can then log in + as root to all install clients during the installation. The + default password is fai and can be changed by setting FAI_ROOTPW + in nfsroot.conf(5). To log in from your server to the install + client (named demohost in this example) use: + +$ ssh root@demohost +Warning: Permanently added 'demohost,192.168.33.100' to the list of known hosts. +root@demohost's password: + +This is only the root password during the installation process, not +for the new installed system. You can also log in without a password +when using $SSH_IDENTITY. + +createvt + Create two virtual terminals and execute a bash if ctrl-c is + typed in the console terminal. The additional terminals can be + accessed by typing Alt-F2 or Alt-F3. Otherwise, no terminals are + available and typing ctrl-c will reboot the install client. + Setting this flag is useful for debugging. If you want an + installation which should not be interruptible, do not set this + flag. +menu + This enables a user menu for selecting a profile. All files class + /*.profile are read and a curses based menu will be created. +screen + Run FAI inside a screen(1) session. The session is called FAI. If + you log in via ssh from remote you can attach to the session + using: + +$ screen -x + +tmux + Run FAI inside a tmux(1) session. The session is called FAI. If + you log in via ssh from remote you can attach to the session + using: + +$ tmux attach + +reboot + Reboot the install client after installation is finished without + typing RETURN on the console. If this flag is not set, and + error.log contains anything, the install client will stop and + wait that you press RETURN. If no errors occurred, the client + will always reboot automatically. +halt + Halt the install client at the end of the installation, instead + of rebooting into the new system. +initial + Used by setup-storage(8). Partitions marked with + preserve_reinstall are preserved unless this flag is set. Often, + this flag is set in a file class/*.var by using setting + flag_initial=1. + + +--------------------------------------------------------------------- + +6.  FAI installs your plan + +--------------------------------------------------------------------- + + +6.1. The early part of an installation + +-------------- + +After the kernel has booted, it mounts the root file system via NFS +from the install server and starts the script /usr/sbin/fai ^[10]. +This script controls the sequence of the installation. No other +scripts in /etc/init.d/ are used. + +The configuration space is made available via the configured method +(an NFS mount by default) from the install server to the path defined +in $FAI ^[11] + + +6.2. Boot messages + +-------------- + +When booting the install client from network card with PXE you will +see some messages like this: + +Managed PC Boot Agent (MBA) v4.00 +Pre-boot eXecution Environment (PXE) v2.00 +DHCP MAC ADDR: 00 A2 A3 04 05 06 +DHCP.../ + +CLIENT MAC ADDR: 00 A2 A3 04 05 06 GUID: 3D6C4552 +CLIENT IP: 192.168.33.100 MASK: 255.255.255.0 DHCP IP: 192.168.33.250 +GATEWAY IP: 192.168.33.1 + +!PXE entry point found (we hope) at 9854:0106 via plan A +UNDI code segment at: 9854 len 5260 +UNDI data segment at: 921D len 63A2 +Getting cached packet 01 02 03 +My Ip address seems to be C0A82164 192.168.33.100 +ip=192.168.33.100:192.168.33.250:192.168.33.1:255.255.255.0 +BOOTIF=01-00-A2-A3-04-05-06 +SYSUUID= +TFTP prefix: fai/ +Trying to load pxelinux.cfg/C0A82164 + +Loading vmlinuz-6.1.0-17-amd64.................. +Loading initrd.img-6.1.0-17-amd64......................ready. + +At this point the install client has successfully received the +network config via DHCP and the kernel and initrd via TFTP. It now +boots the Linux kernel and the initrd. If everything went right, the +initrd mounts the nfsroot ^[12] and the FAI scripts are started. The +first thing you see is the red FAI copyright message. + + ------------------------------------------------- + Fully Automatic Installation - FAI + + 6.2 (c) 1999-2024 + Thomas Lange + ------------------------------------------------- + +Calling task_confdir +Kernel currently running: Linux 6.1.0-17-amd64 x86_64 GNU/Linux +Kernel parameters: BOOT_IMAGE=vmlinuz-6.1.0-17-amd64 initrd=initrd.img-6.1.0-17-amd64 \ + ip=dhcp rw root=192.168.33.250:/srv/fai/nfsroot rootovl FAI_FLAGS=verbose,sshd,createvt + FAI_ACTION=install FAI_CONFIG_SRC=nfs://faiserver/srv/fai/config +Reading /tmp/fai/boot.log +FAI_FLAGS: verbose sshd createvt +Monitoring to server faiserver enabled. +FAI_CONFIG_SRC is set to nfs://faiserver/srv/fai/config +Configuration space faiserver:/srv/fai/config mounted to /var/lib/fai/config +Source hook: setup.DEFAULT.sh +setup.DEFAULT.sh OK. +Calling task_setup +FAI_FLAGS: verbose sshd createvt +Press ctrl-c to interrupt FAI and to get a shell +Starting FAI execution - 20240117_194012 +Calling task_defclass +fai-class: Defining classes. +Executing /var/lib/fai/config/class/01-classes. +01-classes OK. +Executing /var/lib/fai/config/class/10-base-classes. +10-base-classes OK. +Executing /var/lib/fai/config/class/20-hwdetect.sh. +ens3 UP 52:54:00:11:23:01 +ens3 UP 192.168.33.101/24 fe80::5054:ff:fe11:2301/64 +New disklist: vda +20-hwdetect.sh OK. +Executing /var/lib/fai/config/class/40-parse-profiles.sh. +40-parse-profiles.sh OK. +Executing /var/lib/fai/config/class/41-warning.sh. +41-warning.sh OK. +Executing /var/lib/fai/config/class/50-host-classes. +50-host-classes OK. +Executing /var/lib/fai/config/class/60-misc. +60-misc OK. +Executing /var/lib/fai/config/class/85-efi-classes. +85-efi-classes OK. +List of all classes: DEFAULT LINUX AMD64 DHCPC FAIBASE DEBIAN DEMO GRUB_PC demohost2 LAST + +You can also see the list of FAI classes, that are defined for this +host. This list is very important for the rest of the installation. + +The first task is called confdir, which is responsible for getting +access to the config space. Here, we use an NFS mount from the +install server as you can see on the console (and later in the logs). + +FAI_CONFIG_SRC is set to nfs://faiserver/srv/fai/config +Configuration space faiserver:/srv/fai/config mounted to /var/lib/fai/config + +Before the installation is started ($FAI_ACTION=install) the computer +beeps three times. So, be careful when you hear three beeps but you +do not want to perform an installation and let FAI erase all yout +data on the local disk! + + +6.3. Rebooting the computer into the new system + +-------------- + +For rebooting the computer during or at the end of the installation +you should use the command faireboot in favour of the normal reboot +command. Use faireboot also if logged in from remote. If the +installation hasn’t finished, use faireboot -s, so the log files are +also copied to the install server. + +If the installation has finished successfully, the computer should +boot a small Debian system. You can login as user demo or root with +password fai. + + +6.4. Starting FAI (task confdir) + +-------------- + +After the install client has booted only the script /usr/sbin/fai is +executed. It will do some minimal initialization. The variable +$FAI_CONFIG_SRC ^[13] is used to get access to the FAI configuration +space which is then available in the directory $FAI ^[14]. FAI will +not proceed without the config space. + +You can access the config space using different methods. Supported +methods are: nfs:, file:, cvs:, svn: git:, hg:, http: and detect:. +See fai.conf(5) for a detailed description of these methods. + + +6.5. Defining classes and variables (tasks defclass and defvar) + +-------------- + +The command fai-class(1) executes scripts in $FAI/class for defining +classes. If the scripts write a string to stdout, this will be +defined as a class. Read all the details in the man page of fai-class +(1). + +After defining the classes, every file matching .var with a prefix +which matches a defined class is sourced to define variables. It must +contain valid shell code. + + +6.6. Partitioning local disks, creating file systems (task partition) + +-------------- + +For the disk partitioning exactly one disk configuration file from +$FAI/disk_config is selected using classes. + +The format of the disk configuration is similar to a fstab file. + +The partitioning tool setup-storage(8) performs all commands +necessary for creating the disk partition layout, software RAID, LVM +and for creating the file systems. Disks and partitions may easily be +referenced by disk1.1, disk2.4 etc. Read the manual page of +setup-storage(8) for a detailed description and some examples of the +format. + + +6.7. Debconf preseeding (task debconf) + +-------------- + +Files in $FAI/debconf are used for the usual debconf(7) preseeding if +the file names match a class name. + + +6.8. Installing software packages (task instsoft) + +-------------- + +The command install_packages(8) reads the config files from $FAI/ +package_config in a class based manner and installs software packages +on the new file system. + +It installs the packages using apt-get(8), aptitude(1), yum or other +package tools without any manual interaction needed. Package +dependecies are also resolved by the package tools. + +The format of the configuration files is described in [packageconfig] +. + +Additionaly FAI will install packages (.deb or .rpm') from the +directories $FAI/pkgs/. + + +6.9. Site specific customization (task configure) + +-------------- + +Often the default configurations of the software packages will not +meet your site-specific needs. You can call arbitrary scripts which +adjust the system configuration. Therefore the command fai-do-scripts +(1) executes scripts in $FAI/scripts in a class based manner. It is +possible to have several scripts of different types (shell, cfengine, +…) to be executed for one class. + +The default set of scripts in $FAI/scripts include examples for +installing Debian and Rocky Linux machines. They set the root +password, add a user account (set by '$username, default to demo), +set the timezone, configure the network for DHCP or using a fixed IP +address, setup grub and more. They should do a reasonable job for +your installation. You can edit them or add new scripts to match your +local needs. + +More information about these scripts are described in [cscripts]. + + +6.10. Saving log files (task savelog) + +-------------- + +When all tasks are finished, the log files are written to /var/log/ +fai/$HOSTNAME/install/ ^[15] on the new system and to the account on +the install server if $LOGUSER is defined (you have to enable this in +/srv/fai/config/class/FAIBASE.var). It is also possible to specify +another host as log saving destination through the variable +$LOGSERVER. If $LOGSERVER is not defined, FAI uses the variable +$SERVER which is only defined during an initial installation (by +get-boot-info). + +Additionally, two symlinks will be created to indicated the last +directory written to. The symlink last points to the log directory of +the last FAI action performed. The symlinks last-install and +last-sysinfo point to the directory of the last corresponding action. +By default log files will be copied to the log server using scp. You +can use the variable $FAI_LOGPROTO in file fai.conf(5) to choose +another method for saving logs to the remote server. Here’s an +example of the symlink structure: + +lrwxrwxrwx 1 fai fai 23 Dec 2 2013 last-sysinfo -> sysinfo-20131202_161237 +drwxr-xr-x 2 fai fai 4096 Dec 2 2013 sysinfo-20131202_161237 +drwxr-xr-x 2 fai fai 4096 Feb 14 2014 install-20140214_142150 +drwxr-xr-x 2 fai fai 4096 Dec 2 11:47 install-20141202_113918 +lrwxrwxrwx 1 fai fai 23 Dec 4 13:22 last-install -> install-20141204_131351 +lrwxrwxrwx 1 fai fai 23 Dec 4 13:22 last -> install-20141204_131351 +drwxr-xr-x 2 fai fai 4096 Dec 4 13:22 install-20141204_131351 + +Examples of the log files can be found at https://fai-project.org/ +logs. + + +6.11. Reboot the new installed system + +-------------- + +Before rebooting, the install client calls fai-chboot -d +on the install server, to disable its own PXELINUX configuration. +Otherwise, it would restart the installation during the next boot. +Normally this should boot the new installed system from its second +boot device, the local hard disk. + +At the end, the system is automatically rebooted if "reboot" was +added to $FAI_FLAGS. + + +--------------------------------------------------------------------- + +7. Advanced FAI topics + +--------------------------------------------------------------------- + + +7.1. Checking parameters received from DHCP servers + +-------------- + +If the install client boots you can check if all information from the +DHCP daemon are received correctly. The received information is +written to /tmp/fai/boot.log. An example of the result of a DHCP +request can be found in the sample log files. + + +7.2. Monitoring multiple client installations + +-------------- + +You can monitor the installation of all install clients with the +command fai-monitor(8). All clients check if this daemon is running +on the install server (or the machine defined by the variable +$monserver). Each time a task starts or ends, a message is sent. The +FAI monitor daemon prints this messages to standard output. There’s +also a graphical frontend available, called fai-monitor-gui(1). + +$ fai-monitor | fai-monitor-gui - & + + +7.3. Collecting Ethernet addresses for multiple hosts + +-------------- + +You have to collect all Ethernet (MAC) addresses of the install +clients and assign a host name and IP address to each client. To +collect the MAC addresses, boot your install clients. You can already +do this before any DHCP daemon is running in your subnet. They will +fail to boot (because of the missing DHCP or missing TFTP), but you +can still collect the MAC addresses. + +While the install clients are booting, they send broadcast packets to +the LAN. You can log the MAC addresses of these hosts by running the +following command simultaneously on the server: + +faiserver# tcpdump -qtel broadcast and port bootpc >/tmp/mac.list + +After the hosts have been sent some broadcast packets abort tcpdump +by typing ctrl-c. You get a list of all unique MAC addresses with +these commands: + +faiserver$ perl -ane 'print "\U$F[0]\n"' /tmp/mac.list|sort|uniq + +After that, you only have to assign these MAC addresses to host names +and IP addresses (/etc/ethers and /etc/hosts or corresponding NIS +maps). With this information you can configure your DHCP daemon (see +the section [bootdhcp]). ^[16] + +7.3.1. Debugging the network traffic + +If the client can’t successfully boot from the network card, use +tcpdump(8) to look for Ethernet packets between the install server +and the client. Search also for entries in several log files made by +tftpd(8) and dhcpd(8) : + +faiserver$ egrep "tftpd|dhcpd" /var/log/* + + +7.4. Details of PXE booting + +-------------- + +Here we describe the details of PXE booting, which are only needed if +you have problems when booting your install clients. + +Almost all modern bootable network cards support the PXE boot +environment. PXE is the Preboot Execution Environment. This requires +the PXELINUX bootloader and a special version of the TFTP daemon, +which is available in the Debian packages pxelinux and tftpd-hpa. PXE +booting also needs a DHCP server, so that the network card can +configure its IP parameters. This is the sequence of a PXE boot: + + * Network card of the client sends its MAC address + * DHCP server replies with IP configuration for the client + * Network card configures IP + * Install client gets the pxelinux.0 binary via TFTP + * Get the pxelinux.cfg/C0A8210C configuration file via TFTP + * C0A8210C is the IP address of the client in hexadecimal + * This configuration contains kernel, initrd and additional kernel + command line parameters, which was created by fai-chboot. + * Get the kernel and initrd via TFTP. + +Example of a pxelinux.cfg file: + +default fai-generated + +label fai-generated +kernel vmlinuz-6.1.0-17-amd64 +append initrd=initrd.img-6.1.0-17-amd64 ip=dhcp root=/srv/fai/nfsroot rootovl FAI_FLAGS=verbose,sshd,createvt FAI_CONFIG_SRC=nfs://faiserver/srv/fai/config FAI_ACTION=install + +See /usr/share/doc/syslinux/pxelinux.doc for more detailed +information about PXELINUX. FAI uses the lpxelinux.0 binary which +also supports loading the kernel and initrd via FTP or HTTP. The +command fai-chboot(8) supports this with the option -U. + + +7.5. Customizing your install server setup + +-------------- + + * local/faster package mirror + * different loguser + * local root pw inside nfsroot + +The configuration for the FAI package (not the configuration data for +the install clients) is defined in fai.conf(5). Definitions that are +only used for creating the nfsroot are located in nfsroot.conf(5). +Check these important variables in nfsroot.conf before calling +fai-setup or fai-make-nfsroot. + +FAI_DEBOOTSTRAP + Building the nfsroot uses the command debootstrap(8). It needs + the location of a Debian mirror and the name of the distribution + (like bullsseye, bookworm, sid) for which the basic Debian system + should be built. Do not use different distributions here and in / + etc/fai/apt/sources.list. This will create a broken nfsroot. +NFSROOT_ETC_HOSTS + This variable is only needed if the clients do not have access to + a DNS server. This multiline variable is added to /etc/hosts + inside the nfsroot. Then the install clients can access those + hosts by name without using DNS. + +The content of /etc/fai/apt/sources.list is used by the install +server and also by the clients. If your install server has multiple +network cards and different host names for each card (as for a +Beowulf server), use the install server name which is known by the +install clients. + +If you have problems running fai-setup, they usually stem from +fai-make-nfsroot(8) which is called by former command. Adding -v +gives you a more verbose output which helps you pinpoint the error. +The output is written to /var/log/fai/fai-make-nfsroot.log. ^[17] + +The setup also creates the account fai (defined by $LOGUSER) if not +already available. So you can add a user before calling fai-setup(8) +using the command adduser(8) and use this as your local account for +saving log files. The log files of all install clients are saved to +the home directory of this account. You should change the primary +group of this account, so this account has write permissions to /srv/ +tftp/fai in order to call fai-chboot for creating the PXE +configuration for the hosts. + +When you make changes to fai.conf, nfsroot.conf the nfsroot has to be +rebuilt by calling fai-make-nfsroot(8). If you only like to install a +new kernel package to the nfsroot add the flags -k or -K to +fai-make-nfsroot. This will not recreate your nfsroot, but only +updates your kernel and kernel modules inside the nfsroot or add +additional packages into the nfsroot. + + +7.6. Creating a FAI CD or and USB stick + +-------------- + +You can easily create an installation CD (or USB stick) of your +network installation setup. This will perform the same installation +and configuration from CD without the need of the install server. +Therefore you need to create a partial mirror of all Debian packages +needed for your FAI classes (using fai-mirror(1)). Then the command +fai-cd(8) will put this mirror, the nfsroot and the config space onto +a bootable CD. That’s it! + +To easily create the installation CD, you can use the following +command (for more tuning details see fai-cd(8)): + + faiserver# fai-cd -m fai-cd.iso + +This installation CD contains all data needed for the installation. +The command fai-cd(8) puts the nfsroot, the configuration space and a +subset of the Debian mirror onto a CD-ROM. A partial package mirror +is created using the command fai-mirror(1) which contains all +packages that are used by the classes used in your configuration +space. A sample ISO image is available at https://fai-project.org/ +fai-cd. + +Using the command dd(1) you can also create a bootable USB stick by +just writing the content of the ISO file to your USB stick (here the +stick is /dev/sdf). + + faiserver# dd if=fai-cd.iso of=/dev/sdf bs=1M + +mk-data-partition is a tool that extends an ISO (that will be copied +to an USB stick) or an USB stick containing an ISO with an ext4 or +exFAT partition and sets the file system label to MY-DATA. This +partition is automatically mounted to /media/data by FAI. You can +copy your own .deb packages into this data partition und the +subdiretories pkgs/. FAI will then install these packages +if the equivalent class is defined. + +Example how to use mk-data-partition: + +# mk-data-partition -s 1G -c faicd-large.iso A B + +The former command creates the data partition of size 1 Gbytes inside +the ISO file and copy directories A and B to it. You can then copy +the modified ISO onto an USB stick. + +If the ISO is already on the USB stick and if it’s available as dev/ +sdf, you can add a data partition of type exFAT will will use the +whole remaining part of the USB stick by using this command: + +# mk-data-partition -F /dev/sdf + + +7.7. Creating VM disk images using FAI + +-------------- + +The command fai-diskimage(8) creates disk images, which can be used +with a virtual machine like KVM, VMware, VirtualBox or a cloud +service like OpenStack, GCE, EC2 and others. The installation process +performs the normal FAI tasks on a raw disk image. After the +installation you can boot the disk image and have a running system. +The disk image can also be converted to qcow2 format. You do not need +to setup the FAI nfsroot when only using fai-diskimage. But you need +a basefile in your configuration space. Setting the variable +$FAI_BASEFILEURL will automatically download an appropriate base file +into your config space. + +Here’s an example how to create a raw disk image for a host called +cloud3, with a small set of software packages: + +# export FAI_BASEFILEURL=https://fai-project.org/download/basefiles/ +# fai-diskimage -vu cloud3 -S2G -cDEBIAN,BOOKWORM64,AMD64,FAIBASE,GRUB_PC,DHCPC,DEMO,CLOUD,LAST disk.raw + +This command will create a disk image called ubuntu.qcow2 for a +Ubuntu 16.04 desktop with hostname set to foobar. + +# export FAI_BASEFILEURL=https://fai-project.org/download/basefiles/ +# cl=DHCPC,UBUNTU,JAMMY,JAMMY64,AMD64,XORG,LAST +# fai-diskimage -Nvu foobar -S5G -c$cl ubuntu.qcow2 + +You can give disk images a try without installing FAI, if you visit +https://fai-project.org/FAIme/cloud + + +7.8. Creating a bootable live image + +-------------- + +Creating a bootable live ISO is easy with FAI. You only need two +steps. First, create your live environment using the command fai +dirinstall. Don’t forget to add the class LIVEISO. Then create the +live ISO using fai-cd: + +# cl="DEBIAN,BOOKWORM64,AMD64,FAIBASE,XFCE,XORG,DHCPC,DEMO,LIVEISO,LAST" +# LC_ALL=C fai -v dirinstall -u xfce33 -c $cl \ + -s file:///srv/fai/config /srv/xfce +# fai-cd -s500 -MH -d none -g /etc/fai/grub.cfg.live \ + -n /srv/xfce live.iso + +The nfsroot is not needed for a live ISO. Currently there’s no live +ISO of the install server available. + + +7.9. Building cross-architecture disk images + +-------------- + +Starting FAI 5.4 it’s now possible to build a disk image for +different architectures than the host is running. For example you can +build an image for 64-bit ARM architecture (aarch64) on a host +running on amd64 architecture. Here are the steps do to: + +# apt install qemu-system-arm qemu-user-static fai-server fai-setup-storage fai-doc qemu-utils +# fai-mk-configspace + +# export FAI_BASEFILEURL=https://fai-project.org/download/basefiles/ +# fai-diskimage -vu armhost -S2G -cDEFAULT,DHCPC,DEBIAN,ARM64,BUSTER_ARM64,FAIBASE,DEMO,CLOUD,LAST arm64.raw +# chown your_user_id arm64.raw +# cp /var/log/fai/armhost/last/vmlinuz* vmlinuz +# cp /var/log/fai/armhost/last/initrd.img* initrd + +Then you can run qemu as a normal user: + +> qemu-system-aarch64 -m 1000 -M virt,gic_version=3 -cpu cortex-a57 -drive file=arm64.raw,if=virtio,index=1 -no-reboot -nographic -name ARM64 -net nic,name=eth0,model=virtio -net user,name=eth0,-kernel vmlinuz -initrd initrd -append "console=ttyAMA0 rw ip=dhcp root=/dev/vda1 net.ifnames=0" + +This works similar for other architectures. Keep in mind, that qemu +network setup will have poor performance if not using the virtio +driver as above or tap devices. + +You can find the base files for many architectures at https:// +fai-project.org/download/basefiles/, or use mk-basefile to create +your own. + + +7.10. FAI rescue system + +-------------- + +If you set the variable $FAI_ACTION to sysinfo (for e.g. by using +fai-chboot -S), the client will not install a new system, but will +collect a lot of system information. If you set $FAI_ACTION to +inventory you will only get a few hardware information. Both actions +can be used for FAI as a rescue system. + +Type ctrl-c to get a shell or use Alt-F2 or Alt-F3 and you will get +another console terminal, if you have added createvt to $FAI_FLAGS. + +You now have a running Linux system on the install client without +using the local hard disk. Use this as a rescue system if your local +disk is damaged or the computer can’t boot properly from hard disk. +You will get a shell and you can execute various commands (dmesg, +lsmod, df, lspci, …). Look at the log file in /tmp/fai. There you can +find much information about the boot process. + +FAI mounts all file systems it finds on the local disks read only. It +also tells you on which partition a file /etc/fstab exists. When only +one file system table is found, the partitions are mounted according +to this information. Here’s an example: + +demohost:~# df -h + +Filesystem Size Used Avail Use% Mounted on +devtmpfs 4.0M 0 4.0M 0% /dev +tmpfs 2.0G 0 2.0G 0% /dev/shm +tmpfs 783M 18M 766M 3% /run +tmpfs 5.0M 0 5.0M 0% /run/lock +LiveOS_rootfs 783M 18M 766M 3% / +192.168.33.250:/srv/fai/config 59G 23G 24G 49% /var/lib/fai/config +/dev/mapper/vg1-root 7.3G 1.8G 5.2G 26% /target +/dev/vda1 459M 53M 378M 13% /target/boot +/dev/mapper/vg1-home 1.4G 72K 1.3G 1% /target/home + +This method can be used as a rescue environment! If you need a file +system with read-write access use the rwmount command: + +demohost# rwmount /target/home + + +7.11. FAI without NFS + +-------------- + +To boot into FAI and begin the installation sequence without using +the NFS protocol, you boot the client machine using PXE as usual and +then retrieve an image containing the nfsroot via http. + +To create an image, use fai-cd’s -S argument and -M to avoid setting +up a partial mirror within the image. + +faiserver# fai-cd -M -S squash.img + +Move this image to a directory from which it can be requested via +http (usually a directory served by the webserver) + +To now request the squashfs image, add the following to your kernel +command line, e.g. in your pxelinux configuration file for the client +with fai-chboot. + +root=live:http://faiserver/cskoeln/squash.img FAI_CONFIG_SRC=file:///var/lib/fai/config + +Replace faiserver with the domain name or IP of the machine your +squash image is served from. + + +7.12. Installing other distributions using a Debian nfsroot + +-------------- + +You can install all sorts of Linux distributions from a single Debian +nfsroot. Therefore you have to create a base.tar.xz of the +distribution you like to install and place it into the basefiles +directory. Then name it UBUNTU2204.tar.xz for example. An install +client which belongs to the class UBUNTU2204 then extracts this base +file into its empty file system. Additionally you have to adjust the +sources.list or similar configuration files which are needed for +specifying the location of the package repository. + +The tool rinse(8) is used for creating base files for distribution +like Rocky Linux, CentOS, openSUSE or Fedora. Some basefiles can be +downloaded from https://fai-project.org/download/basefiles/. + +The script mk-basefile in /usr/share/doc/fai-doc/examples/simple/ +basefiles/ helps creating this base files. + + +7.13. Creating chroot and virtualization environments + +-------------- + +If you have to create some chroot environments, or a virtualization +environment where you neither can nor want to run a normal Debian +Installer in to get to a working system (for example, Xen guest +domains), there is the FAI action dirinstall. By calling + +faiserver# fai dirinstall + +and using either the option -c or -N you get a FAI +installation, without the partitioning action, right into the target +directory. The host name for the target installation can be specified +using -u + +This, for example, can be used to combine FAI with the tool xen-tools +, which helps you to build Xen guest domains. xen-tools are very nice +for generating configuration files and block devices for new guests +based on simple commands and/or configuration files, but they can +only assign one role per installation for customization. FAI-users +need and want more, as they are used to have the class system. They +get them even in xen-tools installations, by using the following code +as a xen-tools role script: + +#!/bin/sh +TARGET=$1 +CMD="fai -N -v -u ${hostname} dirinstall $TARGET" +echo running $CMD +$CMD + +Then, you should set the variable install=0 in the config of +xen-tools for that host. + + +7.14. Using FAI for updates + +-------------- + +FAI can also do updates of already running systems, without a +re-installation from scratch. This is called softupdate. A FAI +softupdate skips the tasks which are not suitable for updating a +running system, like partitioning the hard disks and creating file +systems. Instead, it only executes the tasks for updating and +installing software packages and calling the customization scripts. + +To run a softupdate call: + +# fai -v -s nfs://faiserver/srv/fai/config softupdate + +By default, a softupdate uses the list of classes defined during the +initial installation. Make sure to set the variable $LOGSERVER (done +in a class/*.var file) if FAI should save the log files to a remote +machine. + +It’s up to you, how to start a softupdate on a bigger number of +hosts. You may do the softupdate on a regular basis via cron or you +can use tools like clusterssh(1) to start a softupdate via a push on +a list of hosts. + +Keep in mind, that the customization scripts are run every time you +do a softupdate. That means, they have to be idempotent i.e. the +result of their operation should always produce the same result, even +when they run more than once. + +For example appending a line to a file must not done via this code: + +$ echo "some strings" >> /etc/fstab + +Instead use the command ainsl(1) in a shell script or use cfengine’s +function AppendIfNoSuchLine. + +All commands in the customization script must be capable of modifying +the target file system wether it’s available in /target during the +initial installation or wether it’s the normal file system relative +to / during softupdate. + +Here are some variable that help writing these scripts: + +$target + Points to the root directory of the client, which is /target + during installation and / during a softupdate. +$FAI_ROOT + It’s the same value as $target. For historic reasons we have both + these variables in FAI. +$ROOTCMD + In case of the installation this is an alias for chroot $target + in case of softupdate it’s just empty. You can prepend this to + commands if you need to run a command inside the clients target + file system via chroot. +$FAI_ACTION + If you need to call code depending on the FAI action performed, + you can use this variable. It contains the currently executed + action: install, softupdate, dirinstall, sysinfo, inventory or + your own defined action. + + +7.15. How to install 32-bit OS from a 64-bit OS + +-------------- + +To install a computer with a 32-bit OS, you need an i386 nfsroot. +Creating this 32-bit nfsroot on an install server running amd64 is +quite simple. Install and set up the FAI packages. Then copy your FAI +config files to a new subdirectory. + +faiserver# cp -a /etc/fai /etc/fai-i386 + +Edit the variable $FAI_DEBOOTSTRAP_OPTS in /etc/fai-i386/nfsroot.conf +and add the option --arch i386. Also choose a different directory for +your new nfsroot. Here are the two lines after editing. + +NFSROOT=/srv/fai/nfsroot-i386 +FAI_DEBOOTSTRAP_OPTS="--arch i386 --exclude=info --include=aptitude"" + +Now call fai-make-nfsroot which creates the 32-bit nfsroot in /srv/ +fai/nfsroot-i386 + +faiserver# fai-make-nfsroot -v -C/etc/fai-i386 + +Creating a partial mirror using fai-mirror(1) that is needed for a +bootable CD or USB stick is also possible on a different +architecture. You have to specify the architecture when calling +fai-mirror. + +$ fai-mirror -m800 -B -a i386 -v -cDEFAULT,DEBIAN,FAIBASE,I386 /srv/mirror-i386 + +That’s all! + + +7.16. Aborting the installation when an error occurs + +-------------- + +Every task and hook can call the function task_error to send an error +value to the installation. This error will appear in the log file and +can be shown in the fai-monitor-gui(1). The error value is also +checked against the variable $STOP_ON_ERROR which is set to 700 by +default. If the error value is greater than $STOP_ON_ERROR the +installation will stop immediately. In a hook, just add a call like +this: + +task_error + +It is comfortable to call task_error with $? as second parameter, for +e.g. if you want to set an error value of 123 use this + + +task_error 123 $? + +Then the task error is only set if the preceding command failed with +some error. The same syntax can be used by the scripts in the class +subdirectory ending in .sh. + +A special case are scripts inside the class/ subdirectory that does +not end in .sh. In those scripts you have to call task_error with 1 +as third parameter. As an example you can use those two variants for +setting the value to 123 + +task_error 123 $? 1 + +or + +task_error 123 1 1 + +The latter command always sets the task error to 123 regardless of +the value of $?. If the error value is greater than $STOP_ON_ERROR, +the installation will abort immediately. + +The error values are grouped into four categories + +normal or info messages: 1xx, 2xx +warnings: 3xx, 4xx +minor errors: 5xx, 6xx +errors: 7xx, 8xx + +The fai-monitor-gui has 4 different icons for these error categories. + + +--------------------------------------------------------------------- + +8. Various hints and details + +--------------------------------------------------------------------- + + +8.1. The list of tasks + +-------------- + +Most tasks of the installation are defined as subroutines which are +defined in /usr/lib/fai/subroutines (e.g. task_instsoft). Some are +external shell scripts located in /usr/lib/fai/. They are called via +a superior subroutine called task. This subroutine calls hooks if +available and then calls the task (defined as task_). A task +and its hooks can be skipped on demand by using the command skiptask +(). + +Now follows the description of all tasks, listed in the order they +are executed. + +confdir + + The kernel appended parameters may define variables, the syslog + daemon is started. Network parameters are fetched from a DHCP + server and are stored in boot.log. The DNS resolver configuration + file is created. + + The location of the configuration space is defined by the + variable $FAI_CONFIG_SRC. + + After that, the file $FAI/hooks/subroutines is sourced if it + exists. Using this file, you can define your own subroutines or + override the definition of FAI’s subroutines. + +setup + This task sets the system time, all $FAI_FLAGS are defined and + two additional virtual terminals are opened on demand. A secure + shell daemon is started on demand for remote logins. +defclass + Calls fai-class(1) to define classes using scripts and files in + $FAI/class and classes from /tmp/fai/additional-classes and the + variable $ADDCLASSES. The list of all defined classes is stored + in the variable $classes and saved to /tmp/fai/FAI_CLASSES. +defvar + Sources all files $FAI/class/*.var for every defined class. If a + hook has written some variable definitions to the file $LOGDIR/ + additional.var, this file is also sourced. +action + Depending on the value of $FAI_ACTION this subroutine decides + which action FAI should perform. The default available actions + are: sysinfo, install, inventory, dirinstall and softupdate. If + $FAI_ACTION has another value, a user defined action is called if + a file $FAI/hooks/$FAI_ACTION exists. So you can easily define + your own actions. +sysinfo + Called when no installation is performed but the action is + sysinfo. It shows information about the detected hardware and + mounts the local hard disks read only to /target/partitionname or + with regard to a fstab file found inside a partition. Log files + are stored to the install server. +inventory + A short list of system information is printed. +install + This task controls the installation sequence. You will hear three + beeps before the installation starts. The major work is to call + other tasks and to save the output to /tmp/fai/fai.log. If you + have any problems during installation, look at all files in /tmp/ + fai/. You can find examples of the log files at https:// + fai-project.org/logs/. +dirinstall + Install into a directory, not onto a local disk. Use this for + creating chroot environments. +softupdate + This task, executed inside a running system via the fai(8) + command line interface, performs a softupdate. See chapter + [softupdate] for details. +partition + Calls setup-storage(8) to partition the hard disks and to create + file systems. The task writes variable definitions for the root + and boot partition and device ($ROOT_PARTITION, $BOOT_PARTITION, + $BOOT_DEVICE) to /tmp/fai/disk_var.sh and creates a fstab file + for the new system. +mountdisks + Mounts the created partitions according to the created /tmp/fai/ + fstab file relative to $FAI_ROOT. +extrbase + Extracts a minimal system after that a chroot can be made into + it. By default the base tar file /var/tmp/base.tar.xz will be + extracted. Also files matching a class name in $FAI/basefiles/ + are used for unpacking a different tar file depending on classes + defined. This can be used for installing different Linux + distributions than the one used for creating the nfsroot. The + default file base.tar.xz is a snapshot of a basic Debian system + created by debootstrap(8). This task uses the variable + FAI_BASEFILEURL for fetching the base file via FTP, HTTPS or HTTP + if it’s defined. +debconf + Calls fai-debconf(1) to set the values for the debconf preseeding + database. +repository + Prepare access to the package repository by preparing the apt + configuration. This can also add repository keys in a class based + manner from files like CLASSNAME.gpg in the directory + package_config. +updatebase + Updates the base packages of the new system and updates the list + of available packages. It also fakes some commands (called + diversions) inside the new installed system using dpkg-divert(8), + so no daemons will be started during the installation. +instsoft + Installs the desired software packages using class files in $FAI/ + package_config/. +configure + Calls scripts in $FAI/scripts/ and its subdirectories for every + defined class. +tests + Calls test scripts in $FAI/tests/ and its subdirectories for + every defined class. +finish + Unmounts all file systems in the new installed system and removes + diversions of files using the command fai-divert. +chboot + Changes the PXE configuration for a host on the install server + which indicates which PXELINUX configuration to load on the next + boot from network card via TFTP. Therefore the fai-chboot(8) + command is executed remotely on the install server. +savelog + Saves log files to local disk and to the account $LOGUSER on + $LOGSERVER (defaults to the install server). +faiend + Wait for background jobs to finish (e.g. emacs compiling lisp + files) and automatically reboots the install clients or waits for + manual input before reboot. + + +8.2. Automated tests + +-------------- + +After the customization scripts are executed, FAI will execute some +tests if available. Using these test, you can check for errors of the +installation. Test scripts are called via fai-do-scripts(1) and +should append its messages to $LOGDIR/test.log. A Perl module +including some useful subroutines can be found in Faitest.pm. A test +can also define a new class for executing another tests during next +boot via the variable $ADDCLASSES. + + +8.3.  Autodiscover + +-------------- + +In FAI 5.0 we released a feature that allows clients to search for +the faiserver in their respective subnetwork. This lifts the +necessity of having to collect every client’s MAC address and +configuring the DHCP daemon. + +This is done by booting from a small FAI autodiscover bootmedium (CD, +USB, etc.), which can be created via the command: + +faiserver# fai-cd -A autodiscover.iso + +The image is roughly 25MB in size and scans the subnet for a FAI +server. By default it shows a menu with all profiles available in the +configuration space in the same manner as the menu flag does. From +this menu, you can select the installation type you wish to perform. + +For the clients to find the faiserver, the faiserver must run +fai-monitor. + + +8.4. Changing the boot device + +-------------- + +Changing the boot sequence is normally done in the BIOS setup. But +you can’t change the BIOS from a running Linux system. + +So, the boot sequence of the BIOS will remain unchanged and your +computer should always boot first from its network card and the +second boot device should be the local disk. Then you can change the +boot device of the client by creating different PXELINUX +configurations. This will define if an installation should be +performed, or if the client should to boot from local disk. This is +done using fai-chboot(8). + + +8.5. How to create a local Debian mirror + +-------------- + +The utility mkdebmirror ^[18] can be used for creating your own local +Debian mirror. This script uses debmirror(1). A partial Debian mirror +for amd64 architecture for Debian 11 and 12 (aka bullseye and +bookworm) without the source packages needs about 180GB of disk +space. Accessing the mirror via HTTP will be the default way in most +cases. To see more output from the script call mkdebmirror -v. A root +account is not necessary to create and maintain the Debian mirror. + +To use HTTP access to the local Debian mirror, install a web server +and create a symlink to the local directory where your mirror is +located: + +faiserver# apt-get install apache2 +faiserver# ln -s /files/scratch/debmirror /var/www/html/debmirror + +Create a file sources.list(5) in /etc/fai/apt which gives access to +your Debian mirror. Also add the IP-address of the HTTP server to the +variable $NFSROOT_ETC_HOSTS in nfsroot.conf if the install clients +have no DNS resolving. + + +8.6. Small hints + +-------------- + + * When using HTTP access to a Debian mirror, the local /var + partition on all install clients must be big enough to keep the + downloaded Debian packages. Do not try with less than 250 Mbytes + unless you know why. You can limit the number of packages + installed at a time with the variable $MAXPACKAGES. + * You can remove the red logo on the install client by simply + calling reset once. If will also not appear if you create a file + using this command on the install server: + +touch /srv/fai/nfsroot/.nocolorlogo + + * A list of variables used by FAI can be found at https:// + wiki.fai-project.org/index.php/Variables. + * You can shorten some customization scripts by using one single + fcopy command fcopy -r /. + * If you rebuild the nfsroot, you will create a new ssh host key + inside the nfsroot. Then logging in to an install client may + fail, because the host key changes. You can use this: + +$ ssh -o StrictHostKeyChecking=no root@installclient + + * You can also delete the host entry on your install client in your + ~/.ssh/known_hosts file by using the ssh-keygen -R command. + * In the tasks chboot and savelog, a connection using secure shell + is opened to the FAI server (see [isavelog]). To ensure that this + works non-interactively, a proper entry in NFSROOT/root/.ssh/ + known_hosts must be created. When using fai-setup, this is done + automatically, but it may require manual editing in case the name + of your FAI server was not determined correctly. If you stumble + over ssh connections that require typing "yes" to accept the host + key during installation, please check the contents of your + NFSROOT/root/.ssh/known_hosts file + * A list of all local hard disks is stored in $disklist. It’s + defined after set_disk_info is called. + * There are multiple functions for generating a customized disk + list. See fai-disk-info for an example. + + + set_bootstick() + + grepv_disks() + + grep_disks() + + notmatchdisks() + + matchdisks() + + smallestdisk() + + largestdisk() + + all_disks_by_size() + + all_disks_and_size() + + once_only() + + checkdisk() + + disks_by_id() + * Use fai-divert -a if a postinst script calls a configuration + program, e.g. the postinst script for package apache calls + apacheconfig, which needs manual input. You can fake the + configuration program so the installation can be fully automatic. + * Sometimes the installation seems to stop, but often there’s only + a postinstall script of a software package that requires manual + input from the console. Change to another virtual terminal and + look which process is running with tools like top(1) and pstree + (1). You can add debug to FAI_FLAGS to make the installation + process show all output from the postinst scripts on the console + and get its input also from the console. + * How can I define classes on the kernel command line? + + Read the man page of fai-class(8). If you like to define some + additional classes (for e.g. A,B,C) on the kernel command line + add this: ADDCLASSES=A,B,C + + * How to use a custom kernel inside the nfsroot? + + Build your customized kernel by building a kernel package using + make-kpkg(8) and use the option --initrd. Copy this Debian + package to a local repository and add it to /etc/fai/ + sources.list. Add the name of your package to /etc/fai/NFSROOT. + Then call + + # fai-make-nfsroot -k + + * How to use the nfsroot as system for diskless clients? + + https://wiki.fai-project.org/index.php/ + Use_nfsroot_for_diskless_clients + + * How to serve multiple nfsroot directories on one FAI server? + + If you want to serve multiple nfsroot directories, you need to + create specific config directories in /etc for FAI, like /etc/ + fai-buster and /etc/fai-bookworm. Then you need to set the + $NFSROOT variables to different directories and run + +faiserver#fai-make-nfsroot -C /etc/fai-buster + + +8.7. flag_reboot (FAI_FLAGS) + +-------------- + +If flag_reboot is set, by adding "reboot" to $FAI_FLAGS, your client +machine will reboot after the task faiend has finished. This is true +for network as well as bootmedium installations. + + +8.8. Log files + +-------------- + +FAI is creating several log files. During installation they are +stored in /tmp/fai on the install client itself. At the end of the +installation they will be copied to the install server (see +[isavelog]). After the install client rebooted into his newly +installed system, you can find the FAI logs in /var/log/fai. Log +files are also created when doing the softupdate or dirinstall +action. + +On the faiserver, you can find the (remote) log files under the ~fai +directory. + +Sample log files from successfully installed computers are available +on https://fai-project.org/logs. These a some log files which are +created by FAI. + +FAI_CLASSES + Contains a list of all classes defined. +dmesg.log + Output of the dmesg command. Contains useful messages of the + kernel ring buffer. +fai.log + The main log file. Contains all important information. You should + always read this file. +boot.log + A list of variables of network parameters, mostly defined by the + DHCP daemon. +format.log + Output of the partition tool setup-storage(8). +scripts.log + Output of all scripts, that are used for customization. +variables.log + A list of all shell variables which are available during an + installation. +error.log + A summary of possible errors in all log files. +disk_var.sh + A list of variables that contain information about devices and + partitions to boot from, the root partition and a list of swap + devices. These information is used by some customization scripts + (e.g. GRUB_PC/10-setup). + +If the installation process finishes, the hook savelog.LAST.sh +searches all log files for common errors and writes them to the file +error.log. So, you should first look into this file for errors. Also +the file status.log give you the exit code of the last command +executed in a script. To be sure, you should look for more details in +all log files. + + +8.9. How to use HTTP for PXE boot + +-------------- + +fai-make-nfsroot now uses the lpxelinux.0 binary which already +supports transfer of the kernel and initrd via http (additional to +tftp). You only have to enable HTTP access to the tftp directory: + +cd /var/www/html +ln -s /srv/tftp/fai + +Add -U URL to the fai-chboot call. For example: + +fai-chboot -U http://faiserver/fai -IFv ....... + + +--------------------------------------------------------------------- + +9. Troubleshooting + +--------------------------------------------------------------------- + + +9.1. Boot errors + +-------------- + +The following error message indicates that your install client +doesn’t get an answer from a DHCP server. Check your cables or start +the dhcpd(8) daemon with the debug flag enabled. + + PXE-E51: No DHCP or BOOTP offers received + Network boot aborted + +If you do not see the following message, the install kernel could not +detect your network card, for example because of a missing driver: + +Starting dhcp for interface eth0 +dhcp: PREINIT eth0 up +dhcp: BOND setting eth + +Check the initrd in the nfsroot (lsinird) if the kernel driver of +your network card is included there and check if you like to add the +package firmware-linux-nonfree in /etc/fai/NFSROOT and rebuild the +initrd by calling fai-make-nfsroot -k. You may also add a driver to / +srv/fai/nfsroot/etc/dracut.conf in the line add_drivers+=. + +This is the error message you will see, when your network card is +working, but the install server does not export the nfsroot directory +to the install clients, This is often caused by missing NFS +permissions on the server side. + +Starting dhcp for interface eth0 +dhcp: PREINIT eth0 up +dhcp: BOND setting eth +mount.nfs: access denied by server while mounting 192.168.33.250:/srv/fai/nfsroot +. +. +dracut Warning: Could not boot +. +Dropping to debug shell +dracut:/# + +Now, you are inside the emergency shell of the initrd which was +created by dracut(8). You will get a shell prompt, and can look at +the log files. For more information about debugging the early boot +process using dracut see dracut.cmdline(7) + +Use the following command on the install server to see which +directories are exported from the install server (named faiserver): + +$ showmount -e faiserver + + +--------------------------------------------------------------------- + +^[1] Solaris 8 Advanced Installation Guide at https://docs.oracle.com +/cd/E19455-01/806-0957/806-0957.pdf + +^[2] http://www.science.uva.nl/pub/solaris/auto-install + +^[3] https://wiki.fai-project.org/index.php/ +VirtualBox_for_your_first_FAI_installation + +^[4] This installation will consume about 2GB of space in /tmp. + +^[5] It’s also possible to use only the configuration file with the +highest priority since the order of classes define a priority from +low to high within the list of classes. + +^[6] If you want to use a faster mirror, adjust the URL in /etc/fai/ +apt/sources.list and FAI_DEBOOTSTRAP in /etc/fai/nfsroot.conf before +calling fai-setup. + +^[7] This will call fai-make-nfsroot(8) internally. + +^[8] These files need not belong to the root account. + +^[9] You may also add this into your Domain Name System (DNS) + +^[10] Since the root file system on the clients is mounted via NFS, +fai is located in /srv/fai/nfsroot/usr/sbin on the install server. + +^[11] $FAI is an internal variable used by the FAI scripts. By +default the path is /var/lib/fai/config. + +^[12] /srv/fai/nfsroot from the install server via NFS + +^[13] It is defined on the kernel command line + +^[14] /var/lib/fai/config + +^[15] /var/log/fai/localhost/install/ is a link to this directory. + +^[16] I recommend to write the MAC addresses (last three bytes will +suffice if you have network cards from the same vendor) and the host +name in the front of each chassis. + +^[17] For debugging purpose it may help to enter the chroot +environment manually using this command. faiserver# chroot /srv/fai/ +nfsroot bash + +^[18] You can find the script in /usr/share/doc/fai-doc/examples/ +utils/ + diff --git a/doc/fai-guide_fr.html b/doc/fai-guide_fr.html new file mode 100644 index 000000000..d1a7a2b4c --- /dev/null +++ b/doc/fai-guide_fr.html @@ -0,0 +1,4397 @@ + + + + + + +FAI Guide (Fully Automatic Installation) + + + + +

+
+
+
+

Une version plus ancienne de ce guide en français est disponible à +https://fai-project.org/fai-guide-fr.

+
+
+
+

Résumé

+
+

FAI est un système non-interactif pour installer, configurer et gérer des +systèmes Linux et les configurations de logiciels sur des ordinateurs comme sur des machines +virtuelles et des environnements chroot, depuis des petits réseaux jusqu’à de +grandes infrastructures et de grands clusters.

+

Ce manuel décrit le logiciel Fully Automatic Installation (installation entièrement automatique). +Cela inclut l’installation des paquets, la configuration du serveur, la +création de la configuration et la gestion des erreurs.

+

(c) 2000-2025 Thomas Lange

+

Ce manuel est un logiciel libre; Vous pouvez le redistribuer et / ou le +modifier selon les termes de la Licence Publique Générale GNU publiée +par la Free Software Foundation; Soit la version 2, soit (à votre choix) +toute version ultérieure.

+

Ceci est distribué dans l’espoir qu’il sera utile, mais sans aucune +garantie ; Sans même la garantie implicite de qualité marchande ou +d’adaptation à un usage particulier. Pour plus de détails, consultez la +License Générale Publique GNU.

+

Une copie de la Licence Générale Publique GNU est disponible sous la forme +/usr/share/common-licenses/GPL dans la distribution Debian GNU/Linux ou +sur le World Wide Web sur le site GNU Vous pouvez également l’obtenir en +écrivant à la Free Software Foundation , Inc., 59 Temple Place - Suite +330, Boston, MA 02111-1307, États-Unis.

+
+
+
+
+

Introduction

+
+
+

Disponibilité

+
+
+Page d’accueil +
+
+

+https://fai-project.org +

+
+
+Wiki FAI +
+
+

+https://wiki.fai-project.org +

+
+
+Téléchargement +
+
+

+https://fai-project.org/download +

+
+
+Entrée pour sources.list +
+
+

+deb https://fai-project.org/download bookworm koeln +

+
+
+Pages de manuel +
+
+

+https://fai-project.org/doc/man/ +

+
+
+Listes de diffusion +
+
+

+https://lists.uni-koeln.de/mailman/listinfo/linux-fai +

+
+
+Retour d’information +
+
+

+Envoyez vos réflexions et vos commentaires à fai@fai-project.org ou +à la liste de diffusion. +

+
+
+Boguess +
+
+

+Utiliser le système de suivi des bogues Debian (BTS) https://bugs.debian.org/src:fai +

+
+
+Changements visibles par l’utilisateur +
+
+

+http://fai-project.org/NEWS +

+
+
+Arbre source via git +
+
+

+git clone git://github.com/faiproject/fai.git +

+
+
+Voir l’arbre source avec https +
+
+

+ https://github.com/faiproject/fai +

+
+
+

Les pages man incluent toujours des informations à jour et beaucoup de +détails sur toutes les commandes FAI. Alors, n’oubliez pas de les lire +attentivement. Lisez maintenant ce manuel, puis profitez de +l’installation entièrement automatique et de votre temps économisé.

+
+
+

Motivation

+

Avez-vous déjà effectué des installations identiques d’un système +d’exploitation à plusieurs reprises? Souhaitez-vous être en mesure +d’installer un cluster Linux avec des dizaines de nœuds d’un seul coup?

+

Répéter la même tâche encore et encore est ennuyeux — et conduira +certainement à des erreurs. Aussi beaucoup de temps pourrait être sauvé +si les installations étaient faites automatiquement. Un processus +d’installation avec interaction manuelle ne peut pas passer à l’échelle. Mais les +grappes (clusters) ont l’habitude de croître au fil des ans. Pensez à long terme +plutôt que de planifier seulement quelques mois dans l’avenir.

+

En 1999, j’ai dû effectuer une installation d’un cluster Linux avec un +serveur et 16 clients. Puisque j’ai eu beaucoup d’expérience en faisant +des installations automatiques des systèmes d’exploitation de Solaris +sur le matériel de SUN SPARC, l’idée de construire une installation +automatique pour Debian est née. Solaris dispose d’une fonctionnalité +d’installation automatique appelée JumpStart +
[Solaris 8 Advanced Installation Guide at "https://docs.oracle.com/cd/E19455-01/806-0957/806-0957.pdf]
. +En conjonction avec les scripts d’auto-installation de Casper Dik +
[http://www.science.uva.nl/pub/solaris/auto-install]
, +Je pouvais épargner beaucoup de temps non seulement pour chaque nouvel +ordinateur de SUN, mais aussi pour la réinstallation des postes de +travail existants. Par exemple, j’ai dû construire un LAN temporaire +avec quatre stations de travail SUN pour une conférence, qui a duré +seulement quelques jours. J’ai retiré ces postes de travail de notre +réseau de recherche habituel et mis en place une nouvelle installation +pour la conférence. Quand elle a été terminée, j’ai simplement réintégré les +postes de travail dans le réseau de recherche, redémarré une seule fois, +et après une demi-heure, tout était opérationnel comme avant. La +configuration de tous les postes de travail était exactement la même +qu’avant la conférence, car tout était effectué par le même processus +d’installation. J’ai également utilisé l’installation automatique pour +réinstaller un poste de travail après qu’un disque dur endommagé ait été +remplacé. Il m’a fallu deux semaines pour recevoir le nouveau disque +dur, mais seulement quelques minutes après l’installation du nouveau +disque, le poste de travail fonctionnait comme avant. Et c’est pourquoi +j’ai choisi d’adapter cette technique à un cluster de PC sous Linux.

+
+
+

Comment fonctionne FAI

+

Le client d’installation qui sera installé à l’aide de FAI, est démarré +via une carte réseau ou à partir d’un CD ou d’une clé USB. Il obtient +une adresse IP et démarre un noyau Linux qui monte son système de +fichiers racine via NFS (nfsroot) du serveur d’installation. Une fois le +noyau démarré, le script de démarrage FAI exécute l’installation +automatique qui n’a pas besoin d’interaction. Tout d’abord, les disques +durs seront partitionnés, les systèmes de fichiers seront créés et des +paquets logiciels seront ensuite installés. Après cela, le nouveau système +d’exploitation installé est configuré selon vos besoins locaux en +utilisant quelques scripts. Enfin, le nouveau système d’exploitation +sera démarré à partir du disque local.

+

Les détails sur la façon d’installer l’ordinateur (la configuration) +sont stockés dans l’espace de configuration sur le serveur d’installation. +Les fichiers de configuration sont répartis entre des groupes +d’ordinateurs s’ils sont similaires, en utilisant le concept de classe. +Vous n’avez donc pas besoin de créer une configuration pour chaque +nouvel hôte. Ainsi, FAI est une méthode évolutive pour +installer un gros cluster avec un grand nombre de nœuds même si leur +configuration n’est pas identique.

+

FAI peut également être utilisé comme un système de sauvetage ou pour +l’inventaire matériel. Vous pouvez démarrer votre ordinateur, mais il +n’effectuera pas une installation. Au lieu de cela, il exécutera un +Debian GNU / Linux entièrement fonctionnel sans utiliser les disques +durs locaux. Ensuite, vous pouvez effectuer une connexion à distance et +sauvegarder ou restaurer une partition de disque, vérifier un système de +fichiers, inspecter le matériel ou effectuer toute autre tâche.

+
+
+

Caractéristiques

+
    +
  • +

    +On peut faire une installation entièrement automatisée. +

    +
  • +
  • +

    +Installation très rapide sans surveillance. +

    +
  • +
  • +

    +Système flexible grâce à un concept de classe simple. +

    +
  • +
  • +

    +Mise à jour des systèmes en cours d’exécution sans réinstallation. +

    +
  • +
  • +

    +Images « Cloud » pour un environnement de virtualisation. +

    +
  • +
  • +

    +Les hôtes peuvent démarrer à partir d’une carte réseau, d’un CD, d’une clé USB. +

    +
  • +
  • +

    +Création simple d’une image ISO vive ou pour l’installation. +

    +
  • +
  • +

    +Prise en charge de PXE avec la méthode de démarrage DHCP. +

    +
  • +
  • +

    +Support des systèmes de fichiers ReiserFS, ext3/ext4, btrfs et XFS. +

    +
  • +
  • +

    +Support logiciel RAID et LVM. Support LUKS. +

    +
  • +
  • +

    +Détection automatique du matériel. +

    +
  • +
  • +

    +On peut déployer Debian, Ubuntu, Rocky Linux, CentOS, AlmaLinux, SuSE +

    +
  • +
  • +

    +Possibilité de connexion à distance via ssh lors du processus d’installation. +

    +
  • +
  • +

    +Toutes les configurations similaires sont partagées entre tous les les clients d’installation. +

    +
  • +
  • +

    +Les fichiers journaux de toutes les installations sont enregistrés sur le serveur d’installation. +

    +
  • +
  • +

    +Prise en charge des scripts Shell, Perl, Python, Ruby, expect et CFEngine lors de l’étape de personnalisation. +

    +
  • +
  • +

    +Prise en charge de nombreux protocoles comme NFS, FTP, HTTP, git. +

    +
  • +
  • +

    +Peut être utilisé comme un système de sauvetage et pour l’inventaire matériel. +

    +
  • +
  • +

    +Prise en charge de clients sans disque. +

    +
  • +
  • +

    +Prise en charge trans-architecture, par exemple pour des appareils embarqués (embedded devices). +

    +
  • +
  • +

    +Ajoutez facilement vos propres fonctions via des hooks ou modifiez le comportement par défaut. +

    +
  • +
  • +

    +Prise en charge du clonage de machines utilisant des images de disque. +

    +
  • +
+
+
+

La durée d’installation

+

La durée d’installation est déterminée par la quantité de logiciel et la +vitesse du disque dur. Voici quelques exemples de durée. Tous les +clients d’installation avaient une carte réseau 1Gbit installée.

+
+ ++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
CPU RAM Disque Logiciels installés durée

i7-3770T 2.50GHz

8GB

SSD

6 GB logiciel

8.5 min

Core-i7 3.2GHz

6GB

SATA disk

4.3GB logiciel

7 min

Core-i7 3.2GHz

6GB

SATA disk

471 MB logiciel

77sec

Intel Core2 Duo

2GB

SATA disk

3 GB logiciel

14 min

+
+
+
+
+
+

Quickstart - Pour l’utilisateur impatient

+
+
+

Ma première installation

+

Sans plus tarder, cette section fournira une démonstration rapide et +facile d’une installation entièrement automatique à l’aide du CD FAI et +d’une machine virtuelle.

+

Il suffit de télécharger l' image ISO du CD à partir de +https://fai-project.org/fai-cd et de démarrer votre VM à l’aide de ce CD. +Vous verrez un menu grub où vous pouvez choisir parmi différents types +d’installation.

+

Cette installation s’exécutera sans serveur d’installation. +L’installation à partir du CD est identique à celle exécutée dans un +environnement réseau à l’aide du serveur d’installation FAI, et peut être aussi +effectuée à l’aide d’une clé USB sur un ordinateur physique.

+

On peut aussi créer soi-même une image FAI (installation entièrement automatique) +à la page web https://fai-project.org/FAIme sans avoir besoin d’installer +FAI sur son ordinateur.

+
+
+

Ma première installation à l’aide d’un serveur

+

Nous allons créer un réseau privé et lancer deux machines vituelles. L’une +deviendra votre propre serveur FAI, l’autre sera un client d’installation.

+

Si vous avez l’intention d’utiliser VMware ou VirtualBox, assurez-vous +que votre client utilise une connexion réseau pontée (bridged network). +On trouve une description détaillée dans le wiki FAI +
[https://wiki.fai-project.org/index.php/VirtualBox_for_your_first_FAI_installation]
. +on ne peut pas utiliser des interfaces réseau pontées via le réseau sans +fil, car la plupart des cartes réseau WiFi ne prennent pas en charge +cette fonctionnalité.

+

Quand on utilise Qemu/KVM et le script fai-kvm on peut créer le réseau à l’aide de +la commande fai-mk-network. Il faut commencer par installer quelques paquets logiciels

+
+
+
# apt-get install qemu-system-gui qemu-kvm qemu-utils
+
+

La commande ci-dessous met en place un réseau privé avec un pont logiciel et plusieurs +TAPs réseau +
[https://fr.wikipedia.org/wiki/TAP_r%C3%A9seau]
+appartenant à l’utilisateur <nom_d_utilisateur>.

+
+
+
fai-mk-network <nom_d_utilisateur>
+
+

Après cela, vous pouvez utiliser fai-kvm (-h vous aidera) pour démarrer +des machines virtuelles en utilisant KVM qui sont connectés à ce réseau +privé. Faites attention. Par défaut, fai-kvm créera les images de disque +pour les machines virtuelles dans +/tmp+, qui est un disque RAM sur la plupart des +systèmes. Il n’y a aucun problème à créer une image de disque vide de +20G dans /tmp (même si cette partition est de 4 Go de taille), mais +alors que la VM écrit des données sur son disque, cela commencera à +consommer de l’espace dans +/tmp+.

+

Démarrez le premier hôte virtuel, qui deviendra le serveur FAI +
[Cette installation utilisera environ 2GB d’espace dans /tmp.]
 :

+
+
+
fai-kvm -Vn -s20 -u 1 cd faicd64-small.iso
+
+

Dans le menu grub; sélectionnez faiserver, using internal DHCP and a fixed IP. +Cela va installer +un hôte appelé faiserver avec IP 192.168.33.250 qui contient tous les +logiciels nécessaires pour un serveur FAI. Il configurera également un +cache de paquets local (en utilisant apt-cacher-ng). Une fois +l’installation terminée, redémarrez la machine. Lors du premier +démarrage du nouveau système, il configurera automatiquement le nfsroot. +Cela peut prendre quelques minutes.

+

Après cela, vous pouvez démarrer des hôtes supplémentaires en utilisant +un démarrage réseau. Pour chaque nouvel hôte, vous devez utiliser une +valeur différente pour +-u+, qui sera utilisée pour générer des +adresses MAC différentes et utiliser des noms de fichier d’image de +disque différents.

+
+
+
fai-kvm -Vn -u 2 pxe
+
+

Ces clients d’installation vous montreront un menu, où vous pouvez +sélectionner le type d’installation que vous souhaitez effectuer. Si le +client d’installation ne trouve pas le serveur, c’est généralement parce +que fai-monitor n’y fonctionne plus. Cela peut se produire si vous +redémarrez le faiserver après l’installation. Pour remédier à cela, +exécutez simplement fai-monitor sur le faiserver et relancez le +démarrage du client.

+

Un autre client pourrait être lancé avec:

+
+
+
fai-kvm -Vn -u 3 pxe
+
+

Vous pouvez démarrer autant de machines dans le réseau que de TAPs réseau +disponibles. Toutes ces machines peuvent se +connecter à l’Internet extérieur, mais sont seulement accessibles à +partir de votre machine hôte.

+
+
+
+
+

Vue d’ensemble et Concepts

+
+

FAI est un système non interactif permettant d’installer, de +personnaliser et de gérer les configurations de systèmes et de logiciels +Linux sur les ordinateurs ainsi que sur les machines virtuelles et les +environnements chroot, des petits réseaux aux grandes infrastructures et +clusters. Vous pouvez prendre un ou plusieurs PC vierges, mettre sous +tension et après quelques minutes, Linux est installé, configuré et +fonctionnel sur l’ensemble du cluster, sans aucune interaction nécessaire. +Ainsi, il s’agit d’une méthode évolutive pour installer et mettre à jour +un cluster sans surveillance impliquant peu d’efforts. FAI utilise +le système d’exploitation Linux et une collection de scripts shell et +Perl pour le processus d’installation. Les modifications apportées aux +fichiers de configuration du système d’exploitation peuvent être +effectuées par des scripts CFEngine, shell (bash et zsh), Perl, Python, Ruby et +expect.

+

Les personnes intéressées par FAI sont des administrateurs système qui doivent +installer Linux sur une ou même des centaines d’ordinateurs. Parce qu’il +s’agit d’un outil d’installation à usage général, il peut être utilisé +pour l’installation d’un cluster Beowulf, d’une ferme de rendu ou +d’un laboratoire Linux ou d’une salle de classe. De plus, des réseaux +Linux de grande envergure avec différents matériels ou différentes +exigences d’installation sont faciles à établir à l’aide de FAI. Mais +n’oubliez pas de planifier votre installation. Le chapitre +[plan] contient quelques conseils utiles à ce sujet.

+
+

Terminologie

+

Commençons par décrire quelques termes utilisés dans ce manuel.

+
+
+Le serveur d’installation  +
+
+

+Il fournit les services DHCP, TFTP et NFS ainsi que les données de +configuration pour tous les clients d’installation. Dans les exemples +de ce manuel, cet hôte s’appelle faiserver. C’est l’hôte où le paquet +faiserver est installé. +

+
+
+Le client d’installation  +
+
+

+Un hôte qui sera installé à l’aide de FAI et une configuration fournie +par le serveur d’installation. Aussi appelé client pour faire court. Dans +ce manuel, les hôtes d’exemple sont appelés demohost, xfcehost, +gnomehost … Cet ordinateur doit démarrer à partir de son interface +réseau à l’aide de PXE. +

+
+
+Espace de configuration +
+
+

+Une structure de sous-répertoire contenant plusieurs fichiers. Ces +fichiers décrivent les détails de la manière dont l’installation des +clients sera effectuée. Toutes les données de configuration sont +stockées là. Il est également appelé config space pour faire court. Il +comprend des informations sur : +

+
    +
  • +

    +Organisation du disque dur dans un format similaire à fstab +

    +
  • +
  • +

    +Systèmes de fichiers locaux, leurs types, points de montage et options de montage +

    +
  • +
  • +

    +Paquets logiciels +

    +
  • +
  • +

    +Disposition du clavier, fuseau horaire, configuration Xorg, systèmes de fichiers distants, comptes utilisateurs, imprimantes … +

    +
  • +
+

Le package fai-doc inclut un exemple d’espace de configuration +incluant des exemples pour les hôtes utilisant l’environnement XFCE et +GNOME entre autres. En invoquant fai-mk-configspace on copie ces exemples vers +/srv/fai/config. Il est recommandé d’étudier ces fichiers de configuration et +ces scripts pour mieux comprendre comment FAI fonctionne.

+
+
+nfsroot, NFS-Root  +
+
+

+Un système de fichiers situé sur le serveur d’installation. Pendant le +processus d’installation, c’est le système de fichiers complet pour +les clients d’installation. Tous les clients partagent le même +nfsroot, qu’ils montent en lecture seule. Le nfsroot a besoin +d’environ 1.1Go d’espace disque libre. +

+
+
+TFTP  +
+
+

+Sert aux clients le fichier initrd et le noyau utilisés pour le processus +d’installation. Avec le système de fichiers servi par NFS, ces deux +composent un système d’exploitation temporaire dans lequel les installations sont +réalisées. +

+
+
+Classes FAI  +
+
+

+Les classes sont des noms qui déterminent quel fichier de +configuration est sélectionné. Si un client appartient à la classe +WEBSERVER, il sera configuré en tant que serveur Web, la classe +DESKTOP pour, par exemple, déterminer les paquets logiciels qui seront +installés. +

+
+
+profil  +
+
+

+Un profil FAI est juste une liste de classes FAI assignées à un nom de +profil, qui est étendu par une description de ce profil. C’est-à-dire +que l’on peut avoir deux profils "Webserver", l’un incluant la classe +APACHE, et un autre incluant la classe NGINX, pour ensuite installer la solution +de serveur web correspondante. +

+
+
+les tâches  +
+
+

+L’installation d’un client se compose de plusieurs parties, appelées +tâches. Les tâches sont des sous-programmes prédéfinis qui effectuent +une certaine partie de la FAI. Les tâches FAI suivantes sont exécutées +au cours d’une installation sur les clients d’installation. +

+
+
+
+
+
+
+
confdir               # trouver l'espace de configuration
+setup                 # quelques initialisations, lancement de sshd à la demande
+defclass              # définition des classes FAI
+defvar                # définition de variables
+action                # évaluer FAI_ACTION
+install               # Démarrer l'installation
+partition             # partitionner les disques durs, créer les systèmes de fichiers
+mountdisks            # monter les systèmes de fichiers
+extrbase              # extraire le fichier base.tar.xz
+debconf               # pré-ensemencer le deconf de Debian
+repository            # préparer l'accès aux dépôts de paquets
+updatebase            # mettre en place les outils de gestion de paquets et mettre les paquets à jour
+instsoft              # installer les paquets logiciels
+configure             # lancer les scripts de personnalisation
+finish                # faire un peu de ménage, afficher les statistiques d'installation
+tests                 # appeler des tests s'il y en a
+chboot                # lancer fai-chboot sur le serveur d'installation
+savelog               # enregistrer les fichiers de journalisation localement et à distance
+faiend                # redémarrage de l'hôte, éjection du CD si nécessaire
+
+
+
+
+
+
+

Voilà des tâches qui sont exécutées seulement lorsqu’on fait une action différente

+
+
+
dirinstall           # installer un environnement chroot
+softupdate           # ne faire que la configuration du système
+sysinfo              # imprimer une information système détaillée
+inventory            # imprimer un inventaire court du matériel
+
+
+
+
+

Pour une description plus détaillée des tâches , voir [tasks].

+

Notez que vous n’êtes pas limité aux tâches FAI. Vous pouvez également +définir des programmes ou des scripts supplémentaires qui seront +exécutés à certaines occasions. On les appelle des hooks.

+
+
+hooks +
+
+

+Les Hooks sont des plugins, ils peuvent ajouter des fonctionnalités +supplémentaires au processus d’installation ou même remplacer des +tâches entières de FAI. Les Hooks sont expliqués en détail dans +[hooks]. +

+
+
+
+
+

Le concept de classe

+

Les classes sont utilisées dans presque toutes les tâches de +l’installation. Les classes déterminent quels fichiers de configuration +choisir parmi une liste d’alternatives disponibles. Pour déterminer les +fichiers de configuration à utiliser, FAI recherche dans la liste des classes +définies et utilise tous les fichiers de configuration correspondant à +un nom de classe
[on peut aussi seulement utiliser le fichier de configuration +qui a la priorité la plus élevée, comme l’ordre des classes définit une +priorité de la plus basse à la plus élevée dans la liste des classes. ]
. La boucle suivante +implémente cette fonction en pseudo-code shell :

+
+
+
for class in $all_classes; do
+   if [ -r $config_dir/$class ]; then      # s'il exite un fichier nommé $class
+      your_command $config_dir/$class      # invoquer une commande avec ce nom de fichier
+      # sortir si on n'a besoin que du premier fichier qui convient
+   fi
+done
+
+

La beauté de ceci c’est qu’on peut ajouter +une nouvelle alternative de configuration et qu’elle sera automatiquement +utilisée par FAI sans modifier le code, si le fichier de configuration +utilise un nom de classe.

+

C’est parce que la boucle détecte automatiquement les nouveaux fichiers +de configuration qui doivent être utilisés. L’idée d’utiliser des +classes en général et d’utiliser certains fichiers correspondant à un +nom de classe pour une configuration est adoptée à partir des scripts +d’installation par Casper Dik pour Solaris. Cette technique s’est avérée +très utile et facile.

+

Vous pouvez regrouper plusieurs hôtes partageant les mêmes fichiers de +configuration en utilisant la même classe. Vous pouvez également diviser +l’ensemble des données de configuration pour tous les clients en +plusieurs classes et les utiliser comme des briques de lego et +construire la configuration entière pour un seul client en assemblant +les briques.

+

Si un client appartient à la classe A, on dit que la classe A +est définie pour ce client. Une classe n’a pas de valeur, elle est juste +définie ou indéfinie.

+

Les classes déterminent comment l’installation est effectuée. Par +exemple, un client d’installation peut être configuré pour obtenir le +bureau XFCE en y ajoutant simplement la classe XFCE . Naturellement, +des configurations plus granulaires sont également possibles. Par +exemple, les classes peuvent décrire comment le disque dur doit être +partitionné, elles peuvent définir quels paquets logiciels seront +installés, ou quelles étapes de personnalisation seront exécutées.

+

Souvent, une configuration client est juste créée en modifiant ou en ajoutant +les classes auxquelles ce client appartient, ce qui rend +l’installation d’un nouveau client très facile. Ainsi, aucune +information supplémentaire ne doit être ajoutée à l’espace de +configuration si les classes existantes suffisent à vos besoins.

+

Comme vous pouvez le voir, les classes sont un pilier central de la +personnalisation de votre espace de configuration et de celui de +de votre client d’installation. Pour définir vos propres classes, reportez-vous à +[defining classes].

+
+
+
+
+

Configurer votre faiserver

+
+

Voici comment configurer le serveur d’installation en quelques minutes. +Les étapes suivantes sont nécessaires :

+
    +
  1. +

    +Configurer le serveur d’installation +

    +
      +
    1. +

      +Installer les paquets de FAI +

      +
    2. +
    3. +

      +Créer le nfsroot +

      +
    4. +
    5. +

      +Copier les exemples dans l’espace de configuration +

      +
    6. +
    7. +

      +Configurer les démons réseau +

      +
    8. +
    9. +

      +Créer les configurations PXELINUX +

      +
    10. +
    +
  2. +
  3. +

    +Démarrage et installation des clients +

    +
  4. +
+
+

Installer les paquets FAI

+
    +
  • +

    +Installer la clé du dépôt de paquets du projet FAI. +

    +
  • +
  • +

    +Ajouter l’URL du dépôt de paquets du projet FAI. +

    +
  • +
  • +

    +Installer le paquet fai-quickstart sur le serveur d’installation. +

    +
  • +
+

Utilisez ces commandes pour l’installation :

+
+
+
# wget -O /etc/apt/trusted.gpg.d/fai-project.gpg https://fai-project.org/download/2BF8D9FE074BCDE4.gpg
+# echo "deb http://fai-project.org/download bookworm koeln" > /etc/apt/sources.list.d/fai.list
+
+

or

+
+
+
# apt install extrepo ; extrepo enable fai
+
+

et ensuite :

+
+
+
# apt-get update
+# aptitude install fai-quickstart
+
+

Cela installera également les paquets pour les démons de serveur DHCP, +TFTP et NFS.

+
+
+

Créer le nfsroot

+
    +
  • +

    +Activez également le dépôt de paquets du projet FAI dans un +autre fichier sources.list qui est utilisé lors de la construction du +nfsroot. Ensuite, activez l’utilisateur de journal pour FAI. +

    +
  • +
+
+
+
# sed -i -e 's/^#deb/deb/' /etc/fai/apt/sources.list
+# sed -i -e 's/#LOGUSER/LOGUSER/' /etc/fai/fai.conf
+
+
    +
  • +

    +Par défaut, FAI utilise +http://httpredir.debian.org/ comme miroir +de paquets, qui va tenter de trouver un dépôt de paquets +rapide pour vous. +
    [Si vous voulez un miroir plus rapide, ajustez l’URL dans +/etc/fai/apt/sources.list et FAI_DEBOOTSTRAP dans +/etc/fai/nfsroot.conf avant de lancer fai-setup.]
    +Ensuite, on peut lancer fai-setup(8) +
    [Cela invoque fai-make-nfsroot(8) en interne.]
    +Et vérifiez si tout s’est bien passé. Le fichier de journal est écrit dans +/var/log/fai/fai-setup.log. +

    +
  • +
+
+
+
# fai-setup -v
+
+
+
+
+
FAI packages and related packages inside the nfsroot:
+dracut             059-4
+dracut-live        059-4
+dracut-network     059-4
+dracut-squash      059-4
+fai-client         6.2
+fai-nfsroot        6.2
+fai-setup-storage  6.2
+Waiting for background jobs to finish
+fai-make-nfsroot finished properly.
+Log file written to /var/log/fai/fai-make-nfsroot.log
+Adding line to /etc/exports: /srv/fai/config 192.168.33.250/24(async,ro,no_subtree_check)
+Adding line to /etc/exports: /srv/fai/nfsroot 192.168.33.250/24(async,ro,no_subtree_check,no_root_squash)
+Reloading nfs-kernel-server configuration (via systemctl): nfs-kernel-server.service.
+
+Your initial config space is now located in /srv/fai/config
+Please don't forget to fill out the FAI questionnaire after you've finished your project with FAI.
+
+FAI setup finished.
+Log file written to /var/log/fai/fai-setup.log
+
+
    +
  • +

    +fai-setup a créé le LOGUSER, le nfsroot et a ajouté des lignes +supplémentaires à /etc/exports. Les sous-répertoires ajoutés à +/etc/exports sont exportés via NFS v3, de sorte que tous les clients +d’installation dans le même sous-réseau peuvent les monter via NFS. +

    +
  • +
+
+
+

Création de l’espace de configuration

+

Installez les exemples simples dans l’espace de configuration +
[Il n’est pas nécessaires que ces fichiers appartiennent au compte root.]
.

+
+
+
$ fai-mk-configspace
+
+

Ces exemples contiennent la configuration pour certains hôtes d’exemple. +Selon le nom d’hôte utilisé, votre ordinateur sera configuré comme suit :

+
+
+demohost +
+
+

+Une machine qui n’a besoin que d’un petit disque dur. Cette machine +est configurée avec le réseau en tant que client DHCP, et une démo de +compte est créée. +

+
+
+xfcehost +
+
+

+Un bureau XFCE est installé, utilisant LVM, et la démo du compte est +créée. +

+
+
+gnomehost +
+
+

+ Un bureau GNOME est installé et la démo du compte est créée. +

+
+
+

ubuntuhost::\n" +Un bureau Ubuntu sera installé et la démo du compte est créée.

+
+
+autres noms d’hôtes +
+
+

+Les hôtes disposant d’un autre nom d’hôte utiliseront notamment les +classes FAIBASE, DHCPC et GRUB. +

+
+
+

Tous les hôtes auront un compte appelé demo avec mot de passe fai. Le +compte root a également le mot de passe fai.

+

Si l’indicateur FAI menu est ajouté, au lieu d’utiliser le nom +d’hôte pour déterminer le type d’installation, un menu est présenté et +l’utilisateur peut choisir un profil pour l’installation.

+
+
+

Configurer les démons réseau

+

Pour démarrer le client d’installation via PXE, le serveur +d’installation a besoin d’un démon DHCP et d’un démon TFTP fonctionnels. +Le paquet fai-quickstart a déjà installé les paquets logiciels +pour ces démons. En outre, le paquet du serveur NFS pour +l’exportation du nfsroot et de l’espace de configuration a été installé.

+
+

Configuration du démon DHCP

+

Idéalement, votre faiserver doit également être votre serveur DHCP. Si ce +n’est pas le cas, demandez à l’administrateur responsable du serveur +DHCP de le configurer conformément à cette section. Il est +possible d’éviter cela optionnellement en utilisant la fonctionnalité +[autodiscover] diffusée dans FAI 5.0.

+

Un exemple pour dhcpd.conf(5) est fourni avec le paquet fai-doc. +Commencez à utiliser cet exemple et regardez toutes les options qui y +sont utilisées.

+
+
+
# cp /usr/share/doc/fai-doc/examples/etc/dhcpd.conf /etc/dhcp/
+
+

Les seules informations spécifiques FAI contenues dans ce fichier de +configuration sont d’assigner filename (DHCP option 67) à la valeur fai/pxelinux.0 et +d’assigner next-server (DHCP option 66, also aussi nommée TFTP server name) et server-name +à la valeur du nom de votre serveur d’install . Toutes les autres informations sont uniquement des +données liées au réseau, qui sont utilisées dans presque toutes les +configurations DHCP. Ajustez ces paramètres de réseau à vos besoins locaux.

+
+
+
deny unknown-clients;
+option dhcp-max-message-size 2048;
+use-host-decl-names on;
+
+subnet 192.168.33.0 netmask 255.255.255.0 {
+   option routers 192.168.33.250;
+   option domain-name "my.example";
+   option domain-name-servers 192.168.33.250;
+   option time-servers faiserver;
+   option ntp-servers faiserver;
+   server-name faiserver;
+   next-server faiserver;
+   filename "fai/pxelinux.0";
+}
+
+

Si vous apportez des modifications à la configuration DHCP, vous devez +redémarrer le démon.

+
+
+
# invoke-rc.d isc-dhcp-server restart
+
+

Si vous disposez de plusieurs interfaces réseau, vous pouvez définir +l’interface que le serveur écoutera dans /etc/default/isc-dhcp-server. +Par défaut, le démon DHCP écrit ses messages de journalisation dans +/var/log/daemon.log.

+
+
+

Ajout d’une entrée d’hôte au DHCP

+

L’adresse MAC est donnée par le matériel de la carte réseau. Pour chaque +client d’installation, vous collectez son adresse MAC et l’associez à une +adresse IP et à un nom d’hôte. Tout d’abord, nous ajoutons l’adresse IP +et le nom d’hôte à /etc/hosts
[On peut aussi ajouter cela dans son serveur de noms de domaine (DNS)]
.

+
+
+
192.168.33.100    demohost
+
+

L’association de l’adresse MAC à l’adresse IP est effectuée dans le fichier +dhcpd.conf. Ici, nous ajoutons une entrée d’hôte en utilisant la +commande +dhcp-edit(8)+ . Ici, vous devez remplacer 01:02:03:AB:CD:EF +avec l’adresse MAC que vous avez trouvé.

+
+
+
# dhcp-edit demohost 01:02:03:AB:CD:EF
+
+

Après l’invocation de cette commande, voici à quoi l’entrée d’hôte dans +dhcpd.conf ressemblera :

+
+
+
host demohost {hardware ethernet 01:02:03:AB:CD:EF;fixed-address demohost;}
+
+
+
+

TFTP

+

Normalement, vous n’avez pas besoin d’apporter de modifications à la +configuration démon TFTP. Les fichiers fournis par TFTP sont situés +dans /srv/tftp/fai.

+
+
+

NFS

+

La commande fai-setup a déjà configuré le démon NFS et ajouté +quelques lignes au fichier de configuration /etc/exports. Il exporte +les répertoires en utilisant NFS v3.

+
+
+
+

Création de la configuration PXELINUX

+

La dernière étape avant de démarrer votre client pour la première fois +est de spécifier quelle configuration le client doit démarrer lors de +l’amorçage PXE. Nous utilisons la commande fai-chboot(8) pour +créer une configuration pxelinux pour chaque client d’installation. Cela +comprend des informations sur le noyau, le fichier initrd, l’espace de +configuration et certains paramètres d’amorçage. Vous devriez lire la +page de manuel, qui vous donne quelques bons exemples. Voici la commande +pour démarrer l’installation de l’hôte demohost.

+
+
+
$ fai-chboot -IFv -u nfs://faiserver/srv/fai/config demohost
+
+Booting kernel vmlinuz-4.19.0-5-amd64
+ append initrd=initrd.img-4.19.0-5-amd64 ip=dhcp
+   FAI_FLAGS=verbose,sshd,createvt FAI_CONFIG_SRC=nfs://faiserver/srv/fai/config
+
+demohost has 192.168.33.100 in hex C0A82164
+Writing file /srv/tftp/fai/pxelinux.cfg/C0A82164 for demohost
+
+

À ce stade, vous devriez avoir une configuration faiserver de travail et +vos clients devraient démarrer dans FAI et être en mesure d’installer +l’un des exemples.

+

Dans la section suivante, vous pouvez lire la planification de votre +installation, adapter votre espace de configuration à vos besoins +particuliers et étendre FAI à l’aide de hooks.

+
+
+

Serveur personnalisé

+

Le faiserver et sa configuration n’est nullement statique. Il est possible +de personnaliser et d’étendre votre serveur. Pour cela, reportez-vous à +la section[Customizing your install server setup] dans [advanced]."

+
+
+
+
+

Planifiez votre installation

+
+

Avant de commencer votre installation, vous devriez investir beaucoup de +temps dans la planification de votre installation. Une fois que vous +êtes satisfait de votre concept d’installation, FAI peut faire toutes +les tâches ennuyeuses et répétitives pour transformer vos plans en +réalité. FAI ne peut pas faire de bonnes installations si votre concept +est imparfait ou qu’il y manque quelques détails importants. Commencez à +planifier l’installation en répondant aux questions suivantes :

+
    +
  • +

    +Est-ce que je vais créer un cluster Beowulf ou dois-je installer des machines de bureau ? +

    +
  • +
  • +

    +À quoi ressemble ma topologie LAN ? +

    +
  • +
  • +

    +Ai-je un matériel uniforme ? Le matériel sera-t-il uniforme à l’avenir ? +

    +
  • +
  • +

    +Le matériel a-t-il besoin d’un noyau spécial ? +

    +
  • +
  • +

    +Comment nommer les hôtes ? +

    +
  • +
  • +

    +Comment les disques durs locaux doivent-ils être partitionnés ? +

    +
  • +
  • +

    +Quelles applications seront lancées par les utilisateurs ? +

    +
  • +
  • +

    +Les utilisateurs ont-ils besoin d’un système de mise en file d’attente ? +

    +
  • +
  • +

    +Quels logiciels faut-il installer ? +

    +
  • +
  • +

    +Quels démons devraient être lancés, et à quoi devrait ressembler leur configuration ? +

    +
  • +
  • +

    +Quels systèmes de fichiers distants doivent être montés ? +

    +
  • +
  • +

    +Comment effectuer les sauvegardes ? +

    +
  • +
+

Vous devez également penser à des comptes d’utilisateur, des +imprimantes, un système de courrier, des travaux de cron, des cartes +graphiques, au double amorçage, au NIS, au NTP, au fuseau horaire, +à la disposition de clavier, à l’exportation et au montage des annuaires via +NFS et à beaucoup d’autres choses. Donc, il ya beaucoup à faire avant de +commencer une installation. Et rappelez-vous que la connaissance est le +pouvoir, et c’est à vous de l’utiliser. L’installation et +l’administration sont un processus et non un produit. FAI ne peut pas +faire les choses que vous ne lui dites pas de faire.

+

Mais vous ne devez pas commencer à partir de zéro. Examinez les fichiers +et les scripts dans l’espace de configuration. Il ya beaucoup de choses +que vous pouvez utiliser pour votre propre installation. Un bon article +intitulé « Bootstrapping an Infrastructure » avec d’autres aspects de la +construction d’une infrastructure est disponible sur +http://www.infrastructures.org/papers/bootstrap/bootstrap.html

+
+

L’espace de configuration et ses sous-répertoires

+

The configuration space is the collection of information about how exactly +to install a client. The central configuration space for all install +clients is located on the install server in /srv/fai/config and its +subdirectories. This will be mounted by the install clients to +/var/lib/fai/config. The main installation command fai(8) uses all +these subdirectories in the order listed except for hooks.

+
+
+class/ +
+
+

+Scripts et fichiers pour définir des classes et des variables. +

+
+
+disk_config/ +
+
+

+Fichiers de configuration pour le partitionnement de disque, RAID +logiciel, LVM et création de système de fichiers. +

+
+
+basefiles/ +
+
+

+Normalement , le fichier base.tar.xz (situé à l’intérieur du +nfsroot) est extrait sur le client d’installation après la création +des nouveaux systèmes de fichiers et avant l’installation des paquets. +Il s’agit d’une image de base minimale, créée juste après avoir appelé +debootstrap lors de la création du nfsroot sur le serveur +d’installation. Si vous voulez installer une autre distribution que celle +du nfsroot, vous pouvez mettre un fichier tar dans le sous-répertoire +basefiles/ et le nommer selon une classe. Ensuite, la commande +ftar(8) est utilisée pour extraire le fichier tar en fonction des +classes définies. Ainsi, le fichier doit être nommé CLASS.tar.xz +et non CLASS.base.tar.xz. Cela se fait dans la tâche extrbase. +Utilisez cette option si vous souhaitez installer une autre +distribution ou une version différente de celle exécutée pendant +l’installation. +

+

Ce fichier de base peut également être reçu en fonction des classes +FAI via HTTP/HTTPS ou FTP en définissant la variable FAI_BASEFILEURL. FAI +téléchargera un fichier CLASSNAME.tar.xz (ou tgz, ou tar.gz, …) à +partir de cette URL, si CLASSNAME correspond à une classe FAI.

+

Exemple :

+
+
+
+
+
FAI_BASEFILEURL=https://fai-project.org/download/basefiles/
+
+

Le dossier doit prendre en charge la liste des répertoires. FAI ne +recherchera pas de fichiers potentiellement correspondants.

+

Voir le chapitre [otherdists] pour savoir comment +installer différentes distributions.

+
+
+debconf/ +
+
+

+Ce répertoire contient toutes les données debconf(7). Le format +est le même que celui utilisé par debconf-set-selections(1). +

+
+
+package_config/ +
+
+

+Les fichiers avec des noms de classe contiennent des listes de +paquets à installer ou à désinstaller par +install_packages(8). Les fichiers nommés <CLASS>.gpg sont ajoutés à la liste des clés utilisées par apt +pour les dépôts de paquets approuvés. +

+
+
+pkgs/ +
+
+

+Ce répertoire peut avoir des sous-répertoires nommés selon des classes. Vous pouvez +mettre des fichiers .deb ou .rpm dans ces sous-répertoires. FAI installera +ces paquets sans qu’il soit besoin de créer les métadonnées d’un dépôt de paquets. +

+
+
+scripts/ +
+
+

+Scripts pour la personnalisation de votre site local. Utilisé par +fai-do-scripts(1). +

+
+
+files/ +
+
+

+Les Fichiers utilisés par les scripts de personnalisation. La plupart +des fichiers se trouvent dans un sous-répertoire qui +reflète l’arborescence de répertoires ordinaire. Par exemple, les +modèles de _nsswitch.conf_ se trouvent dans +$FAI/files/etc/nsswitch.conf et sont nommés en fonction des classes +auxquelles ils doivent correspondre : +$FAI/files/etc/nsswitch.conf/NIS est la version de +/etc/nsswitch.conf à utiliser pour la classe NIS. Notez que le +contenu du répertoire n’est pas automatiquement copié sur la machine +cible, mais qu’il doit être explicitement copié par des scripts de +personnalisation à l’aide de la commande fcopy(8). +

+
+
+hooks/ +
+
+

+Les hooks sont des programmes ou des scripts définis par +l’utilisateur, qui sont lancés pendant le processus d’installation. +Ils peuvent étendre ou remplacer les tâches par défaut. Le nom du +fichier doit être de format taskname.CLASSNAME[.sh]. Un hook appelé +updatebase.DEBIAN est exécuté avant la tâche +updatebase et seulement si l’installation du client fait partie de +la classe DEBIAN. +

+
+
+
+
+

Définition des classes

+

Il existe différentes possibilités pour définir des classes :

+
    +
  1. +

    +Certaines classes par défaut sont définies pour chaque hôte : DEFAULT, LAST et son nom d’hôte. +

    +
  2. +
  3. +

    +Les classes peuvent être répertoriées dans un fichier (par défaut dans class/<hostname>). +

    +
  4. +
  5. +

    +Les classes peuvent être dynamiquement définies par des scripts. +

    +
  6. +
+

La dernière option est une fonctionnalité très intéressante, puisque ces +scripts définiront des classes d’une façon très souple. Par exemple, +plusieurs classes peuvent être définies uniquement si certains matériels +sont identifiés ou si une classe est définie en fonction des +informations du sous-réseau.

+

Tous les noms de classes, sauf le nom d’hôte, sont écrits en +majuscules. Ils ne doivent pas contenir de trait d’union, de dièse, de +point-virgule ni de point, mais peuvent contenir des caractères de +soulignement et des chiffres.

+

La tâche defclass appelle la commande fai-class(1) pour définir +les classes. Tous les scripts correspondant à l’expression ^[0-9][0-9]* (qui +commencent avec deux chiffres) Dans le sous-repertoire $FAI/class sont +exécutés afin de définir les classes. Tout ce qui is affiché sur STDOUT +est automatiquement defini comme une classe. Pour plus d’informations +sur Les définitions de classe , lire les pages de manuel de +fai-class(1). Le script 50-host-classes (voir ci - dessous la +version allégée) est utilisé pour les définir des classes en fonction du +nom d’hôte.

+
+
+
# use a list of classes for our demo machines
+case $HOSTNAME in
+    demohost)
+        echo "FAIBASE GRUB DEMO" ;;
+    xfcehost)
+        echo "FAIBASE GRUB DEMO XORG XFCE LVM";;
+    faiserver)
+        echo "FAIBASE DEBIAN DEMO FAISERVER" ;;
+    ubuntuhost)
+        echo "FAIBASE DEBIAN DEMO UBUNTU JAMMY JAMMY64 XORG";;
+    *)
+        echo "FAIBASE DEBIAN DEMO" ;;
+esac
+
+

Les noms d’hôtes doivent rarement être utilisé pour les fichiers de +configuration dans l’espace de configuration. Au lieu de ça, une classe doit +être définie et ensuite ajoutée pour un hôte donné. En effet, la plupart +du temps les données de configuration ne sont pas spécifiques à un nom +d’hôte, mais peuvent être partagées entre différents hôtes.

+

L’ordre des classes est important car celui-ci définit la priorité des +classes de faible à élevée.

+
+
+

Définition des Variables

+

La tâche defvar definit les variables pour le client d’installation. +Les variables sont définies par les scripts dans class/*.var. +Toutes les variables globales peuvent être définies dans DEFAULT.var. +Pour un groupe d’hôtes utiliser un fichier de classe. Pour un +hôte seul, utiliser le Fichier $HOSTNAME .var. Ici aussi, il est +utile d’étudier tous les exemples.

+

Les variables suivantes sont utilisées dans les exemples et peuvent aussi être +utiles pour votre installation :

+
+
+FAI_ACTION +
+
+

+Set the action FAI should perform. Normally this is done by +fai-chboot(8). If you can’t use this command, define this variable +i.e. in the script LAST.var. +

+
+
+FAI_ALLOW_UNSIGNED +
+
+

+Si cette variable vaut 1, FAI permet l’installation de paquets à partir de +dépôts non signés. +

+
+
+CONSOLEFONT +
+
+

+La police de caractères qui est chargée lors de l’installation par +setfont(8). +

+
+
+KEYMAP +
+
+

+Définit les fichiers de disposition du clavier dans /usr/share/keymaps +et $FAI/files. Vous n’avez pas besoin de spécifier le chemin complet, +car ce fichier sera localisé automatiquement. +

+
+
+ROOTPW +
+
+

+Le mot de passe root chiffré pour le nouveau système. Vous pouvez +utiliser +crypt(3), md5 et d’autres types de hachage pour le mot de passe. Utilisez 'mkpasswd(1)+` +pour créer le hachage d’un mot de passe donné. Par exemple, pour +générer le hachage MD5 un mot de passe, utilisez : +

+
+
+
+
+
$ echo "votre_mot_secret" | mkpasswd -m yescrypt -s
+
+
+
+UTC +
+
+

+Règle l’horloge matérielle à UTC si UTC=yes. Sinon, règle +l’horloge à l’heure locale. Voir clock(8) pour plus +d’informations. +

+
+
+TIMEZONE +
+
+

+C’est le fichier sous /usr/share/zoneinfo/ qui indique votre +fuseau horaire. Par exemple : TIMEZONE=Europe/Berlin. +

+
+
+MODULESLIST +
+
+

+Une liste des modules du noyau qui sont chargés pendant le démarrage +du nouveau système (écrits dans /etc/modules). +

+
+
+
+
+

Configuration du disque dur

+

L’outil setup-storage(8) lit un fichier dans $FAI/disk_config pour +la configuration du disque. Ce fichier décrit comment tous les disques +Locaux seront partitionnés, quels types de systèmes de fichiers +doivent etre créés (comme ext3/4, xfs, btrfs), et où ils seront montés. +Vous pouvez aussi créer des configurations RAID logiciel et LVM en +utilisant ce fichier de configuration. Il est aussi possible de préserver +le partitionnement du disque ou de préserver les +données sur certaines partitions.

+

Pendant le processus d’installation, tous les systèmes de fichiers +locaux sont montés sous le répertoire /target. Par exemple, si vous +spécifiez le point de montage /home dans un fichier de configuration +de disque, ce sera le répertoire /target/home pendant le processus +d’installation et ça deviendra /home pour le nouveau système installé.

+
+
+

Extraction du fichier de base

+

Un fichier de base n’est nécessaire que si on installe une distribution qui est +défférente de celle dans le nfsroot.

+
+
+

Pré-ensemencement Debconf

+

On peut utiliser le fomat décrit dans debconf-set-selections(1).

+
+
+

Accès au dépôt de paquets

+

FAI supporte http, https, et NFS pour l’accès au miroir de paquets. Réglez +la variable $FAI_DEBMIRROR pour l’utilisation de NFS.

+
+
+

Configuration des paquets logiciels

+

Avant l’installation de paquets, FAI va ajouter le contenu de tous +les fichiers nommés package_config/class.gpg à la liste des clés apt. +Si votre dépôt local est signé par votre keyid AB12CD34 vous pouvez +facilement ajouter cette clé, ainsi FAI l’utilisera pendant +l’installation. Utilisez cette commande pour créer le fichier +CLASS.gpg :

+
+
+
faiserver$ gpg --export AB12CD34 > /srv/fai/config/package_config/MYCLASS.gpg
+
+

Le script install_packages(8) installe les logiciels sélectionnés. +Il lira tous les fichiers de configuration Dans $FAI/package_config +dont le nom correspond à une classe définie. La syntaxe est très simple.

+
+
+
# an example package class
+
+PACKAGES taskinst
+german
+
+PACKAGES install-norec
+adduser nmap
+less zstd
+
+PACKAGES remove
+gpm xdm
+
+PACKAGES install GRUB_PC
+grub-pc
+
+

Les commentaires commencent par une dièse (#) et se terminent à la fin de la +ligne. Chaque commande de paquet commence par le mot PACKAGES suivi +par un nom de commande, qui correspond à gestionnaire de paquets +distinct comme apt-get, aptitude ou dnf par exemple. la commande définit quelle +commande sera utilisé pour installer les paquets nommés après +cette commande. La liste de toutes les commandes disponibles peut +être listée en utilisant install_packages -H. Les gestionnaires de paquets pris +en charges sont aptitude, apt-get, smart, yast, dnf, rpm, zypper

+
+
+hold +
+
+

+Mettre un paquet en attente. Ce paquet ne sera pas pris en charge par +dpkg, pas exemple il ne sera pas mis à niveau. +

+
+
+install +
+
+

+Pour installer tous les paquets (en utilisant apt-get) qui sont précisés +dans les lignes suivantes. Si un tiret est ajouté au nom du paquet +(sans espace intermédiaire), le paquet sera supprimé, pas installé. +Tous les noms de paquets sont vérifiées pour les fautes de frappe. +Tout paquet qui n’existe pas, sera retiré de la liste des paquets à +installer. Soyez donc attentif à ne pas mal orthographier les +noms de paquets. +

+
+
+install-norec +
+
+

+Comme install, mais sans installer les paquets recommandés. +

+
+
+remove +
+
+

+Supprimer tous les paquets qui sont pécisés dans les lignes suivantes. +Si on ajoute un + au nom du paquet, le paquet doit être installé. +

+
+
+taskinst +
+
+

+Installer tous les paquets appartenant aux tâches qui sont spécifiées +dans les lignes suivantes à l’aide de tasksel(1). Vous pouvez +aussi utiliser aptitude pour installer les tâches. +

+
+
+aptitude +
+
+

+Installer tous les paquets avec la commande aptitude. Ce sera la +valeur par défaut à l’avenir et pourra remplacer apt-get et taskinst. +Aptitude peut aussi installer les tâches de paquets. +

+
+
+aptitude-r +
+
+

+Idem aptitude avec l’option --with-recommends. +

+
+
+unpack +
+
+

+Télécharger les paquets et les décompresser seulement. Ne pas configurer les +paquets. +

+
+
+dselect-upgrade +
+
+

+Definir des sélections des paquets en utilisant les lignes suivantes puis +installer ou supprimer les paquets précisés. Ces lignes sont le résultat +de la commande dpkg --get-selections. Il est recommandé de ne pas +utiliser ce format, puisque cela spécifie aussi tous les +paquets qui sont installés seulement en raison d’une dépendance ou +d’une recommandation. Il vaut mieux juste spécifier le paquet que vous +voulez avoir, et de laisser FAI (et apt-get) résoudre les dépendances. +

+
+
+

Plusieurs lignes avec des listes de noms de paquets séparés par des +espaces suivent les directive PACKAGES. Toutes les dépendances sont +résolues. Les paquets avec suffixe - (par exemple, lilo-) seront +supprimés au lieu d’être installés. L’ordre des paquet n’a pas +d’importance. Si vous souhaitez installer des paquets d’une autre +version que la valeur par défaut, vous pouvez ajouter le nom de la +version au nom du paquet comme dans openoffice.org/etch-backports. +Vous pouvez également spécifier une certaine version comme apt=0.3.1. +Plus d’informations sur ces fonctionnalités sont décrites dans +aptitude(8).

+

On peut spécifier des paramètres supplémentaires pour le gestionnaire de paquets +en ajoutant des paires cle=valeur après PACKAGES <commande>. les paires clé, valeur +actuellement supportées sont release=<nom> qui ajoute -t <nom> durant +l’installation des paquets.

+

Exemple:

+
+
+
PACKAGES install-norec release=testing
+nvidia-smi
+
+

Cela installerait le paquet nvidia-smi de la distribution testing, +en incluant les dépendances. N’oubliez pas d’ajouter une entrée dans +sources.list. Vous pouvez aussi vouloir ajuste l’épinglage apt (apt pinning) +(voir apt_references(5))

+

Une ligne qui contient la commande PRELOADRM, télécharge un fichier à +l’aide de wget(1) dans un répertoire avant d’installer les paquets. +À l’aide d’une URL de type file:, ce fichier est copié de $FAI_ROOT vers le +répertoire de téléchargement. Par exemple, le paquet realplayer a +besoin d’une archive pour installer le logiciel, donc cette archive est +téléchargée dans le répertoire /root. Après l’installation des +paquets, ce fichier sera supprimé. Si le fichier ne doit pas être +supprimé, utilisez plutôt la commande PRELOAD.

+

On peut ajouter une expression booléenne arbitraire qui utilise des classes FAI pour +définir quand la liste des paquets devrait être installée. Ici, les +paquets seront installés seulement si la classe XORG est définie mais la classe +MINT n’est pas définie.

+

Exemple:

+
+
+
PACKAGES install UBUNTU && XORG && ! MINT
+ubuntu-standard
+ubuntu-desktop
+
+

L’ancienne façon d’ajouter des expressions logiques dans les lignes PACKAGES est encore valable : +Il est possible d’ajouter une liste de noms de classes après la commande pour +apt-get. Ainsi une telle commande PACKAGES sera exécutée seulement au moins +une des classes correspondantes est définie (OU logique). On peut donc combiner +plusieurs petits fichiers dans le fichier DEFAULT.

+

Si vous souhaitez supprimer un nom de paquet d’une certaine classe +faisait partie de cette classe précédemment, vous ne devez pas supprimer le +nom du paquet classe, mais plutôt de lui ajouter un tiret (-). Cela +garantira que le paquet soit enlevé pendant une mise a jour sur des hôtes +qui étaient installés en utilisant l’ancienne définition de classe qui +comprenait ce nom de paquet.

+

Si vous spécifiez un paquet qui n’existe pas, ce paquet sera supprimé +automatiquement de la liste d’installation uniquement si la commande +install est utilisée.

+

Le concept de priorité des classes permet à une classe de priorité plus élevée (qui +arrive plus tard dans la séquence des classes) d’écraser les sélections des +paquets de priorité plus basse. Pour que cela fonctionne correctement, +les classes de priorité plus élevée doivent utiliser les mêmes commandes PACKAGES (par exemple +PACKAGES install-norec au lieu de seulement PACKAGES install) que celles qu’utilisent +la classe qu’on essaie d’écraser. Cela est utile pour supprimer +l’installation d’un paquet, par exemple, pour éviter d’installer le paquet +linuxlogo installé par la classe FAIBASE :

+
+
+
# exemple montrant comment écraser :
+#
+# Dans FAIBASE il y a :
+#    PACKAGES install-norec
+#    linuxlogo
+#
+# On veut _ne pas_ installer linuxlogo, et il se trouve dans
+# une section install-norec, donc il faut aussi utiliser install-norec.
+
+PACKAGES install-norec
+linuxlogo-
+
+
+
+

Scripts de personnalisation

+

La commande fai-do-scripts(1) est lancée pour exécuter tous les +scripts dans ce répertoire. Si un répertoire avec un nom de classe +existe, tous les scripts correspondant à l’expression ^[0-9][0-9]* sont exécutés +par ordre alphabétique. Il est donc possible d’utiliser des scripts de +différentes langages (shell, cfengine, Perl, Python, Ruby, expect,..) +pour une classe.

+

Ces scripts écrivent leur sortie standard dans scripts.log. Le fichier status.log +contient les noms de tous les scripts exécutés et leur statut de terminaison.

+
+

Scripts shell

+

La plupart des scripts sont des scripts Bourne shell. Les scripts shell +sont utiles si la tâche de configuration n’a besoin d’appeler que +quelques commandes shell ou créer un fichier à partir de zéro. Afin d’éviter +d’écrire beaucoup de scripts courts, il est possible d’utiliser la +commande ifclass pour tester si certaines classes sont définies.

+
+
+
ifclass -o A B C
+
+

Vérifie si l’une des classes A, B ou C est définie. L’utilisation de -a +(ET, AND logique) vérifie si toutes les classes d’une liste sont définies. +La commande ifclass C vérifie si seule la classe C est définie.

+

Pour copier des fichiers avec des classes, utilisez la commande +fcopy(8). Si vous voulez extraire une archive à l’aide de classes, +utilisez ftar(8). Pour ajouter des lignes à un fichier de +configuration, utilisez ainsl(1) au lieu de simplement +echo string >> filename.

+

FAI prend également en charge les scripts zsh(1) pendant la tâche de +personnalisation. Dans les scripts, la variable $classes contient +une liste séparée par des espaces avec les noms de toutes les classes +définies.

+
+
+

Cfengine scripts

+

CFEngine has a rich set of functions to edit existing configuration +files, e.g LocateLineMatching, ReplaceAll, InsertLine, +AppendIfNoSuchLine, HashCommentLinesContaining. But it can’t handle +variables which are undefined. If a variable is undefined, the whole +cfengine script will abort.

+

More information can be found in the manual page cfengine(8) or at +the cfengine homepage https://www.cfengine.com.

+
+
+
+

Hooks

+

Hooks let you specify functions or programs which are run at certain +steps of the installation process. Before a task is called, +FAI searches for existing hooks for this task and executes them. As +you might expect, classes are also used when calling hooks. Hooks are +executed for every defined class. You only have to create the hook +with the name for the desired class and it will be used. If several +hooks for a task exists, they are called in the order defined by the +classes. If debug is included in $FAI_FLAG the option -d is +passed to all hooks, so you can debug your own hooks. If some default +tasks should be skipped, use the subroutine skiptask and a list of +default tasks as parameters. In the examples provided, the hooks of +the class CENTOS skips some Debian specific tasks.

+

The directory $FAI/hooks/ contains all hooks. A hook is an executable +file following the naming scheme taskname.CLASSNAME[.sh] (e.g. +repository.CENTOS or 'savelog.LAST.sh). The +task name specifies which task to precede executing this hook, if the +specified class is defined for the installing client. See section +[tasks] for a complete list of default tasks that can be used.

+

A hook of the form hookprefix.classname can’t define variables for +the installation script, because it’s a subprocess. But you can use +any binary executable or any script you wrote. Hooks that have the +suffix .sh (e.g. partition.DEFAULT.sh) must be Bourne +shell scripts and are sourced. So it’s possible to redefine variables +for the installation scripts.

+

In the first part of FAI, all hooks with prefix confdir are called. +Those hooks can not be located in the config space, since it’s not yet +available. Therefore these hooks are the only hooks located in +$nfsroot/$FAI/hooks on the install server. All other hooks are +found in $FAI_CONFIGDIR/hooks on the install server.

+

All hooks that are called before classes are defined can only use the +following classes: DEFAULT $HOSTNAME LAST. If a hook for class +DEFAULT should only be called if no hook for class $HOSTNAME is +available, insert these lines to the default hook:

+
+
+
hookexample.DEFAULT:
+
+#! /bin/sh
+
+# skip DEFAULT hook if a hook for $HOSTNAME exists
+scriptname=$(basename $0 .DEFAULT)
+[-f $FAI/hooks/$scriptname.$HOSTNAME ] && exit
+# here follows the actions for class DEFAULT
+.
+.
+
+

Some examples for what hooks could be used:

+
    +
  • +

    +Load kernel modules before classes are defined in $FAI/class. +

    +
  • +
  • +

    +Send an email to the administrator if the installation is finished. +

    +
  • +
  • +

    +Install a diskless client and skip local disk partitioning. +

    +
  • +
  • +

    +Have a look at hooks/debconf.IMAGE for how to clone a machine using a file system image. +

    +
  • +
+
+
+

FAI flags

+

The variable $FAI_FLAGS contains a space separated list of +flags. Flags are normally defined in the pxelinux.cfg file which +should be created by fai-chboot(1). The following flags are known:

+
+
+verbose +
+
+

+Create verbose output during installation. This should always be the +first flag, so consecutive definitions of flags will be verbosely +displayed. +

+
+
+debug +
+
+

+Create debug output. No unattended installation is performed. During +package installation you have to answer all questions of the +postinstall scripts on the client’s console. A lot of debug +information will be printed out. This flag is only useful for FAI +developers. +

+
+
+sshd +
+
+

+Start the ssh daemon to enable remote logins. +You can then log in as root to all install clients during the +installation. The default password is fai and can be changed by +setting FAI_ROOTPW in nfsroot.conf(5). To log in from your server +to the install client (named demohost in this example) use: +

+
+
+
+
+
$ ssh root@demohost
+Warning: Permanently added 'demohost,192.168.33.100' to the list of known hosts.
+root@demohost's password:
+
+

This is only the root password during the +installation process, not for the new installed system. You can also +log in without a password when using $SSH_IDENTITY.

+
+
+createvt +
+
+

+Create two virtual terminals and execute a bash if ctrl-c is typed +in the console terminal. The additional terminals can be accessed by +typing Alt-F2 or Alt-F3. Otherwise, no terminals are available and +typing ctrl-c will reboot the install client. Setting this flag is +useful for debugging. If you want an installation which should not be +interruptible, do not set this flag. +

+
+
+menu +
+
+

+This enables a user menu for selecting a profile. All files +class/*.profile are read and a curses based menu will be created. +

+
+
+screen +
+
+

+Run FAI inside a screen(1) session. The session is called FAI. +If you log in via ssh from remote you can attach to the session using: +

+
+
+
+
+
$ screen -x
+
+
+
+tmux +
+
+

+Run FAI inside a tmux(1) session. The session is called FAI. +If you log in via ssh from remote you can attach to the session using: +

+
+
+
+
+
$ tmux attach
+
+
+
+reboot +
+
+

+Reboot the install client after installation is finished without +typing RETURN on the console. If this flag is not set, and error.log +contains anything, the install client will stop and wait that you +press RETURN. If no errors occurred, the client will always reboot +automatically. +

+
+
+halt +
+
+

+Halt the install client at the end of the installation, instead of +rebooting into the new system. +

+
+
+initial +
+
+

+Used by setup-storage(8). Partitions marked with preserve_reinstall +are preserved unless this flag is set. Often, this flag is set in a +file class/*.var by using setting flag_initial=1. +

+
+
+
+
+
+
+

FAI installs your plan

+
+
+

The early part of an installation

+

After the kernel has booted, it mounts the root file system via NFS +from the install server and starts the script +/usr/sbin/fai
[Since the root file system on the clients is mounted via +NFS, fai is located in +/srv/fai/nfsroot/usr/sbin on the install +server.]
. This script controls the sequence of the +installation. No other scripts in /etc/init.d/ are used.

+

The configuration space is made available via the configured method +(an NFS mount by default) from the install server to the path defined +in $FAI
[$FAI is an internal variable used by the FAI +scripts. By default the path is /var/lib/fai/config.]

+
+
+

Boot messages

+

When booting the install client from network card with PXE you will see some +messages like this:

+
+
+
Managed PC Boot Agent (MBA) v4.00
+Pre-boot eXecution Environment (PXE) v2.00
+DHCP MAC ADDR: 00 A2 A3 04 05 06
+DHCP.../
+
+CLIENT MAC ADDR: 00 A2 A3 04 05 06  GUID: 3D6C4552
+CLIENT IP: 192.168.33.100 MASK: 255.255.255.0  DHCP IP: 192.168.33.250
+GATEWAY IP: 192.168.33.1
+
+!PXE entry point found (we hope) at 9854:0106 via plan A
+UNDI code segment at: 9854 len 5260
+UNDI data segment at: 921D len 63A2
+Getting cached packet  01 02 03
+My Ip address seems to be C0A82164 192.168.33.100
+ip=192.168.33.100:192.168.33.250:192.168.33.1:255.255.255.0
+BOOTIF=01-00-A2-A3-04-05-06
+SYSUUID=
+TFTP prefix: fai/
+Trying to load pxelinux.cfg/C0A82164
+
+Loading vmlinuz-6.1.0-17-amd64..................
+Loading initrd.img-6.1.0-17-amd64......................ready.
+
+

At this point the install client has successfully received the network +config via DHCP and the kernel and initrd via TFTP. It now boots the +Linux kernel and the initrd. If everything went right, the initrd +mounts the nfsroot
[/srv/fai/nfsroot from the install +server via NFS]
and the FAI scripts are started. The first +thing you see is the red FAI copyright message.

+
+
+
             -------------------------------------------------
+                   Fully Automatic Installation  -  FAI
+
+                   6.2           (c) 1999-2024
+                   Thomas Lange  <lange@cs.uni-koeln.de>
+             -------------------------------------------------
+
+Calling task_confdir
+Kernel currently running: Linux 6.1.0-17-amd64 x86_64 GNU/Linux
+Kernel parameters: BOOT_IMAGE=vmlinuz-6.1.0-17-amd64 initrd=initrd.img-6.1.0-17-amd64 \
+  ip=dhcp rw root=192.168.33.250:/srv/fai/nfsroot rootovl FAI_FLAGS=verbose,sshd,createvt
+  FAI_ACTION=install FAI_CONFIG_SRC=nfs://faiserver/srv/fai/config
+Reading /tmp/fai/boot.log
+FAI_FLAGS: verbose sshd createvt
+Monitoring to server faiserver enabled.
+FAI_CONFIG_SRC is set to nfs://faiserver/srv/fai/config
+Configuration space faiserver:/srv/fai/config mounted to /var/lib/fai/config
+Source hook: setup.DEFAULT.sh
+setup.DEFAULT.sh     OK.
+Calling task_setup
+FAI_FLAGS: verbose sshd createvt
+Press ctrl-c to interrupt FAI and to get a shell
+Starting FAI execution - 20240117_194012
+Calling task_defclass
+fai-class: Defining classes.
+Executing /var/lib/fai/config/class/01-classes.
+01-classes           OK.
+Executing /var/lib/fai/config/class/10-base-classes.
+10-base-classes      OK.
+Executing /var/lib/fai/config/class/20-hwdetect.sh.
+ens3             UP             52:54:00:11:23:01 <BROADCAST,MULTICAST,UP,LOWER_UP>
+ens3             UP             192.168.33.101/24 fe80::5054:ff:fe11:2301/64
+New disklist: vda
+20-hwdetect.sh       OK.
+Executing /var/lib/fai/config/class/40-parse-profiles.sh.
+40-parse-profiles.sh OK.
+Executing /var/lib/fai/config/class/41-warning.sh.
+41-warning.sh        OK.
+Executing /var/lib/fai/config/class/50-host-classes.
+50-host-classes      OK.
+Executing /var/lib/fai/config/class/60-misc.
+60-misc              OK.
+Executing /var/lib/fai/config/class/85-efi-classes.
+85-efi-classes       OK.
+List of all classes:  DEFAULT LINUX AMD64 DHCPC FAIBASE DEBIAN DEMO GRUB_PC demohost2 LAST
+
+

You can also see the list of FAI classes, that are defined for this +host. This list is very important for the rest of the installation.

+

The first task is called confdir, which is responsible for getting +access to the config space. Here, we use an NFS mount from the install +server as you can see on the console (and later in the logs).

+
+
+
FAI_CONFIG_SRC is set to nfs://faiserver/srv/fai/config
+Configuration space faiserver:/srv/fai/config mounted to /var/lib/fai/config
+
+

Before the installation is started ($FAI_ACTION=install) the computer +beeps three times. So, be careful when you hear three beeps but you do +not want to perform an installation and let FAI erase all yout data on +the local disk!

+
+
+

Rebooting the computer into the new system

+

For rebooting the computer during or at the end of the installation you +should use the command faireboot in favour of the normal reboot command. +Use faireboot also if logged in from remote. If the installation +hasn’t finished, use faireboot -s, so the log files are also copied +to the install server.

+

If the installation has finished successfully, the computer should boot a +small Debian system. You can login as user demo or root with password fai.

+
+
+

Starting FAI (task confdir)

+

After the install client has booted only the script /usr/sbin/fai is +executed. It will do some minimal initialization. The variable +$FAI_CONFIG_SRC
[It is defined on the kernel command line]
+is used to get access to the FAI configuration space which is then +available in the directory $FAI
[/var/lib/fai/config]
. FAI +will not proceed without the config space.

+

You can access the config space using different methods. Supported +methods are: nfs:, file:, cvs:, svn: git:, hg:, http: and detect:. +See fai.conf(5) for a detailed description of these methods.

+
+
+

Defining classes and variables (tasks defclass and defvar)

+

The command fai-class(1) executes scripts in $FAI/class for defining +classes. If the scripts write a string to stdout, this will be defined +as a class. Read all the details in the man page of fai-class(1).

+

After defining the classes, every file matching .var with a prefix +which matches a defined class is sourced to define variables. It must +contain valid shell code.

+
+
+

Partitioning local disks, creating file systems (task partition)

+

For the disk partitioning exactly one disk configuration file from +$FAI/disk_config is selected using classes.

+

The format of the disk configuration is similar to a fstab file.

+

The partitioning tool setup-storage(8) performs all commands +necessary for creating the disk partition layout, software RAID, LVM +and for creating the file systems. Disks and partitions may easily be +referenced by disk1.1, disk2.4 etc. Read the manual page of +setup-storage(8) for a detailed description and some examples of the +format.

+
+
+

Debconf preseeding (task debconf)

+

Files in $FAI/debconf are used for the usual debconf(7) preseeding +if the file names match a class name.

+
+
+

Installing software packages (task instsoft)

+

The command install_packages(8) reads the config files from +$FAI/package_config in a class based manner and installs software +packages on the new file system.

+

It installs the packages using apt-get(8), aptitude(1), yum or other +package tools without any manual interaction needed. Package +dependecies are also resolved by the package tools.

+

The format of the configuration files is described in [packageconfig].

+

Additionaly FAI will install packages (.deb or .rpm') from the +directories $FAI/pkgs/<CLASSNAME>.

+
+
+

Site specific customization (task configure)

+

Often the default configurations of the software packages will not +meet your site-specific needs. You can call arbitrary scripts which +adjust the system configuration. Therefore the command +fai-do-scripts(1) executes scripts in $FAI/scripts in a class +based manner. It is possible to have several scripts of different +types (shell, cfengine, …) to be executed for one class.

+

The default set of scripts in $FAI/scripts include examples for +installing Debian and Rocky Linux machines. They set the root password, add +a user account (set by '$username, default to demo), set the timezone, configure the network for DHCP +or using a fixed IP address, setup grub and more. +They should do a reasonable job for your installation. You can edit +them or add new scripts to match your local needs.

+

More information about these scripts are described in [cscripts].

+
+
+

Saving log files (task savelog)

+

When all tasks are finished, the log files are written to +/var/log/fai/$HOSTNAME/install/ +
[/var/log/fai/localhost/install/ is a link to this +directory.]
on the new system and to the account on the install server +if $LOGUSER is defined (you have to enable this in +/srv/fai/config/class/FAIBASE.var). It is also possible to specify +another host as log saving destination through the variable +$LOGSERVER. If $LOGSERVER is not defined, FAI uses the variable +$SERVER which is only defined during an initial installation (by +get-boot-info).

+

Additionally, two symlinks will be created to indicated the last +directory written to. The symlink last points to the log directory +of the last FAI action performed. The symlinks last-install and +last-sysinfo point to the directory of the last corresponding +action. By default log files will be copied to the log +server using scp. You can use the variable $FAI_LOGPROTO in file +fai.conf(5) to choose another method for saving logs to the remote +server. Here’s an example of the symlink structure:

+
+
+
lrwxrwxrwx   1 fai fai   23 Dec  2  2013 last-sysinfo -> sysinfo-20131202_161237
+drwxr-xr-x   2 fai fai 4096 Dec  2  2013 sysinfo-20131202_161237
+drwxr-xr-x   2 fai fai 4096 Feb 14  2014 install-20140214_142150
+drwxr-xr-x   2 fai fai 4096 Dec  2 11:47 install-20141202_113918
+lrwxrwxrwx   1 fai fai   23 Dec  4 13:22 last-install -> install-20141204_131351
+lrwxrwxrwx   1 fai fai   23 Dec  4 13:22 last -> install-20141204_131351
+drwxr-xr-x   2 fai fai 4096 Dec  4 13:22 install-20141204_131351
+
+

Examples of the log files can be found at https://fai-project.org/logs.

+
+
+

Reboot the new installed system

+

Before rebooting, the install client calls fai-chboot -d <hostname> +on the install server, to disable its own PXELINUX +configuration. Otherwise, it would restart the installation during the +next boot. Normally this should boot the new installed system from +its second boot device, the local hard disk.

+

At the end, the system is automatically rebooted if "reboot" was added to +$FAI_FLAGS.

+
+
+
+
+

Advanced FAI topics

+
+
+

Checking parameters received from DHCP servers

+

If the install client boots you can check +if all information from the DHCP daemon are received +correctly. The received information is written to +/tmp/fai/boot.log. An example of the result of a DHCP request can be +found in the sample log files.

+
+
+

Monitoring multiple client installations

+

You can monitor the installation of all install clients with the +command fai-monitor(8). All clients check if this daemon is running +on the install server (or the machine defined by the variable +$monserver). Each time a task starts or ends, a message is sent. The +FAI monitor daemon prints this messages to standard output. There’s +also a graphical frontend available, called fai-monitor-gui(1).

+
+
+
$  fai-monitor | fai-monitor-gui - &
+
+
+
+

Collecting Ethernet addresses for multiple hosts

+

You have to collect all Ethernet (MAC) addresses of the install +clients and assign a host name and IP address to each client. To +collect the MAC addresses, boot your install clients. +You can already do this before any DHCP daemon is running in your +subnet. They will fail to boot (because of the missing DHCP or missing TFTP), +but you can still collect the MAC addresses.

+

While the install clients are booting, they send broadcast packets to the +LAN. You can log the MAC addresses of these hosts by running the +following command simultaneously on the server:

+
+
+
faiserver# tcpdump -qtel broadcast and port bootpc >/tmp/mac.list
+
+

After the hosts have been sent some broadcast packets abort tcpdump +by typing ctrl-c. You get a list of all +unique MAC addresses with these commands:

+
+
+
faiserver$ perl -ane 'print "\U$F[0]\n"' /tmp/mac.list|sort|uniq
+
+

After that, you only have to assign these MAC addresses to host names +and IP addresses (/etc/ethers and /etc/hosts or corresponding NIS +maps). With this information you can configure your DHCP +daemon (see the section [bootdhcp]).
[I recommend to write the MAC +addresses (last three bytes will suffice if you have network cards +from the same vendor) and the host name in the front of each chassis.]

+
+

Debugging the network traffic

+

If the client can’t successfully boot from the network card, use +tcpdump(8) to look for Ethernet packets between the install server +and the client. Search also for entries in several log files made by +tftpd(8) and dhcpd(8) :

+
+
+
faiserver$ egrep "tftpd|dhcpd" /var/log/*
+
+
+
+
+

Details of PXE booting

+

Here we describe the details of PXE booting, which are only needed if +you have problems when booting your install clients.

+

Almost all modern bootable network cards support the PXE boot environment. +PXE is the Preboot Execution Environment. +This requires the PXELINUX bootloader and a special version of the TFTP +daemon, which is available in the Debian packages pxelinux and +tftpd-hpa. PXE booting also needs a DHCP server, so that the network +card can configure its IP parameters. This is the sequence of a PXE boot:

+
    +
  • +

    +Network card of the client sends its MAC address +

    +
  • +
  • +

    +DHCP server replies with IP configuration for the client +

    +
  • +
  • +

    +Network card configures IP +

    +
  • +
  • +

    +Install client gets the pxelinux.0 binary via TFTP +

    +
  • +
  • +

    +Get the pxelinux.cfg/C0A8210C configuration file via TFTP +

    +
  • +
  • +

    +C0A8210C is the IP address of the client in hexadecimal +

    +
  • +
  • +

    +This configuration contains kernel, initrd and additional kernel +command line parameters, which was created by fai-chboot. +

    +
  • +
  • +

    +Get the kernel and initrd via TFTP. +

    +
  • +
+

Example of a pxelinux.cfg file:

+
+
+
default fai-generated
+
+label fai-generated
+kernel vmlinuz-6.1.0-17-amd64
+append initrd=initrd.img-6.1.0-17-amd64 ip=dhcp root=/srv/fai/nfsroot rootovl FAI_FLAGS=verbose,sshd,createvt FAI_CONFIG_SRC=nfs://faiserver/srv/fai/config FAI_ACTION=install
+
+

See /usr/share/doc/syslinux/pxelinux.doc for more detailed +information about PXELINUX. FAI uses the lpxelinux.0 binary which also +supports loading the kernel and initrd via FTP or HTTP. The command +fai-chboot(8) supports this with the option -U.

+
+
+

Customizing your install server setup

+
    +
  • +

    +local/faster package mirror +

    +
  • +
  • +

    +different loguser +

    +
  • +
  • +

    +local root pw inside nfsroot +

    +
  • +
+

The configuration for the FAI package (not the configuration data for +the install clients) is defined in fai.conf(5). Definitions that are +only used for creating the nfsroot are located in +nfsroot.conf(5). Check these important variables in nfsroot.conf +before calling fai-setup or fai-make-nfsroot.

+
+
+FAI_DEBOOTSTRAP +
+
+

+Building the nfsroot uses the command debootstrap(8). It needs the location of a Debian mirror and the +name of the distribution (like bullsseye, bookworm, sid) for which the basic Debian +system should be built. Do not use different distributions here and in +/etc/fai/apt/sources.list. This will create a broken nfsroot. +

+
+
+NFSROOT_ETC_HOSTS +
+
+

+This variable is only needed if the clients do not have access to a DNS server. +This multiline variable is added to /etc/hosts inside the +nfsroot. Then the install clients can access those hosts by name +without using DNS. +

+
+
+

The content of /etc/fai/apt/sources.list is +used by the install server and also by the clients. If your install +server has multiple network cards and different host names for each +card (as for a Beowulf server), use the install server name which is +known by the install clients.

+

If you have problems running fai-setup, they usually stem from +fai-make-nfsroot(8) which is called by former command. Adding -v +gives you a more verbose output which helps you pinpoint the +error. The output is written to +/var/log/fai/fai-make-nfsroot.log.
[For debugging purpose +it may help to enter the chroot environment manually using this +command. faiserver# chroot /srv/fai/nfsroot bash]

+

The setup also creates the account fai (defined by $LOGUSER) if +not already available. So you can add a user before calling +fai-setup(8) using the command adduser(8) and use this as your +local account for saving log files. The log files of all install +clients are saved to the home directory of this account. You should +change the primary group of this +account, so this account has write permissions to /srv/tftp/fai in +order to call fai-chboot for creating the PXE configuration for the hosts.

+

When you make changes to fai.conf, nfsroot.conf the +nfsroot has to be rebuilt by calling fai-make-nfsroot(8). If you +only like to install a new kernel package to the nfsroot add the flags -k or +-K to fai-make-nfsroot. This will not recreate your nfsroot, but +only updates your kernel and kernel modules inside the nfsroot or add +additional packages into the nfsroot.

+
+
+

Creating a FAI CD or and USB stick

+

You can easily create an installation CD (or USB stick) of your +network installation setup. This will perform the same installation +and configuration from CD without the need of the install server. +Therefore you need to create a partial mirror of all Debian packages +needed for your FAI classes (using fai-mirror(1)). Then the command +fai-cd(8) will put this mirror, the nfsroot and the config space +onto a bootable CD. That’s it!

+

To easily create the installation CD, you can use the following command +(for more tuning details see fai-cd(8)):

+
+
+
 faiserver# fai-cd -m <partialMirrorDir> fai-cd.iso
+
+

This installation CD contains all data needed for the +installation. The command fai-cd(8) puts the nfsroot, the +configuration space and a subset of the Debian mirror onto a +CD-ROM. A partial package mirror is created using the command +fai-mirror(1) which contains all packages that are used by the +classes used in your configuration space. A sample ISO image is +available at https://fai-project.org/fai-cd.

+

Using the command dd(1) you can also create a bootable USB +stick by just writing the content of the ISO file to your USB stick +(here the stick is /dev/sdf).

+
+
+
 faiserver# dd if=fai-cd.iso of=/dev/sdf bs=1M
+
+

mk-data-partition is a tool that extends an ISO (that will be copied +to an USB stick) or an USB stick containing an ISO with +an ext4 or exFAT partition and sets the file system label to MY-DATA. +This partition is automatically mounted to /media/data by FAI. +You can copy your own .deb packages into this data partition und the +subdiretories pkgs/<CLASSNAME>. FAI will then install these packages +if the equivalent class is defined.

+

Example how to use mk-data-partition:

+
+
+
# mk-data-partition -s 1G -c faicd-large.iso A B
+
+

The former command creates the data partition of size 1 Gbytes inside +the ISO file and copy directories A and B to it. You can then copy the modified ISO +onto an USB stick.

+

If the ISO is already on the USB stick and if it’s available as +dev/sdf, you can add a data partition of type exFAT will will use +the whole remaining part of the USB stick by using this command:

+
+
+
# mk-data-partition -F /dev/sdf
+
+
+
+

Creating VM disk images using FAI

+

The command fai-diskimage(8) creates disk +images, which can be used with a virtual machine like KVM, VMware, +VirtualBox or a cloud service like OpenStack, GCE, EC2 and others. The +installation process performs the normal FAI tasks on a raw disk +image. After the installation you can boot the disk image and have a +running system. The disk image can also be converted to qcow2 format. +You do not need to setup the FAI nfsroot when only using +fai-diskimage. But you need a basefile in your configuration +space. Setting the variable $FAI_BASEFILEURL will automatically +download an appropriate base file into your config space.

+

Here’s an example how to create a raw disk image for a host called +cloud3, with a small set of software packages:

+
+
+
# export FAI_BASEFILEURL=https://fai-project.org/download/basefiles/
+# fai-diskimage -vu cloud3 -S2G -cDEBIAN,BOOKWORM64,AMD64,FAIBASE,GRUB_PC,DHCPC,DEMO,CLOUD,LAST disk.raw
+
+

This command will create a disk image called ubuntu.qcow2 for a Ubuntu 16.04 desktop +with hostname set to foobar.

+
+
+
# export FAI_BASEFILEURL=https://fai-project.org/download/basefiles/
+# cl=DHCPC,UBUNTU,JAMMY,JAMMY64,AMD64,XORG,LAST
+# fai-diskimage -Nvu foobar -S5G -c$cl ubuntu.qcow2
+
+

You can give disk images a try without installing FAI, if you visit +https://fai-project.org/FAIme/cloud

+
+
+

Creating a bootable live image

+

Creating a bootable live ISO is easy with FAI. You only need two +steps. First, create your live environment using the command fai +dirinstall. Don’t forget to add the class LIVEISO. +Then create the live ISO using fai-cd:

+
+
+
# cl="DEBIAN,BOOKWORM64,AMD64,FAIBASE,XFCE,XORG,DHCPC,DEMO,LIVEISO,LAST"
+# LC_ALL=C fai -v dirinstall -u xfce33 -c $cl \
+    -s file:///srv/fai/config /srv/xfce
+# fai-cd -s500 -MH -d none -g /etc/fai/grub.cfg.live \
+    -n /srv/xfce live.iso
+
+

The nfsroot is not needed for a live ISO. +Currently there’s no live ISO of the install server available.

+
+
+

Building cross-architecture disk images

+

Starting FAI 5.4 it’s now possible to build a disk image for +different architectures than the host is running. For example you can +build an image for 64-bit ARM architecture (aarch64) on a host running on amd64 +architecture. Here are the steps do to:

+
+
+
# apt install qemu-system-arm qemu-user-static fai-server fai-setup-storage fai-doc qemu-utils
+# fai-mk-configspace
+
+# export FAI_BASEFILEURL=https://fai-project.org/download/basefiles/
+# fai-diskimage -vu armhost -S2G -cDEFAULT,DHCPC,DEBIAN,ARM64,BUSTER_ARM64,FAIBASE,DEMO,CLOUD,LAST arm64.raw
+# chown your_user_id arm64.raw
+# cp /var/log/fai/armhost/last/vmlinuz* vmlinuz
+# cp /var/log/fai/armhost/last/initrd.img* initrd
+
+

Then you can run qemu as a normal user:

+
+
+
> qemu-system-aarch64 -m 1000 -M virt,gic_version=3 -cpu cortex-a57 -drive file=arm64.raw,if=virtio,index=1 -no-reboot -nographic -name ARM64 -net nic,name=eth0,model=virtio -net user,name=eth0,-kernel vmlinuz -initrd initrd -append "console=ttyAMA0 rw ip=dhcp root=/dev/vda1 net.ifnames=0"
+
+

This works similar for other architectures. +Keep in mind, that qemu network setup will have poor performance if +not using the virtio driver as above or tap devices.

+

You can find the base files for many architectures at +https://fai-project.org/download/basefiles/, or use mk-basefile to +create your own.

+
+
+

FAI rescue system

+

If you set the variable $FAI_ACTION to sysinfo (for e.g. by using +fai-chboot -S), the client will not install a new system, but will +collect a lot of system information. +If you set $FAI_ACTION to inventory you will only get a few +hardware information. +Both actions can be used for FAI as a rescue system.

+

Type ctrl-c to get a shell or use Alt-F2 or Alt-F3 and you will get +another console terminal, if you have added createvt to $FAI_FLAGS.

+

You now have a running Linux system on the install client without +using the local hard disk. Use this as a rescue system if your local +disk is damaged or the computer can’t boot properly from hard +disk. You will get a shell and you can execute various commands +(dmesg, lsmod, df, lspci, …). Look at the log file in +/tmp/fai. There you can find much information about the boot +process.

+

FAI mounts all file systems it finds on the local disks read only. It +also tells you on which partition a file /etc/fstab exists. When +only one file system table is found, the partitions are mounted +according to this information. Here’s an example:

+
+
+
demohost:~# df -h
+
+Filesystem                Size  Used Avail Use% Mounted on
+devtmpfs                  4.0M     0  4.0M   0% /dev
+tmpfs                     2.0G     0  2.0G   0% /dev/shm
+tmpfs                     783M   18M  766M   3% /run
+tmpfs                     5.0M     0  5.0M   0% /run/lock
+LiveOS_rootfs             783M   18M  766M   3% /
+192.168.33.250:/srv/fai/config   59G   23G   24G  49% /var/lib/fai/config
+/dev/mapper/vg1-root      7.3G  1.8G  5.2G  26% /target
+/dev/vda1                 459M   53M  378M  13% /target/boot
+/dev/mapper/vg1-home      1.4G   72K  1.3G   1% /target/home
+
+

This method can be used as a rescue environment! If you need a file +system with read-write access use the rwmount command:

+
+
+
demohost# rwmount /target/home
+
+
+
+

FAI without NFS

+

To boot into FAI and begin the installation sequence +without using the NFS protocol, you boot the client machine using PXE as +usual and then retrieve an image containing the nfsroot via http.

+

To create an image, use fai-cd’s -S argument and -M to avoid setting up +a partial mirror within the image.

+
+
+
faiserver# fai-cd -M -S squash.img
+
+

Move this image to a directory from which it can be requested via http +(usually a directory served by the webserver)

+

To now request the squashfs image, add the following to your kernel +command line, e.g. in your pxelinux configuration file for the client +with fai-chboot.

+
+
+
root=live:http://faiserver/cskoeln/squash.img FAI_CONFIG_SRC=file:///var/lib/fai/config
+
+

Replace faiserver with the domain name or IP of the machine your +squash image is served from.

+
+
+

Installing other distributions using a Debian nfsroot

+

You can install all sorts of Linux distributions from a single Debian +nfsroot. Therefore you have to create a base.tar.xz of the distribution +you like to install and place it into the basefiles directory. Then +name it UBUNTU2204.tar.xz for example. An install client which belongs +to the class UBUNTU2204 then extracts this base file into its empty +file system. Additionally you have to adjust the sources.list or +similar configuration files which are needed for specifying the +location of the package repository.

+

The tool rinse(8) is used for creating base files for distribution +like Rocky Linux, CentOS, openSUSE or Fedora. +Some basefiles can be downloaded from +https://fai-project.org/download/basefiles/.

+

The script mk-basefile in +/usr/share/doc/fai-doc/examples/simple/basefiles/ helps creating +this base files.

+
+
+

Creating chroot and virtualization environments

+

If you have to create some chroot environments, or a virtualization +environment where you neither can nor want to run a normal Debian +Installer in to get to a working system (for example, Xen guest +domains), there is the FAI action dirinstall. +By calling

+
+
+
faiserver# fai <options> dirinstall <target-directory>
+
+

and using either the option -c <classes> or -N you get a FAI +installation, without the partitioning action, right into the target +directory. The host name for the target installation can be specified +using -u <host-name>

+

This, for example, can be used to combine FAI with the tool +xen-tools, which helps you to build Xen guest domains. xen-tools +are very nice for generating configuration files and block devices for +new guests based on simple commands and/or configuration files, but +they can only assign one role per installation for customization. +FAI-users need and want more, as they are used to have the class +system. They get them even in xen-tools installations, by using the +following code as a xen-tools role script:

+
+
+
#!/bin/sh
+TARGET=$1
+CMD="fai -N  -v -u ${hostname} dirinstall $TARGET"
+echo running $CMD
+$CMD
+
+

Then, you should set the variable install=0 in the config of +xen-tools for that host.

+
+
+

Using FAI for updates

+

FAI can also do updates of already running systems, without a +re-installation from scratch. +This is called softupdate. A FAI softupdate skips the tasks which are +not suitable for updating a running system, like partitioning the +hard disks and creating file systems. Instead, it only executes the +tasks for updating and installing software packages and calling the +customization scripts.

+

To run a softupdate call:

+
+
+
# fai -v -s nfs://faiserver/srv/fai/config softupdate
+
+

By default, a softupdate uses the list of classes defined during the +initial installation. Make sure to set the variable $LOGSERVER (done +in a class/*.var file) if FAI should save the log files to a remote +machine.

+

It’s up to you, how to start a softupdate on a bigger number of hosts. +You may do the softupdate on a regular basis via cron or you can use tools +like clusterssh(1) to start a softupdate via a push on a list of +hosts.

+

Keep in mind, that the customization scripts are run every time you do +a softupdate. That means, they have to be idempotent i.e. the result +of their operation should always produce the same result, even when +they run more than once.

+

For example appending a line to a file must not done via this code:

+
+
+
$ echo "some strings" >> /etc/fstab
+
+

Instead use the command ainsl(1) in a shell script or use cfengine’s +function AppendIfNoSuchLine.

+

All commands in the customization script must be capable of modifying +the target file system wether it’s available in /target during the +initial installation or wether it’s the normal file system relative to +/ during softupdate.

+

Here are some variable that help writing these scripts:

+
+
+$target +
+
+

+Points to the root directory of the client, which +is /target during installation and / during a softupdate. +

+
+
+$FAI_ROOT +
+
+

+It’s the same value as $target. For historic reasons +we have both these variables in FAI. +

+
+
+$ROOTCMD +
+
+

+In case of the installation this is an alias for chroot $target in case of +softupdate it’s just empty. You can prepend this to commands if you need to run a +command inside the clients target file system via chroot. +

+
+
+$FAI_ACTION +
+
+

+If you need to call code depending on the FAI action performed, you +can use this variable. It contains the currently executed action: +install, softupdate, dirinstall, sysinfo, inventory or your +own defined action. +

+
+
+
+
+

How to install 32-bit OS from a 64-bit OS

+

To install a computer with a 32-bit OS, you need an i386 nfsroot. +Creating this 32-bit nfsroot on an install server running amd64 is +quite simple. Install and set up the FAI packages. Then copy your FAI +config files to a new subdirectory.

+
+
+
faiserver# cp -a /etc/fai /etc/fai-i386
+
+

Edit the variable $FAI_DEBOOTSTRAP_OPTS in +/etc/fai-i386/nfsroot.conf and add the option --arch +i386. Also choose a different directory for your new nfsroot. Here +are the two lines after editing.

+
+
+
NFSROOT=/srv/fai/nfsroot-i386
+FAI_DEBOOTSTRAP_OPTS="--arch i386 --exclude=info --include=aptitude""
+
+

Now call fai-make-nfsroot which creates the 32-bit nfsroot in +/srv/fai/nfsroot-i386

+
+
+
faiserver# fai-make-nfsroot -v -C/etc/fai-i386
+
+

Creating a partial mirror using fai-mirror(1) that is needed for +a bootable CD or USB stick is also possible on a different architecture. +You have to specify the architecture when calling fai-mirror.

+
+
+
$ fai-mirror -m800 -B -a i386 -v -cDEFAULT,DEBIAN,FAIBASE,I386 /srv/mirror-i386
+
+

That’s all!

+
+
+

Aborting the installation when an error occurs

+

Every task and hook can call the function task_error +to send an error value to the installation. This error will appear in +the log file and can be shown in the fai-monitor-gui(1). +The error value is also checked against the variable $STOP_ON_ERROR +which is set to 700 by default. If the error value +is greater than $STOP_ON_ERROR the installation will stop +immediately. In a hook, just add a call like this:

+
+
+
task_error <value>
+
+

It is comfortable to call task_error with $? as second parameter, for +e.g. if you want to set an error value of 123 use this

+
+
+
<some command>
+task_error 123 $?
+
+

Then the task error is only set if the preceding command failed with +some error. The same syntax can be used by the scripts in the class +subdirectory ending in .sh.

+

A special case are scripts inside the class/ subdirectory that does +not end in .sh. In those scripts you have to call task_error with 1 as +third parameter. As an example you can use those two variants for +setting the value to 123

+
+
+
task_error 123 $? 1
+
+

or

+
+
+
task_error 123 1 1
+
+

The latter command always sets the task error to 123 regardless of +the value of $?. If the error value is greater than $STOP_ON_ERROR, +the installation will abort immediately.

+

The error values are grouped into four categories

+
+
+
normal or info messages:       1xx, 2xx
+warnings:                      3xx, 4xx
+minor errors:                  5xx, 6xx
+errors:                        7xx, 8xx
+
+

The fai-monitor-gui has 4 different icons for these error categories.

+
+
+
+
+

Various hints and details

+
+
+

The list of tasks

+

Most tasks of the installation are defined as subroutines which are +defined in /usr/lib/fai/subroutines (e.g. task_instsoft). +Some are external shell scripts located in /usr/lib/fai/. +They are called via a superior subroutine called task. +This subroutine calls hooks if available and then calls the task (defined as +task_<name>). A task and its hooks can be +skipped on demand by using the command skiptask().

+

Now follows the description of all tasks, listed in the order +they are executed.

+
+
+confdir +
+
+

+The kernel appended parameters may define variables, the syslog daemon is +started. Network parameters are fetched from a DHCP +server and are stored in boot.log. The DNS resolver configuration file is created. +

+

The location of the configuration space is defined by the variable +$FAI_CONFIG_SRC.

+

After that, the file $FAI/hooks/subroutines is sourced if it +exists. Using this file, you can define your own subroutines or +override the definition of FAI’s subroutines.

+
+
+setup +
+
+

+This task sets the system time, all $FAI_FLAGS are defined and two +additional virtual terminals are opened on demand. A secure shell +daemon is started on demand for remote logins. +

+
+
+defclass +
+
+

+Calls fai-class(1) to define classes using scripts and files in +$FAI/class and classes from /tmp/fai/additional-classes and the +variable $ADDCLASSES. The list of all defined classes is stored in +the variable $classes and saved to /tmp/fai/FAI_CLASSES. +

+
+
+defvar +
+
+

+Sources all files $FAI/class/*.var for every defined class. If a +hook has written some variable definitions to the file +$LOGDIR/additional.var, this file is also sourced. +

+
+
+action +
+
+

+Depending on the value of $FAI_ACTION this subroutine decides which +action FAI should perform. The default available actions are: +sysinfo, install, inventory, dirinstall and softupdate. If $FAI_ACTION has another +value, a user defined action is called if a file +$FAI/hooks/$FAI_ACTION exists. So you can easily define your own +actions. +

+
+
+sysinfo +
+
+

+Called when no installation is performed but the action is +sysinfo. It shows information about the detected hardware and mounts +the local hard disks read only to /target/partitionname or with +regard to a fstab file found inside a partition. Log files are +stored to the install server. +

+
+
+inventory +
+
+

+A short list of system information is printed. +

+
+
+install +
+
+

+This task controls the installation sequence. You will hear three +beeps before the installation starts. The major work is to call other +tasks and to save the output to /tmp/fai/fai.log. If you have any +problems during installation, look at all files in /tmp/fai/. You +can find examples of the log files +at https://fai-project.org/logs/. +

+
+
+dirinstall +
+
+

+Install into a directory, not onto a local disk. Use this for creating +chroot environments. +

+
+
+softupdate +
+
+

+This task, executed inside a running system via the fai(8) command +line interface, performs a softupdate. See chapter [softupdate] for +details. +

+
+
+partition +
+
+

+Calls setup-storage(8) to partition the hard +disks and to create file systems. The task writes variable definitions +for the root and boot partition and device ($ROOT_PARTITION, +$BOOT_PARTITION, $BOOT_DEVICE) to /tmp/fai/disk_var.sh and creates +a fstab file for the new system. +

+
+
+mountdisks +
+
+

+Mounts the created partitions according to the created +/tmp/fai/fstab file relative to $FAI_ROOT. +

+
+
+extrbase +
+
+

+Extracts a minimal system after that a chroot can be made into it. By +default the base tar file /var/tmp/base.tar.xz will be +extracted. Also files matching a class name in $FAI/basefiles/ are used for unpacking a +different tar file depending on classes defined. This can be used for +installing different Linux distributions than the one used for +creating the nfsroot. The default file base.tar.xz is a snapshot of a +basic Debian system created by debootstrap(8). +This task uses the variable FAI_BASEFILEURL for fetching the base +file via FTP, HTTPS or HTTP if it’s defined. +

+
+
+debconf +
+
+

+Calls fai-debconf(1) to set the values for the debconf preseeding database. +

+
+
+repository +
+
+

+Prepare access to the package repository by preparing the apt +configuration. This can also add repository keys +in a class based manner from files like CLASSNAME.gpg +in the directory package_config. +

+
+
+updatebase +
+
+

+Updates the base packages of the new system and updates the list of +available packages. It also fakes some commands (called diversions) +inside the new installed system using dpkg-divert(8), so no daemons +will be started during the installation. +

+
+
+instsoft +
+
+

+Installs the desired software packages using class files in +$FAI/package_config/. +

+
+
+configure +
+
+

+Calls scripts in $FAI/scripts/ and its subdirectories for every +defined class. +

+
+
+tests +
+
+

+Calls test scripts in $FAI/tests/ and its subdirectories for every +defined class. +

+
+
+finish +
+
+

+Unmounts all file systems in the new installed system and removes +diversions of files using the command fai-divert. +

+
+
+chboot +
+
+

+Changes the PXE configuration for a host on the install server which +indicates which PXELINUX configuration to load on the next boot from network +card via TFTP. Therefore the fai-chboot(8) command is executed +remotely on the install server. +

+
+
+savelog +
+
+

+Saves log files to local disk and to the account $LOGUSER on +$LOGSERVER (defaults to the install server). +

+
+
+faiend +
+
+

+Wait for background jobs to finish (e.g. emacs compiling lisp files) +and automatically reboots the install clients or waits for manual +input before reboot. +

+
+
+
+
+

Automated tests

+

After the customization scripts are executed, FAI will execute some +tests if available. Using these test, you can check for errors of the +installation. Test scripts are called via +fai-do-scripts(1) and should append its messages to +$LOGDIR/test.log. A Perl module including some useful subroutines +can be found in Faitest.pm. A test can also define a new class for +executing another tests during next boot via the variable +$ADDCLASSES.

+
+
+

Autodiscover

+

In FAI 5.0 we released a feature that allows clients to search for the +faiserver in their respective subnetwork. This lifts the necessity of +having to collect every client’s MAC address and configuring the DHCP +daemon.

+

This is done by booting from a small FAI autodiscover bootmedium (CD, +USB, etc.), which can be created via the command:

+
+
+
faiserver# fai-cd -A autodiscover.iso
+
+

The image is roughly 25MB in size and scans the subnet for +a FAI server. By default it shows a menu with all profiles available +in the configuration space in the same manner as the menu flag +does. From this menu, you can select the installation type you wish to +perform.

+

For the clients to find the faiserver, the faiserver must run +fai-monitor.

+
+
+

Changing the boot device

+

Changing the boot sequence is normally done in the BIOS setup. But you +can’t change the BIOS from a running Linux system.

+

So, the boot sequence of the BIOS will remain unchanged and +your computer should always boot first from its network card and the +second boot device should be the local disk. Then you can +change the boot device of the client by creating different PXELINUX +configurations. This will define if an installation +should be performed, or if the client should to boot from local +disk. This is done using fai-chboot(8).

+
+
+

How to create a local Debian mirror

+

The utility mkdebmirror
[You can find the script in +/usr/share/doc/fai-doc/examples/utils/]
can be used for creating +your own local Debian mirror. This script uses debmirror(1). A partial Debian mirror for amd64 architecture for +Debian 11 and 12 (aka bullseye and bookworm) without the source packages needs about +180GB of disk space. +Accessing the mirror via HTTP will be the +default way in most cases. To see more output from the script call +mkdebmirror -v. A root account is not necessary to create and +maintain the Debian mirror.

+

To use HTTP access to the local Debian mirror, install a web server +and create a symlink to the local directory where your mirror is +located:

+
+
+
faiserver# apt-get install apache2
+faiserver# ln -s /files/scratch/debmirror /var/www/html/debmirror
+
+

Create a file sources.list(5) in /etc/fai/apt which gives access +to your Debian mirror. Also add the IP-address of the +HTTP server to the variable $NFSROOT_ETC_HOSTS in +nfsroot.conf if the install clients have no DNS resolving.

+
+
+

Small hints

+
    +
  • +

    +When using HTTP access to a Debian mirror, the local /var partition +on all install clients must be big enough to keep the downloaded +Debian packages. Do not try with less than 250 Mbytes unless you know +why. You can limit the number of packages installed at a time with the +variable $MAXPACKAGES. +

    +
  • +
  • +

    +You can remove the red logo on the install client by simply calling +reset once. If will also not appear if you create a file using this +command on the install server: +

    +
  • +
+
+
+
touch /srv/fai/nfsroot/.nocolorlogo
+
+
    +
  • +

    +A list of variables used by FAI can be found at +https://wiki.fai-project.org/index.php/Variables. +

    +
  • +
  • +

    +You can shorten some customization scripts by using one single fcopy +command fcopy -r /. +

    +
  • +
  • +

    +If you rebuild the nfsroot, you will create a new ssh host key inside +the nfsroot. Then logging in to an install client may fail, because +the host key changes. You can use this: +

    +
  • +
+
+
+
$ ssh -o StrictHostKeyChecking=no root@installclient
+
+
    +
  • +

    +You can also delete the host entry on your install client in your +~/.ssh/known_hosts file by using the ssh-keygen -R command. +

    +
  • +
  • +

    +In the tasks chboot and savelog, a connection using secure shell is +opened to the FAI server (see [isavelog]). To ensure that this works +non-interactively, a proper entry in NFSROOT/root/.ssh/known_hosts +must be created. When using fai-setup, this is done automatically, but +it may require manual editing in case the name of your FAI server was +not determined correctly. If you stumble over ssh connections that +require typing "yes" to accept the host key during installation, +please check the contents of your NFSROOT/root/.ssh/known_hosts file +

    +
  • +
  • +

    +A list of all local hard disks is +stored in $disklist. It’s defined after set_disk_info is called. +

    +
  • +
  • +

    +There are multiple functions for generating a customized disk +list. See fai-disk-info for an example. +

    +
      +
    • +

      +set_bootstick() +

      +
    • +
    • +

      +grepv_disks() +

      +
    • +
    • +

      +grep_disks() +

      +
    • +
    • +

      +notmatchdisks() +

      +
    • +
    • +

      +matchdisks() +

      +
    • +
    • +

      +smallestdisk() +

      +
    • +
    • +

      +largestdisk() +

      +
    • +
    • +

      +all_disks_by_size() +

      +
    • +
    • +

      +all_disks_and_size() +

      +
    • +
    • +

      +once_only() +

      +
    • +
    • +

      +checkdisk() +

      +
    • +
    • +

      +disks_by_id() +

      +
    • +
    +
  • +
  • +

    +Use fai-divert -a if a postinst script calls a configuration +program, e.g. the postinst script for package apache calls +apacheconfig, which needs manual input. You can fake the configuration +program so the installation can be fully automatic. +

    +
  • +
  • +

    +Sometimes the installation seems to stop, but often there’s only a +postinstall script of a software package that requires manual input +from the console. Change to another virtual terminal and look which +process is running with tools like top(1) and pstree(1). You can +add debug to FAI_FLAGS to make the installation process show all +output from the postinst scripts on the console and get its input also +from the console. +

    +
  • +
  • +

    +How can I define classes on the kernel command line? +

    +

    Read the man page of fai-class(8). If you like to define some +additional classes (for e.g. A,B,C) on the kernel command line add this: ADDCLASSES=A,B,C

    +
  • +
  • +

    +How to use a custom kernel inside the nfsroot? +

    +

    Build your customized kernel by building a kernel package using +make-kpkg(8) and use the option --initrd. Copy this Debian package +to a local repository and add it to /etc/fai/sources.list. Add the +name of your package to /etc/fai/NFSROOT. Then call

    +
    +
    +
    # fai-make-nfsroot -k
    +
    +
  • +
  • +

    +How to use the nfsroot as system for diskless clients? +

    + +
  • +
  • +

    +How to serve multiple nfsroot directories on one FAI server? +

    +

    If you want to serve multiple nfsroot directories, +you need to create specific config directories in /etc for FAI, like +/etc/fai-buster and /etc/fai-bookworm. Then you need to set the +$NFSROOT variables to different directories and run

    +
  • +
+
+
+
faiserver#fai-make-nfsroot -C /etc/fai-buster
+
+
+
+

flag_reboot (FAI_FLAGS)

+

If flag_reboot is set, by adding "reboot" to $FAI_FLAGS, your client +machine will reboot after the task faiend has finished. This is true +for network as well as bootmedium installations.

+
+
+

Log files

+

FAI is creating several log files. During installation they are stored +in /tmp/fai on the install client itself. At the end of the +installation they will be copied to the install server (see +[isavelog]). After the install client rebooted into his newly +installed system, you can find the FAI logs in /var/log/fai. +Log files are also created when doing the softupdate or dirinstall +action.

+

On the faiserver, you can find the (remote) log files under the ~fai +directory.

+

Sample log files from successfully installed computers are +available on https://fai-project.org/logs. +These a some log files which are created by FAI.

+
+
+FAI_CLASSES +
+
+

+Contains a list of all classes defined. +

+
+
+dmesg.log +
+
+

+Output of the dmesg command. Contains useful messages of the kernel +ring buffer. +

+
+
+fai.log +
+
+

+The main log file. Contains all important information. You should +always read this file. +

+
+
+boot.log +
+
+

+A list of variables of network parameters, mostly defined by the DHCP daemon. +

+
+
+format.log +
+
+

+Output of the partition tool setup-storage(8). +

+
+
+scripts.log +
+
+

+Output of all scripts, that are used for customization. +

+
+
+variables.log +
+
+

+A list of all shell variables which are available during an +installation. +

+
+
+error.log +
+
+

+A summary of possible errors in all log files. +

+
+
+disk_var.sh +
+
+

+A list of variables that contain information about devices and +partitions to boot from, the root partition and a list of swap +devices. These information is used by some customization scripts +(e.g. GRUB_PC/10-setup). +

+
+
+

If the installation process finishes, the hook savelog.LAST.sh +searches all log files for common errors and writes them to the file +error.log. So, you should first look into this file for errors. Also +the file status.log give you the exit code of the last command +executed in a script. To be sure, you should look for more details in +all log files.

+
+
+

How to use HTTP for PXE boot

+

fai-make-nfsroot now uses the lpxelinux.0 binary which already +supports transfer of the kernel and initrd via http (additional to tftp). +You only have to enable HTTP access to the tftp directory:

+
+
+
cd /var/www/html
+ln -s /srv/tftp/fai
+
+

Add -U URL to the fai-chboot call. For example:

+
+
+
fai-chboot -U http://faiserver/fai -IFv .......
+
+
+
+
+
+

Troubleshooting

+
+
+

Boot errors

+

The following error message indicates that your install client doesn’t +get an answer from a DHCP server. Check your cables or start the +dhcpd(8) daemon with the debug flag enabled.

+
+
+
+
+
PXE-E51: No DHCP or BOOTP offers received
+Network boot aborted
+
+
+
+
+

If you do not see the following message, the install kernel could not +detect your network card, for example because of a missing driver:

+
+
+
Starting dhcp for interface eth0
+dhcp: PREINIT eth0 up
+dhcp: BOND setting eth
+
+

Check the initrd in the nfsroot (lsinird) if the kernel driver of your network +card is included there and check if you like to add the package +firmware-linux-nonfree in /etc/fai/NFSROOT and rebuild the initrd +by calling fai-make-nfsroot -k. +You may also add a driver to /srv/fai/nfsroot/etc/dracut.conf in +the line add_drivers+=.

+

This is the error message you will see, when your network card is +working, but the install server does not export the nfsroot +directory to the install clients, This is often caused by missing +NFS permissions on the server side.

+
+
+
Starting dhcp for interface eth0
+dhcp: PREINIT eth0 up
+dhcp: BOND setting eth
+mount.nfs: access denied by server while mounting 192.168.33.250:/srv/fai/nfsroot
+.
+.
+dracut Warning: Could not boot
+.
+Dropping to debug shell
+dracut:/#
+
+

Now, you are inside the emergency shell of the initrd which was created +by dracut(8). You will get a shell prompt, and can look at the log files. +For more information about debugging the early boot process using +dracut see dracut.cmdline(7)

+

Use the following command on the install server to see which directories are exported +from the install server (named faiserver):

+
+
+
$ showmount -e faiserver
+
+
+
+
+
+

+ + + diff --git a/doc/fai-guide_fr.pdf b/doc/fai-guide_fr.pdf new file mode 100644 index 0000000000000000000000000000000000000000..ff30e31ef9d408b93515018c6dc272b5be69febd GIT binary patch literal 286965 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

d*JhoD?VK&;lH4%Nz6OAD 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 z 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

Men&Z)>O%{D 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 YT|J$F4@|7wY#i)7a1<00N|JE@4@tnsF8}}l literal 0 HcmV?d00001 diff --git a/doc/fai-guide_fr.text b/doc/fai-guide_fr.text new file mode 100644 index 000000000..38ebe3d67 --- /dev/null +++ b/doc/fai-guide_fr.text @@ -0,0 +1,2829 @@ + +--------------------------------------------------------------------- + +FAI Guide (Fully Automatic Installation) + +--------------------------------------------------------------------- + +Thomas Lange + + + +Revision History +Revision 6.4 Mer. 10 Avr 2025 TL + +--------------------------------------------------------------------- + +Table of Contents + +1. Résumé +2. Introduction + 2.1. Disponibilité + 2.2. Motivation + 2.3. Comment fonctionne FAI + 2.4. Caractéristiques + 2.5. La durée d’installation +3. Quickstart - Pour l’utilisateur impatient + 3.1. Ma première installation + 3.2. Ma première installation à l’aide d’un serveur +4. Vue d’ensemble et Concepts + 4.1. Terminologie + 4.2. The class concept +5. Setup your faiserver + 5.1. Install the FAI packages + 5.2. Create the nfsroot + 5.3. Creating the configuration space + 5.4. Configure the network daemons + 5.5. Creating the PXELINUX configuration + 5.6. Custom server +6. Plan your installation + 6.1. The configuration space and its subdirectories + 6.2. Defining classes + 6.3. Defining variables + 6.4. Hard disk configuration + 6.5. Extract base file + 6.6. Debconf preseeding + 6.7. Access to the package repository + 6.8. Software package configuration + 6.9. Customization scripts + 6.10. Hooks + 6.11. FAI flags +7. FAI installs your plan + 7.1. The early part of an installation + 7.2. Boot messages + 7.3. Rebooting the computer into the new system + 7.4. Starting FAI (task confdir) + 7.5. Defining classes and variables (tasks defclass and defvar) + 7.6. Partitioning local disks, creating file systems (task + partition) + 7.7. Debconf preseeding (task debconf) + 7.8. Installing software packages (task instsoft) + 7.9. Site specific customization (task configure) + 7.10. Saving log files (task savelog) + 7.11. Reboot the new installed system +8. Advanced FAI topics + 8.1. Checking parameters received from DHCP servers + 8.2. Monitoring multiple client installations + 8.3. Collecting Ethernet addresses for multiple hosts + 8.4. Details of PXE booting + 8.5. Customizing your install server setup + 8.6. Creating a FAI CD or and USB stick + 8.7. Creating VM disk images using FAI + 8.8. Creating a bootable live image + 8.9. Building cross-architecture disk images + 8.10. FAI rescue system + 8.11. FAI without NFS + 8.12. Installing other distributions using a Debian nfsroot + 8.13. Creating chroot and virtualization environments + 8.14. Using FAI for updates + 8.15. How to install 32-bit OS from a 64-bit OS + 8.16. Aborting the installation when an error occurs +9. Various hints and details + 9.1. The list of tasks + 9.2. Automated tests + 9.3. Autodiscover + 9.4. Changing the boot device + 9.5. How to create a local Debian mirror + 9.6. Small hints + 9.7. flag_reboot (FAI_FLAGS) + 9.8. Log files + 9.9. How to use HTTP for PXE boot +10. Troubleshooting + 10.1. Boot errors + +Une version plus ancienne de ce guide en français est disponible à +https://fai-project.org/fai-guide-fr. + + +--------------------------------------------------------------------- + +1. Résumé + +--------------------------------------------------------------------- + +FAI est un système non-interactif pour installer, configurer et gérer +des systèmes Linux et les configurations de logiciels sur des +ordinateurs comme sur des machines virtuelles et des environnements +chroot, depuis des petits réseaux jusqu’à de grandes infrastructures +et de grands clusters. + +Ce manuel décrit le logiciel Fully Automatic Installation +(installation entièrement automatique). Cela inclut l’installation +des paquets, la configuration du serveur, la création de la +configuration et la gestion des erreurs. + +(c) 2000-2025 Thomas Lange + +Ce manuel est un logiciel libre; Vous pouvez le redistribuer et / ou +le modifier selon les termes de la Licence Publique Générale GNU +publiée par la Free Software Foundation; Soit la version 2, soit (à +votre choix) toute version ultérieure. + +Ceci est distribué dans l’espoir qu’il sera utile, mais sans aucune +garantie ; Sans même la garantie implicite de qualité marchande ou +d’adaptation à un usage particulier. Pour plus de détails, consultez +la License Générale Publique GNU. + +Une copie de la Licence Générale Publique GNU est disponible sous la +forme /usr/share/common-licenses/GPL dans la distribution Debian GNU/ +Linux ou sur le World Wide Web sur le site GNU Vous pouvez également +l’obtenir en écrivant à la Free Software Foundation , Inc., 59 Temple +Place - Suite 330, Boston, MA 02111-1307, États-Unis. + + +--------------------------------------------------------------------- + +2. Introduction + +--------------------------------------------------------------------- + + +2.1. Disponibilité + +-------------- + +Page d’accueil + https://fai-project.org +Wiki FAI + https://wiki.fai-project.org +Téléchargement + https://fai-project.org/download +Entrée pour sources.list + deb https://fai-project.org/download bookworm koeln +Pages de manuel + https://fai-project.org/doc/man/ +Listes de diffusion + https://lists.uni-koeln.de/mailman/listinfo/linux-fai +Retour d’information + Envoyez vos réflexions et vos commentaires à fai@fai-project.org + ou à la liste de diffusion. +Boguess + Utiliser le système de suivi des bogues Debian (BTS) https:// + bugs.debian.org/src:fai +Changements visibles par l’utilisateur + http://fai-project.org/NEWS +Arbre source via git + git clone git://github.com/faiproject/fai.git +Voir l’arbre source avec https + https://github.com/faiproject/fai + +Les pages man incluent toujours des informations à jour et beaucoup +de détails sur toutes les commandes FAI. Alors, n’oubliez pas de les +lire attentivement. Lisez maintenant ce manuel, puis profitez de +l’installation entièrement automatique et de votre temps économisé. + + +2.2. Motivation + +-------------- + +Avez-vous déjà effectué des installations identiques d’un système +d’exploitation à plusieurs reprises? Souhaitez-vous être en mesure +d’installer un cluster Linux avec des dizaines de nœuds d’un seul +coup? + +Répéter la même tâche encore et encore est ennuyeux — et conduira +certainement à des erreurs. Aussi beaucoup de temps pourrait être +sauvé si les installations étaient faites automatiquement. Un +processus d’installation avec interaction manuelle ne peut pas passer +à l’échelle. Mais les grappes (clusters) ont l’habitude de croître au +fil des ans. Pensez à long terme plutôt que de planifier seulement +quelques mois dans l’avenir. + +En 1999, j’ai dû effectuer une installation d’un cluster Linux avec +un serveur et 16 clients. Puisque j’ai eu beaucoup d’expérience en +faisant des installations automatiques des systèmes d’exploitation de +Solaris sur le matériel de SUN SPARC, l’idée de construire une +installation automatique pour Debian est née. Solaris dispose d’une +fonctionnalité d’installation automatique appelée JumpStart ^[1]. En +conjonction avec les scripts d’auto-installation de Casper Dik ^[2], +Je pouvais épargner beaucoup de temps non seulement pour chaque +nouvel ordinateur de SUN, mais aussi pour la réinstallation des +postes de travail existants. Par exemple, j’ai dû construire un LAN +temporaire avec quatre stations de travail SUN pour une conférence, +qui a duré seulement quelques jours. J’ai retiré ces postes de +travail de notre réseau de recherche habituel et mis en place une +nouvelle installation pour la conférence. Quand elle a été terminée, +j’ai simplement réintégré les postes de travail dans le réseau de +recherche, redémarré une seule fois, et après une demi-heure, tout +était opérationnel comme avant. La configuration de tous les postes +de travail était exactement la même qu’avant la conférence, car tout +était effectué par le même processus d’installation. J’ai également +utilisé l’installation automatique pour réinstaller un poste de +travail après qu’un disque dur endommagé ait été remplacé. Il m’a +fallu deux semaines pour recevoir le nouveau disque dur, mais +seulement quelques minutes après l’installation du nouveau disque, le +poste de travail fonctionnait comme avant. Et c’est pourquoi j’ai +choisi d’adapter cette technique à un cluster de PC sous Linux. + + +2.3. Comment fonctionne FAI + +-------------- + +Le client d’installation qui sera installé à l’aide de FAI, est +démarré via une carte réseau ou à partir d’un CD ou d’une clé USB. Il +obtient une adresse IP et démarre un noyau Linux qui monte son +système de fichiers racine via NFS (nfsroot) du serveur +d’installation. Une fois le noyau démarré, le script de démarrage FAI +exécute l’installation automatique qui n’a pas besoin d’interaction. +Tout d’abord, les disques durs seront partitionnés, les systèmes de +fichiers seront créés et des paquets logiciels seront ensuite +installés. Après cela, le nouveau système d’exploitation installé est +configuré selon vos besoins locaux en utilisant quelques scripts. +Enfin, le nouveau système d’exploitation sera démarré à partir du +disque local. + +Les détails sur la façon d’installer l’ordinateur (la configuration) +sont stockés dans l’espace de configuration sur le serveur +d’installation. Les fichiers de configuration sont répartis entre des +groupes d’ordinateurs s’ils sont similaires, en utilisant le concept +de classe. Vous n’avez donc pas besoin de créer une configuration +pour chaque nouvel hôte. Ainsi, FAI est une méthode évolutive pour +installer un gros cluster avec un grand nombre de nœuds même si leur +configuration n’est pas identique. + +FAI peut également être utilisé comme un système de sauvetage ou pour +l’inventaire matériel. Vous pouvez démarrer votre ordinateur, mais il +n’effectuera pas une installation. Au lieu de cela, il exécutera un +Debian GNU / Linux entièrement fonctionnel sans utiliser les disques +durs locaux. Ensuite, vous pouvez effectuer une connexion à distance +et sauvegarder ou restaurer une partition de disque, vérifier un +système de fichiers, inspecter le matériel ou effectuer toute autre +tâche. + + +2.4. Caractéristiques + +-------------- + + * On peut faire une installation entièrement automatisée. + * Installation très rapide sans surveillance. + * Système flexible grâce à un concept de classe simple. + * Mise à jour des systèmes en cours d’exécution sans + réinstallation. + * Images « Cloud » pour un environnement de virtualisation. + * Les hôtes peuvent démarrer à partir d’une carte réseau, d’un CD, + d’une clé USB. + * Création simple d’une image ISO vive ou pour l’installation. + * Prise en charge de PXE avec la méthode de démarrage DHCP. + * Support des systèmes de fichiers ReiserFS, ext3/ext4, btrfs et + XFS. + * Support logiciel RAID et LVM. Support LUKS. + * Détection automatique du matériel. + * On peut déployer Debian, Ubuntu, Rocky Linux, CentOS, AlmaLinux, + SuSE + * Possibilité de connexion à distance via ssh lors du processus + d’installation. + * Toutes les configurations similaires sont partagées entre tous + les les clients d’installation. + * Les fichiers journaux de toutes les installations sont + enregistrés sur le serveur d’installation. + * Prise en charge des scripts Shell, Perl, Python, Ruby, expect et + CFEngine lors de l’étape de personnalisation. + * Prise en charge de nombreux protocoles comme NFS, FTP, HTTP, git. + * Peut être utilisé comme un système de sauvetage et pour + l’inventaire matériel. + * Prise en charge de clients sans disque. + * Prise en charge trans-architecture, par exemple pour des + appareils embarqués (embedded devices). + * Ajoutez facilement vos propres fonctions via des hooks ou + modifiez le comportement par défaut. + * Prise en charge du clonage de machines utilisant des images de + disque. + + +2.5. La durée d’installation + +-------------- + +La durée d’installation est déterminée par la quantité de logiciel et +la vitesse du disque dur. Voici quelques exemples de durée. Tous les +clients d’installation avaient une carte réseau 1Gbit installée. + ++-----------------------------------------------------+ +|CPU |RAM|Disque | Logiciels| durée| +| | | | installés| | +|---------------+---+--------+-----------------+------| +|i7-3770T |8GB|SSD | 6 GB logiciel| 8.5| +|2.50GHz | | | | min| +|---------------+---+--------+-----------------+------| +|Core-i7 3.2GHz |6GB|SATA | 4.3GB logiciel| 7 min| +| | |disk | | | +|---------------+---+--------+-----------------+------| +|Core-i7 3.2GHz |6GB|SATA | 471 MB logiciel| 77sec| +| | |disk | | | +|---------------+---+--------+-----------------+------| +|Intel Core2 Duo|2GB|SATA | 3 GB logiciel|14 min| +| | |disk | | | ++-----------------------------------------------------+ + +--------------------------------------------------------------------- + +3. Quickstart - Pour l’utilisateur impatient + +--------------------------------------------------------------------- + + +3.1. Ma première installation + +-------------- + +Sans plus tarder, cette section fournira une démonstration rapide et +facile d’une installation entièrement automatique à l’aide du CD FAI +et d’une machine virtuelle. + +Il suffit de télécharger l' image ISO du CD à partir de https:// +fai-project.org/fai-cd et de démarrer votre VM à l’aide de ce CD. +Vous verrez un menu grub où vous pouvez choisir parmi différents +types d’installation. + +Cette installation s’exécutera sans serveur d’installation. +L’installation à partir du CD est identique à celle exécutée dans un +environnement réseau à l’aide du serveur d’installation FAI, et peut +être aussi effectuée à l’aide d’une clé USB sur un ordinateur +physique. + +On peut aussi créer soi-même une image FAI (installation entièrement +automatique) à la page web https://fai-project.org/FAIme sans avoir +besoin d’installer FAI sur son ordinateur. + + +3.2. Ma première installation à l’aide d’un serveur + +-------------- + +Nous allons créer un réseau privé et lancer deux machines vituelles. +L’une deviendra votre propre serveur FAI, l’autre sera un client +d’installation. + +Si vous avez l’intention d’utiliser VMware ou VirtualBox, +assurez-vous que votre client utilise une connexion réseau pontée +(bridged network). On trouve une description détaillée dans le wiki +FAI ^[3]. on ne peut pas utiliser des interfaces réseau pontées via +le réseau sans fil, car la plupart des cartes réseau WiFi ne prennent +pas en charge cette fonctionnalité. + +Quand on utilise Qemu/KVM et le script fai-kvm on peut créer le +réseau à l’aide de la commande fai-mk-network. Il faut commencer par +installer quelques paquets logiciels + +# apt-get install qemu-system-gui qemu-kvm qemu-utils + +La commande ci-dessous met en place un réseau privé avec un pont +logiciel et plusieurs TAPs réseau :footnote[https://fr.wikipedia.org/ +wiki/TAP_r%C3%A9seau]: appartenant à l’utilisateur +. + +fai-mk-network + +Après cela, vous pouvez utiliser fai-kvm (-h vous aidera) pour +démarrer des machines virtuelles en utilisant KVM qui sont connectés +à ce réseau privé. Faites attention. Par défaut, fai-kvm créera les +images de disque pour les machines virtuelles dans +/tmp+, qui est un +disque RAM sur la plupart des systèmes. Il n’y a aucun problème à +créer une image de disque vide de 20G dans /tmp (même si cette +partition est de 4 Go de taille), mais alors que la VM écrit des +données sur son disque, cela commencera à consommer de l’espace dans ++/tmp+. + +Démarrez le premier hôte virtuel, qui deviendra le serveur FAI ^[4]: + +fai-kvm -Vn -s20 -u 1 cd faicd64-small.iso + +Dans le menu grub; sélectionnez faiserver, using internal DHCP and a +fixed IP. Cela va installer un hôte appelé faiserver avec IP +192.168.33.250 qui contient tous les logiciels nécessaires pour un +serveur FAI. Il configurera également un cache de paquets local (en +utilisant apt-cacher-ng). Une fois l’installation terminée, +redémarrez la machine. Lors du premier démarrage du nouveau système, +il configurera automatiquement le nfsroot. Cela peut prendre quelques +minutes. + +Après cela, vous pouvez démarrer des hôtes supplémentaires en +utilisant un démarrage réseau. Pour chaque nouvel hôte, vous devez +utiliser une valeur différente pour +-u+, qui sera utilisée pour +générer des adresses MAC différentes et utiliser des noms de fichier +d’image de disque différents. + +fai-kvm -Vn -u 2 pxe + +Ces clients d’installation vous montreront un menu, où vous pouvez +sélectionner le type d’installation que vous souhaitez effectuer. Si +le client d’installation ne trouve pas le serveur, c’est généralement +parce que fai-monitor n’y fonctionne plus. Cela peut se produire si +vous redémarrez le faiserver après l’installation. Pour remédier à +cela, exécutez simplement fai-monitor sur le faiserver et relancez le +démarrage du client. + +Un autre client pourrait être lancé avec: + +fai-kvm -Vn -u 3 pxe + +Vous pouvez démarrer autant de machines dans le réseau que de TAPs +réseau disponibles. Toutes ces machines peuvent se connecter à +l’Internet extérieur, mais sont seulement accessibles à partir de +votre machine hôte. + + +--------------------------------------------------------------------- + +4. Vue d’ensemble et Concepts + +--------------------------------------------------------------------- + +FAI est un système non interactif permettant d’installer, de +personnaliser et de gérer les configurations de systèmes et de +logiciels Linux sur les ordinateurs ainsi que sur les machines +virtuelles et les environnements chroot, des petits réseaux aux +grandes infrastructures et clusters. Vous pouvez prendre un ou +plusieurs PC vierges, mettre sous tension et après quelques minutes, +Linux est installé, configuré et fonctionnel sur l’ensemble du +cluster, sans aucune interaction nécessaire. Ainsi, il s’agit d’une +méthode évolutive pour installer et mettre à jour un cluster sans +surveillance impliquant peu d’efforts. FAI utilise le système +d’exploitation Linux et une collection de scripts shell et Perl pour +le processus d’installation. Les modifications apportées aux fichiers +de configuration du système d’exploitation peuvent être effectuées +par des scripts CFEngine, shell (bash et zsh), Perl, Python, Ruby et +expect. + +Les personnes intéressées par FAI sont des administrateurs système +qui doivent installer Linux sur une ou même des centaines +d’ordinateurs. Parce qu’il s’agit d’un outil d’installation à usage +général, il peut être utilisé pour l’installation d’un cluster +Beowulf, d’une ferme de rendu ou d’un laboratoire Linux ou d’une +salle de classe. De plus, des réseaux Linux de grande envergure avec +différents matériels ou différentes exigences d’installation sont +faciles à établir à l’aide de FAI. Mais n’oubliez pas de planifier +votre installation. Le chapitre [plan] contient quelques conseils +utiles à ce sujet. + + +4.1.  Terminologie + +-------------- + +Commençons par décrire quelques termes utilisés dans ce manuel. + +Le serveur d’installation + Il fournit les services DHCP, TFTP et NFS ainsi que les données + de configuration pour tous les clients d’installation. Dans les + exemples de ce manuel, cet hôte s’appelle faiserver. C’est l’hôte + où le paquet faiserver est installé. +install client + A host which will be installed using FAI and a configuration + provided by the install server. Also called client for short. In + this manual, the example hosts are called demohost, xfcehost, + gnomehost … This computer should boot from its network interface + using PXE. +configuration space + + A subdirectory structure containg several files. Those files + describe the details of how the installation of the clients will + be performed. All configuration data is stored here. It’s also + called config space for short. It includes information about: + + o Hard disk layout in a format similar to fstab + o Local file systems, their types, mount points and mount + options + o Software packages + o Keyboard layout, time zone, Xorg configuration, remote file + systems, user accounts, printers … + + The package fai-doc includes a sample configuration space + including examples for hosts using the XFCE and GNOME environment + amongst other examples. Calling fai-mk-configspace copies these + examples to /srv/fai/config. It’s recommended to study those + config files and scripts for easier understanding how FAI works. + +nfsroot, NFS-Root + A file system located on the install server. During the + installation process it’s the complete file system for the + install clients. All clients share the same nfsroot, which they + mount read only. The nfsroot needs about 1.1GB of free disk + space. +TFTP + Serves clients the initrd and kernel that is used for the + installation process. Along with the file system served by NFS, + these two make up a temporary OS in which the installations are + performed. +FAI classes + Classes are names which determine which configuration file is + selected. If a client belongs to class WEBSERVER, it will be + configured as a webserver, the class DESKTOP for e.g. determines + which software packages will be installed. +profile + A FAI profile is just a list of FAI classes assiged to a profile + name, which is extended by a description of this profile. I.e. + one could have two "Webserver" profiles, one including the APACHE + class another including the NGINX class, to then install the + respective webserver solution. +tasks + The installation of a client consists of several parts, which are + called tasks. Tasks are predefined subroutines which perform a + certain part of the FAI. The following FAI tasks are performed + during an installation on the install clients. + + confdir # get the config space + setup # some initialization, start sshd on demand + defclass # define FAI classes + defvar # define variables + action # evaluate FAI_ACTION + install # Start the installation + partition # partition the harddisks, create file systems + mountdisks # mount the file systems + extrbase # extract the base.tar.xz + debconf # do the Debian debconf preseeding + repository # prepare access to the package repository + updatebase # Set up package tools and update packages + instsoft # install software packages + configure # call customization scripts + finish # do some cleanup, show installation statistics + tests # call tests if defined + chboot # call fai-chboot on the install server + savelog # save log files to local and remote location + faiend # reboot host, eject CD if needed + + These are tasks, which are only executed when a different action + is performed + + dirinstall # install a chroot environment + softupdate # only do the system configuration + sysinfo # print detailed system information + inventory # print short hardware inventory list + +For a more in-depth description of tasks , see [tasks]. + +Note that you are not limited to the FAI tasks. You can also define +additional programs or scripts which will be run on particular +occasions. They are called hooks. + +hooks + Hooks are plugins, they can add additional functionality to the + installation process or even replace entire tasks of FAI. Hooks + are explained in detail in [hooks]. + + +4.2. The class concept + +-------------- + +Classes are used in nearly all tasks of the installation. Classes +determine which configuration files to choose from a list of +available alternatives. To determine which config files to use, FAI +searches the list of defined classes and uses all configuration files +that match a class name ^[5]. The following loop implements this +function in pseudo shell code: + +for class in $all_classes; do + if [ -r $config_dir/$class ]; then # if a file with name $class exists + your_command $config_dir/$class # call a command with this file name + # exit if only the first matching file is needed + fi +done + +The very nice feature of this is that you can add a new configuration +alternative and it will automatically be used by FAI without changing +the code, if the configuration file uses a class name. + +This is because the loop automatically detects new configuration +files that should be used. The idea of using classes in general and +using certain files matching a class name for a configuration is +adopted from the installation scripts by Casper Dik for Solaris. This +technique proved to be very useful and easy. + +You can group multiple hosts that share the same configuration files +by using the same class. You can also split the whole configuration +data for all clients into several classes and use them like lego +bricks and build the entire configuration for a single client by +assembling the bricks together. + +If a client belongs to class A, we say the class A is defined for +this client. A class has no value, it is just defined or undefined. + +Classes determine how the installation is performed. For example, an +install client can be configured to get the XFCE desktop by just +adding the class XFCE to it. Naturally, also more granular +configurations are possible. For instance, classes can describe how +the hard disk should be partitioned, they can define which software +packages will be installed, or which customization steps are +performed. + +Often, a client configuration is created by only changing or +appending the classes to which this client belongs, making the +installation of a new client very easy. Thus no additional +information needs to be added to the configuration space if the +existing classes suffice for your needs. + +As you can see, classes are a central pillar of customizing your +configuration space and with that your client installation. On how to +define your own classes, refer to [defining classes]. + + +--------------------------------------------------------------------- + +5. Setup your faiserver + +--------------------------------------------------------------------- + +Here’s how to set up the install server in a few minutes. Following +steps are needed: + + 1. Set up the install server + + a. Install FAI packages + b. Create the nfsroot + c. Copy the examples to the config space + d. Configure network daemons + e. Create the PXELINUX configurations + 2. Boot and install clients + + +5.1. Install the FAI packages + +-------------- + + * Install the key of the FAI project package repository. + * Add the URL of the package repository of the FAI project. + * Install the package fai-quickstart on your install server. + +Use these commands for installing: + +# wget -O /etc/apt/trusted.gpg.d/fai-project.gpg https://fai-project.org/download/2BF8D9FE074BCDE4.gpg +# echo "deb http://fai-project.org/download bookworm koeln" > /etc/apt/sources.list.d/fai.list + +or + +# apt install extrepo ; extrepo enable fai + +and then + +# apt-get update +# aptitude install fai-quickstart + +This will also install the packages for DHCP, TFTP and NFS server +daemons. + + +5.2. Create the nfsroot + +-------------- + + * Also enable the package repository of the FAI project in a + different sources.list file which is used when building the + nfsroot. Then, enable the log user for FAI. + +# sed -i -e 's/^#deb/deb/' /etc/fai/apt/sources.list +# sed -i -e 's/#LOGUSER/LOGUSER/' /etc/fai/fai.conf + + * By default, FAI uses http://deb.debian.org as package mirror, + which should attempt to find a fast package repository for you. ^ + [6] Now, we can run fai-setup(8) ^[7] and check if everything + went well. The log file is written to /var/log/fai/fai-setup.log. + +# fai-setup -v + + * These are some of the lines you will see at the end of fai-setup. + A complete example of fai-setup.log is available on the FAI web + page at https://fai-project.org/logs/fai-setup.log. + +FAI packages and related packages inside the nfsroot: +dracut 059-4 +dracut-live 059-4 +dracut-network 059-4 +dracut-squash 059-4 +fai-client 6.2 +fai-nfsroot 6.2 +fai-setup-storage 6.2 +Waiting for background jobs to finish +fai-make-nfsroot finished properly. +Log file written to /var/log/fai/fai-make-nfsroot.log +Adding line to /etc/exports: /srv/fai/config 192.168.33.250/24(async,ro,no_subtree_check) +Adding line to /etc/exports: /srv/fai/nfsroot 192.168.33.250/24(async,ro,no_subtree_check,no_root_squash) +Reloading nfs-kernel-server configuration (via systemctl): nfs-kernel-server.service. + +Your initial config space is now located in /srv/fai/config +Please don't forget to fill out the FAI questionnaire after you've finished your project with FAI. + +FAI setup finished. +Log file written to /var/log/fai/fai-setup.log + + * fai-setup has created the LOGUSER, the nfsroot and has added + additional lines to /etc/exports. The subdirectories added to / + etc/exports are exported via NFS v3, so all install clients in + the same subnet can mount them via NFS. + + +5.3. Creating the configuration space + +-------------- + +Install the simple examples into the configuration space ^[8]. + +$ fai-mk-configspace + +These examples contain configuration for some sample hosts. Depending +on the host name used, your computer will be configured as follows: + +demohost + A machine which needs only a small hard disk. This machine is + configured with network as DHCP client, and an account demo is + created. +xfcehost + A XFCE desktop is installed, using LVM, and the account demo is + created. +gnomehost + A GNOME desktop is installed, and the account demo is created. +ubuntuhost + A Ubuntu desktop will be installed, and the account demo is + created. +other host names + Hosts with another host name will most notably use the classes + FAIBASE, DHCPC and GRUB. + +All hosts will have an account called demo with password fai. The +root account also has the password fai. + +If the FAI flag menu is added, instead of using the host name for +determing the type of installation, a menu is presented, and the user +can choose a profile for the installation. + + +5.4. Configure the network daemons + +-------------- + +For booting the install client via PXE, the install server needs a +DHCP and a TFTP daemon running. The package fai-quickstart has +already installed the software packages for those daemons. +Additionally the package of the NFS server for exporting the nfsroot +and the config space was installed. + +5.4.1. Configuration of the DHCP daemon + +Ideally, your faiserver should also be your DHCP server. If that is +not the case, instruct the admin responsible of the DHCP server to +configure it according to this section. Optionally, it is possible to +avoid that by using the [autodiscover] feature released in FAI 5.0. + +An example for dhcpd.conf(5) is provided with the fai-doc package. +Start using this example and look at all options used therein. + +# cp /usr/share/doc/fai-doc/examples/etc/dhcpd.conf /etc/dhcp/ + +The only FAI specific information inside this configuration file is +to set filename (DHCP option 67) to fai/pxelinux.0 and to set +next-server (DHCP option 66, also called TFTP server name) and +server-name to the name of your install server. All other information +is only network related data, which is used in almost all DHCP +configurations. Adjust these network parameters to your local needs. + +deny unknown-clients; +option dhcp-max-message-size 2048; +use-host-decl-names on; + +subnet 192.168.33.0 netmask 255.255.255.0 { + option routers 192.168.33.250; + option domain-name "my.example"; + option domain-name-servers 192.168.33.250; + option time-servers faiserver; + option ntp-servers faiserver; + server-name faiserver; + next-server faiserver; + filename "fai/pxelinux.0"; +} + +If you make any changes to the DHCP configuration, you must restart +the daemon. + +# invoke-rc.d isc-dhcp-server restart + +If you have multiple network interfaces, you can define on which +interface the server will listen in /etc/default/isc-dhcp-server. By +default, the DHCP daemon writes its log messages to /var/log/ +daemon.log. + +5.4.2. Adding a host entry to DHCP + +The MAC address is given by the hardware of the network card. For +each install client you collect its MAC address and to map it to an +IP address and to a host name. First, we add the IP address and the +hostname to /etc/hosts ^[9]. + +192.168.33.100 demohost + +The mapping from the MAC address to the IP address is done in the +dhcpd.conf file. Here, we add a host entry using the command +dhcp-edit(8). Here you have to replace 01:02:03:AB:CD:EF ith the MAC +you have found. + +# dhcp-edit demohost 01:02:03:AB:CD:EF + +After calling this command, this is what the host entry in dhcpd.conf +will look like: + +host demohost {hardware ethernet 01:02:03:AB:CD:EF;fixed-address demohost;} + +5.4.3. TFTP + +Normally, you do not need any changes to the TFTP dameon +configuration. The files which are provided by TFTP are located in / +srv/tftp/fai. + +5.4.4. NFS + +The command fai-setup has already set up the NFS daemon and added +some lines to the configuration file /etc/exports. It exports the +directories using NFS v3. + + +5.5. Creating the PXELINUX configuration + +-------------- + +The last step before booting your client for the first time is to +specify what configuration the client should boot when doing PXE +boot. We use the command fai-chboot(8) to create a pxelinux +configuration for each install client. This includes information +about the kernel, the initrd, the config space and some boot +parameters. You should read the manual page, which gives you some +good examples. Here’s the command for starting the installation for +the host demohost. + +$ fai-chboot -IFv -u nfs://faiserver/srv/fai/config demohost + +Booting kernel vmlinuz-4.19.0-5-amd64 + append initrd=initrd.img-4.19.0-5-amd64 ip=dhcp + FAI_FLAGS=verbose,sshd,createvt FAI_CONFIG_SRC=nfs://faiserver/srv/fai/config + +demohost has 192.168.33.100 in hex C0A82164 +Writing file /srv/tftp/fai/pxelinux.cfg/C0A82164 for demohost + +At this point, you should have a working faiserver setup and your +clients should boot into FAI and be able to install one of the +examples. + +In the following section, you can read about planning your +installation, tailoring your configuration space to your particular +needs and extending FAI using hooks. + + +5.6. Custom server + +-------------- + +The faiserver and its setup is by no means static. It is possible to +customize and extend your server. For this, please refer to the +[Customizing your install server setup] section in [advanced]. + + +--------------------------------------------------------------------- + +6. Plan your installation + +--------------------------------------------------------------------- + +Before starting your installation, you should invest a lot of time +into planning your installation. Once you’re happy with your +installation concept, FAI can do all the boring and repetitive tasks +to turn your plans into reality. FAI can’t do good installations if +your concept is imperfect or lacks some important details. Start +planning the installation by answering the following questions: + + * Will I create a Beowulf cluster, or do I have to install some + desktop machines? + * What does my LAN topology look like? + * Do I have uniform hardware? Will the hardware stay uniform in the + future? + * Does the hardware need a special kernel? + * How should the hosts be named? + * How should the local hard disks be partitioned? + * Which applications will be run by the users? + * Do the users need a queuing system? + * What software should be installed? + * Which daemons should be started, and what should the + configuration for these look like? + * Which remote file systems should be mounted? + * How should backups be performed? + +You also have to think about user accounts, printers, a mail system, +cron jobs, graphic cards, dual boot, NIS, NTP, timezone, keyboard +layout, exporting and mounting directories via NFS and many other +things. So, there’s a lot to do before starting an installation. And +remember that knowledge is power, and it’s up to you to use it. +Installation and administration is a process, not a product. FAI +can’t do things you don’t tell it to do. + +You don’t need to start from scratch. Look at the files and scripts +in the configuration space. There are a lot of things you can use for +your own installation. A good paper called "Bootstrapping an +Infrastructure" with more aspects of building an infrastructure is +available at http://www.infrastructures.org/papers/bootstrap/ +bootstrap.html + + +6.1. The configuration space and its subdirectories + +-------------- + +The configuration space is the collection of information about how +exactly to install a client. The central configuration space for all +install clients is located on the install server in /srv/fai/config +and its subdirectories. This will be mounted by the install clients +to /var/lib/fai/config. The main installation command fai(8) uses all +these subdirectories in the order listed except for hooks. + +class/ + Scripts and files to define classes and variables. +disk_config/ + Configuration files for disk partitioning, software RAID, LVM and + file system creation. +basefiles/ + + Normally the file base.tar.xz (located inside the nfsroot) is + extracted on the install client after the new file systems are + created and before package are installed. This is a minimal base + image, created right after calling debootstrap during the + creation of the nfsroot on the install server. If you want to + install another distribution than the nfsroot is, you can put a + tar file into the subdirectory basefiles/ and name it after a + class. Then the command ftar(8) is used to extract the tar file + based on the classes defined. Thus the file has to be named + CLASS.tar.xz not CLASS.base.tar.xz. This is done in task extrbase + . Use this if you want to install another distribution or version + than that running during the installation. + + This basefile can also be received based on FAI classes via HTTP/ + HTTPS or FTP by defining the variable FAI_BASEFILEURL. FAI will + download a file CLASSNAME.tar.xz (or tgz, or tar.gz,…) from this + URL, if CLASSNAME matches a FAI class. + + Example: + +FAI_BASEFILEURL=https://fai-project.org/download/basefiles/ + +The folder must support directory listing. FAI will not probe for +potentially matching files. + +See chapter [otherdists] for how to install different distributions. + +debconf/ + This directory holds all debconf(7) data. The format is the same + that is used by debconf-set-selections(1). +package_config/ + Files with class names contain lists of software packages to be + installed or removed by install_packages(8). Files named + .gpg are added to the list of keys used by apt for trusted + package repositories. +pkgs/ + This directory can contain subdirectories named by classes. You + can put .deb or .rpm files into these subdirectories. FAI will + then install these packages without the need of creating the + metadata of a package repository. +scripts/ + Scripts for your local site customization. Used by fai-do-scripts + (1). +files/ + Files used by customization scripts. Most files are located in a + subtree structure which reflects the ordinary directory tree. For + example, the templates for nsswitch.conf are located in $FAI/ + files/etc/nsswitch.conf and are named according to the classes + that they should match: $FAI/files/etc/nsswitch.conf/NIS is the + version of /etc/nsswitch.conf to use for the NIS class. Note that + the contents of the files directory are not automatically copied + to the target machine, rather they must be explicitly copied by + customization scripts using the fcopy(8) command. +hooks/ + Hooks are user defined programs or scripts, which are called + during the installation process. They can extend or replace the + default tasks. The file name must be of format taskname.CLASSNAME + [.sh]. A hook called updatebase.DEBIAN is executed prior to the + task updatebase and only if the install client belongs to the + class DEBIAN. + + +6.2. Defining classes + +-------------- + +There are different possibilities to define classes: + + 1. Some default classes are defined for every host: DEFAULT, LAST + and its host name. + 2. Classes may be listed within a file (by default in class/ + ) + 3. Classes may be dynamically defined by scripts. + +The last option is a very nice feature, since these scripts will +define classes in a very flexible way. For example, several classes +may be defined only if certain hardware is identified or a class is +defined depending on the network subnet information. + +All names of classes, except the host name, are written in uppercase. +They must not contain a hyphen, a hash, a semicolon or a dot, but may +contain underscores and digits. + +The task defclass calls the command fai-class(1) to define classes. +All scripts matching ^[0-9][0-9]* (they start with two digits) in the +subdirectory $FAI/class are executed for defining classes. Everything +that is printed to STDOUT is automatically defined as a class. For +more information on defining class, read the manual pages for +fai-class(1). The script 50-host-classes (see below a stripped +version) is used to define classes depending on the host name. + +# use a list of classes for our demo machines +case $HOSTNAME in + demohost) + echo "FAIBASE GRUB DEMO" ;; + xfcehost) + echo "FAIBASE GRUB DEMO XORG XFCE LVM";; + faiserver) + echo "FAIBASE DEBIAN DEMO FAISERVER" ;; + ubuntuhost) + echo "FAIBASE DEBIAN DEMO UBUNTU JAMMY JAMMY64 XORG";; + *) + echo "FAIBASE DEBIAN DEMO" ;; +esac + +Host names should rarely be used for the configuration files in the +configuration space. Instead, a class should be defined and then +added for a given host. This is because most of the time the +configuration data is not specific for one host, but can be shared +among several hosts. + +The order of the classes is important because it defines the priority +of the classes from low to high. + + +6.3. Defining variables + +-------------- + +The task defvar defines the variables for the install client. +Variables are defined by scripts in class/*.var. All global variables +can be set in DEFAULT.var. For groups of hosts use a class file. For +a single host use the file $HOSTNAME .var. Also here, it’s useful to +study all the examples. + +The following variables are used in the examples and may also be +useful for your installation: + +FAI_ACTION + Set the action FAI should perform. Normally this is done by + fai-chboot(8). If you can’t use this command, define this + variable i.e. in the script LAST.var. +FAI_ALLOW_UNSIGNED + If set to 1, FAI allows the installation of packages from + unsigned repositories. +CONSOLEFONT + Is the font which is loaded during installation by setfont(8). +KEYMAP + Defines the keyboard map files in /usr/share/keymaps and $FAI/ + files. You don’t need to specify the full path, since this file + will be located automatically. +ROOTPW + The encrypted root password for the new system. You can use crypt + (3), md5 and other hash types for the password. Use mkpasswd(1) + for creating the hash for a certain password. For example, to + generate a md5 hash for the password use + +$ echo "yoursecrectpassword" | mkpasswd -m yescrypt -s + +UTC + Set hardware clock to UTC if UTC=yes. Otherwise set clock to + local time. See clock(8) for more information. +TIMEZONE + Is the file relative to /usr/share/zoneinfo/ which indicates your + time zone. E.g.: TIMEZONE=Europe/Berlin. +MODULESLIST + A list of kernel modules which are loaded during boot of the new + system (written to /etc/modules). + + +6.4. Hard disk configuration + +-------------- + +The tool setup-storage(8) reads a file in $FAI/disk_config for the +disk configuration. This file describes how all the local disks will +be partitioned, which file system types should be created (like ext3/ +4, xfs, btrfs), and where they are mounted to. You can also create +software RAID and LVM setups using this config file. It’s also +possible to preserve the disk layout or to preserve the data on +certain partitions. + +During the installation process all local file systems are mounted +relative to /target. For example if you specify the mount point /home +in a disk configuration file this will be the directory /target/home +during the installation process and will become /home for the new +installed system. + + +6.5. Extract base file + +-------------- + +A base file is only needed when installing a distribution which is +different from the one in the nfsroot. + + +6.6. Debconf preseeding + +-------------- + +You can use the format described in debconf-set-selections(1). + + +6.7. Access to the package repository + +-------------- + +FAI supports http, https and NFS for accessing the package mirror. +Set the variable $FAI_DEBMIRROR for using NFS. + + +6.8. Software package configuration + +-------------- + +Before installing packages, FAI will add the content of all files +named package_config/class.gpg to the list of apt keys. If your local +repository is signed by your keyid AB12CD34 you can easily add this +key, so FAI will use it during installation. Use this command for +creating the CLASS.gpg file: + +faiserver$ gpg --export AB12CD34 > /srv/fai/config/package_config/MYCLASS.gpg + +The script install_packages(8) installs the selected software +packages. It reads all configuration files in $FAI/package_config +whose file name matches a defined class. The syntax is very simple. + +# an example package class + +PACKAGES taskinst +german + +PACKAGES install-norec +adduser nmap +less zstd + +PACKAGES remove +gpm xdm + +PACKAGES install GRUB_PC +grub-pc + +Comments are starting with a hash (#) and are ending at the end of +the line. Every package command begins with the word PACKAGES +followed by a command name, which maps to a different package tool +like apt-get, aptitude or dnf for e.g. The command defines which +command will be used to install the packages named after this +command. The list of all available commands can be listed using +install_packages -H. Supported package tools are: apt, apt-get, +aptitude, smart, yast, dnf, rpm, zypper + +hold + Put a package on hold. This package will not be handled by dpkg, + e.g not upgraded. +install + Install all packages (using apt-get) that are specified in the + following lines. If a hyphen is appended to the package name + (with no intervening space), the package will be removed, not + installed. All package names are checked for misspellings. Any + package which does not exist, will be removed from the list of + packages to install. So be careful not to misspell any package + names. +install-norec + Like install but without installing the recommended packages. +remove + Remove all packages that are specified in the following lines. + Append a + to the package name if the package should be + installed. +taskinst + Install all packages belonging to the tasks that are specified in + the following lines using tasksel(1). You can also use aptitude + for installing tasks. +aptitude + Install all packages with the command aptitude. This will be the + default in the future and may replace apt-get and taskinst. + Aptitude can also install task packages. +aptitude-r + Same as aptitude with option --with-recommends. +unpack + Download package and unpack only. Do not configure the package. +dselect-upgrade + Set package selections using the following lines and install or + remove the packages specified. These lines are the output of the + command dpkg --get-selections. It’s not recommended to use this + format, since you are also specifying all packages which are only + installed because of a dependency or a recommends. It’s better + just to specify the pacakge you like to have, and to let FAI (and + apt-get) resolve the dependencies. + +Multiple lines with lists of space separated names of packages follow +the PACKAGES lines. All dependencies are resolved. Packages with +suffix - (eg. lilo-) will be removed instead of installed. The order +of the packages doesn’t matter. If you like to install packages from +another release than the default, you can append the release name to +the package name like in openoffice.org/etch-backports. You can also +specify a certain version like apt=0.3.1. More information on these +features are described in aptitude(8). + +You can specify additional parameters for the package manager adding +key=value after PACKAGES . Currently we support release= + which will add -t when installing packages. + +Example: + +PACKAGES install-norec release=testing +nvidia-smi + +This will install the nvidia-smi package from the testing release, +including the dependencies. Don’t forget to add an entry into +sources.list. You may also want to adjust the apt pinning (see +apt_references(5)). + +A line which contains the PRELOADRM commands, downloads a file using +wget(1) into a directory before installing the packages. Using the +file: URL, this file is copied from $FAI_ROOT to the download +directory. For example the package realplayer needs an archive to +install the software, so this archive is downloaded to the directory +/root. After installing the packages this file will be removed. If +the file shouldn’t be removed, use the command PRELOAD instead. + +You can add an arbitrary boolean expression using FAI classes to +define when the list of packages should be installed. Here, the +packages are only installed if the class XORG is defined but the +class MINT is not defined. + +Example: + +PACKAGES install UBUNTU && XORG && ! MINT +ubuntu-standard +ubuntu-desktop + +The old way of adding some logic in the PACKAGES lines is still +supported: It’s possible to append a list of class names after the +command for apt-get. So this PACKAGES command will only be executed +when at least one of the corresponding classes is defined (logical +OR). So you can combine many small files into the file DEFAULT. + +If you want to remove a package name from a certain class was part of +this class before, you should not remove the package name from the +class file, but instead append a dash (-) to it. This will make sure +that the package is removed during a softupdate on hosts which were +installed using the old class definition which included this package +name. + +If you specify a package that does not exist this package will be +removed automatically from the installation list only if the command +install is used. + +The concept of classes priority allows a higher priority class (one +that comes later in the sequence of classes) to override the +selection of packages of a lower priority class. For this to work +correctly, the higher priority class must use the same PACKAGES +command (e.g. PACKAGES install-norec instead of just PACKAGES install +) as the one used by the class it is trying to override. This is +useful to suppress installation of a package, for example, to avoid +installing the linuxlogo package installed by class FAIBASE: + +# example of how to override: +# +# On FAIBASE we have: +# PACKAGES install-norec +# linuxlogo +# +# We want to _not_ install linuxlogo, and it is in a +# install-norec section, so we must also use install-norec. + +PACKAGES install-norec +linuxlogo- + + +6.9.  Customization scripts + +-------------- + +The command fai-do-scripts(1) is called to execute all scripts in +this directory. If a directory with a class name exists, all scripts +matching ^[0-9][0-9]* are executed in alphabetical order. So it’s +possible to use scripts of different languages (shell, cfengine, +Perl, Python, Ruby, expect,..) for one class. + +Thoses scripts write their output to sripts.log. The file status.log +contains the names of all scripts executed and their exit status. + +6.9.1. Shell scripts + +Most scripts are Bourne shell scripts. Shell scripts are useful if +the configuration task only needs to call some shell commands or +create a file from scratch. In order not to write many short scripts, +it’s possible to use the ifclass command for testing if certain +classes are defined. + +ifclass -o A B C + +checks if one of classes A, B or C are defined. Using -a (logical +AND) checks if all classes of a list are defined. The command ifclass +C checks if only class C is defined. + +For copying files with classes, use the command fcopy(8). If you want +to extract an archive using classes, use ftar(8). For appending lines +to a configuration file use ainsl(1) instead of just echo string >> +filename. + +FAI also supports zsh(1) scripts during the customization task. +Within scripts, the variable $classes holds a space separated list +with the names of all defined classes. + +6.9.2. Cfengine scripts + +CFEngine has a rich set of functions to edit existing configuration +files, e.g LocateLineMatching, ReplaceAll, InsertLine, +AppendIfNoSuchLine, HashCommentLinesContaining. But it can’t handle +variables which are undefined. If a variable is undefined, the whole +cfengine script will abort. + +More information can be found in the manual page cfengine(8) or at +the cfengine homepage https://www.cfengine.com. + + +6.10. Hooks + +-------------- + +Hooks let you specify functions or programs which are run at certain +steps of the installation process. Before a task is called, FAI +searches for existing hooks for this task and executes them. As you +might expect, classes are also used when calling hooks. Hooks are +executed for every defined class. You only have to create the hook +with the name for the desired class and it will be used. If several +hooks for a task exists, they are called in the order defined by the +classes. If debug is included in $FAI_FLAG the option -d is passed to +all hooks, so you can debug your own hooks. If some default tasks +should be skipped, use the subroutine skiptask and a list of default +tasks as parameters. In the examples provided, the hooks of the class +CENTOS skips some Debian specific tasks. + +The directory $FAI/hooks/ contains all hooks. A hook is an executable +file following the naming scheme taskname.CLASSNAME[.sh] (e.g. +repository.CENTOS or 'savelog.LAST.sh). The task name specifies which +task to precede executing this hook, if the specified class is +defined for the installing client. See section [tasks] for a complete +list of default tasks that can be used. + +A hook of the form hookprefix.classname can’t define variables for +the installation script, because it’s a subprocess. But you can use +any binary executable or any script you wrote. Hooks that have the +suffix .sh (e.g. partition.DEFAULT.sh) must be Bourne shell scripts +and are sourced. So it’s possible to redefine variables for the +installation scripts. + +In the first part of FAI, all hooks with prefix confdir are called. +Those hooks can not be located in the config space, since it’s not +yet available. Therefore these hooks are the only hooks located in +$nfsroot/$FAI/hooks on the install server. All other hooks are found +in $FAI_CONFIGDIR/hooks on the install server. + +All hooks that are called before classes are defined can only use the +following classes: DEFAULT $HOSTNAME LAST. If a hook for class +DEFAULT should only be called if no hook for class $HOSTNAME is +available, insert these lines to the default hook: + +hookexample.DEFAULT: + +#! /bin/sh + +# skip DEFAULT hook if a hook for $HOSTNAME exists +scriptname=$(basename $0 .DEFAULT) +[-f $FAI/hooks/$scriptname.$HOSTNAME ] && exit +# here follows the actions for class DEFAULT +. +. + +Some examples for what hooks could be used: + + * Load kernel modules before classes are defined in $FAI/class. + * Send an email to the administrator if the installation is + finished. + * Install a diskless client and skip local disk partitioning. + * Have a look at hooks/debconf.IMAGE for how to clone a machine + using a file system image. + + +6.11. FAI flags + +-------------- + +The variable $FAI_FLAGS contains a space separated list of flags. +Flags are normally defined in the pxelinux.cfg file which should be +created by fai-chboot(1). The following flags are known: + +verbose + Create verbose output during installation. This should always be + the first flag, so consecutive definitions of flags will be + verbosely displayed. +debug + Create debug output. No unattended installation is performed. + During package installation you have to answer all questions of + the postinstall scripts on the client’s console. A lot of debug + information will be printed out. This flag is only useful for FAI + developers. +sshd + Start the ssh daemon to enable remote logins. You can then log in + as root to all install clients during the installation. The + default password is fai and can be changed by setting FAI_ROOTPW + in nfsroot.conf(5). To log in from your server to the install + client (named demohost in this example) use: + +$ ssh root@demohost +Warning: Permanently added 'demohost,192.168.33.100' to the list of known hosts. +root@demohost's password: + +This is only the root password during the installation process, not +for the new installed system. You can also log in without a password +when using $SSH_IDENTITY. + +createvt + Create two virtual terminals and execute a bash if ctrl-c is + typed in the console terminal. The additional terminals can be + accessed by typing Alt-F2 or Alt-F3. Otherwise, no terminals are + available and typing ctrl-c will reboot the install client. + Setting this flag is useful for debugging. If you want an + installation which should not be interruptible, do not set this + flag. +menu + This enables a user menu for selecting a profile. All files class + /*.profile are read and a curses based menu will be created. +screen + Run FAI inside a screen(1) session. The session is called FAI. If + you log in via ssh from remote you can attach to the session + using: + +$ screen -x + +tmux + Run FAI inside a tmux(1) session. The session is called FAI. If + you log in via ssh from remote you can attach to the session + using: + +$ tmux attach + +reboot + Reboot the install client after installation is finished without + typing RETURN on the console. If this flag is not set, and + error.log contains anything, the install client will stop and + wait that you press RETURN. If no errors occurred, the client + will always reboot automatically. +halt + Halt the install client at the end of the installation, instead + of rebooting into the new system. +initial + Used by setup-storage(8). Partitions marked with + preserve_reinstall are preserved unless this flag is set. Often, + this flag is set in a file class/*.var by using setting + flag_initial=1. + + +--------------------------------------------------------------------- + +7.  FAI installs your plan + +--------------------------------------------------------------------- + + +7.1. The early part of an installation + +-------------- + +After the kernel has booted, it mounts the root file system via NFS +from the install server and starts the script /usr/sbin/fai ^[10]. +This script controls the sequence of the installation. No other +scripts in /etc/init.d/ are used. + +The configuration space is made available via the configured method +(an NFS mount by default) from the install server to the path defined +in $FAI ^[11] + + +7.2. Boot messages + +-------------- + +When booting the install client from network card with PXE you will +see some messages like this: + +Managed PC Boot Agent (MBA) v4.00 +Pre-boot eXecution Environment (PXE) v2.00 +DHCP MAC ADDR: 00 A2 A3 04 05 06 +DHCP.../ + +CLIENT MAC ADDR: 00 A2 A3 04 05 06 GUID: 3D6C4552 +CLIENT IP: 192.168.33.100 MASK: 255.255.255.0 DHCP IP: 192.168.33.250 +GATEWAY IP: 192.168.33.1 + +!PXE entry point found (we hope) at 9854:0106 via plan A +UNDI code segment at: 9854 len 5260 +UNDI data segment at: 921D len 63A2 +Getting cached packet 01 02 03 +My Ip address seems to be C0A82164 192.168.33.100 +ip=192.168.33.100:192.168.33.250:192.168.33.1:255.255.255.0 +BOOTIF=01-00-A2-A3-04-05-06 +SYSUUID= +TFTP prefix: fai/ +Trying to load pxelinux.cfg/C0A82164 + +Loading vmlinuz-6.1.0-17-amd64.................. +Loading initrd.img-6.1.0-17-amd64......................ready. + +At this point the install client has successfully received the +network config via DHCP and the kernel and initrd via TFTP. It now +boots the Linux kernel and the initrd. If everything went right, the +initrd mounts the nfsroot ^[12] and the FAI scripts are started. The +first thing you see is the red FAI copyright message. + + ------------------------------------------------- + Fully Automatic Installation - FAI + + 6.2 (c) 1999-2024 + Thomas Lange + ------------------------------------------------- + +Calling task_confdir +Kernel currently running: Linux 6.1.0-17-amd64 x86_64 GNU/Linux +Kernel parameters: BOOT_IMAGE=vmlinuz-6.1.0-17-amd64 initrd=initrd.img-6.1.0-17-amd64 \ + ip=dhcp rw root=192.168.33.250:/srv/fai/nfsroot rootovl FAI_FLAGS=verbose,sshd,createvt + FAI_ACTION=install FAI_CONFIG_SRC=nfs://faiserver/srv/fai/config +Reading /tmp/fai/boot.log +FAI_FLAGS: verbose sshd createvt +Monitoring to server faiserver enabled. +FAI_CONFIG_SRC is set to nfs://faiserver/srv/fai/config +Configuration space faiserver:/srv/fai/config mounted to /var/lib/fai/config +Source hook: setup.DEFAULT.sh +setup.DEFAULT.sh OK. +Calling task_setup +FAI_FLAGS: verbose sshd createvt +Press ctrl-c to interrupt FAI and to get a shell +Starting FAI execution - 20240117_194012 +Calling task_defclass +fai-class: Defining classes. +Executing /var/lib/fai/config/class/01-classes. +01-classes OK. +Executing /var/lib/fai/config/class/10-base-classes. +10-base-classes OK. +Executing /var/lib/fai/config/class/20-hwdetect.sh. +ens3 UP 52:54:00:11:23:01 +ens3 UP 192.168.33.101/24 fe80::5054:ff:fe11:2301/64 +New disklist: vda +20-hwdetect.sh OK. +Executing /var/lib/fai/config/class/40-parse-profiles.sh. +40-parse-profiles.sh OK. +Executing /var/lib/fai/config/class/41-warning.sh. +41-warning.sh OK. +Executing /var/lib/fai/config/class/50-host-classes. +50-host-classes OK. +Executing /var/lib/fai/config/class/60-misc. +60-misc OK. +Executing /var/lib/fai/config/class/85-efi-classes. +85-efi-classes OK. +List of all classes: DEFAULT LINUX AMD64 DHCPC FAIBASE DEBIAN DEMO GRUB_PC demohost2 LAST + +You can also see the list of FAI classes, that are defined for this +host. This list is very important for the rest of the installation. + +The first task is called confdir, which is responsible for getting +access to the config space. Here, we use an NFS mount from the +install server as you can see on the console (and later in the logs). + +FAI_CONFIG_SRC is set to nfs://faiserver/srv/fai/config +Configuration space faiserver:/srv/fai/config mounted to /var/lib/fai/config + +Before the installation is started ($FAI_ACTION=install) the computer +beeps three times. So, be careful when you hear three beeps but you +do not want to perform an installation and let FAI erase all yout +data on the local disk! + + +7.3. Rebooting the computer into the new system + +-------------- + +For rebooting the computer during or at the end of the installation +you should use the command faireboot in favour of the normal reboot +command. Use faireboot also if logged in from remote. If the +installation hasn’t finished, use faireboot -s, so the log files are +also copied to the install server. + +If the installation has finished successfully, the computer should +boot a small Debian system. You can login as user demo or root with +password fai. + + +7.4. Starting FAI (task confdir) + +-------------- + +After the install client has booted only the script /usr/sbin/fai is +executed. It will do some minimal initialization. The variable +$FAI_CONFIG_SRC ^[13] is used to get access to the FAI configuration +space which is then available in the directory $FAI ^[14]. FAI will +not proceed without the config space. + +You can access the config space using different methods. Supported +methods are: nfs:, file:, cvs:, svn: git:, hg:, http: and detect:. +See fai.conf(5) for a detailed description of these methods. + + +7.5. Defining classes and variables (tasks defclass and defvar) + +-------------- + +The command fai-class(1) executes scripts in $FAI/class for defining +classes. If the scripts write a string to stdout, this will be +defined as a class. Read all the details in the man page of fai-class +(1). + +After defining the classes, every file matching .var with a prefix +which matches a defined class is sourced to define variables. It must +contain valid shell code. + + +7.6. Partitioning local disks, creating file systems (task partition) + +-------------- + +For the disk partitioning exactly one disk configuration file from +$FAI/disk_config is selected using classes. + +The format of the disk configuration is similar to a fstab file. + +The partitioning tool setup-storage(8) performs all commands +necessary for creating the disk partition layout, software RAID, LVM +and for creating the file systems. Disks and partitions may easily be +referenced by disk1.1, disk2.4 etc. Read the manual page of +setup-storage(8) for a detailed description and some examples of the +format. + + +7.7. Debconf preseeding (task debconf) + +-------------- + +Files in $FAI/debconf are used for the usual debconf(7) preseeding if +the file names match a class name. + + +7.8. Installing software packages (task instsoft) + +-------------- + +The command install_packages(8) reads the config files from $FAI/ +package_config in a class based manner and installs software packages +on the new file system. + +It installs the packages using apt-get(8), aptitude(1), yum or other +package tools without any manual interaction needed. Package +dependecies are also resolved by the package tools. + +The format of the configuration files is described in [packageconfig] +. + +Additionaly FAI will install packages (.deb or .rpm') from the +directories $FAI/pkgs/. + + +7.9. Site specific customization (task configure) + +-------------- + +Often the default configurations of the software packages will not +meet your site-specific needs. You can call arbitrary scripts which +adjust the system configuration. Therefore the command fai-do-scripts +(1) executes scripts in $FAI/scripts in a class based manner. It is +possible to have several scripts of different types (shell, cfengine, +…) to be executed for one class. + +The default set of scripts in $FAI/scripts include examples for +installing Debian and Rocky Linux machines. They set the root +password, add a user account (set by '$username, default to demo), +set the timezone, configure the network for DHCP or using a fixed IP +address, setup grub and more. They should do a reasonable job for +your installation. You can edit them or add new scripts to match your +local needs. + +More information about these scripts are described in [cscripts]. + + +7.10. Saving log files (task savelog) + +-------------- + +When all tasks are finished, the log files are written to /var/log/ +fai/$HOSTNAME/install/ ^[15] on the new system and to the account on +the install server if $LOGUSER is defined (you have to enable this in +/srv/fai/config/class/FAIBASE.var). It is also possible to specify +another host as log saving destination through the variable +$LOGSERVER. If $LOGSERVER is not defined, FAI uses the variable +$SERVER which is only defined during an initial installation (by +get-boot-info). + +Additionally, two symlinks will be created to indicated the last +directory written to. The symlink last points to the log directory of +the last FAI action performed. The symlinks last-install and +last-sysinfo point to the directory of the last corresponding action. +By default log files will be copied to the log server using scp. You +can use the variable $FAI_LOGPROTO in file fai.conf(5) to choose +another method for saving logs to the remote server. Here’s an +example of the symlink structure: + +lrwxrwxrwx 1 fai fai 23 Dec 2 2013 last-sysinfo -> sysinfo-20131202_161237 +drwxr-xr-x 2 fai fai 4096 Dec 2 2013 sysinfo-20131202_161237 +drwxr-xr-x 2 fai fai 4096 Feb 14 2014 install-20140214_142150 +drwxr-xr-x 2 fai fai 4096 Dec 2 11:47 install-20141202_113918 +lrwxrwxrwx 1 fai fai 23 Dec 4 13:22 last-install -> install-20141204_131351 +lrwxrwxrwx 1 fai fai 23 Dec 4 13:22 last -> install-20141204_131351 +drwxr-xr-x 2 fai fai 4096 Dec 4 13:22 install-20141204_131351 + +Examples of the log files can be found at https://fai-project.org/ +logs. + + +7.11. Reboot the new installed system + +-------------- + +Before rebooting, the install client calls fai-chboot -d +on the install server, to disable its own PXELINUX configuration. +Otherwise, it would restart the installation during the next boot. +Normally this should boot the new installed system from its second +boot device, the local hard disk. + +At the end, the system is automatically rebooted if "reboot" was +added to $FAI_FLAGS. + + +--------------------------------------------------------------------- + +8. Advanced FAI topics + +--------------------------------------------------------------------- + + +8.1. Checking parameters received from DHCP servers + +-------------- + +If the install client boots you can check if all information from the +DHCP daemon are received correctly. The received information is +written to /tmp/fai/boot.log. An example of the result of a DHCP +request can be found in the sample log files. + + +8.2. Monitoring multiple client installations + +-------------- + +You can monitor the installation of all install clients with the +command fai-monitor(8). All clients check if this daemon is running +on the install server (or the machine defined by the variable +$monserver). Each time a task starts or ends, a message is sent. The +FAI monitor daemon prints this messages to standard output. There’s +also a graphical frontend available, called fai-monitor-gui(1). + +$ fai-monitor | fai-monitor-gui - & + + +8.3. Collecting Ethernet addresses for multiple hosts + +-------------- + +You have to collect all Ethernet (MAC) addresses of the install +clients and assign a host name and IP address to each client. To +collect the MAC addresses, boot your install clients. You can already +do this before any DHCP daemon is running in your subnet. They will +fail to boot (because of the missing DHCP or missing TFTP), but you +can still collect the MAC addresses. + +While the install clients are booting, they send broadcast packets to +the LAN. You can log the MAC addresses of these hosts by running the +following command simultaneously on the server: + +faiserver# tcpdump -qtel broadcast and port bootpc >/tmp/mac.list + +After the hosts have been sent some broadcast packets abort tcpdump +by typing ctrl-c. You get a list of all unique MAC addresses with +these commands: + +faiserver$ perl -ane 'print "\U$F[0]\n"' /tmp/mac.list|sort|uniq + +After that, you only have to assign these MAC addresses to host names +and IP addresses (/etc/ethers and /etc/hosts or corresponding NIS +maps). With this information you can configure your DHCP daemon (see +the section [bootdhcp]). ^[16] + +8.3.1. Debugging the network traffic + +If the client can’t successfully boot from the network card, use +tcpdump(8) to look for Ethernet packets between the install server +and the client. Search also for entries in several log files made by +tftpd(8) and dhcpd(8) : + +faiserver$ egrep "tftpd|dhcpd" /var/log/* + + +8.4. Details of PXE booting + +-------------- + +Here we describe the details of PXE booting, which are only needed if +you have problems when booting your install clients. + +Almost all modern bootable network cards support the PXE boot +environment. PXE is the Preboot Execution Environment. This requires +the PXELINUX bootloader and a special version of the TFTP daemon, +which is available in the Debian packages pxelinux and tftpd-hpa. PXE +booting also needs a DHCP server, so that the network card can +configure its IP parameters. This is the sequence of a PXE boot: + + * Network card of the client sends its MAC address + * DHCP server replies with IP configuration for the client + * Network card configures IP + * Install client gets the pxelinux.0 binary via TFTP + * Get the pxelinux.cfg/C0A8210C configuration file via TFTP + * C0A8210C is the IP address of the client in hexadecimal + * This configuration contains kernel, initrd and additional kernel + command line parameters, which was created by fai-chboot. + * Get the kernel and initrd via TFTP. + +Example of a pxelinux.cfg file: + +default fai-generated + +label fai-generated +kernel vmlinuz-6.1.0-17-amd64 +append initrd=initrd.img-6.1.0-17-amd64 ip=dhcp root=/srv/fai/nfsroot rootovl FAI_FLAGS=verbose,sshd,createvt FAI_CONFIG_SRC=nfs://faiserver/srv/fai/config FAI_ACTION=install + +See /usr/share/doc/syslinux/pxelinux.doc for more detailed +information about PXELINUX. FAI uses the lpxelinux.0 binary which +also supports loading the kernel and initrd via FTP or HTTP. The +command fai-chboot(8) supports this with the option -U. + + +8.5. Customizing your install server setup + +-------------- + + * local/faster package mirror + * different loguser + * local root pw inside nfsroot + +The configuration for the FAI package (not the configuration data for +the install clients) is defined in fai.conf(5). Definitions that are +only used for creating the nfsroot are located in nfsroot.conf(5). +Check these important variables in nfsroot.conf before calling +fai-setup or fai-make-nfsroot. + +FAI_DEBOOTSTRAP + Building the nfsroot uses the command debootstrap(8). It needs + the location of a Debian mirror and the name of the distribution + (like bullsseye, bookworm, sid) for which the basic Debian system + should be built. Do not use different distributions here and in / + etc/fai/apt/sources.list. This will create a broken nfsroot. +NFSROOT_ETC_HOSTS + This variable is only needed if the clients do not have access to + a DNS server. This multiline variable is added to /etc/hosts + inside the nfsroot. Then the install clients can access those + hosts by name without using DNS. + +The content of /etc/fai/apt/sources.list is used by the install +server and also by the clients. If your install server has multiple +network cards and different host names for each card (as for a +Beowulf server), use the install server name which is known by the +install clients. + +If you have problems running fai-setup, they usually stem from +fai-make-nfsroot(8) which is called by former command. Adding -v +gives you a more verbose output which helps you pinpoint the error. +The output is written to /var/log/fai/fai-make-nfsroot.log. ^[17] + +The setup also creates the account fai (defined by $LOGUSER) if not +already available. So you can add a user before calling fai-setup(8) +using the command adduser(8) and use this as your local account for +saving log files. The log files of all install clients are saved to +the home directory of this account. You should change the primary +group of this account, so this account has write permissions to /srv/ +tftp/fai in order to call fai-chboot for creating the PXE +configuration for the hosts. + +When you make changes to fai.conf, nfsroot.conf the nfsroot has to be +rebuilt by calling fai-make-nfsroot(8). If you only like to install a +new kernel package to the nfsroot add the flags -k or -K to +fai-make-nfsroot. This will not recreate your nfsroot, but only +updates your kernel and kernel modules inside the nfsroot or add +additional packages into the nfsroot. + + +8.6. Creating a FAI CD or and USB stick + +-------------- + +You can easily create an installation CD (or USB stick) of your +network installation setup. This will perform the same installation +and configuration from CD without the need of the install server. +Therefore you need to create a partial mirror of all Debian packages +needed for your FAI classes (using fai-mirror(1)). Then the command +fai-cd(8) will put this mirror, the nfsroot and the config space onto +a bootable CD. That’s it! + +To easily create the installation CD, you can use the following +command (for more tuning details see fai-cd(8)): + + faiserver# fai-cd -m fai-cd.iso + +This installation CD contains all data needed for the installation. +The command fai-cd(8) puts the nfsroot, the configuration space and a +subset of the Debian mirror onto a CD-ROM. A partial package mirror +is created using the command fai-mirror(1) which contains all +packages that are used by the classes used in your configuration +space. A sample ISO image is available at https://fai-project.org/ +fai-cd. + +Using the command dd(1) you can also create a bootable USB stick by +just writing the content of the ISO file to your USB stick (here the +stick is /dev/sdf). + + faiserver# dd if=fai-cd.iso of=/dev/sdf bs=1M + +mk-data-partition is a tool that extends an ISO (that will be copied +to an USB stick) or an USB stick containing an ISO with an ext4 or +exFAT partition and sets the file system label to MY-DATA. This +partition is automatically mounted to /media/data by FAI. You can +copy your own .deb packages into this data partition und the +subdiretories pkgs/. FAI will then install these packages +if the equivalent class is defined. + +Example how to use mk-data-partition: + +# mk-data-partition -s 1G -c faicd-large.iso A B + +The former command creates the data partition of size 1 Gbytes inside +the ISO file and copy directories A and B to it. You can then copy +the modified ISO onto an USB stick. + +If the ISO is already on the USB stick and if it’s available as dev/ +sdf, you can add a data partition of type exFAT will will use the +whole remaining part of the USB stick by using this command: + +# mk-data-partition -F /dev/sdf + + +8.7. Creating VM disk images using FAI + +-------------- + +The command fai-diskimage(8) creates disk images, which can be used +with a virtual machine like KVM, VMware, VirtualBox or a cloud +service like OpenStack, GCE, EC2 and others. The installation process +performs the normal FAI tasks on a raw disk image. After the +installation you can boot the disk image and have a running system. +The disk image can also be converted to qcow2 format. You do not need +to setup the FAI nfsroot when only using fai-diskimage. But you need +a basefile in your configuration space. Setting the variable +$FAI_BASEFILEURL will automatically download an appropriate base file +into your config space. + +Here’s an example how to create a raw disk image for a host called +cloud3, with a small set of software packages: + +# export FAI_BASEFILEURL=https://fai-project.org/download/basefiles/ +# fai-diskimage -vu cloud3 -S2G -cDEBIAN,BOOKWORM64,AMD64,FAIBASE,GRUB_PC,DHCPC,DEMO,CLOUD,LAST disk.raw + +This command will create a disk image called ubuntu.qcow2 for a +Ubuntu 16.04 desktop with hostname set to foobar. + +# export FAI_BASEFILEURL=https://fai-project.org/download/basefiles/ +# cl=DHCPC,UBUNTU,JAMMY,JAMMY64,AMD64,XORG,LAST +# fai-diskimage -Nvu foobar -S5G -c$cl ubuntu.qcow2 + +You can give disk images a try without installing FAI, if you visit +https://fai-project.org/FAIme/cloud + + +8.8. Creating a bootable live image + +-------------- + +Creating a bootable live ISO is easy with FAI. You only need two +steps. First, create your live environment using the command fai +dirinstall. Don’t forget to add the class LIVEISO. Then create the +live ISO using fai-cd: + +# cl="DEBIAN,BOOKWORM64,AMD64,FAIBASE,XFCE,XORG,DHCPC,DEMO,LIVEISO,LAST" +# LC_ALL=C fai -v dirinstall -u xfce33 -c $cl \ + -s file:///srv/fai/config /srv/xfce +# fai-cd -s500 -MH -d none -g /etc/fai/grub.cfg.live \ + -n /srv/xfce live.iso + +The nfsroot is not needed for a live ISO. Currently there’s no live +ISO of the install server available. + + +8.9. Building cross-architecture disk images + +-------------- + +Starting FAI 5.4 it’s now possible to build a disk image for +different architectures than the host is running. For example you can +build an image for 64-bit ARM architecture (aarch64) on a host +running on amd64 architecture. Here are the steps do to: + +# apt install qemu-system-arm qemu-user-static fai-server fai-setup-storage fai-doc qemu-utils +# fai-mk-configspace + +# export FAI_BASEFILEURL=https://fai-project.org/download/basefiles/ +# fai-diskimage -vu armhost -S2G -cDEFAULT,DHCPC,DEBIAN,ARM64,BUSTER_ARM64,FAIBASE,DEMO,CLOUD,LAST arm64.raw +# chown your_user_id arm64.raw +# cp /var/log/fai/armhost/last/vmlinuz* vmlinuz +# cp /var/log/fai/armhost/last/initrd.img* initrd + +Then you can run qemu as a normal user: + +> qemu-system-aarch64 -m 1000 -M virt,gic_version=3 -cpu cortex-a57 -drive file=arm64.raw,if=virtio,index=1 -no-reboot -nographic -name ARM64 -net nic,name=eth0,model=virtio -net user,name=eth0,-kernel vmlinuz -initrd initrd -append "console=ttyAMA0 rw ip=dhcp root=/dev/vda1 net.ifnames=0" + +This works similar for other architectures. Keep in mind, that qemu +network setup will have poor performance if not using the virtio +driver as above or tap devices. + +You can find the base files for many architectures at https:// +fai-project.org/download/basefiles/, or use mk-basefile to create +your own. + + +8.10. FAI rescue system + +-------------- + +If you set the variable $FAI_ACTION to sysinfo (for e.g. by using +fai-chboot -S), the client will not install a new system, but will +collect a lot of system information. If you set $FAI_ACTION to +inventory you will only get a few hardware information. Both actions +can be used for FAI as a rescue system. + +Type ctrl-c to get a shell or use Alt-F2 or Alt-F3 and you will get +another console terminal, if you have added createvt to $FAI_FLAGS. + +You now have a running Linux system on the install client without +using the local hard disk. Use this as a rescue system if your local +disk is damaged or the computer can’t boot properly from hard disk. +You will get a shell and you can execute various commands (dmesg, +lsmod, df, lspci, …). Look at the log file in /tmp/fai. There you can +find much information about the boot process. + +FAI mounts all file systems it finds on the local disks read only. It +also tells you on which partition a file /etc/fstab exists. When only +one file system table is found, the partitions are mounted according +to this information. Here’s an example: + +demohost:~# df -h + +Filesystem Size Used Avail Use% Mounted on +devtmpfs 4.0M 0 4.0M 0% /dev +tmpfs 2.0G 0 2.0G 0% /dev/shm +tmpfs 783M 18M 766M 3% /run +tmpfs 5.0M 0 5.0M 0% /run/lock +LiveOS_rootfs 783M 18M 766M 3% / +192.168.33.250:/srv/fai/config 59G 23G 24G 49% /var/lib/fai/config +/dev/mapper/vg1-root 7.3G 1.8G 5.2G 26% /target +/dev/vda1 459M 53M 378M 13% /target/boot +/dev/mapper/vg1-home 1.4G 72K 1.3G 1% /target/home + +This method can be used as a rescue environment! If you need a file +system with read-write access use the rwmount command: + +demohost# rwmount /target/home + + +8.11. FAI without NFS + +-------------- + +To boot into FAI and begin the installation sequence without using +the NFS protocol, you boot the client machine using PXE as usual and +then retrieve an image containing the nfsroot via http. + +To create an image, use fai-cd’s -S argument and -M to avoid setting +up a partial mirror within the image. + +faiserver# fai-cd -M -S squash.img + +Move this image to a directory from which it can be requested via +http (usually a directory served by the webserver) + +To now request the squashfs image, add the following to your kernel +command line, e.g. in your pxelinux configuration file for the client +with fai-chboot. + +root=live:http://faiserver/cskoeln/squash.img FAI_CONFIG_SRC=file:///var/lib/fai/config + +Replace faiserver with the domain name or IP of the machine your +squash image is served from. + + +8.12. Installing other distributions using a Debian nfsroot + +-------------- + +You can install all sorts of Linux distributions from a single Debian +nfsroot. Therefore you have to create a base.tar.xz of the +distribution you like to install and place it into the basefiles +directory. Then name it UBUNTU2204.tar.xz for example. An install +client which belongs to the class UBUNTU2204 then extracts this base +file into its empty file system. Additionally you have to adjust the +sources.list or similar configuration files which are needed for +specifying the location of the package repository. + +The tool rinse(8) is used for creating base files for distribution +like Rocky Linux, CentOS, openSUSE or Fedora. Some basefiles can be +downloaded from https://fai-project.org/download/basefiles/. + +The script mk-basefile in /usr/share/doc/fai-doc/examples/simple/ +basefiles/ helps creating this base files. + + +8.13. Creating chroot and virtualization environments + +-------------- + +If you have to create some chroot environments, or a virtualization +environment where you neither can nor want to run a normal Debian +Installer in to get to a working system (for example, Xen guest +domains), there is the FAI action dirinstall. By calling + +faiserver# fai dirinstall + +and using either the option -c or -N you get a FAI +installation, without the partitioning action, right into the target +directory. The host name for the target installation can be specified +using -u + +This, for example, can be used to combine FAI with the tool xen-tools +, which helps you to build Xen guest domains. xen-tools are very nice +for generating configuration files and block devices for new guests +based on simple commands and/or configuration files, but they can +only assign one role per installation for customization. FAI-users +need and want more, as they are used to have the class system. They +get them even in xen-tools installations, by using the following code +as a xen-tools role script: + +#!/bin/sh +TARGET=$1 +CMD="fai -N -v -u ${hostname} dirinstall $TARGET" +echo running $CMD +$CMD + +Then, you should set the variable install=0 in the config of +xen-tools for that host. + + +8.14. Using FAI for updates + +-------------- + +FAI can also do updates of already running systems, without a +re-installation from scratch. This is called softupdate. A FAI +softupdate skips the tasks which are not suitable for updating a +running system, like partitioning the hard disks and creating file +systems. Instead, it only executes the tasks for updating and +installing software packages and calling the customization scripts. + +To run a softupdate call: + +# fai -v -s nfs://faiserver/srv/fai/config softupdate + +By default, a softupdate uses the list of classes defined during the +initial installation. Make sure to set the variable $LOGSERVER (done +in a class/*.var file) if FAI should save the log files to a remote +machine. + +It’s up to you, how to start a softupdate on a bigger number of +hosts. You may do the softupdate on a regular basis via cron or you +can use tools like clusterssh(1) to start a softupdate via a push on +a list of hosts. + +Keep in mind, that the customization scripts are run every time you +do a softupdate. That means, they have to be idempotent i.e. the +result of their operation should always produce the same result, even +when they run more than once. + +For example appending a line to a file must not done via this code: + +$ echo "some strings" >> /etc/fstab + +Instead use the command ainsl(1) in a shell script or use cfengine’s +function AppendIfNoSuchLine. + +All commands in the customization script must be capable of modifying +the target file system wether it’s available in /target during the +initial installation or wether it’s the normal file system relative +to / during softupdate. + +Here are some variable that help writing these scripts: + +$target + Points to the root directory of the client, which is /target + during installation and / during a softupdate. +$FAI_ROOT + It’s the same value as $target. For historic reasons we have both + these variables in FAI. +$ROOTCMD + In case of the installation this is an alias for chroot $target + in case of softupdate it’s just empty. You can prepend this to + commands if you need to run a command inside the clients target + file system via chroot. +$FAI_ACTION + If you need to call code depending on the FAI action performed, + you can use this variable. It contains the currently executed + action: install, softupdate, dirinstall, sysinfo, inventory or + your own defined action. + + +8.15. How to install 32-bit OS from a 64-bit OS + +-------------- + +To install a computer with a 32-bit OS, you need an i386 nfsroot. +Creating this 32-bit nfsroot on an install server running amd64 is +quite simple. Install and set up the FAI packages. Then copy your FAI +config files to a new subdirectory. + +faiserver# cp -a /etc/fai /etc/fai-i386 + +Edit the variable $FAI_DEBOOTSTRAP_OPTS in /etc/fai-i386/nfsroot.conf +and add the option --arch i386. Also choose a different directory for +your new nfsroot. Here are the two lines after editing. + +NFSROOT=/srv/fai/nfsroot-i386 +FAI_DEBOOTSTRAP_OPTS="--arch i386 --exclude=info --include=aptitude"" + +Now call fai-make-nfsroot which creates the 32-bit nfsroot in /srv/ +fai/nfsroot-i386 + +faiserver# fai-make-nfsroot -v -C/etc/fai-i386 + +Creating a partial mirror using fai-mirror(1) that is needed for a +bootable CD or USB stick is also possible on a different +architecture. You have to specify the architecture when calling +fai-mirror. + +$ fai-mirror -m800 -B -a i386 -v -cDEFAULT,DEBIAN,FAIBASE,I386 /srv/mirror-i386 + +That’s all! + + +8.16. Aborting the installation when an error occurs + +-------------- + +Every task and hook can call the function task_error to send an error +value to the installation. This error will appear in the log file and +can be shown in the fai-monitor-gui(1). The error value is also +checked against the variable $STOP_ON_ERROR which is set to 700 by +default. If the error value is greater than $STOP_ON_ERROR the +installation will stop immediately. In a hook, just add a call like +this: + +task_error + +It is comfortable to call task_error with $? as second parameter, for +e.g. if you want to set an error value of 123 use this + + +task_error 123 $? + +Then the task error is only set if the preceding command failed with +some error. The same syntax can be used by the scripts in the class +subdirectory ending in .sh. + +A special case are scripts inside the class/ subdirectory that does +not end in .sh. In those scripts you have to call task_error with 1 +as third parameter. As an example you can use those two variants for +setting the value to 123 + +task_error 123 $? 1 + +or + +task_error 123 1 1 + +The latter command always sets the task error to 123 regardless of +the value of $?. If the error value is greater than $STOP_ON_ERROR, +the installation will abort immediately. + +The error values are grouped into four categories + +normal or info messages: 1xx, 2xx +warnings: 3xx, 4xx +minor errors: 5xx, 6xx +errors: 7xx, 8xx + +The fai-monitor-gui has 4 different icons for these error categories. + + +--------------------------------------------------------------------- + +9. Various hints and details + +--------------------------------------------------------------------- + + +9.1. The list of tasks + +-------------- + +Most tasks of the installation are defined as subroutines which are +defined in /usr/lib/fai/subroutines (e.g. task_instsoft). Some are +external shell scripts located in /usr/lib/fai/. They are called via +a superior subroutine called task. This subroutine calls hooks if +available and then calls the task (defined as task_). A task +and its hooks can be skipped on demand by using the command skiptask +(). + +Now follows the description of all tasks, listed in the order they +are executed. + +confdir + + The kernel appended parameters may define variables, the syslog + daemon is started. Network parameters are fetched from a DHCP + server and are stored in boot.log. The DNS resolver configuration + file is created. + + The location of the configuration space is defined by the + variable $FAI_CONFIG_SRC. + + After that, the file $FAI/hooks/subroutines is sourced if it + exists. Using this file, you can define your own subroutines or + override the definition of FAI’s subroutines. + +setup + This task sets the system time, all $FAI_FLAGS are defined and + two additional virtual terminals are opened on demand. A secure + shell daemon is started on demand for remote logins. +defclass + Calls fai-class(1) to define classes using scripts and files in + $FAI/class and classes from /tmp/fai/additional-classes and the + variable $ADDCLASSES. The list of all defined classes is stored + in the variable $classes and saved to /tmp/fai/FAI_CLASSES. +defvar + Sources all files $FAI/class/*.var for every defined class. If a + hook has written some variable definitions to the file $LOGDIR/ + additional.var, this file is also sourced. +action + Depending on the value of $FAI_ACTION this subroutine decides + which action FAI should perform. The default available actions + are: sysinfo, install, inventory, dirinstall and softupdate. If + $FAI_ACTION has another value, a user defined action is called if + a file $FAI/hooks/$FAI_ACTION exists. So you can easily define + your own actions. +sysinfo + Called when no installation is performed but the action is + sysinfo. It shows information about the detected hardware and + mounts the local hard disks read only to /target/partitionname or + with regard to a fstab file found inside a partition. Log files + are stored to the install server. +inventory + A short list of system information is printed. +install + This task controls the installation sequence. You will hear three + beeps before the installation starts. The major work is to call + other tasks and to save the output to /tmp/fai/fai.log. If you + have any problems during installation, look at all files in /tmp/ + fai/. You can find examples of the log files at https:// + fai-project.org/logs/. +dirinstall + Install into a directory, not onto a local disk. Use this for + creating chroot environments. +softupdate + This task, executed inside a running system via the fai(8) + command line interface, performs a softupdate. See chapter + [softupdate] for details. +partition + Calls setup-storage(8) to partition the hard disks and to create + file systems. The task writes variable definitions for the root + and boot partition and device ($ROOT_PARTITION, $BOOT_PARTITION, + $BOOT_DEVICE) to /tmp/fai/disk_var.sh and creates a fstab file + for the new system. +mountdisks + Mounts the created partitions according to the created /tmp/fai/ + fstab file relative to $FAI_ROOT. +extrbase + Extracts a minimal system after that a chroot can be made into + it. By default the base tar file /var/tmp/base.tar.xz will be + extracted. Also files matching a class name in $FAI/basefiles/ + are used for unpacking a different tar file depending on classes + defined. This can be used for installing different Linux + distributions than the one used for creating the nfsroot. The + default file base.tar.xz is a snapshot of a basic Debian system + created by debootstrap(8). This task uses the variable + FAI_BASEFILEURL for fetching the base file via FTP, HTTPS or HTTP + if it’s defined. +debconf + Calls fai-debconf(1) to set the values for the debconf preseeding + database. +repository + Prepare access to the package repository by preparing the apt + configuration. This can also add repository keys in a class based + manner from files like CLASSNAME.gpg in the directory + package_config. +updatebase + Updates the base packages of the new system and updates the list + of available packages. It also fakes some commands (called + diversions) inside the new installed system using dpkg-divert(8), + so no daemons will be started during the installation. +instsoft + Installs the desired software packages using class files in $FAI/ + package_config/. +configure + Calls scripts in $FAI/scripts/ and its subdirectories for every + defined class. +tests + Calls test scripts in $FAI/tests/ and its subdirectories for + every defined class. +finish + Unmounts all file systems in the new installed system and removes + diversions of files using the command fai-divert. +chboot + Changes the PXE configuration for a host on the install server + which indicates which PXELINUX configuration to load on the next + boot from network card via TFTP. Therefore the fai-chboot(8) + command is executed remotely on the install server. +savelog + Saves log files to local disk and to the account $LOGUSER on + $LOGSERVER (defaults to the install server). +faiend + Wait for background jobs to finish (e.g. emacs compiling lisp + files) and automatically reboots the install clients or waits for + manual input before reboot. + + +9.2. Automated tests + +-------------- + +After the customization scripts are executed, FAI will execute some +tests if available. Using these test, you can check for errors of the +installation. Test scripts are called via fai-do-scripts(1) and +should append its messages to $LOGDIR/test.log. A Perl module +including some useful subroutines can be found in Faitest.pm. A test +can also define a new class for executing another tests during next +boot via the variable $ADDCLASSES. + + +9.3.  Autodiscover + +-------------- + +In FAI 5.0 we released a feature that allows clients to search for +the faiserver in their respective subnetwork. This lifts the +necessity of having to collect every client’s MAC address and +configuring the DHCP daemon. + +This is done by booting from a small FAI autodiscover bootmedium (CD, +USB, etc.), which can be created via the command: + +faiserver# fai-cd -A autodiscover.iso + +The image is roughly 25MB in size and scans the subnet for a FAI +server. By default it shows a menu with all profiles available in the +configuration space in the same manner as the menu flag does. From +this menu, you can select the installation type you wish to perform. + +For the clients to find the faiserver, the faiserver must run +fai-monitor. + + +9.4. Changing the boot device + +-------------- + +Changing the boot sequence is normally done in the BIOS setup. But +you can’t change the BIOS from a running Linux system. + +So, the boot sequence of the BIOS will remain unchanged and your +computer should always boot first from its network card and the +second boot device should be the local disk. Then you can change the +boot device of the client by creating different PXELINUX +configurations. This will define if an installation should be +performed, or if the client should to boot from local disk. This is +done using fai-chboot(8). + + +9.5. How to create a local Debian mirror + +-------------- + +The utility mkdebmirror ^[18] can be used for creating your own local +Debian mirror. This script uses debmirror(1). A partial Debian mirror +for amd64 architecture for Debian 11 and 12 (aka bullseye and +bookworm) without the source packages needs about 180GB of disk +space. Accessing the mirror via HTTP will be the default way in most +cases. To see more output from the script call mkdebmirror -v. A root +account is not necessary to create and maintain the Debian mirror. + +To use HTTP access to the local Debian mirror, install a web server +and create a symlink to the local directory where your mirror is +located: + +faiserver# apt-get install apache2 +faiserver# ln -s /files/scratch/debmirror /var/www/html/debmirror + +Create a file sources.list(5) in /etc/fai/apt which gives access to +your Debian mirror. Also add the IP-address of the HTTP server to the +variable $NFSROOT_ETC_HOSTS in nfsroot.conf if the install clients +have no DNS resolving. + + +9.6. Small hints + +-------------- + + * When using HTTP access to a Debian mirror, the local /var + partition on all install clients must be big enough to keep the + downloaded Debian packages. Do not try with less than 250 Mbytes + unless you know why. You can limit the number of packages + installed at a time with the variable $MAXPACKAGES. + * You can remove the red logo on the install client by simply + calling reset once. If will also not appear if you create a file + using this command on the install server: + +touch /srv/fai/nfsroot/.nocolorlogo + + * A list of variables used by FAI can be found at https:// + wiki.fai-project.org/index.php/Variables. + * You can shorten some customization scripts by using one single + fcopy command fcopy -r /. + * If you rebuild the nfsroot, you will create a new ssh host key + inside the nfsroot. Then logging in to an install client may + fail, because the host key changes. You can use this: + +$ ssh -o StrictHostKeyChecking=no root@installclient + + * You can also delete the host entry on your install client in your + ~/.ssh/known_hosts file by using the ssh-keygen -R command. + * In the tasks chboot and savelog, a connection using secure shell + is opened to the FAI server (see [isavelog]). To ensure that this + works non-interactively, a proper entry in NFSROOT/root/.ssh/ + known_hosts must be created. When using fai-setup, this is done + automatically, but it may require manual editing in case the name + of your FAI server was not determined correctly. If you stumble + over ssh connections that require typing "yes" to accept the host + key during installation, please check the contents of your + NFSROOT/root/.ssh/known_hosts file + * A list of all local hard disks is stored in $disklist. It’s + defined after set_disk_info is called. + * There are multiple functions for generating a customized disk + list. See fai-disk-info for an example. + + + set_bootstick() + + grepv_disks() + + grep_disks() + + notmatchdisks() + + matchdisks() + + smallestdisk() + + largestdisk() + + all_disks_by_size() + + all_disks_and_size() + + once_only() + + checkdisk() + + disks_by_id() + * Use fai-divert -a if a postinst script calls a configuration + program, e.g. the postinst script for package apache calls + apacheconfig, which needs manual input. You can fake the + configuration program so the installation can be fully automatic. + * Sometimes the installation seems to stop, but often there’s only + a postinstall script of a software package that requires manual + input from the console. Change to another virtual terminal and + look which process is running with tools like top(1) and pstree + (1). You can add debug to FAI_FLAGS to make the installation + process show all output from the postinst scripts on the console + and get its input also from the console. + * How can I define classes on the kernel command line? + + Read the man page of fai-class(8). If you like to define some + additional classes (for e.g. A,B,C) on the kernel command line + add this: ADDCLASSES=A,B,C + + * How to use a custom kernel inside the nfsroot? + + Build your customized kernel by building a kernel package using + make-kpkg(8) and use the option --initrd. Copy this Debian + package to a local repository and add it to /etc/fai/ + sources.list. Add the name of your package to /etc/fai/NFSROOT. + Then call + + # fai-make-nfsroot -k + + * How to use the nfsroot as system for diskless clients? + + https://wiki.fai-project.org/index.php/ + Use_nfsroot_for_diskless_clients + + * How to serve multiple nfsroot directories on one FAI server? + + If you want to serve multiple nfsroot directories, you need to + create specific config directories in /etc for FAI, like /etc/ + fai-buster and /etc/fai-bookworm. Then you need to set the + $NFSROOT variables to different directories and run + +faiserver#fai-make-nfsroot -C /etc/fai-buster + + +9.7. flag_reboot (FAI_FLAGS) + +-------------- + +If flag_reboot is set, by adding "reboot" to $FAI_FLAGS, your client +machine will reboot after the task faiend has finished. This is true +for network as well as bootmedium installations. + + +9.8. Log files + +-------------- + +FAI is creating several log files. During installation they are +stored in /tmp/fai on the install client itself. At the end of the +installation they will be copied to the install server (see +[isavelog]). After the install client rebooted into his newly +installed system, you can find the FAI logs in /var/log/fai. Log +files are also created when doing the softupdate or dirinstall +action. + +On the faiserver, you can find the (remote) log files under the ~fai +directory. + +Sample log files from successfully installed computers are available +on https://fai-project.org/logs. These a some log files which are +created by FAI. + +FAI_CLASSES + Contains a list of all classes defined. +dmesg.log + Output of the dmesg command. Contains useful messages of the + kernel ring buffer. +fai.log + The main log file. Contains all important information. You should + always read this file. +boot.log + A list of variables of network parameters, mostly defined by the + DHCP daemon. +format.log + Output of the partition tool setup-storage(8). +scripts.log + Output of all scripts, that are used for customization. +variables.log + A list of all shell variables which are available during an + installation. +error.log + A summary of possible errors in all log files. +disk_var.sh + A list of variables that contain information about devices and + partitions to boot from, the root partition and a list of swap + devices. These information is used by some customization scripts + (e.g. GRUB_PC/10-setup). + +If the installation process finishes, the hook savelog.LAST.sh +searches all log files for common errors and writes them to the file +error.log. So, you should first look into this file for errors. Also +the file status.log give you the exit code of the last command +executed in a script. To be sure, you should look for more details in +all log files. + + +9.9. How to use HTTP for PXE boot + +-------------- + +fai-make-nfsroot now uses the lpxelinux.0 binary which already +supports transfer of the kernel and initrd via http (additional to +tftp). You only have to enable HTTP access to the tftp directory: + +cd /var/www/html +ln -s /srv/tftp/fai + +Add -U URL to the fai-chboot call. For example: + +fai-chboot -U http://faiserver/fai -IFv ....... + + +--------------------------------------------------------------------- + +10. Troubleshooting + +--------------------------------------------------------------------- + + +10.1. Boot errors + +-------------- + +The following error message indicates that your install client +doesn’t get an answer from a DHCP server. Check your cables or start +the dhcpd(8) daemon with the debug flag enabled. + + PXE-E51: No DHCP or BOOTP offers received + Network boot aborted + +If you do not see the following message, the install kernel could not +detect your network card, for example because of a missing driver: + +Starting dhcp for interface eth0 +dhcp: PREINIT eth0 up +dhcp: BOND setting eth + +Check the initrd in the nfsroot (lsinird) if the kernel driver of +your network card is included there and check if you like to add the +package firmware-linux-nonfree in /etc/fai/NFSROOT and rebuild the +initrd by calling fai-make-nfsroot -k. You may also add a driver to / +srv/fai/nfsroot/etc/dracut.conf in the line add_drivers+=. + +This is the error message you will see, when your network card is +working, but the install server does not export the nfsroot directory +to the install clients, This is often caused by missing NFS +permissions on the server side. + +Starting dhcp for interface eth0 +dhcp: PREINIT eth0 up +dhcp: BOND setting eth +mount.nfs: access denied by server while mounting 192.168.33.250:/srv/fai/nfsroot +. +. +dracut Warning: Could not boot +. +Dropping to debug shell +dracut:/# + +Now, you are inside the emergency shell of the initrd which was +created by dracut(8). You will get a shell prompt, and can look at +the log files. For more information about debugging the early boot +process using dracut see dracut.cmdline(7) + +Use the following command on the install server to see which +directories are exported from the install server (named faiserver): + +$ showmount -e faiserver + + +--------------------------------------------------------------------- + +^[1] Solaris 8 Advanced Installation Guide at "https:// +docs.oracle.com/cd/E19455-01/806-0957/806-0957.pdf + +^[2] http://www.science.uva.nl/pub/solaris/auto-install + +^[3] https://wiki.fai-project.org/index.php/ +VirtualBox_for_your_first_FAI_installation + +^[4] Cette installation utilisera environ 2GB d’espace dans /tmp. + +^[5] It’s also possible to use only the configuration file with the +highest priority since the order of classes define a priority from +low to high within the list of classes. + +^[6] If you want to use a faster mirror, adjust the URL in /etc/fai/ +apt/sources.list and FAI_DEBOOTSTRAP in /etc/fai/nfsroot.conf before +calling fai-setup. + +^[7] This will call fai-make-nfsroot(8) internally. + +^[8] These files need not belong to the root account. + +^[9] You may also add this into your Domain Name System (DNS) + +^[10] Since the root file system on the clients is mounted via NFS, +fai is located in /srv/fai/nfsroot/usr/sbin on the install server. + +^[11] $FAI is an internal variable used by the FAI scripts. By +default the path is /var/lib/fai/config. + +^[12] /srv/fai/nfsroot from the install server via NFS + +^[13] It is defined on the kernel command line + +^[14] /var/lib/fai/config + +^[15] /var/log/fai/localhost/install/ is a link to this directory. + +^[16] I recommend to write the MAC addresses (last three bytes will +suffice if you have network cards from the same vendor) and the host +name in the front of each chassis. + +^[17] For debugging purpose it may help to enter the chroot +environment manually using this command. faiserver# chroot /srv/fai/ +nfsroot bash + +^[18] You can find the script in /usr/share/doc/fai-doc/examples/ +utils/ + diff --git a/doc/fai-guide_fr.txt b/doc/fai-guide_fr.txt new file mode 100644 index 000000000..b05f7e073 --- /dev/null +++ b/doc/fai-guide_fr.txt @@ -0,0 +1,2737 @@ +//// + -*- Doc -*- +//// + +FAI Guide (Fully Automatic Installation) +======================================== +Thomas Lange +Mer. 10 Avr 2025 +:Date: une date +:Revision: 6.4 + +:nfsrootsize: 1.1 + +//// + => _ +path '' + => + + =>` ` (comme manref) + => _ +//// + +Une version plus ancienne de ce guide en français est disponible à +https://fai-project.org/fai-guide-fr. + +Résumé +------ +FAI est un système non-interactif pour installer, configurer et gérer des +systèmes Linux et les configurations de logiciels sur des ordinateurs comme sur des machines +virtuelles et des environnements chroot, depuis des petits réseaux jusqu'à de +grandes infrastructures et de grands clusters. + +Ce manuel décrit le logiciel Fully Automatic Installation (installation entièrement automatique). +Cela inclut l’installation des paquets, la configuration du serveur, la +création de la configuration et la gestion des erreurs. + + +(c) 2000-2025 Thomas Lange + + +Ce manuel est un logiciel libre; Vous pouvez le redistribuer et / ou le +modifier selon les termes de la Licence Publique Générale GNU publiée +par la Free Software Foundation; Soit la version 2, soit (à votre choix) +toute version ultérieure. + +Ceci est distribué dans l’espoir qu’il sera utile, mais sans aucune +garantie ; Sans même la garantie implicite de qualité marchande ou +d’adaptation à un usage particulier. Pour plus de détails, consultez la +License Générale Publique GNU. + +Une copie de la Licence Générale Publique GNU est disponible sous la forme +/usr/share/common-licenses/GPL dans la distribution Debian GNU/Linux ou +sur le World Wide Web sur le site GNU Vous pouvez également l’obtenir en +écrivant à la Free Software Foundation , Inc., 59 Temple Place - Suite +330, Boston, MA 02111-1307, États-Unis. + +<<< + + +== [[introduction]]Introduction + +=== [[availability]]Disponibilité + + +Page d'accueil:: +https://fai-project.org + +Wiki FAI:: +https://wiki.fai-project.org + +Téléchargement:: +https://fai-project.org/download + +Entrée pour 'sources.list':: +`deb https://fai-project.org/download bookworm koeln` + +Pages de manuel:: +https://fai-project.org/doc/man/ + +Listes de diffusion:: +https://lists.uni-koeln.de/mailman/listinfo/linux-fai + +Retour d'information:: +Envoyez vos réflexions et vos commentaires à mailto:fai@fai-project.org[] ou +à la liste de diffusion. + +Boguess:: +Utiliser le système de suivi des bogues Debian (BTS) https://bugs.debian.org/src:fai + +Changements visibles par l’utilisateur:: +http://fai-project.org/NEWS + +Arbre source via git:: +git clone git://github.com/faiproject/fai.git + +Voir l’arbre source avec https:: + https://github.com/faiproject/fai + + +Les pages man incluent toujours des informations à jour et beaucoup de +détails sur toutes les commandes FAI. Alors, n’oubliez pas de les lire +attentivement. Lisez maintenant ce manuel, puis profitez de +l’installation entièrement automatique et de votre temps économisé. + +=== [[motivation]]Motivation + +Avez-vous déjà effectué des installations identiques d’un système +d’exploitation à plusieurs reprises? Souhaitez-vous être en mesure +d’installer un cluster Linux avec des dizaines de nœuds d'un seul coup? + +Répéter la même tâche encore et encore est ennuyeux -- et conduira +certainement à des erreurs. Aussi beaucoup de temps pourrait être sauvé +si les installations étaient faites automatiquement. Un processus +d’installation avec interaction manuelle ne peut pas passer à l'échelle. Mais les +grappes (clusters) ont l’habitude de croître au fil des ans. Pensez à long terme +plutôt que de planifier seulement quelques mois dans l’avenir. + +En 1999, j’ai dû effectuer une installation d’un cluster Linux avec un +serveur et 16 clients. Puisque j’ai eu beaucoup d’expérience en faisant +des installations automatiques des systèmes d’exploitation de Solaris +sur le matériel de SUN SPARC, l’idée de construire une installation +automatique pour Debian est née. Solaris dispose d’une fonctionnalité +d’installation automatique appelée JumpStart +footnote:[Solaris 8 Advanced Installation Guide at "https://docs.oracle.com/cd/E19455-01/806-0957/806-0957.pdf]. +En conjonction avec les scripts d’auto-installation de Casper Dik +footnote:[http://www.science.uva.nl/pub/solaris/auto-install], +Je pouvais épargner beaucoup de temps non seulement pour chaque nouvel +ordinateur de SUN, mais aussi pour la réinstallation des postes de +travail existants. Par exemple, j’ai dû construire un LAN temporaire +avec quatre stations de travail SUN pour une conférence, qui a duré +seulement quelques jours. J’ai retiré ces postes de travail de notre +réseau de recherche habituel et mis en place une nouvelle installation +pour la conférence. Quand elle a été terminée, j’ai simplement réintégré les +postes de travail dans le réseau de recherche, redémarré une seule fois, +et après une demi-heure, tout était opérationnel comme avant. La +configuration de tous les postes de travail était exactement la même +qu’avant la conférence, car tout était effectué par le même processus +d’installation. J’ai également utilisé l’installation automatique pour +réinstaller un poste de travail après qu'un disque dur endommagé ait été +remplacé. Il m’a fallu deux semaines pour recevoir le nouveau disque +dur, mais seulement quelques minutes après l’installation du nouveau +disque, le poste de travail fonctionnait comme avant. Et c’est pourquoi +j’ai choisi d’adapter cette technique à un cluster de PC sous Linux. + + + + +=== [[work]]Comment fonctionne FAI + +Le client d’installation qui sera installé à l’aide de FAI, est démarré +via une carte réseau ou à partir d’un CD ou d’une clé USB. Il obtient +une adresse IP et démarre un noyau Linux qui monte son système de +fichiers racine via NFS (nfsroot) du serveur d’installation. Une fois le +noyau démarré, le script de démarrage FAI exécute l’installation +automatique qui n’a pas besoin d’interaction. Tout d’abord, les disques +durs seront partitionnés, les systèmes de fichiers seront créés et des +paquets logiciels seront ensuite installés. Après cela, le nouveau système +d’exploitation installé est configuré selon vos besoins locaux en +utilisant quelques scripts. Enfin, le nouveau système d’exploitation +sera démarré à partir du disque local. + +Les détails sur la façon d’installer l’ordinateur (la configuration) +sont stockés dans l’espace de configuration sur le serveur d’installation. +Les fichiers de configuration sont répartis entre des groupes +d’ordinateurs s’ils sont similaires, en utilisant le concept de classe. +Vous n’avez donc pas besoin de créer une configuration pour chaque +nouvel hôte. Ainsi, FAI est une méthode évolutive pour +installer un gros cluster avec un grand nombre de nœuds même si leur +configuration n’est pas identique. + +FAI peut également être utilisé comme un système de sauvetage ou pour +l’inventaire matériel. Vous pouvez démarrer votre ordinateur, mais il +n’effectuera pas une installation. Au lieu de cela, il exécutera un +Debian GNU / Linux entièrement fonctionnel sans utiliser les disques +durs locaux. Ensuite, vous pouvez effectuer une connexion à distance et +sauvegarder ou restaurer une partition de disque, vérifier un système de +fichiers, inspecter le matériel ou effectuer toute autre tâche. + + +=== [[features]]Caractéristiques + +* On peut faire une installation entièrement automatisée. +* Installation très rapide sans surveillance. +* Système flexible grâce à un concept de classe simple. +* Mise à jour des systèmes en cours d’exécution sans réinstallation. +* Images « Cloud » pour un environnement de virtualisation. +* Les hôtes peuvent démarrer à partir d’une carte réseau, d’un CD, d’une clé USB. +* Création simple d’une image ISO vive ou pour l'installation. +* Prise en charge de PXE avec la méthode de démarrage DHCP. +* Support des systèmes de fichiers ReiserFS, ext3/ext4, btrfs et XFS. +* Support logiciel RAID et LVM. Support LUKS. +* Détection automatique du matériel. +* On peut déployer Debian, Ubuntu, Rocky Linux, CentOS, AlmaLinux, SuSE +* Possibilité de connexion à distance via ssh lors du processus d’installation. +* Toutes les configurations similaires sont partagées entre tous les les clients d’installation. +* Les fichiers journaux de toutes les installations sont enregistrés sur le serveur d’installation. +* Prise en charge des scripts Shell, Perl, Python, Ruby, expect et CFEngine lors de l'étape de personnalisation. +* Prise en charge de nombreux protocoles comme NFS, FTP, HTTP, git. +* Peut être utilisé comme un système de sauvetage et pour l’inventaire matériel. +* Prise en charge de clients sans disque. +* Prise en charge trans-architecture, par exemple pour des appareils embarqués (embedded devices). +* Ajoutez facilement vos propres fonctions via des hooks ou modifiez le comportement par défaut. +* Prise en charge du clonage de machines utilisant des images de disque. + + +=== La durée d'installation + +La durée d’installation est déterminée par la quantité de logiciel et la +vitesse du disque dur. Voici quelques exemples de durée. Tous les +clients d’installation avaient une carte réseau 1Gbit installée. + +[width="80%",cols="<4,^2,<3,>4,>2",options="header"] +|================================================================= +| CPU | RAM | Disque | Logiciels installés | durée +| i7-3770T 2.50GHz | 8GB| SSD | 6 GB logiciel | 8.5 min +| Core-i7 3.2GHz | 6GB| SATA disk| 4.3GB logiciel | 7 min +| Core-i7 3.2GHz | 6GB| SATA disk| 471 MB logiciel | 77sec +| Intel Core2 Duo | 2GB| SATA disk| 3 GB logiciel | 14 min +|================================================================= + + + + +== [[impatient]]Quickstart - Pour l'utilisateur impatient + +=== [[first]]Ma première installation + +Sans plus tarder, cette section fournira une démonstration rapide et +facile d’une installation entièrement automatique à l’aide du CD FAI et +d’une machine virtuelle. + +Il suffit de télécharger l' image ISO du CD à partir de +https://fai-project.org/fai-cd et de démarrer votre VM à l’aide de ce CD. +Vous verrez un menu grub où vous pouvez choisir parmi différents types +d’installation. + +Cette installation s’exécutera sans serveur d’installation. +L’installation à partir du CD est identique à celle exécutée dans un +environnement réseau à l’aide du serveur d’installation FAI, et peut être aussi +effectuée à l'aide d'une clé USB sur un ordinateur physique. + +On peut aussi créer soi-même une image FAI (installation entièrement automatique) +à la page web https://fai-project.org/FAIme sans avoir besoin d'installer +FAI sur son ordinateur. + + +=== [[cdserver]]Ma première installation à l'aide d'un serveur + +Nous allons créer un réseau privé et lancer deux machines vituelles. L'une +deviendra votre propre serveur FAI, l'autre sera un client d'installation. + +Si vous avez l’intention d’utiliser VMware ou VirtualBox, assurez-vous +que votre client utilise une connexion réseau pontée (bridged network). +On trouve une description détaillée dans le wiki FAI +footnote:[https://wiki.fai-project.org/index.php/VirtualBox_for_your_first_FAI_installation]. +on ne peut pas utiliser des interfaces réseau pontées via le réseau sans +fil, car la plupart des cartes réseau WiFi ne prennent pas en charge +cette fonctionnalité. + +Quand on utilise Qemu/KVM et le script `fai-kvm` on peut créer le réseau à l'aide de +la commande `fai-mk-network`. Il faut commencer par installer quelques paquets logiciels + +---- +# apt-get install qemu-system-gui qemu-kvm qemu-utils +---- + +La commande ci-dessous met en place un réseau privé avec un pont logiciel et plusieurs +TAPs réseau +footnote:[https://fr.wikipedia.org/wiki/TAP_r%C3%A9seau] +appartenant à l'utilisateur ++. +---- +fai-mk-network +---- + +Après cela, vous pouvez utiliser fai-kvm (-h vous aidera) pour démarrer +des machines virtuelles en utilisant KVM qui sont connectés à ce réseau +privé. Faites attention. Par défaut, fai-kvm créera les images de disque +pour les machines virtuelles dans `+/tmp+`, qui est un disque RAM sur la plupart des +systèmes. Il n’y a aucun problème à créer une image de disque vide de +20G dans /tmp (même si cette partition est de 4 Go de taille), mais +alors que la VM écrit des données sur son disque, cela commencera à +consommer de l’espace dans `+/tmp+`. + +Démarrez le premier hôte virtuel, qui deviendra le serveur FAI +footnote:[Cette installation utilisera environ 2GB d'espace dans +/tmp+.] : +---- +fai-kvm -Vn -s20 -u 1 cd faicd64-small.iso +---- + +Dans le menu grub; sélectionnez +faiserver, using internal DHCP and a fixed IP+. +Cela va installer +un hôte appelé faiserver avec IP 192.168.33.250 qui contient tous les +logiciels nécessaires pour un serveur FAI. Il configurera également un +cache de paquets local (en utilisant apt-cacher-ng). Une fois +l’installation terminée, redémarrez la machine. Lors du premier +démarrage du nouveau système, il configurera automatiquement le nfsroot. +Cela peut prendre quelques minutes. + +Après cela, vous pouvez démarrer des hôtes supplémentaires en utilisant +un démarrage réseau. Pour chaque nouvel hôte, vous devez utiliser une +valeur différente pour `+-u+`, qui sera utilisée pour générer des +adresses MAC différentes et utiliser des noms de fichier d’image de +disque différents. + +---- +fai-kvm -Vn -u 2 pxe +---- + +Ces clients d’installation vous montreront un menu, où vous pouvez +sélectionner le type d’installation que vous souhaitez effectuer. Si le +client d’installation ne trouve pas le serveur, c’est généralement parce +que fai-monitor n'y fonctionne plus. Cela peut se produire si vous +redémarrez le faiserver après l’installation. Pour remédier à cela, +exécutez simplement fai-monitor sur le faiserver et relancez le +démarrage du client. + +Un autre client pourrait être lancé avec: +---- +fai-kvm -Vn -u 3 pxe +---- + +Vous pouvez démarrer autant de machines dans le réseau que de TAPs réseau +disponibles. Toutes ces machines peuvent se +connecter à l’Internet extérieur, mais sont seulement accessibles à +partir de votre machine hôte. + +== [[overview]]Vue d'ensemble et Concepts + +FAI est un système non interactif permettant d’installer, de +personnaliser et de gérer les configurations de systèmes et de logiciels +Linux sur les ordinateurs ainsi que sur les machines virtuelles et les +environnements chroot, des petits réseaux aux grandes infrastructures et +clusters. Vous pouvez prendre un ou plusieurs PC vierges, mettre sous +tension et après quelques minutes, Linux est installé, configuré et +fonctionnel sur l’ensemble du cluster, sans aucune interaction nécessaire. +Ainsi, il s’agit d’une méthode évolutive pour installer et mettre à jour +un cluster sans surveillance impliquant peu d’efforts. FAI utilise +le système d’exploitation Linux et une collection de scripts shell et +Perl pour le processus d’installation. Les modifications apportées aux +fichiers de configuration du système d’exploitation peuvent être +effectuées par des scripts CFEngine, shell (bash et zsh), Perl, Python, Ruby et +expect. + +Les personnes intéressées par FAI sont des administrateurs système qui doivent +installer Linux sur une ou même des centaines d’ordinateurs. Parce qu’il +s’agit d’un outil d’installation à usage général, il peut être utilisé +pour l’installation d’un cluster Beowulf, d’une ferme de rendu ou +d’un laboratoire Linux ou d’une salle de classe. De plus, des réseaux +Linux de grande envergure avec différents matériels ou différentes +exigences d’installation sont faciles à établir à l’aide de FAI. Mais +n’oubliez pas de planifier votre installation. Le chapitre +<> contient quelques conseils utiles à ce sujet. + +=== [[terms]] Terminologie + +Commençons par décrire quelques termes utilisés dans ce manuel. + +Le serveur d'installation :: +Il fournit les services DHCP, TFTP et NFS ainsi que les données de +configuration pour tous les clients d’installation. Dans les exemples +de ce manuel, cet hôte s’appelle 'faiserver'. C'est l’hôte où le paquet +'faiserver' est installé. + +Le client d'installation :: +Un hôte qui sera installé à l’aide de FAI et une configuration fournie +par le serveur d’installation. Aussi appelé client pour faire court. Dans +ce manuel, les hôtes d’exemple sont appelés demohost, xfcehost, +gnomehost … Cet ordinateur doit démarrer à partir de son interface +réseau à l’aide de PXE. + +Espace de configuration:: +Une structure de sous-répertoire contenant plusieurs fichiers. Ces +fichiers décrivent les détails de la manière dont l’installation des +clients sera effectuée. Toutes les données de configuration sont +stockées là. Il est également appelé _config space_ pour faire court. Il +comprend des informations sur : + +* Organisation du disque dur dans un format similaire à fstab +* Systèmes de fichiers locaux, leurs types, points de montage et options de montage +* Paquets logiciels +* Disposition du clavier, fuseau horaire, configuration Xorg, systèmes de fichiers distants, comptes utilisateurs, imprimantes … + ++ +Le package _fai-doc_ inclut un exemple d’espace de configuration +incluant des exemples pour les hôtes utilisant l’environnement XFCE et +GNOME entre autres. En invoquant `fai-mk-configspace` on copie ces exemples vers +'/srv/fai/config'. Il est recommandé d'étudier ces fichiers de configuration et +ces scripts pour mieux comprendre comment FAI fonctionne. + + +nfsroot, NFS-Root :: +Un système de fichiers situé sur le serveur d’installation. Pendant le +processus d’installation, c’est le système de fichiers complet pour +les clients d’installation. Tous les clients partagent le même +nfsroot, qu’ils montent en lecture seule. Le nfsroot a besoin +d’environ {nfsrootsize}Go d’espace disque libre. + +TFTP :: +Sert aux clients le fichier initrd et le noyau utilisés pour le processus +d’installation. Avec le système de fichiers servi par NFS, ces deux +composent un système d'exploitation temporaire dans lequel les installations sont +réalisées. + +Classes FAI :: +Les classes sont des noms qui déterminent quel fichier de +configuration est sélectionné. Si un client appartient à la classe +WEBSERVER, il sera configuré en tant que serveur Web, la classe +DESKTOP pour, par exemple, déterminer les paquets logiciels qui seront +installés. + +profil :: +Un profil FAI est juste une liste de classes FAI assignées à un nom de +profil, qui est étendu par une description de ce profil. C’est-à-dire +que l’on peut avoir deux profils "Webserver", l’un incluant la classe +APACHE, et un autre incluant la classe NGINX, pour ensuite installer la solution +de serveur web correspondante. + +les tâches :: +L’installation d’un client se compose de plusieurs parties, appelées +tâches. Les tâches sont des sous-programmes prédéfinis qui effectuent +une certaine partie de la FAI. Les tâches FAI suivantes sont exécutées +au cours d’une installation sur les clients d’installation. + +____ + confdir # trouver l'espace de configuration + setup # quelques initialisations, lancement de sshd à la demande + defclass # définition des classes FAI + defvar # définition de variables + action # évaluer FAI_ACTION + install # Démarrer l'installation + partition # partitionner les disques durs, créer les systèmes de fichiers + mountdisks # monter les systèmes de fichiers + extrbase # extraire le fichier base.tar.xz + debconf # pré-ensemencer le deconf de Debian + repository # préparer l'accès aux dépôts de paquets + updatebase # mettre en place les outils de gestion de paquets et mettre les paquets à jour + instsoft # installer les paquets logiciels + configure # lancer les scripts de personnalisation + finish # faire un peu de ménage, afficher les statistiques d'installation + tests # appeler des tests s'il y en a + chboot # lancer fai-chboot sur le serveur d'installation + savelog # enregistrer les fichiers de journalisation localement et à distance + faiend # redémarrage de l'hôte, éjection du CD si nécessaire +____ +____ + +Voilà des tâches qui sont exécutées seulement lorsqu’on fait une action différente + + dirinstall # installer un environnement chroot + softupdate # ne faire que la configuration du système + sysinfo # imprimer une information système détaillée + inventory # imprimer un inventaire court du matériel +____ + +Pour une description plus détaillée des _tâches_ , voir <>. + +Notez que vous n'êtes pas limité aux tâches FAI. Vous pouvez également +définir des programmes ou des scripts supplémentaires qui seront +exécutés à certaines occasions. On les appelle des _hooks_. + +hooks:: +Les Hooks sont des plugins, ils peuvent ajouter des fonctionnalités +supplémentaires au processus d’installation ou même remplacer des +tâches entières de FAI. Les Hooks sont expliqués en détail dans +<>. + +=== [[classc]]Le concept de classe + +Les classes sont utilisées dans presque toutes les tâches de +l’installation. Les classes déterminent quels fichiers de configuration +choisir parmi une liste d’alternatives disponibles. Pour déterminer les +fichiers de configuration à utiliser, FAI recherche dans la liste des classes +définies et utilise tous les fichiers de configuration correspondant à +un nom de classe footnote:[on peut aussi seulement utiliser le fichier de configuration +qui a la priorité la plus élevée, comme l'ordre des classes définit une +priorité de la plus basse à la plus élevée dans la liste des classes. ]. La boucle suivante +implémente cette fonction en pseudo-code shell : + +---- +for class in $all_classes; do + if [ -r $config_dir/$class ]; then # s'il exite un fichier nommé $class + your_command $config_dir/$class # invoquer une commande avec ce nom de fichier + # sortir si on n'a besoin que du premier fichier qui convient + fi +done +---- + +La beauté de ceci c'est qu'on peut ajouter +une nouvelle alternative de configuration et qu'elle sera automatiquement +utilisée par FAI sans modifier le code, si le fichier de configuration +utilise un nom de classe. + +C’est parce que la boucle détecte automatiquement les nouveaux fichiers +de configuration qui doivent être utilisés. L’idée d’utiliser des +classes en général et d’utiliser certains fichiers correspondant à un +nom de classe pour une configuration est adoptée à partir des scripts +d’installation par Casper Dik pour Solaris. Cette technique s’est avérée +très utile et facile. + +Vous pouvez regrouper plusieurs hôtes partageant les mêmes fichiers de +configuration en utilisant la même classe. Vous pouvez également diviser +l’ensemble des données de configuration pour tous les clients en +plusieurs classes et les utiliser comme des briques de lego et +construire la configuration entière pour un seul client en assemblant +les briques. + + +Si un client appartient à la classe _A_, on dit que la classe _A_ +est définie pour ce client. Une classe n’a pas de valeur, elle est juste +définie ou indéfinie. + +Les classes déterminent comment l’installation est effectuée. Par +exemple, un client d’installation peut être configuré pour obtenir le +bureau XFCE en y ajoutant simplement la classe _XFCE_ . Naturellement, +des configurations plus granulaires sont également possibles. Par +exemple, les classes peuvent décrire comment le disque dur doit être +partitionné, elles peuvent définir quels paquets logiciels seront +installés, ou quelles étapes de personnalisation seront exécutées. + +Souvent, une configuration client est juste créée en modifiant ou en ajoutant +les classes auxquelles ce client appartient, ce qui rend +l’installation d’un nouveau client très facile. Ainsi, aucune +information supplémentaire ne doit être ajoutée à l’espace de +configuration si les classes existantes suffisent à vos besoins. + +Comme vous pouvez le voir, les classes sont un pilier central de la +personnalisation de votre espace de configuration et de celui de +de votre client d'installation. Pour définir vos propres classes, reportez-vous à +<>. + +== [[setup]]Configurer votre faiserver + +Voici comment configurer le serveur d’installation en quelques minutes. +Les étapes suivantes sont nécessaires : + +. Configurer le serveur d’installation +.. Installer les paquets de FAI +.. Créer le nfsroot +.. Copier les exemples dans l’espace de configuration +.. Configurer les démons réseau +.. Créer les configurations PXELINUX +. Démarrage et installation des clients + + +=== Installer les paquets FAI + +* Installer la clé du dépôt de paquets du projet FAI. +* Ajouter l’URL du dépôt de paquets du projet FAI. +* Installer le paquet 'fai-quickstart' sur le serveur d'installation. + +Utilisez ces commandes pour l'installation : + +---- +# wget -O /etc/apt/trusted.gpg.d/fai-project.gpg https://fai-project.org/download/2BF8D9FE074BCDE4.gpg +# echo "deb http://fai-project.org/download bookworm koeln" > /etc/apt/sources.list.d/fai.list +---- + +or + +---- +# apt install extrepo ; extrepo enable fai +---- + +et ensuite : +---- +# apt-get update +# aptitude install fai-quickstart +---- + +Cela installera également les paquets pour les démons de serveur DHCP, +TFTP et NFS. + +=== Créer le nfsroot + +* Activez également le dépôt de paquets du projet FAI dans un +autre fichier _sources.list_ qui est utilisé lors de la construction du +nfsroot. Ensuite, activez l’utilisateur de journal pour FAI. +.... +# sed -i -e 's/^#deb/deb/' /etc/fai/apt/sources.list +# sed -i -e 's/#LOGUSER/LOGUSER/' /etc/fai/fai.conf +.... + + +* Par défaut, FAI utilise +http://httpredir.debian.org/ comme miroir +de paquets, qui va tenter de trouver un dépôt de paquets +rapide pour vous. +footnote:[Si vous voulez un miroir plus rapide, ajustez l'URL dans +_/etc/fai/apt/sources.list_ et +FAI_DEBOOTSTRAP+ dans +_/etc/fai/nfsroot.conf_ avant de lancer fai-setup.] +Ensuite, on peut lancer `fai-setup(8)` +footnote:[Cela invoque `fai-make-nfsroot(8)` en interne.] +Et vérifiez si tout s’est bien passé. Le fichier de journal est écrit dans +/var/log/fai/fai-setup.log. + +---- +# fai-setup -v +---- + + +* Voilà quelques-unes des lignes que vous verrez à la fin de fai-setup. +Un exemple complet de 'fai-setup.log' est disponible sur la page web FAI +à https://fai-project.org/logs/fai-setup.log. + +---- +FAI packages and related packages inside the nfsroot: +dracut 059-4 +dracut-live 059-4 +dracut-network 059-4 +dracut-squash 059-4 +fai-client 6.2 +fai-nfsroot 6.2 +fai-setup-storage 6.2 +Waiting for background jobs to finish +fai-make-nfsroot finished properly. +Log file written to /var/log/fai/fai-make-nfsroot.log +Adding line to /etc/exports: /srv/fai/config 192.168.33.250/24(async,ro,no_subtree_check) +Adding line to /etc/exports: /srv/fai/nfsroot 192.168.33.250/24(async,ro,no_subtree_check,no_root_squash) +Reloading nfs-kernel-server configuration (via systemctl): nfs-kernel-server.service. + +Your initial config space is now located in /srv/fai/config +Please don't forget to fill out the FAI questionnaire after you've finished your project with FAI. + +FAI setup finished. +Log file written to /var/log/fai/fai-setup.log +---- + +* `fai-setup` a créé le LOGUSER, le nfsroot et a ajouté des lignes +supplémentaires à _/etc/exports_. Les sous-répertoires ajoutés à +_/etc/exports_ sont exportés via NFS v3, de sorte que tous les clients +d’installation dans le même sous-réseau peuvent les monter via NFS. + + +=== Création de l’espace de configuration + +Installez les exemples simples dans l’espace de configuration +footnote:[Il n'est pas nécessaires que ces fichiers appartiennent au compte root.]. + +---- +$ fai-mk-configspace +---- + +Ces exemples contiennent la configuration pour certains hôtes d’exemple. +Selon le nom d’hôte utilisé, votre ordinateur sera configuré comme suit : + +demohost:: +Une machine qui n’a besoin que d’un petit disque dur. Cette machine +est configurée avec le réseau en tant que client DHCP, et une démo de +compte est créée. + +xfcehost:: +Un bureau XFCE est installé, utilisant LVM, et la démo du compte est +créée. + +gnomehost:: + Un bureau GNOME est installé et la démo du compte est créée. + +ubuntuhost::\n" +Un bureau Ubuntu sera installé et la démo du compte est créée. + +autres noms d'hôtes:: +Les hôtes disposant d’un autre nom d’hôte utiliseront notamment les +classes FAIBASE, DHCPC et GRUB. + +Tous les hôtes auront un compte appelé _demo_ avec mot de passe _fai_. Le +compte root a également le mot de passe _fai_. + +Si l’indicateur FAI +menu+ est ajouté, au lieu d’utiliser le nom +d’hôte pour déterminer le type d’installation, un menu est présenté et +l’utilisateur peut choisir un profil pour l’installation. + +=== Configurer les démons réseau + +Pour démarrer le client d’installation via PXE, le serveur +d’installation a besoin d’un démon DHCP et d’un démon TFTP fonctionnels. +Le paquet _fai-quickstart_ a déjà installé les paquets logiciels +pour ces démons. En outre, le paquet du serveur NFS pour +l’exportation du nfsroot et de l’espace de configuration a été installé. + + +==== [[bootdhcp]]Configuration du démon DHCP + +Idéalement, votre faiserver doit également être votre serveur DHCP. Si ce +n’est pas le cas, demandez à l’administrateur responsable du serveur +DHCP de le configurer conformément à cette section. Il est +possible d'éviter cela optionnellement en utilisant la fonctionnalité +<> diffusée dans FAI 5.0. + + +Un exemple pour `dhcpd.conf(5)` est fourni avec le paquet _fai-doc_. +Commencez à utiliser cet exemple et regardez toutes les options qui y +sont utilisées. + +---- +# cp /usr/share/doc/fai-doc/examples/etc/dhcpd.conf /etc/dhcp/ +---- + +Les seules informations spécifiques FAI contenues dans ce fichier de +configuration sont d'assigner +filename+ (DHCP option 67) à la valeur +fai/pxelinux.0+ et +d'assigner +next-server+ (DHCP option 66, also aussi nommée TFTP server name) et +server-name+ +à la valeur du nom de votre serveur d’install . Toutes les autres informations sont uniquement des +données liées au réseau, qui sont utilisées dans presque toutes les +configurations DHCP. Ajustez ces paramètres de réseau à vos besoins locaux. + +---- +deny unknown-clients; +option dhcp-max-message-size 2048; +use-host-decl-names on; + +subnet 192.168.33.0 netmask 255.255.255.0 { + option routers 192.168.33.250; + option domain-name "my.example"; + option domain-name-servers 192.168.33.250; + option time-servers faiserver; + option ntp-servers faiserver; + server-name faiserver; + next-server faiserver; + filename "fai/pxelinux.0"; +} +---- + +Si vous apportez des modifications à la configuration DHCP, vous devez +redémarrer le démon. + +---- +# invoke-rc.d isc-dhcp-server restart +---- + +Si vous disposez de plusieurs interfaces réseau, vous pouvez définir +l’interface que le serveur écoutera dans _/etc/default/isc-dhcp-server_. +Par défaut, le démon DHCP écrit ses messages de journalisation dans +_/var/log/daemon.log_. + + +==== Ajout d’une entrée d’hôte au DHCP + +L’adresse MAC est donnée par le matériel de la carte réseau. Pour chaque +client d’installation, vous collectez son adresse MAC et l'associez à une +adresse IP et à un nom d’hôte. Tout d’abord, nous ajoutons l’adresse IP +et le nom d’hôte à _/etc/hosts_ footnote:[On peut aussi ajouter cela dans son serveur de noms de domaine (DNS)]. +---- +192.168.33.100 demohost +---- + +L'association de l’adresse MAC à l’adresse IP est effectuée dans le fichier +_dhcpd.conf_. Ici, nous ajoutons une entrée d’hôte en utilisant la +commande `+dhcp-edit(8)+` . Ici, vous devez remplacer 01:02:03:AB:CD:EF +avec l'adresse MAC que vous avez trouvé. +---- +# dhcp-edit demohost 01:02:03:AB:CD:EF +---- + +Après l'invocation de cette commande, voici à quoi l'entrée d'hôte dans +_dhcpd.conf_ ressemblera : +---- +host demohost {hardware ethernet 01:02:03:AB:CD:EF;fixed-address demohost;} +---- + + +==== TFTP + +Normalement, vous n’avez pas besoin d’apporter de modifications à la +configuration démon TFTP. Les fichiers fournis par TFTP sont situés +dans _/srv/tftp/fai_. + + +==== NFS + +La commande `fai-setup` a déjà configuré le démon NFS et ajouté +quelques lignes au fichier de configuration _/etc/exports_. Il exporte +les répertoires en utilisant NFS v3. + +=== Création de la configuration PXELINUX + +La dernière étape avant de démarrer votre client pour la première fois +est de spécifier quelle configuration le client doit démarrer lors de +l’amorçage PXE. Nous utilisons la commande `fai-chboot(8)` pour +créer une configuration pxelinux pour chaque client d’installation. Cela +comprend des informations sur le noyau, le fichier initrd, l’espace de +configuration et certains paramètres d’amorçage. Vous devriez lire la +page de manuel, qui vous donne quelques bons exemples. Voici la commande +pour démarrer l’installation de l’hôte demohost. + +---- +$ fai-chboot -IFv -u nfs://faiserver/srv/fai/config demohost + +Booting kernel vmlinuz-4.19.0-5-amd64 + append initrd=initrd.img-4.19.0-5-amd64 ip=dhcp + FAI_FLAGS=verbose,sshd,createvt FAI_CONFIG_SRC=nfs://faiserver/srv/fai/config + +demohost has 192.168.33.100 in hex C0A82164 +Writing file /srv/tftp/fai/pxelinux.cfg/C0A82164 for demohost +---- + +À ce stade, vous devriez avoir une configuration faiserver de travail et +vos clients devraient démarrer dans FAI et être en mesure d’installer +l’un des exemples. + +Dans la section suivante, vous pouvez lire la planification de votre +installation, adapter votre espace de configuration à vos besoins +particuliers et étendre FAI à l’aide de hooks. + +=== [[custom server]]Serveur personnalisé + +Le faiserver et sa configuration n’est nullement statique. Il est possible +de personnaliser et d'étendre votre serveur. Pour cela, reportez-vous à +la section<> dans <>." + +== [[plan]]Planifiez votre installation + +Avant de commencer votre installation, vous devriez investir beaucoup de +temps dans la planification de votre installation. Une fois que vous +êtes satisfait de votre concept d’installation, FAI peut faire toutes +les tâches ennuyeuses et répétitives pour transformer vos plans en +réalité. FAI ne peut pas faire de bonnes installations si votre concept +est imparfait ou qu'il y manque quelques détails importants. Commencez à +planifier l’installation en répondant aux questions suivantes : + + +* Est-ce que je vais créer un cluster Beowulf ou dois-je installer des machines de bureau ? +* À quoi ressemble ma topologie LAN ? +* Ai-je un matériel uniforme ? Le matériel sera-t-il uniforme à l’avenir ? +* Le matériel a-t-il besoin d’un noyau spécial ? +* Comment nommer les hôtes ? +* Comment les disques durs locaux doivent-ils être partitionnés ? +* Quelles applications seront lancées par les utilisateurs ? +* Les utilisateurs ont-ils besoin d’un système de mise en file d’attente ? +* Quels logiciels faut-il installer ? +* Quels démons devraient être lancés, et à quoi devrait ressembler leur configuration ? +* Quels systèmes de fichiers distants doivent être montés ? +* Comment effectuer les sauvegardes ? + +Vous devez également penser à des comptes d’utilisateur, des +imprimantes, un système de courrier, des travaux de cron, des cartes +graphiques, au double amorçage, au NIS, au NTP, au fuseau horaire, +à la disposition de clavier, à l’exportation et au montage des annuaires via +NFS et à beaucoup d’autres choses. Donc, il ya beaucoup à faire avant de +commencer une installation. Et rappelez-vous que la connaissance est le +pouvoir, et c’est à vous de l’utiliser. L’installation et +l’administration sont un processus et non un produit. FAI ne peut pas +faire les choses que vous ne lui dites pas de faire. + +Mais vous ne devez pas commencer à partir de zéro. Examinez les fichiers +et les scripts dans l’espace de configuration. Il ya beaucoup de choses +que vous pouvez utiliser pour votre propre installation. Un bon article +intitulé « Bootstrapping an Infrastructure » avec d’autres aspects de la +construction d’une infrastructure est disponible sur +http://www.infrastructures.org/papers/bootstrap/bootstrap.html + +=== [[c3]]L’espace de configuration et ses sous-répertoires + +The configuration space is the collection of information about how exactly +to install a client. The central configuration space for all install +clients is located on the install server in '/srv/fai/config' and its +subdirectories. This will be mounted by the install clients to +'/var/lib/fai/config'. The main installation command `fai(8)` uses all +these subdirectories in the order listed except for hooks. + +_class/_:: +Scripts et fichiers pour définir des classes et des variables. + +_disk_config/_:: +Fichiers de configuration pour le partitionnement de disque, RAID +logiciel, LVM et création de système de fichiers. + +_basefiles/_:: +Normalement , le fichier 'base.tar.xz' (situé à l'intérieur du +nfsroot) est extrait sur le client d’installation après la création +des nouveaux systèmes de fichiers et avant l’installation des paquets. +Il s’agit d’une image de base minimale, créée juste après avoir appelé +debootstrap lors de la création du nfsroot sur le serveur +d’installation. Si vous voulez installer une autre distribution que celle +du nfsroot, vous pouvez mettre un fichier tar dans le sous-répertoire +'basefiles/' et le nommer selon une classe. Ensuite, la commande +`ftar(8)` est utilisée pour extraire le fichier tar en fonction des +classes définies. Ainsi, le fichier doit être nommé 'CLASS.tar.xz' +et non 'CLASS.base.tar.xz'. Cela se fait dans la tâche _extrbase_. +Utilisez cette option si vous souhaitez installer une autre +distribution ou une version différente de celle exécutée pendant +l’installation. ++ +Ce fichier de base peut également être reçu en fonction des classes +FAI via HTTP/HTTPS ou FTP en définissant la variable +FAI_BASEFILEURL+. FAI +téléchargera un fichier CLASSNAME.tar.xz (ou tgz, ou tar.gz, …) à +partir de cette URL, si +CLASSNAME+ correspond à une classe FAI. ++ +Exemple : +---- +FAI_BASEFILEURL=https://fai-project.org/download/basefiles/ +---- +Le dossier doit prendre en charge la liste des répertoires. FAI ne +recherchera pas de fichiers potentiellement correspondants. + +Voir le chapitre <> pour savoir comment +installer différentes distributions. + +_debconf/_:: +Ce répertoire contient toutes les données `debconf(7)`. Le format +est le même que celui utilisé par `debconf-set-selections(1)`. + +_package_config/_:: +Les fichiers avec des noms de classe contiennent des listes de +paquets à installer ou à désinstaller par +`install_packages(8)`. Les fichiers nommés '.gpg' sont ajoutés à la liste des clés utilisées par apt +pour les dépôts de paquets approuvés. + +_pkgs/_:: +Ce répertoire peut avoir des sous-répertoires nommés selon des classes. Vous pouvez +mettre des fichiers '.deb' ou '.rpm' dans ces sous-répertoires. FAI installera +ces paquets sans qu'il soit besoin de créer les métadonnées d'un dépôt de paquets. + +_scripts/_:: +Scripts pour la personnalisation de votre site local. Utilisé par +`fai-do-scripts(1)`. + +_files/_:: +Les Fichiers utilisés par les scripts de personnalisation. La plupart +des fichiers se trouvent dans un sous-répertoire qui +reflète l’arborescence de répertoires ordinaire. Par exemple, les +modèles de `_nsswitch.conf_` se trouvent dans +'$FAI/files/etc/nsswitch.conf' et sont nommés en fonction des classes +auxquelles ils doivent correspondre : +'$FAI/files/etc/nsswitch.conf/NIS' est la version de +'/etc/nsswitch.conf' à utiliser pour la classe NIS. Notez que le +contenu du répertoire n’est pas automatiquement copié sur la machine +cible, mais qu’il doit être explicitement copié par des scripts de +personnalisation à l’aide de la commande `fcopy(8)`. + +_hooks/_:: +Les hooks sont des programmes ou des scripts définis par +l’utilisateur, qui sont lancés pendant le processus d’installation. +Ils peuvent étendre ou remplacer les tâches par défaut. Le nom du +fichier doit être de format 'taskname.CLASSNAME[.sh]'. Un hook appelé ++updatebase.DEBIAN+ est exécuté avant la tâche +`updatebase` et seulement si l’installation du client fait partie de +la classe DEBIAN. + + +=== [[defining classes]]Définition des classes + +Il existe différentes possibilités pour définir des classes : + +. Certaines classes par défaut sont définies pour chaque hôte : DEFAULT, LAST et son nom d’hôte. +. Les classes peuvent être répertoriées dans un fichier (par défaut dans 'class/'). +. Les classes peuvent être dynamiquement définies par des scripts. + +La dernière option est une fonctionnalité très intéressante, puisque ces +scripts définiront des classes d'une façon très souple. Par exemple, +plusieurs classes peuvent être définies uniquement si certains matériels +sont identifiés ou si une classe est définie en fonction des +informations du sous-réseau. + +Tous les noms de classes, sauf le nom d’hôte, sont écrits en +majuscules. Ils ne doivent pas contenir de trait d’union, de dièse, de +point-virgule ni de point, mais peuvent contenir des caractères de +soulignement et des chiffres. + +La tâche _defclass_ appelle la commande `fai-class(1)` pour définir +les classes. Tous les scripts correspondant à l'expression _^[0-9][0-9]*_ (qui +commencent avec deux chiffres) Dans le sous-repertoire _$FAI/class_ sont +exécutés afin de définir les classes. Tout ce qui is affiché sur STDOUT +est automatiquement defini comme une classe. Pour plus d’informations +sur Les définitions de classe , lire les pages de manuel de +`fai-class(1)`. Le script _50-host-classes_ (voir ci - dessous la +version allégée) est utilisé pour les définir des classes en fonction du +nom d’hôte. + +---- +# use a list of classes for our demo machines +case $HOSTNAME in + demohost) + echo "FAIBASE GRUB DEMO" ;; + xfcehost) + echo "FAIBASE GRUB DEMO XORG XFCE LVM";; + faiserver) + echo "FAIBASE DEBIAN DEMO FAISERVER" ;; + ubuntuhost) + echo "FAIBASE DEBIAN DEMO UBUNTU JAMMY JAMMY64 XORG";; + *) + echo "FAIBASE DEBIAN DEMO" ;; +esac +---- + +Les noms d’hôtes doivent rarement être utilisé pour les fichiers de +configuration dans l’espace de configuration. Au lieu de ça, une classe doit +être définie et ensuite ajoutée pour un hôte donné. En effet, la plupart +du temps les données de configuration ne sont pas spécifiques à un nom +d'hôte, mais peuvent être partagées entre différents hôtes. + +L’ordre des classes est important car celui-ci définit la priorité des +classes de faible à élevée. + +=== [[classvariables]]Définition des Variables + +La tâche _defvar_ definit les variables pour le client d'installation. +Les variables sont définies par les scripts dans _class/*.var_. +Toutes les variables globales peuvent être définies dans 'DEFAULT.var'. +Pour un groupe d’hôtes utiliser un fichier de classe. Pour un +hôte seul, utiliser le Fichier +$HOSTNAME+ _.var_. Ici aussi, il est +utile d'étudier tous les exemples. + +Les variables suivantes sont utilisées dans les exemples et peuvent aussi être +utiles pour votre installation : + +FAI_ACTION:: +Set the action FAI should perform. Normally this is done by +`fai-chboot(8)`. If you can't use this command, define this variable +i.e. in the script 'LAST.var'. + +FAI_ALLOW_UNSIGNED:: +Si cette variable vaut 1, FAI permet l’installation de paquets à partir de +dépôts non signés. + +CONSOLEFONT:: +La police de caractères qui est chargée lors de l’installation par +`setfont(8)`. + +KEYMAP:: +Définit les fichiers de disposition du clavier dans '/usr/share/keymaps' +et '$FAI/files'. Vous n'avez pas besoin de spécifier le chemin complet, +car ce fichier sera localisé automatiquement. + +ROOTPW:: +Le mot de passe root chiffré pour le nouveau système. Vous pouvez +utiliser +`crypt(3)`, md5 et d’autres types de hachage pour le mot de passe. Utilisez 'mkpasswd(1)+` +pour créer le hachage d’un mot de passe donné. Par exemple, pour +générer le hachage MD5 un mot de passe, utilisez : +.... +$ echo "votre_mot_secret" | mkpasswd -m yescrypt -s +.... + + +UTC:: +Règle l’horloge matérielle à UTC si _UTC=yes_. Sinon, règle +l’horloge à l’heure locale. Voir `clock(8)` pour plus +d’informations. + +TIMEZONE:: +C'est le fichier sous '/usr/share/zoneinfo/' qui indique votre +fuseau horaire. Par exemple : _TIMEZONE=Europe/Berlin_. + + +MODULESLIST:: +Une liste des modules du noyau qui sont chargés pendant le démarrage +du nouveau système (écrits dans /etc/modules). + + +=== [[diskconfig]]Configuration du disque dur + +L’outil `setup-storage(8)` lit un fichier dans '$FAI/disk_config' pour +la configuration du disque. Ce fichier décrit comment tous les disques +Locaux seront partitionnés, quels types de systèmes de fichiers +doivent etre créés (comme ext3/4, xfs, btrfs), et où ils seront montés. +Vous pouvez aussi créer des configurations RAID logiciel et LVM en +utilisant ce fichier de configuration. Il est aussi possible de préserver +le partitionnement du disque ou de préserver les +données sur certaines partitions. + +Pendant le processus d’installation, tous les systèmes de fichiers +locaux sont montés sous le répertoire '/target'. Par exemple, si vous +spécifiez le point de montage '/home' dans un fichier de configuration +de disque, ce sera le répertoire '/target/home' pendant le processus +d’installation et ça deviendra '/home' pour le nouveau système installé. + +=== [[extrbase]]Extraction du fichier de base + +Un fichier de base n'est nécessaire que si on installe une distribution qui est +défférente de celle dans le nfsroot. + +=== [[debconf]]Pré-ensemencement Debconf + +On peut utiliser le fomat décrit dans `debconf-set-selections(1)`. + +=== [[repository]]Accès au dépôt de paquets + +FAI supporte http, https, et NFS pour l'accès au miroir de paquets. Réglez +la variable '$FAI_DEBMIRROR' pour l'utilisation de NFS. + + +=== [[packageconfig]]Configuration des paquets logiciels + +Avant l’installation de paquets, FAI va ajouter le contenu de tous +les fichiers nommés _package_config/class.gpg_ à la liste des clés apt. +Si votre dépôt local est signé par votre keyid AB12CD34 vous pouvez +facilement ajouter cette clé, ainsi FAI l’utilisera pendant +l’installation. Utilisez cette commande pour créer le fichier +'CLASS.gpg' : + +---- +faiserver$ gpg --export AB12CD34 > /srv/fai/config/package_config/MYCLASS.gpg +---- + + +Le script `install_packages(8)` installe les logiciels sélectionnés. +Il lira tous les fichiers de configuration Dans '$FAI/package_config' +dont le nom correspond à une classe définie. La syntaxe est très simple. + +---- +# an example package class + +PACKAGES taskinst +german + +PACKAGES install-norec +adduser nmap +less zstd + +PACKAGES remove +gpm xdm + +PACKAGES install GRUB_PC +grub-pc +---- + +Les commentaires commencent par une dièse (#) et se terminent à la fin de la +ligne. Chaque commande de paquet commence par le mot _PACKAGES_ suivi +par un nom de commande, qui correspond à gestionnaire de paquets +distinct comme apt-get, aptitude ou dnf par exemple. la commande définit quelle +commande sera utilisé pour installer les paquets nommés après +cette commande. La liste de toutes les commandes disponibles peut +être listée en utilisant _install_packages -H_. Les gestionnaires de paquets pris +en charges sont _aptitude, apt-get, smart, yast, dnf, rpm, zypper_ + +hold:: +Mettre un paquet en attente. Ce paquet ne sera pas pris en charge par +dpkg, pas exemple il ne sera pas mis à niveau. + +install:: +Pour installer tous les paquets (en utilisant `apt-get`) qui sont précisés +dans les lignes suivantes. Si un tiret est ajouté au nom du paquet +(sans espace intermédiaire), le paquet sera supprimé, pas installé. +Tous les noms de paquets sont vérifiées pour les fautes de frappe. +Tout paquet qui n’existe pas, sera retiré de la liste des paquets à +installer. Soyez donc attentif à ne pas mal orthographier les +noms de paquets. + +install-norec:: +Comme install, mais sans installer les paquets recommandés. + +remove:: +Supprimer tous les paquets qui sont pécisés dans les lignes suivantes. +Si on ajoute un + au nom du paquet, le paquet doit être installé. + +taskinst:: +Installer tous les paquets appartenant aux tâches qui sont spécifiées +dans les lignes suivantes à l’aide de `tasksel(1)`. Vous pouvez +aussi utiliser _aptitude_ pour installer les tâches. + +aptitude:: +Installer tous les paquets avec la commande `aptitude`. Ce sera la +valeur par défaut à l’avenir et pourra remplacer apt-get et taskinst. +Aptitude peut aussi installer les tâches de paquets. + +aptitude-r:: +Idem aptitude avec l’option _--with-recommends_. + +unpack:: +Télécharger les paquets et les décompresser seulement. Ne pas configurer les +paquets. + +dselect-upgrade:: +Definir des sélections des paquets en utilisant les lignes suivantes puis +installer ou supprimer les paquets précisés. Ces lignes sont le résultat +de la commande _dpkg --get-selections_. Il est recommandé de ne pas +utiliser ce format, puisque cela spécifie aussi tous les +paquets qui sont installés seulement en raison d’une dépendance ou +d'une recommandation. Il vaut mieux juste spécifier le paquet que vous +voulez avoir, et de laisser FAI (et apt-get) résoudre les dépendances. + + +Plusieurs lignes avec des listes de noms de paquets séparés par des +espaces suivent les directive PACKAGES. Toutes les dépendances sont +résolues. Les paquets avec suffixe _-_ (par exemple, _lilo-_) seront +supprimés au lieu d'être installés. L’ordre des paquet n’a pas +d’importance. Si vous souhaitez installer des paquets d’une autre +version que la valeur par défaut, vous pouvez ajouter le nom de la +version au nom du paquet comme dans _openoffice.org/etch-backports_. +Vous pouvez également spécifier une certaine version comme _apt=0.3.1_. +Plus d’informations sur ces fonctionnalités sont décrites dans +`aptitude(8)`. + +On peut spécifier des paramètres supplémentaires pour le gestionnaire de paquets +en ajoutant des paires _cle=valeur_ après _PACKAGES _. les paires clé, valeur +actuellement supportées sont _release=_ qui ajoute _-t _ durant +l'installation des paquets. + +Exemple: +---- +PACKAGES install-norec release=testing +nvidia-smi +---- + +Cela installerait le paquet nvidia-smi de la distribution testing, +en incluant les dépendances. N'oubliez pas d'ajouter une entrée dans +'sources.list'. Vous pouvez aussi vouloir ajuste l'épinglage apt (apt pinning) +(voir 'apt_references(5)') + + +Une ligne qui contient la commande _PRELOADRM_, télécharge un fichier à +l’aide de `wget(1)` dans un répertoire avant d’installer les paquets. +À l’aide d'une URL de type _file:_, ce fichier est copié de +$FAI_ROOT+ vers le +répertoire de téléchargement. Par exemple, le paquet `realplayer` a +besoin d’une archive pour installer le logiciel, donc cette archive est +téléchargée dans le répertoire '/root'. Après l’installation des +paquets, ce fichier sera supprimé. Si le fichier ne doit pas être +supprimé, utilisez plutôt la commande _PRELOAD_. + + +On peut ajouter une expression booléenne arbitraire qui utilise des classes FAI pour +définir quand la liste des paquets devrait être installée. Ici, les +paquets seront installés seulement si la classe XORG est définie mais la classe +MINT n'est pas définie. + +Exemple: +---- +PACKAGES install UBUNTU && XORG && ! MINT +ubuntu-standard +ubuntu-desktop +---- + +L'ancienne façon d'ajouter des expressions logiques dans les lignes PACKAGES est encore valable : +Il est possible d'ajouter une liste de noms de classes après la commande pour +apt-get. Ainsi une telle commande _PACKAGES_ sera exécutée seulement au moins +une des classes correspondantes est définie (OU logique). On peut donc combiner +plusieurs petits fichiers dans le fichier DEFAULT. + + + +Si vous souhaitez supprimer un nom de paquet d’une certaine classe +faisait partie de cette classe précédemment, vous ne devez pas supprimer le +nom du paquet classe, mais plutôt de lui ajouter un tiret (-). Cela +garantira que le paquet soit enlevé pendant une mise a jour sur des hôtes +qui étaient installés en utilisant l’ancienne définition de classe qui +comprenait ce nom de paquet. + +Si vous spécifiez un paquet qui n’existe pas, ce paquet sera supprimé +automatiquement de la liste d’installation uniquement si la commande +_install_ est utilisée. + +Le concept de priorité des classes permet à une classe de priorité plus élevée (qui +arrive plus tard dans la séquence des classes) d'écraser les sélections des +paquets de priorité plus basse. Pour que cela fonctionne correctement, +les classes de priorité plus élevée doivent utiliser les mêmes commandes _PACKAGES_ (par exemple +_PACKAGES install-norec_ au lieu de seulement _PACKAGES install_) que celles qu'utilisent +la classe qu'on essaie d'écraser. Cela est utile pour supprimer +l'installation d'un paquet, par exemple, pour éviter d'installer le paquet +'linuxlogo' installé par la classe FAIBASE : + +---- +# exemple montrant comment écraser : +# +# Dans FAIBASE il y a : +# PACKAGES install-norec +# linuxlogo +# +# On veut _ne pas_ installer linuxlogo, et il se trouve dans +# une section install-norec, donc il faut aussi utiliser install-norec. + +PACKAGES install-norec +linuxlogo- +---- + +=== [[cscripts]]Scripts de personnalisation + +La commande `fai-do-scripts(1)` est lancée pour exécuter tous les +scripts dans ce répertoire. Si un répertoire avec un nom de classe +existe, tous les scripts correspondant à l'expression _^[0-9][0-9]*_ sont exécutés +par ordre alphabétique. Il est donc possible d’utiliser des scripts de +différentes langages (shell, cfengine, Perl, Python, Ruby, expect,..) +pour une classe. + +Ces scripts écrivent leur sortie standard dans scripts.log. Le fichier status.log +contient les noms de tous les scripts exécutés et leur statut de terminaison. + +==== [[shell]]Scripts shell + +La plupart des scripts sont des scripts Bourne shell. Les scripts shell +sont utiles si la tâche de configuration n'a besoin d'appeler que +quelques commandes shell ou créer un fichier à partir de zéro. Afin d'éviter +d'écrire beaucoup de scripts courts, il est possible d’utiliser la +commande `ifclass` pour tester si certaines classes sont définies. + +---- +ifclass -o A B C +---- + +Vérifie si l’une des classes A, B ou C est définie. L’utilisation de -a +(ET, AND logique) vérifie si toutes les classes d’une liste sont définies. +La commande 'ifclass C' vérifie si seule la classe C est définie. + +Pour copier des fichiers avec des classes, utilisez la commande +`fcopy(8)`. Si vous voulez extraire une archive à l’aide de classes, +utilisez `ftar(8)`. Pour ajouter des lignes à un fichier de +configuration, utilisez `ainsl(1)` au lieu de simplement ++echo string >> filename+. + + +FAI prend également en charge les scripts 'zsh(1)' pendant la tâche de +personnalisation. Dans les scripts, la variable +$classes+ contient +une liste séparée par des espaces avec les noms de toutes les classes +définies. + +==== [[cfengine]]Cfengine scripts + +CFEngine has a rich set of functions to edit existing configuration +files, e.g _LocateLineMatching, ReplaceAll, InsertLine, +AppendIfNoSuchLine, HashCommentLinesContaining_. But it can't handle +variables which are undefined. If a variable is undefined, the whole +cfengine script will abort. + +More information can be found in the manual page `cfengine(8)` or at +the cfengine homepage https://www.cfengine.com. + + +=== [[hooks]]Hooks + +Hooks let you specify functions or programs which are run at certain +steps of the installation process. Before a task is called, +FAI searches for existing hooks for this task and executes them. As +you might expect, classes are also used when calling hooks. Hooks are +executed for every defined class. You only have to create the hook +with the name for the desired class and it will be used. If several +hooks for a task exists, they are called in the order defined by the +classes. If _debug_ is included in +$FAI_FLAG+ the option _-d_ is +passed to all hooks, so you can debug your own hooks. If some default +tasks should be skipped, use the subroutine _skiptask_ and a list of +default tasks as parameters. In the examples provided, the hooks of +the class CENTOS skips some Debian specific tasks. + +The directory '$FAI/hooks/' contains all hooks. A hook is an executable +file following the naming scheme 'taskname.CLASSNAME[.sh]' (e.g. +'repository.CENTOS' or 'savelog.LAST.sh). The +task name specifies which task to precede executing this hook, if the +specified class is defined for the installing client. See section +<> for a complete list of default tasks that can be used. + +A hook of the form _hookprefix.classname_ can't define variables for +the installation script, because it's a subprocess. But you can use +any binary executable or any script you wrote. Hooks that have the +suffix _.sh_ (e.g. 'partition.DEFAULT.sh') must be Bourne +shell scripts and are sourced. So it's possible to redefine variables +for the installation scripts. + +In the first part of FAI, all hooks with prefix _confdir_ are called. +Those hooks can not be located in the config space, since it's not yet +available. Therefore these hooks are the only hooks located in ++$nfsroot+'/$FAI/hooks' on the install server. All other hooks are +found in '$FAI_CONFIGDIR/hooks' on the install server. + + +All hooks that are called before classes are defined can only use the +following classes: _DEFAULT $HOSTNAME LAST_. If a hook for class +_DEFAULT_ should only be called if no hook for class +$HOSTNAME+ is +available, insert these lines to the default hook: + +---- +hookexample.DEFAULT: + +#! /bin/sh + +# skip DEFAULT hook if a hook for $HOSTNAME exists +scriptname=$(basename $0 .DEFAULT) +[-f $FAI/hooks/$scriptname.$HOSTNAME ] && exit +# here follows the actions for class DEFAULT +. +. +---- + +Some examples for what hooks could be used: + +- Load kernel modules before classes are defined in '$FAI/class'. + +- Send an email to the administrator if the installation is finished. + +- Install a diskless client and skip local disk partitioning. + +- Have a look at +hooks/debconf.IMAGE+ for how to clone a machine using a file system image. + +=== [[faiflags]]FAI flags + +The variable +$FAI_FLAGS+ contains a space separated list of +flags. Flags are normally defined in the pxelinux.cfg file which +should be created by 'fai-chboot(1)'. The following flags are known: + +verbose:: +Create verbose output during installation. This should always be the +first flag, so consecutive definitions of flags will be verbosely +displayed. + +debug:: +Create debug output. No unattended installation is performed. During +package installation you have to answer all questions of the +postinstall scripts on the client's console. A lot of debug +information will be printed out. This flag is only useful for FAI +developers. + +sshd:: +Start the ssh daemon to enable remote logins. +You can then log in as _root_ to all install clients during the +installation. The default password is _fai_ and can be changed by +setting `FAI_ROOTPW` in `nfsroot.conf(5)`. To log in from your server +to the install client (named demohost in this example) use: + +---- +$ ssh root@demohost +Warning: Permanently added 'demohost,192.168.33.100' to the list of known hosts. +root@demohost's password: +---- + +This is only the root password during the +installation process, not for the new installed system. You can also +log in without a password when using +$SSH_IDENTITY+. + + +createvt:: +Create two virtual terminals and execute a bash if _ctrl-c_ is typed +in the console terminal. The additional terminals can be accessed by +typing _Alt-F2_ or _Alt-F3_. Otherwise, no terminals are available and +typing _ctrl-c_ will reboot the install client. Setting this flag is +useful for debugging. If you want an installation which should not be +interruptible, do not set this flag. + +menu:: +This enables a user menu for selecting a profile. All files ++class/*.profile+ are read and a curses based menu will be created. + +screen:: +Run FAI inside a `screen(1)` session. The session is called FAI. +If you log in via ssh from remote you can attach to the session using: +---- +$ screen -x +---- + +tmux:: +Run FAI inside a `tmux(1)` session. The session is called FAI. +If you log in via ssh from remote you can attach to the session using: +---- +$ tmux attach +---- + +reboot:: +Reboot the install client after installation is finished without +typing RETURN on the console. If this flag is not set, and error.log +contains anything, the install client will stop and wait that you +press RETURN. If no errors occurred, the client will always reboot +automatically. + +halt:: +Halt the install client at the end of the installation, instead of +rebooting into the new system. + +initial:: +Used by `setup-storage(8)`. Partitions marked with +preserve_reinstall+ +are preserved unless this flag is set. Often, this flag is set in a +file 'class/*.var' by using setting 'flag_initial=1'. + +== [[install]] FAI installs your plan + +=== The early part of an installation + +After the kernel has booted, it mounts the root file system via NFS +from the install server and starts the script +'/usr/sbin/fai' footnote:[Since the root file system on the clients is mounted via +NFS, `fai` is located in +'/srv/fai/nfsroot/usr/sbin' on the install +server.]. This script controls the sequence of the +installation. No other scripts in '/etc/init.d/' are used. + +The configuration space is made available via the configured method +(an NFS mount by default) from the install server to the path defined +in '$FAI' footnote:['$FAI' is an internal variable used by the FAI +scripts. By default the path is _/var/lib/fai/config_.] + + +=== [[bootmesg]]Boot messages + +When booting the install client from network card with PXE you will see some +messages like this: +include::includes/bootexample.txt[] + +At this point the install client has successfully received the network +config via DHCP and the kernel and initrd via TFTP. It now boots the +Linux kernel and the initrd. If everything went right, the initrd +mounts the nfsroot footnote:['/srv/fai/nfsroot' from the install +server via NFS] and the FAI scripts are started. The first +thing you see is the red FAI copyright message. + +include::includes/fai-1st-part.txt[] + +You can also see the list of FAI classes, that are defined for this +host. This list is very important for the rest of the installation. + +The first task is called _confdir_, which is responsible for getting +access to the config space. Here, we use an NFS mount from the install +server as you can see on the console (and later in the logs). + +---- +FAI_CONFIG_SRC is set to nfs://faiserver/srv/fai/config +Configuration space faiserver:/srv/fai/config mounted to /var/lib/fai/config +---- + +Before the installation is started (+$FAI_ACTION=install+) the computer +beeps three times. So, be careful when you hear three beeps but you do +not want to perform an installation and let FAI erase all yout data on +the local disk! + + +=== [[reboot]]Rebooting the computer into the new system + +For rebooting the computer during or at the end of the installation you +should use the command `faireboot` in favour of the normal reboot command. +Use `faireboot` also if logged in from remote. If the installation +hasn't finished, use _faireboot -s_, so the log files are also copied +to the install server. + +If the installation has finished successfully, the computer should boot a +small Debian system. You can login as user _demo_ or _root_ with password _fai_. + +=== [[isetup]]Starting FAI (task confdir) + +After the install client has booted only the script '/usr/sbin/fai' is +executed. It will do some minimal initialization. The variable ++$FAI_CONFIG_SRC+ footnote:[It is defined on the kernel command line] +is used to get access to the FAI configuration space which is then +available in the directory +$FAI+ footnote:[/var/lib/fai/config]. FAI +will not proceed without the config space. + +You can access the config space using different methods. Supported +methods are: nfs:, file:, cvs:, svn: git:, hg:, http: and detect:. +See `fai.conf(5)` for a detailed description of these methods. + + +=== [[iclass]]Defining classes and variables (tasks defclass and defvar) + +The command `fai-class(1)` executes scripts in '$FAI/class' for defining +classes. If the scripts write a string to stdout, this will be defined +as a class. Read all the details in the man page of `fai-class(1)`. + + +After defining the classes, every file matching _.var_ with a prefix +which matches a defined class is sourced to define variables. It must +contain valid shell code. + +=== [[ipartition]]Partitioning local disks, creating file systems (task partition) + +For the disk partitioning exactly one disk configuration file from +'$FAI/disk_config' is selected using classes. + +The format of the disk configuration is similar to a fstab file. + +The partitioning tool `setup-storage(8)` performs all commands +necessary for creating the disk partition layout, software RAID, LVM +and for creating the file systems. Disks and partitions may easily be +referenced by disk1.1, disk2.4 etc. Read the manual page of +`setup-storage(8)` for a detailed description and some examples of the +format. + + +=== [[ipreseed]]Debconf preseeding (task debconf) +Files in '$FAI/debconf' are used for the usual `debconf(7)` preseeding +if the file names match a class name. + +=== [[ipackages]]Installing software packages (task instsoft) + +The command `install_packages(8)` reads the config files from +'$FAI/package_config' in a class based manner and installs software +packages on the new file system. + +It installs the packages using `apt-get(8)`, `aptitude(1)`, `yum` or other +package tools without any manual interaction needed. Package +dependecies are also resolved by the package tools. + +The format of the configuration files is described in <>. + +Additionaly FAI will install packages ('.deb' or .rpm') from the +directories '$FAI/pkgs/'. + + +=== [[icscripts]]Site specific customization (task configure) + +Often the default configurations of the software packages will not +meet your site-specific needs. You can call arbitrary scripts which +adjust the system configuration. Therefore the command +`fai-do-scripts(1)` executes scripts in '$FAI/scripts' in a class +based manner. It is possible to have several scripts of different +types (shell, cfengine, ...) to be executed for one class. + +The default set of scripts in '$FAI/scripts' include examples for +installing Debian and Rocky Linux machines. They set the root password, add +a user account (set by '$username, default to demo), set the timezone, configure the network for DHCP +or using a fixed IP address, setup grub and more. +They should do a reasonable job for your installation. You can edit +them or add new scripts to match your local needs. + +More information about these scripts are described in <>. + + +=== [[isavelog]]Saving log files (task savelog) + +When all tasks are finished, the log files are written to +_/var/log/fai/$HOSTNAME/install/_ +footnote:['/var/log/fai/localhost/install/' is a link to this +directory.] on the new system and to the account on the install server +if +$LOGUSER+ is defined (you have to enable this in +'/srv/fai/config/class/FAIBASE.var'). It is also possible to specify +another host as log saving destination through the variable ++$LOGSERVER+. If +$LOGSERVER+ is not defined, FAI uses the variable ++$SERVER+ which is only defined during an initial installation (by +get-boot-info). + +Additionally, two symlinks will be created to indicated the last +directory written to. The symlink 'last' points to the log directory +of the last FAI action performed. The symlinks 'last-install' and +'last-sysinfo' point to the directory of the last corresponding +action. By default log files will be copied to the log +server using scp. You can use the variable +$FAI_LOGPROTO+ in file +'fai.conf(5)' to choose another method for saving logs to the remote +server. Here's an example of the symlink structure: + +---- +lrwxrwxrwx 1 fai fai 23 Dec 2 2013 last-sysinfo -> sysinfo-20131202_161237 +drwxr-xr-x 2 fai fai 4096 Dec 2 2013 sysinfo-20131202_161237 +drwxr-xr-x 2 fai fai 4096 Feb 14 2014 install-20140214_142150 +drwxr-xr-x 2 fai fai 4096 Dec 2 11:47 install-20141202_113918 +lrwxrwxrwx 1 fai fai 23 Dec 4 13:22 last-install -> install-20141204_131351 +lrwxrwxrwx 1 fai fai 23 Dec 4 13:22 last -> install-20141204_131351 +drwxr-xr-x 2 fai fai 4096 Dec 4 13:22 install-20141204_131351 +---- + +Examples of the log files can be found at https://fai-project.org/logs. + + +=== [[ireboot]]Reboot the new installed system + +Before rebooting, the install client calls `fai-chboot -d ` +on the install server, to disable its own PXELINUX +configuration. Otherwise, it would restart the installation during the +next boot. Normally this should boot the new installed system from +its second boot device, the local hard disk. + +At the end, the system is automatically rebooted if "reboot" was added to ++$FAI_FLAGS+. + + + +== [[advanced]]Advanced FAI topics + + +=== [[checkbootp]]Checking parameters received from DHCP servers + +If the install client boots you can check +if all information from the DHCP daemon are received +correctly. The received information is written to +'/tmp/fai/boot.log'. An example of the result of a DHCP request can be +found in the sample log files. + + + + +=== [[fai-monitor]]Monitoring multiple client installations + +You can monitor the installation of all install clients with the +command `fai-monitor(8)`. All clients check if this daemon is running +on the install server (or the machine defined by the variable ++$monserver+). Each time a task starts or ends, a message is sent. The +FAI monitor daemon prints this messages to standard output. There's +also a graphical frontend available, called `fai-monitor-gui(1)`. + +---- +$ fai-monitor | fai-monitor-gui - & +---- + + +=== [[mac]]Collecting Ethernet addresses for multiple hosts + +You have to collect all Ethernet (MAC) addresses of the install +clients and assign a host name and IP address to each client. To +collect the MAC addresses, boot your install clients. +You can already do this before any DHCP daemon is running in your +subnet. They will fail to boot (because of the missing DHCP or missing TFTP), +but you can still collect the MAC addresses. + +While the install clients are booting, they send broadcast packets to the +LAN. You can log the MAC addresses of these hosts by running the +following command simultaneously on the server: + +---- +faiserver# tcpdump -qtel broadcast and port bootpc >/tmp/mac.list +---- + +After the hosts have been sent some broadcast packets abort `tcpdump` +by typing _ctrl-c_. You get a list of all +unique MAC addresses with these commands: + +---- +faiserver$ perl -ane 'print "\U$F[0]\n"' /tmp/mac.list|sort|uniq +---- + +After that, you only have to assign these MAC addresses to host names +and IP addresses ('/etc/ethers' and '/etc/hosts' or corresponding NIS +maps). With this information you can configure your `DHCP` +daemon (see the section <>). footnote:[I recommend to write the MAC +addresses (last three bytes will suffice if you have network cards +from the same vendor) and the host name in the front of each chassis.] + + +==== Debugging the network traffic + +If the client can't successfully boot from the network card, use +`tcpdump(8)` to look for Ethernet packets between the install server +and the client. Search also for entries in several log files made by +`tftpd(8)` and `dhcpd(8)` : + +---- +faiserver$ egrep "tftpd|dhcpd" /var/log/* +---- + + +=== [[pxeboot]]Details of PXE booting + +Here we describe the details of PXE booting, which are only needed if +you have problems when booting your install clients. + +Almost all modern bootable network cards support the PXE boot environment. +PXE is the Preboot Execution Environment. +This requires the PXELINUX bootloader and a special version of the _TFTP_ +daemon, which is available in the Debian packages +pxelinux+ and ++tftpd-hpa+. PXE booting also needs a DHCP server, so that the network +card can configure its IP parameters. This is the sequence of a PXE boot: + +* Network card of the client sends its MAC address +* DHCP server replies with IP configuration for the client +* Network card configures IP +* Install client gets the pxelinux.0 binary via TFTP +* Get the pxelinux.cfg/C0A8210C configuration file via TFTP +* C0A8210C is the IP address of the client in hexadecimal +* This configuration contains kernel, initrd and additional kernel +command line parameters, which was created by `fai-chboot`. +* Get the kernel and initrd via TFTP. + + +Example of a pxelinux.cfg file: +---- +default fai-generated + +label fai-generated +kernel vmlinuz-6.1.0-17-amd64 +append initrd=initrd.img-6.1.0-17-amd64 ip=dhcp root=/srv/fai/nfsroot rootovl FAI_FLAGS=verbose,sshd,createvt FAI_CONFIG_SRC=nfs://faiserver/srv/fai/config FAI_ACTION=install +---- + +See '/usr/share/doc/syslinux/pxelinux.doc' for more detailed +information about PXELINUX. FAI uses the lpxelinux.0 binary which also +supports loading the kernel and initrd via FTP or HTTP. The command +'fai-chboot(8)' supports this with the option '-U'. + + +=== [[Customizing your install server setup]]Customizing your install server setup + +- local/faster package mirror +- different loguser +- local root pw inside nfsroot + +The configuration for the FAI package (not the configuration data for +the install clients) is defined in 'fai.conf(5)'. Definitions that are +only used for creating the nfsroot are located in +'nfsroot.conf(5)'. Check these important variables in 'nfsroot.conf' +before calling 'fai-setup' or 'fai-make-nfsroot'. + +FAI_DEBOOTSTRAP:: +Building the nfsroot uses the command `debootstrap(8)`. It needs the location of a Debian mirror and the +name of the distribution (like bullsseye, bookworm, sid) for which the basic Debian +system should be built. Do not use different distributions here and in +'/etc/fai/apt/sources.list'. This will create a broken nfsroot. + +NFSROOT_ETC_HOSTS:: +This variable is only needed if the clients do not have access to a DNS server. +This multiline variable is added to /etc/hosts inside the +nfsroot. Then the install clients can access those hosts by name +without using DNS. + + +The content of '/etc/fai/apt/sources.list' is +used by the install server and also by the clients. If your install +server has multiple network cards and different host names for each +card (as for a Beowulf server), use the install server name which is +known by the install clients. + + +If you have problems running `fai-setup`, they usually stem from +`fai-make-nfsroot(8)` which is called by former command. Adding '-v' +gives you a more verbose output which helps you pinpoint the +error. The output is written to +'/var/log/fai/fai-make-nfsroot.log'. footnote:[For debugging purpose +it may help to enter the chroot environment manually using this +command. 'faiserver# chroot /srv/fai/nfsroot bash'] + + +The setup also creates the account _fai_ (defined by +$LOGUSER+) if +not already available. So you can add a user before calling +`fai-setup(8)` using the command `adduser(8)` and use this as your +local account for saving log files. The log files of all install +clients are saved to the home directory of this account. You should +change the primary group of this +account, so this account has write permissions to '/srv/tftp/fai' in +order to call fai-chboot for creating the PXE configuration for the hosts. + + +When you make changes to 'fai.conf', 'nfsroot.conf' the +nfsroot has to be rebuilt by calling `fai-make-nfsroot(8)`. If you +only like to install a new kernel package to the nfsroot add the flags _-k_ or +_-K_ to +fai-make-nfsroot+. This will not recreate your nfsroot, but +only updates your kernel and kernel modules inside the nfsroot or add +additional packages into the nfsroot. + + +=== [[cdboot]]Creating a FAI CD or and USB stick + +You can easily create an installation CD (or USB stick) of your +network installation setup. This will perform the same installation +and configuration from CD without the need of the install server. +Therefore you need to create a partial mirror of all Debian packages +needed for your FAI classes (using `fai-mirror(1)`). Then the command +`fai-cd(8)` will put this mirror, the nfsroot and the config space +onto a bootable CD. That's it! + +To easily create the installation CD, you can use the following command +(for more tuning details see `fai-cd(8)`): + +---- + faiserver# fai-cd -m fai-cd.iso +---- + +This installation CD contains all data needed for the +installation. The command `fai-cd(8)` puts the nfsroot, the +configuration space and a subset of the Debian mirror onto a +CD-ROM. A partial package mirror is created using the command +`fai-mirror(1)` which contains all packages that are used by the +classes used in your configuration space. A sample ISO image is +available at https://fai-project.org/fai-cd. + +Using the command `dd(1)` you can also create a bootable USB +stick by just writing the content of the ISO file to your USB stick +(here the stick is _/dev/sdf_). + +---- + faiserver# dd if=fai-cd.iso of=/dev/sdf bs=1M +---- + + +`mk-data-partition` is a tool that extends an ISO (that will be copied +to an USB stick) or an USB stick containing an ISO with +an ext4 or exFAT partition and sets the file system label to MY-DATA. +This partition is automatically mounted to '/media/data' by FAI. +You can copy your own _.deb_ packages into this data partition und the +subdiretories 'pkgs/'. FAI will then install these packages +if the equivalent class is defined. + +Example how to use `mk-data-partition`: + +---- +# mk-data-partition -s 1G -c faicd-large.iso A B +---- +The former command creates the data partition of size 1 Gbytes inside +the ISO file and copy directories A and B to it. You can then copy the modified ISO +onto an USB stick. + + +If the ISO is already on the USB stick and if it's available as +_dev/sdf_, you can add a data partition of type exFAT will will use +the whole remaining part of the USB stick by using this command: +---- +# mk-data-partition -F /dev/sdf +---- + + +=== [[diskimage]]Creating VM disk images using FAI + +The command `fai-diskimage(8)` creates disk +images, which can be used with a virtual machine like KVM, VMware, +VirtualBox or a cloud service like OpenStack, GCE, EC2 and others. The +installation process performs the normal FAI tasks on a raw disk +image. After the installation you can boot the disk image and have a +running system. The disk image can also be converted to qcow2 format. +You do not need to setup the FAI nfsroot when only using +fai-diskimage. But you need a basefile in your configuration +space. Setting the variable +$FAI_BASEFILEURL+ will automatically +download an appropriate base file into your config space. + + +Here's an example how to create a raw disk image for a host called +cloud3, with a small set of software packages: +---- +# export FAI_BASEFILEURL=https://fai-project.org/download/basefiles/ +# fai-diskimage -vu cloud3 -S2G -cDEBIAN,BOOKWORM64,AMD64,FAIBASE,GRUB_PC,DHCPC,DEMO,CLOUD,LAST disk.raw +---- + +This command will create a disk image called ubuntu.qcow2 for a Ubuntu 16.04 desktop +with hostname set to foobar. +---- +# export FAI_BASEFILEURL=https://fai-project.org/download/basefiles/ +# cl=DHCPC,UBUNTU,JAMMY,JAMMY64,AMD64,XORG,LAST +# fai-diskimage -Nvu foobar -S5G -c$cl ubuntu.qcow2 +---- + +You can give disk images a try without installing FAI, if you visit +https://fai-project.org/FAIme/cloud + + +=== [[live-image]]Creating a bootable live image + +Creating a bootable live ISO is easy with FAI. You only need two +steps. First, create your live environment using the command 'fai +dirinstall'. Don't forget to add the class +LIVEISO+. +Then create the live ISO using 'fai-cd': + +---- +# cl="DEBIAN,BOOKWORM64,AMD64,FAIBASE,XFCE,XORG,DHCPC,DEMO,LIVEISO,LAST" +# LC_ALL=C fai -v dirinstall -u xfce33 -c $cl \ + -s file:///srv/fai/config /srv/xfce +# fai-cd -s500 -MH -d none -g /etc/fai/grub.cfg.live \ + -n /srv/xfce live.iso +---- + +The nfsroot is not needed for a live ISO. +Currently there's no live ISO of the install server available. + + +=== [[cross-arch]]Building cross-architecture disk images + +Starting FAI 5.4 it's now possible to build a disk image for +different architectures than the host is running. For example you can +build an image for 64-bit ARM architecture (aarch64) on a host running on amd64 +architecture. Here are the steps do to: + +---- +# apt install qemu-system-arm qemu-user-static fai-server fai-setup-storage fai-doc qemu-utils +# fai-mk-configspace + +# export FAI_BASEFILEURL=https://fai-project.org/download/basefiles/ +# fai-diskimage -vu armhost -S2G -cDEFAULT,DHCPC,DEBIAN,ARM64,BUSTER_ARM64,FAIBASE,DEMO,CLOUD,LAST arm64.raw +# chown your_user_id arm64.raw +# cp /var/log/fai/armhost/last/vmlinuz* vmlinuz +# cp /var/log/fai/armhost/last/initrd.img* initrd +---- + +Then you can run qemu as a normal user: +---- +> qemu-system-aarch64 -m 1000 -M virt,gic_version=3 -cpu cortex-a57 -drive file=arm64.raw,if=virtio,index=1 -no-reboot -nographic -name ARM64 -net nic,name=eth0,model=virtio -net user,name=eth0,-kernel vmlinuz -initrd initrd -append "console=ttyAMA0 rw ip=dhcp root=/dev/vda1 net.ifnames=0" +---- + +This works similar for other architectures. +Keep in mind, that qemu network setup will have poor performance if +not using the virtio driver as above or tap devices. + + + +You can find the base files for many architectures at +https://fai-project.org/download/basefiles/, or use `mk-basefile` to +create your own. + + +=== [[sysinfo]]FAI rescue system + +If you set the variable +$FAI_ACTION+ to _sysinfo_ (for e.g. by using ++fai-chboot -S+), the client will not install a new system, but will +collect a lot of system information. +If you set +$FAI_ACTION+ to _inventory_ you will only get a few +hardware information. +Both actions can be used for FAI as a rescue system. + +Type _ctrl-c_ to get a shell or use _Alt-F2_ or _Alt-F3_ and you will get +another console terminal, if you have added _createvt_ to +$FAI_FLAGS+. + +You now have a running Linux system on the install client without +using the local hard disk. Use this as a rescue system if your local +disk is damaged or the computer can't boot properly from hard +disk. You will get a shell and you can execute various commands +(`dmesg`, `lsmod`, `df`, `lspci`, ...). Look at the log file in +'/tmp/fai'. There you can find much information about the boot +process. + + + +FAI mounts all file systems it finds on the local disks read only. It +also tells you on which partition a file '/etc/fstab' exists. When +only one file system table is found, the partitions are mounted +according to this information. Here's an example: + +---- +demohost:~# df -h + +Filesystem Size Used Avail Use% Mounted on +devtmpfs 4.0M 0 4.0M 0% /dev +tmpfs 2.0G 0 2.0G 0% /dev/shm +tmpfs 783M 18M 766M 3% /run +tmpfs 5.0M 0 5.0M 0% /run/lock +LiveOS_rootfs 783M 18M 766M 3% / +192.168.33.250:/srv/fai/config 59G 23G 24G 49% /var/lib/fai/config +/dev/mapper/vg1-root 7.3G 1.8G 5.2G 26% /target +/dev/vda1 459M 53M 378M 13% /target/boot +/dev/mapper/vg1-home 1.4G 72K 1.3G 1% /target/home +---- + +*This method can be used as a rescue environment!* If you need a file +system with read-write access use the `rwmount` command: + +---- +demohost# rwmount /target/home +---- + +=== [[nonfs]]FAI without NFS + +To boot into FAI and begin the installation sequence +without using the NFS protocol, you boot the client machine using PXE as +usual and then retrieve an image containing the nfsroot via http. + +To create an image, use fai-cd's -S argument and -M to avoid setting up +a partial mirror within the image. + +---- +faiserver# fai-cd -M -S squash.img +---- + +Move this image to a directory from which it can be requested via http +(usually a directory served by the webserver) + +To now request the squashfs image, add the following to your kernel +command line, e.g. in your pxelinux configuration file for the client +with fai-chboot. + +---- +root=live:http://faiserver/cskoeln/squash.img FAI_CONFIG_SRC=file:///var/lib/fai/config +---- + +Replace faiserver with the domain name or IP of the machine your +squash image is served from. + + +=== [[otherdists]]Installing other distributions using a Debian nfsroot + +You can install all sorts of Linux distributions from a single Debian +nfsroot. Therefore you have to create a base.tar.xz of the distribution +you like to install and place it into the `basefiles` directory. Then +name it UBUNTU2204.tar.xz for example. An install client which belongs +to the class UBUNTU2204 then extracts this base file into its empty +file system. Additionally you have to adjust the 'sources.list' or +similar configuration files which are needed for specifying the +location of the package repository. + +The tool `rinse(8)` is used for creating base files for distribution +like Rocky Linux, CentOS, openSUSE or Fedora. +Some basefiles can be downloaded from +https://fai-project.org/download/basefiles/. + +The script +mk-basefile+ in +'/usr/share/doc/fai-doc/examples/simple/basefiles/' helps creating +this base files. + +=== [[dirinstall]]Creating chroot and virtualization environments + +If you have to create some chroot environments, or a virtualization +environment where you neither can nor want to run a normal Debian +Installer in to get to a working system (for example, Xen guest +domains), there is the FAI action _dirinstall_. +By calling + +---- +faiserver# fai dirinstall +---- + +and using either the option _-c _ or _-N_ you get a FAI +installation, without the partitioning action, right into the target +directory. The host name for the target installation can be specified +using _-u _ + +This, for example, can be used to combine FAI with the tool +_xen-tools_, which helps you to build Xen guest domains. _xen-tools_ +are very nice for generating configuration files and block devices for +new guests based on simple commands and/or configuration files, but +they can only assign one role per installation for customization. +FAI-users need and want more, as they are used to have the class +system. They get them even in xen-tools installations, by using the +following code as a xen-tools role script: + +---- +#!/bin/sh +TARGET=$1 +CMD="fai -N -v -u ${hostname} dirinstall $TARGET" +echo running $CMD +$CMD +---- + +Then, you should set the variable _install=0_ in the config of +xen-tools for that host. + +=== [[softupdate]]Using FAI for updates +FAI can also do updates of already running systems, without a +re-installation from scratch. +This is called softupdate. A FAI softupdate skips the tasks which are +not suitable for updating a running system, like partitioning the +hard disks and creating file systems. Instead, it only executes the +tasks for updating and installing software packages and calling the +customization scripts. + +To run a softupdate call: +---- +# fai -v -s nfs://faiserver/srv/fai/config softupdate +---- + +By default, a softupdate uses the list of classes defined during the +initial installation. Make sure to set the variable +$LOGSERVER+ (done +in a _class/*.var_ file) if FAI should save the log files to a remote +machine. + + +It's up to you, how to start a softupdate on a bigger number of hosts. +You may do the softupdate on a regular basis via cron or you can use tools +like `clusterssh(1)` to start a softupdate via a push on a list of +hosts. + + +Keep in mind, that the customization scripts are run every time you do +a softupdate. That means, they have to be *idempotent* i.e. the result +of their operation should always produce the same result, even when +they run more than once. + +For example appending a line to a file must not done via this code: + +---- +$ echo "some strings" >> /etc/fstab +---- +Instead use the command `ainsl(1)` in a shell script or use cfengine's +function _AppendIfNoSuchLine_. + + +All commands in the customization script must be capable of modifying +the target file system wether it's available in _/target_ during the +initial installation or wether it's the normal file system relative to +_/_ during softupdate. + +Here are some variable that help writing these scripts: + ++$target+:: Points to the root directory of the client, which +is _/target_ during installation and _/_ during a softupdate. + ++$FAI_ROOT+:: It's the same value as +$target+. For historic reasons +we have both these variables in FAI. + ++$ROOTCMD+:: +In case of the installation this is an alias for 'chroot $target' in case of +softupdate it's just empty. You can prepend this to commands if you need to run a +command inside the clients target file system via chroot. + + ++$FAI_ACTION+:: +If you need to call code depending on the FAI action performed, you +can use this variable. It contains the currently executed action: +_install_, _softupdate_, _dirinstall_, _sysinfo_, _inventory_ or your +own defined action. + +=== [[archcross]]How to install 32-bit OS from a 64-bit OS + +To install a computer with a 32-bit OS, you need an i386 nfsroot. +Creating this 32-bit nfsroot on an install server running amd64 is +quite simple. Install and set up the FAI packages. Then copy your FAI +config files to a new subdirectory. + +---- +faiserver# cp -a /etc/fai /etc/fai-i386 +---- + +Edit the variable +$FAI_DEBOOTSTRAP_OPTS+ in +'/etc/fai-i386/nfsroot.conf' and add the option +--arch +i386+. Also choose a different directory for your new nfsroot. Here +are the two lines after editing. + +---- +NFSROOT=/srv/fai/nfsroot-i386 +FAI_DEBOOTSTRAP_OPTS="--arch i386 --exclude=info --include=aptitude"" +---- + +Now call fai-make-nfsroot which creates the 32-bit nfsroot in +'/srv/fai/nfsroot-i386' + +---- +faiserver# fai-make-nfsroot -v -C/etc/fai-i386 +---- + +Creating a partial mirror using `fai-mirror(1)` that is needed for +a bootable CD or USB stick is also possible on a different architecture. +You have to specify the architecture when calling fai-mirror. + +---- +$ fai-mirror -m800 -B -a i386 -v -cDEFAULT,DEBIAN,FAIBASE,I386 /srv/mirror-i386 +---- + +That's all! + + +=== [[error]]Aborting the installation when an error occurs + +Every task and hook can call the function +task_error+ +to send an error value to the installation. This error will appear in +the log file and can be shown in the `fai-monitor-gui(1)`. +The error value is also checked against the variable +$STOP_ON_ERROR+ +which is set to 700 by default. If the error value +is greater than +$STOP_ON_ERROR+ the installation will stop +immediately. In a hook, just add a call like this: + +---- +task_error +---- + +It is comfortable to call task_error with $? as second parameter, for +e.g. if you want to set an error value of 123 use this + +---- + +task_error 123 $? +---- + +Then the task error is only set if the preceding command failed with +some error. The same syntax can be used by the scripts in the class +subdirectory ending in .sh. + +A special case are scripts inside the class/ subdirectory that does +not end in .sh. In those scripts you have to call task_error with 1 as +third parameter. As an example you can use those two variants for +setting the value to 123 + +---- +task_error 123 $? 1 +---- + +or + +---- +task_error 123 1 1 +---- + +The latter command always sets the task error to 123 regardless of +the value of +$?+. If the error value is greater than +$STOP_ON_ERROR+, +the installation will abort immediately. + +The error values are grouped into four categories + +---- +normal or info messages: 1xx, 2xx +warnings: 3xx, 4xx +minor errors: 5xx, 6xx +errors: 7xx, 8xx +---- + +The fai-monitor-gui has 4 different icons for these error categories. + + +== [[hints]]Various hints and details + + +=== [[tasks]]The list of tasks + +Most tasks of the installation are defined as subroutines which are +defined in '/usr/lib/fai/subroutines' (e.g. +task_instsoft+). +Some are external shell scripts located in '/usr/lib/fai/'. +They are called via a superior subroutine called _task_. +This subroutine calls hooks if available and then calls the task (defined as +__task___). A task and its hooks can be +skipped on demand by using the command _skiptask()_. + +Now follows the description of all tasks, listed in the order +they are executed. + + +confdir:: +The kernel appended parameters may define variables, the syslog daemon is +started. Network parameters are fetched from a DHCP +server and are stored in +boot.log+. The DNS resolver configuration file is created. ++ +The location of the configuration space is defined by the variable ++$FAI_CONFIG_SRC+. ++ +After that, the file '$FAI/hooks/subroutines' is sourced if it +exists. Using this file, you can define your own subroutines or +override the definition of FAI's subroutines. + + +setup:: +This task sets the system time, all +$FAI_FLAGS+ are defined and two +additional virtual terminals are opened on demand. A secure shell +daemon is started on demand for remote logins. + +defclass:: +Calls `fai-class(1)` to define classes using scripts and files in +'$FAI/class' and classes from '/tmp/fai/additional-classes' and the +variable +$ADDCLASSES+. The list of all defined classes is stored in +the variable +$classes+ and saved to '/tmp/fai/FAI_CLASSES'. + +defvar:: +Sources all files '$FAI/class/*.var' for every defined class. If a +hook has written some variable definitions to the file +'$LOGDIR/additional.var', this file is also sourced. + +action:: +Depending on the value of +$FAI_ACTION+ this subroutine decides which +action FAI should perform. The default available actions are: +_sysinfo_, _install_, _inventory_, _dirinstall_ and _softupdate_. If +$FAI_ACTION+ has another +value, a user defined action is called if a file +'$FAI/hooks/$FAI_ACTION' exists. So you can easily define your own +actions. + +sysinfo:: +Called when no installation is performed but the action is +_sysinfo_. It shows information about the detected hardware and mounts +the local hard disks read only to '/target/+partitionname+' or with +regard to a 'fstab' file found inside a partition. Log files are +stored to the install server. + +inventory:: +A short list of system information is printed. + +install:: +This task controls the installation sequence. You will hear three +beeps before the installation starts. The major work is to call other +tasks and to save the output to '/tmp/fai/fai.log'. If you have any +problems during installation, look at all files in '/tmp/fai/'. You +can find examples of the log files +at https://fai-project.org/logs/. + +dirinstall:: +Install into a directory, not onto a local disk. Use this for creating +chroot environments. + +softupdate:: +This task, executed inside a running system via the `fai(8)` command +line interface, performs a softupdate. See chapter <> for +details. + +partition:: +Calls `setup-storage(8)` to partition the hard +disks and to create file systems. The task writes variable definitions +for the root and boot partition and device (+$ROOT_PARTITION, +$BOOT_PARTITION, $BOOT_DEVICE+) to '/tmp/fai/disk_var.sh' and creates +a 'fstab' file for the new system. + +mountdisks:: +Mounts the created partitions according to the created +'/tmp/fai/fstab' file relative to +$FAI_ROOT+. + +extrbase:: +Extracts a minimal system after that a chroot can be made into it. By +default the base tar file '/var/tmp/base.tar.xz' will be +extracted. Also files matching a class name in `$FAI/basefiles/` are used for unpacking a +different tar file depending on classes defined. This can be used for +installing different Linux distributions than the one used for +creating the nfsroot. The default file 'base.tar.xz' is a snapshot of a +basic Debian system created by `debootstrap(8)`. +This task uses the variable +FAI_BASEFILEURL+ for fetching the base +file via FTP, HTTPS or HTTP if it's defined. + +debconf:: +Calls `fai-debconf(1)` to set the values for the debconf preseeding database. + +repository:: +Prepare access to the package repository by preparing the apt +configuration. This can also add repository keys +in a class based manner from files like _CLASSNAME.gpg_ +in the directory _package_config_. + + +updatebase:: +Updates the base packages of the new system and updates the list of +available packages. It also fakes some commands (called diversions) +inside the new installed system using `dpkg-divert(8)`, so no daemons +will be started during the installation. + +instsoft:: +Installs the desired software packages using class files in +'$FAI/package_config/'. + +configure:: +Calls scripts in '$FAI/scripts/' and its subdirectories for every +defined class. + +tests:: +Calls test scripts in '$FAI/tests/' and its subdirectories for every +defined class. + +finish:: +Unmounts all file systems in the new installed system and removes +diversions of files using the command `fai-divert`. + +chboot:: +Changes the PXE configuration for a host on the install server which +indicates which PXELINUX configuration to load on the next boot from network +card via TFTP. Therefore the `fai-chboot(8)` command is executed +remotely on the install server. + +savelog:: +Saves log files to local disk and to the account +$LOGUSER+ on ++$LOGSERVER+ (defaults to the install server). + +faiend:: +Wait for background jobs to finish (e.g. emacs compiling lisp files) +and automatically reboots the install clients or waits for manual +input before reboot. + + +=== [[itests]]Automated tests + +After the customization scripts are executed, FAI will execute some +tests if available. Using these test, you can check for errors of the +installation. Test scripts are called via +`fai-do-scripts(1)` and should append its messages to +_$LOGDIR/test.log_. A Perl module including some useful subroutines +can be found in _Faitest.pm_. A test can also define a new class for +executing another tests during next boot via the variable ++$ADDCLASSES+. + + +=== [[autodiscover]] Autodiscover + +In FAI 5.0 we released a feature that allows clients to search for the +faiserver in their respective subnetwork. This lifts the necessity of +having to collect every client's MAC address and configuring the DHCP +daemon. + +This is done by booting from a small FAI autodiscover bootmedium (CD, +USB, etc.), which can be created via the command: + +---- +faiserver# fai-cd -A autodiscover.iso +---- + +The image is roughly 25MB in size and scans the subnet for +a FAI server. By default it shows a menu with all profiles available +in the configuration space in the same manner as the 'menu' flag +does. From this menu, you can select the installation type you wish to +perform. + +For the clients to find the faiserver, the faiserver must run +fai-monitor. + +=== [[changeboot]]Changing the boot device + +Changing the boot sequence is normally done in the BIOS setup. But you +can't change the BIOS from a running Linux system. + +So, the boot sequence of the BIOS will remain unchanged and +your computer should always boot first from its network card and the +second boot device should be the local disk. Then you can +change the boot device of the client by creating different PXELINUX +configurations. This will define if an installation +should be performed, or if the client should to boot from local +disk. This is done using `fai-chboot(8)`. + + +=== [[debian-mirror]]How to create a local Debian mirror + +The utility `mkdebmirror` footnote:[You can find the script in +'/usr/share/doc/fai-doc/examples/utils/'] can be used for creating +your own local Debian mirror. This script uses `debmirror(1)`. A partial Debian mirror for amd64 architecture for +Debian 11 and 12 (aka bullseye and bookworm) without the source packages needs about +180GB of disk space. +Accessing the mirror via HTTP will be the +default way in most cases. To see more output from the script call ++mkdebmirror -v+. A root account is not necessary to create and +maintain the Debian mirror. + +To use HTTP access to the local Debian mirror, install a web server +and create a symlink to the local directory where your mirror is +located: + +---- +faiserver# apt-get install apache2 +faiserver# ln -s /files/scratch/debmirror /var/www/html/debmirror +---- + +Create a file `sources.list(5)` in '/etc/fai/apt' which gives access +to your Debian mirror. Also add the IP-address of the +HTTP server to the variable +$NFSROOT_ETC_HOSTS+ in +'nfsroot.conf' if the install clients have no DNS resolving. + + +=== Small hints + + +- When using HTTP access to a Debian mirror, the local _/var_ partition +on all install clients must be big enough to keep the downloaded +Debian packages. Do not try with less than 250 Mbytes unless you know +why. You can limit the number of packages installed at a time with the +variable +$MAXPACKAGES+. + +- You can remove the red logo on the install client by simply calling +`reset` once. If will also not appear if you create a file using this +command on the install server: + +---- +touch /srv/fai/nfsroot/.nocolorlogo +---- + +- A list of variables used by FAI can be found at +https://wiki.fai-project.org/index.php/Variables. + +- You can shorten some customization scripts by using one single fcopy +command _fcopy -r /_. + +- If you rebuild the nfsroot, you will create a new ssh host key inside +the nfsroot. Then logging in to an install client may fail, because +the host key changes. You can use this: + +---- +$ ssh -o StrictHostKeyChecking=no root@installclient +---- + +- You can also delete the host entry on your install client in your +_~/.ssh/known_hosts_ file by using the _ssh-keygen -R_ command. + +- In the tasks chboot and savelog, a connection using secure shell is +opened to the FAI server (see <>). To ensure that this works +non-interactively, a proper entry in 'NFSROOT/root/.ssh/known_hosts' +must be created. When using fai-setup, this is done automatically, but +it may require manual editing in case the name of your FAI server was +not determined correctly. If you stumble over ssh connections that +require typing "yes" to accept the host key during installation, +please check the contents of your 'NFSROOT/root/.ssh/known_hosts file' + +- A list of all local hard disks is +stored in +$disklist+. It's defined after `set_disk_info` is called. + +- There are multiple functions for generating a customized disk +list. See `fai-disk-info` for an example. + * set_bootstick() + * grepv_disks() + * grep_disks() + * notmatchdisks() + * matchdisks() + * smallestdisk() + * largestdisk() + * all_disks_by_size() + * all_disks_and_size() + * once_only() + * checkdisk() + * disks_by_id() + +- Use `fai-divert -a` if a postinst script calls a configuration +program, e.g. the postinst script for package apache calls +apacheconfig, which needs manual input. You can fake the configuration +program so the installation can be fully automatic. + +- Sometimes the installation seems to stop, but often there's only a +postinstall script of a software package that requires manual input +from the console. Change to another virtual terminal and look which +process is running with tools like `top(1)` and `pstree(1)`. You can +add _debug_ to _FAI_FLAGS_ to make the installation process show all +output from the postinst scripts on the console and get its input also +from the console. + + +- How can I define classes on the kernel command line? ++ +Read the man page of `fai-class(8)`. If you like to define some +additional classes (for e.g. A,B,C) on the kernel command line add this: _ADDCLASSES=A,B,C_ + + +- How to use a custom kernel inside the nfsroot? ++ +Build your customized kernel by building a kernel package using +`make-kpkg(8)` and use the option `--initrd`. Copy this Debian package +to a local repository and add it to /etc/fai/sources.list. Add the +name of your package to /etc/fai/NFSROOT. Then call ++ +---- +# fai-make-nfsroot -k +---- + + +- How to use the nfsroot as system for diskless clients? ++ +https://wiki.fai-project.org/index.php/Use_nfsroot_for_diskless_clients + + +- How to serve multiple nfsroot directories on one FAI server? ++ +If you want to serve multiple nfsroot directories, +you need to create specific config directories in '/etc' for FAI, like +'/etc/fai-buster' and '/etc/fai-bookworm'. Then you need to set the ++$NFSROOT+ variables to different directories and run + +---- +faiserver#fai-make-nfsroot -C /etc/fai-buster +---- + + +=== flag_reboot (FAI_FLAGS) + +If flag_reboot is set, by adding "reboot" to +$FAI_FLAGS+, your client +machine will reboot after the task faiend has finished. This is true +for network as well as bootmedium installations. + + +=== [[logfiles]]Log files + +FAI is creating several log files. During installation they are stored +in '/tmp/fai' on the install client itself. At the end of the +installation they will be copied to the install server (see +<>). After the install client rebooted into his newly +installed system, you can find the FAI logs in '/var/log/fai'. +Log files are also created when doing the softupdate or dirinstall +action. + +On the faiserver, you can find the (remote) log files under the ~fai +directory. + +Sample log files from successfully installed computers are +available on https://fai-project.org/logs. +These a some log files which are created by FAI. + +FAI_CLASSES:: +Contains a list of all classes defined. + +dmesg.log:: +Output of the `dmesg` command. Contains useful messages of the kernel +ring buffer. + +fai.log:: +The main log file. Contains all important information. You should +*always* read this file. + +boot.log:: +A list of variables of network parameters, mostly defined by the DHCP daemon. + +format.log:: +Output of the partition tool `setup-storage(8)`. + +scripts.log:: +Output of all scripts, that are used for customization. + +variables.log:: +A list of all shell variables which are available during an +installation. + +error.log:: +A summary of possible errors in all log files. + +disk_var.sh:: +A list of variables that contain information about devices and +partitions to boot from, the root partition and a list of swap +devices. These information is used by some customization scripts +(e.g. _GRUB_PC/10-setup_). + + + + +If the installation process finishes, the hook 'savelog.LAST.sh' +searches all log files for common errors and writes them to the file +'error.log'. So, you should first look into this file for errors. Also +the file 'status.log' give you the exit code of the last command +executed in a script. To be sure, you should look for more details in +all log files. + + +=== How to use HTTP for PXE boot + +fai-make-nfsroot now uses the lpxelinux.0 binary which already +supports transfer of the kernel and initrd via http (additional to tftp). +You only have to enable HTTP access to the tftp directory: + +---- +cd /var/www/html +ln -s /srv/tftp/fai +---- + +Add '-U URL' to the 'fai-chboot' call. For example: + +---- +fai-chboot -U http://faiserver/fai -IFv ....... +---- + +== [[troubleshoot]]Troubleshooting + +=== [[booterror]]Boot errors + +The following error message indicates that your install client doesn't +get an answer from a DHCP server. Check your cables or start the +`dhcpd(8)` daemon with the debug flag enabled. + +____ + PXE-E51: No DHCP or BOOTP offers received + Network boot aborted +____ + +If you do not see the following message, the install kernel could not +detect your network card, for example because of a missing driver: + +---- +Starting dhcp for interface eth0 +dhcp: PREINIT eth0 up +dhcp: BOND setting eth +---- + +Check the initrd in the nfsroot (`lsinird`) if the kernel driver of your network +card is included there and check if you like to add the package +'firmware-linux-nonfree' in +/etc/fai/NFSROOT+ and rebuild the initrd +by calling `fai-make-nfsroot -k`. +You may also add a driver to +/srv/fai/nfsroot/etc/dracut.conf+ in +the line +add_drivers+++=+. + + +This is the error message you will see, when your network card is +working, but the install server does not export the nfsroot +directory to the install clients, This is often caused by missing +NFS permissions on the server side. + +---- +Starting dhcp for interface eth0 +dhcp: PREINIT eth0 up +dhcp: BOND setting eth +mount.nfs: access denied by server while mounting 192.168.33.250:/srv/fai/nfsroot +. +. +dracut Warning: Could not boot +. +Dropping to debug shell +dracut:/# +---- + +Now, you are inside the emergency shell of the initrd which was created +by 'dracut(8)'. You will get a shell prompt, and can look at the log files. +For more information about debugging the early boot process using +dracut see `dracut.cmdline(7)` + +Use the following command on the install server to see which directories are exported +from the install server (named faiserver): + +---- +$ showmount -e faiserver +---- diff --git a/doc/fr-old/FAI Guide (Fully Automatic Installation).html b/doc/fr-old/FAI Guide (Fully Automatic Installation).html new file mode 100644 index 000000000..149715b8f --- /dev/null +++ b/doc/fr-old/FAI Guide (Fully Automatic Installation).html @@ -0,0 +1,3844 @@ + + + + +FAI Guide (Fully Automatic Installation) + + + + +

+
+
+

Abstrait

+
+

FAI est un système non interactif permettant +d’installer, de personnaliser et de gérer les configurations de systèmes + et de logiciels Linux sur les ordinateurs ainsi que sur les machines +virtuelles et les environnements chroot, des petits réseaux aux grandes +infrastructures et clusters.

+

Ce manuel décrit le logiciel d’installation +entièrement automatique. Cela inclut l’installation des paquets, la +configuration du serveur, la création de la configuration et la gestion +des erreurs.

+
+
+
     +-----------------------------------------------------------------------+
+     | This manual describes FAI 5.3 but most things are also valid for 4.x. |
+     +-----------------------------------------------------------------------+
+
+

(c) 2000-2017 Thomas Lange

+
Copyright

Ce manuel +est un logiciel libre; Vous pouvez le redistribuer et / ou le modifier +selon les termes de la Licence Publique Générale GNU publiée par la Free + Software Foundation; Soit la version 2, soit (à votre choix) toute +version ultérieure.

+

Ceci est distribué dans l’espoir qu’il sera +utile, mais sans aucune garantie ; Sans même la garantie implicite de +qualité marchande ou d’adaptation à un usage particulier. Pour plus de +détails, consultez la GNU General Public License.<

+

Une copie de la GNU General Public License est + disponible sous la forme /usr/share/common-licenses/GPL dans la +distribution Debian GNU/Linux ou sur le World Wide Web sur le site GNU +Vous pouvez également l’obtenir en écrivant à la Free Software +Foundation , Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, +États-Unis.

+
+
+
+
+

Introduction

+
+
+

Disponibilité

+
+
+Page d’accueil +
+
+

+http://fai-project.org +

+
+
+FAI wiki +
+
+

+http://wiki.fai-project.org +

+
+
+Téléchargement +
+
+

+http://fai-project.org/download +

+
+
+Entrée pour sources.list +
+
+

+deb http://fai-project.org/download jessie koeln +

+
+
+Pages du manuel +
+
+

+http://fai-project.org/doc/man/ +

+
+
+Liste de diffusion +
+
+

+https://lists.uni-koeln.de/mailman/listinfo/linux-fai +

+
+
+Retour d’information +
+
+

+Envoyez vos commentaires et vos commentaires à fai@fai-project.orgou à la liste de diffusion . +

+
+
+Bogues +
+
+

+Utiliser le système de suivi des bogues Debian (BTS) http://bugs.debian.org +

+
+
+Changements visibles par l’utilisateur +
+
+

+http://fai-project.org/NEWS +

+
+
+Arbre source via git +
+
+

+git clone git://github.com/faiproject/fai.git +

+
+
+Voir l’arbre source avec http +
+
+

+https://github.com/faiproject/fai +

+
+
+

Les pages man incluent toujours des +informations à jour et beaucoup de détails sur toutes les commandes FAI. + Alors, n’oubliez pas de les lire attentivement. Lisez maintenant ce +manuel, puis profitez de l’installation entièrement automatique et de +votre temps économisé.

+
+
+

Motivation

+

Avez-vous déjà effectué des installations +identiques d’un système d’exploitation à plusieurs reprises? +Souhaitez-vous être en mesure d’installer un cluster Linux avec des +dizaines de nœuds à lui seul?

+

Répéter la même tâche encore et encore est +ennuyeux - et conduira certainement à des erreurs. Aussi beaucoup de +temps pourrait être sauvé si les installations ont été faites +automatiquement. Un processus d’installation avec interaction manuelle +n’est pas à l'échelle. Mais les grappes ont l’habitude de croître au fil + des ans. Pensez à long terme plutôt que de planifier quelques mois dans + l’avenir.

+

En 1999, j’ai dû effectuer une installation +d’un cluster Linux avec un serveur et 16 clients. Puisque j’ai eu +beaucoup d’expérience en faisant des installations automatiques des +systèmes d’exploitation de Solaris sur le matériel de SUN SPARC, l’idée +de construire une installation automatique pour Debian est née. Solaris +dispose d’une fonctionnalité d’installation automatique appelée +JumpStart [1]. En conjonction avec les scripts d’auto-installation de Casper Dik [2], + Je pourrais sauver beaucoup de temps non seulement pour chaque nouvel +ordinateur de SUN, mais aussi pour la réinstallation des postes de +travail existants. Par exemple, j’ai dû construire un LAN temporaire +avec quatre stations de travail SUN pour une conférence, qui a duré +seulement quelques jours. J’ai retiré ces postes de travail de notre +réseau de recherche habituel et mis en place une nouvelle installation +pour la conférence. Quand il était terminé, j’ai simplement intégré les +postes de travail dans le réseau de recherche, redémarré une seule fois, + et après une demi-heure, tout était opérationnel comme avant. La +configuration de tous les postes de travail était exactement la même +qu’avant la conférence, car tout était effectué par le même processus +d’installation. J’ai également utilisé l’installation automatique pour +réinstaller un poste de travail après un disque dur endommagé avait été +remplacé. Il m’a fallu deux semaines pour recevoir le nouveau disque +dur, mais seulement quelques minutes après l’installation du nouveau +disque, le poste de travail fonctionnait comme avant. Et c’est pourquoi +j’ai choisi d’adapter cette technique à un cluster de PC sous Linux.

+
+
+

Comment fonctionne FAI

+

Le client d’installation qui sera installé à +l’aide de FAI, est démarré via une carte réseau ou à partir d’un CD ou +d’une clé USB. Il obtient une adresse IP et démarre un noyau Linux qui +monte son système de fichiers racine via NFS (nfsroot) du serveur +d’installation. Une fois le noyau démarré, le script de démarrage FAI +exécute l’installation automatique qui n’a pas besoin d’interaction. +Tout d’abord, les disques durs seront partitionnés, les systèmes de +fichiers seront créés et des progiciels seront ensuite installés. Après +cela, le nouveau système d’exploitation installé est configuré selon vos + besoins locaux en utilisant quelques scripts. Enfin, le nouveau système + d’exploitation sera démarré à partir du disque local.

+

Les détails sur la façon d’installer +l’ordinateur (la configuration) sont stockés dans l’espace de +configuration du serveur d’installation. Les fichiers de configuration +sont partagés entre des groupes d’ordinateurs s’ils sont similaires en +utilisant le concept de classe. Vous n’avez donc pas besoin de créer une + configuration pour chaque nouvel hôte. Par conséquent, FAI est une +méthode évolutive pour installer un gros cluster avec un grand nombre de + nœuds même si leur configuration n’est pas identique.

+

FAI peut également être utilisé comme un +système de sauvetage ou pour l’inventaire matériel. Vous pouvez démarrer + votre ordinateur, mais il n’effectuera pas une installation. Au lieu de + cela, il exécutera un Debian GNU / Linux entièrement fonctionnel sans +utiliser les disques durs locaux. Ensuite, vous pouvez effectuer une +connexion à distance et sauvegarder ou restaurer une partition de +disque, vérifier un système de fichiers, inspecter le matériel ou +effectuer toute autre tâche.

+
+
+

Caractéristiques

+
    +
  • +

    +Une installation entièrement automatisée peut être effectuée. +

    +
  • +
  • +

    +Très rapide installation sans surveillance. +

    +
  • +
  • +

    +Système flexible grâce à un concept de classe simple. +

    +
  • +
  • +

    +Mise à jour des systèmes en cours d’exécution sans réinstallation. +

    +
  • +
  • +

    +Création facile d’un environnement de virtualisation ou d’un chroot +

    +
  • +
  • +

    +Les hôtes peuvent démarrer à partir d’une carte réseau, d’un CD, d’une clé USB. +

    +
  • +
  • +

    +Création simple d’un CD d’installation ou d’une clé USB. +

    +
  • +
  • +

    +PXE avec la méthode de démarrage DHCP est pris en charge. +

    +
  • +
  • +

    +ReiserFS, ext3 / ext4, btrfs et support de système de fichiers XFS. +

    +
  • +
  • +

    +Support logiciel RAID et LVM. +

    +
  • +
  • +

    +Détection automatique du matériel. +

    +
  • +
  • +

    +Vous pouvez déployer Debian, Ubuntu, CentOS, SuSE, Scientific Linux +

    +
  • +
  • +

    +Connexion à distance via ssh lors du processus d’installation possible. +

    +
  • +
  • +

    +Toutes les configurations similaires sont partagées entre tous les clients d’installation. +

    +
  • +
  • +

    +Les fichiers journaux de toutes les installations sont enregistrés sur le serveur d’installation. +

    +
  • +
  • +

    +Les scripts Shell, Perl, Python, Ruby, expect et CFEngine sont pris en charge lors de l'étape de personnalisation. +

    +
  • +
  • +

    +Prise en charge de nombreux protocoles comme NFS, FTP, HTTP, git +

    +
  • +
  • +

    +Peut être utilisé comme un système de sauvetage et pour l’inventaire matériel. +

    +
  • +
  • +

    +Prise en charge du client sans disque. +

    +
  • +
  • +

    +Ajoutez facilement vos propres fonctions via des hooks ou modifiez le comportement par défaut. +

    +
  • +
  • +

    +Clonage de machines utilisant des images de disque est pris en charge +

    +
  • +
+
+
+

Le temps de l’installation

+

Le temps d’installation est déterminé par la +quantité de logiciel et la vitesse du disque dur. Voici quelques +exemples de temps. Tous les clients d’installation avaient une carte +réseau 1Gbit installée.

+
+ ++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
CPU RAM Disk Software installed time

i7-3770T 2.50GHz

8GB

SSD

6 GB software

8.5 min

Core-i7 3.2GHz

6GB

SATA disk

4.3GB software

7 min

Core-i7 3.2GHz

6GB

SATA disk

471 MB software

77sec

Intel Core2 Duo

2GB

SATA disk

3 GB software

14 min

+
+
+
+
+
+

Quickstart - Pour l’utilisateur impatient

+
+
+

Ma première installation

+

Sans plus tarder, cette section fournira une +démonstration rapide et facile d’une installation entièrement +automatique à l’aide du CD FAI et d’une machine virtuelle.

+

Il suffit de télécharger l' image ISO du CD à partir de http://fai-project.org/fai-cd + et de démarrer votre VM à l’aide de ce CD. Vous verrez un menu grub où +vous pouvez choisir parmi différents types d’installation.

+

Cette installation s’exécutera sans serveur +d’installation. L’installation du CD est identique à celle exécutée dans + un environnement réseau à l’aide du serveur d’installation FAI.

+
+
+

Mon premier serveur d’installation

+

S’il vous plaît noter, si vous avez +l’intention d’utiliser QEMU/KVM, vous devez avoir qemu-kvm qemu-utils +bridge-utils installés sur la machine à utiliser fai-mk-network et +fai-kvm [3].

+

Vous pouvez le faire via

+
+
+
# apt-get install qemu-kvm qemu-utils bridge-utils
+
+

Si vous avez l’intention d’utiliser VMware ou +VirtualBox, assurez-vous que votre client utilise une connexion réseau +pontée. En outre, il n’est pas possible d’utiliser des interfaces réseau + pontées via le réseau sans fil, car la plupart des cartes réseau WiFi +ne prennent pas en charge cette fonctionnalité.

+

our configurer votre propre serveur FAI, nous +vous recommandons de créer un réseau de test sur votre ordinateur et +d’utiliser KVM. Pour créer ce réseau privé, il ya le script +fai-mk-network (dans le paquet fai-server). Il configure un pont +logiciel avec plusieurs dispositifs de dérivation qui appartiennent à +l’utilisateur<username>.

+
+
+
fai-mk-network <username>
+
+

Après cela, vous pouvez utiliser fai-kvm (-h +vous aidera) pour démarrer des machines virtuelles en utilisant KVM qui +sont connectés à ce réseau privé. Fais attention. Par défaut, fai-kvm +créera les images de disque pour les machines /tmp, qui est + un disque RAM sur la plupart des systèmes. Il n’y a aucun problème à +créer une image de disque vide de 20G dans /tmp (même si cette partition + est de 4 Go de taille), mais alors que la VM écrit des données sur son +disque, cela commencera à consommer de l’espace dans /tmp.

+

Démarrez le premier hôte virtuel, qui deviendra le serveur FAI [4]:

+
+
+
fai-kvm -Vn -s20 -u 1 cd fai-cd.iso
+
+

Dans le menu grub faiserver,faiserver, fixed IP. + Cela va installer un hôte appelé faiserver avec IP 192.168.33.250 qui +contient tous les logiciels nécessaires pour un serveur FAI. Il +configurera également un cache de paquets local (en utilisant +apt-cacher-ng). Une fois l’installation terminée, redémarrez la machine. + Lors du premier démarrage du nouveau système, il configurera +automatiquement le nfsroot. Cela peut prendre quelques minutes.

+

Après cela, vous pouvez démarrer des hôtes +supplémentaires en utilisant le démarrage réseau. Pour chaque nouvel +hôte, vous devez utiliser une valeur différente pour -u, qui sera utilisée pour générer des adresses MAC différentes et utiliser des noms de fichier d’image de disque différents.

+
+
+
fai-kvm -Vn -u 2 pxe
+
+

Ces clients d’installation vous montreront un +menu, où vous pouvez sélectionner le type d’installation que vous +souhaitez effectuer. Si le client d’installation ne trouve pas le +serveur, c’est généralement parce que fai-monitor ne fonctionne plus. +Cela peut se produire si vous redémarrez le faiserver après +l’installation. Pour remédier à cela, exécutez simplement fai-monitor +sur le faiserver et relancez le démarrage du client.

+

Un autre client pourrait être lancé avec:

+
+
+
fai-kvm -Vn -u 3 pxe
+
+

Vous pouvez démarrer autant de machines dans +le réseau que les périphériques de prise sont disponibles. Toutes ces +machines peuvent se connecter à l’Internet extérieur, mais sont +seulement accessibles à partir de votre machine hôte.

+
+
+
+
+

Vue d’ensemble et concepts

+
+

FAI est un système non interactif permettant +d’installer, de personnaliser et de gérer les configurations de systèmes + et de logiciels Linux sur les ordinateurs ainsi que sur les machines +virtuelles et les environnements chroot, des petits réseaux aux grandes +infrastructures et clusters. Vous pouvez prendre un ou plusieurs PC +vierges, mettre sous tension et après quelques minutes, Linux est +installé, configuré et exécuté sur l’ensemble du cluster, sans aucune +interaction nécessaire. Ainsi, il s’agit d’une méthode évolutive pour +installer et mettre à jour un cluster sans surveillance avec peu +d’efforts impliqués. FAI utilise le système d’exploitation Linux et une +collection de scripts shell et Perl pour le processus d’installation. +Les modifications apportées aux fichiers de configuration du système +d’exploitation peuvent être effectuées par CFEngine, shell (bash et +zsh), Perl, Python, Ruby et attendent des scripts.

+

Le groupe cible de FAI sont des +administrateurs système qui doivent installer Linux sur une ou même des +centaines d’ordinateurs. Parce qu’il s’agit d’un outil d’installation à +usage général, il peut être utilisé pour l’installation d’un cluster +Beowulf, d’une batterie de rendu ou d’un laboratoire Linux ou d’une +salle de classe. De plus, des réseaux Linux de grande envergure avec +différents matériels ou différentes exigences d’installation sont +faciles à établir à l’aide de FAI. Mais n’oubliez pas de planifier votre + installation. Le chapitre [plan] contient quelques conseils utiles pour ce sujet.

+
+

Conditions Générales

+

Premièrement, certains termes utilisés dans ce manuel sont décrits.

+
+
+Installer le serveur +
+
+

+Il fournit les services DHCP, TFTP et NFS ainsi que les données de +configuration pour tous les clients d’installation. Dans les exemples de + ce manuel, cet hôte s’appelle faiserver. L’hôte où le package fai-server est installé. +

+
+
+Installer le client +
+
+

+Un hôte qui sera installé à l’aide de FAI et une configuration fournie +par le serveur d’installation. Aussi appelé client pour courte. Dans ce +manuel, les hôtes d’exemple sont appelés demohost, xfcehost, gnomehost … + Cet ordinateur doit démarrer à partir de son interface réseau à l’aide +de PXE. +

+
+
+Espace de configuration +
+
+

+Une structure de sous-répertoire contenant plusieurs fichiers. Ces +fichiers décrivent les détails de la manière dont l’installation des +clients sera effectuée. Toutes les données de configuration sont +stockées ici. Il est également appelé config space pour le court. Il +comprend des informations sur: +

+
    +
  • +

    +Disposition du disque dur dans un format similaire à fstab +

    +
  • +
  • +

    +Systèmes de fichiers locaux, leurs types, points de montage et options de montage +

    +
  • +
  • +

    +Logiciels +

    +
  • +
  • +

    +Disposition du clavier, fuseau horaire, configuration Xorg, systèmes de fichiers distants, +comptes utilisateurs, imprimantes … +

    +
  • +
+

Le package fai-doc inclut un exemple +d’espace de configuration incluant des exemples pour les hôtes utilisant + l’environnement XFCE et GNOME parmi d’autres exemples.

+
+
+nfsroot, NFS-Root +
+
+

+Un système de fichiers situé sur le serveur d’installation. Pendant le +processus d’installation, c’est le système de fichiers complet pour les +clients d’installation. Tous les clients partagent le même nfsroot, +qu’ils montent en lecture seule. Le nfsroot a besoin d’environ 690 Mo +d’espace disque libre. +

+
+
+TFTP +
+
+

+Sert aux clients l’initrd et le noyau utilisés pour le processus +d’installation. Avec le système de fichiers servi par NFS, ces deux +composent un OS temporaire dans lequel les installations sont exécutées. +

+
+
+Classes FAI +
+
+

+Les classes sont des noms qui déterminent quel fichier de configuration +est sélectionné. Si un client appartient à la classe WEBSERVER, il sera +configuré en tant que serveur Web, la classe DESKTOP pour, par exemple, +détermine les progiciels qui seront installés. +

+
+
+profil +
+
+

+Un profil FAI est juste une liste de classes FAI assiged à un nom de +profil, qui est étendu par une description de ce profil. C’est-à-dire +que l’on peut avoir deux profils "Webserver", l’un incluant la classe +APACHE, y compris la classe NGINX, pour ensuite installer la solution +webserver respective. +

+
+
+les tâches +
+
+

+L’installation d’un client se compose de plusieurs parties, appelées +tâches. Les tâches sont des sous-programmes prédéfinis qui effectuent +une certaine partie de la FAI. Les tâches FAI suivantes sont exécutées +au cours d’une installation sur les clients d’installation. +

+
+
+
+
+

confdir # get the config space +setup # some initialization, start sshd on demand +defclass # define FAI classes +defvar # define variables +action # evaluate FAI_ACTION +install # Start the installation +partition # partition the harddisks, create file systems +mountdisks # mount the file systems +extrbase # extract the base.tar.xz +debconf # do the Debian debconf preseeding +repository # prepare access to the package repository +updatebase # Set up package tools and update packages +instsoft # install software packages +configure # call customization scripts +finish # do some cleanup, show installation statistics +tests # call tests if defined +chboot # call fai-chboot on the install server +savelog # save log files to local and remote location +faiend # reboot host, eject CD if needed

+
+
+
+
+
+

Il s’agit de tâches qui ne sont exécutées que lorsqu’une action différente est exécutée

+

dirinstall # install a chroot environment +softupdate # only do the system configuration +sysinfo # print detailed system information +inventory # print short hardware inventory list

+
+
+
+

Pour une description plus détaillée des tâches , voir [tasks].

+

Notez que vous n'êtes pas limité aux tâches +FAI. Vous pouvez également définir des programmes ou des scripts +supplémentaires qui seront exécutés à certaines occasions. On les +appelle des hooks.

+
+
+hooks +
+
+

+Les Hooks sont des plugins, ils peuvent ajouter des fonctionnalités +supplémentaires au processus d’installation ou même remplacer des tâches + entières de FAI. Les Hooks sont expliqués en détail dans [hooks]. +

+
+
+
+
+

Le concept de classe

+

Les classes sont utilisées dans presque toutes + les tâches de l’installation. Les classes déterminent quels fichiers de + configuration choisir parmi une liste d’alternatives disponibles. Pour +déterminer les fichiers de configuration à utiliser, FAI recherche la +liste des classes définies et utilise tous les fichiers de configuration + correspondant à un nom de classe [5]. La boucle suivante implémente cette fonction en pseudo code shell:

+
+
+
for class in $all_classes; do
+   if [ -r $config_dir/$class ]; then      # if a file with name $class exists
+      your_command $config_dir/$class      # call a command with this file name
+      # exit if only the first matching file is needed
+   fi
+done
+
+

La caractéristique très intéressante de ceci +est que vous pouvez ajouter une nouvelle alternative de configuration et + elle sera automatiquement utilisée par FAI sans changer le code, si le +fichier de configuration utilise un nom de classe.

+

C’est parce que la boucle détecte +automatiquement les nouveaux fichiers de configuration qui doivent être +utilisés. L’idée d’utiliser des classes en général et d’utiliser +certains fichiers correspondant à un nom de classe pour une +configuration est adoptée à partir des scripts d’installation par Casper + Dik pour Solaris. Cette technique s’est avérée très utile et facile.

+

Vous pouvez regrouper plusieurs hôtes +partageant les mêmes fichiers de configuration en utilisant la même +classe. Vous pouvez également diviser l’ensemble des données de +configuration pour tous les clients en plusieurs classes et les utiliser + comme des briques de lego et construire la configuration entière pour +un seul client en assemblant les briques ensemble.

+

Si un client appartient à la classe A, nous disons que la classe A est définie pour ce client. Une classe n’a pas de valeur, elle est juste définie ou non définie.

+

Les classes déterminent comment l’installation + est effectuée. Par exemple, un client d’installation peut être +configuré pour obtenir le bureau XFCE en y ajoutant simplement la classe + XFCE . Naturellement, des configurations plus granulaires sont + également possibles. Par exemple, les classes peuvent décrire comment +le disque dur doit être partitionné, ils peuvent définir quels paquets +logiciels seront installés ou quelles étapes de personnalisation seront +exécutées.

+

Souvent, une configuration client est créée en + modifiant ou en ajoutant uniquement les classes auxquelles ce client +appartient, ce qui rend l’installation d’un nouveau client très facile. +Ainsi, aucune information supplémentaire ne doit être ajoutée à l’espace + de configuration si les classes existantes suffisent à vos besoins.

+

Comme vous pouvez le voir, les classes sont un + pilier central de la personnalisation de votre espace de configuration +et de l’installation de votre client. Pour définir vos propres classes, +reportez-vous à [defining classes].

+
+
+
+
+

Configurer votre faiserver

+
+

Voici comment configurer le serveur d’installation en quelques minutes. Les étapes suivantes sont nécessaires:

+
    +
  1. +

    +Configurer le serveur d’installation +

    +
      +
    1. +

      +Installer des packages FAI +

      +
    2. +
    3. +

      +Créez le nfsroot +

      +
    4. +
    5. +

      +Copiez les exemples dans l’espace de configuration +

      +
    6. +
    7. +

      +Configurer les démons réseau +

      +
    8. +
    9. +

      +Créer les configurations PXELINUX +

      +
    10. +
    +
  2. +
  3. +

    +Démarrage et installation des clients +

    +
  4. +
+
+

Installer les paquetages FAI

+
    +
  • +

    +Installez la clé du référentiel de package de projet FAI: +

    +
  • +
  • +

    +Ajoutez l’URL du référentiel de packages du projet FAI. +

    +
  • +
  • +

    +Installez le paquet fai-quickstart sur votre serveur d' installation . +

    +
  • +
+
+
+
# wget -O - http://fai-project.org/download/074BCDE4.asc | apt-key add -
+# echo "deb http://fai-project.org/download jessie koeln" > /etc/apt/sources.list.d/fai.list
+# apt-get update
+# aptitude install fai-quickstart
+
+

Cela installera également les paquets pour les démons de serveur DHCP, TFTP et NFS.

+
+
+

Créez le nfsroot

+
    +
  • +

    +Activez également le référentiel de package du projet FAI dans un autre fichier sources.list qui est utilisé lors de la construction du nfsroot. Ensuite, activez l’utilisateur de journal pour FAI. +

    +
  • +
+
+
+
# sed -i -e 's/^#deb/deb/' /etc/fai/apt/sources.list
+# sed -i -e 's/#LOGUSER/LOGUSER/' /etc/fai/fai.conf
+
+
    +
  • +

    +Par défaut, FAI utilise http://httpredir.debian.org comme mirror de paquets, qui devrait tenter de trouver un référentiel de paquets rapide pour vous. [6] +Maintenant, nous pouvons exécuter fai-setup(8) [7] Et vérifier si tout s’est bien passé. Le fichier journal est écrit dans /var/log/fai/fai-setup.log. +

    +
  • +
+
+
+
# fai-setup -v
+
+
    +
  • +

    +Ce sont quelques-unes des lignes que vous verrez à la fin de fai-setup . + Un exemple complet de fai-setup.log est disponible sur la page Web FAI à + l’adresse http://fai-project.org/logs/fai-setup.log. +

    +
  • +
+
+
+
FAI packages and related packages inside the nfsroot:
+dracut             044+189-2
+dracut-network     044+189-2
+fai-client         5.3.3~bpo8+2
+fai-nfsroot        5.3.3~bpo8+2
+fai-setup-storage  5.3.3~bpo8+2
+Waiting for background jobs to finish
+fai-make-nfsroot finished properly.
+Log file written to /var/log/fai/fai-make-nfsroot.log
+Adding line to /etc/exports: /srv/fai/config 192.168.33.250/25(async,ro,no_subtree_check)
+Adding line to /etc/exports: /srv/fai/nfsroot 192.168.33.250/25(async,ro,no_subtree_check,no_root_squash)
+Reloading nfs-kernel-server configuration (via systemctl): nfs-kernel-server.service.
+
+   You have no FAI configuration space yet. Copy the simple examples with:
+   cp -a /usr/share/doc/fai-doc/examples/simple/* /srv/fai/config
+   Then change the configuration files to meet your local needs.
+Please don't forget to fill out the FAI questionnaire after you've finished your project with FAI.
+
+FAI setup finished.
+Log file written to /var/log/fai/fai-setup.log
+
+
    +
  • +

    +Fai-setup a créé le LOGUSER, le nfsroot et a ajouté des lignes supplémentaires à /etc/exports. Les sous-répertoires ajoutés à /etc/exports sont exportés via NFS v3, de sorte que tous les clients d’installation dans le même sous-réseau peuvent les monter via NFS. +

    +
  • +
+
+
+

Création de l’espace de configuration

+

Installez les exemples simples dans l’espace de configuration [8].

+
+
+
$ cp -a /usr/share/doc/fai-doc/examples/simple/* /srv/fai/config/
+
+

Ces exemples contiennent la configuration pour + certains hôtes d’exemple. Selon le nom d’hôte utilisé, votre ordinateur + sera configuré comme suit:

+
+
+demohost +
+
+

+Une machine qui n’a besoin que d’un petit disque dur. Cette machine est +configurée avec le réseau en tant que client DHCP, et une démo de compte + est créée. +

+
+
+xfcehost +
+
+

+Un bureau XFCE est installé, utilisant LVM, et la démo du compte est créée. +

+
+
+gnomehost +
+
+

+Un bureau GNOME est installé et la démo du compte est créée. +

+
+
+other host names +
+
+

+Les hôtes disposant d’un autre nom d’hôte utiliseront notamment les classes FAIBASE, DHCPC et GRUB. +

+
+
+

Tous les hôtes auront un compte appelé demo avec mot de passe fai. Le compte root a également le mot de passe fai.

+

Si l’indicateur FAI menu est +ajouté, au lieu d’utiliser le nom d’hôte pour déterminer le type +d’installation, un menu est présenté et l’utilisateur peut choisir un +profil pour l’installation.

+
+
+

Configurer les démons réseau

+

Pour démarrer le client d’installation via +PXE, le serveur d’installation a besoin d’un DHCP et d’un démon TFTP en +cours d’exécution. Le paquet fai-quickstart a déjà installé les + progiciels pour ces daemons. En outre, le paquetage du serveur NFS pour + l’exportation du nfsroot et de l’espace de configuration a été +installé.

+
+

Configuration du démon DHCP

+

déalement, votre faiserver doit également être + votre serveur DHCP. Si ce n’est pas le cas, demandez à l’administrateur + responsable du serveur DHCP de le configurer conformément à cette +section. En option, il est possible d'éviter cela en utilisant la +fonctionnalité [autodiscover] diffusée dans FAI 5.0.

+

n exemple pour dhcpd.conf(5) est fourni avec le paquet fai-doc. Commencez à utiliser cet exemple et regardez toutes les options qui y sont utilisées.

+
+
+
# cp /usr/share/doc/fai-doc/examples/etc/dhcpd.conf /etc/dhcp/
+
+

Les seules informations spécifiques FAI contenues dans ce fichier de configuration sont de définir le filename de fai/pxelinux.0 et de définir next-server et server-name + sur le nom de votre serveur d’install . Toutes les autres informations +sont uniquement des données liées au réseau, qui est utilisé dans +presque toutes les configurations DHCP. Ajustez ces paramètres de réseau + à vos besoins locaux.

+
+
+
deny unknown-clients;
+option dhcp-max-message-size 2048;
+use-host-decl-names on;
+
+subnet 192.168.33.0 netmask 255.255.255.0 {
+   option routers 192.168.33.250;
+   option domain-name "my.example";
+   option domain-name-servers 192.168.33.250;
+   option time-servers faiserver;
+   option ntp-servers faiserver;
+   server-name faiserver;
+   next-server faiserver;
+   filename "fai/pxelinux.0";
+}
+
+

Si vous apportez des modifications à la configuration DHCP, vous devez redémarrer le démon.

+
+
+
# /etc/init.d/isc-dhcp-server restart
+
+

Si vous disposez de plusieurs interfaces réseau, vous pouvez définir l’interface que le serveur écoutera dans /etc/default/isc-dhcp-server. Par défaut, le démon DHCP écrit ses messages de journalisation dans /var/log/daemon.log.

+
+
+

Ajout d’une entrée d’hôte au DHCP

+

L’adresse MAC est donnée par le matériel de la + carte réseau. Pour chaque client d’installation, vous collectez son +adresse MAC et la mappez à une adresse IP et à un nom d’hôte. Tout +d’abord, nous ajoutons l’adresse IP et le nom d’hôte à /etc/hosts [9].

+
+
+
192.168.33.100    demohost
+
+

Le mappage de l’adresse MAC à l’adresse IP est effectué dans le fichier dhcpd.conf. Ici, nous ajoutons une entrée d’hôte en utilisant la commande dhcp-edit(8) . Ici, vous devez remplacer 01:02:03:AB:CD:EF avec le MAC que vous avez trouvé.

+
+
+
# dhcp-edit demohost 01:02:03:AB:CD:EF
+
+

Après avoir appelé cette commande, c’est ce que l’entrée hôte dans dhcpd.conf ressemblera à:

+
+
+
host demohost {hardware ethernet 01:02:03:AB:CD:EF;fixed-address demohost;}
+
+
+
+

TFTP

+

Normalement, vous n’avez pas besoin d’apporter + de modifications à la configuration dameon TFTP. Les fichiers fournis +par TFTP sont situés dans /srv/tftp/fai.

+
+
+

NFS

+

La commande fai-setup a déjà configuré le démon NFS et ajouté quelques lignes au fichier de configuration /etc/exports. Il exporte les répertoires en utilisant NFS v3.

+
+
+
+

Création de la configuration PXELINUX

+

La dernière étape avant de démarrer votre +client pour la première fois est de spécifier quelle configuration le +client doit démarrer lors de l’amorçage PXE. Nous fai-chboot(8) la +commande fai-chboot(8) pour créer une configuration +pxelinux pour chaque client d’installation. Cela comprend des +informations sur le noyau, l’initrd, l’espace de configuration et +certains paramètres d’amorçage. Vous devriez lire la page de manuel, qui + vous donne quelques bons exemples. Voici la commande pour démarrer +l’installation de l’hôte demohost.

+
+
+
$ fai-chboot -IFv -u nfs://faiserver/srv/fai/config demohost
+Booting kernel vmlinuz-3.16.0-4-amd64
+ append initrd=initrd.img-3.16.0-4-amd64 ip=dhcp
+   FAI_FLAGS=verbose,sshd,createvt
+   FAI_CONFIG_SRC=nfs://faiserver/srv/fai/config
+
+demohost has 192.168.33.100 in hex C0A82164
+Writing file /srv/tftp/fai/pxelinux.cfg/C0A82164 for demohost
+
+

À ce stade, vous devriez avoir une +configuration faiserver de travail et vos clients devraient démarrer +dans FAI et être en mesure d’installer l’un des exemples.

+

Dans la section suivante, vous pouvez lire la +planification de votre installation, adapter votre espace de +configuration à vos besoins particuliers et étendre FAI à l’aide de +hooks.

+
+
+

Serveur personnalisé

+

Le faiseur et sa configuration n’est nullement + statique. Il est possible de personnaliser et d'étendre votre serveur. +Pour cela, reportez-vous à la section [Customizing your install server setup] dans [advanced].

+
+
+
+
+

Planifiez votre installation

+
+

Avant de commencer votre installation, vous +devriez investir beaucoup de temps dans la planification de votre +installation. Une fois que vous êtes satisfait de votre concept +d’installation, FAI peut faire toutes les tâches ennuyeuses et +répétitives pour transformer vos plans en réalité. FAI ne peut pas faire + de bonnes installations si votre concept est imparfait ou manque de +quelques détails importants. Commencez à planifier l’installation en +répondant aux questions suivantes:

+
    +
  • +

    +Est-ce que je vais créer un cluster Beowulf ou dois-je installer des machines de bureau? +

    +
  • +
  • +

    +À quoi ressemble ma topologie LAN? +

    +
  • +
  • +

    +Ai-je un matériel uniforme? Le matériel sera-t-il uniforme à l’avenir? +

    +
  • +
  • +

    +Le matériel a-t-il besoin d’un noyau spécial? +

    +
  • +
  • +

    +Comment nommer les hôtes? +

    +
  • +
  • +

    +Comment les disques durs locaux doivent-ils être partitionnés? +

    +
  • +
  • +

    +Quelles applications seront éxécuté par les utilisateurs? +

    +
  • +
  • +

    +Les utilisateurs ont-ils besoin d’un système de mise en file d’attente? +

    +
  • +
  • +

    +Quel logiciel doit être installé? +

    +
  • +
  • +

    +Quels démons devraient être lancés, et à quoi devrait ressembler la configuration? +

    +
  • +
  • +

    +Quels systèmes de fichiers distants doivent être montés? +

    +
  • +
  • +

    +Comment effectuer les sauvegardes? How should backups be performed? +

    +
  • +
+

Vous devez également penser à des comptes +d’utilisateur, des imprimantes, un système de courrier, des travaux de +cron, des cartes graphiques, l’initialisation double, le NIS, le NTP, le + fuseau horaire, la disposition de clavier, l’exportation et le montage +des annuaires via NFS et beaucoup d’autres choses. Donc, il ya beaucoup à + faire avant de commencer une installation. Et rappelez-vous que la +connaissance est le pouvoir, et c’est à vous de l’utiliser. +L’installation et l’administration sont un processus et non un produit. +FAI ne peut pas faire les choses que vous ne lui dites pas de faire.

+

Mais vous ne devez pas commencer à partir de +zéro. Examinez les fichiers et les scripts dans l’espace de +configuration. Il ya beaucoup de choses que vous pouvez utiliser pour +votre propre installation. Un bon article intitulé «Bootstrapping an +Infrastructure» avec d’autres aspects de la construction d’une +infrastructure est disponible sur http://www.infrastructures.org/papers/bootstrap/bootstrap.html

+
+

L’espace de configuration et ses sous-répertoires

+

L’espace de configuration est la collection +d’informations sur la façon exacte d’installer un client. L’espace de +configuration central pour tous les clients d’installation se trouve sur + le serveur d’installation dans /srv/fai/config et ses sous-répertoires. Cela sera monté par les clients d’installation dans /var/lib/fai/config. La commande d’installation principale fai(8) utilise tous ces sous-répertoires dans l’ordre indiqué sauf pour les hooks.

+
+
+class/ +
+
+

+ Scripts et fichiers pour définir des classes et des variables. +

+
+
+disk_config/ +
+
+

+ Fichiers de configuration pour le partitionnement de disque, RAID logiciel, LVM et création de système de fichiers. +

+
+
+basefiles/ +
+
+

+Normalement , le fichier base.tar.xz (situé à l' intérieur du +nfsroot) est extrait sur le client d’installation après la création des +nouveaux systèmes de fichiers et avant l’installation du package. Il +s’agit d’une image de base minimale, créée juste après avoir appelé +debootstrap lors de la création du nfsroot sur le serveur +d’installation. Si vous voulez installer une autre distribution que la +nfsroot, vous pouvez mettre un fichier tar dans le sous-répertoire basefiles/ + et le nommer après une classe. Ensuite, la commande ‘ftar(8)` est +utilisée pour extraire le fichier tar en fonction des classes définies. +Ainsi, le fichier doit être nommé’ CLASS.tar.xz et non CLASS.base.tar.xz . Cela se fait dans la tâche extrbase. + Utilisez cette option si vous souhaitez installer une autre +distribution ou une version différente de celle exécutée pendant +l’installation. +

+

Ce fichier de base peut également être reçu en + fonction des classes FAI via HTTP ou FTP en définissant la variable +FAI_BASEFILEURL. FAI téléchargera un fichier CLASSNAME.tar.xz (ou tgz, +ou tar.gz, …) à partir de cette URL, si CLASSNAME correspond à une +classe FAI.

+

Exemple:

+
+
+
+
+
FAI_BASEFILEURL=http://fai-project.org/download/basefiles
+
+

Le dossier doit prendre en charge la liste des répertoires. FAI ne recherchera pas de fichiers potentiellement correspondants.

+

Voir le chapitre [otherdists] pour savoir comment installer différentes distributions.

+
+
+debconf/ +
+
+

+Ce répertoire contient toutes les données debconf(7). Le format est le même que celui utilisé par debconf-set-selections(8). +

+
+
+package_config/ +
+
+

+Les fichiers contenant des noms de classe contiennent des listes de +progiciels à installer ou à désinstallé par ‘install_packages(8). Les fichiers nommés <CLASS>.asc sont ajoutés à la liste des clés utilisées par apt (à l’aide d’ `apt-key(8) ) pour les dépôts de paquets approuvés. +

+
+
+scripts/ +
+
+

+Scripts pour la personnalisation de votre site local. Utilisé par fai-do-scripts(1). +

+
+
+files/ +
+
+

+Les Fichiers utilisés par les scripts de personnalisation. La plupart +des fichiers se trouvent dans une structure de sous-arborescence qui +reflète l’arborescence de répertoires ordinaire. Par exemple, les +modèles de nsswitch.conf se trouvent dans $FAI/files/etc/nsswitch.conf et sont nommés en fonction des classes auxquelles ils doivent correspondre: $FAI/files/etc/nsswitch.conf/NIS est la version de /etc/nsswitch.conf + à utiliser pour la classe NIS. Notez que le contenu du répertoire n’est + pas automatiquement copié sur la machine cible, mais qu’il doit être +explicitement copié par des scripts de personnalisation à l’aide de la +commande fcopy(8) +. +

+
+
+hooks/ +
+
+

+ Les hooks sont des programmes ou des scripts définis par +l’utilisateur, qui sont appelés pendant le processus d’installation. +cela peut étendre ou remplacer les tâches par défaut. Le nom du fichier +doit être de format taskname.CLASSNAME[.sh]. Un hook appelé updatebase.DEBIAN est exécuté avant la mise à jour de la tâche updatebase et seulement si l’installation du client appartient à la classe DEBIAN. +

+
+
+
+
+

Définition des classes

+

Il existe différentes possibilités pour définir des classes: +. Certaines classes par défaut sont définies pour chaque hôte: DEFAULT, LAST et son nom d’hôte. +. Les classes peuvent être répertoriées dans un fichier. +. Les classes peuvent être dynamiquement définies par des scripts.

+

La dernière option est une fonctionnalité très + intéressante, puisque ces scripts définiront des classes est un moyen +très flexible. Par exemple, plusieurs classes peuvent être définies +uniquement si certains matériels sont identifiés ou si une classe est +définie en fonction des informations de sous-réseau du réseau.

+

Tous les noms de classes, sauf le nom d’hôte, +sont écrits en majuscules.ILs ne doivent pas contenir un trait d’union, +un dièse, un Point-Virgule OÜ un point, mais PEUVENT contenir des +characters de soulignement et des Chiffres.

+

La Tache defclass Appelle la commande fai-class(1) pour definir les classes. Tous les scripts correspondant ^[0-9][0-9]* (qui Commencent Avec Deux Chiffres) Dans le sous-repertoire $FAI/class + sont exécutées afin de definir les classes. Tout ce qui is affiché sur +STDOUT est automatiquement definie Comme une classe. pour Plus +d’informations sur Les définisions de Classe , lire les pages de manuel +versent fai-class(1). Le script 50-host-classes (voir ci - dessous la version allégée) est utilisé pour les définir des classes en fonction du nom d’hôte.

+
+
+
# use a list of classes for our demo machines
+case $HOSTNAME in
+    demohost)
+        echo "FAIBASE GRUB DHCPC DEMO" ;;
+    xfcehost)
+        echo "FAIBASE GRUB DHCPC DEMO XORG XFCE";;
+    faiserver)
+        echo "FAIBASE DEBIAN DHCPC DEMO FAISERVER" ;;
+    *)
+        echo "FAIBASE GRUB DHCPC" ;;
+esac
+
+

Les noms d’hôtes doivent Rarement Être utilisé + Pour Les Fichiers de configuration dans l’Espace de configuration.à la +place une classe Doit Être definie et ensuite ajouté Pour un hôte Donné. + En effet, la Plupart du Temps les Données de configuration ne sont pas +Spécifiques au d’nom hôte, mais peut etre partager entre differants +hôtes./p>

+

L’ordre des classes est important car Elle Définit la priorité des classes de Faible à Élevé.

+
+
+

Définition des Variables

+

La Tache defvar definit les variables pour l’installation du client. Les variables sont définies par les scripts Dans la class/*.var. Toutes les variables Globales PEUVENT Être définies Dans DEFAULT.var. Pour certains groupes d’hôtes utiliser un Fichier de classe ou Pour un seul hôte utiliser le Fichier $HOSTNAME .var . Ici aussi, il est utile d'étudier Tous les exemples.

+

Les variables suivantes sont utilisées dans les exemples et peuvent etre aussi utiles pour votre installation:

+
+
+FAI_ACTION +
+
+

+Réglez les actions que doit éffectuer FAI. Normalement, ceci se fait par fai-chboot(8). Si vous ne pouvez pas utiliser cette commande, définir la variable dans le script LAST.var. +

+
+
+FAI_ALLOW_UNSIGNED +
+
+

+Si défini à 1, FAI Permet l’installation de de paquets à partir de référentiels non Signés. +

+
+
+CONSOLEFONT +
+
+

+La police de qui est chargée lors de l’installation par setfont(8). +

+
+
+KEYMAP +
+
+

+Définit les Fichiers de mappage du clavier Dans /usr/share/keymaps et $FAI/files. Vous ne Devez pas spécifier le chemin complet, puisque ce fichier sera localisé automatiquement. +

+
+
+ROOTPW +
+
+

+Le mot de passe root chiffré pour le nouveau système. Vous pouvez utiliser ‘crypt(3), md5 et d’ Autres types de hachage pour le mot de passe. Utilisez `mkpasswd(1) pour créer le hachage d’un certain mot de passe. Par exemple, pour Générer le hachage MD5 pour l’utilisation du mot de passe. +

+
+
+
+
+
$ echo "yoursecrectpassword" | mkpasswd -Hmd5 -s
+
+
+
+UTC +
+
+

+Réglez l’horloge du matériel à UTC si UTC=yes. Sinon, régler l’horloge à l’heure locale. Voir clock(8) pour en plus d’informations. +

+
+
+TIMEZONE +
+
+

+Est-ce que le fichier d’initialisation par rapport à /usr/share/zoneinfo/' indique votre fuseau horaire. Par exemple: TIMEZONE=Europe/Berlin. +

+
+
+MODULESLIST +
+
+

+Une liste des modules du Noyau qui sont chargés pendent Le démarrage du nouveau systême (Écrit dans /etc/modules). +

+
+
+
+
+

Configuration du disque dur

+

L’outil setup-storage(8) lit le fichier dans $FAI/disk_config + pour la configuration du disque. Ce fichier décrit comment tous les +disques Locaux devrons etre partitionné, Quels types de Systèmes de +Fichiers doivent etre écris (Comme ext3/4, xfs, btrfs), et où ils seront + Montés. Vous pouvez aussi créer des configurations RAID logiciel et LVM + en Utilisant le Fichier de configuration. Il Est aussi possible de la +mise en Conservation de le partitionnage du disque ou de conserver Les +Donnees sur CERTAINES partitions.

+

Pendant le Processus d’installation de tous les Systèmes de Fichiers Locaux Sont Montés par rapport à /target. Par exemple, si vous Specifiez le Point de montage /home Dans un Fichier de configuration de disque, ce sera le répertoire /target/home pendant le Processus d’installation et deviendra /home pour le nouveau systéme Installé.

+
+
+

Extraction du fichier de base

+
+
+

Debconf préconfiguration

+
+
+

L’Accès au dépôt de paquetages

+
+
+

configuration du progiciel

+

Avant l’installation de de paquets, FAI va ajouter le contenu de Tous les Fichiers nommés package_config/class.asc + à la liste des clés apt. Si votre depo locale est signé par votre keyid + AB12CD34 vous pouvez Facilement ajouter cette clé, aussi FAI +l’utilisera pendant l’installation. Utilisez cette commande pour Créer +le fichier CLASS.asc:

+
+
+
faiserver$ gpg -a --export AB12CD34 > /srv/fai/config/package_config/MYCLASS.asc
+
+

Le script install_packages(8) installe les Logiciels Sélectionnés. Il lira tous les fichiers de configuration Dans $FAI/package_config Dont le nom correspond aux classes definie. La syntaxe est tres simple.

+
+
+
# an example package class
+
+PACKAGES taskinst
+german
+
+PACKAGES aptitude
+adduser netstd ae
+less passwd
+
+PACKAGES remove
+gpm xdm
+
+PACKAGES aptitude GRUB
+lilo- grub
+
+

Commentaires Commencent par un Dièse et se terminent à la fin de la ligne. Chaqué commande de paquetage commence par Le mot PACKAGES + Suivi par un nom de commande, Ce qui correspond à l’outil de package +Comme apt-get, aptitude ou yum par exemple. la commande qui définit la +commandent qui sera utilisé pour installer les paquets nommés après +cette commande. La liste de toutes les commandes disponibles peuvent +Être listé en utilisant install_packages -H. Les paquets d’outils pris en charges son aptitude, apt-get, smart, yast, yum, rpm, zypper

+
+
+hold +
+
+

+Mettez un paquet en attente. Ce Paquet ne sera pas pris en charges par dpkg, pas exemple non mis à niveau. +

+
+
+install +
+
+

+Installez Tous les paquets (en utilisant apt-get) Qui sont +précise dans les lignes Suivantes. Si un tiret est ajouté au nom du +paquet (sans espace intermédiaire), le paquet sera supprimé, pas +installé. Tous les noms de paquets sont vérifiées pour les fautes +d’orthographe. Tout paquet qui n’existe pas, seront retiré de la liste +des paquets à l’installation. Soyer donc prudentes de ne pas mal +orthographier les noms de paquets. +

+
+
+install-norec +
+
+

+Comme install,mais sans installer les paquets recommandés. +

+
+
+remove +
+
+

+Supprimer tous les paquets qui sont péciser dans les lignes suivantes. +Annexer un + au nom du paquet si le paquet doit Être installé. +

+
+
+taskinst +
+
+

+Installez tous les paquets appartenant aux tâches qui sont spécifiées dans les lignes suivantes à l’aide de tasksel(1). Vous pouvez aussi utiliser aptitude pour installer les tâches. +

+
+
+aptitude +
+
+

+Installez Ttus les paquets avec la commande aptitude. Ce sera la Valeur par défaut à l’avenir et pourra remplacer apt-get et taskinst. Aptitudes peut aussi installer les paquets +

+
+
+aptitude-r +
+
+

+Idem aptitude avec l’option --with-recommends. +

+
+
+unpack +
+
+

+Télécharge les paquets et décompresse seulement. Ne configure pas le paquet. +

+
+
+dselect-upgrade +
+
+

+Defini la sélections des paquets en Utilisant les lignes suivantes et +installe ou supprime les paquets précisés. Ces lignes sont le résultat +de la commande dpkg --get-selections. Il est recommandé de ne +pas utiliser ce format, puisque vous devez aussi specifiez tous les +paquets qui ne sont pas installés en raison d’une dépendance ou +recommandation. Il vaut mieux juste spécifier le paquet que vous voulez +avoir, et de laisser FAI (et apt-get) résoudre les dépendances. +

+
+
+

Plusieurs lignes avec des listes de noms de +paquets séparés par des espaces suivent les directive PACKAGES. Toutes +les dépendances sont résolues. Les paquetages avec suffixe - (par exemple, lilo-) + seront supprimés au lieu d'être installés. L’ordre des paquet n’a pas +d’importance. Si vous souhaitez installer des paquets d’une autre +version que la valeur par défaut, vous pouvez ajouter le nom de la +version au nom du paquet comme dans openoffice.org/etch-backports. Vous pouvez également spécifier une certaine version comme apt=0.3.1. Plus d’informations sur ces fonctionnalités sont décrites dans aptitude(8).

+

Une ligne qui contient la commande PRELOADRM, télécharge un fichier à l’aide de wget(1) dans un répertoire avant d’installer les packages. À l’aide du file: URL, ce fichier est copié de $FAI_ROOT vers le répertoire de téléchargement. Par exemple, le package realplayer a besoin d’une archive pour installer le logiciel, donc cette archive est téléchargée dans le répertoire /root. + Après l’installation des paquets, ce fichier sera supprimé. Si le +fichier ne doit pas être supprimé, utilisez plutôt la commande PRELOAD.

+

Il est possible d’ajouter une liste de noms de classes après la commande pour apt-get. Ainsi, cette commande PACKAGE + ne sera exécutée que si la classe correspondante est définie. Ainsi, +vous pouvez combiner de nombreux petits fichiers dans le fichier +DEFAULT. ATTENTION! Utilisez cette fonctionnalité uniquement dans le +fichier DEFAULT pour garder tout simple. Voir ce fichier pour quelques +exemples.

+

Si vous souhaitez supprimer un nom de paquet +d’une certaine classe faisait partie avant de cette classe , vous ne +devez pas supprimer le nom du paquet classe, mais plutôt de lui ajouter +un tiret (-). Cela garantira que le paquet est enlevé pendant une mise a + jour sur des hôtes qui étaient Installé en utilisant l’ancienne +définition de classe qui comprenait ce nom de paquet.

+

Si vous spécifiez un paquet qui n’existe pas, +ce paquet sera supprimé automatiquement de la liste d’installation +uniquement si la commande install est utilisée.

+
+
+

Scripts de personnalisation

+

La commande fai-do-scripts(1) est + appelée pour exécuter tous les scripts dans ce répertoire. Si un +répertoire avec un nom de classe existe, tous les scripts correspondant à + ^[0-9][0-9]* sont exécutés par ordre alphabétique. Il est donc + possible d’utiliser des scripts de différentes langues (shell, +cfengine, Perl, Python, Ruby, expect,..) pour une classe.

+

Ces scripts écrivent leur sortie dans +différents fichiers journaux, selon le type de script. Par exemple, Tous + les scripts shell écrivent leur journal dans shell.log.

+
+

Scripts shell

+

La plupart des scripts sont des scripts Bourne + shell. Les scripts shell sont utiles si la tâche de configuration ne +doit seulement appeler certaines commandes shell ou créer un fichier à +partir de zéro. Afin de ne pas écrire beaucoup de scripts courts, il est + possible d’utiliser la commande ifclass pour tester si certaines classes sont définies.

+
+
+
ifclass -o A B C
+
+

Vérifie si l’une des classes A, B ou C est +définie. L’utilisation de -a (AND logique) vérifie si toutes les classes + d’une liste sont définies. La commande ifclass C vérifie si seule la +classe C est définie.

+

Pour copier des fichiers avec des classes, utilisez la commande fcopy(8). Si vous voulez extraire une archive à l’aide de classes, utilisez ftar(8). Pour ajouter des lignes à un fichier de configuration, utilisez ainsl(1) au lieu de simplement echo string >> filename.

+

FAI prend également en charge les scripts zsh(1) pendant la tâche de personnalisation. Dans les scripts, la variable $classes contient une liste séparée par des espaces avec les noms de toutes les classes définies.

+
+
+

Scripts cfengine

+

CFEngine dispose d’un riche ensemble de fonctions pour modifier les fichiers de configuration existants, par exemple LocateLineMatching, ReplaceAll, InsertLine, AppendIfNoSuchLine, HashCommentLinesContaining. + Mais il ne peut pas traiter les variables qui sont indéfinies. Si une +variable n’est pas définie, l’ensemble du script cfengine s’arrêtera.

+

Plus d’informations peuvent être trouvées dans la page de manuel cfengine(8) ou sur la page d’accueil cfengine http://www.cfengine.org.

+
+
+
+

Hooks

+

Les Hooks vous permettent de spécifier des +fonctions ou des programmes qui sont exécutés à certaines étapes du +processus d’installation. Avant qu’une tâche soit appelée, FAI recherche + les hooks existants pour cette tâche et les exécute. Comme on peut s’y +attendre, les classes sont également utilisées lors de l’appel de hooks. + Les hooks sont exécutés pour chaque classe définie. Vous n’avez qu'à +créer le hook avec le nom de la classe désirée et il sera utilisé. Si +plusieurs hooks pour une tâche existent, ils sont appelés dans l’ordre +défini par les classes. Si debug est inclus dans $FAI_FLAG l’option -d + est passée à tous les hooks, donc vous pouvez déboguer vos propres +hooks. Si certaines tâches par défaut doivent être ignorées, utilisez la + sous-routine skiptask et une liste de tâches par défaut comme +paramètres. Dans les exemples fournis, les hooks de la classe CENTOS +ignorent certaines tâches spécifiques de Debian.

+

Le répertoire $FAI/hooks/' contient tous les hooks. Un hook est un fichier exécutable qui suit le nom de tâche taskname.CLASSNAME[.sh]' (par exemple, repository.CENTOS ou savelog.LAST.sh), + un nom de tâche et un nom de classe séparés par un point, +éventuellement suivi de '.sh. Le nom de la tâche spécifie la tâche +devant précéder l’exécution de ce hook, si la classe spécifiée est +définie pour le client d’installation. Voir la section [tasks] pour une liste complète des tâches par défaut pouvant être utilisées.

+

Un hook du formulaire hookprefix.classname + ne peut pas définir de variables pour le script d’installation, car il +s’agit d’un sous-processus. Mais vous pouvez utiliser n’importe quel +exécutable binaire ou n’importe quel script que vous avez écrit. Les +hooks qui ont le suffixe .sh (par exemple, +'partition.DEFAULT.sh) doivent être des scripts Bourne shell et sont +sourcé. Il est donc possible de redéfinir des variables pour les scripts + d’installation.

+

Dans la première partie de FAI, tous les hooks avec le préfixe confdir + sont appelés. Ces hooks ne peuvent pas être localisés dans l’espace de +configuration, car il n’est pas encore disponible. Par conséquent, ces +hooks sont les seuls hooks situés dans $nfsroot/$FAI/hooks sur le serveur d’installation. Tous les autres hooks se trouvent dans $FAI_CONFIGDIR/hooks sur le serveur d’installation.

+

Tous les hooks appelés avant la définition des classes ne peuvent utiliser que les classes suivantes: DEFAULT $HOSTNAME LAST. Si un hook pour la classe DEFAULT doit être appelé uniquement si aucun hook pour la classe $HOSTNAME n’est disponible, insérez ces lignes sur le hook par défaut:

+
+
+
hookexample.DEFAULT:
+
+#! /bin/sh
+
+# skip DEFAULT hook if a hook for $HOSTNAME exists
+scriptname=$(basename $0 .DEFAULT)
+[-f $FAI/hooks/$scriptname.$HOSTNAME ] && exit
+# here follows the actions for class DEFAULT
+.
+.
+
+

Quelques exemples de ce que les hooks pourraient être utilisés:

+
    +
  • +

    +Charger les modules du noyau avant que les classes soient définies dans $FAI/class. +

    +
  • +
  • +

    +Envoyez un courriel à l’administrateur si l’installation est terminée. +

    +
  • +
  • +

    +Installez un client sans disque et sautez le partitionnement de disque local. +

    +
  • +
  • +

    +Jetez un oeil à hooks/debconf.IMAGE pour savoir comment cloner une machine en utilisant une image de système de fichiers. +

    +
  • +
+
+
+

FAI flags

+

La variable $FAI_FLAGS contient une liste de flags séparés par des espaces. Les flags suivants sont connus:

+
+
+verbose +
+
+

+Créez une sortie verbeuse pendant l’installation. Cela doit toujours +être le premier flag, de sorte que les définitions consécutives des +flags seront affichées verbeusement. +

+
+
+debug +
+
+

+Créer une sortie de débogage. Aucune installation sans assistance n’est +effectuée. Pendant l’installation du paquet, vous devez répondre à +toutes les questions des scripts postinstall sur la console du client. +Beaucoup d’informations de débogage seront imprimées. Ce flag n’est +utile que pour les développeurs FAI. +

+
+
+sshd +
+
+

+Démarrez le démon ssh pour activer les connexions à distance. Vous +pouvez ensuite vous connecter en tant que root à tous les clients +d’installation pendant l’installation. Le mot de passe par défaut est +fai et peut être modifié en définissant FAI_ROOTPW dans nfsroot.conf(5). + Pour vous connecter à partir de votre serveur vers le client +d’installation (nommé demohost dans cet exemple), utilisez: +

+
+
+
+
+
$ ssh root@demohost
+Warning: Permanently added 'demohost,192.168.33.100' to the list of known hosts.
+root@demohost's password:
+
+

Ce n’est que le mot de passe root pendant le +processus d’installation, pas pour le nouveau système installé. Vous +pouvez également vous connecter sans mot de passe lorsque vous utilisez $SSH_IDENTITY.

+
+
+createvt +
+
+

+Créez deux terminaux virtuels et exécutez un bash si ctrl-c est tapé dans le terminal de console. Vous pouvez accéder aux terminaux supplémentaires en tapant Alt-F2 ou Alt-F3. Sinon, aucun terminal n’est disponible et la saisie ctrl-c + va redémarrer le client d’installation. La définition de ce flag est +utile pour le débogage. Si vous voulez une installation qui ne devrait +pas être interruptible, ne définissez pas ce flag. +

+
+
+menu +
+
+

+Cela permet à un menu utilisateur de sélectionner un profil. Tous les fichiers class/*.profile sont lus et un menu basé sur des curses sera créé. +

+
+
+reboot +
+
+

+Redémarrez le client d’installation une fois l’installation terminée +sans taper RETURN sur la console. Si ce drapeau n’est pas défini, et que + error.log contient quelque chose, le client d’installation s’arrêtera +et attendra que vous appuyez sur RETURN. Si aucune erreur ne s’est +produite, le client redémarre automatiquement automatiquement. +

+
+
+halt +
+
+

+Arrêtez le client d’installation à la fin de l’installation, au lieu de redémarrer dans le nouveau système. +

+
+
+initial +
+
+

+Utilisé par setup-storage(8). Les partitions marquées avec preserve_reinstall sont préservées à moins que ce flag ne soit défini. Souvent, ce drapeau est placé dans un fichierclass/*.var en utilisant le paramètre flag_initial=1. +

+
+
+
+
+
+
+

FAI installe votre planification

+
+
+

La première partie d’une installation

+

Après le démarrage du noyau, il monte le +système de fichiers racine via NFS à partir du serveur d’installation et + démarre le script /usr/sbin/fai [10]. Ce script contrôle la séquence de l’installation. Aucun autre script dans /etc/init.d/ n’est utilisé.

+

L’espace de configuration est rendu disponible + via la méthode configurée (un montage NFS par défaut) du serveur +d’installation au chemin défini dans $FAI [11].

+
+
+

Messages de boot

+

Lorsque vous démarrez le client d’installation à partir de la carte réseau avec PXE, vous obtiendrez des messages comme ceci:

+
+
+
Managed PC Boot Agent (MBA) v4.00
+Pre-boot eXecution Environment (PXE) v2.00
+DHCP MAC ADDR: 00 A2 A3 04 05 06
+DHCP.../
+
+CLIENT MAC ADDR: 00 A2 A3 04 05 06  GUID: 3D6C4552
+CLIENT IP: 192.168.33.100 MASK: 255.255.255.0  DHCP IP: 192.168.33.250
+GATEWAY IP: 192.168.33.1
+
+!PXE entry point found (we hope) at 9854:0106 via plan A
+UNDI code segment at: 9854 len 5260
+UNDI data segment at: 921D len 63A2
+Getting cached packet  01 02 03
+My Ip address seems to be C0A82164 192.168.33.100
+ip=192.168.33.100:192.168.33.250:192.168.33.1:255.255.255.0
+BOOTIF=01-00-A2-A3-04-05-06
+SYSUUID=
+TFTP prefix: fai/
+Trying to load pxelinux.cfg/C0A82164
+
+Loading vmlinuz-3.16.0-4-amd64..................
+Loading initrd.img-3.16.0-4-amd64......................ready.
+
+

À ce stade, le client d’installation a réussi à + recevoir le réseau Config via DHCP et le noyau et initrd via TFTP. Il +démarre maintenant Le noyau Linux et l’initrd. Si tout allait bien, +l’initrd Monte nfsroot [12] Et les scripts FAI sont lancés. La première chose que vous voyez est le message en rouge de copyright FAI.

+
+
+
             -------------------------------------------------
+                   Fully Automatic Installation  -  FAI
+
+                   5.3.3~bpo8+2  (c) 1999-2017
+               Thomas Lange  <lange@informatik.uni-koeln.de>
+             -------------------------------------------------
+
+Calling task_confdir
+Kernel currently running: Linux 3.16.0-4-amd64 x86_64 GNU/Linux
+Kernel parameters: BOOT_IMAGE=vmlinuz-3.16.0-4-amd64 initrd=initrd.img-3.16.0-4-amd64 \
+ rw aufs ip=dhcp root=192.168.33.250:/srv/fai/nfsroot FAI_FLAGS=verbose,sshd,createvt\
+ FAI_CONFIG_SRC=nfs://faiserver/srv/fai/cskoeln FAI_ACTION=install quiet\
+ BOOTIF=01-00-a2-a3-04-05-06
+Reading /tmp/fai/boot.log
+FAI_FLAGS: verbose sshd createvt
+Setting SERVER=faiserver. Value extracted from FAI_CONFIG_SRC.
+FAI_CONFIG_SRC is set to nfs://faiserver/srv/fai/config
+Configuration space faiserver:/srv/fai/config mounted to /var/lib/fai/config
+Calling task_setup
+FAI_FLAGS: verbose sshd createvt
+15 Jan 13:22:37 ntpdate[1533]: step time server 192.168.33.250 offset -0.342793 sec
+Press ctrl-c to interrupt FAI and to get a shell
+Starting FAI execution - 20170115_132237
+Calling task_defclass
+fai-class: Defining classes.
+Executing /var/lib/fai/config/class/10-base-classes.
+10-base-classes      OK.
+Executing /var/lib/fai/config/class/20-hwdetect.source.
+Loading kernel module md-mod
+20-hwdetect.source   OK.
+Executing /var/lib/fai/config/class/50-host-classes.
+50-host-classes      OK.
+List of all classes: DEFAULT LINUX AMD64 FAIBASE DHCPC DEMO GRUB client01 LAST
+
+

Vous pouvez également voir la liste des +classes FAI, qui sont définies pour ce hôte. Cette liste est très +importante pour le reste de l’installation.

+

La première tâche est appelée confdir, + qui est chargée de Accès à l’espace de configuration. Ici, nous +utilisons un montage NFS à partir de l’installation Comme vous pouvez le + voir sur la console (et plus tard dans les journaux).

+
+
+
FAI_CONFIG_SRC is set to nfs://faiserver/srv/fai/config
+Configuration space faiserver:/srv/fai/config mounted to /var/lib/fai/config
+
+

Avant de lancer l’installation ($FAI_ACTION=install), + l’ordinateur Bip trois fois. Donc, faites attention quand vous entendez + trois bips mais vous Ne voulez pas effectuer une installation et +laisser FAI effacer toutes vos données sur Le disque local!

+
+
+

Redémarrage de l’ordinateur dans le nouveau système

+

Pour redémarrer l’ordinateur pendant ou à la fin de l’installation, vous devez utiliser la commande faireboot en faveur de la commande de redémarrage normal. Utilisez aussi faireboot si vous êtes connecté depuis la télécommande. Si l’installation n’est pas terminée, utilisez faireboot -s, donc les fichiers journaux sont également copiés sur le serveur d’installation.

+

Si l’installation est terminée, l’ordinateur doit démarrer un petit système Debian. Vous pouvez vous connecter en tant que demo ou root avec le mot de passe fai.

+
+
+

Démarrage de FAI (tâche confdir)

+

Une fois le client d’installation démarré, seul le script /usr/sbin/fai est exécuté. Il effectuera une initialisation minimale. La variable $FAI_CONFIG_SRC [13] est utilisée pour accéder à l’espace de configuration FAI qui est alors disponible dans le répertoire $FAI [14]. FAI ne se déroulera pas sans l’espace de configuration.

+
+
+

Définition de classes et de variables (tâches defclass et defvar)

+

La commande fai-class(1) exécute des scripts dans $FAI/class + pour définir des classes. Si les scripts écrivent une chaîne sur +stdout, cela sera défini comme une classe. Lisez tous les détails dans +la page de manuel de fai-class(1).

+

Après avoir défini les classes, chaque fichier correspondant à .var avec un préfixe qui correspond à une classe définie provient de variables définies. Il doit contenir le code shell vaild.

+
+
+

Partitionnement de disques locaux, création de systèmes de fichiers (tâches de partitionnement)

+

Pour le partitionnement du disque, un fichier de configuration de disque de $FAI/disk_config est sélectionné à l’aide de classes.

+

Le format de la configuration du disque est similaire à un fichier fstab.

+

L’outil de partitionnement setup-storage(8) + exécute toutes les commandes nécessaires à la création de la +disposition de la partition du disque, du RAID logiciel, du LVM et de la + création des systèmes de fichiers. Lisez la page de manuel de setup-storage(8) pour une description détaillée et quelques exemples du format.

+
+
+

Préréglage Debconf (tâche debconf)

+

Les fichiers dans $FAI/debconf sont utilisés par debconf(7) habituel en présselectionnant si les noms de fichier correspondent à un nom de classe.

+
+
+

Installation de progiciels (tâche instsoft)

+

La commande install_packages(8) lit les fichiers de configuration à partir de $FAI/package_config en classe et installe des progiciels sur le nouveau système de fichiers.

+

Il installe les paquets en utilisant apt-get(8), aptitude(1), yum + ou d’autres outils de paquetage sans aucune interaction manuelle +nécessaire. Les paquets sont également résolus par les outils de +paquets.

+

Le format des fichiers de configuration est décrit dans [packageconfig].

+
+
+

Personnalisation spécifique au site (task configure)

+

Souvent, les configurations par défaut des +progiciels ne répondent pas à vos besoins spécifiques au site. Vous +pouvez appeler des scripts arbitraires qui ajustent la configuration du +système. Par conséquent, la commande fai-do-scripts(1) exécute des scripts dans $FAI/scripts + d’une manière basée sur la classe. Il est possible d’avoir plusieurs +scripts de différents types (shell, cfengine, …) à exécuter pour une +classe.

+

L’ensemble de scripts par défaut dans $FAI/scripts + inclut des exemples d’installation de machines Debian et CentOS. Ils +définissent le mot de passe root, ajoutent un compte utilisateur démo, +paramétrent le fuseau horaire, configurent le réseau pour DHCP ou +utilisent une adresse IP fixe,la configuration grub et plus encore. Ils +devraient faire un travail raisonnable pour votre installation. Vous +pouvez les modifier ou ajouter de nouveaux scripts pour répondre à vos +besoins locaux.

+

Plus d’informations sur ces scripts sont décrits dans [cscripts].

+
+
+

Enregistrement des fichiers journaux (tâche savelog)

+

Lorsque toutes les tâches sont terminées, les fichiers journaux sont écrits dans /var/log/fai/$HOSTNAME/install/_[15] sur le nouveau système et sur le compte sur le serveur d’installation si $LOGUSER + est défini. Il est également possible de spécifier un autre hôte comme +enregistrement en enregistrant la destination via la variable $LOGSERVER. Si $LOGSERVER n’est pas défini, FAI utilise la variable $SERVER qui n’est définie que lors d’une installation initiale (par get-boot-info). Assurez-vous de définir $LOGSERVER dans un script _class/*.var si vous utilisez l’action softupdate.

+

De plus, deux liens symboliques seront créés pour indiquer le dernier répertoire écrit. Le lien symbolique last pointe vers le répertoire journal de la dernière action FAI exécutée. Les liens symboliques last-install et last-sysinfo + pointent vers le répertoire avec la dernière action correspondante. Par + défaut, les fichiers journaux seront copiés sur le serveur de journal à + l’aide de scp. Vous pouvez utiliser la variable $FAI_LOGPROTO dans le fichier fai.conf(5) + pour choisir une autre méthode d’enregistrement des journaux sur le +serveur distant. Voici un exemple de structure de lien symbolique:

+
+
+
lrwxrwxrwx   1 fai fai   23 Dec  2  2013 last-sysinfo -> sysinfo-20131202_161237
+drwxr-xr-x   2 fai fai 4096 Dec  2  2013 sysinfo-20131202_161237
+drwxr-xr-x   2 fai fai 4096 Feb 14  2014 install-20140214_142150
+drwxr-xr-x   2 fai fai 4096 Dec  2 11:47 install-20141202_113918
+lrwxrwxrwx   1 fai fai   23 Dec  4 13:22 last-install -> install-20141204_131351
+lrwxrwxrwx   1 fai fai   23 Dec  4 13:22 last -> install-20141204_131351
+drwxr-xr-x   2 fai fai 4096 Dec  4 13:22 install-20141204_131351
+
+

Vous trouverez des exemples de fichiers journaux à l’adresse http://fai-project.org/logs.

+
+
+

Redémarrez le nouveau système installé

+

Avant de redémarrer, le client d’installation appelle fai-chboot -d <hostname> + sur le serveur d’installation, pour désactiver sa propre configuration +PXELINUX. Sinon, il redémarrera l’installation lors de la prochaine +initialisation. Normalement, cela devrait démarrer le nouveau système +installé à partir de son second périphérique d’amorçage, le disque dur +local.

+

À la fin, le système est automatiquement redémarré si "reboot" a été ajouté à $FAI_FLAGS.

+
+
+
+
+

Chapitre avancés de FAI

+
+
+

Vérification des paramètres reçus des serveurs DHCP

+

Si le client d’installation démarre, vous +pouvez vérifier si toutes les informations provenant du démon DHCP sont +correctement reçues. Les informations reçues sont écrites dans /tmp/fai/boot.log. Un exemple de résultat d’une requête DHCP peut être trouvé dans les fichiers journaux d’exemple.

+
+
+

Surveillance de plusieurs installations clientes

+

Vous pouvez surveiller l’installation de tous les clients d’installation avec la commande fai-monitor(8). + Tous les clients vérifient si ce démon est en cours d’exécution sur le +serveur d’installation (ou sur l’ordinateur défini par la variable +$monserver). Chaque fois qu’une tâche démarre ou se termine, un message +est envoyé. Le démon du moniteur FAI imprime ces messages à la sortie +standard. Il ya aussi un frontend graphique disponible, appelé fai-monitor-gui(1).

+
+
+
$  fai-monitor | fai-monitor-gui - &
+
+
+
+

Collecte d’adresses Ethernet pour plusieurs hôtes

+

Vous devez collecter toutes les adresses +Ethernet (MAC) des clients à l’installation et affecter un nom d’hôte et + une adresse IP à chaque client. Pour collecter les adresses MAC, +démarrez vos clients pour l’installation. Vous pouvez déjà le faire +avant que n’importe quel démon DHCP s’exécute dans votre sous-réseau. +Ils échoueront à démarrer (en raison du manque de DHCP ou de TFTP +manquant), mais vous pouvez toujours collecter les adresses MAC.

+

Pendant que les clients d’installation +démarrent, ils envoient des paquets de diffusion au LAN. Vous pouvez +enregistrer les adresses MAC de ces hôtes en exécutant simultanément la +commande suivante sur le serveur:

+
+
+
faiserver# tcpdump -qtel broadcast and port bootpc >/tmp/mac.list
+
+

Une fois que les hôtes ont été envoyés, certains paquets de diffusion annule tcpdump en tapant ctrl-c. Vous obtenez une liste de toutes les adresses MAC uniques avec ces commandes:

+
+
+
faiserver$ perl -ane 'print "\U$F[0]\n"' /tmp/mac.list|sort|uniq
+
+

Après cela, vous n’avez qu'à assigner ces +adresses MAC aux noms d’hôte et aux adresses IP (/etc/ethers et +/etc/hosts ou aux cartes NIS correspondantes). Avec ces informations, +vous pouvez configurer votre démon DHCP (voir la section [bootdhcp]). [16]

+
+

Débogage du trafic réseau

+

Si le client ne peut démarrer correctement à partir de la carte réseau, utilisez tcpdump(8) + pour rechercher des paquets Ethernet entre le serveur d’installation et + le client. Recherchez également les entrées de plusieurs fichiers +journaux effectués par tftpd(8) et dhcpd(8) :

+
+
+
faiserver$ egrep "tftpd|dhcpd" /var/log/*
+
+
+
+
+

Détails du démarrage PXE

+

Ici, nous décrivons les détails du démarrage +PXE, qui ne sont nécessaires que si vous avez des problèmes lors du +démarrage de vos clients d’installation.

+

Presque toutes les cartes réseau modernes +prennent en charge l’environnement de démarrage PXE. PXE est +l’environnement d’exécution de pré-lancement. Cela nécessite le chargeur + de démarrage PXELINUX et une version spéciale du démonTFTP, disponible +dans les paquets Debian pxelinux et tftpd-hpa. + Le démarrage PXE nécessite également un serveur DHCP, afin que la carte + réseau puisse configurer ses paramètres IP. Il s’agit de la séquence +d’une amorce PXE:

+
    +
  • +

    +La carte réseau du client envoie son adresse MAC +

    +
  • +
  • +

    +Le serveur DHCP répond à la configuration IP du client +

    +
  • +
  • +

    +La carte réseau configure son IP +

    +
  • +
  • +

    +Le client d’installation obtient le binaire pxelinux.0 via TFTP +

    +
  • +
  • +

    +Obtenez le fichier de configuration pxelinux.cfg/C0A8210C via TFTP +

    +
  • +
  • +

    +C0A8210C est l’adresse IP du client en hexadécimal +

    +
  • +
  • +

    +Cette configuration contient le noyau, initrd et les paramètres de ligne + de commande supplémentaires du noyau, qui a été créé par fai-chboot. +

    +
  • +
  • +

    +Obtenez le noyau et initrd via TFTP. +

    +
  • +
+

Exemple d’un fichier pxelinux.cfg:

+
+
+
default fai-generated
+
+label fai-generated
+kernel vmlinuz-3.16.0-4-amd64
+append initrd=initrd.img-3.16.0-4-amd64 ip=dhcp  root=/srv/fai/nfsroot aufs  FAI_FLAGS=verbose,sshd,createvt FAI_CONFIG_SRC=nfs://faiserver/srv/fai/config FAI_ACTION=install
+
+

Voir /usr/share/doc/syslinux/pxelinux.doc + pour des informations plus détaillées sur PXELINUX. Il existe un +nouveau binaire lpxelinux qui prend également en charge le chargement du + noyau et de l’initrd via FTP ou HTTP. La commande fai-chboot(8)' prend en charge cette option avec l’option -U.

+
+
+

Personnalisation de la configuration de votre serveur d’installation

+
    +
  • +

    +Miroir de paquetage local/plus rapide +

    +
  • +
  • +

    +Loguser différent +

    +
  • +
  • +

    +Local root password dans nfsroot +

    +
  • +
+

La configuration du paquet FAI (et non les données de configuration pour les clients d’installation) est définie dans fai.conf(5). Les définitions qui sont utilisées uniquement pour créer le nfsroot sont situées dans nfsroot.conf(5). Vérifiez ces variables importantes dans nfsroot.conf avant d’appeler fai-setup ou fai-make-nfsroot.

+
+
+FAI_DEBOOTSTRAP +
+
+

+La construction de nfsroot utilise la commande debootstrap(8). + Il a besoin de l’emplacement d’un miroir Debian et du nom de la +distribution (wheezy, jessie, stretch, sid) pour lequel le système +Debian de base devrait être construit. N’utilisez pas de distributions +différentes ici et dans /etc/fai/apt/sources.list. Cela créera un nfsroot brisé. +

+
+
+NFSROOT_ETC_HOSTS +
+
+

+Cette variable n’est nécessaire que si les clients n’ont pas accès à un +serveur DNS. Cette variable multiligne est ajoutée à /etc/hosts dans le +nfsroot. Ensuite, les clients d’installation peuvent accéder à ces hôtes + par leur nom sans utiliser DNS. +

+
+
+

Le contenu de /etc/fai/apt/sources.list + est utilisé par le serveur d’installation et par les clients. Si votre +serveur d’installation a plusieurs cartes réseau et différents noms +d’hôte pour chaque carte (comme pour un serveur Beowulf), utilisez le +nom du serveur d’installation qui est connu des clients d’installation.

+

Si vous avez des problèmes lors de l’exécution de fai-setup, ils proviennent habituellement de fai-make-nfsroot(8) qui est appelé par la commande précédente. L’ajout de -v vous donne une sortie plus détaillée qui vous aide à repérer l’erreur. La sortie est écrite dans /var/log/fai/fai-make-nfsroot.log. [17]

+

L’installation crée également le compte fai (défini par $LOGUSER) s’il n’est pas déjà disponible. Vous pouvez donc ajouter un utilisateur avant d’appeler fai-setup(8) à l’aide de la commande adduser(8) + et utiliser ce compte local pour enregistrer des fichiers journaux. Les + fichiers journaux de tous les clients d’installation sont enregistrés +dans le répertoire de base de ce compte. Vous devriez changer le groupe +principal de ce compte, donc ce compte a des droits d'écriture sur /srv/tftp/fai pour appeler fai-chboot pour créer la configuration PXE pour les hôtes.

+

Lorsque vous apportez des modifications à fai.conf, nfsroot.conf, le nfsroot doit être reconstruit en appelant fai-make-nfsroot(8). Si vous souhaitez uniquement installer un nouveau paquet kernel sur nfsroot, ajoutez les flags -k ou -K à fai-make-nfsroot. + Cela ne recréera pas votre nfsroot, mais ne mettra à jour que vos +noyaux et les modules du noyau dans le nfsroot ou ajoutera des paquets +supplémentaires dans le nfsroot.

+
+
+

Création d’un CD FAI ou d’une clé USB

+

Vous pouvez facilement créer un CD +d’installation (ou clé USB) pour votre installation réseau. Cela +permettra d’effectuer la même installation et la même configuration à +partir du CD sans avoir besoin du serveur d’installation. Par +conséquent, vous devez créer un miroir partiel de tous les paquets +Debian nécessaires à vos classes FAI (à l’aide de fai-mirror(1)). Ensuite, la commande fai-cd(8) mettra ce miroir, le nfsroot et l’espace de configuration sur un CD amorçable. C’est tout!

+

Ce CD d’installation contient toutes les données nécessaires à l’installation. La commande fai-cd(8) + place le nfsroot, l’espace de configuration et un sous-ensemble du +miroir Debian sur un CD-ROM. Un miroir de paquets partiel est créé à +l’aide de la commande fai-mirror(1) qui contient tous les +paquetages utilisés par les classes utilisées dans votre espace de +configuration. Un échantillon d’image ISO est disponible à l’adresse http://fai-project.org/fai-cd.

+

Avec la commande dd(1), vous +pouvez également créer une clé USB bootable en écrivant simplement le +contenu du fichier ISO sur votre clé USB (ici le stick est /dev/sdf).

+
+
+
 faiserver# dd if=fai-cd.iso of=/dev/sdf bs=1M
+
+

Il ne s’agit pas d’un live CD du serveur d’installation.

+
+
+

Création d’images de disque VM à l’aide de FAI

+

En utilisant la commande fai-diskimage(8), + vous pouvez créer des images de disques de machines Linux qui peuvent +être utilisées avec une machine virtuelle comme KVM, VMware, VirtualBox +ou un service cloud comme OpenStack, GCE, EC2 et autres. Le processus +d’installation exécute les tâches FAI normales sur une image de disque +brut. Après l’installation, vous pouvez démarrer l’image disque et avoir + un système en cours d’exécution. L’image disque peut également être +convertie au format qcow2.

+
+
+
 faiserver# export FAI_BASEFILEURL=http://fai-project.org/download/basefiles/
+ faiserver# fai-diskimage -u cloud3 -S 2G -cDEBIAN,JESSIE64,AMD64,FAIBASE,GRUB_PC,CLOUD,GCE disk.raw
+
+

Crée le fichier disk.raw pour un hôte appelé cloud3, avec un petit ensemble de progiciels.

+
+
+
 # export FAI_BASEFILEURL=http://fai-project.org/download/basefiles/
+ # cl=DEFAULT,DHCPC,DEBIAN,AMD64,FAIBASE,GRUB_PC,UBUNTU,XENIAL,XENIAL64,XORG
+ # fai-diskimage -v -u foobar -S5G -c$cl ubuntu.qcow2
+
+

Crée une image de disque appelée ubuntu.qcow2 pour un bureau Ubuntu 16.04 avec un nom d’hôte défini sur foobar.

+

Vous ne devez pas configurer le nfsroot +lorsque vous utilisez uniquement fai-diskimage. Mais vous avez besoin +d’un fichier de base dans votre espace de configuration. Vous pouvez +télécharger une image de base Debian à partir de http://fai-project.org/download/basefile + et copier ceci dans votre espace de configuration. Si vous avez déjà +configuré le nfsroot, vous pouvez copier le fichier de base Debian +depuis le nfsroot dans votre espace de configuration à l’aide de cette +commande:

+
+
+
 $ cp /srv/fai/nfsroot/var/tmp/base.tar.xz
+ $ /srv/fai/config/basefiles/JESSIE64.tar.xz
+
+
+
+

Système de sauvetage FAI

+

Si vous définissez la variable $FAI_ACTION sur sysinfo (par exemple en utilisant fai-chboot -S), le client n’installera pas de nouveau système, mais collectera beaucoup d’informations système. Si vous définissez $FAI_ACTION sur inventory, + vous ne recevrez que quelques informations sur le matériel. Les deux +actions peuvent être utilisées pour FAI comme un système de sauvetage.

+

Tapez ctrl-c pour obtenir un shell ou utilisez Alt-F2 ou Alt-F3 et vous obtiendrez un autre terminal de console, si vous avez ajouté createvt à $FAI_FLAGS.

+

Vous avez maintenant un système Linux en cours + d’exécution sur le client d’installation sans utiliser le disque dur +local. Utilisez-le comme système de secours si votre disque local est +endommagé ou si l’ordinateur ne peut pas démarrer correctement à partir +du disque dur. Vous obtiendrez un shell et vous pouvez exécuter diverses + commandes (dmesg, lsmod, df, lspci, …). Regardez le fichier journal dans /tmp/fai. Vous y trouverez de nombreuses informations sur le processus d’amorçage.

+

FAI monte tous les systèmes de fichiers qu’il +trouve sur les disques locaux en lecture seule. Il vous indique +également sur quelle partition un fichier /etc/fstab existe. +Lorsqu’une seule table de système de fichiers est trouvée, les +partitions sont montées selon ces informations. Voici un exemple:

+
+
+
demohost:~# df
+Filesystem      1K-blocks      Used Available Use% Mounted on
+rootfs            4099064    414088   3645296  11% /
+192.168.33.250:/srv/fai/nfsroot
+                  3905600    410976   3454944  11% /live/image
+tmpfs              193464      3112    190352   2% /live/cow
+aufs              4099064    414088   3645296  11% /
+
+192.168.33.250:/srv/fai/config
+                  3905600    410976   3454944  11% /var/lib/fai/config
+/dev/sda1          241116     74519    154149  33% /target
+/dev/sda9         4364212    139888   4179988   4% /target/home
+/dev/sda7          553376     16840    536536   4% /target/tmp
+/dev/sda8         2221628    275936   1832840  14% /target/usr
+/dev/sda6          577096    172924    374856  32% /target/var
+
+

Cette méthode peut être utilisée comme un environnement de secours! Si vous avez besoin d’un système de fichiers avec accès en lecture/écriture, utilisez la commande rwmount:

+
+
+
demohost# rwmount /target/home
+
+
+
+

FAI sans NFS

+

Pour démarrer dans FAI et commencer la +séquence d’installation sans utiliser le protocole NFS. Vous démarrez la + machine cliente en utilisant PXE comme d’habitude, puis récupérez une +image contenant le nfsroot via http.

+

Pour créer une image, utilisez l’argument -S de fai-cd

+
+
+
faiserver# fai-cd -S squash.img
+
+

Déplacez cette image vers un répertoire à +partir duquel elle peut être demandée via http (généralement un +répertoire desservi par le serveur web)

+

Pour demander maintenant l’image squashfs, +ajoutez ce qui suit à votre ligne de commande du noyau, p. Dans votre +fichier de configuration pxelinux pour le client.

+
+
+
root=live:http://faiserver/cskoeln/squash.img
+
+

Remplacez faiserver par le nom de domaine ou IP de la machine à laquelle votre image de squash est servie.

+
+
+

Installation d’autres distributions à l’aide d’un nfsroot Debian

+

Vous pouvez installer toutes sortes de +distributions Linux à partir d’un seul nfsroot Debian. Par conséquent, +vous devez créer un fichier base.tar.xz de la distribution que vous +souhaitez installer et le placer dans le répertoire basefiles. + Puis nommez-le UBUNTU1404.tar.xz par exemple. Un client d’installation +appartenant à la classe UBUNTU1404 extrait ensuite ce fichier de base +dans son système de fichiers vide. De plus, vous devez ajuster les +sources.list ou les fichiers de configuration similaires nécessaires +pour spécifier l’emplacement du référentiel de paquets.

+

L’outils rinse(8) est utilisé +pour créer des fichiers de base pour la distribution comme CentOS, +openSUSE, Scientific Linux Cern ou Fedora. Certains fichiers de base +peuvent être téléchargés à partir de http://fai-project.org/download/basefiles/.

+

Le script mk-basefile dans /usr/share/doc/fai-doc/examples/simple/basefiles/' aide à créer ces fichiers de base.

+
+
+

Création d’environnements chrooter et virtualiser

+

Si vous devez créer certains environnements +chroot, ou un environnement de virtualisation où vous ne pouvez ni ne +voulez exécuter un programme d’installation Debian normal pour accéder à + un système opérationnel (par exemple, les domaines hôtes Xen), il ya +l’action FAI dirinstall. +En appelant

+
+
+
faiserver# fai <options> dirinstall <target-directory>
+
+

Et en utilisant l’option -c <classes> ou -N + vous obtenez une installation FAI, sans l’action de partitionnement, +directement dans le répertoire cible. Le nom d’hôte de l’installation +cible peut être spécifié à l’aide de -u <host-name>

+

Ceci, par exemple, peut être utilisé pour combiner FAI avec l’outil xen-tools, qui vous aide à construire des domaines invités Xen. xen-tools + est très agréable pour générer des fichiers de configuration et bloquer + des périphériques pour de nouveaux invités basés sur des commandes +simples et/ou des fichiers de configuration, mais ils ne peuvent +assigner qu’un seul rôle par installation pour la personnalisation. Les +FAI-utilisateurs ont besoin et veulent plus, car ils sont utilisés pour +avoir le système de classe. Ils les obtiennent même dans les +installations xen-tools, en utilisant le code suivant en tant que rôle +xen-tools script:

+
+
+
#!/bin/sh
+TARGET=$1
+CMD="fai -N  -v -u ${hostname} dirinstall $TARGET"
+echo running $CMD
+$CMD
+
+

Ensuite, vous voulez définir la variable install=0 de la configuration xen-tools pour cet hôte.

+
+
+

Utilisation de FAI pour les mises à jour

+

FAI peut également effectuer des mises à jour +de systèmes déjà en cours d’exécution, sans réinstallation à partir de +zéro. C’est ce qu’on appelle softupdate. Un FAI softupdate ignore les +tâches qui ne sont pas adaptées à la mise à jour d’un système en cours +d’exécution, comme le partitionnement des disques durs et la création de + systèmes de fichiers. Au lieu de cela, il exécute uniquement les tâches + de mise à jour et d’installation des progiciels et de l’appel des +scripts de personnalisation.

+

Pour exécuter un appel softupdate:

+
+
+
# fai -v -s nfs://faiserver/srv/fai/config softupdate
+
+

Par défaut, un softupdate utilise la liste des + classes définies lors de l’installation initiale. Assurez-vous de +définir la variable $LOGSERVER (effectuée dans un fichier class/*.var) si FAI doit enregistrer les fichiers journaux sur une machine distante.

+

C’est à vous, comment démarrer un softupdate +sur un plus grand nombre d’hôtes. Vous pouvez faire le softupdate sur +une base régulière via cron ou vous pouvez utiliser des outils comme clusterssh(1) pour démarrer un softupdate via un push sur une liste d’hôtes.

+

Gardez à l’esprit que les scripts de +personnalisation sont exécutés chaque fois que vous faites un +softupdate. Cela signifie qu’ils doivent être idempotents, + c’est-à-dire que le résultat de leur fonctionnement doit toujours +produire le même résultat, même lorsqu’ils fonctionnent plus d’une fois.

+

Par exemple, l’ajout d’une ligne à un fichier ne doit pas se faire via ce code:

+
+
+
$ echo "some strings" >> /etc/fstab
+
+

Utilisez plutôt la commande ainsl(1) dans un script shell ou utilisez la fonction AppendIfNoSuchLine de cfengine.

+

Toutes les commandes du script de +personnalisation doivent être capables de modifier le système de +fichiers cible s’il est disponible dans /target lors de l’installation initiale ou si c’est le système de fichiers normal relatif à / pendant le softtupdate.

+

Voici quelques variables qui aident à écrire ces scripts:

+
+
+$target +
+
+

+Pointe vers le répertoire racine du client, qui est /target pendant l’installation et / pendant un softupdate. +

+
+
+$FAI_ROOT +
+
+

+C’est la même valeur que $target. Pour des raisons historiques, nous avons ces deux variables dans FAI. +

+
+
+$ROOTCMD +
+
+

+Dans le cas de l’installation, il s’agit d’un alias pour chroot $target + en cas de softupdate c’est juste vide. Vous pouvez ajouter ceci aux +commandes si vous avez besoin d’exécuter une commande dans le système de + fichiers cible des clients via chroot. +

+
+
+$FAI_ACTION +
+
+

+Si vous devez appeler le code en fonction de l’action FAI effectuée, +vous pouvez utiliser cette variable. Il contient l’action actuellement +exécutée: install, softupdate, dirinstall, sysinfo, inventory ou votre propre action définie. +

+
+
+
+
+

Comment installer un système d’exploitation 32 bits à partir d’un système d’exploitation 64 bits

+

Pour installer un ordinateur avec un système +d’exploitation 32 bits, vous avez besoin d’un nfsroot i386. La création +de cette nfsroot 32 bits sur un serveur d’installation exécutant amd64 +est assez simple. Installez et configurez les paquets FAI. Copiez +ensuite vos fichiers de configuration FAI dans un nouveau +sous-répertoire.

+
+
+
faiserver# cp -a /etc/fai /etc/fai-i386
+
+

Modifiez la variable $FAI_DEBOOTSTRAP_OPTS dans /etc/fai-i386/nfsroot.conf et ajoutez l’option --arch i386. Choisissez également un répertoire différent pour votre nouveau nfsroot. Voici les deux lignes après l'édition.

+
+
+
NFSROOT=/srv/fai/nfsroot-i386
+FAI_DEBOOTSTRAP_OPTS="--arch i386 --exclude=info --include=aptitude""
+
+

Appelez maintenant fai-make-nfsroot qui crée le nfsroot 32 bits dans /srv/fai/nfsroot-i386

+
+
+
faiserver# fai-make-nfsroot -v -C/etc/fai-i386
+
+

La création d’un miroir partiel utilisant fai-mirror(1) + nécessaire à un CD amorçable ou une clé USB est également possible sur +une architecture différente. Vous devez spécifier l’architecture lors de + l’appel de fai-mirror.

+
+
+
$ fai-mirror -m800 -B -a i386 -v -cDEFAULT,DEBIAN,FAIBASE,I386 /srv/mirror-i386
+
+

C’est tout!

+
+
+
+
+

Divers conseils et détails

+
+
+

La liste des tâches

+

La plupart des tâches de l’installation sont définies comme des sous-routines qui sont définies dans /usr/lib/fai/subroutines (par exemple task_instsoft). Certains sont des scripts shell externes situés dans /usr/lib/fai/. Ils sont appelés via un sous-programme supérieur appelé task. Ce sous-programme appelle les hooks si disponibles, puis appelle la tâche (définie comme task<name>_). Une tâche et ses hooks peuvent être ignorés à la demande en utilisant la commande skiptask().

+

Suit maintenant la description de toutes les tâches, énumérées dans l’ordre dans lequel elles sont exécutées.

+
+
+confdir +
+
+

+Les paramètres ajoutés au noyau peuvent définir des variables, le démon +syslog est démarré. La liste des périphériques réseau est stockée dans $netdevices. + Ensuite, des paramètres supplémentaires sont extraits d’un serveur +DHCP. Le fichier de configuration du résolveur DNS est créé. +

+

L’emplacement de l’espace de configuration est défini par la variable $FAI_CONFIG_SRC.

+

Ensuite, le fichier $FAI/hooks/subroutines + est sourcé s’il existe. En utilisant ce fichier, vous pouvez définir +vos propres sous-programmes ou remplacer la définition des +sous-programmes FAI.

+
+
+setup +
+
+

+Cette tâche définit l’heure du système, tous les $FAI_FLAGS + sont définis et deux terminaux virtuels supplémentaires sont ouverts à +la demande. Un démon de shell sécurisé est lancé à la demande pour les +connexions à distance. +

+
+
+defclass +
+
+

+Appellez fai-class(1) pour définir des classes à l’aide de scripts et de fichiers dans $FAI/class et classes de /tmp/fai/additional-classes et la variable $ADDCLASSES. La liste de toutes les classes définies est stockée dans la variable $classes et enregistrée dans /tmp/fai/FAI_CLASSES. +

+
+
+defvar +
+
+

+Sourcez tous les fichiers $FAI/class/*.var pour chaque classe définie. Si un hook a écrit quelques définitions de variables dans le fichier $LOGDIR/additional.var, ce fichier est également sourcé. +

+
+
+action +
+
+

+En fonction de la valeur de $FAI_ACTION, ce sous-programme décide de l’action FAI à exécuter. Les actions disponibles par défaut sont: sysinfo, install, inventory, dirinstall et softupdate. Si $FAI_ACTION a une autre valeur, une action définie par l’utilisateur est appelée si un fichier $FAI/hooks/$FAI_ACTION existe. Ainsi, vous pouvez facilement définir vos propres actions. +

+
+
+sysinfo +
+
+

+Appelée lorsque aucune installation n’est effectuée mais que l’action est sysinfo. Il affiche des informations sur le matériel détecté et monte les disques durs locaux en lecture uniquement sur /target/partitionname ou en regard d’un fichier fstab trouvé à l’intérieur d’une partition. Les fichiers journaux sont stockés sur le serveur d’installation. +

+
+
+inventory +
+
+

+Une courte liste des informations système est imprimée. +

+
+
+install +
+
+

+Cette tâche contrôle la séquence d’installation. Vous entendrez trois +bips avant le début de l’installation. Le travail principal consiste à +appeler d’autres tâches et à enregistrer la sortie dans /tmp/fai/fai.log. Si vous avez des problèmes pendant l’installation, regardez tous les fichiers dans /tmp/fai/. Vous trouverez des exemples de fichiers journaux à l’adresse http://fai-project.org/logs/. +

+
+
+dirinstall +
+
+

+Installez dans un répertoire, et non pas sur un disque local. Utilisez-le pour créer des environnements chrootés. +

+
+
+softupdate +
+
+

+Cette tâche, exécutée à l’intérieur d’un système en cours d’exécution via l’interface de ligne de commande fai(8), effectue un softupdate. Voir le chapitre [softupdate] pour plus de détails. +

+
+
+partition +
+
+

+Appelle setup-storage(8) pour partitionner les disques durs + et créer des systèmes de fichiers. La tâche écrit des définitions de +variables pour la partition et le périphérique racine et de démarrage ($ROOT_PARTITION, $BOOT_PARTITION, $BOOT_DEVICE) dans /tmp/fai/disk_var.sh et crée un fichier fstab pour le nouveau système. +

+
+
+mountdisks +
+
+

+Montez les partitions créées en fonction du fichier /tmp/fai/fstab créé par rapport à $FAI_ROOT. +

+
+
+extrbase +
+
+

+Extrait un système minimal après lequel un chroot peut y être introduit. Par défaut, le fichier tar base /var/tmp/base.tar.xz sera extrait. Les fichiers correspondant à un nom de classe dans $FAI/basefiles/ + sont également utilisés pour décompresser un autre fichier tar selon +les classes définies. Cela peut être utilisé pour installer des +distributions Linux différentes de celles utilisées pour créer le +nfsroot. Le fichier par défaut base.tar.xz est un instantané d’un système Debian de base créé par debootstrap(8) Cette tâche utilise la variable FAI_BASEFILEURL pour extraire le fichier de base via FTP ou HTTP si elle est définie. +

+
+
+debconf +
+
+

+Appelle fai-debconf(1) pour définir les valeurs de la base de données de préconfiguration de debconf. +

+
+
+repository +
+
+

+Préparez l’accès au référentiel de paquets en préparant la configuration + apt. Cela peut également ajouter des clés de référentiel via apt-key(8) en classe à partir de fichiers comme CLASSNAME.asc dans le répertoire package_config. +

+
+
+updatebase +
+
+

+Met à jour les paquets de base du nouveau système et met à jour la liste + des paquets disponibles. Il falsifie également certaines commandes +(appelées diversions) à l’intérieur du nouveau système installé à l’aide + de dpkg-divert(8), de sorte qu’aucun démon ne sera démarré pendant l’installation. +

+
+
+instsoft +
+
+

+Installe les progiciels souhaités en utilisant des fichiers de classe dans $FAI/package_config/. +

+
+
+configure +
+
+

+Appelle les scripts dans $FAI/scripts/ et ses sous-répertoires pour chaque classe définie. +

+
+
+tests +
+
+

+Appelle les scripts de test dans $FAI/tests/ et ses sous-répertoires pour chaque classe définie. +

+
+
+finish +
+
+

+Démonte tous les systèmes de fichiers dans le nouveau système installé +et supprime les diversions de fichiers à l’aide de la commande fai-divert. +

+
+
+chboot +
+
+

+Modifie la configuration PXE d’un hôte sur le serveur d’installation qui + indique quelle configuration PXELINUX doit être chargée lors de la +prochaine initialisation à partir de la carte réseau via TFTP. Par +conséquent, la commande fai-chboot(8) est exécutée à distance sur le serveur d’installation. +

+
+
+savelog +
+
+

+Enregistre les fichiers journaux sur le disque local et sur le compte $LOGUSER sur $LOGSERVER (par défaut sur le serveur d’installation). +

+
+
+faiend +
+
+

+Attendez que les travaux en arrière-plan se terminent (par exemple, +emacs compile des fichiers lisp) et redémarre automatiquement les +clients d’installation ou attend la saisie manuelle avant le +redémarrage. +

+
+
+
+
+

Tests automatisés

+

Après l’exécution des scripts de +personnalisation, FAI exécutera certains tests si disponibles. En +utilisant ces tests, vous pouvez vérifier les erreurs de l’installation. + Les scripts de test sont appelés via fai-do-scripts(1) et doivent ajouter leurs messages à $LOGDIR/test.log. Un module Perl comprenant des sous-routines utiles peut être trouvé dans Faitest.pm. Un test peut également définir une nouvelle classe pour exécuter d’autres tests lors du prochain démarrage via la variable $ADDCLASSES.

+
+
+

Découvrir automatiquement

+

Dans FAI 5.0, nous avons publié une +fonctionnalité qui permet aux clients de rechercher le faiserver dans +leur sous-réseau respectif. Cela soulève la nécessité de récupérer +l’adresse MAC de chaque client et de configurer le démon DHCP.

+

Cela se fait en démarrant à partir d’une +petite autodiscover FAI bootmedium (CD, USB, etc.), qui peut être créée +via la commande:

+
+
+
faiserver# fai-cd -A autodiscover.iso
+
+

L’image a une taille d’environ 25 Mo et +analyse le sous-réseau d’un serveur FAI. Par défaut, il affiche un menu +avec tous les profils disponibles dans l’espace de configuration de la +même manière que le drapeau de menu. Dans ce menu, vous pouvez +sélectionner le type d’installation que vous souhaitez effectuer.

+

Pour que les clients puissent trouver le faiserver, le faiserver doit exécuter fai-monitor.

+
+
+

Modification du périphérique d’amorçage

+

La modification de la séquence d’amorçage +s’effectue normalement dans la configuration du BIOS. Mais vous ne +pouvez pas changer le BIOS d’un système Linux en cours d’exécution.

+

Ainsi, la séquence d’amorçage du BIOS restera +inchangée et votre ordinateur devrait toujours démarrer en premier à +partir de sa carte réseau et le deuxième périphérique d’amorçage devrait + être le disque local. Ensuite, vous pouvez changer le périphérique +d’amorçage du client en créant différentes configurations PXELINUX. Cela + définira si une installation doit être effectuée, ou si le client doit +démarrer à partir du disque local. Cela se fait à l’aide de fai-chboot(8).

+
+
+

Comment créer un miroir Debian local

+

Le script mkdebmirror [18] peut être utilisé pour créer votre propre miroir Debian local. Ce script utilise la commande debmirror(1). + Un miroir Debian partiel pour l’architecture i386 et amd64 pour Debian +8.0 (aka jessie) sans les paquets source nécessite environ 56Go d’espace + disque. L’accès au miroir via HTTP sera la méthode par défaut dans la +plupart des cas. Pour afficher plus de résultats à partir du script, +appelez mkdebmirror -v. Un compte root n’est pas nécessaire pour créer et maintenir le miroir Debian.

+

Pour utiliser l’accès HTTP au miroir Debian +local, installez un serveur Web et créez un lien symbolique vers le +répertoire local où se trouve votre miroir:

+
+
+
faiserver# apt-get install apache2
+faiserver# ln -s /files/scratch/debmirror /var/www/html/debmirror
+
+

Créez un fichier sources.list(5) dans /etc/fai/apt qui donne accès à votre miroir Debian. Ajoutez également l’adresse IP du serveur HTTP à la variable $NFSROOT_ETC_HOSTS dans nfsroot.conf si les clients d’installation n’ont pas de résolution DNS.

+
+
+

Petits conseils

+
    +
  • +

    +Lorsque vous utilisez l’accès HTTP à un miroir Debian, la partition locale /var + sur tous les clients d’installation doit être suffisamment grande pour +conserver les paquets Debian téléchargés. N’essayez pas avec moins de +250 Moctets à moins que vous sachiez pourquoi. Vous pouvez limiter le +nombre de paquets installés à la fois avec la variable $MAXPACKAGES. +

    +
  • +
  • +

    +Vous pouvez supprimer le logo rouge sur le client d’installation en appelant simplement une fois reset. Il ne s’affichera pas si vous créez un fichier à l’aide de cette commande sur le serveur d’installation: +

    +
  • +
+
+
+
touch /srv/fai/nfsroot/.nocolorlogo
+
+
    +
  • +

    +Une liste des variables utilisées par FAI peut être trouvée à http://wiki.fai-project.org/wiki/Variables. +

    +
  • +
  • +

    +Vous pouvez raccourcir certains scripts de personnalisation en utilisant une seule commande fcopy fcopy -r /. +

    +
  • +
  • +

    +Si vous reconstruisez le nfsroot, vous allez créer une nouvelle clé hôte + ssh dans le nfsroot. La connexion à un client d’installation peut +échouer, car la clé hôte change. Vous pouvez utiliser ceci: +

    +
  • +
+
+
+
$ ssh -o StrictHostKeyChecking=no root@installclient
+
+
    +
  • +

    +Vous pouvez également supprimer l’entrée hôte de votre client d’installation dans votre fichier ~/.ssh/known_hosts à l’aide de la commande ssh-keygen -R. +

    +
  • +
  • +

    +Dans les tâches chboot et savelog, une connexion utilisant un shell sécurisé est ouverte au serveur FAI (voir [isavelog]). Pour garantir que cela fonctionne de manière non interactive, une entrée appropriée dans NFSROOT/root/.ssh/known_hosts + doit être créée. Lors de l’utilisation de fai-setup, cela se fait +automatiquement, mais il peut s’avérer nécessaire de l'éditer +manuellement si le nom de votre serveur FAI n’a pas été correctement +déterminé. Si vous trébuchez sur des connexions ssh qui nécessitent de +taper "yes" pour accepter la clé hôte pendant l’installation, vérifiez +le contenu de votre fichier NFSROOT/root/.ssh/known_hosts +

    +
  • +
  • +

    +Une liste de tous les disques durs locaux est stockée dans $disklist. Il est défini après l’appel de set_disk_info. +

    +
  • +
  • +

    +Utilisez fai-divert -a si un script postinst appelle un +programme de configuration, par exemple Le script postinst pour package +apache appelle apacheconfig, qui nécessite une entrée manuelle. Vous +pouvez fausser le programme de configuration pour que l’installation +puisse être entièrement automatique. +

    +
  • +
  • +

    +Parfois, l’installation semble s’arrêter, mais souvent il ya seulement +un script postinstall d’un logiciel qui nécessite une entrée manuelle de + la console. Passez à un autre terminal virtuel et regardez quel +processus fonctionne avec des outils comme top(1) et pstree(1). Vous pouvez ajouter debug à FAI_FLAGS + pour faire en sorte que le processus d’installation affiche toutes les +sorties des scripts postinst sur la console et obtenir son entrée aussi à + partir de la console. +

    +
  • +
  • +

    +Comment puis-je définir des classes sur la ligne de commande du noyau? +

    +

    Lisez la page de manuel de fai-class(8). Si vous souhaitez définir des classes supplémentaires (par exemple A, B, C) sur la ligne de commande du noyau, ajoutez ceci: ADDCLASSES=A,B,C

    +
  • +
  • +

    +Comment utiliser un noyau personnalisé dans le nfsroot? +

    +

    Construisez votre noyau personnalisé en construisant un paquet kernel à l’aide de make-kpkg(8) et utilisez l’option --initrd. + Copiez ce paquet Debian dans un référentiel local et ajoutez-le à +/etc/fai/sources.list. Ajoutez le nom de votre package à +/etc/fai/NFSROOT. Ensuite appeler

    +
    +
    +
    # fai-make-nfsroot -k
    +
    +
  • +
  • +

    +Puis-je utiliser un noyau 4.X? +

    +

    Oui. L’utilisation de FAI 5.1 et dracut +044+150-1 overlayfs (au lieu d’aufs) est prise en charge, de même que le + noyau 4.x. Lorsque vous utilisez Debian jessie, vous pouvez utiliser un + noyau de backports ou consulter https://lists.uni-koeln.de/pipermail/linux-fai/2016-March/011283.html

    +
  • +
  • +

    +Comment utiliser le nfsroot comme système pour les clients sans disque? +

    + +
  • +
  • +

    +Comment faire pour servir plusieurs arborescence nfsroot sur un serveur FAI? +

    +

    Si vous souhaitez diffuser plusieurs répertoires nfsroot, vous devez créer des répertoires de configuration spécifiques dans /etc pour FAI, comme /etc/fai-jessie et /etc/fai-stretch. Ensuite, vous devez définir les variables $NFSROOT dans différents répertoires et exécuter

    +
  • +
+
+
+
faiserver#fai-make-nfsroot -c /etc/fai-jessie
+
+
+
+

flag_reboot (FAI_FLAGS)

+

Si flag_reboot est défini, en ajoutant "reboot" à $FAI_FLAGS, + votre ordinateur client redémarrera après la fin de la tâche. Ceci est +vrai pour les installations de réseau ainsi que pour les installations +de bootmedium.

+
+
+

CentOS reboot

+

Après l’installation, CentOS nécessite +habituellement un redémarrage supplémentaire, en raison des correctifs +de sécurité SELinux qui sont appliqués après l’installation.

+
+
+

Fichiers journaux

+

FAI crée plusieurs fichiers journaux. Pendant l’installation, ils sont stockés dans /tmp/fai sur le client d’installation lui-même. A la fin de l’installation, ils seront copiés sur le serveur d’installation (voir [isavelog]). + Une fois le client d’installation redémarré dans son système +nouvellement installé, vous pouvez trouver les journaux FAI dans /var/log/fai. Les fichiers journaux sont également créés lors de l’action softupdate ou dirinstall.

+

Sur le faiserver, vous pouvez trouver les fichiers journaux (distants) sous le répertoire ~fai.

+

Les exemples de fichiers journaux des ordinateurs installés avec succès sont disponibles sur http://fai-project.org/logs. Ce sont quelques fichiers journaux qui sont créés par FAI.

+
+
+FAI_CLASSES +
+
+

+Contient une liste de toutes les classes définies. +

+
+
+dmesg.log +
+
+

+La sortie de la commande dmesg. Contient des messages utiles de la mémoire tampon du noyau. +

+
+
+fai.log +
+
+

+Le fichier journal principal. Contient toutes les informations importantes. Vous devez toujours lire ce fichier. +

+
+
+boot.log +
+
+

+Une liste de variables de paramètres de réseau, principalement définis par le démon DHCP. +

+
+
+format.log +
+
+

+Sortie de l’outil de partition setup-storage(8). +

+
+
+shell.log +
+
+

+La sortie de tous les scripts shell, utilisés pour la personnalisation. +

+
+
+variables.log +
+
+

+Une liste de toutes les variables shell qui sont disponibles au cours d’une installation. +

+
+
+error.log +
+
+

+Résumé des erreurs possibles dans tous les fichiers journaux. +

+
+
+disk_var.sh +
+
+

+Une liste des variables contenant des informations sur les périphériques + et les partitions à partir desquelles la partition racine et une liste +de périphériques de swap. Ces informations sont utilisées par certains +scripts de personnalisation (par exemple GRUB_PC/10-setup). +

+
+
+

Si le processus d’installation se termine, le hook savelog.LAST.sh recherche tous les fichiers journaux pour les erreurs courantes et les écrit dans le fichier error.log. Donc, vous devriez d’abord regarder dans ce fichier pour les erreurs. Le fichier status.log + vous donne également le code de sortie de la dernière commande exécutée + dans un script. Pour être sûr, vous devriez rechercher plus de détails +dans tous les fichiers journaux.

+
+
+

Comment utiliser HTTP pour le démarrage PXE

+
+
+
cp /usr/lib/PXELINUX/lpxelinux.0 /srv/tftp/fai/pxelinux.0
+
+

Activer l’accès HTTP au répertoire tftp:

+
+
+
cd /var/www/html
+ln -s /srv/tftp/fai
+
+

Ajoutez -U URL à l’appel fai-chboot. Par exemple:

+
+
+
fai-chboot -U http://faiserver/fai -IFv .......
+
+
+
+
+
+

Dépannage

+
+
+

Erreurs d’amorçage

+

Le message d’erreur suivant indique que votre +client d’installation n’obtient pas de réponse d’un serveur DHCP. +Vérifiez vos câbles ou démarrez le démon dhcpd(8) avec le debug flag activé.

+
+
+

PXE-E51: No DHCP or BOOTP offers received +Network boot aborted

+
+
+
+

Si vous ne voyez pas le message suivant, le +noyau d’installation n’a pas pu détecter votre carte réseau, par exemple + en raison d’un pilote manquant:

+
+
+
Starting dhcp for interface eth0
+dhcp: PREINIT eth0 up
+dhcp: BOND setting eth
+
+

Vérifiez l’initrd dans le nfsroot (lsinird) si le pilote du noyau de votre carte réseau est inclus et vérifiez si vous souhaitez ajouter le paquet firmware-linux-nonfree dans /etc/fai/NFSROOT et reconstruisez l’initrd en appelant fai-make-nfsroot -k. Vous pouvez également ajouter un pilote à /srv/fai/nfsroot/etc/dracut.conf dans la ligne add_drivers+=.

+

C’est le message d’erreur que vous verrez, +lorsque votre carte réseau fonctionne, mais le serveur d’installation +n’exporte pas le répertoire nfsroot vers les clients d’installation. +Cela est souvent dû aux permissions NFS manquantes du côté serveur.

+
+
+
Starting dhcp for interface eth0
+dhcp: PREINIT eth0 up
+dhcp: BOND setting eth
+mount.nfs: access denied by server while mounting 192.168.33.250:/srv/fai/nfsroot
+.
+.
+dracut Warning: Could not boot
+.
+Dropping to debug shell
+dracut:/#
+
+

Maintenant, vous êtes à l’intérieur du shell d’urgence de l’initrd qui a été créé par dracut(8). + Vous obtiendrez une invite du shell et pourrez consulter les fichiers +journaux. Pour plus d’informations sur le débogage du processus de +démarrage précoce à l’aide de dracut, consultez dracut.cmdline(7)

+

Utilisez la commande suivante sur le serveur +d’installation pour voir quels répertoires sont exportés à partir du +serveur d’installation (nommé faiserver):

+
+
+
$ showmount -e faiserver
+
+
+
+
+
+

1. Solaris 8 Advanced Installation Guide at https://docs.oracle.com/cd/E19455-01/806-0957/806-0957.pdf
3. fai-kvm a besoin de beaucoup de ram pour la vm, à cause de la mise en cache de /var, 2GB sont OK
4. Cette installation consommera environ 2 Go d’espace dans /tmp.
5. + Il est également possible d’utiliser uniquement le fichier de +configuration avec la plus haute priorité puisque l’ordre des classes +définit une priorité de bas à haut dans la liste des classes.
6. Si vous souhaitez utiliser un miroir plus rapide, ajustez l’URL dans /etc/fai/apt/sources.list et FAI_DEBOOTSTRAP in /etc/fai/nfsroot.conf avant d’appeler fai-setup.
7. Ceci appellera fai-make-nfsroot(8) interne.
8. Ces fichiers ne doivent pas appartenir au compte racine.
9. Vous pouvez également ajouter ceci dans votre système de noms de domaine (DNS)
10. Puisque le système de fichiers racine sur les clients est monté via NFS, fai est localisé in /srv/fai/nfsroot/usr/sbin sur le servuer d’installation.
11. $FAI est une variable interne utilisée par les scripts FAI. Par défaut, le chemin est /var/lib/fai/config.
12. /srv/fai/nfsroot depuis le serveur d’installation via NFS
13. Il a été défini sur la ligne de commande du noyau
14. /var/lib/fai/config
15. /var/log/fai/localhost/install/ est un lien vers ce répertoire.
16. + Je recommande d'écrire les adresses MAC (les trois derniers octets +suffiront si vous avez des cartes réseau du même fournisseur) et le nom +d’hôte à l’avant de chaque châssis.
17. Pour le débogage, il peut être utile d’entrer l’environnement chroot manuellement à l’aide de cette commande. faiserver# chroot /srv/fai/nfsroot bash
18. Vous pouvez trouver le script dans /usr/share/doc/fai-doc/examples/utils/ Version 5.3
+ + + + \ No newline at end of file diff --git a/doc/fr-old/fai_guide.txt b/doc/fr-old/fai_guide.txt new file mode 100644 index 000000000..3fbbe743c --- /dev/null +++ b/doc/fr-old/fai_guide.txt @@ -0,0 +1,2830 @@ +[[header]] +== FAI Guide (Fully Automatic Installation) + +[#author]#Thomas Lange# + +[#email]#`+<+`mailto:lange@informatik.uni-koeln.de[`+lange@informatik.uni-koeln.de+`]`+>+`# + +[#revnumber]#version 5.3,# [#revdate]#16 Jan 2017# + +[[toc]] +[[toctitle]] +Table of Contents + +*JavaScript must be enabled in your browser to display the table of +contents.* + +link:#_abstrait[Abstrait] + +link:#_a_id_introduction_a_introduction[Introduction] + +link:#_a_id_disponibilité_a_disponibilité[Disponibilité] + +link:#_a_id_motivation_a_motivation[Motivation] + +link:#_a_id_work_a_comment_fonctionne_fai[Comment fonctionne FAI] + +link:#_a_id_features_a_caractéristiques[Caractéristiques] + +link:#_le_temps_de_l_8217_installation[Le temps de l’installation] + +link:#_a_id_impatient_a_quickstart_pour_l_8217_utilisateur_impatient[Quickstart +- Pour l’utilisateur impatient] + +link:#_a_id_first_a_ma_première_installation[Ma première installation] + +link:#_a_id_cdserver_a_mon_premier_serveur_d_8217_installation[Mon +premier serveur d’installation] + +link:#_a_id_overview_a_vue_d_8217_ensemble_et_concepts[Vue d’ensemble et +concepts] + +link:#_a_id_terms_a_conditions_générales[Conditions Générales] + +link:#_a_id_classc_a_le_concept_de_classe[Le concept de classe] + +link:#_a_id_setup_a_configurer_votre_faiserver[Configurer votre +faiserver] + +link:#_installer_les_paquetages_fai[Installer les paquetages FAI] + +link:#_créez_le_nfsroot[Créez le nfsroot] + +link:#_création_de_l_8217_espace_de_configuration[Création de l’espace +de configuration] + +link:#_configurer_les_démons_réseau[Configurer les démons réseau] + +link:#_a_id_bootdhcp_a_configuration_du_démon_dhcp[Configuration du +démon DHCP] + +link:#_ajout_d_8217_une_entrée_d_8217_hôte_au_dhcp[Ajout d’une entrée +d’hôte au DHCP] + +link:#_tftp[TFTP] + +link:#_nfs[NFS] + +link:#_création_de_la_configuration_pxelinux[Création de la +configuration PXELINUX] + +link:#_a_id_custom_server_a_serveur_personnalisé[Serveur personnalisé] + +link:#_a_id_plan_a_planifiez_votre_installation[Planifiez votre +installation] + +link:#_a_id_c3_a_l_8217_espace_de_configuration_et_ses_sous_répertoires[L’espace +de configuration et ses sous-répertoires] + +link:#_a_id_defining_classes_a_définition_des_classes[Définition des +classes] + +link:#_a_id_classvariables_a_définition_des_variables[Définition des +Variables] + +link:#_a_id_diskconfig_a_configuration_du_disque_dur[Configuration du +disque dur] + +link:#_a_id_extrbase_a_extraction_du_fichier_de_base[Extraction du +fichier de base] + +link:#_a_id_debconf_a_debconf_préconfiguration[Debconf préconfiguration] + +link:#_a_id_repository_a_l_8217_accès_au_dépôt_de_paquetages[L’Accès au +dépôt de paquetages] + +link:#_a_id_packageconfig_a_configuration_du_progiciel[configuration du +progiciel] + +link:#_a_id_cscripts_a_scripts_de_personnalisation[Scripts de +personnalisation] + +link:#_a_id_shell_a_scripts_shell[Scripts shell] + +link:#_a_id_cfengine_a_scripts_cfengine[Scripts cfengine] + +link:#_a_id_hooks_a_hooks[Hooks] + +link:#_a_id_faiflags_a_fai_flags[FAI flags] + +link:#_a_id_install_a_fai_installe_votre_planification[FAI installe +votre planification] + +link:#_la_première_partie_d_8217_une_installation[La première partie +d’une installation] + +link:#_a_id_bootmesg_a_messages_de_boot[Messages de boot] + +link:#_a_id_reboot_a_redémarrage_de_l_8217_ordinateur_dans_le_nouveau_système[Redémarrage +de l’ordinateur dans le nouveau système] + +link:#_a_id_isetup_a_démarrage_de_fai_tâche_confdir[Démarrage de FAI +(tâche confdir)] + +link:#_a_id_iclass_a_définition_de_classes_et_de_variables_tâches_defclass_et_defvar[Définition +de classes et de variables (tâches defclass et defvar)] + +link:#_a_id_ipartition_a_partitionnement_de_disques_locaux_création_de_systèmes_de_fichiers_tâches_de_partitionnement[Partitionnement +de disques locaux, création de systèmes de fichiers (tâches de +partitionnement)] + +link:#_a_id_ipreseed_a_préréglage_debconf_tâche_debconf[Préréglage +Debconf (tâche debconf)] + +link:#_a_id_ipackages_a_installation_de_progiciels_tâche_instsoft[Installation +de progiciels (tâche instsoft)] + +link:#_a_id_icscripts_a_personnalisation_spécifique_au_site_task_configure[Personnalisation +spécifique au site (task configure)] + +link:#_a_id_isavelog_a_enregistrement_des_fichiers_journaux_tâche_savelog[Enregistrement +des fichiers journaux (tâche savelog)] + +link:#_a_id_ireboot_a_redémarrez_le_nouveau_système_installé[Redémarrez +le nouveau système installé] + +link:#_a_id_advanced_a_chapitre_avancés_de_fai[Chapitre avancés de FAI] + +link:#_a_id_checkbootp_a_vérification_des_paramètres_reçus_des_serveurs_dhcp[Vérification +des paramètres reçus des serveurs DHCP] + +link:#_a_id_fai_monitor_a_surveillance_de_plusieurs_installations_clientes[Surveillance +de plusieurs installations clientes] + +link:#_a_id_mac_a_collecte_d_8217_adresses_ethernet_pour_plusieurs_hôtes[Collecte +d’adresses Ethernet pour plusieurs hôtes] + +link:#_débogage_du_trafic_réseau[Débogage du trafic réseau] + +link:#_a_id_pxeboot_a_détails_du_démarrage_pxe[Détails du démarrage PXE] + +link:#_a_id_customizing_your_install_server_setup_a_personnalisation_de_la_configuration_de_votre_serveur_d_8217_installation[Personnalisation +de la configuration de votre serveur d’installation] + +link:#_a_id_cdboot_a_création_d_8217_un_cd_fai_ou_d_8217_une_clé_usb[Création +d’un CD FAI ou d’une clé USB] + +link:#_a_id_diskimage_a_création_d_8217_images_de_disque_vm_à_l_8217_aide_de_fai[Création +d’images de disque VM à l’aide de FAI] + +link:#_a_id_sysinfo_a_système_de_sauvetage_fai[Système de sauvetage FAI] + +link:#_a_id_nonfs_a_fai_sans_nfs[FAI sans NFS] + +link:#_a_id_otherdists_a_installation_d_8217_autres_distributions_à_l_8217_aide_d_8217_un_nfsroot_debian[Installation +d’autres distributions à l’aide d’un nfsroot Debian] + +link:#_a_id_dirinstall_a_création_d_8217_environnements_chrooter_et_virtualiser[Création +d’environnements chrooter et virtualiser] + +link:#_a_id_softupdate_a_utilisation_de_fai_pour_les_mises_à_jour[Utilisation +de FAI pour les mises à jour] + +link:#_a_id_archcross_a_comment_installer_un_système_d_8217_exploitation_32_bits_à_partir_d_8217_un_système_d_8217_exploitation_64_bits[Comment +installer un système d’exploitation 32 bits à partir d’un système +d’exploitation 64 bits] + +link:#_a_id_hints_a_divers_conseils_et_détails[Divers conseils et +détails] + +link:#_a_id_tasks_a_la_liste_des_tâches[La liste des tâches] + +link:#_a_id_itests_a_tests_automatisés[Tests automatisés] + +link:#_a_id_autodiscover_a_découvrir_automatiquement[Découvrir +automatiquement] + +link:#_a_id_changeboot_a_modification_du_périphérique_d_8217_amorçage[Modification +du périphérique d’amorçage] + +link:#_a_id_debian_mirror_a_comment_créer_un_miroir_debian_local[Comment +créer un miroir Debian local] + +link:#_petits_conseils[Petits conseils] + +link:#_flag_reboot_fai_flags[flag_reboot (FAI_FLAGS)] + +link:#_centos_reboot[CentOS reboot] + +link:#_a_id_logfiles_a_fichiers_journaux[Fichiers journaux] + +link:#_comment_utiliser_http_pour_le_démarrage_pxe[Comment utiliser HTTP +pour le démarrage PXE] + +link:#_a_id_troubleshoot_a_dépannage[Dépannage] + +link:#_a_id_booterror_a_erreurs_d_8217_amorçage[Erreurs d’amorçage] + +[[content]] +[[_abstrait]] +== Abstrait + +FAI est un système non interactif permettant d’installer, de +personnaliser et de gérer les configurations de systèmes et de logiciels +Linux sur les ordinateurs ainsi que sur les machines virtuelles et les +environnements chroot, des petits réseaux aux grandes infrastructures et +clusters. + +Ce manuel décrit le logiciel d’installation entièrement automatique. +Cela inclut l’installation des paquets, la configuration du serveur, la +création de la configuration et la gestion des erreurs. + +.... + +-----------------------------------------------------------------------+ + | This manual describes FAI 5.3 but most things are also valid for 4.x. | + +-----------------------------------------------------------------------+ +.... + +{empty}(c) 2000-2017 Thomas Lange + +Copyright + +Ce manuel est un logiciel libre; Vous pouvez le redistribuer et / ou le +modifier selon les termes de la Licence Publique Générale GNU publiée +par la Free Software Foundation; Soit la version 2, soit (à votre choix) +toute version ultérieure. + +Ceci est distribué dans l’espoir qu’il sera utile, mais sans aucune +garantie ; Sans même la garantie implicite de qualité marchande ou +d’adaptation à un usage particulier. Pour plus de détails, consultez la +GNU General Public License.< + +Une copie de la GNU General Public License est disponible sous la forme +/usr/share/common-licenses/GPL dans la distribution Debian GNU/Linux ou +sur le World Wide Web sur le site GNU Vous pouvez également l’obtenir en +écrivant à la Free Software Foundation , Inc., 59 Temple Place - Suite +330, Boston, MA 02111-1307, États-Unis. + +[[_a_id_introduction_a_introduction]] +== [#Introduction]####Introduction + +[[_a_id_disponibilité_a_disponibilité]] +=== [#Disponibilité]####Disponibilité + +Page d’accueil:: + http://fai-project.org/[http://fai-project.org] +FAI wiki:: + http://wiki.fai-project.org/[http://wiki.fai-project.org] +Téléchargement:: + http://fai-project.org/download +Entrée pour _sources.list_:: + `+deb http://fai-project.org/download jessie koeln+` +Pages du manuel:: + http://fai-project.org/doc/man/ +Liste de diffusion:: + https://lists.uni-koeln.de/mailman/listinfo/linux-fai +Retour d’information:: + Envoyez vos commentaires et vos commentaires à fai@fai-project.orgou à + la liste de diffusion . +Bogues:: + Utiliser le système de suivi des bogues Debian (BTS) + http://bugs.debian.org/[http://bugs.debian.org] +Changements visibles par l’utilisateur:: + http://fai-project.org/NEWS +Arbre source via git:: + git clone git://github.com/faiproject/fai.git +Voir l’arbre source avec http:: + https://github.com/faiproject/fai + +Les pages man incluent toujours des informations à jour et beaucoup de +détails sur toutes les commandes FAI. Alors, n’oubliez pas de les lire +attentivement. Lisez maintenant ce manuel, puis profitez de +l’installation entièrement automatique et de votre temps économisé. + +[[_a_id_motivation_a_motivation]] +=== [#Motivation]####Motivation + +Avez-vous déjà effectué des installations identiques d’un système +d’exploitation à plusieurs reprises? Souhaitez-vous être en mesure +d’installer un cluster Linux avec des dizaines de nœuds à lui seul? + +Répéter la même tâche encore et encore est ennuyeux - et conduira +certainement à des erreurs. Aussi beaucoup de temps pourrait être sauvé +si les installations ont été faites automatiquement. Un processus +d’installation avec interaction manuelle n’est pas à l'échelle. Mais les +grappes ont l’habitude de croître au fil des ans. Pensez à long terme +plutôt que de planifier quelques mois dans l’avenir. + +En 1999, j’ai dû effectuer une installation d’un cluster Linux avec un +serveur et 16 clients. Puisque j’ai eu beaucoup d’expérience en faisant +des installations automatiques des systèmes d’exploitation de Solaris +sur le matériel de SUN SPARC, l’idée de construire une installation +automatique pour Debian est née. Solaris dispose d’une fonctionnalité +d’installation automatique appelée JumpStart +[.footnote]#[link:#_footnote_1[1]]#. En conjonction avec les scripts +d’auto-installation de Casper Dik [.footnote]#[link:#_footnote_2[2]]#, +Je pourrais sauver beaucoup de temps non seulement pour chaque nouvel +ordinateur de SUN, mais aussi pour la réinstallation des postes de +travail existants. Par exemple, j’ai dû construire un LAN temporaire +avec quatre stations de travail SUN pour une conférence, qui a duré +seulement quelques jours. J’ai retiré ces postes de travail de notre +réseau de recherche habituel et mis en place une nouvelle installation +pour la conférence. Quand il était terminé, j’ai simplement intégré les +postes de travail dans le réseau de recherche, redémarré une seule fois, +et après une demi-heure, tout était opérationnel comme avant. La +configuration de tous les postes de travail était exactement la même +qu’avant la conférence, car tout était effectué par le même processus +d’installation. J’ai également utilisé l’installation automatique pour +réinstaller un poste de travail après un disque dur endommagé avait été +remplacé. Il m’a fallu deux semaines pour recevoir le nouveau disque +dur, mais seulement quelques minutes après l’installation du nouveau +disque, le poste de travail fonctionnait comme avant. Et c’est pourquoi +j’ai choisi d’adapter cette technique à un cluster de PC sous Linux. + +[[_a_id_work_a_comment_fonctionne_fai]] +=== [#work]####Comment fonctionne FAI + +Le client d’installation qui sera installé à l’aide de FAI, est démarré +via une carte réseau ou à partir d’un CD ou d’une clé USB. Il obtient +une adresse IP et démarre un noyau Linux qui monte son système de +fichiers racine via NFS (nfsroot) du serveur d’installation. Une fois le +noyau démarré, le script de démarrage FAI exécute l’installation +automatique qui n’a pas besoin d’interaction. Tout d’abord, les disques +durs seront partitionnés, les systèmes de fichiers seront créés et des +progiciels seront ensuite installés. Après cela, le nouveau système +d’exploitation installé est configuré selon vos besoins locaux en +utilisant quelques scripts. Enfin, le nouveau système d’exploitation +sera démarré à partir du disque local. + +Les détails sur la façon d’installer l’ordinateur (la configuration) +sont stockés dans l’espace de configuration du serveur d’installation. +Les fichiers de configuration sont partagés entre des groupes +d’ordinateurs s’ils sont similaires en utilisant le concept de classe. +Vous n’avez donc pas besoin de créer une configuration pour chaque +nouvel hôte. Par conséquent, FAI est une méthode évolutive pour +installer un gros cluster avec un grand nombre de nœuds même si leur +configuration n’est pas identique. + +FAI peut également être utilisé comme un système de sauvetage ou pour +l’inventaire matériel. Vous pouvez démarrer votre ordinateur, mais il +n’effectuera pas une installation. Au lieu de cela, il exécutera un +Debian GNU / Linux entièrement fonctionnel sans utiliser les disques +durs locaux. Ensuite, vous pouvez effectuer une connexion à distance et +sauvegarder ou restaurer une partition de disque, vérifier un système de +fichiers, inspecter le matériel ou effectuer toute autre tâche. + +[[_a_id_features_a_caractéristiques]] +=== [#features]####Caractéristiques + +* Une installation entièrement automatisée peut être effectuée. +* Très rapide installation sans surveillance. +* Système flexible grâce à un concept de classe simple. +* Mise à jour des systèmes en cours d’exécution sans réinstallation. +* Création facile d’un environnement de virtualisation ou d’un chroot +* Les hôtes peuvent démarrer à partir d’une carte réseau, d’un CD, d’une +clé USB. +* Création simple d’un CD d’installation ou d’une clé USB. +* PXE avec la méthode de démarrage DHCP est pris en charge. +* ReiserFS, ext3 / ext4, btrfs et support de système de fichiers XFS. +* Support logiciel RAID et LVM. +* Détection automatique du matériel. +* Vous pouvez déployer Debian, Ubuntu, CentOS, SuSE, Scientific Linux +* Connexion à distance via ssh lors du processus d’installation +possible. +* Toutes les configurations similaires sont partagées entre tous les +clients d’installation. +* Les fichiers journaux de toutes les installations sont enregistrés sur +le serveur d’installation. +* Les scripts Shell, Perl, Python, Ruby, expect et CFEngine sont pris en +charge lors de l'étape de personnalisation. +* Prise en charge de nombreux protocoles comme NFS, FTP, HTTP, git +* Peut être utilisé comme un système de sauvetage et pour l’inventaire +matériel. +* Prise en charge du client sans disque. +* Ajoutez facilement vos propres fonctions via des hooks ou modifiez le +comportement par défaut. +* Clonage de machines utilisant des images de disque est pris en charge + +[[_le_temps_de_l_8217_installation]] +=== Le temps de l’installation + +Le temps d’installation est déterminé par la quantité de logiciel et la +vitesse du disque dur. Voici quelques exemples de temps. Tous les +clients d’installation avaient une carte réseau 1Gbit installée. + +[width="98%",cols="<28%,^13%,<20%,>26%,>13%",options="header",] +|=== +|CPU |RAM |Disk |Software installed |time +|i7-3770T 2.50GHz |8GB |SSD |6 GB software |8.5 min +|Core-i7 3.2GHz |6GB |SATA disk |4.3GB software |7 min +|Core-i7 3.2GHz |6GB |SATA disk |471 MB software |77sec +|Intel Core2 Duo |2GB |SATA disk |3 GB software |14 min +|=== + +[[_a_id_impatient_a_quickstart_pour_l_8217_utilisateur_impatient]] +== [#impatient]####Quickstart - Pour l’utilisateur impatient + +[[_a_id_first_a_ma_première_installation]] +=== [#first]####Ma première installation + +Sans plus tarder, cette section fournira une démonstration rapide et +facile d’une installation entièrement automatique à l’aide du CD FAI et +d’une machine virtuelle. + +Il suffit de télécharger l' image ISO du CD à partir de +http://fai-project.org/fai-cd et de démarrer votre VM à l’aide de ce CD. +Vous verrez un menu grub où vous pouvez choisir parmi différents types +d’installation. + +Cette installation s’exécutera sans serveur d’installation. +L’installation du CD est identique à celle exécutée dans un +environnement réseau à l’aide du serveur d’installation FAI. + +[[_a_id_cdserver_a_mon_premier_serveur_d_8217_installation]] +=== [#cdserver]####Mon premier serveur d’installation + +S’il vous plaît noter, si vous avez l’intention d’utiliser QEMU/KVM, +vous devez avoir qemu-kvm qemu-utils bridge-utils installés sur la +machine à utiliser fai-mk-network et fai-kvm +[.footnote]#[link:#_footnote_3[3]]#. + +Vous pouvez le faire via + +.... +# apt-get install qemu-kvm qemu-utils bridge-utils +.... + +Si vous avez l’intention d’utiliser VMware ou VirtualBox, assurez-vous +que votre client utilise une connexion réseau pontée. En outre, il n’est +pas possible d’utiliser des interfaces réseau pontées via le réseau sans +fil, car la plupart des cartes réseau WiFi ne prennent pas en charge +cette fonctionnalité. + +our configurer votre propre serveur FAI, nous vous recommandons de créer +un réseau de test sur votre ordinateur et d’utiliser KVM. Pour créer ce +réseau privé, il ya le script fai-mk-network (dans le paquet +fai-server). Il configure un pont logiciel avec plusieurs dispositifs de +dérivation qui appartiennent à l’utilisateur. + +.... +fai-mk-network +.... + +Après cela, vous pouvez utiliser fai-kvm (-h vous aidera) pour démarrer +des machines virtuelles en utilisant KVM qui sont connectés à ce réseau +privé. Fais attention. Par défaut, fai-kvm créera les images de disque +pour les machines `+/tmp+`, qui est un disque RAM sur la plupart des +systèmes. Il n’y a aucun problème à créer une image de disque vide de +20G dans /tmp (même si cette partition est de 4 Go de taille), mais +alors que la VM écrit des données sur son disque, cela commencera à +consommer de l’espace dans `+/tmp+`. + +Démarrez le premier hôte virtuel, qui deviendra le serveur FAI +[.footnote]#[link:#_footnote_4[4]]#: + +.... +fai-kvm -Vn -s20 -u 1 cd fai-cd.iso +.... + +Dans le menu grub faiserver,`+faiserver, fixed IP+`. Cela va installer +un hôte appelé faiserver avec IP 192.168.33.250 qui contient tous les +logiciels nécessaires pour un serveur FAI. Il configurera également un +cache de paquets local (en utilisant apt-cacher-ng). Une fois +l’installation terminée, redémarrez la machine. Lors du premier +démarrage du nouveau système, il configurera automatiquement le nfsroot. +Cela peut prendre quelques minutes. + +Après cela, vous pouvez démarrer des hôtes supplémentaires en utilisant +le démarrage réseau. Pour chaque nouvel hôte, vous devez utiliser une +valeur différente pour `+-u+`, qui sera utilisée pour générer des +adresses MAC différentes et utiliser des noms de fichier d’image de +disque différents. + +.... +fai-kvm -Vn -u 2 pxe +.... + +Ces clients d’installation vous montreront un menu, où vous pouvez +sélectionner le type d’installation que vous souhaitez effectuer. Si le +client d’installation ne trouve pas le serveur, c’est généralement parce +que fai-monitor ne fonctionne plus. Cela peut se produire si vous +redémarrez le faiserver après l’installation. Pour remédier à cela, +exécutez simplement fai-monitor sur le faiserver et relancez le +démarrage du client. + +Un autre client pourrait être lancé avec: + +.... +fai-kvm -Vn -u 3 pxe +.... + +Vous pouvez démarrer autant de machines dans le réseau que les +périphériques de prise sont disponibles. Toutes ces machines peuvent se +connecter à l’Internet extérieur, mais sont seulement accessibles à +partir de votre machine hôte. + +[[_a_id_overview_a_vue_d_8217_ensemble_et_concepts]] +== [#overview]####Vue d’ensemble et concepts + +FAI est un système non interactif permettant d’installer, de +personnaliser et de gérer les configurations de systèmes et de logiciels +Linux sur les ordinateurs ainsi que sur les machines virtuelles et les +environnements chroot, des petits réseaux aux grandes infrastructures et +clusters. Vous pouvez prendre un ou plusieurs PC vierges, mettre sous +tension et après quelques minutes, Linux est installé, configuré et +exécuté sur l’ensemble du cluster, sans aucune interaction nécessaire. +Ainsi, il s’agit d’une méthode évolutive pour installer et mettre à jour +un cluster sans surveillance avec peu d’efforts impliqués. FAI utilise +le système d’exploitation Linux et une collection de scripts shell et +Perl pour le processus d’installation. Les modifications apportées aux +fichiers de configuration du système d’exploitation peuvent être +effectuées par CFEngine, shell (bash et zsh), Perl, Python, Ruby et +attendent des scripts. + +Le groupe cible de FAI sont des administrateurs système qui doivent +installer Linux sur une ou même des centaines d’ordinateurs. Parce qu’il +s’agit d’un outil d’installation à usage général, il peut être utilisé +pour l’installation d’un cluster Beowulf, d’une batterie de rendu ou +d’un laboratoire Linux ou d’une salle de classe. De plus, des réseaux +Linux de grande envergure avec différents matériels ou différentes +exigences d’installation sont faciles à établir à l’aide de FAI. Mais +n’oubliez pas de planifier votre installation. Le chapitre +link:#plan[[plan]] contient quelques conseils utiles pour ce sujet. + +[[_a_id_terms_a_conditions_générales]] +=== [#terms]## Conditions Générales + +Premièrement, certains termes utilisés dans ce manuel sont décrits. + +Installer le serveur:: + Il fournit les services DHCP, TFTP et NFS ainsi que les données de + configuration pour tous les clients d’installation. Dans les exemples + de ce manuel, cet hôte s’appelle _faiserver_. L’hôte où le package + _fai-server_ est installé. +Installer le client:: + Un hôte qui sera installé à l’aide de FAI et une configuration fournie + par le serveur d’installation. Aussi appelé client pour courte. Dans + ce manuel, les hôtes d’exemple sont appelés demohost, xfcehost, + gnomehost … Cet ordinateur doit démarrer à partir de son interface + réseau à l’aide de PXE. +Espace de configuration:: + Une structure de sous-répertoire contenant plusieurs fichiers. Ces + fichiers décrivent les détails de la manière dont l’installation des + clients sera effectuée. Toutes les données de configuration sont + stockées ici. Il est également appelé config space pour le court. Il + comprend des informations sur: + + + * Disposition du disque dur dans un format similaire à fstab + * Systèmes de fichiers locaux, leurs types, points de montage et + options de montage + * Logiciels + * Disposition du clavier, fuseau horaire, configuration Xorg, systèmes + de fichiers distants, comptes utilisateurs, imprimantes … + + + Le package _fai-doc_ inclut un exemple d’espace de configuration + incluant des exemples pour les hôtes utilisant l’environnement XFCE et + GNOME parmi d’autres exemples. +nfsroot, NFS-Root:: + Un système de fichiers situé sur le serveur d’installation. Pendant le + processus d’installation, c’est le système de fichiers complet pour + les clients d’installation. Tous les clients partagent le même + nfsroot, qu’ils montent en lecture seule. Le nfsroot a besoin + d’environ 690 Mo d’espace disque libre. +TFTP:: + Sert aux clients l’initrd et le noyau utilisés pour le processus + d’installation. Avec le système de fichiers servi par NFS, ces deux + composent un OS temporaire dans lequel les installations sont + exécutées. +Classes FAI:: + Les classes sont des noms qui déterminent quel fichier de + configuration est sélectionné. Si un client appartient à la classe + WEBSERVER, il sera configuré en tant que serveur Web, la classe + DESKTOP pour, par exemple, détermine les progiciels qui seront + installés. +profil:: + Un profil FAI est juste une liste de classes FAI assiged à un nom de + profil, qui est étendu par une description de ce profil. C’est-à-dire + que l’on peut avoir deux profils "Webserver", l’un incluant la classe + APACHE, y compris la classe NGINX, pour ensuite installer la solution + webserver respective. +les tâches:: + L’installation d’un client se compose de plusieurs parties, appelées + tâches. Les tâches sont des sous-programmes prédéfinis qui effectuent + une certaine partie de la FAI. Les tâches FAI suivantes sont exécutées + au cours d’une installation sur les clients d’installation. + +confdir # get the config space setup # some initialization, start sshd +on demand defclass # define FAI classes defvar # define variables action +# evaluate FAI_ACTION install # Start the installation partition # +partition the harddisks, create file systems mountdisks # mount the file +systems extrbase # extract the base.tar.xz debconf # do the Debian +debconf preseeding repository # prepare access to the package repository +updatebase # Set up package tools and update packages instsoft # install +software packages configure # call customization scripts finish # do +some cleanup, show installation statistics tests # call tests if defined +chboot # call fai-chboot on the install server savelog # save log files +to local and remote location faiend # reboot host, eject CD if needed + +Il s’agit de tâches qui ne sont exécutées que lorsqu’une action +différente est exécutée + +dirinstall # install a chroot environment softupdate # only do the +system configuration sysinfo # print detailed system information +inventory # print short hardware inventory list + +Pour une description plus détaillée des _tâches_ , voir +link:#tasks[[tasks]]. + +Notez que vous n'êtes pas limité aux tâches FAI. Vous pouvez également +définir des programmes ou des scripts supplémentaires qui seront +exécutés à certaines occasions. On les appelle des _hooks_. + +hooks:: + Les Hooks sont des plugins, ils peuvent ajouter des fonctionnalités + supplémentaires au processus d’installation ou même remplacer des + tâches entières de FAI. Les Hooks sont expliqués en détail dans + link:#hooks[[hooks]]. + +[[_a_id_classc_a_le_concept_de_classe]] +=== [#classc]####Le concept de classe + +Les classes sont utilisées dans presque toutes les tâches de +l’installation. Les classes déterminent quels fichiers de configuration +choisir parmi une liste d’alternatives disponibles. Pour déterminer les +fichiers de configuration à utiliser, FAI recherche la liste des classes +définies et utilise tous les fichiers de configuration correspondant à +un nom de classe [.footnote]#[link:#_footnote_5[5]]#. La boucle suivante +implémente cette fonction en pseudo code shell: + +.... +for class in $all_classes; do + if [ -r $config_dir/$class ]; then # if a file with name $class exists + your_command $config_dir/$class # call a command with this file name + # exit if only the first matching file is needed + fi +done +.... + +La caractéristique très intéressante de ceci est que vous pouvez ajouter +une nouvelle alternative de configuration et elle sera automatiquement +utilisée par FAI sans changer le code, si le fichier de configuration +utilise un nom de classe. + +C’est parce que la boucle détecte automatiquement les nouveaux fichiers +de configuration qui doivent être utilisés. L’idée d’utiliser des +classes en général et d’utiliser certains fichiers correspondant à un +nom de classe pour une configuration est adoptée à partir des scripts +d’installation par Casper Dik pour Solaris. Cette technique s’est avérée +très utile et facile. + +Vous pouvez regrouper plusieurs hôtes partageant les mêmes fichiers de +configuration en utilisant la même classe. Vous pouvez également diviser +l’ensemble des données de configuration pour tous les clients en +plusieurs classes et les utiliser comme des briques de lego et +construire la configuration entière pour un seul client en assemblant +les briques ensemble. + +Si un client appartient à la classe _A_, nous disons que la classe _A_ +est définie pour ce client. Une classe n’a pas de valeur, elle est juste +définie ou non définie. + +Les classes déterminent comment l’installation est effectuée. Par +exemple, un client d’installation peut être configuré pour obtenir le +bureau XFCE en y ajoutant simplement la classe _XFCE_ . Naturellement, +des configurations plus granulaires sont également possibles. Par +exemple, les classes peuvent décrire comment le disque dur doit être +partitionné, ils peuvent définir quels paquets logiciels seront +installés ou quelles étapes de personnalisation seront exécutées. + +Souvent, une configuration client est créée en modifiant ou en ajoutant +uniquement les classes auxquelles ce client appartient, ce qui rend +l’installation d’un nouveau client très facile. Ainsi, aucune +information supplémentaire ne doit être ajoutée à l’espace de +configuration si les classes existantes suffisent à vos besoins. + +Comme vous pouvez le voir, les classes sont un pilier central de la +personnalisation de votre espace de configuration et de l’installation +de votre client. Pour définir vos propres classes, reportez-vous à +link:#defining%20classes[[defining classes]]. + +[[_a_id_setup_a_configurer_votre_faiserver]] +== [#setup]####Configurer votre faiserver + +Voici comment configurer le serveur d’installation en quelques minutes. +Les étapes suivantes sont nécessaires: + +. Configurer le serveur d’installation ++ +.. Installer des packages FAI +.. Créez le nfsroot +.. Copiez les exemples dans l’espace de configuration +.. Configurer les démons réseau +.. Créer les configurations PXELINUX +. Démarrage et installation des clients + +[[_installer_les_paquetages_fai]] +=== Installer les paquetages FAI + +* Installez la clé du référentiel de package de projet FAI: +* Ajoutez l’URL du référentiel de packages du projet FAI. +* Installez le paquet fai-quickstart sur votre serveur d' installation . + +.... +# wget -O - http://fai-project.org/download/074BCDE4.asc | apt-key add - +# echo "deb http://fai-project.org/download jessie koeln" > /etc/apt/sources.list.d/fai.list +# apt-get update +# aptitude install fai-quickstart +.... + +Cela installera également les paquets pour les démons de serveur DHCP, +TFTP et NFS. + +[[_créez_le_nfsroot]] +=== Créez le nfsroot + +* Activez également le référentiel de package du projet FAI dans un +autre fichier _sources.list_ qui est utilisé lors de la construction du +nfsroot. Ensuite, activez l’utilisateur de journal pour FAI. + +.... +# sed -i -e 's/^#deb/deb/' /etc/fai/apt/sources.list +# sed -i -e 's/#LOGUSER/LOGUSER/' /etc/fai/fai.conf +.... + +* Par défaut, FAI utilise +http://httpredir.debian.org/[http://httpredir.debian.org] comme mirror +de paquets, qui devrait tenter de trouver un référentiel de paquets +rapide pour vous. [.footnote]#[link:#_footnote_6[6]]# Maintenant, nous +pouvons exécuter `+fai-setup(8)+` [.footnote]#[link:#_footnote_7[7]]# Et +vérifier si tout s’est bien passé. Le fichier journal est écrit dans +/var/log/fai/fai-setup.log. + +.... +# fai-setup -v +.... + +* Ce sont quelques-unes des lignes que vous verrez à la fin de fai-setup +. Un exemple complet de fai-setup.log est disponible sur la page Web FAI +à l’adresse http://fai-project.org/logs/fai-setup.log. + +.... +FAI packages and related packages inside the nfsroot: +dracut 044+189-2 +dracut-network 044+189-2 +fai-client 5.3.3~bpo8+2 +fai-nfsroot 5.3.3~bpo8+2 +fai-setup-storage 5.3.3~bpo8+2 +Waiting for background jobs to finish +fai-make-nfsroot finished properly. +Log file written to /var/log/fai/fai-make-nfsroot.log +Adding line to /etc/exports: /srv/fai/config 192.168.33.250/25(async,ro,no_subtree_check) +Adding line to /etc/exports: /srv/fai/nfsroot 192.168.33.250/25(async,ro,no_subtree_check,no_root_squash) +Reloading nfs-kernel-server configuration (via systemctl): nfs-kernel-server.service. + + You have no FAI configuration space yet. Copy the simple examples with: + cp -a /usr/share/doc/fai-doc/examples/simple/* /srv/fai/config + Then change the configuration files to meet your local needs. +Please don't forget to fill out the FAI questionnaire after you've finished your project with FAI. + +FAI setup finished. +Log file written to /var/log/fai/fai-setup.log +.... + +* Fai-setup a créé le LOGUSER, le nfsroot et a ajouté des lignes +supplémentaires à _/etc/exports_. Les sous-répertoires ajoutés à +_/etc/exports_ sont exportés via NFS v3, de sorte que tous les clients +d’installation dans le même sous-réseau peuvent les monter via NFS. + +[[_création_de_l_8217_espace_de_configuration]] +=== Création de l’espace de configuration + +Installez les exemples simples dans l’espace de configuration +[.footnote]#[link:#_footnote_8[8]]#. + +.... +$ cp -a /usr/share/doc/fai-doc/examples/simple/* /srv/fai/config/ +.... + +Ces exemples contiennent la configuration pour certains hôtes d’exemple. +Selon le nom d’hôte utilisé, votre ordinateur sera configuré comme suit: + +demohost:: + Une machine qui n’a besoin que d’un petit disque dur. Cette machine + est configurée avec le réseau en tant que client DHCP, et une démo de + compte est créée. +xfcehost:: + Un bureau XFCE est installé, utilisant LVM, et la démo du compte est + créée. +gnomehost:: + Un bureau GNOME est installé et la démo du compte est créée. +other host names:: + Les hôtes disposant d’un autre nom d’hôte utiliseront notamment les + classes FAIBASE, DHCPC et GRUB. + +Tous les hôtes auront un compte appelé demo avec mot de passe _fai_. Le +compte root a également le mot de passe _fai_. + +Si l’indicateur FAI `+menu+` est ajouté, au lieu d’utiliser le nom +d’hôte pour déterminer le type d’installation, un menu est présenté et +l’utilisateur peut choisir un profil pour l’installation. + +[[_configurer_les_démons_réseau]] +=== Configurer les démons réseau + +Pour démarrer le client d’installation via PXE, le serveur +d’installation a besoin d’un DHCP et d’un démon TFTP en cours +d’exécution. Le paquet _fai-quickstart_ a déjà installé les progiciels +pour ces daemons. En outre, le paquetage du serveur NFS pour +l’exportation du nfsroot et de l’espace de configuration a été installé. + +[[_a_id_bootdhcp_a_configuration_du_démon_dhcp]] +==== [#bootdhcp]####Configuration du démon DHCP + +déalement, votre faiserver doit également être votre serveur DHCP. Si ce +n’est pas le cas, demandez à l’administrateur responsable du serveur +DHCP de le configurer conformément à cette section. En option, il est +possible d'éviter cela en utilisant la fonctionnalité +link:#autodiscover[[autodiscover]] diffusée dans FAI 5.0. + +n exemple pour `+dhcpd.conf(5)+` est fourni avec le paquet _fai-doc_. +Commencez à utiliser cet exemple et regardez toutes les options qui y +sont utilisées. + +.... +# cp /usr/share/doc/fai-doc/examples/etc/dhcpd.conf /etc/dhcp/ +.... + +Les seules informations spécifiques FAI contenues dans ce fichier de +configuration sont de définir le `+filename+` de `+fai/pxelinux.0+` et +de définir `+next-server+` et `+server-name+` sur le nom de votre +serveur d’install . Toutes les autres informations sont uniquement des +données liées au réseau, qui est utilisé dans presque toutes les +configurations DHCP. Ajustez ces paramètres de réseau à vos besoins +locaux. + +.... +deny unknown-clients; +option dhcp-max-message-size 2048; +use-host-decl-names on; + +subnet 192.168.33.0 netmask 255.255.255.0 { + option routers 192.168.33.250; + option domain-name "my.example"; + option domain-name-servers 192.168.33.250; + option time-servers faiserver; + option ntp-servers faiserver; + server-name faiserver; + next-server faiserver; + filename "fai/pxelinux.0"; +} +.... + +Si vous apportez des modifications à la configuration DHCP, vous devez +redémarrer le démon. + +.... +# /etc/init.d/isc-dhcp-server restart +.... + +Si vous disposez de plusieurs interfaces réseau, vous pouvez définir +l’interface que le serveur écoutera dans _/etc/default/isc-dhcp-server_. +Par défaut, le démon DHCP écrit ses messages de journalisation dans +_/var/log/daemon.log_. + +[[_ajout_d_8217_une_entrée_d_8217_hôte_au_dhcp]] +==== Ajout d’une entrée d’hôte au DHCP + +L’adresse MAC est donnée par le matériel de la carte réseau. Pour chaque +client d’installation, vous collectez son adresse MAC et la mappez à une +adresse IP et à un nom d’hôte. Tout d’abord, nous ajoutons l’adresse IP +et le nom d’hôte à _/etc/hosts_ [.footnote]#[link:#_footnote_9[9]]#. + +.... +192.168.33.100 demohost +.... + +Le mappage de l’adresse MAC à l’adresse IP est effectué dans le fichier +_dhcpd.conf_. Ici, nous ajoutons une entrée d’hôte en utilisant la +commande `+dhcp-edit(8)+` . Ici, vous devez remplacer 01:02:03:AB:CD:EF +avec le MAC que vous avez trouvé. + +.... +# dhcp-edit demohost 01:02:03:AB:CD:EF +.... + +Après avoir appelé cette commande, c’est ce que l’entrée hôte dans +dhcpd.conf ressemblera à: + +.... +host demohost {hardware ethernet 01:02:03:AB:CD:EF;fixed-address demohost;} +.... + +[[_tftp]] +==== TFTP + +Normalement, vous n’avez pas besoin d’apporter de modifications à la +configuration dameon TFTP. Les fichiers fournis par TFTP sont situés +dans _/srv/tftp/fai_. + +[[_nfs]] +==== NFS + +La commande `+fai-setup+` a déjà configuré le démon NFS et ajouté +quelques lignes au fichier de configuration _/etc/exports_. Il exporte +les répertoires en utilisant NFS v3. + +[[_création_de_la_configuration_pxelinux]] +=== Création de la configuration PXELINUX + +La dernière étape avant de démarrer votre client pour la première fois +est de spécifier quelle configuration le client doit démarrer lors de +l’amorçage PXE. Nous fai-chboot(8) la commande `+fai-chboot(8)+` pour +créer une configuration pxelinux pour chaque client d’installation. Cela +comprend des informations sur le noyau, l’initrd, l’espace de +configuration et certains paramètres d’amorçage. Vous devriez lire la +page de manuel, qui vous donne quelques bons exemples. Voici la commande +pour démarrer l’installation de l’hôte demohost. + +.... +$ fai-chboot -IFv -u nfs://faiserver/srv/fai/config demohost +Booting kernel vmlinuz-3.16.0-4-amd64 + append initrd=initrd.img-3.16.0-4-amd64 ip=dhcp + FAI_FLAGS=verbose,sshd,createvt + FAI_CONFIG_SRC=nfs://faiserver/srv/fai/config + +demohost has 192.168.33.100 in hex C0A82164 +Writing file /srv/tftp/fai/pxelinux.cfg/C0A82164 for demohost +.... + +À ce stade, vous devriez avoir une configuration faiserver de travail et +vos clients devraient démarrer dans FAI et être en mesure d’installer +l’un des exemples. + +Dans la section suivante, vous pouvez lire la planification de votre +installation, adapter votre espace de configuration à vos besoins +particuliers et étendre FAI à l’aide de hooks. + +[[_a_id_custom_server_a_serveur_personnalisé]] +=== [#custom server]## Serveur personnalisé + +Le faiseur et sa configuration n’est nullement statique. Il est possible +de personnaliser et d'étendre votre serveur. Pour cela, reportez-vous à +la section +link:#Customizing%20your%20install%20server%20setup[[Customizing your +install server setup]] dans link:#advanced[[advanced]]. + +[[_a_id_plan_a_planifiez_votre_installation]] +== [#plan]####Planifiez votre installation + +Avant de commencer votre installation, vous devriez investir beaucoup de +temps dans la planification de votre installation. Une fois que vous +êtes satisfait de votre concept d’installation, FAI peut faire toutes +les tâches ennuyeuses et répétitives pour transformer vos plans en +réalité. FAI ne peut pas faire de bonnes installations si votre concept +est imparfait ou manque de quelques détails importants. Commencez à +planifier l’installation en répondant aux questions suivantes: + +* Est-ce que je vais créer un cluster Beowulf ou dois-je installer des +machines de bureau? +* À quoi ressemble ma topologie LAN? +* Ai-je un matériel uniforme? Le matériel sera-t-il uniforme à l’avenir? +* Le matériel a-t-il besoin d’un noyau spécial? +* Comment nommer les hôtes? +* Comment les disques durs locaux doivent-ils être partitionnés? +* Quelles applications seront éxécuté par les utilisateurs? +* Les utilisateurs ont-ils besoin d’un système de mise en file +d’attente? +* Quel logiciel doit être installé? +* Quels démons devraient être lancés, et à quoi devrait ressembler la +configuration? +* Quels systèmes de fichiers distants doivent être montés? +* Comment effectuer les sauvegardes? How should backups be performed? + +Vous devez également penser à des comptes d’utilisateur, des +imprimantes, un système de courrier, des travaux de cron, des cartes +graphiques, l’initialisation double, le NIS, le NTP, le fuseau horaire, +la disposition de clavier, l’exportation et le montage des annuaires via +NFS et beaucoup d’autres choses. Donc, il ya beaucoup à faire avant de +commencer une installation. Et rappelez-vous que la connaissance est le +pouvoir, et c’est à vous de l’utiliser. L’installation et +l’administration sont un processus et non un produit. FAI ne peut pas +faire les choses que vous ne lui dites pas de faire. + +Mais vous ne devez pas commencer à partir de zéro. Examinez les fichiers +et les scripts dans l’espace de configuration. Il ya beaucoup de choses +que vous pouvez utiliser pour votre propre installation. Un bon article +intitulé «Bootstrapping an Infrastructure» avec d’autres aspects de la +construction d’une infrastructure est disponible sur +http://www.infrastructures.org/papers/bootstrap/bootstrap.html + +[[_a_id_c3_a_l_8217_espace_de_configuration_et_ses_sous_répertoires]] +=== [#c3]####L’espace de configuration et ses sous-répertoires + +L’espace de configuration est la collection d’informations sur la façon +exacte d’installer un client. L’espace de configuration central pour +tous les clients d’installation se trouve sur le serveur d’installation +dans _/srv/fai/config_ et ses sous-répertoires. Cela sera monté par les +clients d’installation dans _/var/lib/fai/config_. La commande +d’installation principale `+fai(8)+` utilise tous ces sous-répertoires +dans l’ordre indiqué sauf pour les hooks. + +_class/_:: + Scripts et fichiers pour définir des classes et des variables. +_disk_config/_:: + Fichiers de configuration pour le partitionnement de disque, RAID + logiciel, LVM et création de système de fichiers. +_basefiles/_:: + Normalement , le fichier _base.tar.xz_ (situé à l' intérieur du + nfsroot) est extrait sur le client d’installation après la création + des nouveaux systèmes de fichiers et avant l’installation du package. + Il s’agit d’une image de base minimale, créée juste après avoir appelé + debootstrap lors de la création du nfsroot sur le serveur + d’installation. Si vous voulez installer une autre distribution que la + nfsroot, vous pouvez mettre un fichier tar dans le sous-répertoire + _basefiles/_ et le nommer après une classe. Ensuite, la commande + ‘ftar(8)` est utilisée pour extraire le fichier tar en fonction des + classes définies. Ainsi, le fichier doit être nommé__’ CLASS.tar.xz__ + et non _CLASS.base.tar.xz_ . Cela se fait dans la tâche _extrbase_. + Utilisez cette option si vous souhaitez installer une autre + distribution ou une version différente de celle exécutée pendant + l’installation. + + + Ce fichier de base peut également être reçu en fonction des classes + FAI via HTTP ou FTP en définissant la variable FAI_BASEFILEURL. FAI + téléchargera un fichier CLASSNAME.tar.xz (ou tgz, ou tar.gz, …) à + partir de cette URL, si CLASSNAME correspond à une classe FAI. + + + Exemple: + +.... +FAI_BASEFILEURL=http://fai-project.org/download/basefiles +.... + +Le dossier doit prendre en charge la liste des répertoires. FAI ne +recherchera pas de fichiers potentiellement correspondants. + +Voir le chapitre link:#otherdists[[otherdists]] pour savoir comment +installer différentes distributions. + +_debconf/_:: + Ce répertoire contient toutes les données `+debconf(7)+`. Le format + est le même que celui utilisé par `+debconf-set-selections(8)+`. +_package_config/_:: + Les fichiers contenant des noms de classe contiennent des listes de + progiciels à installer ou à désinstallé par + ‘install_packages(8)`+. Les fichiers nommés +`_`+.asc+`_`+ sont ajoutés à la liste des clés utilisées par apt (à l’aide d’ \'apt-key(8)+` + ) pour les dépôts de paquets approuvés. +_scripts/_:: + Scripts pour la personnalisation de votre site local. Utilisé par + `+fai-do-scripts(1)+`. +_files/_:: + Les Fichiers utilisés par les scripts de personnalisation. La plupart + des fichiers se trouvent dans une structure de sous-arborescence qui + reflète l’arborescence de répertoires ordinaire. Par exemple, les + modèles de _nsswitch.conf_ se trouvent dans + _$FAI/files/etc/nsswitch.conf_ et sont nommés en fonction des classes + auxquelles ils doivent correspondre: + _$FAI/files/etc/nsswitch.conf/NIS_ est la version de + _/etc/nsswitch.conf_ à utiliser pour la classe NIS. Notez que le + contenu du répertoire n’est pas automatiquement copié sur la machine + cible, mais qu’il doit être explicitement copié par des scripts de + personnalisation à l’aide de la commande `+fcopy(8)+` . +_hooks/_:: + Les hooks sont des programmes ou des scripts définis par + l’utilisateur, qui sont appelés pendant le processus d’installation. + cela peut étendre ou remplacer les tâches par défaut. Le nom du + fichier doit être de format _taskname.CLASSNAME[.sh]_. Un hook appelé + `+updatebase.DEBIAN+` est exécuté avant la mise à jour de la tâche + `+updatebase+` et seulement si l’installation du client appartient à + la classe DEBIAN. + +[[_a_id_defining_classes_a_définition_des_classes]] +=== [#defining classes]## Définition des classes + +Il existe différentes possibilités pour définir des classes: . Certaines +classes par défaut sont définies pour chaque hôte: DEFAULT, LAST et son +nom d’hôte. . Les classes peuvent être répertoriées dans un fichier. . +Les classes peuvent être dynamiquement définies par des scripts. + +La dernière option est une fonctionnalité très intéressante, puisque ces +scripts définiront des classes est un moyen très flexible. Par exemple, +plusieurs classes peuvent être définies uniquement si certains matériels +sont identifiés ou si une classe est définie en fonction des +informations de sous-réseau du réseau. + +Tous les noms de classes, sauf le nom d’hôte, sont écrits en +majuscules.ILs ne doivent pas contenir un trait d’union, un dièse, un +Point-Virgule OÜ un point, mais PEUVENT contenir des characters de +soulignement et des Chiffres. + +La Tache _defclass_ Appelle la commande `+fai-class(1)+` pour definir +les classes. Tous les scripts correspondant _^[0-9][0-9]*_ (qui +Commencent Avec Deux Chiffres) Dans le sous-repertoire _$FAI/class_ sont +exécutées afin de definir les classes. Tout ce qui is affiché sur STDOUT +est automatiquement definie Comme une classe. pour Plus d’informations +sur Les définisions de Classe , lire les pages de manuel versent +`+fai-class(1)+`. Le script _50-host-classes_ (voir ci - dessous la +version allégée) est utilisé pour les définir des classes en fonction du +nom d’hôte. + +.... +# use a list of classes for our demo machines +case $HOSTNAME in + demohost) + echo "FAIBASE GRUB DHCPC DEMO" ;; + xfcehost) + echo "FAIBASE GRUB DHCPC DEMO XORG XFCE";; + faiserver) + echo "FAIBASE DEBIAN DHCPC DEMO FAISERVER" ;; + *) + echo "FAIBASE GRUB DHCPC" ;; +esac +.... + +Les noms d’hôtes doivent Rarement Être utilisé Pour Les Fichiers de +configuration dans l’Espace de configuration.à la place une classe Doit +Être definie et ensuite ajouté Pour un hôte Donné. En effet, la Plupart +du Temps les Données de configuration ne sont pas Spécifiques au d’nom +hôte, mais peut etre partager entre differants hôtes./p> + +L’ordre des classes est important car Elle Définit la priorité des +classes de Faible à Élevé. + +[[_a_id_classvariables_a_définition_des_variables]] +=== [#classvariables]####Définition des Variables + +La Tache _defvar_ definit les variables pour l’installation du client. +Les variables sont définies par les scripts Dans la _class/*.var_. +Toutes les variables Globales PEUVENT Être définies Dans _DEFAULT.var_. +Pour certains groupes d’hôtes utiliser un Fichier de classe ou Pour un +seul hôte utiliser le Fichier `+$HOSTNAME+` _.var_ . Ici aussi, il est +utile d'étudier Tous les exemples. + +Les variables suivantes sont utilisées dans les exemples et peuvent etre +aussi utiles pour votre installation: + +FAI_ACTION:: + Réglez les actions que doit éffectuer FAI. Normalement, ceci se fait + par `+fai-chboot(8)+`. Si vous ne pouvez pas utiliser cette commande, + définir la variable dans le script _LAST.var_. +FAI_ALLOW_UNSIGNED:: + Si défini à 1, FAI Permet l’installation de de paquets à partir de + référentiels non Signés. +CONSOLEFONT:: + La police de qui est chargée lors de l’installation par + `+setfont(8)+`. +KEYMAP:: + Définit les Fichiers de mappage du clavier Dans _/usr/share/keymaps_ + et _$FAI/files_. Vous ne Devez pas spécifier le chemin complet, + puisque ce fichier sera localisé automatiquement. +ROOTPW:: + Le mot de passe root chiffré pour le nouveau système. Vous pouvez + utiliser + ‘crypt(3)`+, md5 et d’ Autres types de hachage pour le mot de passe. Utilisez \'mkpasswd(1)+` + pour créer le hachage d’un certain mot de passe. Par exemple, pour + Générer le hachage MD5 pour l’utilisation du mot de passe. + +.... +$ echo "yoursecrectpassword" | mkpasswd -Hmd5 -s +.... + +UTC:: + Réglez l’horloge du matériel à UTC si _UTC=yes_. Sinon, régler + l’horloge à l’heure locale. Voir `+clock(8)+` pour en plus + d’informations. +TIMEZONE:: + Est-ce que le fichier d’initialisation par rapport à + _/usr/share/zoneinfo/_' indique votre fuseau horaire. Par exemple: + _TIMEZONE=Europe/Berlin_. +MODULESLIST:: + Une liste des modules du Noyau qui sont chargés pendent Le démarrage + du nouveau systême (Écrit dans /etc/modules). + +[[_a_id_diskconfig_a_configuration_du_disque_dur]] +=== [#diskconfig]####Configuration du disque dur + +L’outil `+setup-storage(8)+` lit le fichier dans _$FAI/disk_config_ pour +la configuration du disque. Ce fichier décrit comment tous les disques +Locaux devrons etre partitionné, Quels types de Systèmes de Fichiers +doivent etre écris (Comme ext3/4, xfs, btrfs), et où ils seront Montés. +Vous pouvez aussi créer des configurations RAID logiciel et LVM en +Utilisant le Fichier de configuration. Il Est aussi possible de la mise +en Conservation de le partitionnage du disque ou de conserver Les +Donnees sur CERTAINES partitions. + +Pendant le Processus d’installation de tous les Systèmes de Fichiers +Locaux Sont Montés par rapport à _/target_. Par exemple, si vous +Specifiez le Point de montage _/home_ Dans un Fichier de configuration +de disque, ce sera le répertoire _/target/home_ pendant le Processus +d’installation et deviendra _/home_ pour le nouveau systéme Installé. + +[[_a_id_extrbase_a_extraction_du_fichier_de_base]] +=== [#extrbase]####Extraction du fichier de base + +[[_a_id_debconf_a_debconf_préconfiguration]] +=== [#debconf]####Debconf préconfiguration + +[[_a_id_repository_a_l_8217_accès_au_dépôt_de_paquetages]] +=== [#repository]####L’Accès au dépôt de paquetages + +[[_a_id_packageconfig_a_configuration_du_progiciel]] +=== [#packageconfig]####configuration du progiciel + +Avant l’installation de de paquets, FAI va ajouter le contenu de Tous +les Fichiers nommés _package_config/class.asc_ à la liste des clés apt. +Si votre depo locale est signé par votre keyid AB12CD34 vous pouvez +Facilement ajouter cette clé, aussi FAI l’utilisera pendant +l’installation. Utilisez cette commande pour Créer le fichier +_CLASS.asc_: + +.... +faiserver$ gpg -a --export AB12CD34 > /srv/fai/config/package_config/MYCLASS.asc +.... + +Le script `+install_packages(8)+` installe les Logiciels Sélectionnés. +Il lira tous les fichiers de configuration Dans _$FAI/package_config_ +Dont le nom correspond aux classes definie. La syntaxe est tres simple. + +.... +# an example package class + +PACKAGES taskinst +german + +PACKAGES aptitude +adduser netstd ae +less passwd + +PACKAGES remove +gpm xdm + +PACKAGES aptitude GRUB +lilo- grub +.... + +Commentaires Commencent par un Dièse et se terminent à la fin de la +ligne. Chaqué commande de paquetage commence par Le mot _PACKAGES_ Suivi +par un nom de commande, Ce qui correspond à l’outil de package Comme +apt-get, aptitude ou yum par exemple. la commande qui définit la +commandent qui sera utilisé pour installer les paquets nommés après +cette commande. La liste de toutes les commandes disponibles peuvent +Être listé en utilisant _install_packages -H_. Les paquets d’outils pris +en charges son _aptitude, apt-get, smart, yast, yum, rpm, zypper_ + +hold:: + Mettez un paquet en attente. Ce Paquet ne sera pas pris en charges par + dpkg, pas exemple non mis à niveau. +install:: + Installez Tous les paquets (en utilisant `+apt-get+`) Qui sont précise + dans les lignes Suivantes. Si un tiret est ajouté au nom du paquet + (sans espace intermédiaire), le paquet sera supprimé, pas installé. + Tous les noms de paquets sont vérifiées pour les fautes d’orthographe. + Tout paquet qui n’existe pas, seront retiré de la liste des paquets à + l’installation. Soyer donc prudentes de ne pas mal orthographier les + noms de paquets. +install-norec:: + Comme install,mais sans installer les paquets recommandés. +remove:: + Supprimer tous les paquets qui sont péciser dans les lignes suivantes. + Annexer un + au nom du paquet si le paquet doit Être installé. +taskinst:: + Installez tous les paquets appartenant aux tâches qui sont spécifiées + dans les lignes suivantes à l’aide de `+tasksel(1)+`. Vous pouvez + aussi utiliser _aptitude_ pour installer les tâches. +aptitude:: + Installez Ttus les paquets avec la commande `+aptitude+`. Ce sera la + Valeur par défaut à l’avenir et pourra remplacer apt-get et taskinst. + Aptitudes peut aussi installer les paquets +aptitude-r:: + Idem aptitude avec l’option _--with-recommends_. +unpack:: + Télécharge les paquets et décompresse seulement. Ne configure pas le + paquet. +dselect-upgrade:: + Defini la sélections des paquets en Utilisant les lignes suivantes et + installe ou supprime les paquets précisés. Ces lignes sont le résultat + de la commande _dpkg --get-selections_. Il est recommandé de ne pas + utiliser ce format, puisque vous devez aussi specifiez tous les + paquets qui ne sont pas installés en raison d’une dépendance ou + recommandation. Il vaut mieux juste spécifier le paquet que vous + voulez avoir, et de laisser FAI (et apt-get) résoudre les dépendances. + +Plusieurs lignes avec des listes de noms de paquets séparés par des +espaces suivent les directive PACKAGES. Toutes les dépendances sont +résolues. Les paquetages avec suffixe _-_ (par exemple, _lilo-_) seront +supprimés au lieu d'être installés. L’ordre des paquet n’a pas +d’importance. Si vous souhaitez installer des paquets d’une autre +version que la valeur par défaut, vous pouvez ajouter le nom de la +version au nom du paquet comme dans _openoffice.org/etch-backports_. +Vous pouvez également spécifier une certaine version comme _apt=0.3.1_. +Plus d’informations sur ces fonctionnalités sont décrites dans +`+aptitude(8)+`. + +Une ligne qui contient la commande _PRELOADRM_, télécharge un fichier à +l’aide de `+wget(1)+` dans un répertoire avant d’installer les packages. +À l’aide du _file:_ URL, ce fichier est copié de `+$FAI_ROOT+` vers le +répertoire de téléchargement. Par exemple, le package `+realplayer+` a +besoin d’une archive pour installer le logiciel, donc cette archive est +téléchargée dans le répertoire _/root_. Après l’installation des +paquets, ce fichier sera supprimé. Si le fichier ne doit pas être +supprimé, utilisez plutôt la commande _PRELOAD_. + +Il est possible d’ajouter une liste de noms de classes après la commande +pour apt-get. Ainsi, cette commande _PACKAGE_ ne sera exécutée que si la +classe correspondante est définie. Ainsi, vous pouvez combiner de +nombreux petits fichiers dans le fichier DEFAULT. ATTENTION! Utilisez +cette fonctionnalité uniquement dans le fichier DEFAULT pour garder tout +simple. Voir ce fichier pour quelques exemples. + +Si vous souhaitez supprimer un nom de paquet d’une certaine classe +faisait partie avant de cette classe , vous ne devez pas supprimer le +nom du paquet classe, mais plutôt de lui ajouter un tiret (-). Cela +garantira que le paquet est enlevé pendant une mise a jour sur des hôtes +qui étaient Installé en utilisant l’ancienne définition de classe qui +comprenait ce nom de paquet. + +Si vous spécifiez un paquet qui n’existe pas, ce paquet sera supprimé +automatiquement de la liste d’installation uniquement si la commande +_install_ est utilisée. + +[[_a_id_cscripts_a_scripts_de_personnalisation]] +=== [#cscripts]## Scripts de personnalisation + +La commande `+fai-do-scripts(1)+` est appelée pour exécuter tous les +scripts dans ce répertoire. Si un répertoire avec un nom de classe +existe, tous les scripts correspondant à _^[0-9][0-9]*_ sont exécutés +par ordre alphabétique. Il est donc possible d’utiliser des scripts de +différentes langues (shell, cfengine, Perl, Python, Ruby, expect,..) +pour une classe. + +Ces scripts écrivent leur sortie dans différents fichiers journaux, +selon le type de script. Par exemple, Tous les scripts shell écrivent +leur journal dans _shell.log_. + +[[_a_id_shell_a_scripts_shell]] +==== [#shell]####Scripts shell + +La plupart des scripts sont des scripts Bourne shell. Les scripts shell +sont utiles si la tâche de configuration ne doit seulement appeler +certaines commandes shell ou créer un fichier à partir de zéro. Afin de +ne pas écrire beaucoup de scripts courts, il est possible d’utiliser la +commande `+ifclass+` pour tester si certaines classes sont définies. + +.... +ifclass -o A B C +.... + +Vérifie si l’une des classes A, B ou C est définie. L’utilisation de -a +(AND logique) vérifie si toutes les classes d’une liste sont définies. +La commande ifclass C vérifie si seule la classe C est définie. + +Pour copier des fichiers avec des classes, utilisez la commande +`+fcopy(8)+`. Si vous voulez extraire une archive à l’aide de classes, +utilisez `+ftar(8)+`. Pour ajouter des lignes à un fichier de +configuration, utilisez `+ainsl(1)+` au lieu de simplement +`+echo string >> filename+`. + +FAI prend également en charge les scripts _zsh(1)_ pendant la tâche de +personnalisation. Dans les scripts, la variable `+$classes+` contient +une liste séparée par des espaces avec les noms de toutes les classes +définies. + +[[_a_id_cfengine_a_scripts_cfengine]] +==== [#cfengine]####Scripts cfengine + +CFEngine dispose d’un riche ensemble de fonctions pour modifier les +fichiers de configuration existants, par exemple _LocateLineMatching, +ReplaceAll, InsertLine, AppendIfNoSuchLine, HashCommentLinesContaining_. +Mais il ne peut pas traiter les variables qui sont indéfinies. Si une +variable n’est pas définie, l’ensemble du script cfengine s’arrêtera. + +Plus d’informations peuvent être trouvées dans la page de manuel +`+cfengine(8)+` ou sur la page d’accueil cfengine +http://www.cfengine.org/[http://www.cfengine.org]. + +[[_a_id_hooks_a_hooks]] +=== [#hooks]####Hooks + +Les Hooks vous permettent de spécifier des fonctions ou des programmes +qui sont exécutés à certaines étapes du processus d’installation. Avant +qu’une tâche soit appelée, FAI recherche les hooks existants pour cette +tâche et les exécute. Comme on peut s’y attendre, les classes sont +également utilisées lors de l’appel de hooks. Les hooks sont exécutés +pour chaque classe définie. Vous n’avez qu'à créer le hook avec le nom +de la classe désirée et il sera utilisé. Si plusieurs hooks pour une +tâche existent, ils sont appelés dans l’ordre défini par les classes. Si +_debug_ est inclus dans `+$FAI_FLAG+` l’option _-d_ est passée à tous +les hooks, donc vous pouvez déboguer vos propres hooks. Si certaines +tâches par défaut doivent être ignorées, utilisez la sous-routine +_skiptask_ et une liste de tâches par défaut comme paramètres. Dans les +exemples fournis, les hooks de la classe CENTOS ignorent certaines +tâches spécifiques de Debian. + +Le répertoire _$FAI/hooks/_' contient tous les hooks. Un hook est un +fichier exécutable qui suit le nom de tâche _taskname.CLASSNAME[.sh]_' +(par exemple, _repository.CENTOS_ ou _savelog.LAST.sh_), un nom de tâche +et un nom de classe séparés par un point, éventuellement suivi de '.sh. +Le nom de la tâche spécifie la tâche devant précéder l’exécution de ce +hook, si la classe spécifiée est définie pour le client d’installation. +Voir la section link:#tasks[[tasks]] pour une liste complète des tâches +par défaut pouvant être utilisées. + +Un hook du formulaire _hookprefix.classname_ ne peut pas définir de +variables pour le script d’installation, car il s’agit d’un +sous-processus. Mais vous pouvez utiliser n’importe quel exécutable +binaire ou n’importe quel script que vous avez écrit. Les hooks qui ont +le suffixe _.sh_ (par exemple, 'partition.DEFAULT.sh) doivent être des +scripts Bourne shell et sont sourcé. Il est donc possible de redéfinir +des variables pour les scripts d’installation. + +Dans la première partie de FAI, tous les hooks avec le préfixe _confdir_ +sont appelés. Ces hooks ne peuvent pas être localisés dans l’espace de +configuration, car il n’est pas encore disponible. Par conséquent, ces +hooks sont les seuls hooks situés dans `+$nfsroot+`_/$FAI/hooks_ sur le +serveur d’installation. Tous les autres hooks se trouvent dans +_$FAI_CONFIGDIR/hooks_ sur le serveur d’installation. + +Tous les hooks appelés avant la définition des classes ne peuvent +utiliser que les classes suivantes: _DEFAULT $HOSTNAME LAST_. Si un hook +pour la classe _DEFAULT_ doit être appelé uniquement si aucun hook pour +la classe `+$HOSTNAME+` n’est disponible, insérez ces lignes sur le hook +par défaut: + +.... +hookexample.DEFAULT: + +#! /bin/sh + +# skip DEFAULT hook if a hook for $HOSTNAME exists +scriptname=$(basename $0 .DEFAULT) +[-f $FAI/hooks/$scriptname.$HOSTNAME ] && exit +# here follows the actions for class DEFAULT +. +. +.... + +Quelques exemples de ce que les hooks pourraient être utilisés: + +* Charger les modules du noyau avant que les classes soient définies +dans $FAI/class. +* Envoyez un courriel à l’administrateur si l’installation est terminée. +* Installez un client sans disque et sautez le partitionnement de disque +local. +* Jetez un oeil à hooks/debconf.IMAGE pour savoir comment cloner une +machine en utilisant une image de système de fichiers. + +[[_a_id_faiflags_a_fai_flags]] +=== [#faiflags]####FAI flags + +La variable `+$FAI_FLAGS+` contient une liste de flags séparés par des +espaces. Les flags suivants sont connus: + +verbose:: + Créez une sortie verbeuse pendant l’installation. Cela doit toujours + être le premier flag, de sorte que les définitions consécutives des + flags seront affichées verbeusement. +debug:: + Créer une sortie de débogage. Aucune installation sans assistance + n’est effectuée. Pendant l’installation du paquet, vous devez répondre + à toutes les questions des scripts postinstall sur la console du + client. Beaucoup d’informations de débogage seront imprimées. Ce flag + n’est utile que pour les développeurs FAI. +sshd:: + Démarrez le démon ssh pour activer les connexions à distance. Vous + pouvez ensuite vous connecter en tant que root à tous les clients + d’installation pendant l’installation. Le mot de passe par défaut est + fai et peut être modifié en définissant FAI_ROOTPW dans + nfsroot.conf(5). Pour vous connecter à partir de votre serveur vers le + client d’installation (nommé demohost dans cet exemple), utilisez: + +.... +$ ssh root@demohost +Warning: Permanently added 'demohost,192.168.33.100' to the list of known hosts. +root@demohost's password: +.... + +Ce n’est que le mot de passe root pendant le processus d’installation, +pas pour le nouveau système installé. Vous pouvez également vous +connecter sans mot de passe lorsque vous utilisez `+$SSH_IDENTITY+`. + +createvt:: + Créez deux terminaux virtuels et exécutez un bash si _ctrl-c_ est tapé + dans le terminal de console. Vous pouvez accéder aux terminaux + supplémentaires en tapant _Alt-F2_ ou _Alt-F3_. Sinon, aucun terminal + n’est disponible et la saisie _ctrl-c_ va redémarrer le client + d’installation. La définition de ce flag est utile pour le débogage. + Si vous voulez une installation qui ne devrait pas être interruptible, + ne définissez pas ce flag. +menu:: + Cela permet à un menu utilisateur de sélectionner un profil. Tous les + fichiers `+class/*.profile+` sont lus et un menu basé sur des curses + sera créé. +reboot:: + Redémarrez le client d’installation une fois l’installation terminée + sans taper RETURN sur la console. Si ce drapeau n’est pas défini, et + que error.log contient quelque chose, le client d’installation + s’arrêtera et attendra que vous appuyez sur RETURN. Si aucune erreur + ne s’est produite, le client redémarre automatiquement + automatiquement. +halt:: + Arrêtez le client d’installation à la fin de l’installation, au lieu + de redémarrer dans le nouveau système. +initial:: + Utilisé par `+setup-storage(8)+`. Les partitions marquées avec + `+preserve_reinstall+` sont préservées à moins que ce flag ne soit + défini. Souvent, ce drapeau est placé dans un _fichierclass/*.var_ en + utilisant le paramètre _flag_initial=1_. + +[[_a_id_install_a_fai_installe_votre_planification]] +== [#install]## FAI installe votre planification + +[[_la_première_partie_d_8217_une_installation]] +=== La première partie d’une installation + +Après le démarrage du noyau, il monte le système de fichiers racine via +NFS à partir du serveur d’installation et démarre le script +_/usr/sbin/fai_ [.footnote]#[link:#_footnote_10[10]]#. Ce script +contrôle la séquence de l’installation. Aucun autre script dans +_/etc/init.d/_ n’est utilisé. + +L’espace de configuration est rendu disponible via la méthode configurée +(un montage NFS par défaut) du serveur d’installation au chemin défini +dans $FAI [.footnote]#[link:#_footnote_11[11]]#. + +[[_a_id_bootmesg_a_messages_de_boot]] +=== [#bootmesg]####Messages de boot + +Lorsque vous démarrez le client d’installation à partir de la carte +réseau avec PXE, vous obtiendrez des messages comme ceci: + +.... +Managed PC Boot Agent (MBA) v4.00 +Pre-boot eXecution Environment (PXE) v2.00 +DHCP MAC ADDR: 00 A2 A3 04 05 06 +DHCP.../ + +CLIENT MAC ADDR: 00 A2 A3 04 05 06 GUID: 3D6C4552 +CLIENT IP: 192.168.33.100 MASK: 255.255.255.0 DHCP IP: 192.168.33.250 +GATEWAY IP: 192.168.33.1 + +!PXE entry point found (we hope) at 9854:0106 via plan A +UNDI code segment at: 9854 len 5260 +UNDI data segment at: 921D len 63A2 +Getting cached packet 01 02 03 +My Ip address seems to be C0A82164 192.168.33.100 +ip=192.168.33.100:192.168.33.250:192.168.33.1:255.255.255.0 +BOOTIF=01-00-A2-A3-04-05-06 +SYSUUID= +TFTP prefix: fai/ +Trying to load pxelinux.cfg/C0A82164 + +Loading vmlinuz-3.16.0-4-amd64.................. +Loading initrd.img-3.16.0-4-amd64......................ready. +.... + +À ce stade, le client d’installation a réussi à recevoir le réseau +Config via DHCP et le noyau et initrd via TFTP. Il démarre maintenant Le +noyau Linux et l’initrd. Si tout allait bien, l’initrd Monte nfsroot +[.footnote]#[link:#_footnote_12[12]]# Et les scripts FAI sont lancés. La +première chose que vous voyez est le message en rouge de copyright FAI. + +.... + ------------------------------------------------- + Fully Automatic Installation - FAI + + 5.3.3~bpo8+2 (c) 1999-2017 + Thomas Lange + ------------------------------------------------- + +Calling task_confdir +Kernel currently running: Linux 3.16.0-4-amd64 x86_64 GNU/Linux +Kernel parameters: BOOT_IMAGE=vmlinuz-3.16.0-4-amd64 initrd=initrd.img-3.16.0-4-amd64 \ + rw aufs ip=dhcp root=192.168.33.250:/srv/fai/nfsroot FAI_FLAGS=verbose,sshd,createvt\ + FAI_CONFIG_SRC=nfs://faiserver/srv/fai/cskoeln FAI_ACTION=install quiet\ + BOOTIF=01-00-a2-a3-04-05-06 +Reading /tmp/fai/boot.log +FAI_FLAGS: verbose sshd createvt +Setting SERVER=faiserver. Value extracted from FAI_CONFIG_SRC. +FAI_CONFIG_SRC is set to nfs://faiserver/srv/fai/config +Configuration space faiserver:/srv/fai/config mounted to /var/lib/fai/config +Calling task_setup +FAI_FLAGS: verbose sshd createvt +15 Jan 13:22:37 ntpdate[1533]: step time server 192.168.33.250 offset -0.342793 sec +Press ctrl-c to interrupt FAI and to get a shell +Starting FAI execution - 20170115_132237 +Calling task_defclass +fai-class: Defining classes. +Executing /var/lib/fai/config/class/10-base-classes. +10-base-classes OK. +Executing /var/lib/fai/config/class/20-hwdetect.source. +Loading kernel module md-mod +20-hwdetect.source OK. +Executing /var/lib/fai/config/class/50-host-classes. +50-host-classes OK. +List of all classes: DEFAULT LINUX AMD64 FAIBASE DHCPC DEMO GRUB client01 LAST +.... + +Vous pouvez également voir la liste des classes FAI, qui sont définies +pour ce hôte. Cette liste est très importante pour le reste de +l’installation. + +La première tâche est appelée _confdir_, qui est chargée de Accès à +l’espace de configuration. Ici, nous utilisons un montage NFS à partir +de l’installation Comme vous pouvez le voir sur la console (et plus tard +dans les journaux). + +.... +FAI_CONFIG_SRC is set to nfs://faiserver/srv/fai/config +Configuration space faiserver:/srv/fai/config mounted to /var/lib/fai/config +.... + +Avant de lancer l’installation (`+$FAI_ACTION=install+`), l’ordinateur +Bip trois fois. Donc, faites attention quand vous entendez trois bips +mais vous Ne voulez pas effectuer une installation et laisser FAI +effacer toutes vos données sur Le disque local! + +[[_a_id_reboot_a_redémarrage_de_l_8217_ordinateur_dans_le_nouveau_système]] +=== [#reboot]####Redémarrage de l’ordinateur dans le nouveau système + +Pour redémarrer l’ordinateur pendant ou à la fin de l’installation, vous +devez utiliser la commande `+faireboot+` en faveur de la commande de +redémarrage normal. Utilisez aussi `+faireboot+` si vous êtes connecté +depuis la télécommande. Si l’installation n’est pas terminée, utilisez +_faireboot -s_, donc les fichiers journaux sont également copiés sur le +serveur d’installation. + +Si l’installation est terminée, l’ordinateur doit démarrer un petit +système Debian. Vous pouvez vous connecter en tant que _demo_ ou _root_ +avec le mot de passe _fai_. + +[[_a_id_isetup_a_démarrage_de_fai_tâche_confdir]] +=== [#isetup]####Démarrage de FAI (tâche confdir) + +Une fois le client d’installation démarré, seul le script +_/usr/sbin/fai_ est exécuté. Il effectuera une initialisation minimale. +La variable `+$FAI_CONFIG_SRC+` [.footnote]#[link:#_footnote_13[13]]# +est utilisée pour accéder à l’espace de configuration FAI qui est alors +disponible dans le répertoire `+$FAI+` +[.footnote]#[link:#_footnote_14[14]]#. FAI ne se déroulera pas sans +l’espace de configuration. + +[[_a_id_iclass_a_définition_de_classes_et_de_variables_tâches_defclass_et_defvar]] +=== [#iclass]####Définition de classes et de variables (tâches defclass et defvar) + +La commande `+fai-class(1)+` exécute des scripts dans _$FAI/class_ pour +définir des classes. Si les scripts écrivent une chaîne sur stdout, cela +sera défini comme une classe. Lisez tous les détails dans la page de +manuel de `+fai-class(1)+`. + +Après avoir défini les classes, chaque fichier correspondant à _.var_ +avec un préfixe qui correspond à une classe définie provient de +variables définies. Il doit contenir le code shell vaild. + +[[_a_id_ipartition_a_partitionnement_de_disques_locaux_création_de_systèmes_de_fichiers_tâches_de_partitionnement]] +=== [#ipartition]####Partitionnement de disques locaux, création de systèmes de fichiers (tâches de partitionnement) + +Pour le partitionnement du disque, un fichier de configuration de disque +de _$FAI/disk_config_ est sélectionné à l’aide de classes. + +Le format de la configuration du disque est similaire à un fichier +fstab. + +L’outil de partitionnement `+setup-storage(8)+` exécute toutes les +commandes nécessaires à la création de la disposition de la partition du +disque, du RAID logiciel, du LVM et de la création des systèmes de +fichiers. Lisez la page de manuel de `+setup-storage(8)+` pour une +description détaillée et quelques exemples du format. + +[[_a_id_ipreseed_a_préréglage_debconf_tâche_debconf]] +=== [#ipreseed]####Préréglage Debconf (tâche debconf) + +Les fichiers dans _$FAI/debconf_ sont utilisés par `+debconf(7)+` +habituel en présselectionnant si les noms de fichier correspondent à un +nom de classe. + +[[_a_id_ipackages_a_installation_de_progiciels_tâche_instsoft]] +=== [#ipackages]####Installation de progiciels (tâche instsoft) + +La commande `+install_packages(8)+` lit les fichiers de configuration à +partir de _$FAI/package_config_ en classe et installe des progiciels sur +le nouveau système de fichiers. + +Il installe les paquets en utilisant `+apt-get(8)+`, `+aptitude(1)+`, +`+yum+` ou d’autres outils de paquetage sans aucune interaction manuelle +nécessaire. Les paquets sont également résolus par les outils de +paquets. + +Le format des fichiers de configuration est décrit dans +link:#packageconfig[[packageconfig]]. + +[[_a_id_icscripts_a_personnalisation_spécifique_au_site_task_configure]] +=== [#icscripts]####Personnalisation spécifique au site (task configure) + +Souvent, les configurations par défaut des progiciels ne répondent pas à +vos besoins spécifiques au site. Vous pouvez appeler des scripts +arbitraires qui ajustent la configuration du système. Par conséquent, la +commande `+fai-do-scripts(1)+` exécute des scripts dans _$FAI/scripts_ +d’une manière basée sur la classe. Il est possible d’avoir plusieurs +scripts de différents types (shell, cfengine, …) à exécuter pour une +classe. + +L’ensemble de scripts par défaut dans _$FAI/scripts_ inclut des exemples +d’installation de machines Debian et CentOS. Ils définissent le mot de +passe root, ajoutent un compte utilisateur démo, paramétrent le fuseau +horaire, configurent le réseau pour DHCP ou utilisent une adresse IP +fixe,la configuration grub et plus encore. Ils devraient faire un +travail raisonnable pour votre installation. Vous pouvez les modifier ou +ajouter de nouveaux scripts pour répondre à vos besoins locaux. + +Plus d’informations sur ces scripts sont décrits dans +link:#cscripts[[cscripts]]. + +[[_a_id_isavelog_a_enregistrement_des_fichiers_journaux_tâche_savelog]] +=== [#isavelog]####Enregistrement des fichiers journaux (tâche savelog) + +Lorsque toutes les tâches sont terminées, les fichiers journaux sont +écrits dans +_/var/log/fai/$HOSTNAME/install/_[.footnote]#[link:#_footnote_15[15]]# +sur le nouveau système et sur le compte sur le serveur d’installation si +`+$LOGUSER+` est défini. Il est également possible de spécifier un autre +hôte comme enregistrement en enregistrant la destination via la variable +`+$LOGSERVER+`. Si `+$LOGSERVER+` n’est pas défini, FAI utilise la +variable `+$SERVER+` qui n’est définie que lors d’une installation +initiale (par get-boot-info). Assurez-vous de définir `+$LOGSERVER+` +dans un script _class/*.var_ si vous utilisez l’action _softupdate_. + +De plus, deux liens symboliques seront créés pour indiquer le dernier +répertoire écrit. Le lien symbolique _last_ pointe vers le répertoire +journal de la dernière action FAI exécutée. Les liens symboliques +_last-install_ et _last-sysinfo_ pointent vers le répertoire avec la +dernière action correspondante. Par défaut, les fichiers journaux seront +copiés sur le serveur de journal à l’aide de scp. Vous pouvez utiliser +la variable `+$FAI_LOGPROTO+` dans le fichier _fai.conf(5)_ pour choisir +une autre méthode d’enregistrement des journaux sur le serveur distant. +Voici un exemple de structure de lien symbolique: + +.... +lrwxrwxrwx 1 fai fai 23 Dec 2 2013 last-sysinfo -> sysinfo-20131202_161237 +drwxr-xr-x 2 fai fai 4096 Dec 2 2013 sysinfo-20131202_161237 +drwxr-xr-x 2 fai fai 4096 Feb 14 2014 install-20140214_142150 +drwxr-xr-x 2 fai fai 4096 Dec 2 11:47 install-20141202_113918 +lrwxrwxrwx 1 fai fai 23 Dec 4 13:22 last-install -> install-20141204_131351 +lrwxrwxrwx 1 fai fai 23 Dec 4 13:22 last -> install-20141204_131351 +drwxr-xr-x 2 fai fai 4096 Dec 4 13:22 install-20141204_131351 +.... + +Vous trouverez des exemples de fichiers journaux à l’adresse +http://fai-project.org/logs. + +[[_a_id_ireboot_a_redémarrez_le_nouveau_système_installé]] +=== [#ireboot]####Redémarrez le nouveau système installé + +Avant de redémarrer, le client d’installation appelle +`+fai-chboot -d +` sur le serveur d’installation, pour +désactiver sa propre configuration PXELINUX. Sinon, il redémarrera +l’installation lors de la prochaine initialisation. Normalement, cela +devrait démarrer le nouveau système installé à partir de son second +périphérique d’amorçage, le disque dur local. + +À la fin, le système est automatiquement redémarré si "reboot" a été +ajouté à `+$FAI_FLAGS+`. + +[[_a_id_advanced_a_chapitre_avancés_de_fai]] +== [#advanced]####Chapitre avancés de FAI + +[[_a_id_checkbootp_a_vérification_des_paramètres_reçus_des_serveurs_dhcp]] +=== [#checkbootp]####Vérification des paramètres reçus des serveurs DHCP + +Si le client d’installation démarre, vous pouvez vérifier si toutes les +informations provenant du démon DHCP sont correctement reçues. Les +informations reçues sont écrites dans _/tmp/fai/boot.log_. Un exemple de +résultat d’une requête DHCP peut être trouvé dans les fichiers journaux +d’exemple. + +[[_a_id_fai_monitor_a_surveillance_de_plusieurs_installations_clientes]] +=== [#fai-monitor]####Surveillance de plusieurs installations clientes + +Vous pouvez surveiller l’installation de tous les clients d’installation +avec la commande `+fai-monitor(8)+`. Tous les clients vérifient si ce +démon est en cours d’exécution sur le serveur d’installation (ou sur +l’ordinateur défini par la variable $monserver). Chaque fois qu’une +tâche démarre ou se termine, un message est envoyé. Le démon du moniteur +FAI imprime ces messages à la sortie standard. Il ya aussi un frontend +graphique disponible, appelé `+fai-monitor-gui(1)+`. + +.... +$ fai-monitor | fai-monitor-gui - & +.... + +[[_a_id_mac_a_collecte_d_8217_adresses_ethernet_pour_plusieurs_hôtes]] +=== [#mac]####Collecte d’adresses Ethernet pour plusieurs hôtes + +Vous devez collecter toutes les adresses Ethernet (MAC) des clients à +l’installation et affecter un nom d’hôte et une adresse IP à chaque +client. Pour collecter les adresses MAC, démarrez vos clients pour +l’installation. Vous pouvez déjà le faire avant que n’importe quel démon +DHCP s’exécute dans votre sous-réseau. Ils échoueront à démarrer (en +raison du manque de DHCP ou de TFTP manquant), mais vous pouvez toujours +collecter les adresses MAC. + +Pendant que les clients d’installation démarrent, ils envoient des +paquets de diffusion au LAN. Vous pouvez enregistrer les adresses MAC de +ces hôtes en exécutant simultanément la commande suivante sur le +serveur: + +.... +faiserver# tcpdump -qtel broadcast and port bootpc >/tmp/mac.list +.... + +Une fois que les hôtes ont été envoyés, certains paquets de diffusion +annule `+tcpdump+` en tapant _ctrl-c_. Vous obtenez une liste de toutes +les adresses MAC uniques avec ces commandes: + +.... +faiserver$ perl -ane 'print "\U$F[0]\n"' /tmp/mac.list|sort|uniq +.... + +Après cela, vous n’avez qu'à assigner ces adresses MAC aux noms d’hôte +et aux adresses IP (/etc/ethers et /etc/hosts ou aux cartes NIS +correspondantes). Avec ces informations, vous pouvez configurer votre +démon DHCP (voir la section [bootdhcp]). +[.footnote]#[link:#_footnote_16[16]]# + +[[_débogage_du_trafic_réseau]] +==== Débogage du trafic réseau + +Si le client ne peut démarrer correctement à partir de la carte réseau, +utilisez `+tcpdump(8)+` pour rechercher des paquets Ethernet entre le +serveur d’installation et le client. Recherchez également les entrées de +plusieurs fichiers journaux effectués par `+tftpd(8)+` et `+dhcpd(8)+` : + +.... +faiserver$ egrep "tftpd|dhcpd" /var/log/* +.... + +[[_a_id_pxeboot_a_détails_du_démarrage_pxe]] +=== [#pxeboot]####Détails du démarrage PXE + +Ici, nous décrivons les détails du démarrage PXE, qui ne sont +nécessaires que si vous avez des problèmes lors du démarrage de vos +clients d’installation. + +Presque toutes les cartes réseau modernes prennent en charge +l’environnement de démarrage PXE. PXE est l’environnement d’exécution de +pré-lancement. Cela nécessite le chargeur de démarrage PXELINUX et une +version spéciale du démonTFTP, disponible dans les paquets Debian +`+pxelinux+` et `+tftpd-hpa+`. Le démarrage PXE nécessite également un +serveur DHCP, afin que la carte réseau puisse configurer ses paramètres +IP. Il s’agit de la séquence d’une amorce PXE: + +* La carte réseau du client envoie son adresse MAC +* Le serveur DHCP répond à la configuration IP du client +* La carte réseau configure son IP +* Le client d’installation obtient le binaire pxelinux.0 via TFTP +* Obtenez le fichier de configuration pxelinux.cfg/C0A8210C via TFTP +* C0A8210C est l’adresse IP du client en hexadécimal +* Cette configuration contient le noyau, initrd et les paramètres de +ligne de commande supplémentaires du noyau, qui a été créé par +fai-chboot. +* Obtenez le noyau et initrd via TFTP. + +Exemple d’un fichier pxelinux.cfg: + +.... +default fai-generated + +label fai-generated +kernel vmlinuz-3.16.0-4-amd64 +append initrd=initrd.img-3.16.0-4-amd64 ip=dhcp root=/srv/fai/nfsroot aufs FAI_FLAGS=verbose,sshd,createvt FAI_CONFIG_SRC=nfs://faiserver/srv/fai/config FAI_ACTION=install +.... + +Voir _/usr/share/doc/syslinux/pxelinux.doc_ pour des informations plus +détaillées sur PXELINUX. Il existe un nouveau binaire lpxelinux qui +prend également en charge le chargement du noyau et de l’initrd via FTP +ou HTTP. La commande _fai-chboot(8)_' prend en charge cette option avec +l’option _-U_. + +[[_a_id_customizing_your_install_server_setup_a_personnalisation_de_la_configuration_de_votre_serveur_d_8217_installation]] +=== [#Customizing your install server setup]## Personnalisation de la configuration de votre serveur d’installation + +* Miroir de paquetage local/plus rapide +* Loguser différent +* Local root password dans nfsroot + +La configuration du paquet FAI (et non les données de configuration pour +les clients d’installation) est définie dans _fai.conf(5)_. Les +définitions qui sont utilisées uniquement pour créer le nfsroot sont +situées dans _nfsroot.conf(5)_. Vérifiez ces variables importantes dans +_nfsroot.conf_ avant d’appeler _fai-setup_ ou _fai-make-nfsroot_. + +FAI_DEBOOTSTRAP:: + La construction de nfsroot utilise la commande `+debootstrap(8)+`. Il + a besoin de l’emplacement d’un miroir Debian et du nom de la + distribution (wheezy, jessie, stretch, sid) pour lequel le système + Debian de base devrait être construit. N’utilisez pas de distributions + différentes ici et dans _/etc/fai/apt/sources.list_. Cela créera un + nfsroot brisé. +NFSROOT_ETC_HOSTS:: + Cette variable n’est nécessaire que si les clients n’ont pas accès à + un serveur DNS. Cette variable multiligne est ajoutée à /etc/hosts + dans le nfsroot. Ensuite, les clients d’installation peuvent accéder à + ces hôtes par leur nom sans utiliser DNS. + +Le contenu de _/etc/fai/apt/sources.list_ est utilisé par le serveur +d’installation et par les clients. Si votre serveur d’installation a +plusieurs cartes réseau et différents noms d’hôte pour chaque carte +(comme pour un serveur Beowulf), utilisez le nom du serveur +d’installation qui est connu des clients d’installation. + +Si vous avez des problèmes lors de l’exécution de `+fai-setup+`, ils +proviennent habituellement de `+fai-make-nfsroot(8)+` qui est appelé par +la commande précédente. L’ajout de _-v_ vous donne une sortie plus +détaillée qui vous aide à repérer l’erreur. La sortie est écrite dans +_/var/log/fai/fai-make-nfsroot.log_. +[.footnote]#[link:#_footnote_17[17]]# + +L’installation crée également le compte fai (défini par `+$LOGUSER+`) +s’il n’est pas déjà disponible. Vous pouvez donc ajouter un utilisateur +avant d’appeler `+fai-setup(8)+` à l’aide de la commande `+adduser(8)+` +et utiliser ce compte local pour enregistrer des fichiers journaux. Les +fichiers journaux de tous les clients d’installation sont enregistrés +dans le répertoire de base de ce compte. Vous devriez changer le groupe +principal de ce compte, donc ce compte a des droits d'écriture sur +_/srv/tftp/fai_ pour appeler fai-chboot pour créer la configuration PXE +pour les hôtes. + +Lorsque vous apportez des modifications à _fai.conf_, _nfsroot.conf_, le +nfsroot doit être reconstruit en appelant `+fai-make-nfsroot(8)+`. Si +vous souhaitez uniquement installer un nouveau paquet kernel sur +nfsroot, ajoutez les flags _-k_ ou _-K_ à `+fai-make-nfsroot+`. Cela ne +recréera pas votre nfsroot, mais ne mettra à jour que vos noyaux et les +modules du noyau dans le nfsroot ou ajoutera des paquets supplémentaires +dans le nfsroot. + +[[_a_id_cdboot_a_création_d_8217_un_cd_fai_ou_d_8217_une_clé_usb]] +=== [#cdboot]####Création d’un CD FAI ou d’une clé USB + +Vous pouvez facilement créer un CD d’installation (ou clé USB) pour +votre installation réseau. Cela permettra d’effectuer la même +installation et la même configuration à partir du CD sans avoir besoin +du serveur d’installation. Par conséquent, vous devez créer un miroir +partiel de tous les paquets Debian nécessaires à vos classes FAI (à +l’aide de `+fai-mirror(1)+`). Ensuite, la commande `+fai-cd(8)+` mettra +ce miroir, le nfsroot et l’espace de configuration sur un CD amorçable. +C’est tout! + +Ce CD d’installation contient toutes les données nécessaires à +l’installation. La commande `+fai-cd(8)+` place le nfsroot, l’espace de +configuration et un sous-ensemble du miroir Debian sur un CD-ROM. Un +miroir de paquets partiel est créé à l’aide de la commande +`+fai-mirror(1)+` qui contient tous les paquetages utilisés par les +classes utilisées dans votre espace de configuration. Un échantillon +d’image ISO est disponible à l’adresse http://fai-project.org/fai-cd. + +Avec la commande `+dd(1)+`, vous pouvez également créer une clé USB +bootable en écrivant simplement le contenu du fichier ISO sur votre clé +USB (ici le stick est _/dev/sdf_). + +.... + faiserver# dd if=fai-cd.iso of=/dev/sdf bs=1M +.... + +Il ne s’agit pas d’un live CD du serveur d’installation. + +[[_a_id_diskimage_a_création_d_8217_images_de_disque_vm_à_l_8217_aide_de_fai]] +=== [#diskimage]####Création d’images de disque VM à l’aide de FAI + +En utilisant la commande `+fai-diskimage(8)+`, vous pouvez créer des +images de disques de machines Linux qui peuvent être utilisées avec une +machine virtuelle comme KVM, VMware, VirtualBox ou un service cloud +comme OpenStack, GCE, EC2 et autres. Le processus d’installation exécute +les tâches FAI normales sur une image de disque brut. Après +l’installation, vous pouvez démarrer l’image disque et avoir un système +en cours d’exécution. L’image disque peut également être convertie au +format qcow2. + +.... + faiserver# export FAI_BASEFILEURL=http://fai-project.org/download/basefiles/ + faiserver# fai-diskimage -u cloud3 -S 2G -cDEBIAN,JESSIE64,AMD64,FAIBASE,GRUB_PC,CLOUD,GCE disk.raw +.... + +Crée le fichier disk.raw pour un hôte appelé cloud3, avec un petit +ensemble de progiciels. + +.... + # export FAI_BASEFILEURL=http://fai-project.org/download/basefiles/ + # cl=DEFAULT,DHCPC,DEBIAN,AMD64,FAIBASE,GRUB_PC,UBUNTU,XENIAL,XENIAL64,XORG + # fai-diskimage -v -u foobar -S5G -c$cl ubuntu.qcow2 +.... + +Crée une image de disque appelée ubuntu.qcow2 pour un bureau Ubuntu +16.04 avec un nom d’hôte défini sur foobar. + +Vous ne devez pas configurer le nfsroot lorsque vous utilisez uniquement +fai-diskimage. Mais vous avez besoin d’un fichier de base dans votre +espace de configuration. Vous pouvez télécharger une image de base +Debian à partir de http://fai-project.org/download/basefile et copier +ceci dans votre espace de configuration. Si vous avez déjà configuré le +nfsroot, vous pouvez copier le fichier de base Debian depuis le nfsroot +dans votre espace de configuration à l’aide de cette commande: + +.... + $ cp /srv/fai/nfsroot/var/tmp/base.tar.xz + $ /srv/fai/config/basefiles/JESSIE64.tar.xz +.... + +[[_a_id_sysinfo_a_système_de_sauvetage_fai]] +=== [#sysinfo]####Système de sauvetage FAI + +Si vous définissez la variable `+$FAI_ACTION+` sur sysinfo (par exemple +en utilisant `+fai-chboot -S+`), le client n’installera pas de nouveau +système, mais collectera beaucoup d’informations système. Si vous +définissez `+$FAI_ACTION+` sur _inventory_, vous ne recevrez que +quelques informations sur le matériel. Les deux actions peuvent être +utilisées pour FAI comme un système de sauvetage. + +Tapez _ctrl-c_ pour obtenir un shell ou utilisez _Alt-F2_ ou _Alt-F3_ et +vous obtiendrez un autre terminal de console, si vous avez ajouté +_createvt_ à `+$FAI_FLAGS+`. + +Vous avez maintenant un système Linux en cours d’exécution sur le client +d’installation sans utiliser le disque dur local. Utilisez-le comme +système de secours si votre disque local est endommagé ou si +l’ordinateur ne peut pas démarrer correctement à partir du disque dur. +Vous obtiendrez un shell et vous pouvez exécuter diverses commandes +(`+dmesg+`, `+lsmod+`, `+df+`, `+lspci+`, …). Regardez le fichier +journal dans `+/tmp/fai+`. Vous y trouverez de nombreuses informations +sur le processus d’amorçage. + +FAI monte tous les systèmes de fichiers qu’il trouve sur les disques +locaux en lecture seule. Il vous indique également sur quelle partition +un fichier _/etc/fstab_ existe. Lorsqu’une seule table de système de +fichiers est trouvée, les partitions sont montées selon ces +informations. Voici un exemple: + +.... +demohost:~# df +Filesystem 1K-blocks Used Available Use% Mounted on +rootfs 4099064 414088 3645296 11% / +192.168.33.250:/srv/fai/nfsroot + 3905600 410976 3454944 11% /live/image +tmpfs 193464 3112 190352 2% /live/cow +aufs 4099064 414088 3645296 11% / + +192.168.33.250:/srv/fai/config + 3905600 410976 3454944 11% /var/lib/fai/config +/dev/sda1 241116 74519 154149 33% /target +/dev/sda9 4364212 139888 4179988 4% /target/home +/dev/sda7 553376 16840 536536 4% /target/tmp +/dev/sda8 2221628 275936 1832840 14% /target/usr +/dev/sda6 577096 172924 374856 32% /target/var +.... + +*Cette méthode peut être utilisée comme un environnement de secours!* Si +vous avez besoin d’un système de fichiers avec accès en +lecture/écriture, utilisez la commande `+rwmount+`: + +.... +demohost# rwmount /target/home +.... + +[[_a_id_nonfs_a_fai_sans_nfs]] +=== [#nonfs]####FAI sans NFS + +Pour démarrer dans FAI et commencer la séquence d’installation sans +utiliser le protocole NFS. Vous démarrez la machine cliente en utilisant +PXE comme d’habitude, puis récupérez une image contenant le nfsroot via +http. + +Pour créer une image, utilisez l’argument -S de fai-cd + +.... +faiserver# fai-cd -S squash.img +.... + +Déplacez cette image vers un répertoire à partir duquel elle peut être +demandée via http (généralement un répertoire desservi par le serveur +web) + +Pour demander maintenant l’image squashfs, ajoutez ce qui suit à votre +ligne de commande du noyau, p. Dans votre fichier de configuration +pxelinux pour le client. + +.... +root=live:http://faiserver/cskoeln/squash.img +.... + +Remplacez faiserver par le nom de domaine ou IP de la machine à laquelle +votre image de squash est servie. + +[[_a_id_otherdists_a_installation_d_8217_autres_distributions_à_l_8217_aide_d_8217_un_nfsroot_debian]] +=== [#otherdists]####Installation d’autres distributions à l’aide d’un nfsroot Debian + +Vous pouvez installer toutes sortes de distributions Linux à partir d’un +seul nfsroot Debian. Par conséquent, vous devez créer un fichier +base.tar.xz de la distribution que vous souhaitez installer et le placer +dans le répertoire `+basefiles+`. Puis nommez-le UBUNTU1404.tar.xz par +exemple. Un client d’installation appartenant à la classe UBUNTU1404 +extrait ensuite ce fichier de base dans son système de fichiers vide. De +plus, vous devez ajuster les sources.list ou les fichiers de +configuration similaires nécessaires pour spécifier l’emplacement du +référentiel de paquets. + +L’outils `+rinse(8)+` est utilisé pour créer des fichiers de base pour +la distribution comme CentOS, openSUSE, Scientific Linux Cern ou Fedora. +Certains fichiers de base peuvent être téléchargés à partir de +http://fai-project.org/download/basefiles/. + +Le script `+mk-basefile+` dans +_/usr/share/doc/fai-doc/examples/simple/basefiles/_' aide à créer ces +fichiers de base. + +[[_a_id_dirinstall_a_création_d_8217_environnements_chrooter_et_virtualiser]] +=== [#dirinstall]####Création d’environnements chrooter et virtualiser + +Si vous devez créer certains environnements chroot, ou un environnement +de virtualisation où vous ne pouvez ni ne voulez exécuter un programme +d’installation Debian normal pour accéder à un système opérationnel (par +exemple, les domaines hôtes Xen), il ya l’action FAI _dirinstall_. En +appelant + +.... +faiserver# fai dirinstall +.... + +Et en utilisant l’option _-c _ ou _-N_ vous obtenez une +installation FAI, sans l’action de partitionnement, directement dans le +répertoire cible. Le nom d’hôte de l’installation cible peut être +spécifié à l’aide de _-u _ + +Ceci, par exemple, peut être utilisé pour combiner FAI avec l’outil +_xen-tools_, qui vous aide à construire des domaines invités Xen. +_xen-tools_ est très agréable pour générer des fichiers de configuration +et bloquer des périphériques pour de nouveaux invités basés sur des +commandes simples et/ou des fichiers de configuration, mais ils ne +peuvent assigner qu’un seul rôle par installation pour la +personnalisation. Les FAI-utilisateurs ont besoin et veulent plus, car +ils sont utilisés pour avoir le système de classe. Ils les obtiennent +même dans les installations xen-tools, en utilisant le code suivant en +tant que rôle xen-tools script: + +.... +#!/bin/sh +TARGET=$1 +CMD="fai -N -v -u ${hostname} dirinstall $TARGET" +echo running $CMD +$CMD +.... + +Ensuite, vous voulez définir la variable _install=0_ de la configuration +xen-tools pour cet hôte. + +[[_a_id_softupdate_a_utilisation_de_fai_pour_les_mises_à_jour]] +=== [#softupdate]####Utilisation de FAI pour les mises à jour + +FAI peut également effectuer des mises à jour de systèmes déjà en cours +d’exécution, sans réinstallation à partir de zéro. C’est ce qu’on +appelle softupdate. Un FAI softupdate ignore les tâches qui ne sont pas +adaptées à la mise à jour d’un système en cours d’exécution, comme le +partitionnement des disques durs et la création de systèmes de fichiers. +Au lieu de cela, il exécute uniquement les tâches de mise à jour et +d’installation des progiciels et de l’appel des scripts de +personnalisation. + +Pour exécuter un appel softupdate: + +.... +# fai -v -s nfs://faiserver/srv/fai/config softupdate +.... + +Par défaut, un softupdate utilise la liste des classes définies lors de +l’installation initiale. Assurez-vous de définir la variable +`+$LOGSERVER+` (effectuée dans un fichier _class/*.var_) si FAI doit +enregistrer les fichiers journaux sur une machine distante. + +C’est à vous, comment démarrer un softupdate sur un plus grand nombre +d’hôtes. Vous pouvez faire le softupdate sur une base régulière via cron +ou vous pouvez utiliser des outils comme `+clusterssh(1)+` pour démarrer +un softupdate via un push sur une liste d’hôtes. + +Gardez à l’esprit que les scripts de personnalisation sont exécutés +chaque fois que vous faites un softupdate. Cela signifie qu’ils doivent +être *idempotents*, c’est-à-dire que le résultat de leur fonctionnement +doit toujours produire le même résultat, même lorsqu’ils fonctionnent +plus d’une fois. + +Par exemple, l’ajout d’une ligne à un fichier ne doit pas se faire via +ce code: + +.... +$ echo "some strings" >> /etc/fstab +.... + +Utilisez plutôt la commande `+ainsl(1)+` dans un script shell ou +utilisez la fonction _AppendIfNoSuchLine_ de cfengine. + +Toutes les commandes du script de personnalisation doivent être capables +de modifier le système de fichiers cible s’il est disponible dans +_/target_ lors de l’installation initiale ou si c’est le système de +fichiers normal relatif à _/_ pendant le softtupdate. + +Voici quelques variables qui aident à écrire ces scripts: + +`+$target+`:: + Pointe vers le répertoire racine du client, qui est _/target_ pendant + l’installation et _/_ pendant un softupdate. +`+$FAI_ROOT+`:: + C’est la même valeur que `+$target+`. Pour des raisons historiques, + nous avons ces deux variables dans FAI. +`+$ROOTCMD+`:: + Dans le cas de l’installation, il s’agit d’un alias pour _chroot + $target_ en cas de softupdate c’est juste vide. Vous pouvez ajouter + ceci aux commandes si vous avez besoin d’exécuter une commande dans le + système de fichiers cible des clients via chroot. +`+$FAI_ACTION+`:: + Si vous devez appeler le code en fonction de l’action FAI effectuée, + vous pouvez utiliser cette variable. Il contient l’action actuellement + exécutée: _install_, _softupdate_, _dirinstall_, _sysinfo_, + _inventory_ ou votre propre action définie. + +[[_a_id_archcross_a_comment_installer_un_système_d_8217_exploitation_32_bits_à_partir_d_8217_un_système_d_8217_exploitation_64_bits]] +=== [#archcross]####Comment installer un système d’exploitation 32 bits à partir d’un système d’exploitation 64 bits + +Pour installer un ordinateur avec un système d’exploitation 32 bits, +vous avez besoin d’un nfsroot i386. La création de cette nfsroot 32 bits +sur un serveur d’installation exécutant amd64 est assez simple. +Installez et configurez les paquets FAI. Copiez ensuite vos fichiers de +configuration FAI dans un nouveau sous-répertoire. + +.... +faiserver# cp -a /etc/fai /etc/fai-i386 +.... + +Modifiez la variable `+$FAI_DEBOOTSTRAP_OPTS+` dans +_/etc/fai-i386/nfsroot.conf_ et ajoutez l’option `+--arch i386+`. +Choisissez également un répertoire différent pour votre nouveau nfsroot. +Voici les deux lignes après l'édition. + +.... +NFSROOT=/srv/fai/nfsroot-i386 +FAI_DEBOOTSTRAP_OPTS="--arch i386 --exclude=info --include=aptitude"" +.... + +Appelez maintenant fai-make-nfsroot qui crée le nfsroot 32 bits dans +_/srv/fai/nfsroot-i386_ + +.... +faiserver# fai-make-nfsroot -v -C/etc/fai-i386 +.... + +La création d’un miroir partiel utilisant `+fai-mirror(1)+` nécessaire à +un CD amorçable ou une clé USB est également possible sur une +architecture différente. Vous devez spécifier l’architecture lors de +l’appel de fai-mirror. + +.... +$ fai-mirror -m800 -B -a i386 -v -cDEFAULT,DEBIAN,FAIBASE,I386 /srv/mirror-i386 +.... + +C’est tout! + +[[_a_id_hints_a_divers_conseils_et_détails]] +== [#hints]## Divers conseils et détails + +[[_a_id_tasks_a_la_liste_des_tâches]] +=== [#tasks]## La liste des tâches + +La plupart des tâches de l’installation sont définies comme des +sous-routines qui sont définies dans _/usr/lib/fai/subroutines_ (par +exemple `+task_instsoft+`). Certains sont des scripts shell externes +situés dans _/usr/lib/fai/_. Ils sont appelés via un sous-programme +supérieur appelé _task_. Ce sous-programme appelle les hooks si +disponibles, puis appelle la tâche (définie comme __task___). Une +tâche et ses hooks peuvent être ignorés à la demande en utilisant la +commande _skiptask()_. + +Suit maintenant la description de toutes les tâches, énumérées dans +l’ordre dans lequel elles sont exécutées. + +confdir:: + Les paramètres ajoutés au noyau peuvent définir des variables, le + démon syslog est démarré. La liste des périphériques réseau est + stockée dans `+$netdevices+`. Ensuite, des paramètres supplémentaires + sont extraits d’un serveur DHCP. Le fichier de configuration du + résolveur DNS est créé. + + + L’emplacement de l’espace de configuration est défini par la variable + `+$FAI_CONFIG_SRC+`. + + + Ensuite, le fichier _$FAI/hooks/subroutines_ est sourcé s’il existe. + En utilisant ce fichier, vous pouvez définir vos propres + sous-programmes ou remplacer la définition des sous-programmes FAI. +setup:: + Cette tâche définit l’heure du système, tous les `+$FAI_FLAGS+` sont + définis et deux terminaux virtuels supplémentaires sont ouverts à la + demande. Un démon de shell sécurisé est lancé à la demande pour les + connexions à distance. +defclass:: + Appellez `+fai-class(1)+` pour définir des classes à l’aide de scripts + et de fichiers dans _$FAI/class_ et classes de + _/tmp/fai/additional-classes_ et la variable `+$ADDCLASSES+`. La liste + de toutes les classes définies est stockée dans la variable + `+$classes+` et enregistrée dans _/tmp/fai/FAI_CLASSES_. +defvar:: + Sourcez tous les fichiers _$FAI/class/*.var_ pour chaque classe + définie. Si un hook a écrit quelques définitions de variables dans le + fichier _$LOGDIR/additional.var_, ce fichier est également sourcé. +action:: + En fonction de la valeur de `+$FAI_ACTION+`, ce sous-programme décide + de l’action FAI à exécuter. Les actions disponibles par défaut sont: + _sysinfo_, _install_, _inventory_, _dirinstall_ et _softupdate_. Si + `+$FAI_ACTION+` a une autre valeur, une action définie par + l’utilisateur est appelée si un fichier _$FAI/hooks/$FAI_ACTION_ + existe. Ainsi, vous pouvez facilement définir vos propres actions. +sysinfo:: + Appelée lorsque aucune installation n’est effectuée mais que l’action + est _sysinfo_. Il affiche des informations sur le matériel détecté et + monte les disques durs locaux en lecture uniquement sur + _/target/`+partitionname+`_ ou en regard d’un fichier _fstab_ trouvé à + l’intérieur d’une partition. Les fichiers journaux sont stockés sur le + serveur d’installation. +inventory:: + Une courte liste des informations système est imprimée. +install:: + Cette tâche contrôle la séquence d’installation. Vous entendrez trois + bips avant le début de l’installation. Le travail principal consiste à + appeler d’autres tâches et à enregistrer la sortie dans + _/tmp/fai/fai.log_. Si vous avez des problèmes pendant l’installation, + regardez tous les fichiers dans _/tmp/fai/_. Vous trouverez des + exemples de fichiers journaux à l’adresse + http://fai-project.org/logs/. +dirinstall:: + Installez dans un répertoire, et non pas sur un disque local. + Utilisez-le pour créer des environnements chrootés. +softupdate:: + Cette tâche, exécutée à l’intérieur d’un système en cours d’exécution + via l’interface de ligne de commande `+fai(8)+`, effectue un + softupdate. Voir le chapitre link:#softupdate[[softupdate]] pour plus + de détails. +partition:: + Appelle `+setup-storage(8)+` pour partitionner les disques durs et + créer des systèmes de fichiers. La tâche écrit des définitions de + variables pour la partition et le périphérique racine et de démarrage + (`+$ROOT_PARTITION, $BOOT_PARTITION, $BOOT_DEVICE+`) dans + _/tmp/fai/disk_var.sh_ et crée un fichier _fstab_ pour le nouveau + système. +mountdisks:: + Montez les partitions créées en fonction du fichier _/tmp/fai/fstab_ + créé par rapport à `+$FAI_ROOT+`. +extrbase:: + Extrait un système minimal après lequel un chroot peut y être + introduit. Par défaut, le fichier tar base _/var/tmp/base.tar.xz_ sera + extrait. Les fichiers correspondant à un nom de classe dans + _$FAI/basefiles/_ sont également utilisés pour décompresser un autre + fichier tar selon les classes définies. Cela peut être utilisé pour + installer des distributions Linux différentes de celles utilisées pour + créer le nfsroot. Le fichier par défaut _base.tar.xz_ est un + instantané d’un système Debian de base créé par `+debootstrap(8)+` + Cette tâche utilise la variable `+FAI_BASEFILEURL+` pour extraire le + fichier de base via FTP ou HTTP si elle est définie. +debconf:: + Appelle `+fai-debconf(1)+` pour définir les valeurs de la base de + données de préconfiguration de debconf. +repository:: + Préparez l’accès au référentiel de paquets en préparant la + configuration apt. Cela peut également ajouter des clés de référentiel + via `+apt-key(8)+` en classe à partir de fichiers comme + _CLASSNAME.asc_ dans le répertoire _package_config_. +updatebase:: + Met à jour les paquets de base du nouveau système et met à jour la + liste des paquets disponibles. Il falsifie également certaines + commandes (appelées diversions) à l’intérieur du nouveau système + installé à l’aide de `+dpkg-divert(8)+`, de sorte qu’aucun démon ne + sera démarré pendant l’installation. +instsoft:: + Installe les progiciels souhaités en utilisant des fichiers de classe + dans _$FAI/package_config/_. +configure:: + Appelle les scripts dans _$FAI/scripts/_ et ses sous-répertoires pour + chaque classe définie. +tests:: + Appelle les scripts de test dans _$FAI/tests/_ et ses sous-répertoires + pour chaque classe définie. +finish:: + Démonte tous les systèmes de fichiers dans le nouveau système installé + et supprime les diversions de fichiers à l’aide de la commande + `+fai-divert+`. +chboot:: + Modifie la configuration PXE d’un hôte sur le serveur d’installation + qui indique quelle configuration PXELINUX doit être chargée lors de la + prochaine initialisation à partir de la carte réseau via TFTP. Par + conséquent, la commande `+fai-chboot(8)+` est exécutée à distance sur + le serveur d’installation. +savelog:: + Enregistre les fichiers journaux sur le disque local et sur le compte + `+$LOGUSER+` sur `+$LOGSERVER+` (par défaut sur le serveur + d’installation). +faiend:: + Attendez que les travaux en arrière-plan se terminent (par exemple, + emacs compile des fichiers lisp) et redémarre automatiquement les + clients d’installation ou attend la saisie manuelle avant le + redémarrage. + +[[_a_id_itests_a_tests_automatisés]] +=== [#itests]####Tests automatisés + +Après l’exécution des scripts de personnalisation, FAI exécutera +certains tests si disponibles. En utilisant ces tests, vous pouvez +vérifier les erreurs de l’installation. Les scripts de test sont appelés +via `+fai-do-scripts(1)+` et doivent ajouter leurs messages à +_$LOGDIR/test.log_. Un module Perl comprenant des sous-routines utiles +peut être trouvé dans _Faitest.pm_. Un test peut également définir une +nouvelle classe pour exécuter d’autres tests lors du prochain démarrage +via la variable `+$ADDCLASSES+`. + +[[_a_id_autodiscover_a_découvrir_automatiquement]] +=== [#autodiscover]## Découvrir automatiquement + +Dans FAI 5.0, nous avons publié une fonctionnalité qui permet aux +clients de rechercher le faiserver dans leur sous-réseau respectif. Cela +soulève la nécessité de récupérer l’adresse MAC de chaque client et de +configurer le démon DHCP. + +Cela se fait en démarrant à partir d’une petite autodiscover FAI +bootmedium (CD, USB, etc.), qui peut être créée via la commande: + +.... +faiserver# fai-cd -A autodiscover.iso +.... + +L’image a une taille d’environ 25 Mo et analyse le sous-réseau d’un +serveur FAI. Par défaut, il affiche un menu avec tous les profils +disponibles dans l’espace de configuration de la même manière que le +drapeau de menu. Dans ce menu, vous pouvez sélectionner le type +d’installation que vous souhaitez effectuer. + +Pour que les clients puissent trouver le faiserver, le faiserver doit +exécuter fai-monitor. + +[[_a_id_changeboot_a_modification_du_périphérique_d_8217_amorçage]] +=== [#changeboot]####Modification du périphérique d’amorçage + +La modification de la séquence d’amorçage s’effectue normalement dans la +configuration du BIOS. Mais vous ne pouvez pas changer le BIOS d’un +système Linux en cours d’exécution. + +Ainsi, la séquence d’amorçage du BIOS restera inchangée et votre +ordinateur devrait toujours démarrer en premier à partir de sa carte +réseau et le deuxième périphérique d’amorçage devrait être le disque +local. Ensuite, vous pouvez changer le périphérique d’amorçage du client +en créant différentes configurations PXELINUX. Cela définira si une +installation doit être effectuée, ou si le client doit démarrer à partir +du disque local. Cela se fait à l’aide de `+fai-chboot(8)+`. + +[[_a_id_debian_mirror_a_comment_créer_un_miroir_debian_local]] +=== [#debian-mirror]####Comment créer un miroir Debian local + +Le script `+mkdebmirror+` [.footnote]#[link:#_footnote_18[18]]# peut +être utilisé pour créer votre propre miroir Debian local. Ce script +utilise la commande `+debmirror(1)+`. Un miroir Debian partiel pour +l’architecture i386 et amd64 pour Debian 8.0 (aka jessie) sans les +paquets source nécessite environ 56Go d’espace disque. L’accès au miroir +via HTTP sera la méthode par défaut dans la plupart des cas. Pour +afficher plus de résultats à partir du script, appelez +`+mkdebmirror -v+`. Un compte root n’est pas nécessaire pour créer et +maintenir le miroir Debian. + +Pour utiliser l’accès HTTP au miroir Debian local, installez un serveur +Web et créez un lien symbolique vers le répertoire local où se trouve +votre miroir: + +.... +faiserver# apt-get install apache2 +faiserver# ln -s /files/scratch/debmirror /var/www/html/debmirror +.... + +Créez un fichier `+sources.list(5)+` dans _/etc/fai/apt_ qui donne accès +à votre miroir Debian. Ajoutez également l’adresse IP du serveur HTTP à +la variable `+$NFSROOT_ETC_HOSTS+` dans _nfsroot.conf_ si les clients +d’installation n’ont pas de résolution DNS. + +[[_petits_conseils]] +=== Petits conseils + +* Lorsque vous utilisez l’accès HTTP à un miroir Debian, la partition +locale _/var_ sur tous les clients d’installation doit être suffisamment +grande pour conserver les paquets Debian téléchargés. N’essayez pas avec +moins de 250 Moctets à moins que vous sachiez pourquoi. Vous pouvez +limiter le nombre de paquets installés à la fois avec la variable +`+$MAXPACKAGES+`. +* Vous pouvez supprimer le logo rouge sur le client d’installation en +appelant simplement une fois `+reset+`. Il ne s’affichera pas si vous +créez un fichier à l’aide de cette commande sur le serveur +d’installation: + +.... +touch /srv/fai/nfsroot/.nocolorlogo +.... + +* Une liste des variables utilisées par FAI peut être trouvée à +http://wiki.fai-project.org/wiki/Variables. +* Vous pouvez raccourcir certains scripts de personnalisation en +utilisant une seule commande fcopy _fcopy -r /_. +* Si vous reconstruisez le nfsroot, vous allez créer une nouvelle clé +hôte ssh dans le nfsroot. La connexion à un client d’installation peut +échouer, car la clé hôte change. Vous pouvez utiliser ceci: + +.... +$ ssh -o StrictHostKeyChecking=no root@installclient +.... + +* Vous pouvez également supprimer l’entrée hôte de votre client +d’installation dans votre fichier _~/.ssh/known_hosts_ à l’aide de la +commande _ssh-keygen -R_. +* Dans les tâches chboot et savelog, une connexion utilisant un shell +sécurisé est ouverte au serveur FAI (voir link:#isavelog[[isavelog]]). +Pour garantir que cela fonctionne de manière non interactive, une entrée +appropriée dans _NFSROOT/root/.ssh/known_hosts_ doit être créée. Lors de +l’utilisation de fai-setup, cela se fait automatiquement, mais il peut +s’avérer nécessaire de l'éditer manuellement si le nom de votre serveur +FAI n’a pas été correctement déterminé. Si vous trébuchez sur des +connexions ssh qui nécessitent de taper "yes" pour accepter la clé hôte +pendant l’installation, vérifiez le contenu de votre fichier +_NFSROOT/root/.ssh/known_hosts_ +* Une liste de tous les disques durs locaux est stockée dans +`+$disklist+`. Il est défini après l’appel de `+set_disk_info+`. +* Utilisez `+fai-divert -a+` si un script postinst appelle un programme +de configuration, par exemple Le script postinst pour package apache +appelle apacheconfig, qui nécessite une entrée manuelle. Vous pouvez +fausser le programme de configuration pour que l’installation puisse +être entièrement automatique. +* Parfois, l’installation semble s’arrêter, mais souvent il ya seulement +un script postinstall d’un logiciel qui nécessite une entrée manuelle de +la console. Passez à un autre terminal virtuel et regardez quel +processus fonctionne avec des outils comme `+top(1)+` et `+pstree(1)+`. +Vous pouvez ajouter _debug_ à _FAI_FLAGS_ pour faire en sorte que le +processus d’installation affiche toutes les sorties des scripts postinst +sur la console et obtenir son entrée aussi à partir de la console. +* Comment puis-je définir des classes sur la ligne de commande du noyau? ++ +Lisez la page de manuel de `+fai-class(8)+`. Si vous souhaitez définir +des classes supplémentaires (par exemple A, B, C) sur la ligne de +commande du noyau, ajoutez ceci: _ADDCLASSES=A,B,C_ +* Comment utiliser un noyau personnalisé dans le nfsroot? ++ +Construisez votre noyau personnalisé en construisant un paquet kernel à +l’aide de `+make-kpkg(8)+` et utilisez l’option `+--initrd+`. Copiez ce +paquet Debian dans un référentiel local et ajoutez-le à +/etc/fai/sources.list. Ajoutez le nom de votre package à +/etc/fai/NFSROOT. Ensuite appeler ++ +.... +# fai-make-nfsroot -k +.... +* Puis-je utiliser un noyau 4.X? ++ +Oui. L’utilisation de FAI 5.1 et dracut 044+150-1 overlayfs (au lieu +d’aufs) est prise en charge, de même que le noyau 4.x. Lorsque vous +utilisez Debian jessie, vous pouvez utiliser un noyau de backports ou +consulter +https://lists.uni-koeln.de/pipermail/linux-fai/2016-March/011283.html +* Comment utiliser le nfsroot comme système pour les clients sans +disque? ++ +http://wiki.fai-project.org/wiki/Use_nfsroot_for_diskless_clients +* Comment faire pour servir plusieurs arborescence nfsroot sur un +serveur FAI? ++ +Si vous souhaitez diffuser plusieurs répertoires nfsroot, vous devez +créer des répertoires de configuration spécifiques dans _/etc_ pour FAI, +comme _/etc/fai-jessie_ et _/etc/fai-stretch_. Ensuite, vous devez +définir les variables `+$NFSROOT+` dans différents répertoires et +exécuter + +.... +faiserver#fai-make-nfsroot -c /etc/fai-jessie +.... + +[[_flag_reboot_fai_flags]] +=== flag_reboot (FAI_FLAGS) + +Si flag_reboot est défini, en ajoutant "reboot" à `+$FAI_FLAGS+`, votre +ordinateur client redémarrera après la fin de la tâche. Ceci est vrai +pour les installations de réseau ainsi que pour les installations de +bootmedium. + +[[_centos_reboot]] +=== CentOS reboot + +Après l’installation, CentOS nécessite habituellement un redémarrage +supplémentaire, en raison des correctifs de sécurité SELinux qui sont +appliqués après l’installation. + +[[_a_id_logfiles_a_fichiers_journaux]] +=== [#logfiles]####Fichiers journaux + +FAI crée plusieurs fichiers journaux. Pendant l’installation, ils sont +stockés dans _/tmp/fai_ sur le client d’installation lui-même. A la fin +de l’installation, ils seront copiés sur le serveur d’installation (voir +link:#isavelog[[isavelog]]). Une fois le client d’installation redémarré +dans son système nouvellement installé, vous pouvez trouver les journaux +FAI dans _/var/log/fai_. Les fichiers journaux sont également créés lors +de l’action softupdate ou dirinstall. + +Sur le faiserver, vous pouvez trouver les fichiers journaux (distants) +sous le répertoire ~fai. + +Les exemples de fichiers journaux des ordinateurs installés avec succès +sont disponibles sur http://fai-project.org/logs. Ce sont quelques +fichiers journaux qui sont créés par FAI. + +FAI_CLASSES:: + Contient une liste de toutes les classes définies. +dmesg.log:: + La sortie de la commande `+dmesg+`. Contient des messages utiles de la + mémoire tampon du noyau. +fai.log:: + Le fichier journal principal. Contient toutes les informations + importantes. Vous devez *toujours* lire ce fichier. +boot.log:: + Une liste de variables de paramètres de réseau, principalement définis + par le démon DHCP. +format.log:: + Sortie de l’outil de partition `+setup-storage(8)+`. +shell.log:: + La sortie de tous les scripts shell, utilisés pour la + personnalisation. +variables.log:: + Une liste de toutes les variables shell qui sont disponibles au cours + d’une installation. +error.log:: + Résumé des erreurs possibles dans tous les fichiers journaux. +disk_var.sh:: + Une liste des variables contenant des informations sur les + périphériques et les partitions à partir desquelles la partition + racine et une liste de périphériques de swap. Ces informations sont + utilisées par certains scripts de personnalisation (par exemple + _GRUB_PC/10-setup_). + +Si le processus d’installation se termine, le hook _savelog.LAST.sh_ +recherche tous les fichiers journaux pour les erreurs courantes et les +écrit dans le fichier _error.log_. Donc, vous devriez d’abord regarder +dans ce fichier pour les erreurs. Le fichier _status.log_ vous donne +également le code de sortie de la dernière commande exécutée dans un +script. Pour être sûr, vous devriez rechercher plus de détails dans tous +les fichiers journaux. + +[[_comment_utiliser_http_pour_le_démarrage_pxe]] +=== Comment utiliser HTTP pour le démarrage PXE + +.... +cp /usr/lib/PXELINUX/lpxelinux.0 /srv/tftp/fai/pxelinux.0 +.... + +Activer l’accès HTTP au répertoire tftp: + +.... +cd /var/www/html +ln -s /srv/tftp/fai +.... + +Ajoutez _-U URL_ à l’appel _fai-chboot_. Par exemple: + +.... +fai-chboot -U http://faiserver/fai -IFv ....... +.... + +[[_a_id_troubleshoot_a_dépannage]] +== [#troubleshoot]####Dépannage + +[[_a_id_booterror_a_erreurs_d_8217_amorçage]] +=== [#booterror]####Erreurs d’amorçage + +Le message d’erreur suivant indique que votre client d’installation +n’obtient pas de réponse d’un serveur DHCP. Vérifiez vos câbles ou +démarrez le démon `+dhcpd(8)+` avec le debug flag activé. + +PXE-E51: No DHCP or BOOTP offers received Network boot aborted + +Si vous ne voyez pas le message suivant, le noyau d’installation n’a pas +pu détecter votre carte réseau, par exemple en raison d’un pilote +manquant: + +.... +Starting dhcp for interface eth0 +dhcp: PREINIT eth0 up +dhcp: BOND setting eth +.... + +Vérifiez l’initrd dans le nfsroot (`+lsinird+`) si le pilote du noyau de +votre carte réseau est inclus et vérifiez si vous souhaitez ajouter le +paquet _firmware-linux-nonfree_ dans `+/etc/fai/NFSROOT+` et +reconstruisez l’initrd en appelant `+fai-make-nfsroot -k+`. Vous pouvez +également ajouter un pilote à `+/srv/fai/nfsroot/etc/dracut.conf+` dans +la ligne `+add_drivers+`+`+=+`. + +C’est le message d’erreur que vous verrez, lorsque votre carte réseau +fonctionne, mais le serveur d’installation n’exporte pas le répertoire +nfsroot vers les clients d’installation. Cela est souvent dû aux +permissions NFS manquantes du côté serveur. + +.... +Starting dhcp for interface eth0 +dhcp: PREINIT eth0 up +dhcp: BOND setting eth +mount.nfs: access denied by server while mounting 192.168.33.250:/srv/fai/nfsroot +. +. +dracut Warning: Could not boot +. +Dropping to debug shell +dracut:/# +.... + +Maintenant, vous êtes à l’intérieur du shell d’urgence de l’initrd qui a +été créé par _dracut(8)_. Vous obtiendrez une invite du shell et pourrez +consulter les fichiers journaux. Pour plus d’informations sur le +débogage du processus de démarrage précoce à l’aide de dracut, consultez +`+dracut.cmdline(7)+` + +Utilisez la commande suivante sur le serveur d’installation pour voir +quels répertoires sont exportés à partir du serveur d’installation +(nommé faiserver): + +.... +$ showmount -e faiserver +.... + +[[footnotes]] + +''''' + +[[_footnote_1]] +link:#_footnoteref_1[1]. Solaris 8 Advanced Installation Guide at +https://docs.oracle.com/cd/E19455-01/806-0957/806-0957.pdf + +[[_footnote_2]] +link:#_footnoteref_2[2]. +http://www.science.uva.nl/pub/solaris/auto-install + +[[_footnote_3]] +link:#_footnoteref_3[3]. fai-kvm a besoin de beaucoup de ram pour la vm, +à cause de la mise en cache de /var, 2GB sont OK + +[[_footnote_4]] +link:#_footnoteref_4[4]. Cette installation consommera environ 2 Go +d’espace dans `+/tmp+`. + +[[_footnote_5]] +link:#_footnoteref_5[5]. Il est également possible d’utiliser uniquement +le fichier de configuration avec la plus haute priorité puisque l’ordre +des classes définit une priorité de bas à haut dans la liste des +classes. + +[[_footnote_6]] +link:#_footnoteref_6[6]. Si vous souhaitez utiliser un miroir plus +rapide, ajustez l’URL dans _/etc/fai/apt/sources.list_ et +`+FAI_DEBOOTSTRAP+` in _/etc/fai/nfsroot.conf_ avant d’appeler +fai-setup. + +[[_footnote_7]] +link:#_footnoteref_7[7]. Ceci appellera `+fai-make-nfsroot(8)+` interne. + +[[_footnote_8]] +link:#_footnoteref_8[8]. Ces fichiers ne doivent pas appartenir au +compte racine. + +[[_footnote_9]] +link:#_footnoteref_9[9]. Vous pouvez également ajouter ceci dans votre +système de noms de domaine (DNS) + +[[_footnote_10]] +link:#_footnoteref_10[10]. Puisque le système de fichiers racine sur les +clients est monté via NFS, `+fai+` est localisé in +_/srv/fai/nfsroot/usr/sbin_ sur le servuer d’installation. + +[[_footnote_11]] +link:#_footnoteref_11[11]. _$FAI_ est une variable interne utilisée par +les scripts FAI. Par défaut, le chemin est _/var/lib/fai/config_. + +[[_footnote_12]] +link:#_footnoteref_12[12]. _/srv/fai/nfsroot_ depuis le serveur +d’installation via NFS + +[[_footnote_13]] +link:#_footnoteref_13[13]. Il a été défini sur la ligne de commande du +noyau + +[[_footnote_14]] +link:#_footnoteref_14[14]. /var/lib/fai/config + +[[_footnote_15]] +link:#_footnoteref_15[15]. _/var/log/fai/localhost/install/_ est un lien +vers ce répertoire. + +[[_footnote_16]] +link:#_footnoteref_16[16]. Je recommande d'écrire les adresses MAC (les +trois derniers octets suffiront si vous avez des cartes réseau du même +fournisseur) et le nom d’hôte à l’avant de chaque châssis. + +[[_footnote_17]] +link:#_footnoteref_17[17]. Pour le débogage, il peut être utile d’entrer +l’environnement chroot manuellement à l’aide de cette commande. +_faiserver# chroot /srv/fai/nfsroot bash_ + +[[_footnote_18]] +link:#_footnoteref_18[18]. Vous pouvez trouver le script dans +_/usr/share/doc/fai-doc/examples/utils/_ Version 5.3 + +[[footer]] +[[footer-text]] +Version 5.3 + +Last updated 2017-04-20 11:27:23 CEST diff --git a/doc/po/fai-guide.pot b/doc/po/fai-guide.pot new file mode 100644 index 000000000..376e61d76 --- /dev/null +++ b/doc/po/fai-guide.pot @@ -0,0 +1,4159 @@ +#. extracted from fai-guide.txt +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2025-10-23 16:13+0200\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Translate Toolkit 3.15.1\n" + +#: fai-guide.txt:4 +msgid "" +"////\n" +" -*- Doc -*-\n" +"////" +msgstr "" + +#: fai-guide.txt:11 +msgid "" +"FAI Guide (Fully Automatic Installation)\n" +"========================================\n" +"Thomas Lange \n" +"Wed, 10 Apr 2025\n" +":Date: a date\n" +":Revision: 6.4" +msgstr "" + +#: fai-guide.txt:13 +msgid ":nfsrootsize: 1.1" +msgstr "" + +#: fai-guide.txt:21 +msgid "" +"////\n" +" => _\n" +"path ''\n" +" => +\n" +" =>` ` (wie manref)\n" +" => _\n" +"////" +msgstr "" + +#: fai-guide.txt:23 +msgid "" +"An older French version of this guide is available at https://fai-" +"project.org/fai-guide-fr." +msgstr "" + +#: fai-guide.txt:30 +msgid "" +"Abstract\n" +"--------\n" +"FAI is a non-interactive system to install, customize and manage Linux\n" +"systems and software configurations on computers as well as virtual\n" +"machines and chroot environments, from small networks to large\n" +"infrastructures and clusters." +msgstr "" + +#: fai-guide.txt:34 +msgid "" +"This manual describes the Fully Automatic Installation software. This\n" +"includes the installation of the packages, setting up the server, creating " +"of the\n" +"configuration and how to deal with errors." +msgstr "" + +#: fai-guide.txt:37 +msgid "(c) 2000-2025 Thomas Lange" +msgstr "" + +#: fai-guide.txt:44 +msgid "" +".Copyright\n" +"This manual is free software; you may redistribute it and/or modify it\n" +"under the terms of the GNU General Public License as published by the\n" +"Free Software Foundation; either version 2, or (at your option) any\n" +"later version." +msgstr "" + +#: fai-guide.txt:49 +msgid "" +"This is distributed in the hope that it will be useful, but *without\n" +"any warranty*; without even the implied warranty of merchantability or\n" +"fitness for a particular purpose. See the GNU General Public License\n" +"for more details." +msgstr "" + +#: fai-guide.txt:55 +msgid "" +"A copy of the GNU General Public License is available as\n" +"'/usr/share/common-licenses/GPL' in the Debian GNU/Linux distribution\n" +"or on the World Wide Web at https://www.gnu.org/copyleft/gpl.html[the\n" +"GNU website] You can also obtain it by writing to the Free Software\n" +"Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, " +"USA." +msgstr "" + +#: fai-guide.txt:57 +msgid "<<<" +msgstr "" + +#: fai-guide.txt:60 +msgid "== [[introduction]]Introduction" +msgstr "" + +#: fai-guide.txt:62 +msgid "=== [[availability]]Availability" +msgstr "" + +#: fai-guide.txt:66 +msgid "" +"Homepage::\n" +"https://fai-project.org" +msgstr "" + +#: fai-guide.txt:69 +msgid "" +"FAI wiki::\n" +"https://wiki.fai-project.org" +msgstr "" + +#: fai-guide.txt:72 +msgid "" +"Download::\n" +"https://fai-project.org/download" +msgstr "" + +#: fai-guide.txt:75 +msgid "" +"Entry for 'sources.list'::\n" +"`deb https://fai-project.org/download bookworm koeln`" +msgstr "" + +#: fai-guide.txt:78 +msgid "" +"Manual pages::\n" +"https://fai-project.org/doc/man/" +msgstr "" + +#: fai-guide.txt:81 +msgid "" +"Mailing list::\n" +"https://lists.uni-koeln.de/mailman/listinfo/linux-fai" +msgstr "" + +#: fai-guide.txt:85 +msgid "" +"Feedback::\n" +"Send feedback and comments to mailto:fai@fai-project.org[] or\n" +"to the mailing list." +msgstr "" + +#: fai-guide.txt:88 +msgid "" +"Bugs::\n" +"Use the Debian bug tracking system (BTS) https://bugs.debian.org/src:fai" +msgstr "" + +#: fai-guide.txt:91 +msgid "" +"User visible changes::\n" +"https://fai-project.org/NEWS" +msgstr "" + +#: fai-guide.txt:94 +msgid "" +"Source tree via git::\n" +"git clone git://github.com/faiproject/fai.git" +msgstr "" + +#: fai-guide.txt:97 +msgid "" +"View source tree via https::\n" +"https://github.com/faiproject/fai" +msgstr "" + +#: fai-guide.txt:103 +msgid "" +"The man pages always include up-to-date information and a lot of\n" +"details of all FAI commands. So, don't forget to read them carefully.\n" +"Now read this manual, then enjoy the fully automatic installation and\n" +"your saved time." +msgstr "" + +#: fai-guide.txt:105 +msgid "=== [[motivation]]Motivation" +msgstr "" + +#: fai-guide.txt:109 +msgid "" +"Have you ever performed identical installations of an operating system\n" +"several times? Would you like to be able to install a Linux cluster\n" +"with dozens of nodes single handedly?" +msgstr "" + +#: fai-guide.txt:116 +msgid "" +"Repeating the same task again and again is boring -- and will surely\n" +"lead to errors. Also a whole lot of time could be saved if the\n" +"installations were done automatically. An installation process with\n" +"manual interaction does not scale. But clusters have the habit of\n" +"growing over the years. Think long-term rather than planning just a\n" +"few months into the future." +msgstr "" + +#: fai-guide.txt:142 +msgid "" +"In 1999, I had to perform an installation of a Linux cluster with one\n" +"server and 16 clients. Since I had much experience doing automatic\n" +"installations of Solaris operating systems on SUN SPARC hardware, the\n" +"idea to build an automatic installation for Debian was born. Solaris\n" +"has an automatic installation feature called JumpStart\n" +"footnote:[Solaris 8 Advanced Installation Guide at\n" +"https://docs.oracle.com/cd/E19455-01/806-0957/806-0957.pdf\n" +"]. In conjunction with the auto-install scripts\n" +"from Casper Dik\n" +"footnote:[http://www.science.uva.nl/pub/solaris/auto-install], I could\n" +"save a lot of time not only for every new SUN computer, but also for\n" +"re-installation of existing workstations. For example, I had to build\n" +"a temporary LAN with four SUN workstations for a conference, which\n" +"lasted only a few days. I took these workstations out of our normal\n" +"research network and set up a new installation for the conference.\n" +"When it was over, I simply integrated the workstations back into the\n" +"research network, rebooted just once, and after half an hour,\n" +"everything was up and running as before. The configuration of all\n" +"workstations was exactly the same as before the conference, because\n" +"everything was performed by the same installation process. I also used\n" +"the automatic installation for reinstalling a workstation after a\n" +"damaged hard disk had been replaced. It took two weeks until I\n" +"received the new hard disk but only a few minutes after the new disk\n" +"was installed, the workstation was running as before. And this is why\n" +"I choose to adapt this technique to a PC cluster running Linux." +msgstr "" + +#: fai-guide.txt:147 +msgid "=== [[work]]How does FAI work" +msgstr "" + +#: fai-guide.txt:159 +msgid "" +"The install client which will be installed using FAI, is booted via\n" +"network card or from CD or USB stick. It gets an IP address and boots\n" +"a Linux kernel which mounts its root file system via NFS (the nfsroot)\n" +"from the\n" +"install server. After the kernel is started, the FAI startup script\n" +"performs the automatic installation which doesn't need any\n" +"interaction. First, the hard disks will be partitioned, file systems\n" +"are created and then software packages are installed. After that, the\n" +"new installed operating system is configured to your local needs using\n" +"some scripts. Finally, the new operating system will be booted from the\n" +"local disk." +msgstr "" + +#: fai-guide.txt:166 +msgid "" +"The details of how to install the computer (the configuration) are\n" +"stored in the configuration space on the install server. Configuration\n" +"files are shared among groups of computers if they are similar using\n" +"the class concept. So you need not create a configuration for every\n" +"new host. Hence, FAI is a scalable method to install a big cluster\n" +"with a great number of nodes even if their configuration is not identical." +msgstr "" + +#: fai-guide.txt:173 +msgid "" +"FAI can also be used as a rescue system or for hardware inventory. You can " +"boot your\n" +"computer, but it will not perform an installation. Instead it will run\n" +"a fully functional Debian GNU/Linux without using the local hard\n" +"disks. Then you\n" +"can do a remote login and backup or restore a disk partition, check a\n" +"file system, inspect the hardware or do any other task." +msgstr "" + +#: fai-guide.txt:176 +msgid "=== [[features]]Features" +msgstr "" + +#: fai-guide.txt:199 +msgid "" +"* A fully automated installation can be performed.\n" +"* Very quick unattended installation.\n" +"* Flexible system through easy class concept.\n" +"* Update of running systems without re-installation.\n" +"* Cloud images for virtualization environment.\n" +"* Hosts can boot from network card, CD, USB stick.\n" +"* Simple creation of an installation or live ISO.\n" +"* PXE with DHCP boot method is supported.\n" +"* ReiserFS, ext3/ext4, btrfs and XFS file system support.\n" +"* Software RAID and LVM support. LUKS support.\n" +"* Automatic hardware detection.\n" +"* You can deploy Debian, Ubuntu, Rocky Linux, CentOS, AlmaLinux, SuSE\n" +"* Remote login via ssh during installation process possible.\n" +"* All similar configurations are shared among all install clients.\n" +"* Log files for all installations are saved to the installation server.\n" +"* Shell, Perl, Python, Ruby, expect and CFEngine scripts are supported " +"during the customization step.\n" +"* Support for many protocols like NFS, FTP, HTTPS, git.\n" +"* Can be used as a rescue system and for hardware inventory.\n" +"* Diskless client support.\n" +"* Cross-architecture support e.g. for embedded devices.\n" +"* Easily add your own functions via hooks or change the default behavior.\n" +"* Cloning machines using disk images is supported." +msgstr "" + +#: fai-guide.txt:202 +msgid "=== Installation times" +msgstr "" + +#: fai-guide.txt:206 +msgid "" +"The installation time is determined by the amount of software and\n" +"the speed of the hard disk. Here are some sample\n" +"times. All install clients had a 1Gbit network card installed." +msgstr "" + +#: fai-guide.txt:215 +msgid "" +"[width=\"80%\",cols=\"<4,^2,<3,>4,>2\",options=\"header\"]\n" +"|=================================================================\n" +"| CPU | RAM | Disk | Software installed | time\n" +"| i7-3770T 2.50GHz | 8GB| SSD | 6 GB software | 8.5 min\n" +"| Core-i7 3.2GHz | 6GB| SATA disk| 4.3GB software | 7 min\n" +"| Core-i7 3.2GHz | 6GB| SATA disk| 471 MB software | 77sec\n" +"| Intel Core2 Duo | 2GB| SATA disk| 3 GB software | 14 min\n" +"|=================================================================" +msgstr "" + +#: fai-guide.txt:220 +msgid "== [[impatient]]Quickstart - For the impatient user" +msgstr "" + +#: fai-guide.txt:222 +msgid "=== [[first]]My first installation" +msgstr "" + +#: fai-guide.txt:224 +msgid "" +"Without further ado, this section will provide a quick and easy " +"demonstration of a fully automatic installation using the FAI CD and a " +"virtual machine." +msgstr "" + +#: fai-guide.txt:228 +msgid "" +"Just download the CD ISO image from https://fai-project.org/fai-cd and boot\n" +"your VM using this CD. You will see a grub menu where you can select\n" +"from different installation types." +msgstr "" + +#: fai-guide.txt:233 +msgid "" +"This installation will run without an install server. The CD\n" +"installation is the same as when run in a network environment using\n" +"the FAI install server and can also be used from USB stick on a real\n" +"computer." +msgstr "" + +#: fai-guide.txt:237 +msgid "" +"You can also create yourself a custom fully automated installation\n" +"image on the webpage https://fai-project.org/FAIme without the need of\n" +"installing FAI on your computer." +msgstr "" + +#: fai-guide.txt:240 +msgid "=== [[cdserver]]My first server installation" +msgstr "" + +#: fai-guide.txt:243 +msgid "" +"We will create a private network and start two virtual machines. One\n" +"will become your own FAI server, the other will be an install client." +msgstr "" + +#: fai-guide.txt:251 +msgid "" +"If you intend to use VMware or VirtualBox, ensure that your client\n" +"uses a bridged network connection. A detailed description is in the\n" +"FAI wiki\n" +"footnote:[https://wiki.fai-project.org/index.php/" +"VirtualBox_for_your_first_FAI_installation]. Also,\n" +"it is not possible to use\n" +"bridged network interfaces over wireless, as most WiFi network cards\n" +"do not support this feature." +msgstr "" + +#: fai-guide.txt:254 +msgid "" +"When using Qemu/KVM and the `fai-kvm` wrapper you can create the\n" +"network using the command `fai-mk-network`. First install some packages" +msgstr "" + +#: fai-guide.txt:258 +msgid "" +"----\n" +"# apt-get install qemu-system-gui qemu-kvm qemu-utils\n" +"----" +msgstr "" + +#: fai-guide.txt:264 +msgid "" +"The next command sets up a private network with a software bridge with " +"several tap devices\n" +"that belong to the user ++.\n" +"----\n" +"fai-mk-network \n" +"----" +msgstr "" + +#: fai-guide.txt:272 +msgid "" +"After that, you can use fai-kvm (-h will give you some help) for\n" +"starting virtual machines using KVM that are connected to this private\n" +"network. Be careful. By default, fai-kvm will create the disk images\n" +"for the virtual machines in +/tmp+, which is a RAM disk on most\n" +"systems. It's no problem to create an empty 20G disk image in /tmp\n" +"(even if this partition is of 4GB size), but while the VM is writing\n" +"data to its disk, this will start to consume space in +/tmp+." +msgstr "" + +#: fai-guide.txt:279 +msgid "" +"Start the first virtual host, which will become the FAI server\n" +"footnote:[This installation will consume about 2GB of space in\n" +"+/tmp+.]:\n" +"----\n" +"fai-kvm -Vn -s20 -u 1 cd faicd64-small.iso\n" +"----" +msgstr "" + +#: fai-guide.txt:286 +msgid "" +"In the grub menu select +faiserver, using internal DHCP and a fixed IP+. " +"This will install a host called\n" +"faiserver with IP 192.168.33.250 which contains all software needed\n" +"for a FAI server. It will also set up a local package cache (using\n" +"apt-cacher-ng). Once the installation is finished, reboot the\n" +"machine. During the first boot of the new system, it will\n" +"automatically set up the nfsroot. This may take some minutes." +msgstr "" + +#: fai-guide.txt:291 +msgid "" +"After that you can start additional hosts using network boot. For\n" +"every new host, you have to use a different value for `-u`, which will be " +"used for\n" +"generating different MAC addresses and using different disk image file\n" +"names." +msgstr "" + +#: fai-guide.txt:295 +msgid "" +"----\n" +"fai-kvm -Vn -u 2 pxe\n" +"----" +msgstr "" + +#: fai-guide.txt:302 +msgid "" +"Those install clients will show you a menu, where you can select which\n" +"type of installation you like to perform. If the install client does\n" +"not find the server, it is usually because fai-monitor is no longer\n" +"running on it. This can happen, if you reboot the faiserver after the\n" +"installation. To remedy this, simply run fai-monitor on the faiserver\n" +"and re-attempt the client boot." +msgstr "" + +#: fai-guide.txt:307 +msgid "" +"Another client could be started with:\n" +"----\n" +"fai-kvm -Vn -u 3 pxe\n" +"----" +msgstr "" + +#: fai-guide.txt:311 +msgid "" +"You can start as many machines in the network as tap devices are\n" +"available. All these machines can connect to the outside internet but are\n" +"only reachable from your host machine." +msgstr "" + +#: fai-guide.txt:313 +msgid "== [[overview]]Overview and Concepts" +msgstr "" + +#: fai-guide.txt:326 +msgid "" +"FAI is a non-interactive system to install, customize and manage Linux\n" +"systems and software configurations on computers as well as virtual\n" +"machines and chroot environments, from small networks to large\n" +"infrastructures and clusters. You can take one or more virgin PCs,\n" +"turn on the power and after a few minutes Linux is installed,\n" +"configured and running on the whole cluster, without any interaction\n" +"necessary. Thus, it's a scalable method for installing and updating a\n" +"cluster unattended with little effort involved. FAI uses the\n" +"Linux operating system and a collection of shell and Perl scripts for\n" +"the installation process. Changes to the configuration files of the\n" +"operating system can be made by CFEngine, shell (bash and zsh), Perl,\n" +"Python, Ruby and expect scripts." +msgstr "" + +#: fai-guide.txt:335 +msgid "" +"FAI's target group are system administrators who have to install Linux\n" +"onto one or even hundreds of computers. Because it's a general purpose\n" +"installation tool, it can be used for installing a Beowulf cluster, a\n" +"rendering farm or a Linux laboratory or a classroom. Also large-scale\n" +"Linux networks with different hardware or different installation\n" +"requirements are easy to establish using FAI. But don't forget to plan\n" +"your installation. Chapter <> has some useful hints for this\n" +"topic." +msgstr "" + +#: fai-guide.txt:337 +msgid "=== [[terms]] Important Terms" +msgstr "" + +#: fai-guide.txt:339 +msgid "First, some terms used in this manual are described." +msgstr "" + +#: fai-guide.txt:344 +msgid "" +"install server::\n" +"It provides DHCP, TFTP and NFS services and the configuration data for\n" +"all install clients. In the examples of this manual this host is\n" +"called 'faiserver'. The host where the package 'fai-server' is installed." +msgstr "" + +#: fai-guide.txt:350 +msgid "" +"install client::\n" +"A host which will be installed using FAI and a configuration provided\n" +"by the install server. Also called client for short. In this manual,\n" +"the example hosts are called 'demohost, xfcehost, gnomehost ...'\n" +"This computer should boot from its network interface using PXE." +msgstr "" + +#: fai-guide.txt:356 +msgid "" +"configuration space::\n" +"A subdirectory structure containg several files. Those files describe\n" +"the details of how the installation of the clients will be\n" +"performed. All configuration data is stored here. It's also called\n" +"config space for short. It includes information about:" +msgstr "" + +#: fai-guide.txt:362 +msgid "" +"* Hard disk layout in a format similar to fstab\n" +"* Local file systems, their types, mount points and mount options\n" +"* Software packages\n" +"* Keyboard layout, time zone, Xorg configuration, remote file\n" +" systems, user accounts, printers ..." +msgstr "" + +#: fai-guide.txt:369 +msgid "" +"+\n" +"The package _fai-doc_ includes a sample configuration space including\n" +"examples for hosts using the XFCE and GNOME environment amongst other\n" +"examples. Calling `fai-mk-configspace` copies these examples to\n" +"'/srv/fai/config'. It's recommended to study those config files and\n" +"scripts for easier understanding how FAI works." +msgstr "" + +#: fai-guide.txt:376 +msgid "" +"nfsroot, NFS-Root::\n" +"A file system located on the install server. During the installation\n" +"process it's the complete file system for the install clients. All\n" +"clients share the same nfsroot, which they mount read only. The\n" +"nfsroot needs about {nfsrootsize}GB of free disk space." +msgstr "" + +#: fai-guide.txt:381 +msgid "" +"TFTP::\n" +"Serves clients the initrd and kernel that is used for the installation " +"process.\n" +"Along with the file system served by NFS, these two make up a temporary\n" +"OS in which the installations are performed." +msgstr "" + +#: fai-guide.txt:387 +msgid "" +"FAI classes::\n" +"Classes are names which determine which configuration file is\n" +"selected. If a client belongs to class WEBSERVER, it will be configured\n" +"as a webserver, the class DESKTOP for e.g. determines which software\n" +"packages will be installed." +msgstr "" + +#: fai-guide.txt:393 +msgid "" +"profile::\n" +"A FAI profile is just a list of FAI classes assiged to a profile name,\n" +"which is extended by a description of this profile. I.e. one could have\n" +"two \"Webserver\" profiles, one including the APACHE class another including " +"the NGINX class,\n" +"to then install the respective webserver solution." +msgstr "" + +#: fai-guide.txt:399 +msgid "" +"tasks::\n" +"The installation of a client consists of several parts, which are called " +"tasks.\n" +"Tasks are predefined subroutines which perform a certain part of the\n" +"FAI. The following FAI tasks are performed during an installation\n" +"on the install clients." +msgstr "" + +#: fai-guide.txt:422 +msgid "" +"____\n" +" confdir\t\t# get the config space\n" +" setup\t\t\t# some initialization, start sshd on demand\n" +" defclass\t\t# define FAI classes\n" +" defvar\t\t# define variables\n" +" action\t\t# evaluate FAI_ACTION\n" +" install\t\t# Start the installation\n" +" partition\t\t# partition the harddisks, create file systems\n" +" mountdisks\t\t# mount the file systems\n" +" extrbase\t\t# extract the base.tar.xz\n" +" debconf\t\t# do the Debian debconf preseeding\n" +" repository\t\t# prepare access to the package repository\n" +" updatebase\t\t# Set up package tools and update packages\n" +" instsoft\t\t# install software packages\n" +" configure\t\t# call customization scripts\n" +" finish\t\t# do some cleanup, show installation statistics\n" +" tests\t\t\t# call tests if defined\n" +" chboot\t\t# call fai-chboot on the install server\n" +" savelog\t\t# save log files to local and remote location\n" +" faiend\t\t# reboot host, eject CD if needed\n" +"____\n" +"____" +msgstr "" + +#: fai-guide.txt:424 +msgid "" +"These are tasks, which are only executed when a different action is performed" +msgstr "" + +#: fai-guide.txt:430 +msgid "" +" dirinstall \t # install a chroot environment\n" +" softupdate\t # only do the system configuration\n" +" sysinfo # print detailed system information\n" +" inventory # print short hardware inventory list\n" +"____" +msgstr "" + +#: fai-guide.txt:432 +msgid "For a more in-depth description of _tasks_ , see <>." +msgstr "" + +#: fai-guide.txt:435 +msgid "" +"Note that you are not limited to the FAI tasks. You can also define " +"additional programs or scripts which will be run\n" +"on particular occasions. They are called _hooks_." +msgstr "" + +#: fai-guide.txt:440 +msgid "" +"hooks::\n" +"Hooks are plugins, they can add additional functionality to the installation " +"process\n" +"or even replace entire tasks of FAI. Hooks are explained in detail in\n" +"<>." +msgstr "" + +#: fai-guide.txt:442 +msgid "=== [[classc]]The class concept" +msgstr "" + +#: fai-guide.txt:451 +msgid "" +"Classes are used in nearly all tasks of the installation. Classes\n" +"determine which configuration files to choose from a list of available\n" +"alternatives. To determine which config files to use, FAI searches the\n" +"list of defined classes and uses all configuration files that match a\n" +"class name footnote:[It's also possible to use only the configuration\n" +"file with the highest priority since the order of classes define a\n" +"priority from low to high within the list of classes. ]. The following loop " +"implements\n" +"this function in pseudo shell code:" +msgstr "" + +#: fai-guide.txt:460 +msgid "" +"----\n" +"for class in $all_classes; do\n" +" if [ -r $config_dir/$class ]; then # if a file with name $class " +"exists\n" +" your_command $config_dir/$class # call a command with this file " +"name\n" +" # exit if only the first matching file is needed\n" +" fi\n" +"done\n" +"----" +msgstr "" + +#: fai-guide.txt:464 +msgid "" +"The very nice feature of this is that you can add a new configuration\n" +"alternative and it will automatically be used by FAI without changing\n" +"the code, if the configuration file uses a class name." +msgstr "" + +#: fai-guide.txt:471 +msgid "" +"This is because the loop automatically detects new configuration files\n" +"that should be used.\n" +"The idea of using classes in general and using certain files matching\n" +"a class name for a configuration is adopted from the installation\n" +"scripts by Casper Dik for Solaris. This technique proved to be very\n" +"useful and easy." +msgstr "" + +#: fai-guide.txt:477 +msgid "" +"You can group multiple hosts that share the same configuration\n" +"files by using the same class. You can also split the whole\n" +"configuration data for all clients into several classes and use them\n" +"like lego bricks and build the entire configuration for a single\n" +"client by assembling the bricks together." +msgstr "" + +#: fai-guide.txt:482 +msgid "" +"If a client belongs to class _A_, we say the class _A_\n" +"is defined for this client. A class has no value, it is just defined or\n" +"undefined." +msgstr "" + +#: fai-guide.txt:488 +msgid "" +"Classes determine how the installation is performed. For example, an " +"install\n" +"client can be configured to get the XFCE desktop by just adding the\n" +"class _XFCE_ to it. Naturally, also more granular configurations are " +"possible. For instance, classes can describe how the hard disk should be " +"partitioned, they can\n" +"define which software packages will be installed, or which\n" +"customization steps are performed." +msgstr "" + +#: fai-guide.txt:494 +msgid "" +"Often, a client configuration is created by only changing or appending the\n" +"classes to which this client belongs, making the installation of a new\n" +"client very easy. Thus no additional information needs to be added to\n" +"the configuration space if the existing classes suffice for your\n" +"needs." +msgstr "" + +#: fai-guide.txt:496 +msgid "" +"As you can see, classes are a central pillar of customizing your " +"configuration space and with that your client installation. On how to define " +"your own classes, refer to <>." +msgstr "" + +#: fai-guide.txt:498 +msgid "== [[setup]]Setup your faiserver" +msgstr "" + +#: fai-guide.txt:501 +msgid "" +"Here's how to set up the install server in a few minutes. Following\n" +"steps are needed:" +msgstr "" + +#: fai-guide.txt:509 +msgid "" +". Set up the install server\n" +".. Install FAI packages\n" +".. Create the nfsroot\n" +".. Copy the examples to the config space\n" +".. Configure network daemons\n" +".. Create the PXELINUX configurations\n" +". Boot and install clients" +msgstr "" + +#: fai-guide.txt:512 +msgid "=== Install the FAI packages" +msgstr "" + +#: fai-guide.txt:516 +msgid "" +"* Install the key of the FAI project package repository.\n" +"* Add the URL of the package repository of the FAI project.\n" +"* Install the package 'fai-quickstart' on your install server." +msgstr "" + +#: fai-guide.txt:518 +msgid "Use these commands for installing:" +msgstr "" + +#: fai-guide.txt:523 +msgid "" +"----\n" +"# wget -O /etc/apt/trusted.gpg.d/fai-project.gpg https://fai-project.org/" +"download/2BF8D9FE074BCDE4.gpg\n" +"# echo \"deb http://fai-project.org/download bookworm koeln\" > /etc/apt/" +"sources.list.d/fai.list\n" +"----" +msgstr "" + +#: fai-guide.txt:525 +msgctxt "fai-guide.txt:525" +msgid "or" +msgstr "" + +#: fai-guide.txt:529 +msgid "" +"----\n" +"# apt install extrepo ; extrepo enable fai\n" +"----" +msgstr "" + +#: fai-guide.txt:535 +msgid "" +"and then\n" +"----\n" +"# apt-get update\n" +"# aptitude install fai-quickstart\n" +"----" +msgstr "" + +#: fai-guide.txt:537 +msgid "" +"This will also install the packages for DHCP, TFTP and NFS server daemons." +msgstr "" + +#: fai-guide.txt:539 +msgid "=== Create the nfsroot" +msgstr "" + +#: fai-guide.txt:547 +msgid "" +"* Also enable the package repository of the FAI project in a different\n" +" _sources.list_ file which is used when building the nfsroot. Then,\n" +" enable the log user for FAI.\n" +"----\n" +"# sed -i -e 's/^#deb/deb/' /etc/fai/apt/sources.list\n" +"# sed -i -e 's/#LOGUSER/LOGUSER/' /etc/fai/fai.conf\n" +"----" +msgstr "" + +#: fai-guide.txt:554 +msgid "" +"* By default, FAI uses http://deb.debian.org as package\n" +" mirror, which should attempt to find a fast package repository for you. " +"footnote:[If you want to use a faster mirror, adjust the URL\n" +" in _/etc/fai/apt/sources.list_ and +FAI_DEBOOTSTRAP+ in _/etc/fai/" +"nfsroot.conf_ before calling fai-setup.]\n" +"Now, we can run `fai-setup(8)` footnote:" +"[This will call `fai-make-nfsroot(8)` internally.]\n" +"and check if everything went well.\n" +"The log file is written to /var/log/fai/fai-setup.log." +msgstr "" + +#: fai-guide.txt:558 +msgid "" +"----\n" +"# fai-setup -v\n" +"----" +msgstr "" + +#: fai-guide.txt:563 +msgid "" +"* These are some of the lines you will see at the end of\n" +" _fai-setup_. A complete example of 'fai-setup.log' is available on\n" +" the FAI web page at https://fai-project.org/logs/fai-setup.log." +msgstr "" + +#: fai-guide.txt:579 +msgid "" +"----\n" +"FAI packages and related packages inside the nfsroot:\n" +"dracut 059-4\n" +"dracut-live 059-4\n" +"dracut-network 059-4\n" +"dracut-squash 059-4\n" +"fai-client 6.2\n" +"fai-nfsroot 6.2\n" +"fai-setup-storage 6.2\n" +"Waiting for background jobs to finish\n" +"fai-make-nfsroot finished properly.\n" +"Log file written to /var/log/fai/fai-make-nfsroot.log\n" +"Adding line to /etc/exports: /srv/fai/config 192.168.33.250/" +"24(async,ro,no_subtree_check)\n" +"Adding line to /etc/exports: /srv/fai/nfsroot 192.168.33.250/" +"24(async,ro,no_subtree_check,no_root_squash)\n" +"Reloading nfs-kernel-server configuration (via systemctl): nfs-kernel-" +"server.service." +msgstr "" + +#: fai-guide.txt:582 +msgid "" +"Your initial config space is now located in /srv/fai/config\n" +"Please don't forget to fill out the FAI questionnaire after you've finished " +"your project with FAI." +msgstr "" + +#: fai-guide.txt:586 +msgid "" +"FAI setup finished.\n" +"Log file written to /var/log/fai/fai-setup.log\n" +"----" +msgstr "" + +#: fai-guide.txt:591 +msgid "" +"* fai-setup has created the LOGUSER, the nfsroot and has added\n" +" additional lines to _/etc/exports_. The subdirectories added to\n" +" _/etc/exports_ are exported via NFS v3, so all install clients in the\n" +" same subnet can mount them via NFS." +msgstr "" + +#: fai-guide.txt:594 +msgid "=== Creating the configuration space" +msgstr "" + +#: fai-guide.txt:597 +msgid "" +"Install the simple examples into the configuration space\n" +"footnote:[These files need not belong to the root account.]." +msgstr "" + +#: fai-guide.txt:601 +msgid "" +"----\n" +"$ fai-mk-configspace\n" +"----" +msgstr "" + +#: fai-guide.txt:605 +msgid "" +"These examples contain configuration for some sample\n" +"hosts. Depending on the host name used, your computer will be\n" +"configured as follows:" +msgstr "" + +#: fai-guide.txt:610 +msgid "" +"demohost::\n" +"A machine which needs only a small hard disk. This machine is\n" +"configured with network as DHCP client, and an account demo is\n" +"created." +msgstr "" + +#: fai-guide.txt:613 +msgid "" +"xfcehost::\n" +"A XFCE desktop is installed, using LVM, and the account demo is created." +msgstr "" + +#: fai-guide.txt:616 +msgid "" +"gnomehost::\n" +"A GNOME desktop is installed, and the account demo is created." +msgstr "" + +#: fai-guide.txt:619 +msgid "" +"ubuntuhost::\n" +"A Ubuntu desktop will be installed, and the account demo is created." +msgstr "" + +#: fai-guide.txt:623 +msgid "" +"other host names::\n" +"Hosts with another host name will most notably use the classes FAIBASE,\n" +"DHCPC and GRUB." +msgstr "" + +#: fai-guide.txt:626 +msgid "" +"All hosts will have an account called _demo_ with password _fai_. The\n" +"root account also has the password _fai_." +msgstr "" + +#: fai-guide.txt:630 +msgid "" +"If the FAI flag +menu+ is added, instead of using the host name for\n" +"determing the type of installation, a menu is presented, and the user\n" +"can choose a profile for the installation." +msgstr "" + +#: fai-guide.txt:632 +msgid "=== Configure the network daemons" +msgstr "" + +#: fai-guide.txt:637 +msgid "" +"For booting the install client via PXE, the install server needs a DHCP and " +"a\n" +"TFTP daemon running. The package _fai-quickstart_ has already installed the\n" +"software packages for those daemons. Additionally the package of the NFS\n" +"server for exporting the nfsroot and the config space was installed." +msgstr "" + +#: fai-guide.txt:640 +msgid "==== [[bootdhcp]]Configuration of the DHCP daemon" +msgstr "" + +#: fai-guide.txt:645 +msgid "" +"Ideally, your faiserver should also be your DHCP server. If that is\n" +"not the case, instruct the admin responsible of the DHCP server to\n" +"configure it according to this section. Optionally, it is possible to\n" +"avoid that by using the <> feature released in FAI 5.0." +msgstr "" + +#: fai-guide.txt:649 +msgid "" +"An example for `dhcpd.conf(5)` is provided with the _fai-doc_\n" +"package. Start using this example and look at all options used therein." +msgstr "" + +#: fai-guide.txt:653 +msgid "" +"----\n" +"# cp /usr/share/doc/fai-doc/examples/etc/dhcpd.conf /etc/dhcp/\n" +"----" +msgstr "" + +#: fai-guide.txt:661 +msgid "" +"The only FAI specific information inside this configuration file is to\n" +"set +filename+ (DHCP option 67) to +fai/pxelinux.0+ and to set\n" +"+next-server+ (DHCP option 66, also called TFTP server name) and\n" +"+server-name+ to the name of your install server. All other\n" +"information is only network related data, which is used in almost all\n" +"DHCP configurations. Adjust these network parameters to your local\n" +"needs." +msgstr "" + +#: fai-guide.txt:666 +msgid "" +"----\n" +"deny unknown-clients;\n" +"option dhcp-max-message-size 2048;\n" +"use-host-decl-names on;" +msgstr "" + +#: fai-guide.txt:678 +msgid "" +"subnet 192.168.33.0 netmask 255.255.255.0 {\n" +" option routers 192.168.33.250;\n" +" option domain-name \"my.example\";\n" +" option domain-name-servers 192.168.33.250;\n" +" option time-servers faiserver;\n" +" option ntp-servers faiserver;\n" +" server-name faiserver;\n" +" next-server faiserver;\n" +" filename \"fai/pxelinux.0\";\n" +"}\n" +"----" +msgstr "" + +#: fai-guide.txt:681 +msgid "" +"If you make any changes to the DHCP configuration, you must\n" +"restart the daemon." +msgstr "" + +#: fai-guide.txt:685 +msgid "" +"----\n" +"# invoke-rc.d isc-dhcp-server restart\n" +"----" +msgstr "" + +#: fai-guide.txt:690 +msgid "" +"If you have multiple network interfaces, you\n" +"can define on which interface the server will listen in\n" +"_/etc/default/isc-dhcp-server_. By default, the DHCP daemon writes its\n" +"log messages to '/var/log/daemon.log'." +msgstr "" + +#: fai-guide.txt:693 +msgid "==== Adding a host entry to DHCP" +msgstr "" + +#: fai-guide.txt:701 +msgid "" +"The MAC address is given by the hardware of the network card. For each\n" +"install client you collect its MAC address and to map it to an IP address " +"and to a host\n" +"name. First, we add the IP address and the hostname to _/etc/hosts_\n" +"footnote:[You may also add this into your Domain Name System (DNS)].\n" +"----\n" +"192.168.33.100 demohost\n" +"----" +msgstr "" + +#: fai-guide.txt:708 +msgid "" +"The mapping from the MAC address to the IP address is done in the\n" +"_dhcpd.conf_ file. Here, we add a host entry using the command `dhcp-" +"edit(8)`.\n" +"Here you have to replace 01:02:03:AB:CD:EF ith the MAC you have found.\n" +"----\n" +"# dhcp-edit demohost 01:02:03:AB:CD:EF\n" +"----" +msgstr "" + +#: fai-guide.txt:714 +msgid "" +"After calling this command, this is what the host entry in\n" +"_dhcpd.conf_ will look like:\n" +"----\n" +"host demohost {hardware ethernet 01:02:03:AB:CD:EF;fixed-address demohost;}\n" +"----" +msgstr "" + +#: fai-guide.txt:717 +msgid "==== TFTP" +msgstr "" + +#: fai-guide.txt:721 +msgid "" +"Normally, you do not need any changes to the TFTP dameon\n" +"configuration. The files which are provided by TFTP are located in\n" +"_/srv/tftp/fai_." +msgstr "" + +#: fai-guide.txt:724 +msgid "==== NFS" +msgstr "" + +#: fai-guide.txt:728 +msgid "" +"The command `fai-setup` has already set up the NFS daemon and added\n" +"some lines to the configuration file _/etc/exports_.\n" +"It exports the directories using NFS v3." +msgstr "" + +#: fai-guide.txt:730 +msgid "=== Creating the PXELINUX configuration" +msgstr "" + +#: fai-guide.txt:738 +msgid "" +"The last step before booting your client for the first time\n" +"is to specify what configuration the client should boot when doing PXE\n" +"boot. We use the command `fai-chboot(8)` to create a pxelinux\n" +"configuration for each install client. This includes information about\n" +"the kernel, the initrd, the config space and some boot parameters. You\n" +"should read the manual page, which gives you some good examples.\n" +"Here's the command for starting the installation for the host demohost." +msgstr "" + +#: fai-guide.txt:741 +msgid "" +"----\n" +"$ fai-chboot -IFv -u nfs://faiserver/srv/fai/config demohost" +msgstr "" + +#: fai-guide.txt:745 +msgid "" +"Booting kernel vmlinuz-4.19.0-5-amd64\n" +" append initrd=initrd.img-4.19.0-5-amd64 ip=dhcp\n" +" FAI_FLAGS=verbose,sshd,createvt FAI_CONFIG_SRC=nfs://faiserver/srv/fai/" +"config" +msgstr "" + +#: fai-guide.txt:749 +msgid "" +"demohost has 192.168.33.100 in hex C0A82164\n" +"Writing file /srv/tftp/fai/pxelinux.cfg/C0A82164 for demohost\n" +"----" +msgstr "" + +#: fai-guide.txt:751 +msgid "" +"At this point, you should have a working faiserver setup and your clients " +"should boot into FAI and be able to install one of the examples." +msgstr "" + +#: fai-guide.txt:753 +msgid "" +"In the following section, you can read about planning your installation, " +"tailoring your configuration space to your particular needs and extending " +"FAI using hooks." +msgstr "" + +#: fai-guide.txt:755 +msgid "=== [[custom server]]Custom server" +msgstr "" + +#: fai-guide.txt:757 +msgid "" +"The faiserver and its setup is by no means static. It is possible to " +"customize and extend your server. For this, please refer to the " +"<> section in <>." +msgstr "" + +#: fai-guide.txt:759 +msgid "== [[plan]]Plan your installation" +msgstr "" + +#: fai-guide.txt:766 +msgid "" +"Before starting your installation, you should invest a lot of time into\n" +"planning your installation. Once you're happy with your installation\n" +"concept, FAI can do all the boring and repetitive tasks to turn your\n" +"plans into reality. FAI can't do good installations if your concept is\n" +"imperfect or lacks some important details. Start planning the\n" +"installation by answering the following questions:" +msgstr "" + +#: fai-guide.txt:780 +msgid "" +"* Will I create a Beowulf cluster, or do I have to install some desktop " +"machines?\n" +"* What does my LAN topology look like?\n" +"* Do I have uniform hardware? Will the hardware stay uniform in the future?" +"\n" +"* Does the hardware need a special kernel?\n" +"* How should the hosts be named?\n" +"* How should the local hard disks be partitioned?\n" +"* Which applications will be run by the users?\n" +"* Do the users need a queuing system?\n" +"* What software should be installed?\n" +"* Which daemons should be started, and what should the configuration for " +"these look like?\n" +"* Which remote file systems should be mounted?\n" +"* How should backups be performed?" +msgstr "" + +#: fai-guide.txt:788 +msgid "" +"You also have to think about user accounts, printers, a mail system,\n" +"cron jobs, graphic cards, dual boot, NIS, NTP, timezone, keyboard\n" +"layout, exporting and mounting directories via NFS and many other\n" +"things. So, there's a lot to do before starting an installation. And\n" +"remember that knowledge is power, and it's up to you to use\n" +"it. Installation and administration is a process, not a product. FAI\n" +"can't do things you don't tell it to do." +msgstr "" + +#: fai-guide.txt:794 +msgid "" +"You don't need to start from scratch. Look at the files and scripts in\n" +"the configuration space. There are a lot of things you can use for\n" +"your own installation. A good paper called \"Bootstrapping an\n" +"Infrastructure\" with more aspects of building an infrastructure is\n" +"available at http://www.infrastructures.org/papers/bootstrap/bootstrap.html" +msgstr "" + +#: fai-guide.txt:796 +msgid "=== [[c3]]The configuration space and its subdirectories" +msgstr "" + +#: fai-guide.txt:803 +msgid "" +"The configuration space is the collection of information about how exactly\n" +"to install a client. The central configuration space for all install\n" +"clients is located on the install server in '/srv/fai/config' and its\n" +"subdirectories. This will be mounted by the install clients to\n" +"'/var/lib/fai/config'. The main installation command `fai(8)` uses all\n" +"these subdirectories in the order listed except for hooks." +msgstr "" + +#: fai-guide.txt:807 +msgid "" +"_class/_::\n" +"Scripts and files to\n" +"define classes and variables." +msgstr "" + +#: fai-guide.txt:810 +msgid "" +"_disk_config/_::\n" +"Configuration files for disk partitioning, software RAID, LVM and file " +"system creation." +msgstr "" + +#: fai-guide.txt:833 +msgid "" +"_basefiles/_::\n" +"Normally the file 'base.tar.xz' (located inside the nfsroot) is extracted on " +"the install\n" +"client after the new file systems are created and before package are\n" +"installed. This is a minimal base image, created right after calling\n" +"debootstrap during the creation of the nfsroot on the install\n" +"server. If you want to install another distribution than the nfsroot\n" +"is, you can put a tar file into the subdirectory 'basefiles/' and name\n" +"it after a class. Then the command `ftar(8)` is used to extract the\n" +"tar file based on the classes defined. Thus the file has to be named " +"'CLASS.tar.xz' not 'CLASS.base.tar.xz'. This is done in task\n" +"_extrbase_. Use this if you want to install another distribution or\n" +"version than that running during the installation.\n" +"+\n" +"This basefile can also be received based on FAI classes via HTTP/HTTPS or " +"FTP\n" +"by defining the variable +FAI_BASEFILEURL+. FAI will download a file\n" +"CLASSNAME.tar.xz (or tgz, or tar.gz,...) from this URL, if +CLASSNAME+\n" +"matches a FAI class.\n" +"+\n" +"Example:\n" +"----\n" +"FAI_BASEFILEURL=https://fai-project.org/download/basefiles/\n" +"----\n" +"The folder must support directory listing. FAI will not probe for " +"potentially matching files." +msgstr "" + +#: fai-guide.txt:835 +msgid "See chapter <> for how to install different distributions." +msgstr "" + +#: fai-guide.txt:839 +msgid "" +"_debconf/_::\n" +"This directory holds all `debconf(7)` data. The format is the same\n" +"that is used by `debconf-set-selections(1)`." +msgstr "" + +#: fai-guide.txt:845 +msgid "" +"_package_config/_::\n" +"Files with class names contain lists of software packages to be\n" +"installed or removed by `install_packages(8)`. Files named\n" +"'.gpg' are added to the list of keys used by apt\n" +"for trusted package repositories." +msgstr "" + +#: fai-guide.txt:851 +msgid "" +"_pkgs/_::\n" +"This directory can contain subdirectories named by classes. You can\n" +"put '.deb' or '.rpm' files into these subdirectories. FAI will then\n" +"install these packages without the need of creating the metadata of a\n" +"package repository." +msgstr "" + +#: fai-guide.txt:854 +msgid "" +"_scripts/_::\n" +"Scripts for your local site customization. Used by `fai-do-scripts(1)`." +msgstr "" + +#: fai-guide.txt:865 +msgid "" +"_files/_::\n" +"Files used by customization scripts. Most files are located in a\n" +"subtree structure which reflects the ordinary directory tree. For\n" +"example, the templates for 'nsswitch.conf' are located in\n" +"'$FAI/files/etc/nsswitch.conf' and are named according to the classes\n" +"that they should match: '$FAI/files/etc/nsswitch.conf/NIS' is the\n" +"version of '/etc/nsswitch.conf' to use for the NIS class. Note that\n" +"the contents of the files directory are not automatically copied to\n" +"the target machine, rather they must be explicitly copied by\n" +"customization scripts using the `fcopy(8)` command." +msgstr "" + +#: fai-guide.txt:872 +msgid "" +"_hooks/_::\n" +"Hooks are user defined programs or scripts, which are called during\n" +"the installation process. They can extend or replace the default tasks.\n" +"The file name must be of format 'taskname.CLASSNAME[.sh]'.\n" +"A hook called +updatebase.DEBIAN+ is executed prior to the task `updatebase`" +"\n" +"and only if the install client belongs to the class DEBIAN." +msgstr "" + +#: fai-guide.txt:875 +msgid "=== [[defining classes]]Defining classes" +msgstr "" + +#: fai-guide.txt:877 +msgid "There are different possibilities to define classes:" +msgstr "" + +#: fai-guide.txt:881 +msgid "" +". Some default classes are defined for every host: DEFAULT, LAST and its " +"host name.\n" +". Classes may be listed within a file (by default in 'class/')\n" +". Classes may be dynamically defined by scripts." +msgstr "" + +#: fai-guide.txt:886 +msgid "" +"The last option is a very nice feature, since these scripts will\n" +"define classes in a very flexible way. For example, several classes\n" +"may be defined only if certain hardware is identified or a class is\n" +"defined depending on the network subnet information." +msgstr "" + +#: fai-guide.txt:890 +msgid "" +"All names of classes, except the host name, are written in\n" +"uppercase. They must not contain a hyphen, a hash, a semicolon or a\n" +"dot, but may contain underscores and digits." +msgstr "" + +#: fai-guide.txt:899 +msgid "" +"The task _defclass_ calls the command `fai-class(1)` to define\n" +"classes. All scripts matching _^[0-9][0-9]*_ (they start with two\n" +"digits) in the subdirectory\n" +"_$FAI/class_ are executed for defining classes. Everything that is printed\n" +"to STDOUT is automatically defined as a class. For more\n" +"information on defining class, read the manual pages for\n" +"`fai-class(1)`. The script _50-host-classes_ (see below a stripped\n" +"version) is used to define classes depending on the host name." +msgstr "" + +#: fai-guide.txt:915 +msgid "" +"----\n" +"# use a list of classes for our demo machines\n" +"case $HOSTNAME in\n" +" demohost)\n" +" echo \"FAIBASE GRUB DEMO\" ;;\n" +" xfcehost)\n" +" echo \"FAIBASE GRUB DEMO XORG XFCE LVM\";;\n" +" faiserver)\n" +" echo \"FAIBASE DEBIAN DEMO FAISERVER\" ;;\n" +" ubuntuhost)\n" +" echo \"FAIBASE DEBIAN DEMO UBUNTU JAMMY JAMMY64 XORG\";;\n" +" *)\n" +" echo \"FAIBASE DEBIAN DEMO\" ;;\n" +"esac\n" +"----" +msgstr "" + +#: fai-guide.txt:921 +msgid "" +"Host names should rarely be used for the configuration files in the\n" +"configuration space. Instead, a class should be defined and then added\n" +"for a given host. This is because most of the time the configuration\n" +"data is not specific for one host, but can be shared among several\n" +"hosts." +msgstr "" + +#: fai-guide.txt:924 +msgid "" +"The order of the classes is important because it defines the priority\n" +"of the classes from low to high." +msgstr "" + +#: fai-guide.txt:926 +msgid "=== [[classvariables]]Defining variables" +msgstr "" + +#: fai-guide.txt:932 +msgid "" +"The task _defvar_ defines the variables for the install\n" +"client. Variables are defined by scripts in _class/*.var_. All global\n" +"variables can be set in 'DEFAULT.var'. For groups of hosts use\n" +"a class file. For a single host use the file +$HOSTNAME+ _.var_. Also\n" +"here, it's useful to study all the examples." +msgstr "" + +#: fai-guide.txt:935 +msgid "" +"The following variables are used in the examples and may also be\n" +"useful for your installation:" +msgstr "" + +#: fai-guide.txt:940 +msgid "" +"FAI_ACTION::\n" +"Set the action FAI should perform. Normally this is done by\n" +"`fai-chboot(8)`. If you can't use this command, define this variable\n" +"i.e. in the script 'LAST.var'." +msgstr "" + +#: fai-guide.txt:944 +msgid "" +"FAI_ALLOW_UNSIGNED::\n" +"If set to 1, FAI allows the installation of packages from unsigned\n" +"repositories." +msgstr "" + +#: fai-guide.txt:947 +msgid "" +"CONSOLEFONT::\n" +"Is the font which is loaded during installation by `setfont(8)`." +msgstr "" + +#: fai-guide.txt:952 +msgid "" +"KEYMAP::\n" +"Defines the keyboard map files in '/usr/share/keymaps' and\n" +"'$FAI/files'. You don't need to specify the full path, since this file\n" +"will be located automatically." +msgstr "" + +#: fai-guide.txt:961 +msgid "" +"ROOTPW::\n" +"The encrypted root password for the new system. You can use\n" +"`crypt(3)`, md5 and other hash types for the password. Use\n" +"`mkpasswd(1)` for creating the hash for a certain password.\n" +"For example, to generate a md5 hash for the password use\n" +"----\n" +"$ echo \"yoursecrectpassword\" | mkpasswd -m yescrypt -s\n" +"----" +msgstr "" + +#: fai-guide.txt:966 +msgid "" +"UTC::\n" +"Set hardware clock to UTC if _UTC=yes_. Otherwise set clock to local\n" +"time. See `clock(8)` for more information." +msgstr "" + +#: fai-guide.txt:970 +msgid "" +"TIMEZONE::\n" +"Is the file relative to '/usr/share/zoneinfo/' which indicates your\n" +"time zone. E.g.: _TIMEZONE=Europe/Berlin_." +msgstr "" + +#: fai-guide.txt:975 +msgid "" +"MODULESLIST::\n" +"A list of kernel modules which are loaded during boot of the new system (" +"written to\n" +"/etc/modules)." +msgstr "" + +#: fai-guide.txt:978 +msgid "=== [[diskconfig]]Hard disk configuration" +msgstr "" + +#: fai-guide.txt:986 +msgid "" +"The tool `setup-storage(8)` reads a file in '$FAI/disk_config' for the\n" +"disk configuration. This file describes how\n" +"all the local disks will be partitioned, which file system types should be\n" +"created (like ext3/4, xfs, btrfs), and where they are\n" +"mounted to. You can also create software RAID and LVM setups using this\n" +"config file. It's also possible to preserve the disk layout or to\n" +"preserve the data on certain partitions." +msgstr "" + +#: fai-guide.txt:992 +msgid "" +"During the installation process all local file systems are mounted\n" +"relative to '/target'. For example if you specify the mount point\n" +"'/home' in a disk configuration file this will be the directory\n" +"'/target/home' during the installation process and will become '/home'\n" +"for the new installed system." +msgstr "" + +#: fai-guide.txt:994 +msgid "=== [[extrbase]]Extract base file" +msgstr "" + +#: fai-guide.txt:997 +msgid "" +"A base file is only needed when installing a distribution which is\n" +"different from the one in the nfsroot." +msgstr "" + +#: fai-guide.txt:999 +msgid "=== [[debconf]]Debconf preseeding" +msgstr "" + +#: fai-guide.txt:1001 +msgid "You can use the format described in `debconf-set-selections(1)`." +msgstr "" + +#: fai-guide.txt:1003 +msgid "=== [[repository]]Access to the package repository" +msgstr "" + +#: fai-guide.txt:1006 +msgid "" +"FAI supports http, https and NFS for accessing the package mirror. Set\n" +"the variable '$FAI_DEBMIRROR' for using NFS." +msgstr "" + +#: fai-guide.txt:1009 +msgid "=== [[packageconfig]]Software package configuration" +msgstr "" + +#: fai-guide.txt:1015 +msgid "" +"Before installing packages, FAI will add the content of all files\n" +"named _package_config/class.gpg_ to the list of apt keys. If your local\n" +"repository is signed by your keyid AB12CD34 you can easily add this key,\n" +"so FAI will use it during installation. Use this command for creating\n" +"the 'CLASS.gpg' file:" +msgstr "" + +#: fai-guide.txt:1019 +msgid "" +"----\n" +"faiserver$ gpg --export AB12CD34 > /srv/fai/config/package_config/MYCLASS." +"gpg\n" +"----" +msgstr "" + +#: fai-guide.txt:1024 +msgid "" +"The script `install_packages(8)` installs the selected software\n" +"packages. It reads all configuration files in '$FAI/package_config'\n" +"whose file name matches a defined class. The syntax is very simple." +msgstr "" + +#: fai-guide.txt:1027 +msgid "" +"----\n" +"# an example package class" +msgstr "" + +#: fai-guide.txt:1030 +msgid "" +"PACKAGES taskinst\n" +"german" +msgstr "" + +#: fai-guide.txt:1034 +msgid "" +"PACKAGES install-norec\n" +"adduser nmap\n" +"less zstd" +msgstr "" + +#: fai-guide.txt:1037 +msgid "" +"PACKAGES remove\n" +"gpm xdm" +msgstr "" + +#: fai-guide.txt:1041 +msgid "" +"PACKAGES install GRUB_PC\n" +"grub-pc\n" +"----" +msgstr "" + +#: fai-guide.txt:1050 +msgid "" +"Comments are starting with a hash (#) and are ending at the end of the\n" +"line. Every package command begins with the word _PACKAGES_ followed by a\n" +"command name, which maps to a different package tool like apt-get,\n" +"aptitude or dnf for e.g. The command defines which command will be used to\n" +"install the packages named after this command. The list of all\n" +"available commands can be listed using _install_packages -H_.\n" +"Supported package tools are: _apt, apt-get, aptitude, smart, yast,\n" +"dnf, rpm, zypper_" +msgstr "" + +#: fai-guide.txt:1054 +msgid "" +"hold::\n" +"Put a package on hold. This package will not be handled by dpkg, e.g\n" +"not upgraded." +msgstr "" + +#: fai-guide.txt:1062 +msgid "" +"install::\n" +"Install all packages (using `apt-get`) that are specified in the following " +"lines. If a\n" +"hyphen is appended to the package name (with no intervening space),\n" +"the package will be removed, not installed. All package names are\n" +"checked for misspellings. Any package which does not exist, will be\n" +"removed from the list of packages to install. So be careful not to\n" +"misspell any package names." +msgstr "" + +#: fai-guide.txt:1065 +msgid "" +"install-norec::\n" +"Like install but without installing the recommended packages." +msgstr "" + +#: fai-guide.txt:1069 +msgid "" +"remove::\n" +"Remove all packages that are specified in the following lines. Append\n" +"a + to the package name if the package should be installed." +msgstr "" + +#: fai-guide.txt:1074 +msgid "" +"taskinst::\n" +"Install all packages belonging to the tasks that are specified in the\n" +"following lines using `tasksel(1)`. You can also use _aptitude_ for\n" +"installing tasks." +msgstr "" + +#: fai-guide.txt:1079 +msgid "" +"aptitude::\n" +"Install all packages with the command `aptitude`. This will be the\n" +"default in the future and may replace apt-get and taskinst. Aptitude\n" +"can also install task packages." +msgstr "" + +#: fai-guide.txt:1082 +msgid "" +"aptitude-r::\n" +"Same as aptitude with option _--with-recommends_." +msgstr "" + +#: fai-guide.txt:1085 +msgid "" +"unpack::\n" +"Download package and unpack only. Do not configure the package." +msgstr "" + +#: fai-guide.txt:1094 +msgid "" +"dselect-upgrade::\n" +"Set package selections using the following lines and install or remove\n" +"the packages specified. These lines are the output of the command\n" +"_dpkg --get-selections_. It's not recommended to use this format,\n" +"since you are also specifying all packages which are only installed\n" +"because of a dependency or a recommends. It's better just to specify\n" +"the pacakge you like to have, and to let FAI (and apt-get) resolve the\n" +"dependencies." +msgstr "" + +#: fai-guide.txt:1105 +msgid "" +"Multiple lines with lists of space separated names of packages follow\n" +"the PACKAGES lines. All dependencies are resolved. Packages with\n" +"suffix _-_ (eg. _lilo-_) will be removed instead of installed. The\n" +"order of the packages doesn't matter. If you like to install\n" +"packages from another release than the default, you can append the\n" +"release name to the package name like in\n" +"_openoffice.org/etch-backports_. You can also specify a certain\n" +"version like _apt=0.3.1_. More information on these features are\n" +"described in `aptitude(8)`." +msgstr "" + +#: fai-guide.txt:1109 +msgid "" +"You can specify additional parameters for the package manager adding\n" +"_key=value_ after _PACKAGES _. Currently we support\n" +"_release=_ which will add _-t _ when installing packages." +msgstr "" + +#: fai-guide.txt:1115 +msgid "" +"Example:\n" +"----\n" +"PACKAGES install-norec release=testing\n" +"nvidia-smi\n" +"----" +msgstr "" + +#: fai-guide.txt:1120 +msgid "" +"This will install the nvidia-smi package from the testing release,\n" +"including the dependencies. Don't forget to add an entry into\n" +"'sources.list'. You may also want to adjust the apt pinning (see\n" +"'apt_references(5)')." +msgstr "" + +#: fai-guide.txt:1129 +msgid "" +"A line which contains the _PRELOADRM_ commands, downloads a file using\n" +"`wget(1)` into a directory before installing the packages. Using the\n" +"_file:_ URL, this file is copied from +$FAI_ROOT+ to the download\n" +"directory. For example the package `realplayer` needs an archive to\n" +"install the software, so this archive is downloaded to the directory\n" +"'/root'. After installing the packages this file will be removed. If\n" +"the file shouldn't be removed, use the command _PRELOAD_ instead." +msgstr "" + +#: fai-guide.txt:1135 +msgid "" +"You can add an arbitrary boolean expression using FAI classes to\n" +"define when the list of packages should be installed. Here, the\n" +"packages are only installed if the class XORG is defined but the class\n" +"MINT is not defined." +msgstr "" + +#: fai-guide.txt:1142 +msgid "" +"Example:\n" +"----\n" +"PACKAGES install UBUNTU && XORG && ! MINT\n" +"ubuntu-standard\n" +"ubuntu-desktop\n" +"----" +msgstr "" + +#: fai-guide.txt:1148 +msgid "" +"The old way of adding some logic in the PACKAGES lines is still supported:\n" +"It's possible to append a list of class names after the command for\n" +"apt-get. So this _PACKAGES_ command will only be executed when at least\n" +"one of the corresponding classes is defined (logical OR). So you can\n" +"combine many small files into the file DEFAULT." +msgstr "" + +#: fai-guide.txt:1157 +msgid "" +"If you want to remove a package name from a certain class was part of\n" +"this class before, you should not remove the package name from the\n" +"class file, but instead append a dash (-) to it. This will make sure\n" +"that the package is removed during a softupdate on hosts which were\n" +"installed using the old class definition which included this package\n" +"name." +msgstr "" + +#: fai-guide.txt:1160 +msgid "" +"If you specify a package that does not exist this package will be\n" +"removed automatically from the installation list only if the command " +"_install_ is used." +msgstr "" + +#: fai-guide.txt:1169 +msgid "" +"The concept of classes priority allows a higher priority class (one\n" +"that comes later in the sequence of classes) to override the selection\n" +"of packages of a lower priority class. For this to work correctly,\n" +"the higher priority class must use the same _PACKAGES_ command (e.g.\n" +"_PACKAGES install-norec_ instead of just _PACKAGES install_) as the one\n" +"used by the class it is trying to override. This is useful to suppress\n" +"installation of a package, for example, to avoid installing the 'linuxlogo'\n" +"package installed by class FAIBASE:" +msgstr "" + +#: fai-guide.txt:1179 +msgid "" +"----\n" +"# example of how to override:\n" +"#\n" +"# On FAIBASE we have:\n" +"# PACKAGES install-norec\n" +"# linuxlogo\n" +"#\n" +"# We want to _not_ install linuxlogo, and it is in a\n" +"# install-norec section, so we must also use install-norec." +msgstr "" + +#: fai-guide.txt:1183 +msgid "" +"PACKAGES install-norec\n" +"linuxlogo-\n" +"----" +msgstr "" + +#: fai-guide.txt:1185 +msgid "=== [[cscripts]] Customization scripts" +msgstr "" + +#: fai-guide.txt:1191 +msgid "" +"The command `fai-do-scripts(1)` is called to execute all scripts in\n" +"this directory. If a directory with a class name exists, all scripts\n" +"matching '^[0-9][0-9]*' are executed in alphabetical order. So it's\n" +"possible to use scripts of different languages (shell, cfengine,\n" +"Perl, Python, Ruby, expect,..) for one class." +msgstr "" + +#: fai-guide.txt:1194 +msgid "" +"Thoses scripts write their output to sripts.log. The file status.log\n" +"contains the names of all scripts executed and their exit status." +msgstr "" + +#: fai-guide.txt:1196 +msgid "==== [[shell]]Shell scripts" +msgstr "" + +#: fai-guide.txt:1202 +msgid "" +"Most scripts are Bourne shell scripts. Shell scripts are useful if the\n" +"configuration task only needs to call some shell commands or create a\n" +"file from scratch. In order not to write many short scripts, it's\n" +"possible to use the `ifclass` command for testing if certain classes\n" +"are defined." +msgstr "" + +#: fai-guide.txt:1206 +msgid "" +"----\n" +"ifclass -o A B C\n" +"----" +msgstr "" + +#: fai-guide.txt:1210 +msgid "" +"checks if one of classes A, B or C are defined. Using -a (logical\n" +"AND) checks if all classes of a list are defined. The command 'ifclass\n" +"C' checks if only class C is defined." +msgstr "" + +#: fai-guide.txt:1215 +msgid "" +"For copying files with classes, use the command\n" +"`fcopy(8)`. If you want to extract an archive using classes, use\n" +"`ftar(8)`. For appending lines to a configuration file use `ainsl(1)`\n" +"instead of just +echo string >> filename+." +msgstr "" + +#: fai-guide.txt:1220 +msgid "" +"FAI also supports 'zsh(1)' scripts during the\n" +"customization task. Within scripts, the variable +$classes+ holds a space\n" +"separated list with the names of all defined classes." +msgstr "" + +#: fai-guide.txt:1222 +msgid "==== [[cfengine]]Cfengine scripts" +msgstr "" + +#: fai-guide.txt:1228 +msgid "" +"CFEngine has a rich set of functions to edit existing configuration\n" +"files, e.g _LocateLineMatching, ReplaceAll, InsertLine,\n" +"AppendIfNoSuchLine, HashCommentLinesContaining_. But it can't handle\n" +"variables which are undefined. If a variable is undefined, the whole\n" +"cfengine script will abort." +msgstr "" + +#: fai-guide.txt:1231 +msgid "" +"More information can be found in the manual page `cfengine(8)` or at\n" +"the cfengine homepage https://www.cfengine.com." +msgstr "" + +#: fai-guide.txt:1234 +msgid "=== [[hooks]]Hooks" +msgstr "" + +#: fai-guide.txt:1247 +msgid "" +"Hooks let you specify functions or programs which are run at certain\n" +"steps of the installation process. Before a task is called,\n" +"FAI searches for existing hooks for this task and executes them. As\n" +"you might expect, classes are also used when calling hooks. Hooks are\n" +"executed for every defined class. You only have to create the hook\n" +"with the name for the desired class and it will be used. If several\n" +"hooks for a task exists, they are called in the order defined by the\n" +"classes. If _debug_ is included in +$FAI_FLAG+ the option _-d_ is\n" +"passed to all hooks, so you can debug your own hooks. If some default\n" +"tasks should be skipped, use the subroutine _skiptask_ and a list of\n" +"default tasks as parameters. In the examples provided, the hooks of\n" +"the class CENTOS skips some Debian specific tasks." +msgstr "" + +#: fai-guide.txt:1254 +msgid "" +"The directory '$FAI/hooks/' contains all hooks. A hook is an executable\n" +"file following the naming scheme 'taskname.CLASSNAME[.sh]' (e.g.\n" +"'repository.CENTOS' or 'savelog.LAST.sh). The\n" +"task name specifies which task to precede executing this hook, if the\n" +"specified class is defined for the installing client. See section\n" +"<> for a complete list of default tasks that can be used." +msgstr "" + +#: fai-guide.txt:1261 +msgid "" +"A hook of the form _hookprefix.classname_ can't define variables for\n" +"the installation script, because it's a subprocess. But you can use\n" +"any binary executable or any script you wrote. Hooks that have the\n" +"suffix _.sh_ (e.g. 'partition.DEFAULT.sh') must be Bourne\n" +"shell scripts and are sourced. So it's possible to redefine variables\n" +"for the installation scripts." +msgstr "" + +#: fai-guide.txt:1267 +msgid "" +"In the first part of FAI, all hooks with prefix _confdir_ are called.\n" +"Those hooks can not be located in the config space, since it's not yet\n" +"available. Therefore these hooks are the only hooks located in\n" +"+$nfsroot+'/$FAI/hooks' on the install server. All other hooks are\n" +"found in '$FAI_CONFIGDIR/hooks' on the install server." +msgstr "" + +#: fai-guide.txt:1273 +msgid "" +"All hooks that are called before classes are defined can only use the\n" +"following classes: _DEFAULT $HOSTNAME LAST_. If a hook for class\n" +"_DEFAULT_ should only be called if no hook for class +$HOSTNAME+ is\n" +"available, insert these lines to the default hook:" +msgstr "" + +#: fai-guide.txt:1276 +msgid "" +"----\n" +"hookexample.DEFAULT:" +msgstr "" + +#: fai-guide.txt:1278 +msgid "#! /bin/sh" +msgstr "" + +#: fai-guide.txt:1286 +msgid "" +"# skip DEFAULT hook if a hook for $HOSTNAME exists\n" +"scriptname=$(basename $0 .DEFAULT)\n" +"[-f $FAI/hooks/$scriptname.$HOSTNAME ] && exit\n" +"# here follows the actions for class DEFAULT\n" +".\n" +".\n" +"----" +msgstr "" + +#: fai-guide.txt:1288 +msgid "Some examples for what hooks could be used:" +msgstr "" + +#: fai-guide.txt:1290 +msgid "- Load kernel modules before classes are defined in '$FAI/class'." +msgstr "" + +#: fai-guide.txt:1292 +msgid "- Send an email to the administrator if the installation is finished." +msgstr "" + +#: fai-guide.txt:1294 +msgid "- Install a diskless client and skip local disk partitioning." +msgstr "" + +#: fai-guide.txt:1296 +msgid "" +"- Have a look at +hooks/debconf.IMAGE+ for how to clone a machine using a " +"file system image." +msgstr "" + +#: fai-guide.txt:1298 +msgid "=== [[faiflags]]FAI flags" +msgstr "" + +#: fai-guide.txt:1302 +msgid "" +"The variable +$FAI_FLAGS+ contains a space separated list of\n" +"flags. Flags are normally defined in the pxelinux.cfg file which\n" +"should be created by 'fai-chboot(1)'. The following flags are known:" +msgstr "" + +#: fai-guide.txt:1307 +msgid "" +"verbose::\n" +"Create verbose output during installation. This should always be the\n" +"first flag, so consecutive definitions of flags will be verbosely\n" +"displayed." +msgstr "" + +#: fai-guide.txt:1314 +msgid "" +"debug::\n" +"Create debug output. No unattended installation is performed. During\n" +"package installation you have to answer all questions of the\n" +"postinstall scripts on the client's console. A lot of debug\n" +"information will be printed out. This flag is only useful for FAI\n" +"developers." +msgstr "" + +#: fai-guide.txt:1321 +msgid "" +"sshd::\n" +"Start the ssh daemon to enable remote logins.\n" +"You can then log in as _root_ to all install clients during the\n" +"installation. The default password is _fai_ and can be changed by\n" +"setting `FAI_ROOTPW` in `nfsroot.conf(5)`. To log in from your server\n" +"to the install client (named demohost in this example) use:" +msgstr "" + +#: fai-guide.txt:1327 +msgid "" +"----\n" +"$ ssh root@demohost\n" +"Warning: Permanently added 'demohost,192.168.33.100' to the list of known " +"hosts.\n" +"root@demohost's password:\n" +"----" +msgstr "" + +#: fai-guide.txt:1331 +msgid "" +"This is only the root password during the\n" +"installation process, not for the new installed system. You can also\n" +"log in without a password when using +$SSH_IDENTITY+." +msgstr "" + +#: fai-guide.txt:1340 +msgid "" +"createvt::\n" +"Create two virtual terminals and execute a bash if _ctrl-c_ is typed\n" +"in the console terminal. The additional terminals can be accessed by\n" +"typing _Alt-F2_ or _Alt-F3_. Otherwise, no terminals are available and\n" +"typing _ctrl-c_ will reboot the install client. Setting this flag is\n" +"useful for debugging. If you want an installation which should not be\n" +"interruptible, do not set this flag." +msgstr "" + +#: fai-guide.txt:1344 +msgid "" +"menu::\n" +"This enables a user menu for selecting a profile. All files\n" +"+class/*.profile+ are read and a curses based menu will be created." +msgstr "" + +#: fai-guide.txt:1351 +msgid "" +"screen::\n" +"Run FAI inside a `screen(1)` session. The session is called FAI.\n" +"If you log in via ssh from remote you can attach to the session using:\n" +"----\n" +"$ screen -x\n" +"----" +msgstr "" + +#: fai-guide.txt:1358 +msgid "" +"tmux::\n" +"Run FAI inside a `tmux(1)` session. The session is called FAI.\n" +"If you log in via ssh from remote you can attach to the session using:\n" +"----\n" +"$ tmux attach\n" +"----" +msgstr "" + +#: fai-guide.txt:1365 +msgid "" +"reboot::\n" +"Reboot the install client after installation is finished without\n" +"typing RETURN on the console. If this flag is not set, and error.log\n" +"contains anything, the install client will stop and wait that you\n" +"press RETURN. If no errors occurred, the client will always reboot\n" +"automatically." +msgstr "" + +#: fai-guide.txt:1369 +msgid "" +"halt::\n" +"Halt the install client at the end of the installation, instead of\n" +"rebooting into the new system." +msgstr "" + +#: fai-guide.txt:1374 +msgid "" +"initial::\n" +"Used by `setup-storage(8)`. Partitions marked with +preserve_reinstall+\n" +"are preserved unless this flag is set. Often, this flag is set in a\n" +"file 'class/*.var' by using setting 'flag_initial=1'." +msgstr "" + +#: fai-guide.txt:1376 +msgid "== [[install]] FAI installs your plan" +msgstr "" + +#: fai-guide.txt:1378 +msgid "=== The early part of an installation" +msgstr "" + +#: fai-guide.txt:1386 +msgid "" +"After the kernel has booted, it mounts the root file system via NFS\n" +"from the install server and starts the script\n" +"'/usr/sbin/fai' footnote:[Since the root file system on the clients is " +"mounted via\n" +"NFS, `fai` is located in\n" +"'/srv/fai/nfsroot/usr/sbin' on the install\n" +"server.]. This script controls the sequence of the\n" +"installation. No other scripts in '/etc/init.d/' are used." +msgstr "" + +#: fai-guide.txt:1391 +msgid "" +"The configuration space is made available via the configured method\n" +"(an NFS mount by default) from the install server to the path defined\n" +"in '$FAI' footnote:['$FAI' is an internal variable used by the FAI\n" +"scripts. By default the path is _/var/lib/fai/config_.]" +msgstr "" + +#: fai-guide.txt:1394 +msgid "=== [[bootmesg]]Boot messages" +msgstr "" + +#: fai-guide.txt:1398 +msgid "" +"When booting the install client from network card with PXE you will see " +"some\n" +"messages like this:\n" +"include::includes/bootexample.txt[]" +msgstr "" + +#: fai-guide.txt:1405 +msgid "" +"At this point the install client has successfully received the network\n" +"config via DHCP and the kernel and initrd via TFTP. It now boots the\n" +"Linux kernel and the initrd. If everything went right, the initrd\n" +"mounts the nfsroot footnote:['/srv/fai/nfsroot' from the install\n" +"server via NFS] and the FAI scripts are started. The first\n" +"thing you see is the red FAI copyright message." +msgstr "" + +#: fai-guide.txt:1407 +msgid "include::includes/fai-1st-part.txt[]" +msgstr "" + +#: fai-guide.txt:1410 +msgid "" +"You can also see the list of FAI classes, that are defined for this\n" +"host. This list is very important for the rest of the installation." +msgstr "" + +#: fai-guide.txt:1414 +msgid "" +"The first task is called _confdir_, which is responsible for getting\n" +"access to the config space. Here, we use an NFS mount from the install\n" +"server as you can see on the console (and later in the logs)." +msgstr "" + +#: fai-guide.txt:1419 +msgid "" +"----\n" +"FAI_CONFIG_SRC is set to nfs://faiserver/srv/fai/config\n" +"Configuration space faiserver:/srv/fai/config mounted to /var/lib/fai/" +"config\n" +"----" +msgstr "" + +#: fai-guide.txt:1424 +msgid "" +"Before the installation is started (+$FAI_ACTION=install+) the computer\n" +"beeps three times. So, be careful when you hear three beeps but you do\n" +"not want to perform an installation and let FAI erase all yout data on\n" +"the local disk!" +msgstr "" + +#: fai-guide.txt:1427 +msgid "=== [[reboot]]Rebooting the computer into the new system" +msgstr "" + +#: fai-guide.txt:1433 +msgid "" +"For rebooting the computer during or at the end of the installation you\n" +"should use the command `faireboot` in favour of the normal reboot command.\n" +"Use `faireboot` also if logged in from remote. If the installation\n" +"hasn't finished, use _faireboot -s_, so the log files are also copied\n" +"to the install server." +msgstr "" + +#: fai-guide.txt:1436 +msgid "" +"If the installation has finished successfully, the computer should boot a\n" +"small Debian system. You can login as user _demo_ or _root_ with password " +"_fai_." +msgstr "" + +#: fai-guide.txt:1438 +msgid "=== [[isetup]]Starting FAI (task confdir)" +msgstr "" + +#: fai-guide.txt:1445 +msgid "" +"After the install client has booted only the script '/usr/sbin/fai' is\n" +"executed. It will do some minimal initialization. The variable\n" +"+$FAI_CONFIG_SRC+ footnote:[It is defined on the kernel command line]\n" +"is used to get access to the FAI configuration space which is then\n" +"available in the directory +$FAI+ footnote:[/var/lib/fai/config]. FAI\n" +"will not proceed without the config space." +msgstr "" + +#: fai-guide.txt:1449 +msgid "" +"You can access the config space using different methods. Supported\n" +"methods are: nfs:, file:, cvs:, svn: git:, hg:, http: and detect:.\n" +"See `fai.conf(5)` for a detailed description of these methods." +msgstr "" + +#: fai-guide.txt:1452 +msgid "" +"=== [[iclass]]Defining classes and variables (tasks defclass and defvar)" +msgstr "" + +#: fai-guide.txt:1456 +msgid "" +"The command `fai-class(1)` executes scripts in '$FAI/class' for defining\n" +"classes. If the scripts write a string to stdout, this will be defined\n" +"as a class. Read all the details in the man page of `fai-class(1)`." +msgstr "" + +#: fai-guide.txt:1461 +msgid "" +"After defining the classes, every file matching _.var_ with a prefix\n" +"which matches a defined class is sourced to define variables. It must\n" +"contain valid shell code." +msgstr "" + +#: fai-guide.txt:1463 +msgid "" +"=== [[ipartition]]Partitioning local disks, creating file systems (task " +"partition)" +msgstr "" + +#: fai-guide.txt:1466 +msgid "" +"For the disk partitioning exactly one disk configuration file from\n" +"'$FAI/disk_config' is selected using classes." +msgstr "" + +#: fai-guide.txt:1468 +msgid "The format of the disk configuration is similar to a fstab file." +msgstr "" + +#: fai-guide.txt:1475 +msgid "" +"The partitioning tool `setup-storage(8)` performs all commands\n" +"necessary for creating the disk partition layout, software RAID, LVM\n" +"and for creating the file systems. Disks and partitions may easily be\n" +"referenced by disk1.1, disk2.4 etc. Read the manual page of\n" +"`setup-storage(8)` for a detailed description and some examples of the\n" +"format." +msgstr "" + +#: fai-guide.txt:1480 +msgid "" +"=== [[ipreseed]]Debconf preseeding (task debconf)\n" +"Files in '$FAI/debconf' are used for the usual `debconf(7)` preseeding\n" +"if the file names match a class name." +msgstr "" + +#: fai-guide.txt:1482 +msgid "=== [[ipackages]]Installing software packages (task instsoft)" +msgstr "" + +#: fai-guide.txt:1486 +msgid "" +"The command `install_packages(8)` reads the config files from\n" +"'$FAI/package_config' in a class based manner and installs software\n" +"packages on the new file system." +msgstr "" + +#: fai-guide.txt:1490 +msgid "" +"It installs the packages using `apt-get(8)`, `aptitude(1)`, `yum` or other\n" +"package tools without any manual interaction needed. Package\n" +"dependecies are also resolved by the package tools." +msgstr "" + +#: fai-guide.txt:1492 +msgid "" +"The format of the configuration files is described in <>." +msgstr "" + +#: fai-guide.txt:1495 +msgid "" +"Additionaly FAI will install packages ('.deb' or .rpm') from the\n" +"directories '$FAI/pkgs/'." +msgstr "" + +#: fai-guide.txt:1498 +msgid "=== [[icscripts]]Site specific customization (task configure)" +msgstr "" + +#: fai-guide.txt:1505 +msgid "" +"Often the default configurations of the software packages will not\n" +"meet your site-specific needs. You can call arbitrary scripts which\n" +"adjust the system configuration. Therefore the command\n" +"`fai-do-scripts(1)` executes scripts in '$FAI/scripts' in a class\n" +"based manner. It is possible to have several scripts of different\n" +"types (shell, cfengine, ...) to be executed for one class." +msgstr "" + +#: fai-guide.txt:1512 +msgid "" +"The default set of scripts in '$FAI/scripts' include examples for\n" +"installing Debian and Rocky Linux machines. They set the root password, add\n" +"a user account (set by '$username, default to demo), set the timezone, " +"configure the network for DHCP\n" +"or using a fixed IP address, setup grub and more.\n" +"They should do a reasonable job for your installation. You can edit\n" +"them or add new scripts to match your local needs." +msgstr "" + +#: fai-guide.txt:1514 +msgid "More information about these scripts are described in <>." +msgstr "" + +#: fai-guide.txt:1517 +msgid "=== [[isavelog]]Saving log files (task savelog)" +msgstr "" + +#: fai-guide.txt:1528 +msgid "" +"When all tasks are finished, the log files are written to\n" +"_/var/log/fai/$HOSTNAME/install/_\n" +"footnote:['/var/log/fai/localhost/install/' is a link to this\n" +"directory.] on the new system and to the account on the install server\n" +"if +$LOGUSER+ is defined (you have to enable this in\n" +"'/srv/fai/config/class/FAIBASE.var'). It is also possible to specify\n" +"another host as log saving destination through the variable\n" +"+$LOGSERVER+. If +$LOGSERVER+ is not defined, FAI uses the variable\n" +"+$SERVER+ which is only defined during an initial installation (by\n" +"get-boot-info)." +msgstr "" + +#: fai-guide.txt:1537 +msgid "" +"Additionally, two symlinks will be created to indicated the last\n" +"directory written to. The symlink 'last' points to the log directory\n" +"of the last FAI action performed. The symlinks 'last-install' and\n" +"'last-sysinfo' point to the directory of the last corresponding\n" +"action. By default log files will be copied to the log\n" +"server using scp. You can use the variable +$FAI_LOGPROTO+ in file\n" +"'fai.conf(5)' to choose another method for saving logs to the remote\n" +"server. Here's an example of the symlink structure:" +msgstr "" + +#: fai-guide.txt:1547 +msgid "" +"----\n" +"lrwxrwxrwx 1 fai fai 23 Dec 2 2013 last-sysinfo -> sysinfo-" +"20131202_161237\n" +"drwxr-xr-x 2 fai fai 4096 Dec 2 2013 sysinfo-20131202_161237\n" +"drwxr-xr-x 2 fai fai 4096 Feb 14 2014 install-20140214_142150\n" +"drwxr-xr-x 2 fai fai 4096 Dec 2 11:47 install-20141202_113918\n" +"lrwxrwxrwx 1 fai fai 23 Dec 4 13:22 last-install -> install-" +"20141204_131351\n" +"lrwxrwxrwx 1 fai fai 23 Dec 4 13:22 last -> install-20141204_131351\n" +"drwxr-xr-x 2 fai fai 4096 Dec 4 13:22 install-20141204_131351\n" +"----" +msgstr "" + +#: fai-guide.txt:1549 +msgid "Examples of the log files can be found at https://fai-project.org/logs." +msgstr "" + +#: fai-guide.txt:1552 +msgid "=== [[ireboot]]Reboot the new installed system" +msgstr "" + +#: fai-guide.txt:1558 +msgid "" +"Before rebooting, the install client calls `fai-chboot -d `\n" +"on the install server, to disable its own PXELINUX\n" +"configuration. Otherwise, it would restart the installation during the\n" +"next boot. Normally this should boot the new installed system from\n" +"its second boot device, the local hard disk." +msgstr "" + +#: fai-guide.txt:1561 +msgid "" +"At the end, the system is automatically rebooted if \"reboot\" was added to\n" +"+$FAI_FLAGS+." +msgstr "" + +#: fai-guide.txt:1565 +msgid "== [[advanced]]Advanced FAI topics" +msgstr "" + +#: fai-guide.txt:1568 +msgid "=== [[checkbootp]]Checking parameters received from DHCP servers" +msgstr "" + +#: fai-guide.txt:1574 +msgid "" +"If the install client boots you can check\n" +"if all information from the DHCP daemon are received\n" +"correctly. The received information is written to\n" +"'/tmp/fai/boot.log'. An example of the result of a DHCP request can be\n" +"found in the sample log files." +msgstr "" + +#: fai-guide.txt:1579 +msgid "=== [[fai-monitor]]Monitoring multiple client installations" +msgstr "" + +#: fai-guide.txt:1586 +msgid "" +"You can monitor the installation of all install clients with the\n" +"command `fai-monitor(8)`. All clients check if this daemon is running\n" +"on the install server (or the machine defined by the variable\n" +"+$monserver+). Each time a task starts or ends, a message is sent. The\n" +"FAI monitor daemon prints this messages to standard output. There's\n" +"also a graphical frontend available, called `fai-monitor-gui(1)`." +msgstr "" + +#: fai-guide.txt:1590 +msgid "" +"----\n" +"$ fai-monitor | fai-monitor-gui - &\n" +"----" +msgstr "" + +#: fai-guide.txt:1593 +msgid "=== [[mac]]Collecting Ethernet addresses for multiple hosts" +msgstr "" + +#: fai-guide.txt:1600 +msgid "" +"You have to collect all Ethernet (MAC) addresses of the install\n" +"clients and assign a host name and IP address to each client. To\n" +"collect the MAC addresses, boot your install clients.\n" +"You can already do this before any DHCP daemon is running in your\n" +"subnet. They will fail to boot (because of the missing DHCP or missing TFTP)," +"\n" +"but you can still collect the MAC addresses." +msgstr "" + +#: fai-guide.txt:1604 +msgid "" +"While the install clients are booting, they send broadcast packets to the\n" +"LAN. You can log the MAC addresses of these hosts by running the\n" +"following command simultaneously on the server:" +msgstr "" + +#: fai-guide.txt:1608 +msgid "" +"----\n" +"faiserver# tcpdump -qtel broadcast and port bootpc >/tmp/mac.list\n" +"----" +msgstr "" + +#: fai-guide.txt:1612 +msgid "" +"After the hosts have been sent some broadcast packets abort `tcpdump`\n" +"by typing _ctrl-c_. You get a list of all\n" +"unique MAC addresses with these commands:" +msgstr "" + +#: fai-guide.txt:1616 +msgid "" +"----\n" +"faiserver$ perl -ane 'print \"\\U$F[0]\\n" +"\"' /tmp/mac.list|sort|uniq\n" +"----" +msgstr "" + +#: fai-guide.txt:1623 +msgid "" +"After that, you only have to assign these MAC addresses to host names\n" +"and IP addresses ('/etc/ethers' and '/etc/hosts' or corresponding NIS\n" +"maps). With this information you can configure your `DHCP`\n" +"daemon (see the section <>). footnote:[I recommend to write the " +"MAC\n" +"addresses (last three bytes will suffice if you have network cards\n" +"from the same vendor) and the host name in the front of each chassis.]" +msgstr "" + +#: fai-guide.txt:1626 +msgid "==== Debugging the network traffic" +msgstr "" + +#: fai-guide.txt:1631 +msgid "" +"If the client can't successfully boot from the network card, use\n" +"`tcpdump(8)` to look for Ethernet packets between the install server\n" +"and the client. Search also for entries in several log files made by\n" +"`tftpd(8)` and `dhcpd(8)` :" +msgstr "" + +#: fai-guide.txt:1635 +msgid "" +"----\n" +"faiserver$ egrep \"tftpd|dhcpd\" /var/log/*\n" +"----" +msgstr "" + +#: fai-guide.txt:1638 +msgid "=== [[pxeboot]]Details of PXE booting" +msgstr "" + +#: fai-guide.txt:1641 +msgid "" +"Here we describe the details of PXE booting, which are only needed if\n" +"you have problems when booting your install clients." +msgstr "" + +#: fai-guide.txt:1648 +msgid "" +"Almost all modern bootable network cards support the PXE boot environment.\n" +"PXE is the Preboot Execution Environment.\n" +"This requires the PXELINUX bootloader and a special version of the _TFTP_\n" +"daemon, which is available in the Debian packages +pxelinux+ and\n" +"+tftpd-hpa+. PXE booting also needs a DHCP server, so that the network\n" +"card can configure its IP parameters. This is the sequence of a PXE boot:" +msgstr "" + +#: fai-guide.txt:1658 +msgid "" +"* Network card of the client sends its MAC address\n" +"* DHCP server replies with IP configuration for the client\n" +"* Network card configures IP\n" +"* Install client gets the pxelinux.0 binary via TFTP\n" +"* Get the pxelinux.cfg/C0A8210C configuration file via TFTP\n" +"* C0A8210C is the IP address of the client in hexadecimal\n" +"* This configuration contains kernel, initrd and additional kernel\n" +"command line parameters, which was created by `fai-chboot`.\n" +"* Get the kernel and initrd via TFTP." +msgstr "" + +#: fai-guide.txt:1663 +msgid "" +"Example of a pxelinux.cfg file:\n" +"----\n" +"default fai-generated" +msgstr "" + +#: fai-guide.txt:1668 +msgid "" +"label fai-generated\n" +"kernel vmlinuz-6.1.0-17-amd64\n" +"append initrd=initrd.img-6.1.0-17-amd64 ip=dhcp root=/srv/fai/nfsroot " +"rootovl FAI_FLAGS=verbose,sshd,createvt FAI_CONFIG_SRC=nfs://faiserver/srv/" +"fai/config FAI_ACTION=install\n" +"----" +msgstr "" + +#: fai-guide.txt:1673 +msgid "" +"See '/usr/share/doc/syslinux/pxelinux.doc' for more detailed\n" +"information about PXELINUX. FAI uses the lpxelinux.0 binary which also\n" +"supports loading the kernel and initrd via FTP or HTTP. The command\n" +"'fai-chboot(8)' supports this with the option '-U'." +msgstr "" + +#: fai-guide.txt:1676 +msgid "" +"=== [[Customizing your install server setup]]Customizing your install server " +"setup" +msgstr "" + +#: fai-guide.txt:1680 +msgid "" +"- local/faster package mirror\n" +"- different loguser\n" +"- local root pw inside nfsroot" +msgstr "" + +#: fai-guide.txt:1686 +msgid "" +"The configuration for the FAI package (not the configuration data for\n" +"the install clients) is defined in 'fai.conf(5)'. Definitions that are\n" +"only used for creating the nfsroot are located in\n" +"'nfsroot.conf(5)'. Check these important variables in 'nfsroot.conf'\n" +"before calling 'fai-setup' or 'fai-make-nfsroot'." +msgstr "" + +#: fai-guide.txt:1692 +msgid "" +"FAI_DEBOOTSTRAP::\n" +"Building the nfsroot uses the command `debootstrap(8)`. It needs the " +"location of a Debian mirror and the\n" +"name of the distribution (like bullsseye, bookworm, sid) for which the basic " +"Debian\n" +"system should be built. Do not use different distributions here and in\n" +"'/etc/fai/apt/sources.list'. This will create a broken nfsroot." +msgstr "" + +#: fai-guide.txt:1698 +msgid "" +"NFSROOT_ETC_HOSTS::\n" +"This variable is only needed if the clients do not have access to a DNS " +"server.\n" +"This multiline variable is added to /etc/hosts inside the\n" +"nfsroot. Then the install clients can access those hosts by name\n" +"without using DNS." +msgstr "" + +#: fai-guide.txt:1705 +msgid "" +"The content of '/etc/fai/apt/sources.list' is\n" +"used by the install server and also by the clients. If your install\n" +"server has multiple network cards and different host names for each\n" +"card (as for a Beowulf server), use the install server name which is\n" +"known by the install clients." +msgstr "" + +#: fai-guide.txt:1714 +msgid "" +"If you have problems running `fai-setup`, they usually stem from\n" +"`fai-make-nfsroot(8)` which is called by former command. Adding '-v'\n" +"gives you a more verbose output which helps you pinpoint the\n" +"error. The output is written to\n" +"'/var/log/fai/fai-make-nfsroot.log'. footnote:[For debugging purpose\n" +"it may help to enter the chroot environment manually using this\n" +"command. 'faiserver# chroot /srv/fai/nfsroot bash']" +msgstr "" + +#: fai-guide.txt:1724 +msgid "" +"The setup also creates the account _fai_ (defined by +$LOGUSER+) if\n" +"not already available. So you can add a user before calling\n" +"`fai-setup(8)` using the command `adduser(8)` and use this as your\n" +"local account for saving log files. The log files of all install\n" +"clients are saved to the home directory of this account. You should\n" +"change the primary group of this\n" +"account, so this account has write permissions to '/srv/tftp/fai' in\n" +"order to call fai-chboot for creating the PXE configuration for the hosts." +msgstr "" + +#: fai-guide.txt:1732 +msgid "" +"When you make changes to 'fai.conf', 'nfsroot.conf' the\n" +"nfsroot has to be rebuilt by calling `fai-make-nfsroot(8)`. If you\n" +"only like to install a new kernel package to the nfsroot add the flags _-k_ " +"or\n" +"_-K_ to +fai-make-nfsroot+. This will not recreate your nfsroot, but\n" +"only updates your kernel and kernel modules inside the nfsroot or add\n" +"additional packages into the nfsroot." +msgstr "" + +#: fai-guide.txt:1735 +msgid "=== [[cdboot]]Creating a FAI CD or and USB stick" +msgstr "" + +#: fai-guide.txt:1743 +msgid "" +"You can easily create an installation CD (or USB stick) of your\n" +"network installation setup. This will perform the same installation\n" +"and configuration from CD without the need of the install server.\n" +"Therefore you need to create a partial mirror of all Debian packages\n" +"needed for your FAI classes (using `fai-mirror(1)`). Then the command\n" +"`fai-cd(8)` will put this mirror, the nfsroot and the config space\n" +"onto a bootable CD. That's it!" +msgstr "" + +#: fai-guide.txt:1746 +msgid "" +"To easily create the installation CD, you can use the following command\n" +"(for more tuning details see `fai-cd(8)`):" +msgstr "" + +#: fai-guide.txt:1750 +msgid "" +"----\n" +" faiserver# fai-cd -m fai-cd.iso\n" +"----" +msgstr "" + +#: fai-guide.txt:1758 +msgid "" +"This installation CD contains all data needed for the\n" +"installation. The command `fai-cd(8)` puts the nfsroot, the\n" +"configuration space and a subset of the Debian mirror onto a\n" +"CD-ROM. A partial package mirror is created using the command\n" +"`fai-mirror(1)` which contains all packages that are used by the\n" +"classes used in your configuration space. A sample ISO image is\n" +"available at https://fai-project.org/fai-cd." +msgstr "" + +#: fai-guide.txt:1762 +msgid "" +"Using the command `dd(1)` you can also create a bootable USB\n" +"stick by just writing the content of the ISO file to your USB stick\n" +"(here the stick is _/dev/sdf_)." +msgstr "" + +#: fai-guide.txt:1766 +msgid "" +"----\n" +" faiserver# dd if=fai-cd.iso of=/dev/sdf bs=1M\n" +"----" +msgstr "" + +#: fai-guide.txt:1775 +msgid "" +"`mk-data-partition` is a tool that extends an ISO (that will be copied\n" +"to an USB stick) or an USB stick containing an ISO with\n" +"an ext4 or exFAT partition and sets the file system label to MY-DATA.\n" +"This partition is automatically mounted to '/media/data' by FAI.\n" +"You can copy your own _.deb_ packages into this data partition und the\n" +"subdiretories 'pkgs/'. FAI will then install these packages\n" +"if the equivalent class is defined." +msgstr "" + +#: fai-guide.txt:1777 +msgid "Example how to use `mk-data-partition`:" +msgstr "" + +#: fai-guide.txt:1784 +msgid "" +"----\n" +"# mk-data-partition -s 1G -c faicd-large.iso A B\n" +"----\n" +"The former command creates the data partition of size 1 Gbytes inside\n" +"the ISO file and copy directories A and B to it. You can then copy the " +"modified ISO\n" +"onto an USB stick." +msgstr "" + +#: fai-guide.txt:1792 +msgid "" +"If the ISO is already on the USB stick and if it's available as\n" +"_dev/sdf_, you can add a data partition of type exFAT will will use\n" +"the whole remaining part of the USB stick by using this command:\n" +"----\n" +"# mk-data-partition -F /dev/sdf\n" +"----" +msgstr "" + +#: fai-guide.txt:1795 +msgid "=== [[diskimage]]Creating VM disk images using FAI" +msgstr "" + +#: fai-guide.txt:1806 +msgid "" +"The command `fai-diskimage(8)` creates disk\n" +"images, which can be used with a virtual machine like KVM, VMware,\n" +"VirtualBox or a cloud service like OpenStack, GCE, EC2 and others. The\n" +"installation process performs the normal FAI tasks on a raw disk\n" +"image. After the installation you can boot the disk image and have a\n" +"running system. The disk image can also be converted to qcow2 format.\n" +"You do not need to setup the FAI nfsroot when only using\n" +"fai-diskimage. But you need a basefile in your configuration\n" +"space. Setting the variable +$FAI_BASEFILEURL+ will automatically\n" +"download an appropriate base file into your config space." +msgstr "" + +#: fai-guide.txt:1814 +msgid "" +"Here's an example how to create a raw disk image for a host called\n" +"cloud3, with a small set of software packages:\n" +"----\n" +"# export FAI_BASEFILEURL=https://fai-project.org/download/basefiles/\n" +"# fai-diskimage -vu cloud3 -S2G -" +"cDEBIAN,BOOKWORM64,AMD64,FAIBASE,GRUB_PC,DHCPC,DEMO,CLOUD,LAST disk.raw\n" +"----" +msgstr "" + +#: fai-guide.txt:1822 +msgid "" +"This command will create a disk image called ubuntu.qcow2 for a Ubuntu 16.04 " +"desktop\n" +"with hostname set to foobar.\n" +"----\n" +"# export FAI_BASEFILEURL=https://fai-project.org/download/basefiles/\n" +"# cl=DHCPC,UBUNTU,JAMMY,JAMMY64,AMD64,XORG,LAST\n" +"# fai-diskimage -Nvu foobar -S5G -c$cl ubuntu.qcow2\n" +"----" +msgstr "" + +#: fai-guide.txt:1825 +msgid "" +"You can give disk images a try without installing FAI, if you visit\n" +"https://fai-project.org/FAIme/cloud" +msgstr "" + +#: fai-guide.txt:1828 +msgid "=== [[live-image]]Creating a bootable live image" +msgstr "" + +#: fai-guide.txt:1833 +msgid "" +"Creating a bootable live ISO is easy with FAI. You only need two\n" +"steps. First, create your live environment using the command 'fai\n" +"dirinstall'. Don't forget to add the class +LIVEISO+.\n" +"Then create the live ISO using 'fai-cd':" +msgstr "" + +#: fai-guide.txt:1841 +msgid "" +"----\n" +"# cl=\"DEBIAN,BOOKWORM64,AMD64,FAIBASE,XFCE,XORG,DHCPC,DEMO,LIVEISO,LAST\"\n" +"# LC_ALL=C fai -v dirinstall -u xfce33 -c $cl \\\n" +" -s file:///srv/fai/config /srv/xfce\n" +"# fai-cd -s500 -MH -d none -g /etc/fai/grub.cfg.live \\\n" +" -n /srv/xfce live.iso\n" +"----" +msgstr "" + +#: fai-guide.txt:1844 +msgid "" +"The nfsroot is not needed for a live ISO.\n" +"Currently there's no live ISO of the install server available." +msgstr "" + +#: fai-guide.txt:1847 +msgid "=== [[cross-arch]]Building cross-architecture disk images" +msgstr "" + +#: fai-guide.txt:1852 +msgid "" +"Starting FAI 5.4 it's now possible to build a disk image for\n" +"different architectures than the host is running. For example you can\n" +"build an image for 64-bit ARM architecture (aarch64) on a host running on " +"amd64\n" +"architecture. Here are the steps do to:" +msgstr "" + +#: fai-guide.txt:1856 +msgid "" +"----\n" +"# apt install qemu-system-arm qemu-user-static fai-server fai-setup-storage " +"fai-doc qemu-utils\n" +"# fai-mk-configspace" +msgstr "" + +#: fai-guide.txt:1863 +msgid "" +"# export FAI_BASEFILEURL=https://fai-project.org/download/basefiles/\n" +"# fai-diskimage -vu armhost -S2G -" +"cDEFAULT,DHCPC,DEBIAN,ARM64,BUSTER_ARM64,FAIBASE,DEMO,CLOUD,LAST arm64.raw\n" +"# chown your_user_id arm64.raw\n" +"# cp /var/log/fai/armhost/last/vmlinuz* vmlinuz\n" +"# cp /var/log/fai/armhost/last/initrd.img* initrd\n" +"----" +msgstr "" + +#: fai-guide.txt:1868 +msgid "" +"Then you can run qemu as a normal user:\n" +"----\n" +"> qemu-system-aarch64 -m 1000 -M virt,gic_version=3 -cpu cortex-a57 -drive " +"file=arm64.raw,if=virtio,index=1 -no-reboot -nographic -name ARM64 -net " +"nic,name=eth0,model=virtio -net user,name=eth0,-kernel vmlinuz -initrd " +"initrd -append \"console=ttyAMA0 rw ip=dhcp root=/dev/vda1 net.ifnames=0\"\n" +"----" +msgstr "" + +#: fai-guide.txt:1872 +msgid "" +"This works similar for other architectures.\n" +"Keep in mind, that qemu network setup will have poor performance if\n" +"not using the virtio driver as above or tap devices." +msgstr "" + +#: fai-guide.txt:1878 +msgid "" +"You can find the base files for many architectures at\n" +"https://fai-project.org/download/basefiles/, or use `mk-basefile` to\n" +"create your own." +msgstr "" + +#: fai-guide.txt:1881 +msgid "=== [[sysinfo]]FAI rescue system" +msgstr "" + +#: fai-guide.txt:1888 +msgid "" +"If you set the variable +$FAI_ACTION+ to _sysinfo_ (for e.g. by using\n" +"+fai-chboot -S+), the client will not install a new system, but will\n" +"collect a lot of system information.\n" +"If you set +$FAI_ACTION+ to _inventory_ you will only get a few\n" +"hardware information.\n" +"Both actions can be used for FAI as a rescue system." +msgstr "" + +#: fai-guide.txt:1891 +msgid "" +"Type _ctrl-c_ to get a shell or use _Alt-F2_ or _Alt-F3_ and you will get\n" +"another console terminal, if you have added _createvt_ to +$FAI_FLAGS+." +msgstr "" + +#: fai-guide.txt:1899 +msgid "" +"You now have a running Linux system on the install client without\n" +"using the local hard disk. Use this as a rescue system if your local\n" +"disk is damaged or the computer can't boot properly from hard\n" +"disk. You will get a shell and you can execute various commands\n" +"(`dmesg`, `lsmod`, `df`, `lspci`, ...). Look at the log file in\n" +"'/tmp/fai'. There you can find much information about the boot\n" +"process." +msgstr "" + +#: fai-guide.txt:1906 +msgid "" +"FAI mounts all file systems it finds on the local disks read only. It\n" +"also tells you on which partition a file '/etc/fstab' exists. When\n" +"only one file system table is found, the partitions are mounted\n" +"according to this information. Here's an example:" +msgstr "" + +#: fai-guide.txt:1909 +msgid "" +"----\n" +"demohost:~# df -h" +msgstr "" + +#: fai-guide.txt:1921 +msgid "" +"Filesystem Size Used Avail Use% Mounted on\n" +"devtmpfs 4.0M 0 4.0M 0% /dev\n" +"tmpfs 2.0G 0 2.0G 0% /dev/shm\n" +"tmpfs 783M 18M 766M 3% /run\n" +"tmpfs 5.0M 0 5.0M 0% /run/lock\n" +"LiveOS_rootfs 783M 18M 766M 3% /\n" +"192.168.33.250:/srv/fai/config 59G 23G 24G 49% /var/lib/fai/config\n" +"/dev/mapper/vg1-root 7.3G 1.8G 5.2G 26% /target\n" +"/dev/vda1 459M 53M 378M 13% /target/boot\n" +"/dev/mapper/vg1-home 1.4G 72K 1.3G 1% /target/home\n" +"----" +msgstr "" + +#: fai-guide.txt:1924 +msgid "" +"*This method can be used as a rescue environment!* If you need a file\n" +"system with read-write access use the `rwmount` command:" +msgstr "" + +#: fai-guide.txt:1928 +msgid "" +"----\n" +"demohost# rwmount /target/home\n" +"----" +msgstr "" + +#: fai-guide.txt:1930 +msgid "=== [[nonfs]]FAI without NFS" +msgstr "" + +#: fai-guide.txt:1934 +msgid "" +"To boot into FAI and begin the installation sequence\n" +"without using the NFS protocol, you boot the client machine using PXE as\n" +"usual and then retrieve an image containing the nfsroot via http." +msgstr "" + +#: fai-guide.txt:1937 +msgid "" +"To create an image, use fai-cd's -S argument and -M to avoid setting up\n" +"a partial mirror within the image." +msgstr "" + +#: fai-guide.txt:1941 +msgid "" +"----\n" +"faiserver# fai-cd -M -S squash.img\n" +"----" +msgstr "" + +#: fai-guide.txt:1944 +msgid "" +"Move this image to a directory from which it can be requested via http\n" +"(usually a directory served by the webserver)" +msgstr "" + +#: fai-guide.txt:1948 +msgid "" +"To now request the squashfs image, add the following to your kernel\n" +"command line, e.g. in your pxelinux configuration file for the client\n" +"with fai-chboot." +msgstr "" + +#: fai-guide.txt:1952 +msgid "" +"----\n" +"root=live:http://faiserver/cskoeln/squash.img FAI_CONFIG_SRC=file:///var/lib/" +"fai/config\n" +"----" +msgstr "" + +#: fai-guide.txt:1955 +msgid "" +"Replace faiserver with the domain name or IP of the machine your\n" +"squash image is served from." +msgstr "" + +#: fai-guide.txt:1958 +msgid "=== [[otherdists]]Installing other distributions using a Debian nfsroot" +msgstr "" + +#: fai-guide.txt:1967 +msgid "" +"You can install all sorts of Linux distributions from a single Debian\n" +"nfsroot. Therefore you have to create a base.tar.xz of the distribution\n" +"you like to install and place it into the `basefiles` directory. Then\n" +"name it UBUNTU2204.tar.xz for example. An install client which belongs\n" +"to the class UBUNTU2204 then extracts this base file into its empty\n" +"file system. Additionally you have to adjust the 'sources.list' or\n" +"similar configuration files which are needed for specifying the\n" +"location of the package repository." +msgstr "" + +#: fai-guide.txt:1972 +msgid "" +"The tool `rinse(8)` is used for creating base files for distribution\n" +"like Rocky Linux, CentOS, openSUSE or Fedora.\n" +"Some basefiles can be downloaded from\n" +"https://fai-project.org/download/basefiles/." +msgstr "" + +#: fai-guide.txt:1976 +msgid "" +"The script +mk-basefile+ in\n" +"'/usr/share/doc/fai-doc/examples/simple/basefiles/' helps creating\n" +"this base files." +msgstr "" + +#: fai-guide.txt:1978 +msgid "=== [[dirinstall]]Creating chroot and virtualization environments" +msgstr "" + +#: fai-guide.txt:1984 +msgid "" +"If you have to create some chroot environments, or a virtualization\n" +"environment where you neither can nor want to run a normal Debian\n" +"Installer in to get to a working system (for example, Xen guest\n" +"domains), there is the FAI action _dirinstall_.\n" +"By calling" +msgstr "" + +#: fai-guide.txt:1988 +msgid "" +"----\n" +"faiserver# fai dirinstall \n" +"----" +msgstr "" + +#: fai-guide.txt:1993 +msgid "" +"and using either the option _-c _ or _-N_ you get a FAI\n" +"installation, without the partitioning action, right into the target\n" +"directory. The host name for the target installation can be specified\n" +"using _-u _" +msgstr "" + +#: fai-guide.txt:2002 +msgid "" +"This, for example, can be used to combine FAI with the tool\n" +"_xen-tools_, which helps you to build Xen guest domains. _xen-tools_\n" +"are very nice for generating configuration files and block devices for\n" +"new guests based on simple commands and/or configuration files, but\n" +"they can only assign one role per installation for customization.\n" +"FAI-users need and want more, as they are used to have the class\n" +"system. They get them even in xen-tools installations, by using the\n" +"following code as a xen-tools role script:" +msgstr "" + +#: fai-guide.txt:2010 +msgid "" +"----\n" +"#!/bin/sh\n" +"TARGET=$1\n" +"CMD=\"fai -N -v -u ${hostname} dirinstall $TARGET\"\n" +"echo running $CMD\n" +"$CMD\n" +"----" +msgstr "" + +#: fai-guide.txt:2013 +msgid "" +"Then, you should set the variable _install=0_ in the config of\n" +"xen-tools for that host." +msgstr "" + +#: fai-guide.txt:2022 +msgid "" +"=== [[softupdate]]Using FAI for updates\n" +"FAI can also do updates of already running systems, without a\n" +"re-installation from scratch.\n" +"This is called softupdate. A FAI softupdate skips the tasks which are\n" +"not suitable for updating a running system, like partitioning the\n" +"hard disks and creating file systems. Instead, it only executes the\n" +"tasks for updating and installing software packages and calling the\n" +"customization scripts." +msgstr "" + +#: fai-guide.txt:2027 +msgid "" +"To run a softupdate call:\n" +"----\n" +"# fai -v -s nfs://faiserver/srv/fai/config softupdate\n" +"----" +msgstr "" + +#: fai-guide.txt:2032 +msgid "" +"By default, a softupdate uses the list of classes defined during the\n" +"initial installation. Make sure to set the variable +$LOGSERVER+ (done\n" +"in a _class/*.var_ file) if FAI should save the log files to a remote\n" +"machine." +msgstr "" + +#: fai-guide.txt:2038 +msgid "" +"It's up to you, how to start a softupdate on a bigger number of hosts.\n" +"You may do the softupdate on a regular basis via cron or you can use tools\n" +"like `clusterssh(1)` to start a softupdate via a push on a list of\n" +"hosts." +msgstr "" + +#: fai-guide.txt:2044 +msgid "" +"Keep in mind, that the customization scripts are run every time you do\n" +"a softupdate. That means, they have to be *idempotent* i.e. the result\n" +"of their operation should always produce the same result, even when\n" +"they run more than once." +msgstr "" + +#: fai-guide.txt:2046 +msgid "For example appending a line to a file must not done via this code:" +msgstr "" + +#: fai-guide.txt:2052 +msgid "" +"----\n" +"$ echo \"some strings\" >> /etc/fstab\n" +"----\n" +"Instead use the command `ainsl(1)` in a shell script or use cfengine's\n" +"function _AppendIfNoSuchLine_." +msgstr "" + +#: fai-guide.txt:2058 +msgid "" +"All commands in the customization script must be capable of modifying\n" +"the target file system wether it's available in _/target_ during the\n" +"initial installation or wether it's the normal file system relative to\n" +"_/_ during softupdate." +msgstr "" + +#: fai-guide.txt:2060 +msgid "Here are some variable that help writing these scripts:" +msgstr "" + +#: fai-guide.txt:2063 +msgid "" +"+$target+:: Points to the root directory of the client, which\n" +"is _/target_ during installation and _/_ during a softupdate." +msgstr "" + +#: fai-guide.txt:2066 +msgid "" +"+$FAI_ROOT+:: It's the same value as +$target+. For historic reasons\n" +"we have both these variables in FAI." +msgstr "" + +#: fai-guide.txt:2071 +msgid "" +"+$ROOTCMD+::\n" +"In case of the installation this is an alias for 'chroot $target' in case " +"of\n" +"softupdate it's just empty. You can prepend this to commands if you need to " +"run a\n" +"command inside the clients target file system via chroot." +msgstr "" + +#: fai-guide.txt:2078 +msgid "" +"+$FAI_ACTION+::\n" +"If you need to call code depending on the FAI action performed, you\n" +"can use this variable. It contains the currently executed action:\n" +"_install_, _softupdate_, _dirinstall_, _sysinfo_, _inventory_ or your\n" +"own defined action." +msgstr "" + +#: fai-guide.txt:2080 +msgid "=== [[archcross]]How to install 32-bit OS from a 64-bit OS" +msgstr "" + +#: fai-guide.txt:2085 +msgid "" +"To install a computer with a 32-bit OS, you need an i386 nfsroot.\n" +"Creating this 32-bit nfsroot on an install server running amd64 is\n" +"quite simple. Install and set up the FAI packages. Then copy your FAI\n" +"config files to a new subdirectory." +msgstr "" + +#: fai-guide.txt:2089 +msgid "" +"----\n" +"faiserver# cp -a /etc/fai /etc/fai-i386\n" +"----" +msgstr "" + +#: fai-guide.txt:2094 +msgid "" +"Edit the variable +$FAI_DEBOOTSTRAP_OPTS+ in\n" +"'/etc/fai-i386/nfsroot.conf' and add the option +--arch\n" +"i386+. Also choose a different directory for your new nfsroot. Here\n" +"are the two lines after editing." +msgstr "" + +#: fai-guide.txt:2099 +msgid "" +"----\n" +"NFSROOT=/srv/fai/nfsroot-i386\n" +"FAI_DEBOOTSTRAP_OPTS=\"--arch i386 --exclude=info --include=aptitude\"\"\n" +"----" +msgstr "" + +#: fai-guide.txt:2102 +msgid "" +"Now call fai-make-nfsroot which creates the 32-bit nfsroot in\n" +"'/srv/fai/nfsroot-i386'" +msgstr "" + +#: fai-guide.txt:2106 +msgid "" +"----\n" +"faiserver# fai-make-nfsroot -v -C/etc/fai-i386\n" +"----" +msgstr "" + +#: fai-guide.txt:2110 +msgid "" +"Creating a partial mirror using `fai-mirror(1)` that is needed for\n" +"a bootable CD or USB stick is also possible on a different architecture.\n" +"You have to specify the architecture when calling fai-mirror." +msgstr "" + +#: fai-guide.txt:2114 +msgid "" +"----\n" +"$ fai-mirror -m800 -B -a i386 -v -cDEFAULT,DEBIAN,FAIBASE,I386 /srv/mirror-" +"i386\n" +"----" +msgstr "" + +#: fai-guide.txt:2116 +msgid "That's all!" +msgstr "" + +#: fai-guide.txt:2119 +msgid "=== [[error]]Aborting the installation when an error occurs" +msgstr "" + +#: fai-guide.txt:2127 +msgid "" +"Every task and hook can call the function +task_error+\n" +"to send an error value to the installation. This error will appear in\n" +"the log file and can be shown in the `fai-monitor-gui(1)`.\n" +"The error value is also checked against the variable +$STOP_ON_ERROR+\n" +"which is set to 700 by default. If the error value\n" +"is greater than +$STOP_ON_ERROR+ the installation will stop\n" +"immediately. In a hook, just add a call like this:" +msgstr "" + +#: fai-guide.txt:2131 +msgid "" +"----\n" +"task_error \n" +"----" +msgstr "" + +#: fai-guide.txt:2134 +msgid "" +"It is comfortable to call task_error with $? as second parameter, for\n" +"e.g. if you want to set an error value of 123 use this" +msgstr "" + +#: fai-guide.txt:2139 +msgid "" +"----\n" +"\n" +"task_error 123 $?\n" +"----" +msgstr "" + +#: fai-guide.txt:2143 +msgid "" +"Then the task error is only set if the preceding command failed with\n" +"some error. The same syntax can be used by the scripts in the class\n" +"subdirectory ending in .sh." +msgstr "" + +#: fai-guide.txt:2148 +msgid "" +"A special case are scripts inside the class/ subdirectory that does\n" +"not end in .sh. In those scripts you have to call task_error with 1 as\n" +"third parameter. As an example you can use those two variants for\n" +"setting the value to 123" +msgstr "" + +#: fai-guide.txt:2152 +msgid "" +"----\n" +"task_error 123 $? 1\n" +"----" +msgstr "" + +#: fai-guide.txt:2154 +msgctxt "fai-guide.txt:2154" +msgid "or" +msgstr "" + +#: fai-guide.txt:2158 +msgid "" +"----\n" +"task_error 123 1 1\n" +"----" +msgstr "" + +#: fai-guide.txt:2162 +msgid "" +"The latter command always sets the task error to 123 regardless of\n" +"the value of +$?+. If the error value is greater than +$STOP_ON_ERROR+,\n" +"the installation will abort immediately." +msgstr "" + +#: fai-guide.txt:2164 +msgid "The error values are grouped into four categories" +msgstr "" + +#: fai-guide.txt:2171 +msgid "" +"----\n" +"normal or info messages: 1xx, 2xx\n" +"warnings: 3xx, 4xx\n" +"minor errors: 5xx, 6xx\n" +"errors: 7xx, 8xx\n" +"----" +msgstr "" + +#: fai-guide.txt:2173 +msgid "The fai-monitor-gui has 4 different icons for these error categories." +msgstr "" + +#: fai-guide.txt:2176 +msgid "== [[hints]]Various hints and details" +msgstr "" + +#: fai-guide.txt:2179 +msgid "=== [[tasks]]The list of tasks" +msgstr "" + +#: fai-guide.txt:2187 +msgid "" +"Most tasks of the installation are defined as subroutines which are\n" +"defined in '/usr/lib/fai/subroutines' (e.g. +task_instsoft+).\n" +"Some are external shell scripts located in '/usr/lib/fai/'.\n" +"They are called via a superior subroutine called _task_.\n" +"This subroutine calls hooks if available and then calls the task (defined " +"as\n" +"__task___). A task and its hooks can be\n" +"skipped on demand by using the command _skiptask()_." +msgstr "" + +#: fai-guide.txt:2190 +msgid "" +"Now follows the description of all tasks, listed in the order\n" +"they are executed." +msgstr "" + +#: fai-guide.txt:2203 +msgid "" +"confdir::\n" +"The kernel appended parameters may define variables, the syslog daemon is\n" +"started. Network parameters are fetched from a DHCP\n" +"server and are stored in +boot.log+. The DNS resolver configuration file is " +"created.\n" +"+\n" +"The location of the configuration space is defined by the variable\n" +"+$FAI_CONFIG_SRC+.\n" +"+\n" +"After that, the file '$FAI/hooks/subroutines' is sourced if it\n" +"exists. Using this file, you can define your own subroutines or\n" +"override the definition of FAI's subroutines." +msgstr "" + +#: fai-guide.txt:2209 +msgid "" +"setup::\n" +"This task sets the system time, all +$FAI_FLAGS+ are defined and two\n" +"additional virtual terminals are opened on demand. A secure shell\n" +"daemon is started on demand for remote logins." +msgstr "" + +#: fai-guide.txt:2215 +msgid "" +"defclass::\n" +"Calls `fai-class(1)` to define classes using scripts and files in\n" +"'$FAI/class' and classes from '/tmp/fai/additional-classes' and the\n" +"variable +$ADDCLASSES+. The list of all defined classes is stored in\n" +"the variable +$classes+ and saved to '/tmp/fai/FAI_CLASSES'." +msgstr "" + +#: fai-guide.txt:2220 +msgid "" +"defvar::\n" +"Sources all files '$FAI/class/*.var' for every defined class. If a\n" +"hook has written some variable definitions to the file\n" +"'$LOGDIR/additional.var', this file is also sourced." +msgstr "" + +#: fai-guide.txt:2228 +msgid "" +"action::\n" +"Depending on the value of +$FAI_ACTION+ this subroutine decides which\n" +"action FAI should perform. The default available actions are:\n" +"_sysinfo_, _install_, _inventory_, _dirinstall_ and _softupdate_. If " +"+$FAI_ACTION+ has another\n" +"value, a user defined action is called if a file\n" +"'$FAI/hooks/$FAI_ACTION' exists. So you can easily define your own\n" +"actions." +msgstr "" + +#: fai-guide.txt:2235 +msgid "" +"sysinfo::\n" +"Called when no installation is performed but the action is\n" +"_sysinfo_. It shows information about the detected hardware and mounts\n" +"the local hard disks read only to '/target/+partitionname+' or with\n" +"regard to a 'fstab' file found inside a partition. Log files are\n" +"stored to the install server." +msgstr "" + +#: fai-guide.txt:2238 +msgid "" +"inventory::\n" +"A short list of system information is printed." +msgstr "" + +#: fai-guide.txt:2246 +msgid "" +"install::\n" +"This task controls the installation sequence. You will hear three\n" +"beeps before the installation starts. The major work is to call other\n" +"tasks and to save the output to '/tmp/fai/fai.log'. If you have any\n" +"problems during installation, look at all files in '/tmp/fai/'. You\n" +"can find examples of the log files\n" +"at https://fai-project.org/logs/." +msgstr "" + +#: fai-guide.txt:2250 +msgid "" +"dirinstall::\n" +"Install into a directory, not onto a local disk. Use this for creating\n" +"chroot environments." +msgstr "" + +#: fai-guide.txt:2255 +msgid "" +"softupdate::\n" +"This task, executed inside a running system via the `fai(8)` command\n" +"line interface, performs a softupdate. See chapter <> for\n" +"details." +msgstr "" + +#: fai-guide.txt:2262 +msgid "" +"partition::\n" +"Calls `setup-storage(8)` to partition the hard\n" +"disks and to create file systems. The task writes variable definitions\n" +"for the root and boot partition and device (+$ROOT_PARTITION,\n" +"$BOOT_PARTITION, $BOOT_DEVICE+) to '/tmp/fai/disk_var.sh' and creates\n" +"a 'fstab' file for the new system." +msgstr "" + +#: fai-guide.txt:2266 +msgid "" +"mountdisks::\n" +"Mounts the created partitions according to the created\n" +"'/tmp/fai/fstab' file relative to +$FAI_ROOT+." +msgstr "" + +#: fai-guide.txt:2277 +msgid "" +"extrbase::\n" +"Extracts a minimal system after that a chroot can be made into it. By\n" +"default the base tar file '/var/tmp/base.tar.xz' will be\n" +"extracted. Also files matching a class name in `$FAI/basefiles/` are used " +"for unpacking a\n" +"different tar file depending on classes defined. This can be used for\n" +"installing different Linux distributions than the one used for\n" +"creating the nfsroot. The default file 'base.tar.xz' is a snapshot of a\n" +"basic Debian system created by `debootstrap(8)`.\n" +"This task uses the variable +FAI_BASEFILEURL+ for fetching the base\n" +"file via FTP, HTTPS or HTTP if it's defined." +msgstr "" + +#: fai-guide.txt:2280 +msgid "" +"debconf::\n" +"Calls `fai-debconf(1)` to set the values for the debconf preseeding database." +msgstr "" + +#: fai-guide.txt:2286 +msgid "" +"repository::\n" +"Prepare access to the package repository by preparing the apt\n" +"configuration. This can also add repository keys\n" +"in a class based manner from files like _CLASSNAME.gpg_\n" +"in the directory _package_config_." +msgstr "" + +#: fai-guide.txt:2293 +msgid "" +"updatebase::\n" +"Updates the base packages of the new system and updates the list of\n" +"available packages. It also fakes some commands (called diversions)\n" +"inside the new installed system using `dpkg-divert(8)`, so no daemons\n" +"will be started during the installation." +msgstr "" + +#: fai-guide.txt:2297 +msgid "" +"instsoft::\n" +"Installs the desired software packages using class files in\n" +"'$FAI/package_config/'." +msgstr "" + +#: fai-guide.txt:2301 +msgid "" +"configure::\n" +"Calls scripts in '$FAI/scripts/' and its subdirectories for every\n" +"defined class." +msgstr "" + +#: fai-guide.txt:2305 +msgid "" +"tests::\n" +"Calls test scripts in '$FAI/tests/' and its subdirectories for every\n" +"defined class." +msgstr "" + +#: fai-guide.txt:2309 +msgid "" +"finish::\n" +"Unmounts all file systems in the new installed system and removes\n" +"diversions of files using the command `fai-divert`." +msgstr "" + +#: fai-guide.txt:2315 +msgid "" +"chboot::\n" +"Changes the PXE configuration for a host on the install server which\n" +"indicates which PXELINUX configuration to load on the next boot from " +"network\n" +"card via TFTP. Therefore the `fai-chboot(8)` command is executed\n" +"remotely on the install server." +msgstr "" + +#: fai-guide.txt:2319 +msgid "" +"savelog::\n" +"Saves log files to local disk and to the account +$LOGUSER+ on\n" +"+$LOGSERVER+ (defaults to the install server)." +msgstr "" + +#: fai-guide.txt:2324 +msgid "" +"faiend::\n" +"Wait for background jobs to finish (e.g. emacs compiling lisp files)\n" +"and automatically reboots the install clients or waits for manual\n" +"input before reboot." +msgstr "" + +#: fai-guide.txt:2327 +msgid "=== [[itests]]Automated tests" +msgstr "" + +#: fai-guide.txt:2336 +msgid "" +"After the customization scripts are executed, FAI will execute some\n" +"tests if available. Using these test, you can check for errors of the\n" +"installation. Test scripts are called via\n" +"`fai-do-scripts(1)` and should append its messages to\n" +"_$LOGDIR/test.log_. A Perl module including some useful subroutines\n" +"can be found in _Faitest.pm_. A test can also define a new class for\n" +"executing another tests during next boot via the variable\n" +"+$ADDCLASSES+." +msgstr "" + +#: fai-guide.txt:2339 +msgid "=== [[autodiscover]] Autodiscover" +msgstr "" + +#: fai-guide.txt:2344 +msgid "" +"In FAI 5.0 we released a feature that allows clients to search for the\n" +"faiserver in their respective subnetwork. This lifts the necessity of\n" +"having to collect every client's MAC address and configuring the DHCP\n" +"daemon." +msgstr "" + +#: fai-guide.txt:2347 +msgid "" +"This is done by booting from a small FAI autodiscover bootmedium (CD,\n" +"USB, etc.), which can be created via the command:" +msgstr "" + +#: fai-guide.txt:2351 +msgid "" +"----\n" +"faiserver# fai-cd -A autodiscover.iso\n" +"----" +msgstr "" + +#: fai-guide.txt:2357 +msgid "" +"The image is roughly 25MB in size and scans the subnet for\n" +"a FAI server. By default it shows a menu with all profiles available\n" +"in the configuration space in the same manner as the 'menu' flag\n" +"does. From this menu, you can select the installation type you wish to\n" +"perform." +msgstr "" + +#: fai-guide.txt:2360 +msgid "" +"For the clients to find the faiserver, the faiserver must run\n" +"fai-monitor." +msgstr "" + +#: fai-guide.txt:2362 +msgid "=== [[changeboot]]Changing the boot device" +msgstr "" + +#: fai-guide.txt:2365 +msgid "" +"Changing the boot sequence is normally done in the BIOS setup. But you\n" +"can't change the BIOS from a running Linux system." +msgstr "" + +#: fai-guide.txt:2373 +msgid "" +"So, the boot sequence of the BIOS will remain unchanged and\n" +"your computer should always boot first from its network card and the\n" +"second boot device should be the local disk. Then you can\n" +"change the boot device of the client by creating different PXELINUX\n" +"configurations. This will define if an installation\n" +"should be performed, or if the client should to boot from local\n" +"disk. This is done using `fai-chboot(8)`." +msgstr "" + +#: fai-guide.txt:2376 +msgid "=== [[debian-mirror]]How to create a local Debian mirror" +msgstr "" + +#: fai-guide.txt:2386 +msgid "" +"The utility `mkdebmirror` footnote:[You can find the script in\n" +"'/usr/share/doc/fai-doc/examples/utils/'] can be used for creating\n" +"your own local Debian mirror. This script uses `debmirror(1)`. A partial " +"Debian mirror for amd64 architecture for\n" +"Debian 11 and 12 (aka bullseye and bookworm) without the source packages " +"needs about\n" +"180GB of disk space.\n" +"Accessing the mirror via HTTP will be the\n" +"default way in most cases. To see more output from the script call\n" +"+mkdebmirror -v+. A root account is not necessary to create and\n" +"maintain the Debian mirror." +msgstr "" + +#: fai-guide.txt:2390 +msgid "" +"To use HTTP access to the local Debian mirror, install a web server\n" +"and create a symlink to the local directory where your mirror is\n" +"located:" +msgstr "" + +#: fai-guide.txt:2395 +msgid "" +"----\n" +"faiserver# apt-get install apache2\n" +"faiserver# ln -s /files/scratch/debmirror /var/www/html/debmirror\n" +"----" +msgstr "" + +#: fai-guide.txt:2400 +msgid "" +"Create a file `sources.list(5)` in '/etc/fai/apt' which gives access\n" +"to your Debian mirror. Also add the IP-address of the\n" +"HTTP server to the variable +$NFSROOT_ETC_HOSTS+ in\n" +"'nfsroot.conf' if the install clients have no DNS resolving." +msgstr "" + +#: fai-guide.txt:2403 +msgid "=== Small hints" +msgstr "" + +#: fai-guide.txt:2410 +msgid "" +"- When using HTTP access to a Debian mirror, the local _/var_ partition\n" +"on all install clients must be big enough to keep the downloaded\n" +"Debian packages. Do not try with less than 250 Mbytes unless you know\n" +"why. You can limit the number of packages installed at a time with the\n" +"variable +$MAXPACKAGES+." +msgstr "" + +#: fai-guide.txt:2414 +msgid "" +"- You can remove the red logo on the install client by simply calling\n" +"`reset` once. If will also not appear if you create a file using this\n" +"command on the install server:" +msgstr "" + +#: fai-guide.txt:2418 +msgid "" +"----\n" +"touch /srv/fai/nfsroot/.nocolorlogo\n" +"----" +msgstr "" + +#: fai-guide.txt:2421 +msgid "" +"- A list of variables used by FAI can be found at\n" +"https://wiki.fai-project.org/index.php/Variables." +msgstr "" + +#: fai-guide.txt:2424 +msgid "" +"- You can shorten some customization scripts by using one single fcopy\n" +"command _fcopy -r /_." +msgstr "" + +#: fai-guide.txt:2428 +msgid "" +"- If you rebuild the nfsroot, you will create a new ssh host key inside\n" +"the nfsroot. Then logging in to an install client may fail, because\n" +"the host key changes. You can use this:" +msgstr "" + +#: fai-guide.txt:2432 +msgid "" +"----\n" +"$ ssh -o StrictHostKeyChecking=no root@installclient\n" +"----" +msgstr "" + +#: fai-guide.txt:2435 +msgid "" +"- You can also delete the host entry on your install client in your\n" +"_~/.ssh/known_hosts_ file by using the _ssh-keygen -R_ command." +msgstr "" + +#: fai-guide.txt:2444 +msgid "" +"- In the tasks chboot and savelog, a connection using secure shell is\n" +"opened to the FAI server (see <>). To ensure that this works\n" +"non-interactively, a proper entry in 'NFSROOT/root/.ssh/known_hosts'\n" +"must be created. When using fai-setup, this is done automatically, but\n" +"it may require manual editing in case the name of your FAI server was\n" +"not determined correctly. If you stumble over ssh connections that\n" +"require typing \"yes\" to accept the host key during installation,\n" +"please check the contents of your 'NFSROOT/root/.ssh/known_hosts file'" +msgstr "" + +#: fai-guide.txt:2447 +msgid "" +"- A list of all local hard disks is\n" +"stored in +$disklist+. It's defined after `set_disk_info` is called." +msgstr "" + +#: fai-guide.txt:2462 +msgid "" +"- There are multiple functions for generating a customized disk\n" +"list. See `fai-disk-info` for an example.\n" +" * set_bootstick()\n" +" * grepv_disks()\n" +" * grep_disks()\n" +" * notmatchdisks()\n" +" * matchdisks()\n" +" * smallestdisk()\n" +" * largestdisk()\n" +" * all_disks_by_size()\n" +" * all_disks_and_size()\n" +" * once_only()\n" +" * checkdisk()\n" +" * disks_by_id()" +msgstr "" + +#: fai-guide.txt:2467 +msgid "" +"- Use `fai-divert -a` if a postinst script calls a configuration\n" +"program, e.g. the postinst script for package apache calls\n" +"apacheconfig, which needs manual input. You can fake the configuration\n" +"program so the installation can be fully automatic." +msgstr "" + +#: fai-guide.txt:2475 +msgid "" +"- Sometimes the installation seems to stop, but often there's only a\n" +"postinstall script of a software package that requires manual input\n" +"from the console. Change to another virtual terminal and look which\n" +"process is running with tools like `top(1)` and `pstree(1)`. You can\n" +"add _debug_ to _FAI_FLAGS_ to make the installation process show all\n" +"output from the postinst scripts on the console and get its input also\n" +"from the console." +msgstr "" + +#: fai-guide.txt:2481 +msgid "" +"- How can I define classes on the kernel command line?\n" +"+\n" +"Read the man page of `fai-class(8)`. If you like to define some\n" +"additional classes (for e.g. A,B,C) on the kernel command line add this: " +"_ADDCLASSES=A,B,C_" +msgstr "" + +#: fai-guide.txt:2493 +msgid "" +"- How to use a custom kernel inside the nfsroot?\n" +"+\n" +"Build your customized kernel by building a kernel package using\n" +"`make-kpkg(8)` and use the option `--initrd`. Copy this Debian package\n" +"to a local repository and add it to /etc/fai/sources.list. Add the\n" +"name of your package to /etc/fai/NFSROOT. Then call\n" +"+\n" +"----\n" +"# fai-make-nfsroot -k\n" +"----" +msgstr "" + +#: fai-guide.txt:2498 +msgid "" +"- How to use the nfsroot as system for diskless clients?\n" +"+\n" +"https://wiki.fai-project.org/index.php/Use_nfsroot_for_diskless_clients" +msgstr "" + +#: fai-guide.txt:2506 +msgid "" +"- How to serve multiple nfsroot directories on one FAI server?\n" +"+\n" +"If you want to serve multiple nfsroot directories,\n" +"you need to create specific config directories in '/etc' for FAI, like\n" +"'/etc/fai-buster' and '/etc/fai-bookworm'. Then you need to set the\n" +"+$NFSROOT+ variables to different directories and run" +msgstr "" + +#: fai-guide.txt:2510 +msgid "" +"----\n" +"faiserver#fai-make-nfsroot -C /etc/fai-buster\n" +"----" +msgstr "" + +#: fai-guide.txt:2513 +msgid "=== flag_reboot (FAI_FLAGS)" +msgstr "" + +#: fai-guide.txt:2517 +msgid "" +"If flag_reboot is set, by adding \"reboot\" to +$FAI_FLAGS+, your client\n" +"machine will reboot after the task faiend has finished. This is true\n" +"for network as well as bootmedium installations." +msgstr "" + +#: fai-guide.txt:2520 +msgid "=== [[logfiles]]Log files" +msgstr "" + +#: fai-guide.txt:2528 +msgid "" +"FAI is creating several log files. During installation they are stored\n" +"in '/tmp/fai' on the install client itself. At the end of the\n" +"installation they will be copied to the install server (see\n" +"<>). After the install client rebooted into his newly\n" +"installed system, you can find the FAI logs in '/var/log/fai'.\n" +"Log files are also created when doing the softupdate or dirinstall\n" +"action." +msgstr "" + +#: fai-guide.txt:2531 +msgid "" +"On the faiserver, you can find the (remote) log files under the ~fai\n" +"directory." +msgstr "" + +#: fai-guide.txt:2535 +msgid "" +"Sample log files from successfully installed computers are\n" +"available on https://fai-project.org/logs.\n" +"These a some log files which are created by FAI." +msgstr "" + +#: fai-guide.txt:2538 +msgid "" +"FAI_CLASSES::\n" +"Contains a list of all classes defined." +msgstr "" + +#: fai-guide.txt:2542 +msgid "" +"dmesg.log::\n" +"Output of the `dmesg` command. Contains useful messages of the kernel\n" +"ring buffer." +msgstr "" + +#: fai-guide.txt:2546 +msgid "" +"fai.log::\n" +"The main log file. Contains all important information. You should\n" +"*always* read this file." +msgstr "" + +#: fai-guide.txt:2549 +msgid "" +"boot.log::\n" +"A list of variables of network parameters, mostly defined by the DHCP daemon." +msgstr "" + +#: fai-guide.txt:2552 +msgid "" +"format.log::\n" +"Output of the partition tool `setup-storage(8)`." +msgstr "" + +#: fai-guide.txt:2555 +msgid "" +"scripts.log::\n" +"Output of all scripts, that are used for customization." +msgstr "" + +#: fai-guide.txt:2559 +msgid "" +"variables.log::\n" +"A list of all shell variables which are available during an\n" +"installation." +msgstr "" + +#: fai-guide.txt:2562 +msgid "" +"error.log::\n" +"A summary of possible errors in all log files." +msgstr "" + +#: fai-guide.txt:2568 +msgid "" +"disk_var.sh::\n" +"A list of variables that contain information about devices and\n" +"partitions to boot from, the root partition and a list of swap\n" +"devices. These information is used by some customization scripts\n" +"(e.g. _GRUB_PC/10-setup_)." +msgstr "" + +#: fai-guide.txt:2578 +msgid "" +"If the installation process finishes, the hook 'savelog.LAST.sh'\n" +"searches all log files for common errors and writes them to the file\n" +"'error.log'. So, you should first look into this file for errors. Also\n" +"the file 'status.log' give you the exit code of the last command\n" +"executed in a script. To be sure, you should look for more details in\n" +"all log files." +msgstr "" + +#: fai-guide.txt:2581 +msgid "=== How to use HTTP for PXE boot" +msgstr "" + +#: fai-guide.txt:2585 +msgid "" +"fai-make-nfsroot now uses the lpxelinux.0 binary which already\n" +"supports transfer of the kernel and initrd via http (additional to tftp).\n" +"You only have to enable HTTP access to the tftp directory:" +msgstr "" + +#: fai-guide.txt:2590 +msgid "" +"----\n" +"cd /var/www/html\n" +"ln -s /srv/tftp/fai\n" +"----" +msgstr "" + +#: fai-guide.txt:2592 +msgid "Add '-U URL' to the 'fai-chboot' call. For example:" +msgstr "" + +#: fai-guide.txt:2596 +msgid "" +"----\n" +"fai-chboot -U http://faiserver/fai -IFv .......\n" +"----" +msgstr "" + +#: fai-guide.txt:2598 +msgid "== [[troubleshoot]]Troubleshooting" +msgstr "" + +#: fai-guide.txt:2600 +msgid "=== [[booterror]]Boot errors" +msgstr "" + +#: fai-guide.txt:2604 +msgid "" +"The following error message indicates that your install client doesn't\n" +"get an answer from a DHCP server. Check your cables or start the\n" +"`dhcpd(8)` daemon with the debug flag enabled." +msgstr "" + +#: fai-guide.txt:2609 +msgid "" +"____\n" +" PXE-E51: No DHCP or BOOTP offers received\n" +" Network boot aborted\n" +"____" +msgstr "" + +#: fai-guide.txt:2612 +msgid "" +"If you do not see the following message, the install kernel could not\n" +"detect your network card, for example because of a missing driver:" +msgstr "" + +#: fai-guide.txt:2618 +msgid "" +"----\n" +"Starting dhcp for interface eth0\n" +"dhcp: PREINIT eth0 up\n" +"dhcp: BOND setting eth\n" +"----" +msgstr "" + +#: fai-guide.txt:2625 +msgid "" +"Check the initrd in the nfsroot (`lsinird`) if the kernel driver of your " +"network\n" +"card is included there and check if you like to add the package\n" +"'firmware-linux-nonfree' in +/etc/fai/NFSROOT+ and rebuild the initrd\n" +"by calling `fai-make-nfsroot -k`.\n" +"You may also add a driver to +/srv/fai/nfsroot/etc/dracut.conf+ in\n" +"the line +add_drivers+++=+." +msgstr "" + +#: fai-guide.txt:2631 +msgid "" +"This is the error message you will see, when your network card is\n" +"working, but the install server does not export the nfsroot\n" +"directory to the install clients, This is often caused by missing\n" +"NFS permissions on the server side." +msgstr "" + +#: fai-guide.txt:2644 +msgid "" +"----\n" +"Starting dhcp for interface eth0\n" +"dhcp: PREINIT eth0 up\n" +"dhcp: BOND setting eth\n" +"mount.nfs: access denied by server while mounting 192.168.33.250:/srv/fai/" +"nfsroot\n" +".\n" +".\n" +"dracut Warning: Could not boot\n" +".\n" +"Dropping to debug shell\n" +"dracut:/#\n" +"----" +msgstr "" + +#: fai-guide.txt:2649 +msgid "" +"Now, you are inside the emergency shell of the initrd which was created\n" +"by 'dracut(8)'. You will get a shell prompt, and can look at the log files.\n" +"For more information about debugging the early boot process using\n" +"dracut see `dracut.cmdline(7)`" +msgstr "" + +#: fai-guide.txt:2652 +msgid "" +"Use the following command on the install server to see which directories are " +"exported\n" +"from the install server (named faiserver):" +msgstr "" + +#: fai-guide.txt:2655 +msgid "" +"----\n" +"$ showmount -e faiserver\n" +"----" +msgstr "" diff --git a/doc/po/fr.po b/doc/po/fr.po new file mode 100644 index 000000000..ab2a2c31f --- /dev/null +++ b/doc/po/fr.po @@ -0,0 +1,5136 @@ +#. extracted from fai-guide.txt +msgid "" +msgstr "" +"Project-Id-Version: FAI-GUIDE version 6.4\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2025-10-23 11:06+0200\n" +"PO-Revision-Date: 2025-10-23 19:59+0200\n" +"Last-Translator: Georges Khaznadar \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Translate Toolkit 3.15.1\n" + +#: fai-guide.txt:4 +msgid "" +"////\n" +" -*- Doc -*-\n" +"////" +msgstr "" +"////\n" +" -*- Doc -*-\n" +"////" + +#: fai-guide.txt:11 +msgid "" +"FAI Guide (Fully Automatic Installation)\n" +"========================================\n" +"Thomas Lange \n" +"Wed, 10 Apr 2025\n" +":Date: a date\n" +":Revision: 6.4" +msgstr "" +"FAI Guide (Fully Automatic Installation)\n" +"========================================\n" +"Thomas Lange \n" +"Mer. 10 Avr 2025\n" +":Date: une date\n" +":Revision: 6.4" + +#: fai-guide.txt:13 +msgid ":nfsrootsize: 1.1" +msgstr ":nfsrootsize: 1.1" + +#: fai-guide.txt:21 +msgid "" +"////\n" +" => _\n" +"path ''\n" +" => +\n" +" =>` ` (wie manref)\n" +" => _\n" +"////" +msgstr "" +"////\n" +" => _\n" +"path ''\n" +" => +\n" +" =>` ` (comme manref)\n" +" => _\n" +"////" + +#: fai-guide.txt:23 +msgid "" +"An older French version of this guide is available at https://fai-" +"project.org/fai-guide-fr." +msgstr "" +"Une version plus ancienne de ce guide en français est disponible à\n" +"https://fai-project.org/fai-guide-fr." + +#: fai-guide.txt:30 +msgid "" +"Abstract\n" +"--------\n" +"FAI is a non-interactive system to install, customize and manage Linux\n" +"systems and software configurations on computers as well as virtual\n" +"machines and chroot environments, from small networks to large\n" +"infrastructures and clusters." +msgstr "" +"Résumé\n" +"------\n" +"FAI est un système non-interactif pour installer, configurer et gérer des\n" +"systèmes Linux et les configurations de logiciels sur des ordinateurs comme sur des machines\n" +"virtuelles et des environnements chroot, depuis des petits réseaux jusqu'à de\n" +"grandes infrastructures et de grands clusters." + +#: fai-guide.txt:34 +msgid "" +"This manual describes the Fully Automatic Installation software. This\n" +"includes the installation of the packages, setting up the server, creating " +"of the\n" +"configuration and how to deal with errors." +msgstr "" +"Ce manuel décrit le logiciel Fully Automatic Installation (installation entièrement automatique).\n" +"Cela inclut l’installation des paquets, la configuration du serveur, la\n" +"création de la configuration et la gestion des erreurs." + +#: fai-guide.txt:37 +msgid "(c) 2000-2025 Thomas Lange" +msgstr "(c) 2000-2025 Thomas Lange" + +#: fai-guide.txt:44 +msgid "" +".Copyright\n" +"This manual is free software; you may redistribute it and/or modify it\n" +"under the terms of the GNU General Public License as published by the\n" +"Free Software Foundation; either version 2, or (at your option) any\n" +"later version." +msgstr "" +"Ce manuel est un logiciel libre; Vous pouvez le redistribuer et / ou le\n" +"modifier selon les termes de la Licence Publique Générale GNU publiée\n" +"par la Free Software Foundation; Soit la version 2, soit (à votre choix)\n" +"toute version ultérieure." + +#: fai-guide.txt:49 +msgid "" +"This is distributed in the hope that it will be useful, but *without\n" +"any warranty*; without even the implied warranty of merchantability or\n" +"fitness for a particular purpose. See the GNU General Public License\n" +"for more details." +msgstr "" +"Ceci est distribué dans l’espoir qu’il sera utile, mais sans aucune\n" +"garantie ; Sans même la garantie implicite de qualité marchande ou\n" +"d’adaptation à un usage particulier. Pour plus de détails, consultez la\n" +"License Générale Publique GNU." + +#: fai-guide.txt:55 +msgid "" +"A copy of the GNU General Public License is available as\n" +"'/usr/share/common-licenses/GPL' in the Debian GNU/Linux distribution\n" +"or on the World Wide Web at https://www.gnu.org/copyleft/gpl.html[the\n" +"GNU website] You can also obtain it by writing to the Free Software\n" +"Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, " +"USA." +msgstr "" +"Une copie de la Licence Générale Publique GNU est disponible sous la forme\n" +"/usr/share/common-licenses/GPL dans la distribution Debian GNU/Linux ou\n" +"sur le World Wide Web sur le site GNU Vous pouvez également l’obtenir en\n" +"écrivant à la Free Software Foundation , Inc., 59 Temple Place - Suite\n" +"330, Boston, MA 02111-1307, États-Unis." + +#: fai-guide.txt:57 +msgid "<<<" +msgstr "<<<" + +#: fai-guide.txt:60 +msgid "== [[introduction]]Introduction" +msgstr "== [[introduction]]Introduction" + +#: fai-guide.txt:62 +msgid "=== [[availability]]Availability" +msgstr "=== [[availability]]Disponibilité" + +#: fai-guide.txt:66 +msgid "" +"Homepage::\n" +"https://fai-project.org" +msgstr "" +"Page d'accueil::\n" +"https://fai-project.org" + +#: fai-guide.txt:69 +msgid "" +"FAI wiki::\n" +"https://wiki.fai-project.org" +msgstr "" +"Wiki FAI::\n" +"https://wiki.fai-project.org" + +#: fai-guide.txt:72 +msgid "" +"Download::\n" +"https://fai-project.org/download" +msgstr "" +"Téléchargement::\n" +"https://fai-project.org/download" + +#: fai-guide.txt:75 +msgid "" +"Entry for 'sources.list'::\n" +"`deb https://fai-project.org/download bookworm koeln`" +msgstr "" +"Entrée pour 'sources.list'::\n" +"`deb https://fai-project.org/download bookworm koeln`" + +#: fai-guide.txt:78 +msgid "" +"Manual pages::\n" +"https://fai-project.org/doc/man/" +msgstr "" +"Pages de manuel::\n" +"https://fai-project.org/doc/man/" + +#: fai-guide.txt:81 +msgid "" +"Mailing list::\n" +"https://lists.uni-koeln.de/mailman/listinfo/linux-fai" +msgstr "" +"Listes de diffusion::\n" +"https://lists.uni-koeln.de/mailman/listinfo/linux-fai" + +#: fai-guide.txt:85 +msgid "" +"Feedback::\n" +"Send feedback and comments to mailto:fai@fai-project.org[] or\n" +"to the mailing list." +msgstr "" +"Retour d'information::\n" +"Envoyez vos réflexions et vos commentaires à mailto:fai@fai-project.org[] ou\n" +"à la liste de diffusion." + +#: fai-guide.txt:88 +msgid "" +"Bugs::\n" +"Use the Debian bug tracking system (BTS) https://bugs.debian.org/src:fai" +msgstr "" +"Boguess::\n" +"Utiliser le système de suivi des bogues Debian (BTS) https://bugs.debian.org/src:fai" + +#: fai-guide.txt:91 +msgid "" +"User visible changes::\n" +"https://fai-project.org/NEWS" +msgstr "" +"Changements visibles par l’utilisateur::\n" +"http://fai-project.org/NEWS" + +#: fai-guide.txt:94 +msgid "" +"Source tree via git::\n" +"git clone git://github.com/faiproject/fai.git" +msgstr "" +"Arbre source via git::\n" +"git clone git://github.com/faiproject/fai.git" + +#: fai-guide.txt:97 +msgid "" +"View source tree via https::\n" +"https://github.com/faiproject/fai" +msgstr "" +"Voir l’arbre source avec https::\n" +" https://github.com/faiproject/fai" + +#: fai-guide.txt:103 +msgid "" +"The man pages always include up-to-date information and a lot of\n" +"details of all FAI commands. So, don't forget to read them carefully.\n" +"Now read this manual, then enjoy the fully automatic installation and\n" +"your saved time." +msgstr "" +"Les pages man incluent toujours des informations à jour et beaucoup de\n" +"détails sur toutes les commandes FAI. Alors, n’oubliez pas de les lire\n" +"attentivement. Lisez maintenant ce manuel, puis profitez de\n" +"l’installation entièrement automatique et de votre temps économisé." + +#: fai-guide.txt:105 +msgid "=== [[motivation]]Motivation" +msgstr "=== [[motivation]]Motivation" + +#: fai-guide.txt:109 +msgid "" +"Have you ever performed identical installations of an operating system\n" +"several times? Would you like to be able to install a Linux cluster\n" +"with dozens of nodes single handedly?" +msgstr "" +"Avez-vous déjà effectué des installations identiques d’un système\n" +"d’exploitation à plusieurs reprises? Souhaitez-vous être en mesure\n" +"d’installer un cluster Linux avec des dizaines de nœuds d'un seul coup?" + +#: fai-guide.txt:116 +msgid "" +"Repeating the same task again and again is boring -- and will surely\n" +"lead to errors. Also a whole lot of time could be saved if the\n" +"installations were done automatically. An installation process with\n" +"manual interaction does not scale. But clusters have the habit of\n" +"growing over the years. Think long-term rather than planning just a\n" +"few months into the future." +msgstr "" +"Répéter la même tâche encore et encore est ennuyeux -- et conduira\n" +"certainement à des erreurs. Aussi beaucoup de temps pourrait être sauvé\n" +"si les installations étaient faites automatiquement. Un processus\n" +"d’installation avec interaction manuelle ne peut pas passer à l'échelle. Mais les\n" +"grappes (clusters) ont l’habitude de croître au fil des ans. Pensez à long terme\n" +"plutôt que de planifier seulement quelques mois dans l’avenir." + +#: fai-guide.txt:142 +msgid "" +"In 1999, I had to perform an installation of a Linux cluster with one\n" +"server and 16 clients. Since I had much experience doing automatic\n" +"installations of Solaris operating systems on SUN SPARC hardware, the\n" +"idea to build an automatic installation for Debian was born. Solaris\n" +"has an automatic installation feature called JumpStart\n" +"footnote:[Solaris 8 Advanced Installation Guide at\n" +"https://docs.oracle.com/cd/E19455-01/806-0957/806-0957.pdf\n" +"]. In conjunction with the auto-install scripts\n" +"from Casper Dik\n" +"footnote:[http://www.science.uva.nl/pub/solaris/auto-install], I could\n" +"save a lot of time not only for every new SUN computer, but also for\n" +"re-installation of existing workstations. For example, I had to build\n" +"a temporary LAN with four SUN workstations for a conference, which\n" +"lasted only a few days. I took these workstations out of our normal\n" +"research network and set up a new installation for the conference.\n" +"When it was over, I simply integrated the workstations back into the\n" +"research network, rebooted just once, and after half an hour,\n" +"everything was up and running as before. The configuration of all\n" +"workstations was exactly the same as before the conference, because\n" +"everything was performed by the same installation process. I also used\n" +"the automatic installation for reinstalling a workstation after a\n" +"damaged hard disk had been replaced. It took two weeks until I\n" +"received the new hard disk but only a few minutes after the new disk\n" +"was installed, the workstation was running as before. And this is why\n" +"I choose to adapt this technique to a PC cluster running Linux." +msgstr "" +"En 1999, j’ai dû effectuer une installation d’un cluster Linux avec un\n" +"serveur et 16 clients. Puisque j’ai eu beaucoup d’expérience en faisant\n" +"des installations automatiques des systèmes d’exploitation de Solaris\n" +"sur le matériel de SUN SPARC, l’idée de construire une installation\n" +"automatique pour Debian est née. Solaris dispose d’une fonctionnalité\n" +"d’installation automatique appelée JumpStart\n" +"footnote:[Solaris 8 Advanced Installation Guide at \"https://docs.oracle.com/cd/E19455-01/806-0957/806-0957.pdf].\n" +"En conjonction avec les scripts d’auto-installation de Casper Dik\n" +"footnote:[http://www.science.uva.nl/pub/solaris/auto-install],\n" +"Je pouvais épargner beaucoup de temps non seulement pour chaque nouvel\n" +"ordinateur de SUN, mais aussi pour la réinstallation des postes de\n" +"travail existants. Par exemple, j’ai dû construire un LAN temporaire\n" +"avec quatre stations de travail SUN pour une conférence, qui a duré\n" +"seulement quelques jours. J’ai retiré ces postes de travail de notre\n" +"réseau de recherche habituel et mis en place une nouvelle installation\n" +"pour la conférence. Quand elle a été terminée, j’ai simplement réintégré les\n" +"postes de travail dans le réseau de recherche, redémarré une seule fois,\n" +"et après une demi-heure, tout était opérationnel comme avant. La\n" +"configuration de tous les postes de travail était exactement la même\n" +"qu’avant la conférence, car tout était effectué par le même processus\n" +"d’installation. J’ai également utilisé l’installation automatique pour\n" +"réinstaller un poste de travail après qu'un disque dur endommagé ait été\n" +"remplacé. Il m’a fallu deux semaines pour recevoir le nouveau disque\n" +"dur, mais seulement quelques minutes après l’installation du nouveau\n" +"disque, le poste de travail fonctionnait comme avant. Et c’est pourquoi\n" +"j’ai choisi d’adapter cette technique à un cluster de PC sous Linux." + +#: fai-guide.txt:147 +msgid "=== [[work]]How does FAI work" +msgstr "=== [[work]]Comment fonctionne FAI" + +#: fai-guide.txt:159 +msgid "" +"The install client which will be installed using FAI, is booted via\n" +"network card or from CD or USB stick. It gets an IP address and boots\n" +"a Linux kernel which mounts its root file system via NFS (the nfsroot)\n" +"from the\n" +"install server. After the kernel is started, the FAI startup script\n" +"performs the automatic installation which doesn't need any\n" +"interaction. First, the hard disks will be partitioned, file systems\n" +"are created and then software packages are installed. After that, the\n" +"new installed operating system is configured to your local needs using\n" +"some scripts. Finally, the new operating system will be booted from the\n" +"local disk." +msgstr "" +"Le client d’installation qui sera installé à l’aide de FAI, est démarré\n" +"via une carte réseau ou à partir d’un CD ou d’une clé USB. Il obtient\n" +"une adresse IP et démarre un noyau Linux qui monte son système de\n" +"fichiers racine via NFS (nfsroot) du serveur d’installation. Une fois le\n" +"noyau démarré, le script de démarrage FAI exécute l’installation\n" +"automatique qui n’a pas besoin d’interaction. Tout d’abord, les disques\n" +"durs seront partitionnés, les systèmes de fichiers seront créés et des\n" +"paquets logiciels seront ensuite installés. Après cela, le nouveau système\n" +"d’exploitation installé est configuré selon vos besoins locaux en\n" +"utilisant quelques scripts. Enfin, le nouveau système d’exploitation\n" +"sera démarré à partir du disque local." + +#: fai-guide.txt:166 +msgid "" +"The details of how to install the computer (the configuration) are\n" +"stored in the configuration space on the install server. Configuration\n" +"files are shared among groups of computers if they are similar using\n" +"the class concept. So you need not create a configuration for every\n" +"new host. Hence, FAI is a scalable method to install a big cluster\n" +"with a great number of nodes even if their configuration is not identical." +msgstr "" +"Les détails sur la façon d’installer l’ordinateur (la configuration)\n" +"sont stockés dans l’espace de configuration sur le serveur d’installation.\n" +"Les fichiers de configuration sont répartis entre des groupes\n" +"d’ordinateurs s’ils sont similaires, en utilisant le concept de classe.\n" +"Vous n’avez donc pas besoin de créer une configuration pour chaque\n" +"nouvel hôte. Ainsi, FAI est une méthode évolutive pour\n" +"installer un gros cluster avec un grand nombre de nœuds même si leur\n" +"configuration n’est pas identique." + +#: fai-guide.txt:173 +msgid "" +"FAI can also be used as a rescue system or for hardware inventory. You can " +"boot your\n" +"computer, but it will not perform an installation. Instead it will run\n" +"a fully functional Debian GNU/Linux without using the local hard\n" +"disks. Then you\n" +"can do a remote login and backup or restore a disk partition, check a\n" +"file system, inspect the hardware or do any other task." +msgstr "" +"FAI peut également être utilisé comme un système de sauvetage ou pour\n" +"l’inventaire matériel. Vous pouvez démarrer votre ordinateur, mais il\n" +"n’effectuera pas une installation. Au lieu de cela, il exécutera un\n" +"Debian GNU / Linux entièrement fonctionnel sans utiliser les disques\n" +"durs locaux. Ensuite, vous pouvez effectuer une connexion à distance et\n" +"sauvegarder ou restaurer une partition de disque, vérifier un système de\n" +"fichiers, inspecter le matériel ou effectuer toute autre tâche." + +#: fai-guide.txt:176 +msgid "=== [[features]]Features" +msgstr "=== [[features]]Caractéristiques" + +#: fai-guide.txt:199 +msgid "" +"* A fully automated installation can be performed.\n" +"* Very quick unattended installation.\n" +"* Flexible system through easy class concept.\n" +"* Update of running systems without re-installation.\n" +"* Cloud images for virtualization environment.\n" +"* Hosts can boot from network card, CD, USB stick.\n" +"* Simple creation of an installation or live ISO.\n" +"* PXE with DHCP boot method is supported.\n" +"* ReiserFS, ext3/ext4, btrfs and XFS file system support.\n" +"* Software RAID and LVM support. LUKS support.\n" +"* Automatic hardware detection.\n" +"* You can deploy Debian, Ubuntu, Rocky Linux, CentOS, AlmaLinux, SuSE\n" +"* Remote login via ssh during installation process possible.\n" +"* All similar configurations are shared among all install clients.\n" +"* Log files for all installations are saved to the installation server.\n" +"* Shell, Perl, Python, Ruby, expect and CFEngine scripts are supported " +"during the customization step.\n" +"* Support for many protocols like NFS, FTP, HTTPS, git.\n" +"* Can be used as a rescue system and for hardware inventory.\n" +"* Diskless client support.\n" +"* Cross-architecture support e.g. for embedded devices.\n" +"* Easily add your own functions via hooks or change the default behavior.\n" +"* Cloning machines using disk images is supported." +msgstr "" +"* On peut faire une installation entièrement automatisée.\n" +"* Installation très rapide sans surveillance.\n" +"* Système flexible grâce à un concept de classe simple.\n" +"* Mise à jour des systèmes en cours d’exécution sans réinstallation.\n" +"* Images « Cloud » pour un environnement de virtualisation.\n" +"* Les hôtes peuvent démarrer à partir d’une carte réseau, d’un CD, d’une clé USB.\n" +"* Création simple d’une image ISO vive ou pour l'installation.\n" +"* Prise en charge de PXE avec la méthode de démarrage DHCP.\n" +"* Support des systèmes de fichiers ReiserFS, ext3/ext4, btrfs et XFS.\n" +"* Support logiciel RAID et LVM. Support LUKS.\n" +"* Détection automatique du matériel.\n" +"* On peut déployer Debian, Ubuntu, Rocky Linux, CentOS, AlmaLinux, SuSE\n" +"* Possibilité de connexion à distance via ssh lors du processus d’installation.\n" +"* Toutes les configurations similaires sont partagées entre tous les les clients d’installation.\n" +"* Les fichiers journaux de toutes les installations sont enregistrés sur le serveur d’installation.\n" +"* Prise en charge des scripts Shell, Perl, Python, Ruby, expect et CFEngine lors de l'étape de personnalisation.\n" +"* Prise en charge de nombreux protocoles comme NFS, FTP, HTTP, git.\n" +"* Peut être utilisé comme un système de sauvetage et pour l’inventaire matériel.\n" +"* Prise en charge de clients sans disque.\n" +"* Prise en charge trans-architecture, par exemple pour des appareils embarqués (embedded devices).\n" +"* Ajoutez facilement vos propres fonctions via des hooks ou modifiez le comportement par défaut.\n" +"* Prise en charge du clonage de machines utilisant des images de disque." + +#: fai-guide.txt:202 +msgid "=== Installation times" +msgstr "=== La durée d'installation" + +#: fai-guide.txt:206 +msgid "" +"The installation time is determined by the amount of software and\n" +"the speed of the hard disk. Here are some sample\n" +"times. All install clients had a 1Gbit network card installed." +msgstr "" +"La durée d’installation est déterminée par la quantité de logiciel et la\n" +"vitesse du disque dur. Voici quelques exemples de durée. Tous les\n" +"clients d’installation avaient une carte réseau 1Gbit installée." + +#: fai-guide.txt:215 +msgid "" +"[width=\"80%\",cols=\"<4,^2,<3,>4,>2\",options=\"header\"]\n" +"|=================================================================\n" +"| CPU | RAM | Disk | Software installed | time\n" +"| i7-3770T 2.50GHz | 8GB| SSD | 6 GB software | 8.5 min\n" +"| Core-i7 3.2GHz | 6GB| SATA disk| 4.3GB software | 7 min\n" +"| Core-i7 3.2GHz | 6GB| SATA disk| 471 MB software | 77sec\n" +"| Intel Core2 Duo | 2GB| SATA disk| 3 GB software | 14 min\n" +"|=================================================================" +msgstr "" +"[width=\"80%\",cols=\"<4,^2,<3,>4,>2\",options=\"header\"]\n" +"|=================================================================\n" +"| CPU | RAM | Disque | Logiciels installés | durée\n" +"| i7-3770T 2.50GHz | 8GB| SSD | 6 GB logiciel | 8.5 min\n" +"| Core-i7 3.2GHz | 6GB| SATA disk| 4.3GB logiciel | 7 min\n" +"| Core-i7 3.2GHz | 6GB| SATA disk| 471 MB logiciel | 77sec\n" +"| Intel Core2 Duo | 2GB| SATA disk| 3 GB logiciel | 14 min\n" +"|=================================================================" + +#: fai-guide.txt:220 +msgid "== [[impatient]]Quickstart - For the impatient user" +msgstr "== [[impatient]]Quickstart - Pour l'utilisateur impatient" + +#: fai-guide.txt:222 +msgid "=== [[first]]My first installation" +msgstr "=== [[first]]Ma première installation" + +#: fai-guide.txt:224 +msgid "" +"Without further ado, this section will provide a quick and easy " +"demonstration of a fully automatic installation using the FAI CD and a " +"virtual machine." +msgstr "" +"Sans plus tarder, cette section fournira une démonstration rapide et\n" +"facile d’une installation entièrement automatique à l’aide du CD FAI et\n" +"d’une machine virtuelle." + +#: fai-guide.txt:228 +msgid "" +"Just download the CD ISO image from https://fai-project.org/fai-cd and boot\n" +"your VM using this CD. You will see a grub menu where you can select\n" +"from different installation types." +msgstr "" +"Il suffit de télécharger l' image ISO du CD à partir de\n" +"https://fai-project.org/fai-cd et de démarrer votre VM à l’aide de ce CD.\n" +"Vous verrez un menu grub où vous pouvez choisir parmi différents types\n" +"d’installation." + +#: fai-guide.txt:233 +msgid "" +"This installation will run without an install server. The CD\n" +"installation is the same as when run in a network environment using\n" +"the FAI install server and can also be used from USB stick on a real\n" +"computer." +msgstr "" +"Cette installation s’exécutera sans serveur d’installation.\n" +"L’installation à partir du CD est identique à celle exécutée dans un\n" +"environnement réseau à l’aide du serveur d’installation FAI, et peut être aussi\n" +"effectuée à l'aide d'une clé USB sur un ordinateur physique." + +#: fai-guide.txt:237 +msgid "" +"You can also create yourself a custom fully automated installation\n" +"image on the webpage https://fai-project.org/FAIme without the need of\n" +"installing FAI on your computer." +msgstr "" +"On peut aussi créer soi-même une image FAI (installation entièrement automatique)\n" +"à la page web https://fai-project.org/FAIme sans avoir besoin d'installer\n" +"FAI sur son ordinateur." + +#: fai-guide.txt:240 +msgid "=== [[cdserver]]My first server installation" +msgstr "=== [[cdserver]]Ma première installation à l'aide d'un serveur" + +#: fai-guide.txt:243 +msgid "" +"We will create a private network and start two virtual machines. One\n" +"will become your own FAI server, the other will be an install client." +msgstr "" +"Nous allons créer un réseau privé et lancer deux machines vituelles. L'une\n" +"deviendra votre propre serveur FAI, l'autre sera un client d'installation." + +#: fai-guide.txt:251 +msgid "" +"If you intend to use VMware or VirtualBox, ensure that your client\n" +"uses a bridged network connection. A detailed description is in the\n" +"FAI wiki\n" +"footnote:[https://wiki.fai-project.org/index.php/" +"VirtualBox_for_your_first_FAI_installation]. Also,\n" +"it is not possible to use\n" +"bridged network interfaces over wireless, as most WiFi network cards\n" +"do not support this feature." +msgstr "" +"Si vous avez l’intention d’utiliser VMware ou VirtualBox, assurez-vous\n" +"que votre client utilise une connexion réseau pontée (bridged network).\n" +"On trouve une description détaillée dans le wiki FAI\n" +"footnote:[https://wiki.fai-project.org/index.php/VirtualBox_for_your_first_FAI_installation].\n" +"on ne peut pas utiliser des interfaces réseau pontées via le réseau sans\n" +"fil, car la plupart des cartes réseau WiFi ne prennent pas en charge\n" +"cette fonctionnalité." + +#: fai-guide.txt:254 +msgid "" +"When using Qemu/KVM and the `fai-kvm` wrapper you can create the\n" +"network using the command `fai-mk-network`. First install some packages" +msgstr "" +"Quand on utilise Qemu/KVM et le script `fai-kvm` on peut créer le réseau à l'aide de\n" +"la commande `fai-mk-network`. Il faut commencer par installer quelques paquets logiciels" + +#: fai-guide.txt:258 +msgid "" +"----\n" +"# apt-get install qemu-system-gui qemu-kvm qemu-utils\n" +"----" +msgstr "" +"----\n" +"# apt-get install qemu-system-gui qemu-kvm qemu-utils\n" +"----" + +#: fai-guide.txt:264 +msgid "" +"The next command sets up a private network with a software bridge with " +"several tap devices\n" +"that belong to the user ++.\n" +"----\n" +"fai-mk-network \n" +"----" +msgstr "" +"La commande ci-dessous met en place un réseau privé avec un pont logiciel et plusieurs\n" +"TAPs réseau\n" +"footnote:[https://fr.wikipedia.org/wiki/TAP_r%C3%A9seau]\n" +"appartenant à l'utilisateur ++.\n" +"----\n" +"fai-mk-network \n" +"----" + +#: fai-guide.txt:272 +msgid "" +"After that, you can use fai-kvm (-h will give you some help) for\n" +"starting virtual machines using KVM that are connected to this private\n" +"network. Be careful. By default, fai-kvm will create the disk images\n" +"for the virtual machines in +/tmp+, which is a RAM disk on most\n" +"systems. It's no problem to create an empty 20G disk image in /tmp\n" +"(even if this partition is of 4GB size), but while the VM is writing\n" +"data to its disk, this will start to consume space in +/tmp+." +msgstr "" +"Après cela, vous pouvez utiliser fai-kvm (-h vous aidera) pour démarrer\n" +"des machines virtuelles en utilisant KVM qui sont connectés à ce réseau\n" +"privé. Faites attention. Par défaut, fai-kvm créera les images de disque\n" +"pour les machines virtuelles dans `+/tmp+`, qui est un disque RAM sur la plupart des\n" +"systèmes. Il n’y a aucun problème à créer une image de disque vide de\n" +"20G dans /tmp (même si cette partition est de 4 Go de taille), mais\n" +"alors que la VM écrit des données sur son disque, cela commencera à\n" +"consommer de l’espace dans `+/tmp+`." + +#: fai-guide.txt:279 +msgid "" +"Start the first virtual host, which will become the FAI server\n" +"footnote:[This installation will consume about 2GB of space in\n" +"+/tmp+.]:\n" +"----\n" +"fai-kvm -Vn -s20 -u 1 cd faicd64-small.iso\n" +"----" +msgstr "" +"Démarrez le premier hôte virtuel, qui deviendra le serveur FAI\n" +"footnote:[Cette installation utilisera environ 2GB d'espace dans +/tmp+.] :\n" +"----\n" +"fai-kvm -Vn -s20 -u 1 cd faicd64-small.iso\n" +"----" + +#: fai-guide.txt:286 +msgid "" +"In the grub menu select +faiserver, using internal DHCP and a fixed IP+. " +"This will install a host called\n" +"faiserver with IP 192.168.33.250 which contains all software needed\n" +"for a FAI server. It will also set up a local package cache (using\n" +"apt-cacher-ng). Once the installation is finished, reboot the\n" +"machine. During the first boot of the new system, it will\n" +"automatically set up the nfsroot. This may take some minutes." +msgstr "" +"Dans le menu grub; sélectionnez +faiserver, using internal DHCP and a fixed IP+.\n" +"Cela va installer\n" +"un hôte appelé faiserver avec IP 192.168.33.250 qui contient tous les\n" +"logiciels nécessaires pour un serveur FAI. Il configurera également un\n" +"cache de paquets local (en utilisant apt-cacher-ng). Une fois\n" +"l’installation terminée, redémarrez la machine. Lors du premier\n" +"démarrage du nouveau système, il configurera automatiquement le nfsroot.\n" +"Cela peut prendre quelques minutes." + +#: fai-guide.txt:291 +msgid "" +"After that you can start additional hosts using network boot. For\n" +"every new host, you have to use a different value for `-u`, which will be " +"used for\n" +"generating different MAC addresses and using different disk image file\n" +"names." +msgstr "" +"Après cela, vous pouvez démarrer des hôtes supplémentaires en utilisant\n" +"un démarrage réseau. Pour chaque nouvel hôte, vous devez utiliser une\n" +"valeur différente pour `+-u+`, qui sera utilisée pour générer des\n" +"adresses MAC différentes et utiliser des noms de fichier d’image de\n" +"disque différents." + +#: fai-guide.txt:295 +msgid "" +"----\n" +"fai-kvm -Vn -u 2 pxe\n" +"----" +msgstr "" +"----\n" +"fai-kvm -Vn -u 2 pxe\n" +"----" + +#: fai-guide.txt:302 +msgid "" +"Those install clients will show you a menu, where you can select which\n" +"type of installation you like to perform. If the install client does\n" +"not find the server, it is usually because fai-monitor is no longer\n" +"running on it. This can happen, if you reboot the faiserver after the\n" +"installation. To remedy this, simply run fai-monitor on the faiserver\n" +"and re-attempt the client boot." +msgstr "" +"Ces clients d’installation vous montreront un menu, où vous pouvez\n" +"sélectionner le type d’installation que vous souhaitez effectuer. Si le\n" +"client d’installation ne trouve pas le serveur, c’est généralement parce\n" +"que fai-monitor n'y fonctionne plus. Cela peut se produire si vous\n" +"redémarrez le faiserver après l’installation. Pour remédier à cela,\n" +"exécutez simplement fai-monitor sur le faiserver et relancez le\n" +"démarrage du client." + +#: fai-guide.txt:307 +msgid "" +"Another client could be started with:\n" +"----\n" +"fai-kvm -Vn -u 3 pxe\n" +"----" +msgstr "" +"Un autre client pourrait être lancé avec:\n" +"----\n" +"fai-kvm -Vn -u 3 pxe\n" +"----" + +#: fai-guide.txt:311 +msgid "" +"You can start as many machines in the network as tap devices are\n" +"available. All these machines can connect to the outside internet but are\n" +"only reachable from your host machine." +msgstr "" +"Vous pouvez démarrer autant de machines dans le réseau que de TAPs réseau\n" +"disponibles. Toutes ces machines peuvent se\n" +"connecter à l’Internet extérieur, mais sont seulement accessibles à\n" +"partir de votre machine hôte." + +#: fai-guide.txt:313 +msgid "== [[overview]]Overview and Concepts" +msgstr "== [[overview]]Vue d'ensemble et Concepts" + +#: fai-guide.txt:326 +msgid "" +"FAI is a non-interactive system to install, customize and manage Linux\n" +"systems and software configurations on computers as well as virtual\n" +"machines and chroot environments, from small networks to large\n" +"infrastructures and clusters. You can take one or more virgin PCs,\n" +"turn on the power and after a few minutes Linux is installed,\n" +"configured and running on the whole cluster, without any interaction\n" +"necessary. Thus, it's a scalable method for installing and updating a\n" +"cluster unattended with little effort involved. FAI uses the\n" +"Linux operating system and a collection of shell and Perl scripts for\n" +"the installation process. Changes to the configuration files of the\n" +"operating system can be made by CFEngine, shell (bash and zsh), Perl,\n" +"Python, Ruby and expect scripts." +msgstr "" +"FAI est un système non interactif permettant d’installer, de\n" +"personnaliser et de gérer les configurations de systèmes et de logiciels\n" +"Linux sur les ordinateurs ainsi que sur les machines virtuelles et les\n" +"environnements chroot, des petits réseaux aux grandes infrastructures et\n" +"clusters. Vous pouvez prendre un ou plusieurs PC vierges, mettre sous\n" +"tension et après quelques minutes, Linux est installé, configuré et\n" +"fonctionnel sur l’ensemble du cluster, sans aucune interaction nécessaire.\n" +"Ainsi, il s’agit d’une méthode évolutive pour installer et mettre à jour\n" +"un cluster sans surveillance impliquant peu d’efforts. FAI utilise\n" +"le système d’exploitation Linux et une collection de scripts shell et\n" +"Perl pour le processus d’installation. Les modifications apportées aux\n" +"fichiers de configuration du système d’exploitation peuvent être\n" +"effectuées par des scripts CFEngine, shell (bash et zsh), Perl, Python, Ruby et\n" +"expect." + +#: fai-guide.txt:335 +msgid "" +"FAI's target group are system administrators who have to install Linux\n" +"onto one or even hundreds of computers. Because it's a general purpose\n" +"installation tool, it can be used for installing a Beowulf cluster, a\n" +"rendering farm or a Linux laboratory or a classroom. Also large-scale\n" +"Linux networks with different hardware or different installation\n" +"requirements are easy to establish using FAI. But don't forget to plan\n" +"your installation. Chapter <> has some useful hints for this\n" +"topic." +msgstr "" +"Les personnes intéressées par FAI sont des administrateurs système qui doivent\n" +"installer Linux sur une ou même des centaines d’ordinateurs. Parce qu’il\n" +"s’agit d’un outil d’installation à usage général, il peut être utilisé\n" +"pour l’installation d’un cluster Beowulf, d’une ferme de rendu ou\n" +"d’un laboratoire Linux ou d’une salle de classe. De plus, des réseaux\n" +"Linux de grande envergure avec différents matériels ou différentes\n" +"exigences d’installation sont faciles à établir à l’aide de FAI. Mais\n" +"n’oubliez pas de planifier votre installation. Le chapitre\n" +"<> contient quelques conseils utiles à ce sujet." + +#: fai-guide.txt:337 +msgid "=== [[terms]] Important Terms" +msgstr "=== [[terms]] Terminologie" + +#: fai-guide.txt:339 +msgid "First, some terms used in this manual are described." +msgstr "Commençons par décrire quelques termes utilisés dans ce manuel." + +#: fai-guide.txt:344 +msgid "" +"install server::\n" +"It provides DHCP, TFTP and NFS services and the configuration data for\n" +"all install clients. In the examples of this manual this host is\n" +"called 'faiserver'. The host where the package 'fai-server' is installed." +msgstr "" +"Le serveur d'installation ::\n" +"Il fournit les services DHCP, TFTP et NFS ainsi que les données de\n" +"configuration pour tous les clients d’installation. Dans les exemples\n" +"de ce manuel, cet hôte s’appelle 'faiserver'. C'est l’hôte où le paquet\n" +"'faiserver' est installé." + +#: fai-guide.txt:350 +msgid "" +"install client::\n" +"A host which will be installed using FAI and a configuration provided\n" +"by the install server. Also called client for short. In this manual,\n" +"the example hosts are called 'demohost, xfcehost, gnomehost ...'\n" +"This computer should boot from its network interface using PXE." +msgstr "" +"Le client d'installation ::\n" +"Un hôte qui sera installé à l’aide de FAI et une configuration fournie\n" +"par le serveur d’installation. Aussi appelé client pour faire court. Dans\n" +"ce manuel, les hôtes d’exemple sont appelés demohost, xfcehost,\n" +"gnomehost … Cet ordinateur doit démarrer à partir de son interface\n" +"réseau à l’aide de PXE." + +#: fai-guide.txt:356 +msgid "" +"configuration space::\n" +"A subdirectory structure containg several files. Those files describe\n" +"the details of how the installation of the clients will be\n" +"performed. All configuration data is stored here. It's also called\n" +"config space for short. It includes information about:" +msgstr "" +"Espace de configuration::\n" +"Une structure de sous-répertoire contenant plusieurs fichiers. Ces\n" +"fichiers décrivent les détails de la manière dont l’installation des\n" +"clients sera effectuée. Toutes les données de configuration sont\n" +"stockées là. Il est également appelé _config space_ pour faire court. Il\n" +"comprend des informations sur :" + +#: fai-guide.txt:362 +msgid "" +"* Hard disk layout in a format similar to fstab\n" +"* Local file systems, their types, mount points and mount options\n" +"* Software packages\n" +"* Keyboard layout, time zone, Xorg configuration, remote file\n" +" systems, user accounts, printers ..." +msgstr "" +"* Organisation du disque dur dans un format similaire à fstab\n" +"* Systèmes de fichiers locaux, leurs types, points de montage et options de montage\n" +"* Paquets logiciels\n" +"* Disposition du clavier, fuseau horaire, configuration Xorg, systèmes de fichiers distants, comptes utilisateurs, imprimantes …" + +#: fai-guide.txt:369 +msgid "" +"+\n" +"The package _fai-doc_ includes a sample configuration space including\n" +"examples for hosts using the XFCE and GNOME environment amongst other\n" +"examples. Calling `fai-mk-configspace` copies these examples to\n" +"'/srv/fai/config'. It's recommended to study those config files and\n" +"scripts for easier understanding how FAI works." +msgstr "" +"+\n" +"Le package _fai-doc_ inclut un exemple d’espace de configuration\n" +"incluant des exemples pour les hôtes utilisant l’environnement XFCE et\n" +"GNOME entre autres. En invoquant `fai-mk-configspace` on copie ces exemples vers\n" +"'/srv/fai/config'. Il est recommandé d'étudier ces fichiers de configuration et\n" +"ces scripts pour mieux comprendre comment FAI fonctionne." + +#: fai-guide.txt:376 +msgid "" +"nfsroot, NFS-Root::\n" +"A file system located on the install server. During the installation\n" +"process it's the complete file system for the install clients. All\n" +"clients share the same nfsroot, which they mount read only. The\n" +"nfsroot needs about {nfsrootsize}GB of free disk space." +msgstr "" +"nfsroot, NFS-Root ::\n" +"Un système de fichiers situé sur le serveur d’installation. Pendant le\n" +"processus d’installation, c’est le système de fichiers complet pour\n" +"les clients d’installation. Tous les clients partagent le même\n" +"nfsroot, qu’ils montent en lecture seule. Le nfsroot a besoin\n" +"d’environ {nfsrootsize}Go d’espace disque libre." + +#: fai-guide.txt:381 +msgid "" +"TFTP::\n" +"Serves clients the initrd and kernel that is used for the installation " +"process.\n" +"Along with the file system served by NFS, these two make up a temporary\n" +"OS in which the installations are performed." +msgstr "" +"TFTP ::\n" +"Sert aux clients le fichier initrd et le noyau utilisés pour le processus\n" +"d’installation. Avec le système de fichiers servi par NFS, ces deux\n" +"composent un système d'exploitation temporaire dans lequel les installations sont\n" +"réalisées." + +#: fai-guide.txt:387 +msgid "" +"FAI classes::\n" +"Classes are names which determine which configuration file is\n" +"selected. If a client belongs to class WEBSERVER, it will be configured\n" +"as a webserver, the class DESKTOP for e.g. determines which software\n" +"packages will be installed." +msgstr "" +"Classes FAI ::\n" +"Les classes sont des noms qui déterminent quel fichier de\n" +"configuration est sélectionné. Si un client appartient à la classe\n" +"WEBSERVER, il sera configuré en tant que serveur Web, la classe\n" +"DESKTOP pour, par exemple, déterminer les paquets logiciels qui seront\n" +"installés." + +#: fai-guide.txt:393 +msgid "" +"profile::\n" +"A FAI profile is just a list of FAI classes assiged to a profile name,\n" +"which is extended by a description of this profile. I.e. one could have\n" +"two \"Webserver\" profiles, one including the APACHE class another including " +"the NGINX class,\n" +"to then install the respective webserver solution." +msgstr "" +"profil ::\n" +"Un profil FAI est juste une liste de classes FAI assignées à un nom de\n" +"profil, qui est étendu par une description de ce profil. C’est-à-dire\n" +"que l’on peut avoir deux profils \"Webserver\", l’un incluant la classe\n" +"APACHE, et un autre incluant la classe NGINX, pour ensuite installer la solution\n" +"de serveur web correspondante." + +#: fai-guide.txt:399 +msgid "" +"tasks::\n" +"The installation of a client consists of several parts, which are called " +"tasks.\n" +"Tasks are predefined subroutines which perform a certain part of the\n" +"FAI. The following FAI tasks are performed during an installation\n" +"on the install clients." +msgstr "" +"les tâches ::\n" +"L’installation d’un client se compose de plusieurs parties, appelées\n" +"tâches. Les tâches sont des sous-programmes prédéfinis qui effectuent\n" +"une certaine partie de la FAI. Les tâches FAI suivantes sont exécutées\n" +"au cours d’une installation sur les clients d’installation." + +#: fai-guide.txt:422 +msgid "" +"____\n" +" confdir\t\t# get the config space\n" +" setup\t\t\t# some initialization, start sshd on demand\n" +" defclass\t\t# define FAI classes\n" +" defvar\t\t# define variables\n" +" action\t\t# evaluate FAI_ACTION\n" +" install\t\t# Start the installation\n" +" partition\t\t# partition the harddisks, create file systems\n" +" mountdisks\t\t# mount the file systems\n" +" extrbase\t\t# extract the base.tar.xz\n" +" debconf\t\t# do the Debian debconf preseeding\n" +" repository\t\t# prepare access to the package repository\n" +" updatebase\t\t# Set up package tools and update packages\n" +" instsoft\t\t# install software packages\n" +" configure\t\t# call customization scripts\n" +" finish\t\t# do some cleanup, show installation statistics\n" +" tests\t\t\t# call tests if defined\n" +" chboot\t\t# call fai-chboot on the install server\n" +" savelog\t\t# save log files to local and remote location\n" +" faiend\t\t# reboot host, eject CD if needed\n" +"____\n" +"____" +msgstr "" +"____\n" +" confdir\t\t# trouver l'espace de configuration\n" +" setup\t\t\t# quelques initialisations, lancement de sshd à la demande\n" +" defclass\t\t# définition des classes FAI\n" +" defvar\t\t# définition de variables\n" +" action\t\t# évaluer FAI_ACTION\n" +" install\t\t# Démarrer l'installation\n" +" partition\t\t# partitionner les disques durs, créer les systèmes de fichiers\n" +" mountdisks\t\t# monter les systèmes de fichiers\n" +" extrbase\t\t# extraire le fichier base.tar.xz\n" +" debconf\t\t# pré-ensemencer le deconf de Debian\n" +" repository\t\t# préparer l'accès aux dépôts de paquets\n" +" updatebase\t\t# mettre en place les outils de gestion de paquets et mettre les paquets à jour\n" +" instsoft\t\t# installer les paquets logiciels\n" +" configure\t\t# lancer les scripts de personnalisation\n" +" finish\t\t# faire un peu de ménage, afficher les statistiques d'installation\n" +" tests\t\t\t# appeler des tests s'il y en a\n" +" chboot\t\t# lancer fai-chboot sur le serveur d'installation\n" +" savelog\t\t# enregistrer les fichiers de journalisation localement et à distance\n" +" faiend\t\t# redémarrage de l'hôte, éjection du CD si nécessaire\n" +"____\n" +"____" + +#: fai-guide.txt:424 +msgid "" +"These are tasks, which are only executed when a different action is performed" +msgstr "Voilà des tâches qui sont exécutées seulement lorsqu’on fait une action différente" + +#: fai-guide.txt:430 +msgid "" +" dirinstall \t # install a chroot environment\n" +" softupdate\t # only do the system configuration\n" +" sysinfo # print detailed system information\n" +" inventory # print short hardware inventory list\n" +"____" +msgstr "" +" dirinstall \t # installer un environnement chroot\n" +" softupdate\t # ne faire que la configuration du système\n" +" sysinfo # imprimer une information système détaillée\n" +" inventory # imprimer un inventaire court du matériel\n" +"____" + +#: fai-guide.txt:432 +msgid "For a more in-depth description of _tasks_ , see <>." +msgstr "Pour une description plus détaillée des _tâches_ , voir <>." + +#: fai-guide.txt:435 +msgid "" +"Note that you are not limited to the FAI tasks. You can also define " +"additional programs or scripts which will be run\n" +"on particular occasions. They are called _hooks_." +msgstr "" +"Notez que vous n'êtes pas limité aux tâches FAI. Vous pouvez également\n" +"définir des programmes ou des scripts supplémentaires qui seront\n" +"exécutés à certaines occasions. On les appelle des _hooks_." + +#: fai-guide.txt:440 +msgid "" +"hooks::\n" +"Hooks are plugins, they can add additional functionality to the installation " +"process\n" +"or even replace entire tasks of FAI. Hooks are explained in detail in\n" +"<>." +msgstr "" +"hooks::\n" +"Les Hooks sont des plugins, ils peuvent ajouter des fonctionnalités\n" +"supplémentaires au processus d’installation ou même remplacer des\n" +"tâches entières de FAI. Les Hooks sont expliqués en détail dans\n" +"<>." + +#: fai-guide.txt:442 +msgid "=== [[classc]]The class concept" +msgstr "=== [[classc]]Le concept de classe" + +#: fai-guide.txt:451 +msgid "" +"Classes are used in nearly all tasks of the installation. Classes\n" +"determine which configuration files to choose from a list of available\n" +"alternatives. To determine which config files to use, FAI searches the\n" +"list of defined classes and uses all configuration files that match a\n" +"class name footnote:[It's also possible to use only the configuration\n" +"file with the highest priority since the order of classes define a\n" +"priority from low to high within the list of classes. ]. The following loop " +"implements\n" +"this function in pseudo shell code:" +msgstr "" +"Les classes sont utilisées dans presque toutes les tâches de\n" +"l’installation. Les classes déterminent quels fichiers de configuration\n" +"choisir parmi une liste d’alternatives disponibles. Pour déterminer les\n" +"fichiers de configuration à utiliser, FAI recherche dans la liste des classes\n" +"définies et utilise tous les fichiers de configuration correspondant à\n" +"un nom de classe footnote:[on peut aussi seulement utiliser le fichier de configuration\n" +"qui a la priorité la plus élevée, comme l'ordre des classes définit une\n" +"priorité de la plus basse à la plus élevée dans la liste des classes. ]. La boucle suivante\n" +"implémente cette fonction en pseudo-code shell :" + +#: fai-guide.txt:460 +msgid "" +"----\n" +"for class in $all_classes; do\n" +" if [ -r $config_dir/$class ]; then # if a file with name $class " +"exists\n" +" your_command $config_dir/$class # call a command with this file " +"name\n" +" # exit if only the first matching file is needed\n" +" fi\n" +"done\n" +"----" +msgstr "" +"----\n" +"for class in $all_classes; do\n" +" if [ -r $config_dir/$class ]; then # s'il exite un fichier nommé $class\n" +" your_command $config_dir/$class # invoquer une commande avec ce nom de fichier\n" +" # sortir si on n'a besoin que du premier fichier qui convient\n" +" fi\n" +"done\n" +"----" + +#: fai-guide.txt:464 +msgid "" +"The very nice feature of this is that you can add a new configuration\n" +"alternative and it will automatically be used by FAI without changing\n" +"the code, if the configuration file uses a class name." +msgstr "" +"La beauté de ceci c'est qu'on peut ajouter\n" +"une nouvelle alternative de configuration et qu'elle sera automatiquement\n" +"utilisée par FAI sans modifier le code, si le fichier de configuration\n" +"utilise un nom de classe." + +#: fai-guide.txt:471 +msgid "" +"This is because the loop automatically detects new configuration files\n" +"that should be used.\n" +"The idea of using classes in general and using certain files matching\n" +"a class name for a configuration is adopted from the installation\n" +"scripts by Casper Dik for Solaris. This technique proved to be very\n" +"useful and easy." +msgstr "" +"C’est parce que la boucle détecte automatiquement les nouveaux fichiers\n" +"de configuration qui doivent être utilisés. L’idée d’utiliser des\n" +"classes en général et d’utiliser certains fichiers correspondant à un\n" +"nom de classe pour une configuration est adoptée à partir des scripts\n" +"d’installation par Casper Dik pour Solaris. Cette technique s’est avérée\n" +"très utile et facile." + +#: fai-guide.txt:477 +msgid "" +"You can group multiple hosts that share the same configuration\n" +"files by using the same class. You can also split the whole\n" +"configuration data for all clients into several classes and use them\n" +"like lego bricks and build the entire configuration for a single\n" +"client by assembling the bricks together." +msgstr "" +"Vous pouvez regrouper plusieurs hôtes partageant les mêmes fichiers de\n" +"configuration en utilisant la même classe. Vous pouvez également diviser\n" +"l’ensemble des données de configuration pour tous les clients en\n" +"plusieurs classes et les utiliser comme des briques de lego et\n" +"construire la configuration entière pour un seul client en assemblant\n" +"les briques." + +#: fai-guide.txt:482 +msgid "" +"If a client belongs to class _A_, we say the class _A_\n" +"is defined for this client. A class has no value, it is just defined or\n" +"undefined." +msgstr "" +"Si un client appartient à la classe _A_, on dit que la classe _A_\n" +"est définie pour ce client. Une classe n’a pas de valeur, elle est juste\n" +"définie ou indéfinie." + +#: fai-guide.txt:488 +msgid "" +"Classes determine how the installation is performed. For example, an " +"install\n" +"client can be configured to get the XFCE desktop by just adding the\n" +"class _XFCE_ to it. Naturally, also more granular configurations are " +"possible. For instance, classes can describe how the hard disk should be " +"partitioned, they can\n" +"define which software packages will be installed, or which\n" +"customization steps are performed." +msgstr "" +"Les classes déterminent comment l’installation est effectuée. Par\n" +"exemple, un client d’installation peut être configuré pour obtenir le\n" +"bureau XFCE en y ajoutant simplement la classe _XFCE_ . Naturellement,\n" +"des configurations plus granulaires sont également possibles. Par\n" +"exemple, les classes peuvent décrire comment le disque dur doit être\n" +"partitionné, elles peuvent définir quels paquets logiciels seront\n" +"installés, ou quelles étapes de personnalisation seront exécutées." + +#: fai-guide.txt:494 +msgid "" +"Often, a client configuration is created by only changing or appending the\n" +"classes to which this client belongs, making the installation of a new\n" +"client very easy. Thus no additional information needs to be added to\n" +"the configuration space if the existing classes suffice for your\n" +"needs." +msgstr "" +"Souvent, une configuration client est juste créée en modifiant ou en ajoutant\n" +"les classes auxquelles ce client appartient, ce qui rend\n" +"l’installation d’un nouveau client très facile. Ainsi, aucune\n" +"information supplémentaire ne doit être ajoutée à l’espace de\n" +"configuration si les classes existantes suffisent à vos besoins." + +#: fai-guide.txt:496 +msgid "" +"As you can see, classes are a central pillar of customizing your " +"configuration space and with that your client installation. On how to define " +"your own classes, refer to <>." +msgstr "" +"Comme vous pouvez le voir, les classes sont un pilier central de la\n" +"personnalisation de votre espace de configuration et de celui de\n" +"de votre client d'installation. Pour définir vos propres classes, reportez-vous à\n" +"<>." + +#: fai-guide.txt:498 +msgid "== [[setup]]Setup your faiserver" +msgstr "== [[setup]]Configurer votre faiserver" + +#: fai-guide.txt:501 +msgid "" +"Here's how to set up the install server in a few minutes. Following\n" +"steps are needed:" +msgstr "" +"Voici comment configurer le serveur d’installation en quelques minutes.\n" +"Les étapes suivantes sont nécessaires :" + +#: fai-guide.txt:509 +msgid "" +". Set up the install server\n" +".. Install FAI packages\n" +".. Create the nfsroot\n" +".. Copy the examples to the config space\n" +".. Configure network daemons\n" +".. Create the PXELINUX configurations\n" +". Boot and install clients" +msgstr "" +". Configurer le serveur d’installation\n" +".. Installer les paquets de FAI\n" +".. Créer le nfsroot\n" +".. Copier les exemples dans l’espace de configuration\n" +".. Configurer les démons réseau\n" +".. Créer les configurations PXELINUX\n" +". Démarrage et installation des clients" + +#: fai-guide.txt:512 +msgid "=== Install the FAI packages" +msgstr "=== Installer les paquets FAI" + +#: fai-guide.txt:516 +msgid "" +"* Install the key of the FAI project package repository.\n" +"* Add the URL of the package repository of the FAI project.\n" +"* Install the package 'fai-quickstart' on your install server." +msgstr "" +"* Installer la clé du dépôt de paquets du projet FAI.\n" +"* Ajouter l’URL du dépôt de paquets du projet FAI.\n" +"* Installer le paquet 'fai-quickstart' sur le serveur d'installation." + +#: fai-guide.txt:518 +msgid "Use these commands for installing:" +msgstr "Utilisez ces commandes pour l'installation :" + +#: fai-guide.txt:523 +msgid "" +"----\n" +"# wget -O /etc/apt/trusted.gpg.d/fai-project.gpg https://fai-project.org/" +"download/2BF8D9FE074BCDE4.gpg\n" +"# echo \"deb http://fai-project.org/download bookworm koeln\" > /etc/apt/" +"sources.list.d/fai.list\n" +"----" +msgstr "" +"----\n" +"# wget -O /etc/apt/trusted.gpg.d/fai-project.gpg https://fai-project.org/download/2BF8D9FE074BCDE4.gpg\n" +"# echo \"deb http://fai-project.org/download bookworm koeln\" > /etc/apt/sources.list.d/fai.list\n" +"----" + +#: fai-guide.txt:525 +msgctxt "fai-guide.txt:525" +msgid "or" +msgstr "or" + +#: fai-guide.txt:529 +msgid "" +"----\n" +"# apt install extrepo ; extrepo enable fai\n" +"----" +msgstr "" +"----\n" +"# apt install extrepo ; extrepo enable fai\n" +"----" + +#: fai-guide.txt:535 +msgid "" +"and then\n" +"----\n" +"# apt-get update\n" +"# aptitude install fai-quickstart\n" +"----" +msgstr "" +"et ensuite :\n" +"----\n" +"# apt-get update\n" +"# aptitude install fai-quickstart\n" +"----" + +#: fai-guide.txt:537 +msgid "" +"This will also install the packages for DHCP, TFTP and NFS server daemons." +msgstr "" +"Cela installera également les paquets pour les démons de serveur DHCP,\n" +"TFTP et NFS." + +#: fai-guide.txt:539 +msgid "=== Create the nfsroot" +msgstr "=== Créer le nfsroot" + +#: fai-guide.txt:547 +msgid "" +"* Also enable the package repository of the FAI project in a different\n" +" _sources.list_ file which is used when building the nfsroot. Then,\n" +" enable the log user for FAI.\n" +"----\n" +"# sed -i -e 's/^#deb/deb/' /etc/fai/apt/sources.list\n" +"# sed -i -e 's/#LOGUSER/LOGUSER/' /etc/fai/fai.conf\n" +"----" +msgstr "" +"* Activez également le dépôt de paquets du projet FAI dans un\n" +"autre fichier _sources.list_ qui est utilisé lors de la construction du\n" +"nfsroot. Ensuite, activez l’utilisateur de journal pour FAI.\n" +"....\n" +"# sed -i -e 's/^#deb/deb/' /etc/fai/apt/sources.list\n" +"# sed -i -e 's/#LOGUSER/LOGUSER/' /etc/fai/fai.conf\n" +"....\n" + +#: fai-guide.txt:554 +msgid "" +"* By default, FAI uses http://deb.debian.org as package\n" +" mirror, which should attempt to find a fast package repository for you. " +"footnote:[If you want to use a faster mirror, adjust the URL\n" +" in _/etc/fai/apt/sources.list_ and +FAI_DEBOOTSTRAP+ in _/etc/fai/" +"nfsroot.conf_ before calling fai-setup.]\n" +"Now, we can run `fai-setup(8)` footnote:" +"[This will call `fai-make-nfsroot(8)` internally.]\n" +"and check if everything went well.\n" +"The log file is written to /var/log/fai/fai-setup.log." +msgstr "" +"* Par défaut, FAI utilise\n" +"http://httpredir.debian.org/ comme miroir\n" +"de paquets, qui va tenter de trouver un dépôt de paquets\n" +"rapide pour vous.\n" +"footnote:[Si vous voulez un miroir plus rapide, ajustez l'URL dans\n" +"_/etc/fai/apt/sources.list_ et +FAI_DEBOOTSTRAP+ dans\n" +"_/etc/fai/nfsroot.conf_ avant de lancer fai-setup.]\n" +"Ensuite, on peut lancer `fai-setup(8)`\n" +"footnote:[Cela invoque `fai-make-nfsroot(8)` en interne.]\n" +"Et vérifiez si tout s’est bien passé. Le fichier de journal est écrit dans\n" +"/var/log/fai/fai-setup.log." + +#: fai-guide.txt:558 +msgid "" +"----\n" +"# fai-setup -v\n" +"----" +msgstr "" +"----\n" +"# fai-setup -v\n" +"----" + +#: fai-guide.txt:563 +msgid "" +"* These are some of the lines you will see at the end of\n" +" _fai-setup_. A complete example of 'fai-setup.log' is available on\n" +" the FAI web page at https://fai-project.org/logs/fai-setup.log." +msgstr "" +"* Voilà quelques-unes des lignes que vous verrez à la fin de fai-setup.\n" +"Un exemple complet de 'fai-setup.log' est disponible sur la page web FAI\n" +"à https://fai-project.org/logs/fai-setup.log." + +#: fai-guide.txt:579 +msgid "" +"----\n" +"FAI packages and related packages inside the nfsroot:\n" +"dracut 059-4\n" +"dracut-live 059-4\n" +"dracut-network 059-4\n" +"dracut-squash 059-4\n" +"fai-client 6.2\n" +"fai-nfsroot 6.2\n" +"fai-setup-storage 6.2\n" +"Waiting for background jobs to finish\n" +"fai-make-nfsroot finished properly.\n" +"Log file written to /var/log/fai/fai-make-nfsroot.log\n" +"Adding line to /etc/exports: /srv/fai/config 192.168.33.250/" +"24(async,ro,no_subtree_check)\n" +"Adding line to /etc/exports: /srv/fai/nfsroot 192.168.33.250/" +"24(async,ro,no_subtree_check,no_root_squash)\n" +"Reloading nfs-kernel-server configuration (via systemctl): nfs-kernel-" +"server.service." +msgstr "" +"----\n" +"FAI packages and related packages inside the nfsroot:\n" +"dracut 059-4\n" +"dracut-live 059-4\n" +"dracut-network 059-4\n" +"dracut-squash 059-4\n" +"fai-client 6.2\n" +"fai-nfsroot 6.2\n" +"fai-setup-storage 6.2\n" +"Waiting for background jobs to finish\n" +"fai-make-nfsroot finished properly.\n" +"Log file written to /var/log/fai/fai-make-nfsroot.log\n" +"Adding line to /etc/exports: /srv/fai/config 192.168.33.250/24(async,ro,no_subtree_check)\n" +"Adding line to /etc/exports: /srv/fai/nfsroot 192.168.33.250/24(async,ro,no_subtree_check,no_root_squash)\n" +"Reloading nfs-kernel-server configuration (via systemctl): nfs-kernel-server.service." + +#: fai-guide.txt:582 +msgid "" +"Your initial config space is now located in /srv/fai/config\n" +"Please don't forget to fill out the FAI questionnaire after you've finished " +"your project with FAI." +msgstr "" +"Your initial config space is now located in /srv/fai/config\n" +"Please don't forget to fill out the FAI questionnaire after you've finished your project with FAI." + +#: fai-guide.txt:586 +msgid "" +"FAI setup finished.\n" +"Log file written to /var/log/fai/fai-setup.log\n" +"----" +msgstr "" +"FAI setup finished.\n" +"Log file written to /var/log/fai/fai-setup.log\n" +"----" + +#: fai-guide.txt:591 +msgid "" +"* fai-setup has created the LOGUSER, the nfsroot and has added\n" +" additional lines to _/etc/exports_. The subdirectories added to\n" +" _/etc/exports_ are exported via NFS v3, so all install clients in the\n" +" same subnet can mount them via NFS." +msgstr "" +"* `fai-setup` a créé le LOGUSER, le nfsroot et a ajouté des lignes\n" +"supplémentaires à _/etc/exports_. Les sous-répertoires ajoutés à\n" +"_/etc/exports_ sont exportés via NFS v3, de sorte que tous les clients\n" +"d’installation dans le même sous-réseau peuvent les monter via NFS." + +#: fai-guide.txt:594 +msgid "=== Creating the configuration space" +msgstr "=== Création de l’espace de configuration" + +#: fai-guide.txt:597 +msgid "" +"Install the simple examples into the configuration space\n" +"footnote:[These files need not belong to the root account.]." +msgstr "" +"Installez les exemples simples dans l’espace de configuration\n" +"footnote:[Il n'est pas nécessaires que ces fichiers appartiennent au compte root.]." + +#: fai-guide.txt:601 +msgid "" +"----\n" +"$ fai-mk-configspace\n" +"----" +msgstr "" +"----\n" +"$ fai-mk-configspace\n" +"----" + +#: fai-guide.txt:605 +msgid "" +"These examples contain configuration for some sample\n" +"hosts. Depending on the host name used, your computer will be\n" +"configured as follows:" +msgstr "" +"Ces exemples contiennent la configuration pour certains hôtes d’exemple.\n" +"Selon le nom d’hôte utilisé, votre ordinateur sera configuré comme suit :" + +#: fai-guide.txt:610 +msgid "" +"demohost::\n" +"A machine which needs only a small hard disk. This machine is\n" +"configured with network as DHCP client, and an account demo is\n" +"created." +msgstr "" +"demohost::\n" +"Une machine qui n’a besoin que d’un petit disque dur. Cette machine\n" +"est configurée avec le réseau en tant que client DHCP, et une démo de\n" +"compte est créée." + +#: fai-guide.txt:613 +msgid "" +"xfcehost::\n" +"A XFCE desktop is installed, using LVM, and the account demo is created." +msgstr "" +"xfcehost::\n" +"Un bureau XFCE est installé, utilisant LVM, et la démo du compte est\n" +"créée." + +#: fai-guide.txt:616 +msgid "" +"gnomehost::\n" +"A GNOME desktop is installed, and the account demo is created." +msgstr "" +"gnomehost::\n" +" Un bureau GNOME est installé et la démo du compte est créée." + +#: fai-guide.txt:619 +msgid "" +"ubuntuhost::\n" +"A Ubuntu desktop will be installed, and the account demo is created." +msgstr "" +"ubuntuhost::\\n\"\n" +"Un bureau Ubuntu sera installé et la démo du compte est créée." + +#: fai-guide.txt:623 +msgid "" +"other host names::\n" +"Hosts with another host name will most notably use the classes FAIBASE,\n" +"DHCPC and GRUB." +msgstr "" +"autres noms d'hôtes::\n" +"Les hôtes disposant d’un autre nom d’hôte utiliseront notamment les\n" +"classes FAIBASE, DHCPC et GRUB." + +#: fai-guide.txt:626 +msgid "" +"All hosts will have an account called _demo_ with password _fai_. The\n" +"root account also has the password _fai_." +msgstr "" +"Tous les hôtes auront un compte appelé _demo_ avec mot de passe _fai_. Le\n" +"compte root a également le mot de passe _fai_." + +#: fai-guide.txt:630 +msgid "" +"If the FAI flag +menu+ is added, instead of using the host name for\n" +"determing the type of installation, a menu is presented, and the user\n" +"can choose a profile for the installation." +msgstr "" +"Si l’indicateur FAI +menu+ est ajouté, au lieu d’utiliser le nom\n" +"d’hôte pour déterminer le type d’installation, un menu est présenté et\n" +"l’utilisateur peut choisir un profil pour l’installation." + +#: fai-guide.txt:632 +msgid "=== Configure the network daemons" +msgstr "=== Configurer les démons réseau" + +#: fai-guide.txt:637 +msgid "" +"For booting the install client via PXE, the install server needs a DHCP and " +"a\n" +"TFTP daemon running. The package _fai-quickstart_ has already installed the\n" +"software packages for those daemons. Additionally the package of the NFS\n" +"server for exporting the nfsroot and the config space was installed." +msgstr "" +"Pour démarrer le client d’installation via PXE, le serveur\n" +"d’installation a besoin d’un démon DHCP et d’un démon TFTP fonctionnels.\n" +"Le paquet _fai-quickstart_ a déjà installé les paquets logiciels\n" +"pour ces démons. En outre, le paquet du serveur NFS pour\n" +"l’exportation du nfsroot et de l’espace de configuration a été installé." + +#: fai-guide.txt:640 +msgid "==== [[bootdhcp]]Configuration of the DHCP daemon" +msgstr "==== [[bootdhcp]]Configuration du démon DHCP" + +#: fai-guide.txt:645 +msgid "" +"Ideally, your faiserver should also be your DHCP server. If that is\n" +"not the case, instruct the admin responsible of the DHCP server to\n" +"configure it according to this section. Optionally, it is possible to\n" +"avoid that by using the <> feature released in FAI 5.0." +msgstr "" +"Idéalement, votre faiserver doit également être votre serveur DHCP. Si ce\n" +"n’est pas le cas, demandez à l’administrateur responsable du serveur\n" +"DHCP de le configurer conformément à cette section. Il est\n" +"possible d'éviter cela optionnellement en utilisant la fonctionnalité\n" +"<> diffusée dans FAI 5.0." + +#: fai-guide.txt:649 +msgid "" +"An example for `dhcpd.conf(5)` is provided with the _fai-doc_\n" +"package. Start using this example and look at all options used therein." +msgstr "" +"Un exemple pour `dhcpd.conf(5)` est fourni avec le paquet _fai-doc_.\n" +"Commencez à utiliser cet exemple et regardez toutes les options qui y\n" +"sont utilisées." + +#: fai-guide.txt:653 +msgid "" +"----\n" +"# cp /usr/share/doc/fai-doc/examples/etc/dhcpd.conf /etc/dhcp/\n" +"----" +msgstr "" +"----\n" +"# cp /usr/share/doc/fai-doc/examples/etc/dhcpd.conf /etc/dhcp/\n" +"----" + +#: fai-guide.txt:661 +msgid "" +"The only FAI specific information inside this configuration file is to\n" +"set +filename+ (DHCP option 67) to +fai/pxelinux.0+ and to set\n" +"+next-server+ (DHCP option 66, also called TFTP server name) and\n" +"+server-name+ to the name of your install server. All other\n" +"information is only network related data, which is used in almost all\n" +"DHCP configurations. Adjust these network parameters to your local\n" +"needs." +msgstr "" +"Les seules informations spécifiques FAI contenues dans ce fichier de\n" +"configuration sont d'assigner +filename+ (DHCP option 67) à la valeur +fai/pxelinux.0+ et\n" +"d'assigner +next-server+ (DHCP option 66, also aussi nommée TFTP server name) et +server-name+\n" +"à la valeur du nom de votre serveur d’install . Toutes les autres informations sont uniquement des\n" +"données liées au réseau, qui sont utilisées dans presque toutes les\n" +"configurations DHCP. Ajustez ces paramètres de réseau à vos besoins locaux." + +#: fai-guide.txt:666 +msgid "" +"----\n" +"deny unknown-clients;\n" +"option dhcp-max-message-size 2048;\n" +"use-host-decl-names on;" +msgstr "" +"----\n" +"deny unknown-clients;\n" +"option dhcp-max-message-size 2048;\n" +"use-host-decl-names on;" + +#: fai-guide.txt:678 +msgid "" +"subnet 192.168.33.0 netmask 255.255.255.0 {\n" +" option routers 192.168.33.250;\n" +" option domain-name \"my.example\";\n" +" option domain-name-servers 192.168.33.250;\n" +" option time-servers faiserver;\n" +" option ntp-servers faiserver;\n" +" server-name faiserver;\n" +" next-server faiserver;\n" +" filename \"fai/pxelinux.0\";\n" +"}\n" +"----" +msgstr "" +"subnet 192.168.33.0 netmask 255.255.255.0 {\n" +" option routers 192.168.33.250;\n" +" option domain-name \"my.example\";\n" +" option domain-name-servers 192.168.33.250;\n" +" option time-servers faiserver;\n" +" option ntp-servers faiserver;\n" +" server-name faiserver;\n" +" next-server faiserver;\n" +" filename \"fai/pxelinux.0\";\n" +"}\n" +"----" + +#: fai-guide.txt:681 +msgid "" +"If you make any changes to the DHCP configuration, you must\n" +"restart the daemon." +msgstr "" +"Si vous apportez des modifications à la configuration DHCP, vous devez\n" +"redémarrer le démon." + +#: fai-guide.txt:685 +msgid "" +"----\n" +"# invoke-rc.d isc-dhcp-server restart\n" +"----" +msgstr "" +"----\n" +"# invoke-rc.d isc-dhcp-server restart\n" +"----" + +#: fai-guide.txt:690 +msgid "" +"If you have multiple network interfaces, you\n" +"can define on which interface the server will listen in\n" +"_/etc/default/isc-dhcp-server_. By default, the DHCP daemon writes its\n" +"log messages to '/var/log/daemon.log'." +msgstr "" +"Si vous disposez de plusieurs interfaces réseau, vous pouvez définir\n" +"l’interface que le serveur écoutera dans _/etc/default/isc-dhcp-server_.\n" +"Par défaut, le démon DHCP écrit ses messages de journalisation dans\n" +"_/var/log/daemon.log_." + +#: fai-guide.txt:693 +msgid "==== Adding a host entry to DHCP" +msgstr "==== Ajout d’une entrée d’hôte au DHCP" + +#: fai-guide.txt:701 +msgid "" +"The MAC address is given by the hardware of the network card. For each\n" +"install client you collect its MAC address and to map it to an IP address " +"and to a host\n" +"name. First, we add the IP address and the hostname to _/etc/hosts_\n" +"footnote:[You may also add this into your Domain Name System (DNS)].\n" +"----\n" +"192.168.33.100 demohost\n" +"----" +msgstr "" +"L’adresse MAC est donnée par le matériel de la carte réseau. Pour chaque\n" +"client d’installation, vous collectez son adresse MAC et l'associez à une\n" +"adresse IP et à un nom d’hôte. Tout d’abord, nous ajoutons l’adresse IP\n" +"et le nom d’hôte à _/etc/hosts_ footnote:[On peut aussi ajouter cela dans son serveur de noms de domaine (DNS)].\n" +"----\n" +"192.168.33.100 demohost\n" +"----" + +#: fai-guide.txt:708 +msgid "" +"The mapping from the MAC address to the IP address is done in the\n" +"_dhcpd.conf_ file. Here, we add a host entry using the command `dhcp-" +"edit(8)`.\n" +"Here you have to replace 01:02:03:AB:CD:EF ith the MAC you have found.\n" +"----\n" +"# dhcp-edit demohost 01:02:03:AB:CD:EF\n" +"----" +msgstr "" +"L'association de l’adresse MAC à l’adresse IP est effectuée dans le fichier\n" +"_dhcpd.conf_. Ici, nous ajoutons une entrée d’hôte en utilisant la\n" +"commande `+dhcp-edit(8)+` . Ici, vous devez remplacer 01:02:03:AB:CD:EF\n" +"avec l'adresse MAC que vous avez trouvé.\n" +"----\n" +"# dhcp-edit demohost 01:02:03:AB:CD:EF\n" +"----" + +#: fai-guide.txt:714 +msgid "" +"After calling this command, this is what the host entry in\n" +"_dhcpd.conf_ will look like:\n" +"----\n" +"host demohost {hardware ethernet 01:02:03:AB:CD:EF;fixed-address demohost;}\n" +"----" +msgstr "" +"Après l'invocation de cette commande, voici à quoi l'entrée d'hôte dans\n" +"_dhcpd.conf_ ressemblera :\n" +"----\n" +"host demohost {hardware ethernet 01:02:03:AB:CD:EF;fixed-address demohost;}\n" +"----" + +#: fai-guide.txt:717 +msgid "==== TFTP" +msgstr "==== TFTP" + +#: fai-guide.txt:721 +msgid "" +"Normally, you do not need any changes to the TFTP dameon\n" +"configuration. The files which are provided by TFTP are located in\n" +"_/srv/tftp/fai_." +msgstr "" +"Normalement, vous n’avez pas besoin d’apporter de modifications à la\n" +"configuration démon TFTP. Les fichiers fournis par TFTP sont situés\n" +"dans _/srv/tftp/fai_." + +#: fai-guide.txt:724 +msgid "==== NFS" +msgstr "==== NFS" + +#: fai-guide.txt:728 +msgid "" +"The command `fai-setup` has already set up the NFS daemon and added\n" +"some lines to the configuration file _/etc/exports_.\n" +"It exports the directories using NFS v3." +msgstr "" +"La commande `fai-setup` a déjà configuré le démon NFS et ajouté\n" +"quelques lignes au fichier de configuration _/etc/exports_. Il exporte\n" +"les répertoires en utilisant NFS v3." + +#: fai-guide.txt:730 +msgid "=== Creating the PXELINUX configuration" +msgstr "=== Création de la configuration PXELINUX" + +#: fai-guide.txt:738 +msgid "" +"The last step before booting your client for the first time\n" +"is to specify what configuration the client should boot when doing PXE\n" +"boot. We use the command `fai-chboot(8)` to create a pxelinux\n" +"configuration for each install client. This includes information about\n" +"the kernel, the initrd, the config space and some boot parameters. You\n" +"should read the manual page, which gives you some good examples.\n" +"Here's the command for starting the installation for the host demohost." +msgstr "" +"La dernière étape avant de démarrer votre client pour la première fois\n" +"est de spécifier quelle configuration le client doit démarrer lors de\n" +"l’amorçage PXE. Nous utilisons la commande `fai-chboot(8)` pour\n" +"créer une configuration pxelinux pour chaque client d’installation. Cela\n" +"comprend des informations sur le noyau, le fichier initrd, l’espace de\n" +"configuration et certains paramètres d’amorçage. Vous devriez lire la\n" +"page de manuel, qui vous donne quelques bons exemples. Voici la commande\n" +"pour démarrer l’installation de l’hôte demohost." + +#: fai-guide.txt:741 +msgid "" +"----\n" +"$ fai-chboot -IFv -u nfs://faiserver/srv/fai/config demohost" +msgstr "" +"----\n" +"$ fai-chboot -IFv -u nfs://faiserver/srv/fai/config demohost" + +#: fai-guide.txt:745 +msgid "" +"Booting kernel vmlinuz-4.19.0-5-amd64\n" +" append initrd=initrd.img-4.19.0-5-amd64 ip=dhcp\n" +" FAI_FLAGS=verbose,sshd,createvt FAI_CONFIG_SRC=nfs://faiserver/srv/fai/" +"config" +msgstr "" +"Booting kernel vmlinuz-4.19.0-5-amd64\n" +" append initrd=initrd.img-4.19.0-5-amd64 ip=dhcp\n" +" FAI_FLAGS=verbose,sshd,createvt FAI_CONFIG_SRC=nfs://faiserver/srv/fai/config" + +#: fai-guide.txt:749 +msgid "" +"demohost has 192.168.33.100 in hex C0A82164\n" +"Writing file /srv/tftp/fai/pxelinux.cfg/C0A82164 for demohost\n" +"----" +msgstr "" +"demohost has 192.168.33.100 in hex C0A82164\n" +"Writing file /srv/tftp/fai/pxelinux.cfg/C0A82164 for demohost\n" +"----" + +#: fai-guide.txt:751 +msgid "" +"At this point, you should have a working faiserver setup and your clients " +"should boot into FAI and be able to install one of the examples." +msgstr "" +"À ce stade, vous devriez avoir une configuration faiserver de travail et\n" +"vos clients devraient démarrer dans FAI et être en mesure d’installer\n" +"l’un des exemples." + +#: fai-guide.txt:753 +msgid "" +"In the following section, you can read about planning your installation, " +"tailoring your configuration space to your particular needs and extending " +"FAI using hooks." +msgstr "" +"Dans la section suivante, vous pouvez lire la planification de votre\n" +"installation, adapter votre espace de configuration à vos besoins\n" +"particuliers et étendre FAI à l’aide de hooks." + +#: fai-guide.txt:755 +msgid "=== [[custom server]]Custom server" +msgstr "=== [[custom server]]Serveur personnalisé" + +#: fai-guide.txt:757 +msgid "" +"The faiserver and its setup is by no means static. It is possible to " +"customize and extend your server. For this, please refer to the " +"<> section in <>." +msgstr "" +"Le faiserver et sa configuration n’est nullement statique. Il est possible\n" +"de personnaliser et d'étendre votre serveur. Pour cela, reportez-vous à\n" +"la section<> dans <>.\"" + +#: fai-guide.txt:759 +msgid "== [[plan]]Plan your installation" +msgstr "== [[plan]]Planifiez votre installation" + +#: fai-guide.txt:766 +msgid "" +"Before starting your installation, you should invest a lot of time into\n" +"planning your installation. Once you're happy with your installation\n" +"concept, FAI can do all the boring and repetitive tasks to turn your\n" +"plans into reality. FAI can't do good installations if your concept is\n" +"imperfect or lacks some important details. Start planning the\n" +"installation by answering the following questions:" +msgstr "" +"Avant de commencer votre installation, vous devriez investir beaucoup de\n" +"temps dans la planification de votre installation. Une fois que vous\n" +"êtes satisfait de votre concept d’installation, FAI peut faire toutes\n" +"les tâches ennuyeuses et répétitives pour transformer vos plans en\n" +"réalité. FAI ne peut pas faire de bonnes installations si votre concept\n" +"est imparfait ou qu'il y manque quelques détails importants. Commencez à\n" +"planifier l’installation en répondant aux questions suivantes :" + +#: fai-guide.txt:780 +msgid "" +"* Will I create a Beowulf cluster, or do I have to install some desktop " +"machines?\n" +"* What does my LAN topology look like?\n" +"* Do I have uniform hardware? Will the hardware stay uniform in the future?" +"\n" +"* Does the hardware need a special kernel?\n" +"* How should the hosts be named?\n" +"* How should the local hard disks be partitioned?\n" +"* Which applications will be run by the users?\n" +"* Do the users need a queuing system?\n" +"* What software should be installed?\n" +"* Which daemons should be started, and what should the configuration for " +"these look like?\n" +"* Which remote file systems should be mounted?\n" +"* How should backups be performed?" +msgstr "" +"* Est-ce que je vais créer un cluster Beowulf ou dois-je installer des machines de bureau ?\n" +"* À quoi ressemble ma topologie LAN ?\n" +"* Ai-je un matériel uniforme ? Le matériel sera-t-il uniforme à l’avenir ?\n" +"* Le matériel a-t-il besoin d’un noyau spécial ?\n" +"* Comment nommer les hôtes ?\n" +"* Comment les disques durs locaux doivent-ils être partitionnés ?\n" +"* Quelles applications seront lancées par les utilisateurs ?\n" +"* Les utilisateurs ont-ils besoin d’un système de mise en file d’attente ?\n" +"* Quels logiciels faut-il installer ?\n" +"* Quels démons devraient être lancés, et à quoi devrait ressembler leur configuration ?\n" +"* Quels systèmes de fichiers distants doivent être montés ?\n" +"* Comment effectuer les sauvegardes ?" + +#: fai-guide.txt:788 +msgid "" +"You also have to think about user accounts, printers, a mail system,\n" +"cron jobs, graphic cards, dual boot, NIS, NTP, timezone, keyboard\n" +"layout, exporting and mounting directories via NFS and many other\n" +"things. So, there's a lot to do before starting an installation. And\n" +"remember that knowledge is power, and it's up to you to use\n" +"it. Installation and administration is a process, not a product. FAI\n" +"can't do things you don't tell it to do." +msgstr "" +"Vous devez également penser à des comptes d’utilisateur, des\n" +"imprimantes, un système de courrier, des travaux de cron, des cartes\n" +"graphiques, au double amorçage, au NIS, au NTP, au fuseau horaire,\n" +"à la disposition de clavier, à l’exportation et au montage des annuaires via\n" +"NFS et à beaucoup d’autres choses. Donc, il ya beaucoup à faire avant de\n" +"commencer une installation. Et rappelez-vous que la connaissance est le\n" +"pouvoir, et c’est à vous de l’utiliser. L’installation et\n" +"l’administration sont un processus et non un produit. FAI ne peut pas\n" +"faire les choses que vous ne lui dites pas de faire." + +#: fai-guide.txt:794 +msgid "" +"You don't need to start from scratch. Look at the files and scripts in\n" +"the configuration space. There are a lot of things you can use for\n" +"your own installation. A good paper called \"Bootstrapping an\n" +"Infrastructure\" with more aspects of building an infrastructure is\n" +"available at http://www.infrastructures.org/papers/bootstrap/bootstrap.html" +msgstr "" +"Mais vous ne devez pas commencer à partir de zéro. Examinez les fichiers\n" +"et les scripts dans l’espace de configuration. Il ya beaucoup de choses\n" +"que vous pouvez utiliser pour votre propre installation. Un bon article\n" +"intitulé « Bootstrapping an Infrastructure » avec d’autres aspects de la\n" +"construction d’une infrastructure est disponible sur\n" +"http://www.infrastructures.org/papers/bootstrap/bootstrap.html" + +#: fai-guide.txt:796 +msgid "=== [[c3]]The configuration space and its subdirectories" +msgstr "=== [[c3]]L’espace de configuration et ses sous-répertoires" + +#: fai-guide.txt:803 +msgid "" +"The configuration space is the collection of information about how exactly\n" +"to install a client. The central configuration space for all install\n" +"clients is located on the install server in '/srv/fai/config' and its\n" +"subdirectories. This will be mounted by the install clients to\n" +"'/var/lib/fai/config'. The main installation command `fai(8)` uses all\n" +"these subdirectories in the order listed except for hooks." +msgstr "" + +#: fai-guide.txt:807 +msgid "" +"_class/_::\n" +"Scripts and files to\n" +"define classes and variables." +msgstr "" +"_class/_::\n" +"Scripts et fichiers pour définir des classes et des variables." + +#: fai-guide.txt:810 +msgid "" +"_disk_config/_::\n" +"Configuration files for disk partitioning, software RAID, LVM and file " +"system creation." +msgstr "" +"_disk_config/_::\n" +"Fichiers de configuration pour le partitionnement de disque, RAID\n" +"logiciel, LVM et création de système de fichiers." + +#: fai-guide.txt:833 +msgid "" +"_basefiles/_::\n" +"Normally the file 'base.tar.xz' (located inside the nfsroot) is extracted on " +"the install\n" +"client after the new file systems are created and before package are\n" +"installed. This is a minimal base image, created right after calling\n" +"debootstrap during the creation of the nfsroot on the install\n" +"server. If you want to install another distribution than the nfsroot\n" +"is, you can put a tar file into the subdirectory 'basefiles/' and name\n" +"it after a class. Then the command `ftar(8)` is used to extract the\n" +"tar file based on the classes defined. Thus the file has to be named " +"'CLASS.tar.xz' not 'CLASS.base.tar.xz'. This is done in task\n" +"_extrbase_. Use this if you want to install another distribution or\n" +"version than that running during the installation.\n" +"+\n" +"This basefile can also be received based on FAI classes via HTTP/HTTPS or " +"FTP\n" +"by defining the variable +FAI_BASEFILEURL+. FAI will download a file\n" +"CLASSNAME.tar.xz (or tgz, or tar.gz,...) from this URL, if +CLASSNAME+\n" +"matches a FAI class.\n" +"+\n" +"Example:\n" +"----\n" +"FAI_BASEFILEURL=https://fai-project.org/download/basefiles/\n" +"----\n" +"The folder must support directory listing. FAI will not probe for " +"potentially matching files." +msgstr "" +"_basefiles/_::\n" +"Normalement , le fichier 'base.tar.xz' (situé à l'intérieur du\n" +"nfsroot) est extrait sur le client d’installation après la création\n" +"des nouveaux systèmes de fichiers et avant l’installation des paquets.\n" +"Il s’agit d’une image de base minimale, créée juste après avoir appelé\n" +"debootstrap lors de la création du nfsroot sur le serveur\n" +"d’installation. Si vous voulez installer une autre distribution que celle\n" +"du nfsroot, vous pouvez mettre un fichier tar dans le sous-répertoire\n" +"'basefiles/' et le nommer selon une classe. Ensuite, la commande\n" +"`ftar(8)` est utilisée pour extraire le fichier tar en fonction des\n" +"classes définies. Ainsi, le fichier doit être nommé 'CLASS.tar.xz'\n" +"et non 'CLASS.base.tar.xz'. Cela se fait dans la tâche _extrbase_.\n" +"Utilisez cette option si vous souhaitez installer une autre\n" +"distribution ou une version différente de celle exécutée pendant\n" +"l’installation.\n" +"+\n" +"Ce fichier de base peut également être reçu en fonction des classes\n" +"FAI via HTTP/HTTPS ou FTP en définissant la variable +FAI_BASEFILEURL+. FAI\n" +"téléchargera un fichier CLASSNAME.tar.xz (ou tgz, ou tar.gz, …) à\n" +"partir de cette URL, si +CLASSNAME+ correspond à une classe FAI.\n" +"+\n" +"Exemple :\n" +"----\n" +"FAI_BASEFILEURL=https://fai-project.org/download/basefiles/\n" +"----\n" +"Le dossier doit prendre en charge la liste des répertoires. FAI ne\n" +"recherchera pas de fichiers potentiellement correspondants." + +#: fai-guide.txt:835 +msgid "See chapter <> for how to install different distributions." +msgstr "" +"Voir le chapitre <> pour savoir comment\n" +"installer différentes distributions." + +#: fai-guide.txt:839 +msgid "" +"_debconf/_::\n" +"This directory holds all `debconf(7)` data. The format is the same\n" +"that is used by `debconf-set-selections(1)`." +msgstr "" +"_debconf/_::\n" +"Ce répertoire contient toutes les données `debconf(7)`. Le format\n" +"est le même que celui utilisé par `debconf-set-selections(1)`." + +#: fai-guide.txt:845 +msgid "" +"_package_config/_::\n" +"Files with class names contain lists of software packages to be\n" +"installed or removed by `install_packages(8)`. Files named\n" +"'.gpg' are added to the list of keys used by apt\n" +"for trusted package repositories." +msgstr "" +"_package_config/_::\n" +"Les fichiers avec des noms de classe contiennent des listes de\n" +"paquets à installer ou à désinstaller par\n" +"`install_packages(8)`. Les fichiers nommés '.gpg' sont ajoutés à la liste des clés utilisées par apt\n" +"pour les dépôts de paquets approuvés." + +#: fai-guide.txt:851 +msgid "" +"_pkgs/_::\n" +"This directory can contain subdirectories named by classes. You can\n" +"put '.deb' or '.rpm' files into these subdirectories. FAI will then\n" +"install these packages without the need of creating the metadata of a\n" +"package repository." +msgstr "" +"_pkgs/_::\n" +"Ce répertoire peut avoir des sous-répertoires nommés selon des classes. Vous pouvez\n" +"mettre des fichiers '.deb' ou '.rpm' dans ces sous-répertoires. FAI installera\n" +"ces paquets sans qu'il soit besoin de créer les métadonnées d'un dépôt de paquets." + +#: fai-guide.txt:854 +msgid "" +"_scripts/_::\n" +"Scripts for your local site customization. Used by `fai-do-scripts(1)`." +msgstr "" +"_scripts/_::\n" +"Scripts pour la personnalisation de votre site local. Utilisé par\n" +"`fai-do-scripts(1)`." + +#: fai-guide.txt:865 +msgid "" +"_files/_::\n" +"Files used by customization scripts. Most files are located in a\n" +"subtree structure which reflects the ordinary directory tree. For\n" +"example, the templates for 'nsswitch.conf' are located in\n" +"'$FAI/files/etc/nsswitch.conf' and are named according to the classes\n" +"that they should match: '$FAI/files/etc/nsswitch.conf/NIS' is the\n" +"version of '/etc/nsswitch.conf' to use for the NIS class. Note that\n" +"the contents of the files directory are not automatically copied to\n" +"the target machine, rather they must be explicitly copied by\n" +"customization scripts using the `fcopy(8)` command." +msgstr "" +"_files/_::\n" +"Les Fichiers utilisés par les scripts de personnalisation. La plupart\n" +"des fichiers se trouvent dans un sous-répertoire qui\n" +"reflète l’arborescence de répertoires ordinaire. Par exemple, les\n" +"modèles de `_nsswitch.conf_` se trouvent dans\n" +"'$FAI/files/etc/nsswitch.conf' et sont nommés en fonction des classes\n" +"auxquelles ils doivent correspondre :\n" +"'$FAI/files/etc/nsswitch.conf/NIS' est la version de\n" +"'/etc/nsswitch.conf' à utiliser pour la classe NIS. Notez que le\n" +"contenu du répertoire n’est pas automatiquement copié sur la machine\n" +"cible, mais qu’il doit être explicitement copié par des scripts de\n" +"personnalisation à l’aide de la commande `fcopy(8)`." + +#: fai-guide.txt:872 +msgid "" +"_hooks/_::\n" +"Hooks are user defined programs or scripts, which are called during\n" +"the installation process. They can extend or replace the default tasks.\n" +"The file name must be of format 'taskname.CLASSNAME[.sh]'.\n" +"A hook called +updatebase.DEBIAN+ is executed prior to the task `updatebase`" +"\n" +"and only if the install client belongs to the class DEBIAN." +msgstr "" +"_hooks/_::\n" +"Les hooks sont des programmes ou des scripts définis par\n" +"l’utilisateur, qui sont lancés pendant le processus d’installation.\n" +"Ils peuvent étendre ou remplacer les tâches par défaut. Le nom du\n" +"fichier doit être de format 'taskname.CLASSNAME[.sh]'. Un hook appelé\n" +"+updatebase.DEBIAN+ est exécuté avant la tâche\n" +"`updatebase` et seulement si l’installation du client fait partie de\n" +"la classe DEBIAN." + +#: fai-guide.txt:875 +msgid "=== [[defining classes]]Defining classes" +msgstr "=== [[defining classes]]Définition des classes" + +#: fai-guide.txt:877 +msgid "There are different possibilities to define classes:" +msgstr "Il existe différentes possibilités pour définir des classes :" + +#: fai-guide.txt:881 +msgid "" +". Some default classes are defined for every host: DEFAULT, LAST and its " +"host name.\n" +". Classes may be listed within a file (by default in 'class/')\n" +". Classes may be dynamically defined by scripts." +msgstr "" +". Certaines classes par défaut sont définies pour chaque hôte : DEFAULT, LAST et son nom d’hôte.\n" +". Les classes peuvent être répertoriées dans un fichier (par défaut dans 'class/').\n" +". Les classes peuvent être dynamiquement définies par des scripts." + +#: fai-guide.txt:886 +msgid "" +"The last option is a very nice feature, since these scripts will\n" +"define classes in a very flexible way. For example, several classes\n" +"may be defined only if certain hardware is identified or a class is\n" +"defined depending on the network subnet information." +msgstr "" +"La dernière option est une fonctionnalité très intéressante, puisque ces\n" +"scripts définiront des classes d'une façon très souple. Par exemple,\n" +"plusieurs classes peuvent être définies uniquement si certains matériels\n" +"sont identifiés ou si une classe est définie en fonction des\n" +"informations du sous-réseau." + +#: fai-guide.txt:890 +msgid "" +"All names of classes, except the host name, are written in\n" +"uppercase. They must not contain a hyphen, a hash, a semicolon or a\n" +"dot, but may contain underscores and digits." +msgstr "" +"Tous les noms de classes, sauf le nom d’hôte, sont écrits en\n" +"majuscules. Ils ne doivent pas contenir de trait d’union, de dièse, de\n" +"point-virgule ni de point, mais peuvent contenir des caractères de\n" +"soulignement et des chiffres." + +#: fai-guide.txt:899 +msgid "" +"The task _defclass_ calls the command `fai-class(1)` to define\n" +"classes. All scripts matching _^[0-9][0-9]*_ (they start with two\n" +"digits) in the subdirectory\n" +"_$FAI/class_ are executed for defining classes. Everything that is printed\n" +"to STDOUT is automatically defined as a class. For more\n" +"information on defining class, read the manual pages for\n" +"`fai-class(1)`. The script _50-host-classes_ (see below a stripped\n" +"version) is used to define classes depending on the host name." +msgstr "" +"La tâche _defclass_ appelle la commande `fai-class(1)` pour définir\n" +"les classes. Tous les scripts correspondant à l'expression _^[0-9][0-9]*_ (qui\n" +"commencent avec deux chiffres) Dans le sous-repertoire _$FAI/class_ sont\n" +"exécutés afin de définir les classes. Tout ce qui is affiché sur STDOUT\n" +"est automatiquement defini comme une classe. Pour plus d’informations\n" +"sur Les définitions de classe , lire les pages de manuel de\n" +"`fai-class(1)`. Le script _50-host-classes_ (voir ci - dessous la\n" +"version allégée) est utilisé pour les définir des classes en fonction du\n" +"nom d’hôte." + +#: fai-guide.txt:915 +msgid "" +"----\n" +"# use a list of classes for our demo machines\n" +"case $HOSTNAME in\n" +" demohost)\n" +" echo \"FAIBASE GRUB DEMO\" ;;\n" +" xfcehost)\n" +" echo \"FAIBASE GRUB DEMO XORG XFCE LVM\";;\n" +" faiserver)\n" +" echo \"FAIBASE DEBIAN DEMO FAISERVER\" ;;\n" +" ubuntuhost)\n" +" echo \"FAIBASE DEBIAN DEMO UBUNTU JAMMY JAMMY64 XORG\";;\n" +" *)\n" +" echo \"FAIBASE DEBIAN DEMO\" ;;\n" +"esac\n" +"----" +msgstr "" +"----\n" +"# use a list of classes for our demo machines\n" +"case $HOSTNAME in\n" +" demohost)\n" +" echo \"FAIBASE GRUB DEMO\" ;;\n" +" xfcehost)\n" +" echo \"FAIBASE GRUB DEMO XORG XFCE LVM\";;\n" +" faiserver)\n" +" echo \"FAIBASE DEBIAN DEMO FAISERVER\" ;;\n" +" ubuntuhost)\n" +" echo \"FAIBASE DEBIAN DEMO UBUNTU JAMMY JAMMY64 XORG\";;\n" +" *)\n" +" echo \"FAIBASE DEBIAN DEMO\" ;;\n" +"esac\n" +"----" + +#: fai-guide.txt:921 +msgid "" +"Host names should rarely be used for the configuration files in the\n" +"configuration space. Instead, a class should be defined and then added\n" +"for a given host. This is because most of the time the configuration\n" +"data is not specific for one host, but can be shared among several\n" +"hosts." +msgstr "" +"Les noms d’hôtes doivent rarement être utilisé pour les fichiers de\n" +"configuration dans l’espace de configuration. Au lieu de ça, une classe doit\n" +"être définie et ensuite ajoutée pour un hôte donné. En effet, la plupart\n" +"du temps les données de configuration ne sont pas spécifiques à un nom\n" +"d'hôte, mais peuvent être partagées entre différents hôtes." + +#: fai-guide.txt:924 +msgid "" +"The order of the classes is important because it defines the priority\n" +"of the classes from low to high." +msgstr "" +"L’ordre des classes est important car celui-ci définit la priorité des\n" +"classes de faible à élevée." + +#: fai-guide.txt:926 +msgid "=== [[classvariables]]Defining variables" +msgstr "=== [[classvariables]]Définition des Variables" + +#: fai-guide.txt:932 +msgid "" +"The task _defvar_ defines the variables for the install\n" +"client. Variables are defined by scripts in _class/*.var_. All global\n" +"variables can be set in 'DEFAULT.var'. For groups of hosts use\n" +"a class file. For a single host use the file +$HOSTNAME+ _.var_. Also\n" +"here, it's useful to study all the examples." +msgstr "" +"La tâche _defvar_ definit les variables pour le client d'installation.\n" +"Les variables sont définies par les scripts dans _class/*.var_.\n" +"Toutes les variables globales peuvent être définies dans 'DEFAULT.var'.\n" +"Pour un groupe d’hôtes utiliser un fichier de classe. Pour un\n" +"hôte seul, utiliser le Fichier +$HOSTNAME+ _.var_. Ici aussi, il est\n" +"utile d'étudier tous les exemples." + +#: fai-guide.txt:935 +msgid "" +"The following variables are used in the examples and may also be\n" +"useful for your installation:" +msgstr "" +"Les variables suivantes sont utilisées dans les exemples et peuvent aussi être\n" +"utiles pour votre installation :" + +#: fai-guide.txt:940 +#, fuzzy +msgid "" +"FAI_ACTION::\n" +"Set the action FAI should perform. Normally this is done by\n" +"`fai-chboot(8)`. If you can't use this command, define this variable\n" +"i.e. in the script 'LAST.var'." +msgstr "" +"FAI_ACTION::\n" +"Configure les actions que doit effectuer FAI. Normalement, ceci se fait\n" +"par `fai-chboot(8)`. Si vous ne pouvez pas utiliser cette commande,\n" +"définissez cette variable dans le script 'LAST.var'." + +#: fai-guide.txt:944 +msgid "" +"FAI_ALLOW_UNSIGNED::\n" +"If set to 1, FAI allows the installation of packages from unsigned\n" +"repositories." +msgstr "" +"FAI_ALLOW_UNSIGNED::\n" +"Si cette variable vaut 1, FAI permet l’installation de paquets à partir de\n" +"dépôts non signés." + +#: fai-guide.txt:947 +msgid "" +"CONSOLEFONT::\n" +"Is the font which is loaded during installation by `setfont(8)`." +msgstr "" +"CONSOLEFONT::\n" +"La police de caractères qui est chargée lors de l’installation par\n" +"`setfont(8)`." + +#: fai-guide.txt:952 +msgid "" +"KEYMAP::\n" +"Defines the keyboard map files in '/usr/share/keymaps' and\n" +"'$FAI/files'. You don't need to specify the full path, since this file\n" +"will be located automatically." +msgstr "" +"KEYMAP::\n" +"Définit les fichiers de disposition du clavier dans '/usr/share/keymaps'\n" +"et '$FAI/files'. Vous n'avez pas besoin de spécifier le chemin complet,\n" +"car ce fichier sera localisé automatiquement." + +#: fai-guide.txt:961 +msgid "" +"ROOTPW::\n" +"The encrypted root password for the new system. You can use\n" +"`crypt(3)`, md5 and other hash types for the password. Use\n" +"`mkpasswd(1)` for creating the hash for a certain password.\n" +"For example, to generate a md5 hash for the password use\n" +"----\n" +"$ echo \"yoursecrectpassword\" | mkpasswd -m yescrypt -s\n" +"----" +msgstr "" +"ROOTPW::\n" +"Le mot de passe root chiffré pour le nouveau système. Vous pouvez\n" +"utiliser\n" +"`crypt(3)`, md5 et d’autres types de hachage pour le mot de passe. Utilisez 'mkpasswd(1)+`\n" +"pour créer le hachage d’un mot de passe donné. Par exemple, pour\n" +"générer le hachage MD5 un mot de passe, utilisez :\n" +"....\n" +"$ echo \"votre_mot_secret\" | mkpasswd -m yescrypt -s\n" +"...." + +#: fai-guide.txt:966 +msgid "" +"UTC::\n" +"Set hardware clock to UTC if _UTC=yes_. Otherwise set clock to local\n" +"time. See `clock(8)` for more information." +msgstr "" +"UTC::\n" +"Règle l’horloge matérielle à UTC si _UTC=yes_. Sinon, règle\n" +"l’horloge à l’heure locale. Voir `clock(8)` pour plus\n" +"d’informations." + +#: fai-guide.txt:970 +msgid "" +"TIMEZONE::\n" +"Is the file relative to '/usr/share/zoneinfo/' which indicates your\n" +"time zone. E.g.: _TIMEZONE=Europe/Berlin_." +msgstr "" +"TIMEZONE::\n" +"C'est le fichier sous '/usr/share/zoneinfo/' qui indique votre\n" +"fuseau horaire. Par exemple : _TIMEZONE=Europe/Berlin_." + +#: fai-guide.txt:975 +msgid "" +"MODULESLIST::\n" +"A list of kernel modules which are loaded during boot of the new system (" +"written to\n" +"/etc/modules)." +msgstr "" +"MODULESLIST::\n" +"Une liste des modules du noyau qui sont chargés pendant le démarrage\n" +"du nouveau système (écrits dans /etc/modules)." + +#: fai-guide.txt:978 +msgid "=== [[diskconfig]]Hard disk configuration" +msgstr "=== [[diskconfig]]Configuration du disque dur" + +#: fai-guide.txt:986 +msgid "" +"The tool `setup-storage(8)` reads a file in '$FAI/disk_config' for the\n" +"disk configuration. This file describes how\n" +"all the local disks will be partitioned, which file system types should be\n" +"created (like ext3/4, xfs, btrfs), and where they are\n" +"mounted to. You can also create software RAID and LVM setups using this\n" +"config file. It's also possible to preserve the disk layout or to\n" +"preserve the data on certain partitions." +msgstr "" +"L’outil `setup-storage(8)` lit un fichier dans '$FAI/disk_config' pour\n" +"la configuration du disque. Ce fichier décrit comment tous les disques\n" +"Locaux seront partitionnés, quels types de systèmes de fichiers\n" +"doivent etre créés (comme ext3/4, xfs, btrfs), et où ils seront montés.\n" +"Vous pouvez aussi créer des configurations RAID logiciel et LVM en\n" +"utilisant ce fichier de configuration. Il est aussi possible de préserver\n" +"le partitionnement du disque ou de préserver les\n" +"données sur certaines partitions." + +#: fai-guide.txt:992 +msgid "" +"During the installation process all local file systems are mounted\n" +"relative to '/target'. For example if you specify the mount point\n" +"'/home' in a disk configuration file this will be the directory\n" +"'/target/home' during the installation process and will become '/home'\n" +"for the new installed system." +msgstr "" +"Pendant le processus d’installation, tous les systèmes de fichiers\n" +"locaux sont montés sous le répertoire '/target'. Par exemple, si vous\n" +"spécifiez le point de montage '/home' dans un fichier de configuration\n" +"de disque, ce sera le répertoire '/target/home' pendant le processus\n" +"d’installation et ça deviendra '/home' pour le nouveau système installé." + +#: fai-guide.txt:994 +msgid "=== [[extrbase]]Extract base file" +msgstr "=== [[extrbase]]Extraction du fichier de base" + +#: fai-guide.txt:997 +msgid "" +"A base file is only needed when installing a distribution which is\n" +"different from the one in the nfsroot." +msgstr "" +"Un fichier de base n'est nécessaire que si on installe une distribution qui est\n" +"défférente de celle dans le nfsroot." + +#: fai-guide.txt:999 +msgid "=== [[debconf]]Debconf preseeding" +msgstr "=== [[debconf]]Pré-ensemencement Debconf" + +#: fai-guide.txt:1001 +msgid "You can use the format described in `debconf-set-selections(1)`." +msgstr "On peut utiliser le fomat décrit dans `debconf-set-selections(1)`." + +#: fai-guide.txt:1003 +msgid "=== [[repository]]Access to the package repository" +msgstr "=== [[repository]]Accès au dépôt de paquets" + +#: fai-guide.txt:1006 +msgid "" +"FAI supports http, https and NFS for accessing the package mirror. Set\n" +"the variable '$FAI_DEBMIRROR' for using NFS." +msgstr "" +"FAI supporte http, https, et NFS pour l'accès au miroir de paquets. Réglez\n" +"la variable '$FAI_DEBMIRROR' pour l'utilisation de NFS." + +#: fai-guide.txt:1009 +msgid "=== [[packageconfig]]Software package configuration" +msgstr "=== [[packageconfig]]Configuration des paquets logiciels" + +#: fai-guide.txt:1015 +msgid "" +"Before installing packages, FAI will add the content of all files\n" +"named _package_config/class.gpg_ to the list of apt keys. If your local\n" +"repository is signed by your keyid AB12CD34 you can easily add this key,\n" +"so FAI will use it during installation. Use this command for creating\n" +"the 'CLASS.gpg' file:" +msgstr "" +"Avant l’installation de paquets, FAI va ajouter le contenu de tous\n" +"les fichiers nommés _package_config/class.gpg_ à la liste des clés apt.\n" +"Si votre dépôt local est signé par votre keyid AB12CD34 vous pouvez\n" +"facilement ajouter cette clé, ainsi FAI l’utilisera pendant\n" +"l’installation. Utilisez cette commande pour créer le fichier\n" +"'CLASS.gpg' :" + +#: fai-guide.txt:1019 +msgid "" +"----\n" +"faiserver$ gpg --export AB12CD34 > /srv/fai/config/package_config/MYCLASS." +"gpg\n" +"----" +msgstr "" +"----\n" +"faiserver$ gpg --export AB12CD34 > /srv/fai/config/package_config/MYCLASS.gpg\n" +"----" + +#: fai-guide.txt:1024 +msgid "" +"The script `install_packages(8)` installs the selected software\n" +"packages. It reads all configuration files in '$FAI/package_config'\n" +"whose file name matches a defined class. The syntax is very simple." +msgstr "" +"Le script `install_packages(8)` installe les logiciels sélectionnés.\n" +"Il lira tous les fichiers de configuration Dans '$FAI/package_config'\n" +"dont le nom correspond à une classe définie. La syntaxe est très simple." + +#: fai-guide.txt:1027 +msgid "" +"----\n" +"# an example package class" +msgstr "" +"----\n" +"# an example package class" + +#: fai-guide.txt:1030 +msgid "" +"PACKAGES taskinst\n" +"german" +msgstr "" +"PACKAGES taskinst\n" +"german" + +#: fai-guide.txt:1034 +msgid "" +"PACKAGES install-norec\n" +"adduser nmap\n" +"less zstd" +msgstr "" +"PACKAGES install-norec\n" +"adduser nmap\n" +"less zstd" + +#: fai-guide.txt:1037 +msgid "" +"PACKAGES remove\n" +"gpm xdm" +msgstr "" +"PACKAGES remove\n" +"gpm xdm" + +#: fai-guide.txt:1041 +msgid "" +"PACKAGES install GRUB_PC\n" +"grub-pc\n" +"----" +msgstr "" +"PACKAGES install GRUB_PC\n" +"grub-pc\n" +"----" + +#: fai-guide.txt:1050 +msgid "" +"Comments are starting with a hash (#) and are ending at the end of the\n" +"line. Every package command begins with the word _PACKAGES_ followed by a\n" +"command name, which maps to a different package tool like apt-get,\n" +"aptitude or dnf for e.g. The command defines which command will be used to\n" +"install the packages named after this command. The list of all\n" +"available commands can be listed using _install_packages -H_.\n" +"Supported package tools are: _apt, apt-get, aptitude, smart, yast,\n" +"dnf, rpm, zypper_" +msgstr "" +"Les commentaires commencent par une dièse (#) et se terminent à la fin de la\n" +"ligne. Chaque commande de paquet commence par le mot _PACKAGES_ suivi\n" +"par un nom de commande, qui correspond à gestionnaire de paquets\n" +"distinct comme apt-get, aptitude ou dnf par exemple. la commande définit quelle\n" +"commande sera utilisé pour installer les paquets nommés après\n" +"cette commande. La liste de toutes les commandes disponibles peut\n" +"être listée en utilisant _install_packages -H_. Les gestionnaires de paquets pris\n" +"en charges sont _aptitude, apt-get, smart, yast, dnf, rpm, zypper_" + +#: fai-guide.txt:1054 +msgid "" +"hold::\n" +"Put a package on hold. This package will not be handled by dpkg, e.g\n" +"not upgraded." +msgstr "" +"hold::\n" +"Mettre un paquet en attente. Ce paquet ne sera pas pris en charge par\n" +"dpkg, pas exemple il ne sera pas mis à niveau." + +#: fai-guide.txt:1062 +msgid "" +"install::\n" +"Install all packages (using `apt-get`) that are specified in the following " +"lines. If a\n" +"hyphen is appended to the package name (with no intervening space),\n" +"the package will be removed, not installed. All package names are\n" +"checked for misspellings. Any package which does not exist, will be\n" +"removed from the list of packages to install. So be careful not to\n" +"misspell any package names." +msgstr "" +"install::\n" +"Pour installer tous les paquets (en utilisant `apt-get`) qui sont précisés\n" +"dans les lignes suivantes. Si un tiret est ajouté au nom du paquet\n" +"(sans espace intermédiaire), le paquet sera supprimé, pas installé.\n" +"Tous les noms de paquets sont vérifiées pour les fautes de frappe.\n" +"Tout paquet qui n’existe pas, sera retiré de la liste des paquets à\n" +"installer. Soyez donc attentif à ne pas mal orthographier les\n" +"noms de paquets." + +#: fai-guide.txt:1065 +msgid "" +"install-norec::\n" +"Like install but without installing the recommended packages." +msgstr "" +"install-norec::\n" +"Comme install, mais sans installer les paquets recommandés." + +#: fai-guide.txt:1069 +msgid "" +"remove::\n" +"Remove all packages that are specified in the following lines. Append\n" +"a + to the package name if the package should be installed." +msgstr "" +"remove::\n" +"Supprimer tous les paquets qui sont pécisés dans les lignes suivantes.\n" +"Si on ajoute un + au nom du paquet, le paquet doit être installé." + +#: fai-guide.txt:1074 +msgid "" +"taskinst::\n" +"Install all packages belonging to the tasks that are specified in the\n" +"following lines using `tasksel(1)`. You can also use _aptitude_ for\n" +"installing tasks." +msgstr "" +"taskinst::\n" +"Installer tous les paquets appartenant aux tâches qui sont spécifiées\n" +"dans les lignes suivantes à l’aide de `tasksel(1)`. Vous pouvez\n" +"aussi utiliser _aptitude_ pour installer les tâches." + +#: fai-guide.txt:1079 +msgid "" +"aptitude::\n" +"Install all packages with the command `aptitude`. This will be the\n" +"default in the future and may replace apt-get and taskinst. Aptitude\n" +"can also install task packages." +msgstr "" +"aptitude::\n" +"Installer tous les paquets avec la commande `aptitude`. Ce sera la\n" +"valeur par défaut à l’avenir et pourra remplacer apt-get et taskinst.\n" +"Aptitude peut aussi installer les tâches de paquets." + +#: fai-guide.txt:1082 +msgid "" +"aptitude-r::\n" +"Same as aptitude with option _--with-recommends_." +msgstr "" +"aptitude-r::\n" +"Idem aptitude avec l’option _--with-recommends_." + +#: fai-guide.txt:1085 +msgid "" +"unpack::\n" +"Download package and unpack only. Do not configure the package." +msgstr "" +"unpack::\n" +"Télécharger les paquets et les décompresser seulement. Ne pas configurer les\n" +"paquets." + +#: fai-guide.txt:1094 +msgid "" +"dselect-upgrade::\n" +"Set package selections using the following lines and install or remove\n" +"the packages specified. These lines are the output of the command\n" +"_dpkg --get-selections_. It's not recommended to use this format,\n" +"since you are also specifying all packages which are only installed\n" +"because of a dependency or a recommends. It's better just to specify\n" +"the pacakge you like to have, and to let FAI (and apt-get) resolve the\n" +"dependencies." +msgstr "" +"dselect-upgrade::\n" +"Definir des sélections des paquets en utilisant les lignes suivantes puis\n" +"installer ou supprimer les paquets précisés. Ces lignes sont le résultat\n" +"de la commande _dpkg --get-selections_. Il est recommandé de ne pas\n" +"utiliser ce format, puisque cela spécifie aussi tous les\n" +"paquets qui sont installés seulement en raison d’une dépendance ou\n" +"d'une recommandation. Il vaut mieux juste spécifier le paquet que vous\n" +"voulez avoir, et de laisser FAI (et apt-get) résoudre les dépendances." + +#: fai-guide.txt:1105 +msgid "" +"Multiple lines with lists of space separated names of packages follow\n" +"the PACKAGES lines. All dependencies are resolved. Packages with\n" +"suffix _-_ (eg. _lilo-_) will be removed instead of installed. The\n" +"order of the packages doesn't matter. If you like to install\n" +"packages from another release than the default, you can append the\n" +"release name to the package name like in\n" +"_openoffice.org/etch-backports_. You can also specify a certain\n" +"version like _apt=0.3.1_. More information on these features are\n" +"described in `aptitude(8)`." +msgstr "" +"Plusieurs lignes avec des listes de noms de paquets séparés par des\n" +"espaces suivent les directive PACKAGES. Toutes les dépendances sont\n" +"résolues. Les paquets avec suffixe _-_ (par exemple, _lilo-_) seront\n" +"supprimés au lieu d'être installés. L’ordre des paquet n’a pas\n" +"d’importance. Si vous souhaitez installer des paquets d’une autre\n" +"version que la valeur par défaut, vous pouvez ajouter le nom de la\n" +"version au nom du paquet comme dans _openoffice.org/etch-backports_.\n" +"Vous pouvez également spécifier une certaine version comme _apt=0.3.1_.\n" +"Plus d’informations sur ces fonctionnalités sont décrites dans\n" +"`aptitude(8)`." + +#: fai-guide.txt:1109 +msgid "" +"You can specify additional parameters for the package manager adding\n" +"_key=value_ after _PACKAGES _. Currently we support\n" +"_release=_ which will add _-t _ when installing packages." +msgstr "" +"On peut spécifier des paramètres supplémentaires pour le gestionnaire de paquets\n" +"en ajoutant des paires _cle=valeur_ après _PACKAGES _. les paires clé, valeur\n" +"actuellement supportées sont _release=_ qui ajoute _-t _ durant\n" +"l'installation des paquets." + +#: fai-guide.txt:1115 +msgid "" +"Example:\n" +"----\n" +"PACKAGES install-norec release=testing\n" +"nvidia-smi\n" +"----" +msgstr "" +"Exemple:\n" +"----\n" +"PACKAGES install-norec release=testing\n" +"nvidia-smi\n" +"----" + +#: fai-guide.txt:1120 +msgid "" +"This will install the nvidia-smi package from the testing release,\n" +"including the dependencies. Don't forget to add an entry into\n" +"'sources.list'. You may also want to adjust the apt pinning (see\n" +"'apt_references(5)')." +msgstr "" +"Cela installerait le paquet nvidia-smi de la distribution testing,\n" +"en incluant les dépendances. N'oubliez pas d'ajouter une entrée dans\n" +"'sources.list'. Vous pouvez aussi vouloir ajuste l'épinglage apt (apt pinning)\n" +"(voir 'apt_references(5)')" + +#: fai-guide.txt:1129 +msgid "" +"A line which contains the _PRELOADRM_ commands, downloads a file using\n" +"`wget(1)` into a directory before installing the packages. Using the\n" +"_file:_ URL, this file is copied from +$FAI_ROOT+ to the download\n" +"directory. For example the package `realplayer` needs an archive to\n" +"install the software, so this archive is downloaded to the directory\n" +"'/root'. After installing the packages this file will be removed. If\n" +"the file shouldn't be removed, use the command _PRELOAD_ instead." +msgstr "" +"Une ligne qui contient la commande _PRELOADRM_, télécharge un fichier à\n" +"l’aide de `wget(1)` dans un répertoire avant d’installer les paquets.\n" +"À l’aide d'une URL de type _file:_, ce fichier est copié de +$FAI_ROOT+ vers le\n" +"répertoire de téléchargement. Par exemple, le paquet `realplayer` a\n" +"besoin d’une archive pour installer le logiciel, donc cette archive est\n" +"téléchargée dans le répertoire '/root'. Après l’installation des\n" +"paquets, ce fichier sera supprimé. Si le fichier ne doit pas être\n" +"supprimé, utilisez plutôt la commande _PRELOAD_." + +#: fai-guide.txt:1135 +msgid "" +"You can add an arbitrary boolean expression using FAI classes to\n" +"define when the list of packages should be installed. Here, the\n" +"packages are only installed if the class XORG is defined but the class\n" +"MINT is not defined." +msgstr "" +"On peut ajouter une expression booléenne arbitraire qui utilise des classes FAI pour\n" +"définir quand la liste des paquets devrait être installée. Ici, les\n" +"paquets seront installés seulement si la classe XORG est définie mais la classe\n" +"MINT n'est pas définie." + +#: fai-guide.txt:1142 +msgid "" +"Example:\n" +"----\n" +"PACKAGES install UBUNTU && XORG && ! MINT\n" +"ubuntu-standard\n" +"ubuntu-desktop\n" +"----" +msgstr "" +"Exemple:\n" +"----\n" +"PACKAGES install UBUNTU && XORG && ! MINT\n" +"ubuntu-standard\n" +"ubuntu-desktop\n" +"----" + +#: fai-guide.txt:1148 +msgid "" +"The old way of adding some logic in the PACKAGES lines is still supported:\n" +"It's possible to append a list of class names after the command for\n" +"apt-get. So this _PACKAGES_ command will only be executed when at least\n" +"one of the corresponding classes is defined (logical OR). So you can\n" +"combine many small files into the file DEFAULT." +msgstr "" +"L'ancienne façon d'ajouter des expressions logiques dans les lignes PACKAGES est encore valable :\n" +"Il est possible d'ajouter une liste de noms de classes après la commande pour\n" +"apt-get. Ainsi une telle commande _PACKAGES_ sera exécutée seulement au moins\n" +"une des classes correspondantes est définie (OU logique). On peut donc combiner\n" +"plusieurs petits fichiers dans le fichier DEFAULT." + +#: fai-guide.txt:1157 +msgid "" +"If you want to remove a package name from a certain class was part of\n" +"this class before, you should not remove the package name from the\n" +"class file, but instead append a dash (-) to it. This will make sure\n" +"that the package is removed during a softupdate on hosts which were\n" +"installed using the old class definition which included this package\n" +"name." +msgstr "" +"Si vous souhaitez supprimer un nom de paquet d’une certaine classe\n" +"faisait partie de cette classe précédemment, vous ne devez pas supprimer le\n" +"nom du paquet classe, mais plutôt de lui ajouter un tiret (-). Cela\n" +"garantira que le paquet soit enlevé pendant une mise a jour sur des hôtes\n" +"qui étaient installés en utilisant l’ancienne définition de classe qui\n" +"comprenait ce nom de paquet." + +#: fai-guide.txt:1160 +msgid "" +"If you specify a package that does not exist this package will be\n" +"removed automatically from the installation list only if the command " +"_install_ is used." +msgstr "" +"Si vous spécifiez un paquet qui n’existe pas, ce paquet sera supprimé\n" +"automatiquement de la liste d’installation uniquement si la commande\n" +"_install_ est utilisée." + +#: fai-guide.txt:1169 +msgid "" +"The concept of classes priority allows a higher priority class (one\n" +"that comes later in the sequence of classes) to override the selection\n" +"of packages of a lower priority class. For this to work correctly,\n" +"the higher priority class must use the same _PACKAGES_ command (e.g.\n" +"_PACKAGES install-norec_ instead of just _PACKAGES install_) as the one\n" +"used by the class it is trying to override. This is useful to suppress\n" +"installation of a package, for example, to avoid installing the 'linuxlogo'\n" +"package installed by class FAIBASE:" +msgstr "" +"Le concept de priorité des classes permet à une classe de priorité plus élevée (qui\n" +"arrive plus tard dans la séquence des classes) d'écraser les sélections des\n" +"paquets de priorité plus basse. Pour que cela fonctionne correctement,\n" +"les classes de priorité plus élevée doivent utiliser les mêmes commandes _PACKAGES_ (par exemple\n" +"_PACKAGES install-norec_ au lieu de seulement _PACKAGES install_) que celles qu'utilisent\n" +"la classe qu'on essaie d'écraser. Cela est utile pour supprimer\n" +"l'installation d'un paquet, par exemple, pour éviter d'installer le paquet\n" +"'linuxlogo' installé par la classe FAIBASE :" + +#: fai-guide.txt:1179 +msgid "" +"----\n" +"# example of how to override:\n" +"#\n" +"# On FAIBASE we have:\n" +"# PACKAGES install-norec\n" +"# linuxlogo\n" +"#\n" +"# We want to _not_ install linuxlogo, and it is in a\n" +"# install-norec section, so we must also use install-norec." +msgstr "" +"----\n" +"# exemple montrant comment écraser :\n" +"#\n" +"# Dans FAIBASE il y a :\n" +"# PACKAGES install-norec\n" +"# linuxlogo\n" +"#\n" +"# On veut _ne pas_ installer linuxlogo, et il se trouve dans\n" +"# une section install-norec, donc il faut aussi utiliser install-norec." + +#: fai-guide.txt:1183 +msgid "" +"PACKAGES install-norec\n" +"linuxlogo-\n" +"----" +msgstr "" +"PACKAGES install-norec\n" +"linuxlogo-\n" +"----" + +#: fai-guide.txt:1185 +msgid "=== [[cscripts]] Customization scripts" +msgstr "=== [[cscripts]]Scripts de personnalisation" + +#: fai-guide.txt:1191 +msgid "" +"The command `fai-do-scripts(1)` is called to execute all scripts in\n" +"this directory. If a directory with a class name exists, all scripts\n" +"matching '^[0-9][0-9]*' are executed in alphabetical order. So it's\n" +"possible to use scripts of different languages (shell, cfengine,\n" +"Perl, Python, Ruby, expect,..) for one class." +msgstr "" +"La commande `fai-do-scripts(1)` est lancée pour exécuter tous les\n" +"scripts dans ce répertoire. Si un répertoire avec un nom de classe\n" +"existe, tous les scripts correspondant à l'expression _^[0-9][0-9]*_ sont exécutés\n" +"par ordre alphabétique. Il est donc possible d’utiliser des scripts de\n" +"différentes langages (shell, cfengine, Perl, Python, Ruby, expect,..)\n" +"pour une classe." + +#: fai-guide.txt:1194 +msgid "" +"Thoses scripts write their output to sripts.log. The file status.log\n" +"contains the names of all scripts executed and their exit status." +msgstr "" +"Ces scripts écrivent leur sortie standard dans scripts.log. Le fichier status.log\n" +"contient les noms de tous les scripts exécutés et leur statut de terminaison." + +#: fai-guide.txt:1196 +msgid "==== [[shell]]Shell scripts" +msgstr "==== [[shell]]Scripts shell" + +#: fai-guide.txt:1202 +msgid "" +"Most scripts are Bourne shell scripts. Shell scripts are useful if the\n" +"configuration task only needs to call some shell commands or create a\n" +"file from scratch. In order not to write many short scripts, it's\n" +"possible to use the `ifclass` command for testing if certain classes\n" +"are defined." +msgstr "" +"La plupart des scripts sont des scripts Bourne shell. Les scripts shell\n" +"sont utiles si la tâche de configuration n'a besoin d'appeler que\n" +"quelques commandes shell ou créer un fichier à partir de zéro. Afin d'éviter\n" +"d'écrire beaucoup de scripts courts, il est possible d’utiliser la\n" +"commande `ifclass` pour tester si certaines classes sont définies." + +#: fai-guide.txt:1206 +msgid "" +"----\n" +"ifclass -o A B C\n" +"----" +msgstr "" +"----\n" +"ifclass -o A B C\n" +"----" + +#: fai-guide.txt:1210 +msgid "" +"checks if one of classes A, B or C are defined. Using -a (logical\n" +"AND) checks if all classes of a list are defined. The command 'ifclass\n" +"C' checks if only class C is defined." +msgstr "" +"Vérifie si l’une des classes A, B ou C est définie. L’utilisation de -a\n" +"(ET, AND logique) vérifie si toutes les classes d’une liste sont définies.\n" +"La commande 'ifclass C' vérifie si seule la classe C est définie." + +#: fai-guide.txt:1215 +msgid "" +"For copying files with classes, use the command\n" +"`fcopy(8)`. If you want to extract an archive using classes, use\n" +"`ftar(8)`. For appending lines to a configuration file use `ainsl(1)`\n" +"instead of just +echo string >> filename+." +msgstr "" +"Pour copier des fichiers avec des classes, utilisez la commande\n" +"`fcopy(8)`. Si vous voulez extraire une archive à l’aide de classes,\n" +"utilisez `ftar(8)`. Pour ajouter des lignes à un fichier de\n" +"configuration, utilisez `ainsl(1)` au lieu de simplement\n" +"+echo string >> filename+." + +#: fai-guide.txt:1220 +msgid "" +"FAI also supports 'zsh(1)' scripts during the\n" +"customization task. Within scripts, the variable +$classes+ holds a space\n" +"separated list with the names of all defined classes." +msgstr "" +"FAI prend également en charge les scripts 'zsh(1)' pendant la tâche de\n" +"personnalisation. Dans les scripts, la variable +$classes+ contient\n" +"une liste séparée par des espaces avec les noms de toutes les classes\n" +"définies." + +#: fai-guide.txt:1222 +msgid "==== [[cfengine]]Cfengine scripts" +msgstr "" + +#: fai-guide.txt:1228 +msgid "" +"CFEngine has a rich set of functions to edit existing configuration\n" +"files, e.g _LocateLineMatching, ReplaceAll, InsertLine,\n" +"AppendIfNoSuchLine, HashCommentLinesContaining_. But it can't handle\n" +"variables which are undefined. If a variable is undefined, the whole\n" +"cfengine script will abort." +msgstr "" + +#: fai-guide.txt:1231 +msgid "" +"More information can be found in the manual page `cfengine(8)` or at\n" +"the cfengine homepage https://www.cfengine.com." +msgstr "" + +#: fai-guide.txt:1234 +msgid "=== [[hooks]]Hooks" +msgstr "" + +#: fai-guide.txt:1247 +msgid "" +"Hooks let you specify functions or programs which are run at certain\n" +"steps of the installation process. Before a task is called,\n" +"FAI searches for existing hooks for this task and executes them. As\n" +"you might expect, classes are also used when calling hooks. Hooks are\n" +"executed for every defined class. You only have to create the hook\n" +"with the name for the desired class and it will be used. If several\n" +"hooks for a task exists, they are called in the order defined by the\n" +"classes. If _debug_ is included in +$FAI_FLAG+ the option _-d_ is\n" +"passed to all hooks, so you can debug your own hooks. If some default\n" +"tasks should be skipped, use the subroutine _skiptask_ and a list of\n" +"default tasks as parameters. In the examples provided, the hooks of\n" +"the class CENTOS skips some Debian specific tasks." +msgstr "" + +#: fai-guide.txt:1254 +msgid "" +"The directory '$FAI/hooks/' contains all hooks. A hook is an executable\n" +"file following the naming scheme 'taskname.CLASSNAME[.sh]' (e.g.\n" +"'repository.CENTOS' or 'savelog.LAST.sh). The\n" +"task name specifies which task to precede executing this hook, if the\n" +"specified class is defined for the installing client. See section\n" +"<> for a complete list of default tasks that can be used." +msgstr "" + +#: fai-guide.txt:1261 +msgid "" +"A hook of the form _hookprefix.classname_ can't define variables for\n" +"the installation script, because it's a subprocess. But you can use\n" +"any binary executable or any script you wrote. Hooks that have the\n" +"suffix _.sh_ (e.g. 'partition.DEFAULT.sh') must be Bourne\n" +"shell scripts and are sourced. So it's possible to redefine variables\n" +"for the installation scripts." +msgstr "" + +#: fai-guide.txt:1267 +msgid "" +"In the first part of FAI, all hooks with prefix _confdir_ are called.\n" +"Those hooks can not be located in the config space, since it's not yet\n" +"available. Therefore these hooks are the only hooks located in\n" +"+$nfsroot+'/$FAI/hooks' on the install server. All other hooks are\n" +"found in '$FAI_CONFIGDIR/hooks' on the install server." +msgstr "" + +#: fai-guide.txt:1273 +msgid "" +"All hooks that are called before classes are defined can only use the\n" +"following classes: _DEFAULT $HOSTNAME LAST_. If a hook for class\n" +"_DEFAULT_ should only be called if no hook for class +$HOSTNAME+ is\n" +"available, insert these lines to the default hook:" +msgstr "" + +#: fai-guide.txt:1276 +msgid "" +"----\n" +"hookexample.DEFAULT:" +msgstr "" + +#: fai-guide.txt:1278 +msgid "#! /bin/sh" +msgstr "" + +#: fai-guide.txt:1286 +msgid "" +"# skip DEFAULT hook if a hook for $HOSTNAME exists\n" +"scriptname=$(basename $0 .DEFAULT)\n" +"[-f $FAI/hooks/$scriptname.$HOSTNAME ] && exit\n" +"# here follows the actions for class DEFAULT\n" +".\n" +".\n" +"----" +msgstr "" + +#: fai-guide.txt:1288 +msgid "Some examples for what hooks could be used:" +msgstr "" + +#: fai-guide.txt:1290 +msgid "- Load kernel modules before classes are defined in '$FAI/class'." +msgstr "" + +#: fai-guide.txt:1292 +msgid "- Send an email to the administrator if the installation is finished." +msgstr "" + +#: fai-guide.txt:1294 +msgid "- Install a diskless client and skip local disk partitioning." +msgstr "" + +#: fai-guide.txt:1296 +msgid "" +"- Have a look at +hooks/debconf.IMAGE+ for how to clone a machine using a " +"file system image." +msgstr "" + +#: fai-guide.txt:1298 +msgid "=== [[faiflags]]FAI flags" +msgstr "" + +#: fai-guide.txt:1302 +msgid "" +"The variable +$FAI_FLAGS+ contains a space separated list of\n" +"flags. Flags are normally defined in the pxelinux.cfg file which\n" +"should be created by 'fai-chboot(1)'. The following flags are known:" +msgstr "" + +#: fai-guide.txt:1307 +msgid "" +"verbose::\n" +"Create verbose output during installation. This should always be the\n" +"first flag, so consecutive definitions of flags will be verbosely\n" +"displayed." +msgstr "" + +#: fai-guide.txt:1314 +msgid "" +"debug::\n" +"Create debug output. No unattended installation is performed. During\n" +"package installation you have to answer all questions of the\n" +"postinstall scripts on the client's console. A lot of debug\n" +"information will be printed out. This flag is only useful for FAI\n" +"developers." +msgstr "" + +#: fai-guide.txt:1321 +msgid "" +"sshd::\n" +"Start the ssh daemon to enable remote logins.\n" +"You can then log in as _root_ to all install clients during the\n" +"installation. The default password is _fai_ and can be changed by\n" +"setting `FAI_ROOTPW` in `nfsroot.conf(5)`. To log in from your server\n" +"to the install client (named demohost in this example) use:" +msgstr "" + +#: fai-guide.txt:1327 +msgid "" +"----\n" +"$ ssh root@demohost\n" +"Warning: Permanently added 'demohost,192.168.33.100' to the list of known " +"hosts.\n" +"root@demohost's password:\n" +"----" +msgstr "" + +#: fai-guide.txt:1331 +msgid "" +"This is only the root password during the\n" +"installation process, not for the new installed system. You can also\n" +"log in without a password when using +$SSH_IDENTITY+." +msgstr "" + +#: fai-guide.txt:1340 +msgid "" +"createvt::\n" +"Create two virtual terminals and execute a bash if _ctrl-c_ is typed\n" +"in the console terminal. The additional terminals can be accessed by\n" +"typing _Alt-F2_ or _Alt-F3_. Otherwise, no terminals are available and\n" +"typing _ctrl-c_ will reboot the install client. Setting this flag is\n" +"useful for debugging. If you want an installation which should not be\n" +"interruptible, do not set this flag." +msgstr "" + +#: fai-guide.txt:1344 +msgid "" +"menu::\n" +"This enables a user menu for selecting a profile. All files\n" +"+class/*.profile+ are read and a curses based menu will be created." +msgstr "" + +#: fai-guide.txt:1351 +msgid "" +"screen::\n" +"Run FAI inside a `screen(1)` session. The session is called FAI.\n" +"If you log in via ssh from remote you can attach to the session using:\n" +"----\n" +"$ screen -x\n" +"----" +msgstr "" + +#: fai-guide.txt:1358 +msgid "" +"tmux::\n" +"Run FAI inside a `tmux(1)` session. The session is called FAI.\n" +"If you log in via ssh from remote you can attach to the session using:\n" +"----\n" +"$ tmux attach\n" +"----" +msgstr "" + +#: fai-guide.txt:1365 +msgid "" +"reboot::\n" +"Reboot the install client after installation is finished without\n" +"typing RETURN on the console. If this flag is not set, and error.log\n" +"contains anything, the install client will stop and wait that you\n" +"press RETURN. If no errors occurred, the client will always reboot\n" +"automatically." +msgstr "" + +#: fai-guide.txt:1369 +msgid "" +"halt::\n" +"Halt the install client at the end of the installation, instead of\n" +"rebooting into the new system." +msgstr "" + +#: fai-guide.txt:1374 +msgid "" +"initial::\n" +"Used by `setup-storage(8)`. Partitions marked with +preserve_reinstall+\n" +"are preserved unless this flag is set. Often, this flag is set in a\n" +"file 'class/*.var' by using setting 'flag_initial=1'." +msgstr "" + +#: fai-guide.txt:1376 +msgid "== [[install]] FAI installs your plan" +msgstr "" + +#: fai-guide.txt:1378 +msgid "=== The early part of an installation" +msgstr "" + +#: fai-guide.txt:1386 +msgid "" +"After the kernel has booted, it mounts the root file system via NFS\n" +"from the install server and starts the script\n" +"'/usr/sbin/fai' footnote:[Since the root file system on the clients is " +"mounted via\n" +"NFS, `fai` is located in\n" +"'/srv/fai/nfsroot/usr/sbin' on the install\n" +"server.]. This script controls the sequence of the\n" +"installation. No other scripts in '/etc/init.d/' are used." +msgstr "" + +#: fai-guide.txt:1391 +msgid "" +"The configuration space is made available via the configured method\n" +"(an NFS mount by default) from the install server to the path defined\n" +"in '$FAI' footnote:['$FAI' is an internal variable used by the FAI\n" +"scripts. By default the path is _/var/lib/fai/config_.]" +msgstr "" + +#: fai-guide.txt:1394 +msgid "=== [[bootmesg]]Boot messages" +msgstr "" + +#: fai-guide.txt:1398 +msgid "" +"When booting the install client from network card with PXE you will see " +"some\n" +"messages like this:\n" +"include::includes/bootexample.txt[]" +msgstr "" + +#: fai-guide.txt:1405 +msgid "" +"At this point the install client has successfully received the network\n" +"config via DHCP and the kernel and initrd via TFTP. It now boots the\n" +"Linux kernel and the initrd. If everything went right, the initrd\n" +"mounts the nfsroot footnote:['/srv/fai/nfsroot' from the install\n" +"server via NFS] and the FAI scripts are started. The first\n" +"thing you see is the red FAI copyright message." +msgstr "" + +#: fai-guide.txt:1407 +msgid "include::includes/fai-1st-part.txt[]" +msgstr "" + +#: fai-guide.txt:1410 +msgid "" +"You can also see the list of FAI classes, that are defined for this\n" +"host. This list is very important for the rest of the installation." +msgstr "" + +#: fai-guide.txt:1414 +msgid "" +"The first task is called _confdir_, which is responsible for getting\n" +"access to the config space. Here, we use an NFS mount from the install\n" +"server as you can see on the console (and later in the logs)." +msgstr "" + +#: fai-guide.txt:1419 +msgid "" +"----\n" +"FAI_CONFIG_SRC is set to nfs://faiserver/srv/fai/config\n" +"Configuration space faiserver:/srv/fai/config mounted to /var/lib/fai/" +"config\n" +"----" +msgstr "" + +#: fai-guide.txt:1424 +msgid "" +"Before the installation is started (+$FAI_ACTION=install+) the computer\n" +"beeps three times. So, be careful when you hear three beeps but you do\n" +"not want to perform an installation and let FAI erase all yout data on\n" +"the local disk!" +msgstr "" + +#: fai-guide.txt:1427 +msgid "=== [[reboot]]Rebooting the computer into the new system" +msgstr "" + +#: fai-guide.txt:1433 +msgid "" +"For rebooting the computer during or at the end of the installation you\n" +"should use the command `faireboot` in favour of the normal reboot command.\n" +"Use `faireboot` also if logged in from remote. If the installation\n" +"hasn't finished, use _faireboot -s_, so the log files are also copied\n" +"to the install server." +msgstr "" + +#: fai-guide.txt:1436 +msgid "" +"If the installation has finished successfully, the computer should boot a\n" +"small Debian system. You can login as user _demo_ or _root_ with password " +"_fai_." +msgstr "" + +#: fai-guide.txt:1438 +msgid "=== [[isetup]]Starting FAI (task confdir)" +msgstr "" + +#: fai-guide.txt:1445 +msgid "" +"After the install client has booted only the script '/usr/sbin/fai' is\n" +"executed. It will do some minimal initialization. The variable\n" +"+$FAI_CONFIG_SRC+ footnote:[It is defined on the kernel command line]\n" +"is used to get access to the FAI configuration space which is then\n" +"available in the directory +$FAI+ footnote:[/var/lib/fai/config]. FAI\n" +"will not proceed without the config space." +msgstr "" + +#: fai-guide.txt:1449 +msgid "" +"You can access the config space using different methods. Supported\n" +"methods are: nfs:, file:, cvs:, svn: git:, hg:, http: and detect:.\n" +"See `fai.conf(5)` for a detailed description of these methods." +msgstr "" + +#: fai-guide.txt:1452 +msgid "" +"=== [[iclass]]Defining classes and variables (tasks defclass and defvar)" +msgstr "" + +#: fai-guide.txt:1456 +msgid "" +"The command `fai-class(1)` executes scripts in '$FAI/class' for defining\n" +"classes. If the scripts write a string to stdout, this will be defined\n" +"as a class. Read all the details in the man page of `fai-class(1)`." +msgstr "" + +#: fai-guide.txt:1461 +msgid "" +"After defining the classes, every file matching _.var_ with a prefix\n" +"which matches a defined class is sourced to define variables. It must\n" +"contain valid shell code." +msgstr "" + +#: fai-guide.txt:1463 +msgid "" +"=== [[ipartition]]Partitioning local disks, creating file systems (task " +"partition)" +msgstr "" + +#: fai-guide.txt:1466 +msgid "" +"For the disk partitioning exactly one disk configuration file from\n" +"'$FAI/disk_config' is selected using classes." +msgstr "" + +#: fai-guide.txt:1468 +msgid "The format of the disk configuration is similar to a fstab file." +msgstr "" + +#: fai-guide.txt:1475 +msgid "" +"The partitioning tool `setup-storage(8)` performs all commands\n" +"necessary for creating the disk partition layout, software RAID, LVM\n" +"and for creating the file systems. Disks and partitions may easily be\n" +"referenced by disk1.1, disk2.4 etc. Read the manual page of\n" +"`setup-storage(8)` for a detailed description and some examples of the\n" +"format." +msgstr "" + +#: fai-guide.txt:1480 +msgid "" +"=== [[ipreseed]]Debconf preseeding (task debconf)\n" +"Files in '$FAI/debconf' are used for the usual `debconf(7)` preseeding\n" +"if the file names match a class name." +msgstr "" + +#: fai-guide.txt:1482 +msgid "=== [[ipackages]]Installing software packages (task instsoft)" +msgstr "" + +#: fai-guide.txt:1486 +msgid "" +"The command `install_packages(8)` reads the config files from\n" +"'$FAI/package_config' in a class based manner and installs software\n" +"packages on the new file system." +msgstr "" + +#: fai-guide.txt:1490 +msgid "" +"It installs the packages using `apt-get(8)`, `aptitude(1)`, `yum` or other\n" +"package tools without any manual interaction needed. Package\n" +"dependecies are also resolved by the package tools." +msgstr "" + +#: fai-guide.txt:1492 +msgid "" +"The format of the configuration files is described in <>." +msgstr "" + +#: fai-guide.txt:1495 +msgid "" +"Additionaly FAI will install packages ('.deb' or .rpm') from the\n" +"directories '$FAI/pkgs/'." +msgstr "" + +#: fai-guide.txt:1498 +msgid "=== [[icscripts]]Site specific customization (task configure)" +msgstr "" + +#: fai-guide.txt:1505 +msgid "" +"Often the default configurations of the software packages will not\n" +"meet your site-specific needs. You can call arbitrary scripts which\n" +"adjust the system configuration. Therefore the command\n" +"`fai-do-scripts(1)` executes scripts in '$FAI/scripts' in a class\n" +"based manner. It is possible to have several scripts of different\n" +"types (shell, cfengine, ...) to be executed for one class." +msgstr "" + +#: fai-guide.txt:1512 +msgid "" +"The default set of scripts in '$FAI/scripts' include examples for\n" +"installing Debian and Rocky Linux machines. They set the root password, add\n" +"a user account (set by '$username, default to demo), set the timezone, " +"configure the network for DHCP\n" +"or using a fixed IP address, setup grub and more.\n" +"They should do a reasonable job for your installation. You can edit\n" +"them or add new scripts to match your local needs." +msgstr "" + +#: fai-guide.txt:1514 +msgid "More information about these scripts are described in <>." +msgstr "" + +#: fai-guide.txt:1517 +msgid "=== [[isavelog]]Saving log files (task savelog)" +msgstr "" + +#: fai-guide.txt:1528 +msgid "" +"When all tasks are finished, the log files are written to\n" +"_/var/log/fai/$HOSTNAME/install/_\n" +"footnote:['/var/log/fai/localhost/install/' is a link to this\n" +"directory.] on the new system and to the account on the install server\n" +"if +$LOGUSER+ is defined (you have to enable this in\n" +"'/srv/fai/config/class/FAIBASE.var'). It is also possible to specify\n" +"another host as log saving destination through the variable\n" +"+$LOGSERVER+. If +$LOGSERVER+ is not defined, FAI uses the variable\n" +"+$SERVER+ which is only defined during an initial installation (by\n" +"get-boot-info)." +msgstr "" + +#: fai-guide.txt:1537 +msgid "" +"Additionally, two symlinks will be created to indicated the last\n" +"directory written to. The symlink 'last' points to the log directory\n" +"of the last FAI action performed. The symlinks 'last-install' and\n" +"'last-sysinfo' point to the directory of the last corresponding\n" +"action. By default log files will be copied to the log\n" +"server using scp. You can use the variable +$FAI_LOGPROTO+ in file\n" +"'fai.conf(5)' to choose another method for saving logs to the remote\n" +"server. Here's an example of the symlink structure:" +msgstr "" + +#: fai-guide.txt:1547 +msgid "" +"----\n" +"lrwxrwxrwx 1 fai fai 23 Dec 2 2013 last-sysinfo -> sysinfo-" +"20131202_161237\n" +"drwxr-xr-x 2 fai fai 4096 Dec 2 2013 sysinfo-20131202_161237\n" +"drwxr-xr-x 2 fai fai 4096 Feb 14 2014 install-20140214_142150\n" +"drwxr-xr-x 2 fai fai 4096 Dec 2 11:47 install-20141202_113918\n" +"lrwxrwxrwx 1 fai fai 23 Dec 4 13:22 last-install -> install-" +"20141204_131351\n" +"lrwxrwxrwx 1 fai fai 23 Dec 4 13:22 last -> install-20141204_131351\n" +"drwxr-xr-x 2 fai fai 4096 Dec 4 13:22 install-20141204_131351\n" +"----" +msgstr "" + +#: fai-guide.txt:1549 +msgid "Examples of the log files can be found at https://fai-project.org/logs." +msgstr "" + +#: fai-guide.txt:1552 +msgid "=== [[ireboot]]Reboot the new installed system" +msgstr "" + +#: fai-guide.txt:1558 +msgid "" +"Before rebooting, the install client calls `fai-chboot -d `\n" +"on the install server, to disable its own PXELINUX\n" +"configuration. Otherwise, it would restart the installation during the\n" +"next boot. Normally this should boot the new installed system from\n" +"its second boot device, the local hard disk." +msgstr "" + +#: fai-guide.txt:1561 +msgid "" +"At the end, the system is automatically rebooted if \"reboot\" was added to\n" +"+$FAI_FLAGS+." +msgstr "" + +#: fai-guide.txt:1565 +msgid "== [[advanced]]Advanced FAI topics" +msgstr "" + +#: fai-guide.txt:1568 +msgid "=== [[checkbootp]]Checking parameters received from DHCP servers" +msgstr "" + +#: fai-guide.txt:1574 +msgid "" +"If the install client boots you can check\n" +"if all information from the DHCP daemon are received\n" +"correctly. The received information is written to\n" +"'/tmp/fai/boot.log'. An example of the result of a DHCP request can be\n" +"found in the sample log files." +msgstr "" + +#: fai-guide.txt:1579 +msgid "=== [[fai-monitor]]Monitoring multiple client installations" +msgstr "" + +#: fai-guide.txt:1586 +msgid "" +"You can monitor the installation of all install clients with the\n" +"command `fai-monitor(8)`. All clients check if this daemon is running\n" +"on the install server (or the machine defined by the variable\n" +"+$monserver+). Each time a task starts or ends, a message is sent. The\n" +"FAI monitor daemon prints this messages to standard output. There's\n" +"also a graphical frontend available, called `fai-monitor-gui(1)`." +msgstr "" + +#: fai-guide.txt:1590 +msgid "" +"----\n" +"$ fai-monitor | fai-monitor-gui - &\n" +"----" +msgstr "" + +#: fai-guide.txt:1593 +msgid "=== [[mac]]Collecting Ethernet addresses for multiple hosts" +msgstr "" + +#: fai-guide.txt:1600 +msgid "" +"You have to collect all Ethernet (MAC) addresses of the install\n" +"clients and assign a host name and IP address to each client. To\n" +"collect the MAC addresses, boot your install clients.\n" +"You can already do this before any DHCP daemon is running in your\n" +"subnet. They will fail to boot (because of the missing DHCP or missing TFTP)," +"\n" +"but you can still collect the MAC addresses." +msgstr "" + +#: fai-guide.txt:1604 +msgid "" +"While the install clients are booting, they send broadcast packets to the\n" +"LAN. You can log the MAC addresses of these hosts by running the\n" +"following command simultaneously on the server:" +msgstr "" + +#: fai-guide.txt:1608 +msgid "" +"----\n" +"faiserver# tcpdump -qtel broadcast and port bootpc >/tmp/mac.list\n" +"----" +msgstr "" + +#: fai-guide.txt:1612 +msgid "" +"After the hosts have been sent some broadcast packets abort `tcpdump`\n" +"by typing _ctrl-c_. You get a list of all\n" +"unique MAC addresses with these commands:" +msgstr "" + +#: fai-guide.txt:1616 +msgid "" +"----\n" +"faiserver$ perl -ane 'print \"\\U$F[0]\\n" +"\"' /tmp/mac.list|sort|uniq\n" +"----" +msgstr "" + +#: fai-guide.txt:1623 +msgid "" +"After that, you only have to assign these MAC addresses to host names\n" +"and IP addresses ('/etc/ethers' and '/etc/hosts' or corresponding NIS\n" +"maps). With this information you can configure your `DHCP`\n" +"daemon (see the section <>). footnote:[I recommend to write the " +"MAC\n" +"addresses (last three bytes will suffice if you have network cards\n" +"from the same vendor) and the host name in the front of each chassis.]" +msgstr "" + +#: fai-guide.txt:1626 +msgid "==== Debugging the network traffic" +msgstr "" + +#: fai-guide.txt:1631 +msgid "" +"If the client can't successfully boot from the network card, use\n" +"`tcpdump(8)` to look for Ethernet packets between the install server\n" +"and the client. Search also for entries in several log files made by\n" +"`tftpd(8)` and `dhcpd(8)` :" +msgstr "" + +#: fai-guide.txt:1635 +msgid "" +"----\n" +"faiserver$ egrep \"tftpd|dhcpd\" /var/log/*\n" +"----" +msgstr "" + +#: fai-guide.txt:1638 +msgid "=== [[pxeboot]]Details of PXE booting" +msgstr "" + +#: fai-guide.txt:1641 +msgid "" +"Here we describe the details of PXE booting, which are only needed if\n" +"you have problems when booting your install clients." +msgstr "" + +#: fai-guide.txt:1648 +msgid "" +"Almost all modern bootable network cards support the PXE boot environment.\n" +"PXE is the Preboot Execution Environment.\n" +"This requires the PXELINUX bootloader and a special version of the _TFTP_\n" +"daemon, which is available in the Debian packages +pxelinux+ and\n" +"+tftpd-hpa+. PXE booting also needs a DHCP server, so that the network\n" +"card can configure its IP parameters. This is the sequence of a PXE boot:" +msgstr "" + +#: fai-guide.txt:1658 +msgid "" +"* Network card of the client sends its MAC address\n" +"* DHCP server replies with IP configuration for the client\n" +"* Network card configures IP\n" +"* Install client gets the pxelinux.0 binary via TFTP\n" +"* Get the pxelinux.cfg/C0A8210C configuration file via TFTP\n" +"* C0A8210C is the IP address of the client in hexadecimal\n" +"* This configuration contains kernel, initrd and additional kernel\n" +"command line parameters, which was created by `fai-chboot`.\n" +"* Get the kernel and initrd via TFTP." +msgstr "" + +#: fai-guide.txt:1663 +msgid "" +"Example of a pxelinux.cfg file:\n" +"----\n" +"default fai-generated" +msgstr "" + +#: fai-guide.txt:1668 +msgid "" +"label fai-generated\n" +"kernel vmlinuz-6.1.0-17-amd64\n" +"append initrd=initrd.img-6.1.0-17-amd64 ip=dhcp root=/srv/fai/nfsroot " +"rootovl FAI_FLAGS=verbose,sshd,createvt FAI_CONFIG_SRC=nfs://faiserver/srv/" +"fai/config FAI_ACTION=install\n" +"----" +msgstr "" + +#: fai-guide.txt:1673 +msgid "" +"See '/usr/share/doc/syslinux/pxelinux.doc' for more detailed\n" +"information about PXELINUX. FAI uses the lpxelinux.0 binary which also\n" +"supports loading the kernel and initrd via FTP or HTTP. The command\n" +"'fai-chboot(8)' supports this with the option '-U'." +msgstr "" + +#: fai-guide.txt:1676 +msgid "" +"=== [[Customizing your install server setup]]Customizing your install server " +"setup" +msgstr "" + +#: fai-guide.txt:1680 +msgid "" +"- local/faster package mirror\n" +"- different loguser\n" +"- local root pw inside nfsroot" +msgstr "" + +#: fai-guide.txt:1686 +msgid "" +"The configuration for the FAI package (not the configuration data for\n" +"the install clients) is defined in 'fai.conf(5)'. Definitions that are\n" +"only used for creating the nfsroot are located in\n" +"'nfsroot.conf(5)'. Check these important variables in 'nfsroot.conf'\n" +"before calling 'fai-setup' or 'fai-make-nfsroot'." +msgstr "" + +#: fai-guide.txt:1692 +msgid "" +"FAI_DEBOOTSTRAP::\n" +"Building the nfsroot uses the command `debootstrap(8)`. It needs the " +"location of a Debian mirror and the\n" +"name of the distribution (like bullsseye, bookworm, sid) for which the basic " +"Debian\n" +"system should be built. Do not use different distributions here and in\n" +"'/etc/fai/apt/sources.list'. This will create a broken nfsroot." +msgstr "" + +#: fai-guide.txt:1698 +msgid "" +"NFSROOT_ETC_HOSTS::\n" +"This variable is only needed if the clients do not have access to a DNS " +"server.\n" +"This multiline variable is added to /etc/hosts inside the\n" +"nfsroot. Then the install clients can access those hosts by name\n" +"without using DNS." +msgstr "" + +#: fai-guide.txt:1705 +msgid "" +"The content of '/etc/fai/apt/sources.list' is\n" +"used by the install server and also by the clients. If your install\n" +"server has multiple network cards and different host names for each\n" +"card (as for a Beowulf server), use the install server name which is\n" +"known by the install clients." +msgstr "" + +#: fai-guide.txt:1714 +msgid "" +"If you have problems running `fai-setup`, they usually stem from\n" +"`fai-make-nfsroot(8)` which is called by former command. Adding '-v'\n" +"gives you a more verbose output which helps you pinpoint the\n" +"error. The output is written to\n" +"'/var/log/fai/fai-make-nfsroot.log'. footnote:[For debugging purpose\n" +"it may help to enter the chroot environment manually using this\n" +"command. 'faiserver# chroot /srv/fai/nfsroot bash']" +msgstr "" + +#: fai-guide.txt:1724 +msgid "" +"The setup also creates the account _fai_ (defined by +$LOGUSER+) if\n" +"not already available. So you can add a user before calling\n" +"`fai-setup(8)` using the command `adduser(8)` and use this as your\n" +"local account for saving log files. The log files of all install\n" +"clients are saved to the home directory of this account. You should\n" +"change the primary group of this\n" +"account, so this account has write permissions to '/srv/tftp/fai' in\n" +"order to call fai-chboot for creating the PXE configuration for the hosts." +msgstr "" + +#: fai-guide.txt:1732 +msgid "" +"When you make changes to 'fai.conf', 'nfsroot.conf' the\n" +"nfsroot has to be rebuilt by calling `fai-make-nfsroot(8)`. If you\n" +"only like to install a new kernel package to the nfsroot add the flags _-k_ " +"or\n" +"_-K_ to +fai-make-nfsroot+. This will not recreate your nfsroot, but\n" +"only updates your kernel and kernel modules inside the nfsroot or add\n" +"additional packages into the nfsroot." +msgstr "" + +#: fai-guide.txt:1735 +msgid "=== [[cdboot]]Creating a FAI CD or and USB stick" +msgstr "" + +#: fai-guide.txt:1743 +msgid "" +"You can easily create an installation CD (or USB stick) of your\n" +"network installation setup. This will perform the same installation\n" +"and configuration from CD without the need of the install server.\n" +"Therefore you need to create a partial mirror of all Debian packages\n" +"needed for your FAI classes (using `fai-mirror(1)`). Then the command\n" +"`fai-cd(8)` will put this mirror, the nfsroot and the config space\n" +"onto a bootable CD. That's it!" +msgstr "" + +#: fai-guide.txt:1746 +msgid "" +"To easily create the installation CD, you can use the following command\n" +"(for more tuning details see `fai-cd(8)`):" +msgstr "" + +#: fai-guide.txt:1750 +msgid "" +"----\n" +" faiserver# fai-cd -m fai-cd.iso\n" +"----" +msgstr "" + +#: fai-guide.txt:1758 +msgid "" +"This installation CD contains all data needed for the\n" +"installation. The command `fai-cd(8)` puts the nfsroot, the\n" +"configuration space and a subset of the Debian mirror onto a\n" +"CD-ROM. A partial package mirror is created using the command\n" +"`fai-mirror(1)` which contains all packages that are used by the\n" +"classes used in your configuration space. A sample ISO image is\n" +"available at https://fai-project.org/fai-cd." +msgstr "" + +#: fai-guide.txt:1762 +msgid "" +"Using the command `dd(1)` you can also create a bootable USB\n" +"stick by just writing the content of the ISO file to your USB stick\n" +"(here the stick is _/dev/sdf_)." +msgstr "" + +#: fai-guide.txt:1766 +msgid "" +"----\n" +" faiserver# dd if=fai-cd.iso of=/dev/sdf bs=1M\n" +"----" +msgstr "" + +#: fai-guide.txt:1775 +msgid "" +"`mk-data-partition` is a tool that extends an ISO (that will be copied\n" +"to an USB stick) or an USB stick containing an ISO with\n" +"an ext4 or exFAT partition and sets the file system label to MY-DATA.\n" +"This partition is automatically mounted to '/media/data' by FAI.\n" +"You can copy your own _.deb_ packages into this data partition und the\n" +"subdiretories 'pkgs/'. FAI will then install these packages\n" +"if the equivalent class is defined." +msgstr "" + +#: fai-guide.txt:1777 +msgid "Example how to use `mk-data-partition`:" +msgstr "" + +#: fai-guide.txt:1784 +msgid "" +"----\n" +"# mk-data-partition -s 1G -c faicd-large.iso A B\n" +"----\n" +"The former command creates the data partition of size 1 Gbytes inside\n" +"the ISO file and copy directories A and B to it. You can then copy the " +"modified ISO\n" +"onto an USB stick." +msgstr "" + +#: fai-guide.txt:1792 +msgid "" +"If the ISO is already on the USB stick and if it's available as\n" +"_dev/sdf_, you can add a data partition of type exFAT will will use\n" +"the whole remaining part of the USB stick by using this command:\n" +"----\n" +"# mk-data-partition -F /dev/sdf\n" +"----" +msgstr "" + +#: fai-guide.txt:1795 +msgid "=== [[diskimage]]Creating VM disk images using FAI" +msgstr "" + +#: fai-guide.txt:1806 +msgid "" +"The command `fai-diskimage(8)` creates disk\n" +"images, which can be used with a virtual machine like KVM, VMware,\n" +"VirtualBox or a cloud service like OpenStack, GCE, EC2 and others. The\n" +"installation process performs the normal FAI tasks on a raw disk\n" +"image. After the installation you can boot the disk image and have a\n" +"running system. The disk image can also be converted to qcow2 format.\n" +"You do not need to setup the FAI nfsroot when only using\n" +"fai-diskimage. But you need a basefile in your configuration\n" +"space. Setting the variable +$FAI_BASEFILEURL+ will automatically\n" +"download an appropriate base file into your config space." +msgstr "" + +#: fai-guide.txt:1814 +msgid "" +"Here's an example how to create a raw disk image for a host called\n" +"cloud3, with a small set of software packages:\n" +"----\n" +"# export FAI_BASEFILEURL=https://fai-project.org/download/basefiles/\n" +"# fai-diskimage -vu cloud3 -S2G -" +"cDEBIAN,BOOKWORM64,AMD64,FAIBASE,GRUB_PC,DHCPC,DEMO,CLOUD,LAST disk.raw\n" +"----" +msgstr "" + +#: fai-guide.txt:1822 +msgid "" +"This command will create a disk image called ubuntu.qcow2 for a Ubuntu 16.04 " +"desktop\n" +"with hostname set to foobar.\n" +"----\n" +"# export FAI_BASEFILEURL=https://fai-project.org/download/basefiles/\n" +"# cl=DHCPC,UBUNTU,JAMMY,JAMMY64,AMD64,XORG,LAST\n" +"# fai-diskimage -Nvu foobar -S5G -c$cl ubuntu.qcow2\n" +"----" +msgstr "" + +#: fai-guide.txt:1825 +msgid "" +"You can give disk images a try without installing FAI, if you visit\n" +"https://fai-project.org/FAIme/cloud" +msgstr "" + +#: fai-guide.txt:1828 +msgid "=== [[live-image]]Creating a bootable live image" +msgstr "" + +#: fai-guide.txt:1833 +msgid "" +"Creating a bootable live ISO is easy with FAI. You only need two\n" +"steps. First, create your live environment using the command 'fai\n" +"dirinstall'. Don't forget to add the class +LIVEISO+.\n" +"Then create the live ISO using 'fai-cd':" +msgstr "" + +#: fai-guide.txt:1841 +msgid "" +"----\n" +"# cl=\"DEBIAN,BOOKWORM64,AMD64,FAIBASE,XFCE,XORG,DHCPC,DEMO,LIVEISO,LAST\"\n" +"# LC_ALL=C fai -v dirinstall -u xfce33 -c $cl \\\n" +" -s file:///srv/fai/config /srv/xfce\n" +"# fai-cd -s500 -MH -d none -g /etc/fai/grub.cfg.live \\\n" +" -n /srv/xfce live.iso\n" +"----" +msgstr "" + +#: fai-guide.txt:1844 +msgid "" +"The nfsroot is not needed for a live ISO.\n" +"Currently there's no live ISO of the install server available." +msgstr "" + +#: fai-guide.txt:1847 +msgid "=== [[cross-arch]]Building cross-architecture disk images" +msgstr "" + +#: fai-guide.txt:1852 +msgid "" +"Starting FAI 5.4 it's now possible to build a disk image for\n" +"different architectures than the host is running. For example you can\n" +"build an image for 64-bit ARM architecture (aarch64) on a host running on " +"amd64\n" +"architecture. Here are the steps do to:" +msgstr "" + +#: fai-guide.txt:1856 +msgid "" +"----\n" +"# apt install qemu-system-arm qemu-user-static fai-server fai-setup-storage " +"fai-doc qemu-utils\n" +"# fai-mk-configspace" +msgstr "" + +#: fai-guide.txt:1863 +msgid "" +"# export FAI_BASEFILEURL=https://fai-project.org/download/basefiles/\n" +"# fai-diskimage -vu armhost -S2G -" +"cDEFAULT,DHCPC,DEBIAN,ARM64,BUSTER_ARM64,FAIBASE,DEMO,CLOUD,LAST arm64.raw\n" +"# chown your_user_id arm64.raw\n" +"# cp /var/log/fai/armhost/last/vmlinuz* vmlinuz\n" +"# cp /var/log/fai/armhost/last/initrd.img* initrd\n" +"----" +msgstr "" + +#: fai-guide.txt:1868 +msgid "" +"Then you can run qemu as a normal user:\n" +"----\n" +"> qemu-system-aarch64 -m 1000 -M virt,gic_version=3 -cpu cortex-a57 -drive " +"file=arm64.raw,if=virtio,index=1 -no-reboot -nographic -name ARM64 -net " +"nic,name=eth0,model=virtio -net user,name=eth0,-kernel vmlinuz -initrd " +"initrd -append \"console=ttyAMA0 rw ip=dhcp root=/dev/vda1 net.ifnames=0\"\n" +"----" +msgstr "" + +#: fai-guide.txt:1872 +msgid "" +"This works similar for other architectures.\n" +"Keep in mind, that qemu network setup will have poor performance if\n" +"not using the virtio driver as above or tap devices." +msgstr "" + +#: fai-guide.txt:1878 +msgid "" +"You can find the base files for many architectures at\n" +"https://fai-project.org/download/basefiles/, or use `mk-basefile` to\n" +"create your own." +msgstr "" + +#: fai-guide.txt:1881 +msgid "=== [[sysinfo]]FAI rescue system" +msgstr "" + +#: fai-guide.txt:1888 +msgid "" +"If you set the variable +$FAI_ACTION+ to _sysinfo_ (for e.g. by using\n" +"+fai-chboot -S+), the client will not install a new system, but will\n" +"collect a lot of system information.\n" +"If you set +$FAI_ACTION+ to _inventory_ you will only get a few\n" +"hardware information.\n" +"Both actions can be used for FAI as a rescue system." +msgstr "" + +#: fai-guide.txt:1891 +msgid "" +"Type _ctrl-c_ to get a shell or use _Alt-F2_ or _Alt-F3_ and you will get\n" +"another console terminal, if you have added _createvt_ to +$FAI_FLAGS+." +msgstr "" + +#: fai-guide.txt:1899 +msgid "" +"You now have a running Linux system on the install client without\n" +"using the local hard disk. Use this as a rescue system if your local\n" +"disk is damaged or the computer can't boot properly from hard\n" +"disk. You will get a shell and you can execute various commands\n" +"(`dmesg`, `lsmod`, `df`, `lspci`, ...). Look at the log file in\n" +"'/tmp/fai'. There you can find much information about the boot\n" +"process." +msgstr "" + +#: fai-guide.txt:1906 +msgid "" +"FAI mounts all file systems it finds on the local disks read only. It\n" +"also tells you on which partition a file '/etc/fstab' exists. When\n" +"only one file system table is found, the partitions are mounted\n" +"according to this information. Here's an example:" +msgstr "" + +#: fai-guide.txt:1909 +msgid "" +"----\n" +"demohost:~# df -h" +msgstr "" + +#: fai-guide.txt:1921 +msgid "" +"Filesystem Size Used Avail Use% Mounted on\n" +"devtmpfs 4.0M 0 4.0M 0% /dev\n" +"tmpfs 2.0G 0 2.0G 0% /dev/shm\n" +"tmpfs 783M 18M 766M 3% /run\n" +"tmpfs 5.0M 0 5.0M 0% /run/lock\n" +"LiveOS_rootfs 783M 18M 766M 3% /\n" +"192.168.33.250:/srv/fai/config 59G 23G 24G 49% /var/lib/fai/config\n" +"/dev/mapper/vg1-root 7.3G 1.8G 5.2G 26% /target\n" +"/dev/vda1 459M 53M 378M 13% /target/boot\n" +"/dev/mapper/vg1-home 1.4G 72K 1.3G 1% /target/home\n" +"----" +msgstr "" + +#: fai-guide.txt:1924 +msgid "" +"*This method can be used as a rescue environment!* If you need a file\n" +"system with read-write access use the `rwmount` command:" +msgstr "" + +#: fai-guide.txt:1928 +msgid "" +"----\n" +"demohost# rwmount /target/home\n" +"----" +msgstr "" + +#: fai-guide.txt:1930 +msgid "=== [[nonfs]]FAI without NFS" +msgstr "" + +#: fai-guide.txt:1934 +msgid "" +"To boot into FAI and begin the installation sequence\n" +"without using the NFS protocol, you boot the client machine using PXE as\n" +"usual and then retrieve an image containing the nfsroot via http." +msgstr "" + +#: fai-guide.txt:1937 +msgid "" +"To create an image, use fai-cd's -S argument and -M to avoid setting up\n" +"a partial mirror within the image." +msgstr "" + +#: fai-guide.txt:1941 +msgid "" +"----\n" +"faiserver# fai-cd -M -S squash.img\n" +"----" +msgstr "" + +#: fai-guide.txt:1944 +msgid "" +"Move this image to a directory from which it can be requested via http\n" +"(usually a directory served by the webserver)" +msgstr "" + +#: fai-guide.txt:1948 +msgid "" +"To now request the squashfs image, add the following to your kernel\n" +"command line, e.g. in your pxelinux configuration file for the client\n" +"with fai-chboot." +msgstr "" + +#: fai-guide.txt:1952 +msgid "" +"----\n" +"root=live:http://faiserver/cskoeln/squash.img FAI_CONFIG_SRC=file:///var/lib/" +"fai/config\n" +"----" +msgstr "" + +#: fai-guide.txt:1955 +msgid "" +"Replace faiserver with the domain name or IP of the machine your\n" +"squash image is served from." +msgstr "" + +#: fai-guide.txt:1958 +msgid "=== [[otherdists]]Installing other distributions using a Debian nfsroot" +msgstr "" + +#: fai-guide.txt:1967 +msgid "" +"You can install all sorts of Linux distributions from a single Debian\n" +"nfsroot. Therefore you have to create a base.tar.xz of the distribution\n" +"you like to install and place it into the `basefiles` directory. Then\n" +"name it UBUNTU2204.tar.xz for example. An install client which belongs\n" +"to the class UBUNTU2204 then extracts this base file into its empty\n" +"file system. Additionally you have to adjust the 'sources.list' or\n" +"similar configuration files which are needed for specifying the\n" +"location of the package repository." +msgstr "" + +#: fai-guide.txt:1972 +msgid "" +"The tool `rinse(8)` is used for creating base files for distribution\n" +"like Rocky Linux, CentOS, openSUSE or Fedora.\n" +"Some basefiles can be downloaded from\n" +"https://fai-project.org/download/basefiles/." +msgstr "" + +#: fai-guide.txt:1976 +msgid "" +"The script +mk-basefile+ in\n" +"'/usr/share/doc/fai-doc/examples/simple/basefiles/' helps creating\n" +"this base files." +msgstr "" + +#: fai-guide.txt:1978 +msgid "=== [[dirinstall]]Creating chroot and virtualization environments" +msgstr "" + +#: fai-guide.txt:1984 +msgid "" +"If you have to create some chroot environments, or a virtualization\n" +"environment where you neither can nor want to run a normal Debian\n" +"Installer in to get to a working system (for example, Xen guest\n" +"domains), there is the FAI action _dirinstall_.\n" +"By calling" +msgstr "" + +#: fai-guide.txt:1988 +msgid "" +"----\n" +"faiserver# fai dirinstall \n" +"----" +msgstr "" + +#: fai-guide.txt:1993 +msgid "" +"and using either the option _-c _ or _-N_ you get a FAI\n" +"installation, without the partitioning action, right into the target\n" +"directory. The host name for the target installation can be specified\n" +"using _-u _" +msgstr "" + +#: fai-guide.txt:2002 +msgid "" +"This, for example, can be used to combine FAI with the tool\n" +"_xen-tools_, which helps you to build Xen guest domains. _xen-tools_\n" +"are very nice for generating configuration files and block devices for\n" +"new guests based on simple commands and/or configuration files, but\n" +"they can only assign one role per installation for customization.\n" +"FAI-users need and want more, as they are used to have the class\n" +"system. They get them even in xen-tools installations, by using the\n" +"following code as a xen-tools role script:" +msgstr "" + +#: fai-guide.txt:2010 +msgid "" +"----\n" +"#!/bin/sh\n" +"TARGET=$1\n" +"CMD=\"fai -N -v -u ${hostname} dirinstall $TARGET\"\n" +"echo running $CMD\n" +"$CMD\n" +"----" +msgstr "" + +#: fai-guide.txt:2013 +msgid "" +"Then, you should set the variable _install=0_ in the config of\n" +"xen-tools for that host." +msgstr "" + +#: fai-guide.txt:2022 +msgid "" +"=== [[softupdate]]Using FAI for updates\n" +"FAI can also do updates of already running systems, without a\n" +"re-installation from scratch.\n" +"This is called softupdate. A FAI softupdate skips the tasks which are\n" +"not suitable for updating a running system, like partitioning the\n" +"hard disks and creating file systems. Instead, it only executes the\n" +"tasks for updating and installing software packages and calling the\n" +"customization scripts." +msgstr "" + +#: fai-guide.txt:2027 +msgid "" +"To run a softupdate call:\n" +"----\n" +"# fai -v -s nfs://faiserver/srv/fai/config softupdate\n" +"----" +msgstr "" + +#: fai-guide.txt:2032 +msgid "" +"By default, a softupdate uses the list of classes defined during the\n" +"initial installation. Make sure to set the variable +$LOGSERVER+ (done\n" +"in a _class/*.var_ file) if FAI should save the log files to a remote\n" +"machine." +msgstr "" + +#: fai-guide.txt:2038 +msgid "" +"It's up to you, how to start a softupdate on a bigger number of hosts.\n" +"You may do the softupdate on a regular basis via cron or you can use tools\n" +"like `clusterssh(1)` to start a softupdate via a push on a list of\n" +"hosts." +msgstr "" + +#: fai-guide.txt:2044 +msgid "" +"Keep in mind, that the customization scripts are run every time you do\n" +"a softupdate. That means, they have to be *idempotent* i.e. the result\n" +"of their operation should always produce the same result, even when\n" +"they run more than once." +msgstr "" + +#: fai-guide.txt:2046 +msgid "For example appending a line to a file must not done via this code:" +msgstr "" + +#: fai-guide.txt:2052 +msgid "" +"----\n" +"$ echo \"some strings\" >> /etc/fstab\n" +"----\n" +"Instead use the command `ainsl(1)` in a shell script or use cfengine's\n" +"function _AppendIfNoSuchLine_." +msgstr "" + +#: fai-guide.txt:2058 +msgid "" +"All commands in the customization script must be capable of modifying\n" +"the target file system wether it's available in _/target_ during the\n" +"initial installation or wether it's the normal file system relative to\n" +"_/_ during softupdate." +msgstr "" + +#: fai-guide.txt:2060 +msgid "Here are some variable that help writing these scripts:" +msgstr "" + +#: fai-guide.txt:2063 +msgid "" +"+$target+:: Points to the root directory of the client, which\n" +"is _/target_ during installation and _/_ during a softupdate." +msgstr "" + +#: fai-guide.txt:2066 +msgid "" +"+$FAI_ROOT+:: It's the same value as +$target+. For historic reasons\n" +"we have both these variables in FAI." +msgstr "" + +#: fai-guide.txt:2071 +msgid "" +"+$ROOTCMD+::\n" +"In case of the installation this is an alias for 'chroot $target' in case " +"of\n" +"softupdate it's just empty. You can prepend this to commands if you need to " +"run a\n" +"command inside the clients target file system via chroot." +msgstr "" + +#: fai-guide.txt:2078 +msgid "" +"+$FAI_ACTION+::\n" +"If you need to call code depending on the FAI action performed, you\n" +"can use this variable. It contains the currently executed action:\n" +"_install_, _softupdate_, _dirinstall_, _sysinfo_, _inventory_ or your\n" +"own defined action." +msgstr "" + +#: fai-guide.txt:2080 +msgid "=== [[archcross]]How to install 32-bit OS from a 64-bit OS" +msgstr "" + +#: fai-guide.txt:2085 +msgid "" +"To install a computer with a 32-bit OS, you need an i386 nfsroot.\n" +"Creating this 32-bit nfsroot on an install server running amd64 is\n" +"quite simple. Install and set up the FAI packages. Then copy your FAI\n" +"config files to a new subdirectory." +msgstr "" + +#: fai-guide.txt:2089 +msgid "" +"----\n" +"faiserver# cp -a /etc/fai /etc/fai-i386\n" +"----" +msgstr "" + +#: fai-guide.txt:2094 +msgid "" +"Edit the variable +$FAI_DEBOOTSTRAP_OPTS+ in\n" +"'/etc/fai-i386/nfsroot.conf' and add the option +--arch\n" +"i386+. Also choose a different directory for your new nfsroot. Here\n" +"are the two lines after editing." +msgstr "" + +#: fai-guide.txt:2099 +msgid "" +"----\n" +"NFSROOT=/srv/fai/nfsroot-i386\n" +"FAI_DEBOOTSTRAP_OPTS=\"--arch i386 --exclude=info --include=aptitude\"\"\n" +"----" +msgstr "" + +#: fai-guide.txt:2102 +msgid "" +"Now call fai-make-nfsroot which creates the 32-bit nfsroot in\n" +"'/srv/fai/nfsroot-i386'" +msgstr "" + +#: fai-guide.txt:2106 +msgid "" +"----\n" +"faiserver# fai-make-nfsroot -v -C/etc/fai-i386\n" +"----" +msgstr "" + +#: fai-guide.txt:2110 +msgid "" +"Creating a partial mirror using `fai-mirror(1)` that is needed for\n" +"a bootable CD or USB stick is also possible on a different architecture.\n" +"You have to specify the architecture when calling fai-mirror." +msgstr "" + +#: fai-guide.txt:2114 +msgid "" +"----\n" +"$ fai-mirror -m800 -B -a i386 -v -cDEFAULT,DEBIAN,FAIBASE,I386 /srv/mirror-" +"i386\n" +"----" +msgstr "" + +#: fai-guide.txt:2116 +msgid "That's all!" +msgstr "" + +#: fai-guide.txt:2119 +msgid "=== [[error]]Aborting the installation when an error occurs" +msgstr "" + +#: fai-guide.txt:2127 +msgid "" +"Every task and hook can call the function +task_error+\n" +"to send an error value to the installation. This error will appear in\n" +"the log file and can be shown in the `fai-monitor-gui(1)`.\n" +"The error value is also checked against the variable +$STOP_ON_ERROR+\n" +"which is set to 700 by default. If the error value\n" +"is greater than +$STOP_ON_ERROR+ the installation will stop\n" +"immediately. In a hook, just add a call like this:" +msgstr "" + +#: fai-guide.txt:2131 +msgid "" +"----\n" +"task_error \n" +"----" +msgstr "" + +#: fai-guide.txt:2134 +msgid "" +"It is comfortable to call task_error with $? as second parameter, for\n" +"e.g. if you want to set an error value of 123 use this" +msgstr "" + +#: fai-guide.txt:2139 +msgid "" +"----\n" +"\n" +"task_error 123 $?\n" +"----" +msgstr "" + +#: fai-guide.txt:2143 +msgid "" +"Then the task error is only set if the preceding command failed with\n" +"some error. The same syntax can be used by the scripts in the class\n" +"subdirectory ending in .sh." +msgstr "" + +#: fai-guide.txt:2148 +msgid "" +"A special case are scripts inside the class/ subdirectory that does\n" +"not end in .sh. In those scripts you have to call task_error with 1 as\n" +"third parameter. As an example you can use those two variants for\n" +"setting the value to 123" +msgstr "" + +#: fai-guide.txt:2152 +msgid "" +"----\n" +"task_error 123 $? 1\n" +"----" +msgstr "" + +#: fai-guide.txt:2154 +msgctxt "fai-guide.txt:2154" +msgid "or" +msgstr "" + +#: fai-guide.txt:2158 +msgid "" +"----\n" +"task_error 123 1 1\n" +"----" +msgstr "" + +#: fai-guide.txt:2162 +msgid "" +"The latter command always sets the task error to 123 regardless of\n" +"the value of +$?+. If the error value is greater than +$STOP_ON_ERROR+,\n" +"the installation will abort immediately." +msgstr "" + +#: fai-guide.txt:2164 +msgid "The error values are grouped into four categories" +msgstr "" + +#: fai-guide.txt:2171 +msgid "" +"----\n" +"normal or info messages: 1xx, 2xx\n" +"warnings: 3xx, 4xx\n" +"minor errors: 5xx, 6xx\n" +"errors: 7xx, 8xx\n" +"----" +msgstr "" + +#: fai-guide.txt:2173 +msgid "The fai-monitor-gui has 4 different icons for these error categories." +msgstr "" + +#: fai-guide.txt:2176 +msgid "== [[hints]]Various hints and details" +msgstr "" + +#: fai-guide.txt:2179 +msgid "=== [[tasks]]The list of tasks" +msgstr "" + +#: fai-guide.txt:2187 +msgid "" +"Most tasks of the installation are defined as subroutines which are\n" +"defined in '/usr/lib/fai/subroutines' (e.g. +task_instsoft+).\n" +"Some are external shell scripts located in '/usr/lib/fai/'.\n" +"They are called via a superior subroutine called _task_.\n" +"This subroutine calls hooks if available and then calls the task (defined " +"as\n" +"__task___). A task and its hooks can be\n" +"skipped on demand by using the command _skiptask()_." +msgstr "" + +#: fai-guide.txt:2190 +msgid "" +"Now follows the description of all tasks, listed in the order\n" +"they are executed." +msgstr "" + +#: fai-guide.txt:2203 +msgid "" +"confdir::\n" +"The kernel appended parameters may define variables, the syslog daemon is\n" +"started. Network parameters are fetched from a DHCP\n" +"server and are stored in +boot.log+. The DNS resolver configuration file is " +"created.\n" +"+\n" +"The location of the configuration space is defined by the variable\n" +"+$FAI_CONFIG_SRC+.\n" +"+\n" +"After that, the file '$FAI/hooks/subroutines' is sourced if it\n" +"exists. Using this file, you can define your own subroutines or\n" +"override the definition of FAI's subroutines." +msgstr "" + +#: fai-guide.txt:2209 +msgid "" +"setup::\n" +"This task sets the system time, all +$FAI_FLAGS+ are defined and two\n" +"additional virtual terminals are opened on demand. A secure shell\n" +"daemon is started on demand for remote logins." +msgstr "" + +#: fai-guide.txt:2215 +msgid "" +"defclass::\n" +"Calls `fai-class(1)` to define classes using scripts and files in\n" +"'$FAI/class' and classes from '/tmp/fai/additional-classes' and the\n" +"variable +$ADDCLASSES+. The list of all defined classes is stored in\n" +"the variable +$classes+ and saved to '/tmp/fai/FAI_CLASSES'." +msgstr "" + +#: fai-guide.txt:2220 +msgid "" +"defvar::\n" +"Sources all files '$FAI/class/*.var' for every defined class. If a\n" +"hook has written some variable definitions to the file\n" +"'$LOGDIR/additional.var', this file is also sourced." +msgstr "" + +#: fai-guide.txt:2228 +msgid "" +"action::\n" +"Depending on the value of +$FAI_ACTION+ this subroutine decides which\n" +"action FAI should perform. The default available actions are:\n" +"_sysinfo_, _install_, _inventory_, _dirinstall_ and _softupdate_. If " +"+$FAI_ACTION+ has another\n" +"value, a user defined action is called if a file\n" +"'$FAI/hooks/$FAI_ACTION' exists. So you can easily define your own\n" +"actions." +msgstr "" + +#: fai-guide.txt:2235 +msgid "" +"sysinfo::\n" +"Called when no installation is performed but the action is\n" +"_sysinfo_. It shows information about the detected hardware and mounts\n" +"the local hard disks read only to '/target/+partitionname+' or with\n" +"regard to a 'fstab' file found inside a partition. Log files are\n" +"stored to the install server." +msgstr "" + +#: fai-guide.txt:2238 +msgid "" +"inventory::\n" +"A short list of system information is printed." +msgstr "" + +#: fai-guide.txt:2246 +msgid "" +"install::\n" +"This task controls the installation sequence. You will hear three\n" +"beeps before the installation starts. The major work is to call other\n" +"tasks and to save the output to '/tmp/fai/fai.log'. If you have any\n" +"problems during installation, look at all files in '/tmp/fai/'. You\n" +"can find examples of the log files\n" +"at https://fai-project.org/logs/." +msgstr "" + +#: fai-guide.txt:2250 +msgid "" +"dirinstall::\n" +"Install into a directory, not onto a local disk. Use this for creating\n" +"chroot environments." +msgstr "" + +#: fai-guide.txt:2255 +msgid "" +"softupdate::\n" +"This task, executed inside a running system via the `fai(8)` command\n" +"line interface, performs a softupdate. See chapter <> for\n" +"details." +msgstr "" + +#: fai-guide.txt:2262 +msgid "" +"partition::\n" +"Calls `setup-storage(8)` to partition the hard\n" +"disks and to create file systems. The task writes variable definitions\n" +"for the root and boot partition and device (+$ROOT_PARTITION,\n" +"$BOOT_PARTITION, $BOOT_DEVICE+) to '/tmp/fai/disk_var.sh' and creates\n" +"a 'fstab' file for the new system." +msgstr "" + +#: fai-guide.txt:2266 +msgid "" +"mountdisks::\n" +"Mounts the created partitions according to the created\n" +"'/tmp/fai/fstab' file relative to +$FAI_ROOT+." +msgstr "" + +#: fai-guide.txt:2277 +msgid "" +"extrbase::\n" +"Extracts a minimal system after that a chroot can be made into it. By\n" +"default the base tar file '/var/tmp/base.tar.xz' will be\n" +"extracted. Also files matching a class name in `$FAI/basefiles/` are used " +"for unpacking a\n" +"different tar file depending on classes defined. This can be used for\n" +"installing different Linux distributions than the one used for\n" +"creating the nfsroot. The default file 'base.tar.xz' is a snapshot of a\n" +"basic Debian system created by `debootstrap(8)`.\n" +"This task uses the variable +FAI_BASEFILEURL+ for fetching the base\n" +"file via FTP, HTTPS or HTTP if it's defined." +msgstr "" + +#: fai-guide.txt:2280 +msgid "" +"debconf::\n" +"Calls `fai-debconf(1)` to set the values for the debconf preseeding database." +msgstr "" + +#: fai-guide.txt:2286 +msgid "" +"repository::\n" +"Prepare access to the package repository by preparing the apt\n" +"configuration. This can also add repository keys\n" +"in a class based manner from files like _CLASSNAME.gpg_\n" +"in the directory _package_config_." +msgstr "" + +#: fai-guide.txt:2293 +msgid "" +"updatebase::\n" +"Updates the base packages of the new system and updates the list of\n" +"available packages. It also fakes some commands (called diversions)\n" +"inside the new installed system using `dpkg-divert(8)`, so no daemons\n" +"will be started during the installation." +msgstr "" + +#: fai-guide.txt:2297 +msgid "" +"instsoft::\n" +"Installs the desired software packages using class files in\n" +"'$FAI/package_config/'." +msgstr "" + +#: fai-guide.txt:2301 +msgid "" +"configure::\n" +"Calls scripts in '$FAI/scripts/' and its subdirectories for every\n" +"defined class." +msgstr "" + +#: fai-guide.txt:2305 +msgid "" +"tests::\n" +"Calls test scripts in '$FAI/tests/' and its subdirectories for every\n" +"defined class." +msgstr "" + +#: fai-guide.txt:2309 +msgid "" +"finish::\n" +"Unmounts all file systems in the new installed system and removes\n" +"diversions of files using the command `fai-divert`." +msgstr "" + +#: fai-guide.txt:2315 +msgid "" +"chboot::\n" +"Changes the PXE configuration for a host on the install server which\n" +"indicates which PXELINUX configuration to load on the next boot from " +"network\n" +"card via TFTP. Therefore the `fai-chboot(8)` command is executed\n" +"remotely on the install server." +msgstr "" + +#: fai-guide.txt:2319 +msgid "" +"savelog::\n" +"Saves log files to local disk and to the account +$LOGUSER+ on\n" +"+$LOGSERVER+ (defaults to the install server)." +msgstr "" + +#: fai-guide.txt:2324 +msgid "" +"faiend::\n" +"Wait for background jobs to finish (e.g. emacs compiling lisp files)\n" +"and automatically reboots the install clients or waits for manual\n" +"input before reboot." +msgstr "" + +#: fai-guide.txt:2327 +msgid "=== [[itests]]Automated tests" +msgstr "" + +#: fai-guide.txt:2336 +msgid "" +"After the customization scripts are executed, FAI will execute some\n" +"tests if available. Using these test, you can check for errors of the\n" +"installation. Test scripts are called via\n" +"`fai-do-scripts(1)` and should append its messages to\n" +"_$LOGDIR/test.log_. A Perl module including some useful subroutines\n" +"can be found in _Faitest.pm_. A test can also define a new class for\n" +"executing another tests during next boot via the variable\n" +"+$ADDCLASSES+." +msgstr "" + +#: fai-guide.txt:2339 +msgid "=== [[autodiscover]] Autodiscover" +msgstr "" + +#: fai-guide.txt:2344 +msgid "" +"In FAI 5.0 we released a feature that allows clients to search for the\n" +"faiserver in their respective subnetwork. This lifts the necessity of\n" +"having to collect every client's MAC address and configuring the DHCP\n" +"daemon." +msgstr "" + +#: fai-guide.txt:2347 +msgid "" +"This is done by booting from a small FAI autodiscover bootmedium (CD,\n" +"USB, etc.), which can be created via the command:" +msgstr "" + +#: fai-guide.txt:2351 +msgid "" +"----\n" +"faiserver# fai-cd -A autodiscover.iso\n" +"----" +msgstr "" + +#: fai-guide.txt:2357 +msgid "" +"The image is roughly 25MB in size and scans the subnet for\n" +"a FAI server. By default it shows a menu with all profiles available\n" +"in the configuration space in the same manner as the 'menu' flag\n" +"does. From this menu, you can select the installation type you wish to\n" +"perform." +msgstr "" + +#: fai-guide.txt:2360 +msgid "" +"For the clients to find the faiserver, the faiserver must run\n" +"fai-monitor." +msgstr "" + +#: fai-guide.txt:2362 +msgid "=== [[changeboot]]Changing the boot device" +msgstr "" + +#: fai-guide.txt:2365 +msgid "" +"Changing the boot sequence is normally done in the BIOS setup. But you\n" +"can't change the BIOS from a running Linux system." +msgstr "" + +#: fai-guide.txt:2373 +msgid "" +"So, the boot sequence of the BIOS will remain unchanged and\n" +"your computer should always boot first from its network card and the\n" +"second boot device should be the local disk. Then you can\n" +"change the boot device of the client by creating different PXELINUX\n" +"configurations. This will define if an installation\n" +"should be performed, or if the client should to boot from local\n" +"disk. This is done using `fai-chboot(8)`." +msgstr "" + +#: fai-guide.txt:2376 +msgid "=== [[debian-mirror]]How to create a local Debian mirror" +msgstr "" + +#: fai-guide.txt:2386 +msgid "" +"The utility `mkdebmirror` footnote:[You can find the script in\n" +"'/usr/share/doc/fai-doc/examples/utils/'] can be used for creating\n" +"your own local Debian mirror. This script uses `debmirror(1)`. A partial " +"Debian mirror for amd64 architecture for\n" +"Debian 11 and 12 (aka bullseye and bookworm) without the source packages " +"needs about\n" +"180GB of disk space.\n" +"Accessing the mirror via HTTP will be the\n" +"default way in most cases. To see more output from the script call\n" +"+mkdebmirror -v+. A root account is not necessary to create and\n" +"maintain the Debian mirror." +msgstr "" + +#: fai-guide.txt:2390 +msgid "" +"To use HTTP access to the local Debian mirror, install a web server\n" +"and create a symlink to the local directory where your mirror is\n" +"located:" +msgstr "" + +#: fai-guide.txt:2395 +msgid "" +"----\n" +"faiserver# apt-get install apache2\n" +"faiserver# ln -s /files/scratch/debmirror /var/www/html/debmirror\n" +"----" +msgstr "" + +#: fai-guide.txt:2400 +msgid "" +"Create a file `sources.list(5)` in '/etc/fai/apt' which gives access\n" +"to your Debian mirror. Also add the IP-address of the\n" +"HTTP server to the variable +$NFSROOT_ETC_HOSTS+ in\n" +"'nfsroot.conf' if the install clients have no DNS resolving." +msgstr "" + +#: fai-guide.txt:2403 +msgid "=== Small hints" +msgstr "" + +#: fai-guide.txt:2410 +msgid "" +"- When using HTTP access to a Debian mirror, the local _/var_ partition\n" +"on all install clients must be big enough to keep the downloaded\n" +"Debian packages. Do not try with less than 250 Mbytes unless you know\n" +"why. You can limit the number of packages installed at a time with the\n" +"variable +$MAXPACKAGES+." +msgstr "" + +#: fai-guide.txt:2414 +msgid "" +"- You can remove the red logo on the install client by simply calling\n" +"`reset` once. If will also not appear if you create a file using this\n" +"command on the install server:" +msgstr "" + +#: fai-guide.txt:2418 +msgid "" +"----\n" +"touch /srv/fai/nfsroot/.nocolorlogo\n" +"----" +msgstr "" + +#: fai-guide.txt:2421 +msgid "" +"- A list of variables used by FAI can be found at\n" +"https://wiki.fai-project.org/index.php/Variables." +msgstr "" + +#: fai-guide.txt:2424 +msgid "" +"- You can shorten some customization scripts by using one single fcopy\n" +"command _fcopy -r /_." +msgstr "" + +#: fai-guide.txt:2428 +msgid "" +"- If you rebuild the nfsroot, you will create a new ssh host key inside\n" +"the nfsroot. Then logging in to an install client may fail, because\n" +"the host key changes. You can use this:" +msgstr "" + +#: fai-guide.txt:2432 +msgid "" +"----\n" +"$ ssh -o StrictHostKeyChecking=no root@installclient\n" +"----" +msgstr "" + +#: fai-guide.txt:2435 +msgid "" +"- You can also delete the host entry on your install client in your\n" +"_~/.ssh/known_hosts_ file by using the _ssh-keygen -R_ command." +msgstr "" + +#: fai-guide.txt:2444 +msgid "" +"- In the tasks chboot and savelog, a connection using secure shell is\n" +"opened to the FAI server (see <>). To ensure that this works\n" +"non-interactively, a proper entry in 'NFSROOT/root/.ssh/known_hosts'\n" +"must be created. When using fai-setup, this is done automatically, but\n" +"it may require manual editing in case the name of your FAI server was\n" +"not determined correctly. If you stumble over ssh connections that\n" +"require typing \"yes\" to accept the host key during installation,\n" +"please check the contents of your 'NFSROOT/root/.ssh/known_hosts file'" +msgstr "" + +#: fai-guide.txt:2447 +msgid "" +"- A list of all local hard disks is\n" +"stored in +$disklist+. It's defined after `set_disk_info` is called." +msgstr "" + +#: fai-guide.txt:2462 +msgid "" +"- There are multiple functions for generating a customized disk\n" +"list. See `fai-disk-info` for an example.\n" +" * set_bootstick()\n" +" * grepv_disks()\n" +" * grep_disks()\n" +" * notmatchdisks()\n" +" * matchdisks()\n" +" * smallestdisk()\n" +" * largestdisk()\n" +" * all_disks_by_size()\n" +" * all_disks_and_size()\n" +" * once_only()\n" +" * checkdisk()\n" +" * disks_by_id()" +msgstr "" + +#: fai-guide.txt:2467 +msgid "" +"- Use `fai-divert -a` if a postinst script calls a configuration\n" +"program, e.g. the postinst script for package apache calls\n" +"apacheconfig, which needs manual input. You can fake the configuration\n" +"program so the installation can be fully automatic." +msgstr "" + +#: fai-guide.txt:2475 +msgid "" +"- Sometimes the installation seems to stop, but often there's only a\n" +"postinstall script of a software package that requires manual input\n" +"from the console. Change to another virtual terminal and look which\n" +"process is running with tools like `top(1)` and `pstree(1)`. You can\n" +"add _debug_ to _FAI_FLAGS_ to make the installation process show all\n" +"output from the postinst scripts on the console and get its input also\n" +"from the console." +msgstr "" + +#: fai-guide.txt:2481 +msgid "" +"- How can I define classes on the kernel command line?\n" +"+\n" +"Read the man page of `fai-class(8)`. If you like to define some\n" +"additional classes (for e.g. A,B,C) on the kernel command line add this: " +"_ADDCLASSES=A,B,C_" +msgstr "" + +#: fai-guide.txt:2493 +msgid "" +"- How to use a custom kernel inside the nfsroot?\n" +"+\n" +"Build your customized kernel by building a kernel package using\n" +"`make-kpkg(8)` and use the option `--initrd`. Copy this Debian package\n" +"to a local repository and add it to /etc/fai/sources.list. Add the\n" +"name of your package to /etc/fai/NFSROOT. Then call\n" +"+\n" +"----\n" +"# fai-make-nfsroot -k\n" +"----" +msgstr "" + +#: fai-guide.txt:2498 +msgid "" +"- How to use the nfsroot as system for diskless clients?\n" +"+\n" +"https://wiki.fai-project.org/index.php/Use_nfsroot_for_diskless_clients" +msgstr "" + +#: fai-guide.txt:2506 +msgid "" +"- How to serve multiple nfsroot directories on one FAI server?\n" +"+\n" +"If you want to serve multiple nfsroot directories,\n" +"you need to create specific config directories in '/etc' for FAI, like\n" +"'/etc/fai-buster' and '/etc/fai-bookworm'. Then you need to set the\n" +"+$NFSROOT+ variables to different directories and run" +msgstr "" + +#: fai-guide.txt:2510 +msgid "" +"----\n" +"faiserver#fai-make-nfsroot -C /etc/fai-buster\n" +"----" +msgstr "" + +#: fai-guide.txt:2513 +msgid "=== flag_reboot (FAI_FLAGS)" +msgstr "" + +#: fai-guide.txt:2517 +msgid "" +"If flag_reboot is set, by adding \"reboot\" to +$FAI_FLAGS+, your client\n" +"machine will reboot after the task faiend has finished. This is true\n" +"for network as well as bootmedium installations." +msgstr "" + +#: fai-guide.txt:2520 +msgid "=== [[logfiles]]Log files" +msgstr "" + +#: fai-guide.txt:2528 +msgid "" +"FAI is creating several log files. During installation they are stored\n" +"in '/tmp/fai' on the install client itself. At the end of the\n" +"installation they will be copied to the install server (see\n" +"<>). After the install client rebooted into his newly\n" +"installed system, you can find the FAI logs in '/var/log/fai'.\n" +"Log files are also created when doing the softupdate or dirinstall\n" +"action." +msgstr "" + +#: fai-guide.txt:2531 +msgid "" +"On the faiserver, you can find the (remote) log files under the ~fai\n" +"directory." +msgstr "" + +#: fai-guide.txt:2535 +msgid "" +"Sample log files from successfully installed computers are\n" +"available on https://fai-project.org/logs.\n" +"These a some log files which are created by FAI." +msgstr "" + +#: fai-guide.txt:2538 +msgid "" +"FAI_CLASSES::\n" +"Contains a list of all classes defined." +msgstr "" + +#: fai-guide.txt:2542 +msgid "" +"dmesg.log::\n" +"Output of the `dmesg` command. Contains useful messages of the kernel\n" +"ring buffer." +msgstr "" + +#: fai-guide.txt:2546 +msgid "" +"fai.log::\n" +"The main log file. Contains all important information. You should\n" +"*always* read this file." +msgstr "" + +#: fai-guide.txt:2549 +msgid "" +"boot.log::\n" +"A list of variables of network parameters, mostly defined by the DHCP daemon." +msgstr "" + +#: fai-guide.txt:2552 +msgid "" +"format.log::\n" +"Output of the partition tool `setup-storage(8)`." +msgstr "" + +#: fai-guide.txt:2555 +msgid "" +"scripts.log::\n" +"Output of all scripts, that are used for customization." +msgstr "" + +#: fai-guide.txt:2559 +msgid "" +"variables.log::\n" +"A list of all shell variables which are available during an\n" +"installation." +msgstr "" + +#: fai-guide.txt:2562 +msgid "" +"error.log::\n" +"A summary of possible errors in all log files." +msgstr "" + +#: fai-guide.txt:2568 +msgid "" +"disk_var.sh::\n" +"A list of variables that contain information about devices and\n" +"partitions to boot from, the root partition and a list of swap\n" +"devices. These information is used by some customization scripts\n" +"(e.g. _GRUB_PC/10-setup_)." +msgstr "" + +#: fai-guide.txt:2578 +msgid "" +"If the installation process finishes, the hook 'savelog.LAST.sh'\n" +"searches all log files for common errors and writes them to the file\n" +"'error.log'. So, you should first look into this file for errors. Also\n" +"the file 'status.log' give you the exit code of the last command\n" +"executed in a script. To be sure, you should look for more details in\n" +"all log files." +msgstr "" + +#: fai-guide.txt:2581 +msgid "=== How to use HTTP for PXE boot" +msgstr "" + +#: fai-guide.txt:2585 +msgid "" +"fai-make-nfsroot now uses the lpxelinux.0 binary which already\n" +"supports transfer of the kernel and initrd via http (additional to tftp).\n" +"You only have to enable HTTP access to the tftp directory:" +msgstr "" + +#: fai-guide.txt:2590 +msgid "" +"----\n" +"cd /var/www/html\n" +"ln -s /srv/tftp/fai\n" +"----" +msgstr "" + +#: fai-guide.txt:2592 +msgid "Add '-U URL' to the 'fai-chboot' call. For example:" +msgstr "" + +#: fai-guide.txt:2596 +msgid "" +"----\n" +"fai-chboot -U http://faiserver/fai -IFv .......\n" +"----" +msgstr "" + +#: fai-guide.txt:2598 +msgid "== [[troubleshoot]]Troubleshooting" +msgstr "" + +#: fai-guide.txt:2600 +msgid "=== [[booterror]]Boot errors" +msgstr "" + +#: fai-guide.txt:2604 +msgid "" +"The following error message indicates that your install client doesn't\n" +"get an answer from a DHCP server. Check your cables or start the\n" +"`dhcpd(8)` daemon with the debug flag enabled." +msgstr "" + +#: fai-guide.txt:2609 +msgid "" +"____\n" +" PXE-E51: No DHCP or BOOTP offers received\n" +" Network boot aborted\n" +"____" +msgstr "" + +#: fai-guide.txt:2612 +msgid "" +"If you do not see the following message, the install kernel could not\n" +"detect your network card, for example because of a missing driver:" +msgstr "" + +#: fai-guide.txt:2618 +msgid "" +"----\n" +"Starting dhcp for interface eth0\n" +"dhcp: PREINIT eth0 up\n" +"dhcp: BOND setting eth\n" +"----" +msgstr "" + +#: fai-guide.txt:2625 +msgid "" +"Check the initrd in the nfsroot (`lsinird`) if the kernel driver of your " +"network\n" +"card is included there and check if you like to add the package\n" +"'firmware-linux-nonfree' in +/etc/fai/NFSROOT+ and rebuild the initrd\n" +"by calling `fai-make-nfsroot -k`.\n" +"You may also add a driver to +/srv/fai/nfsroot/etc/dracut.conf+ in\n" +"the line +add_drivers+++=+." +msgstr "" + +#: fai-guide.txt:2631 +msgid "" +"This is the error message you will see, when your network card is\n" +"working, but the install server does not export the nfsroot\n" +"directory to the install clients, This is often caused by missing\n" +"NFS permissions on the server side." +msgstr "" + +#: fai-guide.txt:2644 +msgid "" +"----\n" +"Starting dhcp for interface eth0\n" +"dhcp: PREINIT eth0 up\n" +"dhcp: BOND setting eth\n" +"mount.nfs: access denied by server while mounting 192.168.33.250:/srv/fai/" +"nfsroot\n" +".\n" +".\n" +"dracut Warning: Could not boot\n" +".\n" +"Dropping to debug shell\n" +"dracut:/#\n" +"----" +msgstr "" + +#: fai-guide.txt:2649 +msgid "" +"Now, you are inside the emergency shell of the initrd which was created\n" +"by 'dracut(8)'. You will get a shell prompt, and can look at the log files.\n" +"For more information about debugging the early boot process using\n" +"dracut see `dracut.cmdline(7)`" +msgstr "" + +#: fai-guide.txt:2652 +msgid "" +"Use the following command on the install server to see which directories are " +"exported\n" +"from the install server (named faiserver):" +msgstr "" + +#: fai-guide.txt:2655 +msgid "" +"----\n" +"$ showmount -e faiserver\n" +"----" +msgstr "" From 34da44aab3947ebe6becd1cfe80843f26dd0410b Mon Sep 17 00:00:00 2001 From: Georges Khaznadar Date: Fri, 24 Oct 2025 09:17:31 +0200 Subject: [PATCH 2/9] improving the French translation --- doc/fai-guide_fr.html | 196 ++++++++++++++++++++------------------ doc/fai-guide_fr.txt | 214 ++++++++++++++++++++++-------------------- doc/po/fr.po | 143 ++++++++++++++++++++++++++-- 3 files changed, 350 insertions(+), 203 deletions(-) diff --git a/doc/fai-guide_fr.html b/doc/fai-guide_fr.html index d1a7a2b4c..89736db0f 100644 --- a/doc/fai-guide_fr.html +++ b/doc/fai-guide_fr.html @@ -2595,102 +2595,109 @@

Scripts shell

définies.

-

Cfengine scripts

-

CFEngine has a rich set of functions to edit existing configuration -files, e.g LocateLineMatching, ReplaceAll, InsertLine, -AppendIfNoSuchLine, HashCommentLinesContaining. But it can’t handle -variables which are undefined. If a variable is undefined, the whole -cfengine script will abort.

-

More information can be found in the manual page cfengine(8) or at -the cfengine homepage https://www.cfengine.com.

+

Scripts cfengine

+

CFEngine dispose d’un riche ensemble de fonctions pour modifier les +fichiers de configuration existants, par exemple LocateLineMatching, +ReplaceAll, InsertLine, AppendIfNoSuchLine, HashCommentLinesContaining. +Mais il ne peut pas traiter les variables qui sont indéfinies. Si une +variable n’est pas définie, l’ensemble du script cfengine s’arrêtera.

+

On peut trouver plus d’informations dans la page de manuel +cfengine(8) ou sur la page d’accueil de cfengine +https://www.cfengine.com.

-

Hooks

-

Hooks let you specify functions or programs which are run at certain -steps of the installation process. Before a task is called, -FAI searches for existing hooks for this task and executes them. As -you might expect, classes are also used when calling hooks. Hooks are -executed for every defined class. You only have to create the hook -with the name for the desired class and it will be used. If several -hooks for a task exists, they are called in the order defined by the -classes. If debug is included in $FAI_FLAG the option -d is -passed to all hooks, so you can debug your own hooks. If some default -tasks should be skipped, use the subroutine skiptask and a list of -default tasks as parameters. In the examples provided, the hooks of -the class CENTOS skips some Debian specific tasks.

-

The directory $FAI/hooks/ contains all hooks. A hook is an executable -file following the naming scheme taskname.CLASSNAME[.sh] (e.g. -repository.CENTOS or 'savelog.LAST.sh). The -task name specifies which task to precede executing this hook, if the -specified class is defined for the installing client. See section -[tasks] for a complete list of default tasks that can be used.

-

A hook of the form hookprefix.classname can’t define variables for -the installation script, because it’s a subprocess. But you can use -any binary executable or any script you wrote. Hooks that have the -suffix .sh (e.g. partition.DEFAULT.sh) must be Bourne -shell scripts and are sourced. So it’s possible to redefine variables -for the installation scripts.

-

In the first part of FAI, all hooks with prefix confdir are called. -Those hooks can not be located in the config space, since it’s not yet -available. Therefore these hooks are the only hooks located in -$nfsroot/$FAI/hooks on the install server. All other hooks are -found in $FAI_CONFIGDIR/hooks on the install server.

-

All hooks that are called before classes are defined can only use the -following classes: DEFAULT $HOSTNAME LAST. If a hook for class -DEFAULT should only be called if no hook for class $HOSTNAME is -available, insert these lines to the default hook:

+

Les hooks, les « crochets »

+

Les crochets (hooks) vous permettent de spécifier des fonctions ou des programmes +qui sont exécutés à certaines étapes du processus d’installation. Avant +qu’une tâche soit appelée, FAI recherche les crochets existants pour cette +tâche et les exécute. Comme on peut s’y attendre, les classes sont +également utilisées lors de l’appel de hooks. Les hooks sont exécutés +pour chaque classe définie. Il vous suffit de créer le hook avec le nom +de la classe désirée et il sera utilisé. Si plusieurs hooks pour une +tâche existent, ils sont appelés dans l’ordre défini par les classes. Si +debug est inclus dans $FAI_FLAG l’option -d est passée à tous +les hooks, donc vous pouvez déboguer vos propres hooks. Si certaines +tâches par défaut doivent être ignorées, utilisez la sous-routine +skiptask et une liste de tâches par défaut comme paramètres. Dans les +exemples fournis, les hooks de la classe CENTOS ignorent certaines +tâches spécifiques de Debian.

+

Le répertoire $FAI/hooks/ contient tous les hooks. Un hook est un +fichier exécutable qui est nommé selon la tâche : taskname.CLASSNAME[.sh] +(par exemple, repository.CENTOS ou savelog.LAST.sh). Le nom de tâche +spécifie quelle tâche précède l’exécution de ce hook, si la +classe spécifiée est définie pour le client d’installation. +Voir la section [tasks] pour une liste complète des tâches +par défaut qu’on peut utiliser.

+

Un hook du formulaire hookprefix.classname ne peut pas définir de +variables pour le script d’installation, car il s’agit d’un +sous-processus. Mais vous pouvez utiliser n’importe quel exécutable +binaire ou n’importe quel script que vous avez écrit. Les hooks qui ont +le suffixe .sh (par exemple, partition.DEFAULT.sh) doivent être des +scripts Bourne shell et sont sourcé. Il est donc possible de redéfinir +des variables pour les scripts d’installation.

+

Dans la première partie de FAI, tous les hooks avec le préfixe confdir +sont appelés. Ces hooks ne peuvent pas être localisés dans l’espace de +configuration, car il n’est pas encore disponible. Par conséquent, ces +hooks sont les seuls hooks situés dans $nfsroot/$FAI/hooks sur le +serveur d’installation. Tous les autres hooks se trouvent dans +$FAI_CONFIGDIR/hooks sur le serveur d’installation.

+

Tous les hooks appelés avant la définition des classes peuvent +utiliser uniquement les classes suivantes: DEFAULT $HOSTNAME LAST. Si un hook +pour la classe DEFAULT doit être appelé uniquement dans le cas où aucun hook pour +la classe $HOSTNAME n’est disponible, insérez ces lignes dans le hook +par défaut :

hookexample.DEFAULT:
 
 #! /bin/sh
 
-# skip DEFAULT hook if a hook for $HOSTNAME exists
+# sauter le hook DEFAULT s'il existe un hook pour $HOSTNAME
 scriptname=$(basename $0 .DEFAULT)
 [-f $FAI/hooks/$scriptname.$HOSTNAME ] && exit
-# here follows the actions for class DEFAULT
+# suivent alors les actions pour la classe DEFAULT
 .
 .
-

Some examples for what hooks could be used:

+

Quelques exemples de ce à quoi les hooks pourraient être utiles :

  • -Load kernel modules before classes are defined in $FAI/class. +Charger les modules du noyau avant que les classes soient définies dans $FAI/class.

  • -Send an email to the administrator if the installation is finished. +Envoyer un courriel à l’administrateur si l’installation est terminée.

  • -Install a diskless client and skip local disk partitioning. +Installer un client sans disque et sautez le partitionnement de disque local.

  • -Have a look at hooks/debconf.IMAGE for how to clone a machine using a file system image. +Jeter un œil à hooks/debconf.IMAGE pour savoir comment cloner une machine en utilisant une image de système de fichiers.

-

FAI flags

-

The variable $FAI_FLAGS contains a space separated list of -flags. Flags are normally defined in the pxelinux.cfg file which -should be created by fai-chboot(1). The following flags are known:

+

Options (flags) de FAI

+

La variable $FAI_FLAGS contient une liste d’options séparées par des +espaces. Les options sont normalement définies dans le fichier pxelinux.cfg qui +est censément créé par fai-chboot(1). Les options suivantes sont connues :

verbose

-Create verbose output during installation. This should always be the -first flag, so consecutive definitions of flags will be verbosely -displayed. +Rend l’installation verbeuse. Cela doit toujours +être la première option (le premier flag), de sorte que les définitions suivantes des +options soient affichées verbeusement.

@@ -2698,11 +2705,11 @@

FAI flags

-Create debug output. No unattended installation is performed. During -package installation you have to answer all questions of the -postinstall scripts on the client’s console. A lot of debug -information will be printed out. This flag is only useful for FAI -developers. +Afficher des informations de débogage. Aucune installation sans assistance +n’est effectuée. Pendant l’installation du paquet, vous devez répondre +à toutes les questions des scripts postinstall sur la console du +client. Beaucoup d’informations de débogage seront affichées. Cette option +n’est utile que pour les développeurs FAI.

@@ -2710,11 +2717,12 @@

FAI flags

-Start the ssh daemon to enable remote logins. -You can then log in as root to all install clients during the -installation. The default password is fai and can be changed by -setting FAI_ROOTPW in nfsroot.conf(5). To log in from your server -to the install client (named demohost in this example) use: +Démarrer le démon ssh pour activer les connexions à distance. Vous +pouvez ensuite vous connecter en tant que root à tous les clients +d’installation pendant l’installation. Le mot de passe par défaut est +fai et peut être modifié en définissant FAI_ROOTPW dans +nfsroot.conf(5). Pour vous connecter à partir de votre serveur vers le +client d’installation (nommé demohost dans cet exemple), utilisez :

@@ -2724,21 +2732,22 @@

FAI flags

Warning: Permanently added 'demohost,192.168.33.100' to the list of known hosts. root@demohost's password:
-

This is only the root password during the -installation process, not for the new installed system. You can also -log in without a password when using $SSH_IDENTITY.

+

Ce n’est le mot de passe root que pendant le processus d’installation, +pas pour le nouveau système installé. Vous pouvez également vous +connecter sans mot de passe lorsque vous utilisez $SSH_IDENTITY.

createvt

-Create two virtual terminals and execute a bash if ctrl-c is typed -in the console terminal. The additional terminals can be accessed by -typing Alt-F2 or Alt-F3. Otherwise, no terminals are available and -typing ctrl-c will reboot the install client. Setting this flag is -useful for debugging. If you want an installation which should not be -interruptible, do not set this flag. +Créez deux terminaux virtuels et exécutez un bash si ctrl-c est tapé +dans le terminal de console. Vous pouvez accéder aux terminaux +supplémentaires en tapant Alt-F2 ou Alt-F3. Sinon, aucun terminal +n’est disponible et la saisie ctrl-c va redémarrer le client +d’installation. La définition de cette option est utile pour le débogage. +Si vous voulez une installation qui ne soit pas interruptible, +ne définissez pas cette option.

@@ -2746,8 +2755,9 @@

FAI flags

-This enables a user menu for selecting a profile. All files -class/*.profile are read and a curses based menu will be created. +Cela active un menu utilisateur pour sélectionner un profil. Tous les +fichiers class/*.profile sont lus et un menu basé sur curses +sera créé.

@@ -2755,8 +2765,8 @@

FAI flags

-Run FAI inside a screen(1) session. The session is called FAI. -If you log in via ssh from remote you can attach to the session using: +Lancer FAI dans une session screen(1). La session est nommée FAI. +Si on se connecte via ssh à distance on peut se rattacher à la session en utilisant :

@@ -2770,8 +2780,8 @@

FAI flags

-Run FAI inside a tmux(1) session. The session is called FAI. -If you log in via ssh from remote you can attach to the session using: +Lancer FAI dans une session tmux(1). La session est nommée FAI. +Si on se connecte via ssh à distance on peut se rattacher à la session en utilisant :

@@ -2785,11 +2795,12 @@

FAI flags

-Reboot the install client after installation is finished without -typing RETURN on the console. If this flag is not set, and error.log -contains anything, the install client will stop and wait that you -press RETURN. If no errors occurred, the client will always reboot -automatically. +Redémarrer le client d’installation une fois l’installation terminée +sans taper Entrée sur la console. Si cette option n’est pas définie, et +que error.log contient quelque chose, le client d’installation +s’arrêtera et attendra que vous appuyez sur Entrée. Si aucune erreur +ne s’est produite, le client redémarrera toujours +automatiquement.

@@ -2797,8 +2808,8 @@

FAI flags

-Halt the install client at the end of the installation, instead of -rebooting into the new system. +Arrêter le client d’installation à la fin de l’installation, au lieu +de redémarrer dans le nouveau système.

@@ -2806,9 +2817,10 @@

FAI flags

-Used by setup-storage(8). Partitions marked with preserve_reinstall -are preserved unless this flag is set. Often, this flag is set in a -file class/*.var by using setting flag_initial=1. +Utilisé par setup-storage(8). Les partitions marquées avec +preserve_reinstall sont préservées à moins que cette option ne soit +définie. Souvent, cette option est définie dans un fichier class/*.var en +utilisant le paramètre flag_initial=1.

@@ -4390,7 +4402,7 @@

Boot errors

diff --git a/doc/fai-guide_fr.txt b/doc/fai-guide_fr.txt index b05f7e073..1d6a606cf 100644 --- a/doc/fai-guide_fr.txt +++ b/doc/fai-guide_fr.txt @@ -1300,106 +1300,114 @@ personnalisation. Dans les scripts, la variable +$classes+ contient une liste séparée par des espaces avec les noms de toutes les classes définies. -==== [[cfengine]]Cfengine scripts - -CFEngine has a rich set of functions to edit existing configuration -files, e.g _LocateLineMatching, ReplaceAll, InsertLine, -AppendIfNoSuchLine, HashCommentLinesContaining_. But it can't handle -variables which are undefined. If a variable is undefined, the whole -cfengine script will abort. - -More information can be found in the manual page `cfengine(8)` or at -the cfengine homepage https://www.cfengine.com. - - -=== [[hooks]]Hooks - -Hooks let you specify functions or programs which are run at certain -steps of the installation process. Before a task is called, -FAI searches for existing hooks for this task and executes them. As -you might expect, classes are also used when calling hooks. Hooks are -executed for every defined class. You only have to create the hook -with the name for the desired class and it will be used. If several -hooks for a task exists, they are called in the order defined by the -classes. If _debug_ is included in +$FAI_FLAG+ the option _-d_ is -passed to all hooks, so you can debug your own hooks. If some default -tasks should be skipped, use the subroutine _skiptask_ and a list of -default tasks as parameters. In the examples provided, the hooks of -the class CENTOS skips some Debian specific tasks. - -The directory '$FAI/hooks/' contains all hooks. A hook is an executable -file following the naming scheme 'taskname.CLASSNAME[.sh]' (e.g. -'repository.CENTOS' or 'savelog.LAST.sh). The -task name specifies which task to precede executing this hook, if the -specified class is defined for the installing client. See section -<> for a complete list of default tasks that can be used. - -A hook of the form _hookprefix.classname_ can't define variables for -the installation script, because it's a subprocess. But you can use -any binary executable or any script you wrote. Hooks that have the -suffix _.sh_ (e.g. 'partition.DEFAULT.sh') must be Bourne -shell scripts and are sourced. So it's possible to redefine variables -for the installation scripts. - -In the first part of FAI, all hooks with prefix _confdir_ are called. -Those hooks can not be located in the config space, since it's not yet -available. Therefore these hooks are the only hooks located in -+$nfsroot+'/$FAI/hooks' on the install server. All other hooks are -found in '$FAI_CONFIGDIR/hooks' on the install server. - - -All hooks that are called before classes are defined can only use the -following classes: _DEFAULT $HOSTNAME LAST_. If a hook for class -_DEFAULT_ should only be called if no hook for class +$HOSTNAME+ is -available, insert these lines to the default hook: +==== [[cfengine]]Scripts cfengine + +CFEngine dispose d’un riche ensemble de fonctions pour modifier les +fichiers de configuration existants, par exemple _LocateLineMatching, +ReplaceAll, InsertLine, AppendIfNoSuchLine, HashCommentLinesContaining_. +Mais il ne peut pas traiter les variables qui sont indéfinies. Si une +variable n’est pas définie, l’ensemble du script cfengine s’arrêtera. + +On peut trouver plus d’informations dans la page de manuel +`cfengine(8)` ou sur la page d’accueil de cfengine +https://www.cfengine.com. + + +=== [[hooks]]Les hooks, les « crochets » + +Les crochets (hooks) vous permettent de spécifier des fonctions ou des programmes +qui sont exécutés à certaines étapes du processus d’installation. Avant +qu’une tâche soit appelée, FAI recherche les crochets existants pour cette +tâche et les exécute. Comme on peut s’y attendre, les classes sont +également utilisées lors de l’appel de hooks. Les hooks sont exécutés +pour chaque classe définie. Il vous suffit de créer le hook avec le nom +de la classe désirée et il sera utilisé. Si plusieurs hooks pour une +tâche existent, ils sont appelés dans l’ordre défini par les classes. Si +_debug_ est inclus dans +$FAI_FLAG+ l’option _-d_ est passée à tous +les hooks, donc vous pouvez déboguer vos propres hooks. Si certaines +tâches par défaut doivent être ignorées, utilisez la sous-routine +_skiptask_ et une liste de tâches par défaut comme paramètres. Dans les +exemples fournis, les hooks de la classe CENTOS ignorent certaines +tâches spécifiques de Debian. + +Le répertoire '$FAI/hooks/' contient tous les hooks. Un hook est un +fichier exécutable qui est nommé selon la tâche : 'taskname.CLASSNAME[.sh]' +(par exemple, 'repository.CENTOS' ou 'savelog.LAST.sh'). Le nom de tâche +spécifie quelle tâche précède l'exécution de ce hook, si la +classe spécifiée est définie pour le client d’installation. +Voir la section <> pour une liste complète des tâches +par défaut qu'on peut utiliser. + +Un hook du formulaire _hookprefix.classname_ ne peut pas définir de +variables pour le script d’installation, car il s’agit d’un +sous-processus. Mais vous pouvez utiliser n’importe quel exécutable +binaire ou n’importe quel script que vous avez écrit. Les hooks qui ont +le suffixe _.sh_ (par exemple, 'partition.DEFAULT.sh') doivent être des +scripts Bourne shell et sont sourcé. Il est donc possible de redéfinir +des variables pour les scripts d’installation. + +Dans la première partie de FAI, tous les hooks avec le préfixe _confdir_ +sont appelés. Ces hooks ne peuvent pas être localisés dans l’espace de +configuration, car il n’est pas encore disponible. Par conséquent, ces +hooks sont les seuls hooks situés dans +$nfsroot+'/$FAI/hooks' sur le +serveur d’installation. Tous les autres hooks se trouvent dans +'$FAI_CONFIGDIR/hooks' sur le serveur d’installation. + + +Tous les hooks appelés avant la définition des classes peuvent +utiliser uniquement les classes suivantes: _DEFAULT $HOSTNAME LAST_. Si un hook +pour la classe _DEFAULT_ doit être appelé uniquement dans le cas où aucun hook pour +la classe +$HOSTNAME+ n’est disponible, insérez ces lignes dans le hook +par défaut : ---- hookexample.DEFAULT: #! /bin/sh -# skip DEFAULT hook if a hook for $HOSTNAME exists +# sauter le hook DEFAULT s'il existe un hook pour $HOSTNAME scriptname=$(basename $0 .DEFAULT) [-f $FAI/hooks/$scriptname.$HOSTNAME ] && exit -# here follows the actions for class DEFAULT +# suivent alors les actions pour la classe DEFAULT . . ---- -Some examples for what hooks could be used: +Quelques exemples de ce à quoi les hooks pourraient être utiles : -- Load kernel modules before classes are defined in '$FAI/class'. +- Charger les modules du noyau avant que les classes soient définies dans '$FAI/class'. -- Send an email to the administrator if the installation is finished. +- Envoyer un courriel à l’administrateur si l’installation est terminée. -- Install a diskless client and skip local disk partitioning. +- Installer un client sans disque et sautez le partitionnement de disque local. -- Have a look at +hooks/debconf.IMAGE+ for how to clone a machine using a file system image. +- Jeter un œil à +hooks/debconf.IMAGE+ pour savoir comment cloner une machine en utilisant une image de système de fichiers. -=== [[faiflags]]FAI flags +=== [[faiflags]]Options (flags) de FAI -The variable +$FAI_FLAGS+ contains a space separated list of -flags. Flags are normally defined in the pxelinux.cfg file which -should be created by 'fai-chboot(1)'. The following flags are known: +La variable +$FAI_FLAGS+ contient une liste d'options séparées par des +espaces. Les options sont normalement définies dans le fichier pxelinux.cfg qui +est censément créé par 'fai-chboot(1)'. Les options suivantes sont connues : verbose:: -Create verbose output during installation. This should always be the -first flag, so consecutive definitions of flags will be verbosely -displayed. +Rend l'installation verbeuse. Cela doit toujours +être la première option (le premier flag), de sorte que les définitions suivantes des +options soient affichées verbeusement. debug:: -Create debug output. No unattended installation is performed. During -package installation you have to answer all questions of the -postinstall scripts on the client's console. A lot of debug -information will be printed out. This flag is only useful for FAI -developers. +Afficher des informations de débogage. Aucune installation sans assistance +n’est effectuée. Pendant l’installation du paquet, vous devez répondre +à toutes les questions des scripts postinstall sur la console du +client. Beaucoup d’informations de débogage seront affichées. Cette option +n’est utile que pour les développeurs FAI. sshd:: -Start the ssh daemon to enable remote logins. -You can then log in as _root_ to all install clients during the -installation. The default password is _fai_ and can be changed by -setting `FAI_ROOTPW` in `nfsroot.conf(5)`. To log in from your server -to the install client (named demohost in this example) use: +Démarrer le démon ssh pour activer les connexions à distance. Vous +pouvez ensuite vous connecter en tant que _root_ à tous les clients +d’installation pendant l’installation. Le mot de passe par défaut est +_fai_ et peut être modifié en définissant `FAI_ROOTPW` dans +`nfsroot.conf(5)`. Pour vous connecter à partir de votre serveur vers le +client d’installation (nommé demohost dans cet exemple), utilisez : ---- $ ssh root@demohost @@ -1407,52 +1415,56 @@ Warning: Permanently added 'demohost,192.168.33.100' to the list of known hosts. root@demohost's password: ---- -This is only the root password during the -installation process, not for the new installed system. You can also -log in without a password when using +$SSH_IDENTITY+. +Ce n’est le mot de passe root que pendant le processus d’installation, +pas pour le nouveau système installé. Vous pouvez également vous +connecter sans mot de passe lorsque vous utilisez +$SSH_IDENTITY+. createvt:: -Create two virtual terminals and execute a bash if _ctrl-c_ is typed -in the console terminal. The additional terminals can be accessed by -typing _Alt-F2_ or _Alt-F3_. Otherwise, no terminals are available and -typing _ctrl-c_ will reboot the install client. Setting this flag is -useful for debugging. If you want an installation which should not be -interruptible, do not set this flag. +Créez deux terminaux virtuels et exécutez un bash si _ctrl-c_ est tapé +dans le terminal de console. Vous pouvez accéder aux terminaux +supplémentaires en tapant _Alt-F2_ ou _Alt-F3_. Sinon, aucun terminal +n’est disponible et la saisie _ctrl-c_ va redémarrer le client +d’installation. La définition de cette option est utile pour le débogage. +Si vous voulez une installation qui ne soit pas interruptible, +ne définissez pas cette option. menu:: -This enables a user menu for selecting a profile. All files -+class/*.profile+ are read and a curses based menu will be created. +Cela active un menu utilisateur pour sélectionner un profil. Tous les +fichiers +class/*.profile+ sont lus et un menu basé sur curses +sera créé. screen:: -Run FAI inside a `screen(1)` session. The session is called FAI. -If you log in via ssh from remote you can attach to the session using: +Lancer FAI dans une session `screen(1)`. La session est nommée FAI. +Si on se connecte via ssh à distance on peut se rattacher à la session en utilisant : ---- $ screen -x ---- tmux:: -Run FAI inside a `tmux(1)` session. The session is called FAI. -If you log in via ssh from remote you can attach to the session using: +Lancer FAI dans une session `tmux(1)`. La session est nommée FAI. +Si on se connecte via ssh à distance on peut se rattacher à la session en utilisant : ---- $ tmux attach ---- reboot:: -Reboot the install client after installation is finished without -typing RETURN on the console. If this flag is not set, and error.log -contains anything, the install client will stop and wait that you -press RETURN. If no errors occurred, the client will always reboot -automatically. +Redémarrer le client d’installation une fois l’installation terminée +sans taper Entrée sur la console. Si cette option n’est pas définie, et +que error.log contient quelque chose, le client d’installation +s’arrêtera et attendra que vous appuyez sur Entrée. Si aucune erreur +ne s’est produite, le client redémarrera toujours +automatiquement. halt:: -Halt the install client at the end of the installation, instead of -rebooting into the new system. +Arrêter le client d’installation à la fin de l’installation, au lieu +de redémarrer dans le nouveau système. initial:: -Used by `setup-storage(8)`. Partitions marked with +preserve_reinstall+ -are preserved unless this flag is set. Often, this flag is set in a -file 'class/*.var' by using setting 'flag_initial=1'. +Utilisé par `setup-storage(8)`. Les partitions marquées avec ++preserve_reinstall+ sont préservées à moins que cette option ne soit +définie. Souvent, cette option est définie dans un fichier 'class/*.var' en +utilisant le paramètre 'flag_initial=1'. == [[install]] FAI installs your plan diff --git a/doc/po/fr.po b/doc/po/fr.po index ab2a2c31f..e163e4d86 100644 --- a/doc/po/fr.po +++ b/doc/po/fr.po @@ -4,7 +4,7 @@ msgstr "" "Project-Id-Version: FAI-GUIDE version 6.4\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-10-23 11:06+0200\n" -"PO-Revision-Date: 2025-10-23 19:59+0200\n" +"PO-Revision-Date: 2025-10-24 09:15+0200\n" "Last-Translator: Georges Khaznadar \n" "MIME-Version: 1.0\n" @@ -2899,7 +2899,7 @@ msgstr "" #: fai-guide.txt:1222 msgid "==== [[cfengine]]Cfengine scripts" -msgstr "" +msgstr "==== [[cfengine]]Scripts cfengine" #: fai-guide.txt:1228 msgid "" @@ -2909,16 +2909,24 @@ msgid "" "variables which are undefined. If a variable is undefined, the whole\n" "cfengine script will abort." msgstr "" +"CFEngine dispose d’un riche ensemble de fonctions pour modifier les\n" +"fichiers de configuration existants, par exemple _LocateLineMatching,\n" +"ReplaceAll, InsertLine, AppendIfNoSuchLine, HashCommentLinesContaining_.\n" +"Mais il ne peut pas traiter les variables qui sont indéfinies. Si une\n" +"variable n’est pas définie, l’ensemble du script cfengine s’arrêtera." #: fai-guide.txt:1231 msgid "" "More information can be found in the manual page `cfengine(8)` or at\n" "the cfengine homepage https://www.cfengine.com." msgstr "" +"On peut trouver plus d’informations dans la page de manuel\n" +"`cfengine(8)` ou sur la page d’accueil de cfengine\n" +"https://www.cfengine.com." #: fai-guide.txt:1234 msgid "=== [[hooks]]Hooks" -msgstr "" +msgstr "=== [[hooks]]Les hooks, les « crochets »" #: fai-guide.txt:1247 msgid "" @@ -2935,6 +2943,20 @@ msgid "" "default tasks as parameters. In the examples provided, the hooks of\n" "the class CENTOS skips some Debian specific tasks." msgstr "" +"Les crochets (hooks) vous permettent de spécifier des fonctions ou des programmes\n" +"qui sont exécutés à certaines étapes du processus d’installation. Avant\n" +"qu’une tâche soit appelée, FAI recherche les crochets existants pour cette\n" +"tâche et les exécute. Comme on peut s’y attendre, les classes sont\n" +"également utilisées lors de l’appel de hooks. Les hooks sont exécutés\n" +"pour chaque classe définie. Il vous suffit de créer le hook avec le nom\n" +"de la classe désirée et il sera utilisé. Si plusieurs hooks pour une\n" +"tâche existent, ils sont appelés dans l’ordre défini par les classes. Si\n" +"_debug_ est inclus dans +$FAI_FLAG+ l’option _-d_ est passée à tous\n" +"les hooks, donc vous pouvez déboguer vos propres hooks. Si certaines\n" +"tâches par défaut doivent être ignorées, utilisez la sous-routine\n" +"_skiptask_ et une liste de tâches par défaut comme paramètres. Dans les\n" +"exemples fournis, les hooks de la classe CENTOS ignorent certaines\n" +"tâches spécifiques de Debian." #: fai-guide.txt:1254 msgid "" @@ -2945,6 +2967,13 @@ msgid "" "specified class is defined for the installing client. See section\n" "<> for a complete list of default tasks that can be used." msgstr "" +"Le répertoire '$FAI/hooks/' contient tous les hooks. Un hook est un\n" +"fichier exécutable qui est nommé selon la tâche : 'taskname.CLASSNAME[.sh]'\n" +"(par exemple, 'repository.CENTOS' ou 'savelog.LAST.sh'). Le nom de tâche\n" +"spécifie quelle tâche précède l'exécution de ce hook, si la\n" +"classe spécifiée est définie pour le client d’installation.\n" +"Voir la section <> pour une liste complète des tâches\n" +"par défaut qu'on peut utiliser." #: fai-guide.txt:1261 msgid "" @@ -2955,6 +2984,13 @@ msgid "" "shell scripts and are sourced. So it's possible to redefine variables\n" "for the installation scripts." msgstr "" +"Un hook du formulaire _hookprefix.classname_ ne peut pas définir de\n" +"variables pour le script d’installation, car il s’agit d’un\n" +"sous-processus. Mais vous pouvez utiliser n’importe quel exécutable\n" +"binaire ou n’importe quel script que vous avez écrit. Les hooks qui ont\n" +"le suffixe _.sh_ (par exemple, 'partition.DEFAULT.sh') doivent être des\n" +"scripts Bourne shell et sont sourcé. Il est donc possible de redéfinir\n" +"des variables pour les scripts d’installation." #: fai-guide.txt:1267 msgid "" @@ -2964,6 +3000,12 @@ msgid "" "+$nfsroot+'/$FAI/hooks' on the install server. All other hooks are\n" "found in '$FAI_CONFIGDIR/hooks' on the install server." msgstr "" +"Dans la première partie de FAI, tous les hooks avec le préfixe _confdir_\n" +"sont appelés. Ces hooks ne peuvent pas être localisés dans l’espace de\n" +"configuration, car il n’est pas encore disponible. Par conséquent, ces\n" +"hooks sont les seuls hooks situés dans +$nfsroot+'/$FAI/hooks' sur le\n" +"serveur d’installation. Tous les autres hooks se trouvent dans\n" +"'$FAI_CONFIGDIR/hooks' sur le serveur d’installation." #: fai-guide.txt:1273 msgid "" @@ -2972,16 +3014,23 @@ msgid "" "_DEFAULT_ should only be called if no hook for class +$HOSTNAME+ is\n" "available, insert these lines to the default hook:" msgstr "" +"Tous les hooks appelés avant la définition des classes peuvent\n" +"utiliser uniquement les classes suivantes: _DEFAULT $HOSTNAME LAST_. Si un hook\n" +"pour la classe _DEFAULT_ doit être appelé uniquement dans le cas où aucun hook pour\n" +"la classe +$HOSTNAME+ n’est disponible, insérez ces lignes dans le hook\n" +"par défaut :" #: fai-guide.txt:1276 msgid "" "----\n" "hookexample.DEFAULT:" msgstr "" +"----\n" +"hookexample.DEFAULT:" #: fai-guide.txt:1278 msgid "#! /bin/sh" -msgstr "" +msgstr "#! /bin/sh" #: fai-guide.txt:1286 msgid "" @@ -2993,32 +3042,39 @@ msgid "" ".\n" "----" msgstr "" +"# sauter le hook DEFAULT s'il existe un hook pour $HOSTNAME\n" +"scriptname=$(basename $0 .DEFAULT)\n" +"[-f $FAI/hooks/$scriptname.$HOSTNAME ] && exit\n" +"# suivent alors les actions pour la classe DEFAULT\n" +".\n" +".\n" +"----" #: fai-guide.txt:1288 msgid "Some examples for what hooks could be used:" -msgstr "" +msgstr "Quelques exemples de ce à quoi les hooks pourraient être utiles :" #: fai-guide.txt:1290 msgid "- Load kernel modules before classes are defined in '$FAI/class'." -msgstr "" +msgstr "- Charger les modules du noyau avant que les classes soient définies dans '$FAI/class'." #: fai-guide.txt:1292 msgid "- Send an email to the administrator if the installation is finished." -msgstr "" +msgstr "- Envoyer un courriel à l’administrateur si l’installation est terminée." #: fai-guide.txt:1294 msgid "- Install a diskless client and skip local disk partitioning." -msgstr "" +msgstr "- Installer un client sans disque et sautez le partitionnement de disque local." #: fai-guide.txt:1296 msgid "" "- Have a look at +hooks/debconf.IMAGE+ for how to clone a machine using a " "file system image." -msgstr "" +msgstr "- Jeter un œil à +hooks/debconf.IMAGE+ pour savoir comment cloner une machine en utilisant une image de système de fichiers." #: fai-guide.txt:1298 msgid "=== [[faiflags]]FAI flags" -msgstr "" +msgstr "=== [[faiflags]]Options (flags) de FAI" #: fai-guide.txt:1302 msgid "" @@ -3026,6 +3082,9 @@ msgid "" "flags. Flags are normally defined in the pxelinux.cfg file which\n" "should be created by 'fai-chboot(1)'. The following flags are known:" msgstr "" +"La variable +$FAI_FLAGS+ contient une liste d'options séparées par des\n" +"espaces. Les options sont normalement définies dans le fichier pxelinux.cfg qui\n" +"est censément créé par 'fai-chboot(1)'. Les options suivantes sont connues :" #: fai-guide.txt:1307 msgid "" @@ -3034,6 +3093,10 @@ msgid "" "first flag, so consecutive definitions of flags will be verbosely\n" "displayed." msgstr "" +"verbose::\n" +"Rend l'installation verbeuse. Cela doit toujours\n" +"être la première option (le premier flag), de sorte que les définitions suivantes des\n" +"options soient affichées verbeusement." #: fai-guide.txt:1314 msgid "" @@ -3044,6 +3107,12 @@ msgid "" "information will be printed out. This flag is only useful for FAI\n" "developers." msgstr "" +"debug::\n" +"Afficher des informations de débogage. Aucune installation sans assistance\n" +"n’est effectuée. Pendant l’installation du paquet, vous devez répondre\n" +"à toutes les questions des scripts postinstall sur la console du\n" +"client. Beaucoup d’informations de débogage seront affichées. Cette option\n" +"n’est utile que pour les développeurs FAI." #: fai-guide.txt:1321 msgid "" @@ -3054,6 +3123,13 @@ msgid "" "setting `FAI_ROOTPW` in `nfsroot.conf(5)`. To log in from your server\n" "to the install client (named demohost in this example) use:" msgstr "" +"sshd::\n" +"Démarrer le démon ssh pour activer les connexions à distance. Vous\n" +"pouvez ensuite vous connecter en tant que _root_ à tous les clients\n" +"d’installation pendant l’installation. Le mot de passe par défaut est\n" +"_fai_ et peut être modifié en définissant `FAI_ROOTPW` dans\n" +"`nfsroot.conf(5)`. Pour vous connecter à partir de votre serveur vers le\n" +"client d’installation (nommé demohost dans cet exemple), utilisez :" #: fai-guide.txt:1327 msgid "" @@ -3064,6 +3140,11 @@ msgid "" "root@demohost's password:\n" "----" msgstr "" +"----\n" +"$ ssh root@demohost\n" +"Warning: Permanently added 'demohost,192.168.33.100' to the list of known hosts.\n" +"root@demohost's password:\n" +"----" #: fai-guide.txt:1331 msgid "" @@ -3071,6 +3152,9 @@ msgid "" "installation process, not for the new installed system. You can also\n" "log in without a password when using +$SSH_IDENTITY+." msgstr "" +"Ce n’est le mot de passe root que pendant le processus d’installation,\n" +"pas pour le nouveau système installé. Vous pouvez également vous\n" +"connecter sans mot de passe lorsque vous utilisez +$SSH_IDENTITY+." #: fai-guide.txt:1340 msgid "" @@ -3082,6 +3166,14 @@ msgid "" "useful for debugging. If you want an installation which should not be\n" "interruptible, do not set this flag." msgstr "" +"createvt::\n" +"Créez deux terminaux virtuels et exécutez un bash si _ctrl-c_ est tapé\n" +"dans le terminal de console. Vous pouvez accéder aux terminaux\n" +"supplémentaires en tapant _Alt-F2_ ou _Alt-F3_. Sinon, aucun terminal\n" +"n’est disponible et la saisie _ctrl-c_ va redémarrer le client\n" +"d’installation. La définition de cette option est utile pour le débogage.\n" +"Si vous voulez une installation qui ne soit pas interruptible,\n" +"ne définissez pas cette option." #: fai-guide.txt:1344 msgid "" @@ -3089,6 +3181,10 @@ msgid "" "This enables a user menu for selecting a profile. All files\n" "+class/*.profile+ are read and a curses based menu will be created." msgstr "" +"menu::\n" +"Cela active un menu utilisateur pour sélectionner un profil. Tous les\n" +"fichiers +class/*.profile+ sont lus et un menu basé sur curses\n" +"sera créé." #: fai-guide.txt:1351 msgid "" @@ -3099,6 +3195,12 @@ msgid "" "$ screen -x\n" "----" msgstr "" +"screen::\n" +"Lancer FAI dans une session `screen(1)`. La session est nommée FAI.\n" +"Si on se connecte via ssh à distance on peut se rattacher à la session en utilisant :\n" +"----\n" +"$ screen -x\n" +"----" #: fai-guide.txt:1358 msgid "" @@ -3109,6 +3211,12 @@ msgid "" "$ tmux attach\n" "----" msgstr "" +"tmux::\n" +"Lancer FAI dans une session `tmux(1)`. La session est nommée FAI.\n" +"Si on se connecte via ssh à distance on peut se rattacher à la session en utilisant :\n" +"----\n" +"$ tmux attach\n" +"----" #: fai-guide.txt:1365 msgid "" @@ -3119,6 +3227,13 @@ msgid "" "press RETURN. If no errors occurred, the client will always reboot\n" "automatically." msgstr "" +"reboot::\n" +"Redémarrer le client d’installation une fois l’installation terminée\n" +"sans taper Entrée sur la console. Si cette option n’est pas définie, et\n" +"que error.log contient quelque chose, le client d’installation\n" +"s’arrêtera et attendra que vous appuyez sur Entrée. Si aucune erreur\n" +"ne s’est produite, le client redémarrera toujours\n" +"automatiquement." #: fai-guide.txt:1369 msgid "" @@ -3126,6 +3241,9 @@ msgid "" "Halt the install client at the end of the installation, instead of\n" "rebooting into the new system." msgstr "" +"halt::\n" +"Arrêter le client d’installation à la fin de l’installation, au lieu\n" +"de redémarrer dans le nouveau système." #: fai-guide.txt:1374 msgid "" @@ -3134,6 +3252,11 @@ msgid "" "are preserved unless this flag is set. Often, this flag is set in a\n" "file 'class/*.var' by using setting 'flag_initial=1'." msgstr "" +"initial::\n" +"Utilisé par `setup-storage(8)`. Les partitions marquées avec\n" +"+preserve_reinstall+ sont préservées à moins que cette option ne soit\n" +"définie. Souvent, cette option est définie dans un fichier 'class/*.var' en\n" +"utilisant le paramètre 'flag_initial=1'." #: fai-guide.txt:1376 msgid "== [[install]] FAI installs your plan" From 1c26268b753528abbfe68edd3ea31d616433dc81 Mon Sep 17 00:00:00 2001 From: Georges Khaznadar Date: Fri, 24 Oct 2025 12:21:33 +0200 Subject: [PATCH 3/9] improving the French translation --- doc/fai-guide_fr.html | 533 ++++++++++++++++++++++-------------------- doc/fai-guide_fr.txt | 533 ++++++++++++++++++++++-------------------- doc/po/fr.po | 348 +++++++++++++++++++++++++-- 3 files changed, 871 insertions(+), 543 deletions(-) diff --git a/doc/fai-guide_fr.html b/doc/fai-guide_fr.html index 89736db0f..423127b6b 100644 --- a/doc/fai-guide_fr.html +++ b/doc/fai-guide_fr.html @@ -2828,26 +2828,25 @@

Options (fla
-

FAI installs your plan

+

FAI installe votre planification

-

The early part of an installation

-

After the kernel has booted, it mounts the root file system via NFS -from the install server and starts the script -/usr/sbin/fai
[Since the root file system on the clients is mounted via -NFS, fai is located in -/srv/fai/nfsroot/usr/sbin on the install -server.]
. This script controls the sequence of the -installation. No other scripts in /etc/init.d/ are used.

-

The configuration space is made available via the configured method -(an NFS mount by default) from the install server to the path defined -in $FAI
[$FAI is an internal variable used by the FAI -scripts. By default the path is /var/lib/fai/config.]

+

La première phase d’une installation

+

Après le démarrage du noyau, on monte le système de fichiers racine via +NFS à partir du serveur d’installation et on démarre le script +/usr/sbin/fai
[Comme le système de fichiers racine des clients +est monté via NFS, fai se situe dans /srv/fai/nfsroot/usr/sbin sur le +serveur d’installation.]
. Ce script contrôle la séquence de +l’installation. Aucun autre script dans /etc/init.d/ n’est utilisé.

+

L’espace de configuration est rendu disponible via la méthode configurée +(un montage NFS par défaut) depuis le serveur d’installation vers le chemin défini +dans $FAI
[$FAI est une variable interne utilisée par les scripts FAI. +Le chemin par défaut est /var/lib/fai/config.]

-

Boot messages

-

When booting the install client from network card with PXE you will see some -messages like this:

+

Messages de démarrage

+

Lorsqu’on démarre le client d’installation à partir de la carte +réseau avec PXE, on voit des messages comme ceci :

Managed PC Boot Agent (MBA) v4.00
@@ -2873,12 +2872,12 @@ 

Boot messages

Loading vmlinuz-6.1.0-17-amd64.................. Loading initrd.img-6.1.0-17-amd64......................ready.
-

At this point the install client has successfully received the network -config via DHCP and the kernel and initrd via TFTP. It now boots the -Linux kernel and the initrd. If everything went right, the initrd -mounts the nfsroot
[/srv/fai/nfsroot from the install -server via NFS]
and the FAI scripts are started. The first -thing you see is the red FAI copyright message.

+

À ce stade, le client d’installation a réussi à recevoir la configuration +réseau via DHCP, le noyau et le fichier initrd via TFTP. Il démarre maintenant Le +noyau Linux et met en place initrd. Si tout se passe bien, l’initrd monte +le nfsroot
[/srv/fai/nfsroot depuis le serveur d’installation via NFS]
+et les scripts FAI sont lancés. La première +chose qu’on voit est le message de copyright en rouge de FAI.

             -------------------------------------------------
@@ -2927,117 +2926,123 @@ 

Boot messages

85-efi-classes OK. List of all classes: DEFAULT LINUX AMD64 DHCPC FAIBASE DEBIAN DEMO GRUB_PC demohost2 LAST
-

You can also see the list of FAI classes, that are defined for this -host. This list is very important for the rest of the installation.

-

The first task is called confdir, which is responsible for getting -access to the config space. Here, we use an NFS mount from the install -server as you can see on the console (and later in the logs).

+

On peut également voir la liste des classes FAI, qui sont définies +pour cet hôte. Cette liste est très importante pour le reste de l’installation.

+

La première tâche est appelée confdir, qui est chargée de accès à +l’espace de configuration. Ici, on utilise un montage NFS depuis +le serveur d’installation comme on peut le voir sur la console (et plus tard +dans les journaux).

FAI_CONFIG_SRC is set to nfs://faiserver/srv/fai/config
 Configuration space faiserver:/srv/fai/config mounted to /var/lib/fai/config
-

Before the installation is started ($FAI_ACTION=install) the computer -beeps three times. So, be careful when you hear three beeps but you do -not want to perform an installation and let FAI erase all yout data on -the local disk!

+

Avant de lancer l’installation ($FAI_ACTION=install), l’ordinateur +émet trois bips. Donc, faites attention quand vous entendez trois bips +et que vous ne voulez pas effectuer une installation, ni laisser FAI +effacer toutes vos données sur Le disque local !

-

Rebooting the computer into the new system

-

For rebooting the computer during or at the end of the installation you -should use the command faireboot in favour of the normal reboot command. -Use faireboot also if logged in from remote. If the installation -hasn’t finished, use faireboot -s, so the log files are also copied -to the install server.

-

If the installation has finished successfully, the computer should boot a -small Debian system. You can login as user demo or root with password fai.

+

Redémarrage de l’ordinateur dans le nouveau système

+

Pour redémarrer l’ordinateur pendant ou à la fin de l’installation, vous +devez utiliser la commande faireboot de préférence à la commande de +redémarrage normal. Utilisez aussi faireboot si vous êtes connecté +à distance. Si l’installation n’est pas terminée, utilisez +faireboot -s, afin que les fichiers journaux soient aussi copiés sur le +serveur d’installation.

+

Si l’installation s’est bien terminée, l’ordinateur doit démarrer un petit +système Debian. Vous pouvez vous connecter en tant qu’utilisateur demo ou root +avec le mot de passe fai.

-

Starting FAI (task confdir)

-

After the install client has booted only the script /usr/sbin/fai is -executed. It will do some minimal initialization. The variable -$FAI_CONFIG_SRC
[It is defined on the kernel command line]
-is used to get access to the FAI configuration space which is then -available in the directory $FAI
[/var/lib/fai/config]
. FAI -will not proceed without the config space.

-

You can access the config space using different methods. Supported -methods are: nfs:, file:, cvs:, svn: git:, hg:, http: and detect:. -See fai.conf(5) for a detailed description of these methods.

+

Démarrage de FAI (tâche confdir)

+

Une fois le client d’installation démarré, seul le script +/usr/sbin/fai est exécuté. Il effectuera une initialisation minimale. +La variable $FAI_CONFIG_SRC
[Celle-ci est définie dans la ligne de commande du noyau]
+est utilisée pour accéder à l’espace de configuration FAI qui est alors +disponible dans le répertoire $FAI
[/var/lib/fai/config]
. +FAI ne se fonctionnera pas sans l’espace de configuration.

+

On peut accéder à l’espace de configuration à l’aide de diverses méthodes. Les +méthodes supportées sont : nfs:, file:, cvs:, svn: git:, hg:, http: et detect:. +Voir fai.conf(5) pour une description détaillée de ces méthodes.

-

Defining classes and variables (tasks defclass and defvar)

-

The command fai-class(1) executes scripts in $FAI/class for defining -classes. If the scripts write a string to stdout, this will be defined -as a class. Read all the details in the man page of fai-class(1).

-

After defining the classes, every file matching .var with a prefix -which matches a defined class is sourced to define variables. It must -contain valid shell code.

+

Définition de classes et de variables (tâches defclass et defvar)

+

La commande fai-class(1) exécute des scripts dans $FAI/class pour +définir des classes. Si les scripts écrivent une chaîne dans stdout, cela +sera défini comme une classe. Lisez tous les détails dans la page de +manuel de fai-class(1).

+

Après avoir défini les classes, chaque fichier correspondant à .var +avec un préfixe qui correspond à une classe définie est pris en compte pour +définir des variables. Il doit contenir du code shell valide.

-

Partitioning local disks, creating file systems (task partition)

-

For the disk partitioning exactly one disk configuration file from -$FAI/disk_config is selected using classes.

-

The format of the disk configuration is similar to a fstab file.

-

The partitioning tool setup-storage(8) performs all commands -necessary for creating the disk partition layout, software RAID, LVM -and for creating the file systems. Disks and partitions may easily be -referenced by disk1.1, disk2.4 etc. Read the manual page of -setup-storage(8) for a detailed description and some examples of the -format.

+

Partitionnement des disques locaux, création des systèmes de fichiers (tâche partition)

+

Pour le partitionnement du disque, un fichier de configuration de disque +de $FAI/disk_config est sélectionné à l’aide de classes, et un seul.

+

Le format de la configuration du disque est similaire à un fichier fstab.

+

L’outil de partitionnement setup-storage(8) exécute toutes les +commandes nécessaires pour créer l’organisation des partitions du +disque, du RAID logiciel, du LVM et pour créer les systèmes de +fichiers. Lisez la page de manuel de setup-storage(8) pour une +description détaillée et quelques exemples du format.

-

Debconf preseeding (task debconf)

-

Files in $FAI/debconf are used for the usual debconf(7) preseeding -if the file names match a class name.

+

Pré-ensemencement Debconf (tâche debconf)

+

Les fichiers dans $FAI/debconf sont utilisés par le système de pré-ensemencement +habituel de debconf(7) si les noms de fichier correspondent à un +nom de classe.

-

Installing software packages (task instsoft)

-

The command install_packages(8) reads the config files from -$FAI/package_config in a class based manner and installs software -packages on the new file system.

-

It installs the packages using apt-get(8), aptitude(1), yum or other -package tools without any manual interaction needed. Package -dependecies are also resolved by the package tools.

-

The format of the configuration files is described in [packageconfig].

-

Additionaly FAI will install packages (.deb or .rpm') from the -directories $FAI/pkgs/<CLASSNAME>.

+

Installation de paquets logiciels (tâche instsoft)

+

La commande install_packages(8) lit les fichiers de configuration à +partir de $FAI/package_config d’une façon basée sur la classe et installe des paquets +logiciels sur le nouveau système de fichiers.

+

Elle installe les paquets en utilisant apt-get(8), aptitude(1), +yum ou d’autres gestionnaires de paquets sans besoin d’aucune interaction manuelle. +Les dépendances des paquets sont également résolues par les gestionnaires de paquets.

+

Le format des fichiers de configuration est décrit dans [packageconfig].

+

De plus, FAI installera les paquets (.deb or .rpm') depuis les +répertoires $FAI/pkgs/<CLASSNAME>.

-

Site specific customization (task configure)

-

Often the default configurations of the software packages will not -meet your site-specific needs. You can call arbitrary scripts which -adjust the system configuration. Therefore the command -fai-do-scripts(1) executes scripts in $FAI/scripts in a class -based manner. It is possible to have several scripts of different -types (shell, cfengine, …) to be executed for one class.

-

The default set of scripts in $FAI/scripts include examples for -installing Debian and Rocky Linux machines. They set the root password, add -a user account (set by '$username, default to demo), set the timezone, configure the network for DHCP -or using a fixed IP address, setup grub and more. -They should do a reasonable job for your installation. You can edit -them or add new scripts to match your local needs.

-

More information about these scripts are described in [cscripts].

+

Personnalisation spécifique au site (tâche configure)

+

Souvent, les configurations par défaut des paquets logiciels ne répondent pas à +vos besoins spécifiques au site. Vous pouvez appeler des scripts +arbitraires qui ajustent la configuration du système. Par conséquent, la +commande fai-do-scripts(1) exécute des scripts dans $FAI/scripts +d’une manière basée sur la classe. Il est possible d’avoir plusieurs +scripts de différents types (shell, cfengine, …) à exécuter pour une classe.

+

L’ensemble de scripts par défaut dans $FAI/scripts inclut des exemples +d’installation de machines Debian et Rocky Linux. Ils définissent le mot de +passe root, ajoutent un compte utilisateur (défini par $username, avec demo par défaut), +paramètrent le fuseau horaire, configurent le réseau avec DHCP ou en utilisant une adresse IP +fixe, configurent grub et plus encore. Ils devraient faire un +travail raisonnable pour votre installation. Vous pouvez les modifier ou +ajouter de nouveaux scripts pour répondre à vos besoins locaux.

+

Plus d’information sur ces scripts est disponible dans [cscripts].

-

Saving log files (task savelog)

-

When all tasks are finished, the log files are written to +

Enregistrement des fichiers journaux (tâche savelog)

+

Lorsque toutes les tâches sont terminées, les fichiers journaux sont écrits dans /var/log/fai/$HOSTNAME/install/ -
[/var/log/fai/localhost/install/ is a link to this -directory.]
on the new system and to the account on the install server -if $LOGUSER is defined (you have to enable this in -/srv/fai/config/class/FAIBASE.var). It is also possible to specify -another host as log saving destination through the variable -$LOGSERVER. If $LOGSERVER is not defined, FAI uses the variable -$SERVER which is only defined during an initial installation (by -get-boot-info).

-

Additionally, two symlinks will be created to indicated the last -directory written to. The symlink last points to the log directory -of the last FAI action performed. The symlinks last-install and -last-sysinfo point to the directory of the last corresponding -action. By default log files will be copied to the log -server using scp. You can use the variable $FAI_LOGPROTO in file -fai.conf(5) to choose another method for saving logs to the remote -server. Here’s an example of the symlink structure:

+
[/var/log/fai/localhost/install/ est un lien vers ce répertoire.]
+sur le nouveau système, et sur le compte sur le serveur d’installation si +$LOGUSER est défini (il faut l’activer dans /srv/fai/config/class/FAIBASE.var). +Il est également possible de spécifier un autre hôte comme destination pour cet enregistrement +à l’aide de la variable +$LOGSERVER. Si $LOGSERVER n’est pas défini, FAI utilise la +variable $SERVER qui n’est définie que lors d’une installation +initiale (par get-boot-info).

+

De plus, deux liens symboliques seront créés pour indiquer le dernier +répertoire où on a écrit. Le lien symbolique last pointe vers le répertoire +journal de la dernière action FAI exécutée. Les liens symboliques +last-install et last-sysinfo pointent vers le répertoire avec la +dernière action correspondante. Par défaut, les fichiers journaux seront +copiés sur le serveur de journalisation à l’aide de scp. Vous pouvez utiliser +la variable $FAI_LOGPROTO dans le fichier fai.conf(5) pour choisir +une autre méthode d’enregistrement des journaux sur le serveur distant. +Voici un exemple de structure de lien symbolique :

lrwxrwxrwx   1 fai fai   23 Dec  2  2013 last-sysinfo -> sysinfo-20131202_161237
@@ -3048,78 +3053,80 @@ 

Sav lrwxrwxrwx 1 fai fai 23 Dec 4 13:22 last -> install-20141204_131351 drwxr-xr-x 2 fai fai 4096 Dec 4 13:22 install-20141204_131351

-

Examples of the log files can be found at https://fai-project.org/logs.

+

Vous trouverez des exemples de fichiers journaux à l’adresse https://fai-project.org/logs.

-

Reboot the new installed system

-

Before rebooting, the install client calls fai-chboot -d <hostname> -on the install server, to disable its own PXELINUX -configuration. Otherwise, it would restart the installation during the -next boot. Normally this should boot the new installed system from -its second boot device, the local hard disk.

-

At the end, the system is automatically rebooted if "reboot" was added to -$FAI_FLAGS.

+

Redémarrage du nouveau système installé

+

Avant de redémarrer, le client d’installation appelle +fai-chboot -d <hostname> sur le serveur d’installation, pour +désactiver sa propre configuration PXELINUX. Sinon, il redémarrerait +l’installation lors de la prochaine initialisation. Normalement, cela +devrait démarrer le nouveau système installé à partir de son second +périphérique d’amorçage, le disque dur local.

+

À la fin, le système est automatiquement redémarré si "reboot" a été +ajouté à $FAI_FLAGS.

-

Advanced FAI topics

+

Sujets avancés pour FAI

-

Checking parameters received from DHCP servers

-

If the install client boots you can check -if all information from the DHCP daemon are received -correctly. The received information is written to -/tmp/fai/boot.log. An example of the result of a DHCP request can be -found in the sample log files.

+

Vérification des paramètres reçus des serveurs DHCP

+

Si le client d’installation démarre, vous pouvez vérifier si toutes les +informations provenant du démon DHCP sont correctement reçues. Les +informations reçues sont écrites dans /tmp/fai/boot.log. Un exemple de +résultat d’une requête DHCP peut être trouvé dans les fichiers journaux +d’exemple.

-

Monitoring multiple client installations

-

You can monitor the installation of all install clients with the -command fai-monitor(8). All clients check if this daemon is running -on the install server (or the machine defined by the variable -$monserver). Each time a task starts or ends, a message is sent. The -FAI monitor daemon prints this messages to standard output. There’s -also a graphical frontend available, called fai-monitor-gui(1).

+

Surveillance de plusieurs clients d’installation

+

Vous pouvez surveiller l’installation de tous les clients d’installation +avec la commande fai-monitor(8). Tous les clients vérifient si ce +démon est en cours d’exécution sur le serveur d’installation (ou sur +l’ordinateur défini par la variable $monserver). Chaque fois qu’une +tâche démarre ou se termine, un message est envoyé. Le démon du moniteur +FAI envoie ces messages dans sa sortie standard. On peut aussi utiliser une interface +graphique, appelée fai-monitor-gui(1).

$  fai-monitor | fai-monitor-gui - &
-

Collecting Ethernet addresses for multiple hosts

-

You have to collect all Ethernet (MAC) addresses of the install -clients and assign a host name and IP address to each client. To -collect the MAC addresses, boot your install clients. -You can already do this before any DHCP daemon is running in your -subnet. They will fail to boot (because of the missing DHCP or missing TFTP), -but you can still collect the MAC addresses.

-

While the install clients are booting, they send broadcast packets to the -LAN. You can log the MAC addresses of these hosts by running the -following command simultaneously on the server:

+

Collecte d’adresses Ethernet pour plusieurs hôtes

+

Vous devez collecter toutes les adresses Ethernet (MAC) des clients +d’installation et affecter un nom d’hôte et une adresse IP à chaque +client. Pour collecter les adresses MAC, démarrez vos clients +d’installation. Vous pouvez déjà le faire avant que n’importe quel démon +DHCP s’exécute dans votre sous-réseau. Ils échoueront à démarrer (en +raison de l’absence de DHCP ou de TFTP), mais vous pouvez toujours +collecter les adresses MAC.

+

Pendant que les clients d’installation démarrent, ils envoient des +paquets de diffusion (broadcast) au LAN. Vous pouvez enregistrer les adresses MAC de +ces hôtes en exécutant simultanément la commande suivante sur le serveur :

faiserver# tcpdump -qtel broadcast and port bootpc >/tmp/mac.list
-

After the hosts have been sent some broadcast packets abort tcpdump -by typing ctrl-c. You get a list of all -unique MAC addresses with these commands:

+

Une fois que les hôtes ont envoyés quelques paquets de diffusion, arrêtez tcpdump +en tapant ctrl-c. Vous obtenez une liste de toutes les adresses MAC uniques avec ces commandes :

faiserver$ perl -ane 'print "\U$F[0]\n"' /tmp/mac.list|sort|uniq
-

After that, you only have to assign these MAC addresses to host names -and IP addresses (/etc/ethers and /etc/hosts or corresponding NIS -maps). With this information you can configure your DHCP -daemon (see the section [bootdhcp]).
[I recommend to write the MAC -addresses (last three bytes will suffice if you have network cards -from the same vendor) and the host name in the front of each chassis.]

+

Après cela, vous n’avez qu’à assigner ces adresses MAC aux noms d’hôte +et aux adresses IP (/etc/ethers et /etc/hosts ou aux associations NIS +correspondantes). Avec ces informations, vous pouvez configurer votre +démon DHCP (voir la section [bootdhcp]).
[Je recommande d’inscrire +l’adresse MAC (les trois derniers octets devraient suffire si vous avez des cartes du +même vendeur) et le nom d’hôte devant chaque boîtier.]

-

Debugging the network traffic

-

If the client can’t successfully boot from the network card, use -tcpdump(8) to look for Ethernet packets between the install server -and the client. Search also for entries in several log files made by -tftpd(8) and dhcpd(8) :

+

Débogage du trafic réseau

+

Si le client ne peut démarrer correctement à partir de la carte réseau, +utilisez tcpdump(8) pour rechercher des paquets Ethernet entre le +serveur d’installation et le client. Recherchez également dans les entrées de +plusieurs fichiers journaux venant de tftpd(8) et dhcpd(8) :

faiserver$ egrep "tftpd|dhcpd" /var/log/*
@@ -3127,59 +3134,60 @@

Debugging the network traffic

-

Details of PXE booting

-

Here we describe the details of PXE booting, which are only needed if -you have problems when booting your install clients.

-

Almost all modern bootable network cards support the PXE boot environment. -PXE is the Preboot Execution Environment. -This requires the PXELINUX bootloader and a special version of the TFTP -daemon, which is available in the Debian packages pxelinux and -tftpd-hpa. PXE booting also needs a DHCP server, so that the network -card can configure its IP parameters. This is the sequence of a PXE boot:

+

Détails du démarrage PXE

+

Ici, nous décrivons les détails du démarrage PXE, qui sont +nécessaires seulement si vous avez des problèmes lors du démarrage de vos +clients d’installation.

+

Presque toutes les cartes réseau modernes prennent en charge +l’environnement de démarrage PXE. PXE est l’environnement d’exécution de +pré-lancement. Cela nécessite le chargeur de démarrage PXELINUX et une +version spéciale du démon TFTP, disponibles dans les paquets Debian +pxelinux et tftpd-hpa. Le démarrage PXE nécessite également un +serveur DHCP, afin que la carte réseau puisse configurer ses paramètres +IP. Voici la séquence d’une amorce PXE :

  • -Network card of the client sends its MAC address +La carte réseau du client envoie son adresse MAC

  • -DHCP server replies with IP configuration for the client +Le serveur DHCP répond par la configuration IP du client

  • -Network card configures IP +La carte réseau configure son IP

  • -Install client gets the pxelinux.0 binary via TFTP +Le client d’installation obtient le binaire pxelinux.0 via TFTP

  • -Get the pxelinux.cfg/C0A8210C configuration file via TFTP +Il obtient le fichier de configuration pxelinux.cfg/C0A8210C via TFTP

  • -C0A8210C is the IP address of the client in hexadecimal +C0A8210C est l’adresse IP du client en hexadécimal

  • -This configuration contains kernel, initrd and additional kernel -command line parameters, which was created by fai-chboot. +Cette configuration contient le noyau, le fichier initrd et les paramètres de ligne de commande supplémentaires du noyau, qui ont été créés par fai-chboot.

  • -Get the kernel and initrd via TFTP. +Il obtient le noyau et le fichier initrd via TFTP.

-

Example of a pxelinux.cfg file:

+

Exemple d’un fichier pxelinux.cfg :

default fai-generated
@@ -3188,45 +3196,48 @@ 

Details of P kernel vmlinuz-6.1.0-17-amd64 append initrd=initrd.img-6.1.0-17-amd64 ip=dhcp root=/srv/fai/nfsroot rootovl FAI_FLAGS=verbose,sshd,createvt FAI_CONFIG_SRC=nfs://faiserver/srv/fai/config FAI_ACTION=install

-

See /usr/share/doc/syslinux/pxelinux.doc for more detailed -information about PXELINUX. FAI uses the lpxelinux.0 binary which also -supports loading the kernel and initrd via FTP or HTTP. The command -fai-chboot(8) supports this with the option -U.

+

Voir /usr/share/doc/syslinux/pxelinux.doc pour des informations plus +détaillées sur PXELINUX. FAI utilise le fichier binaire lpxelinux.0 qui +s’occupe du chargement du noyau et du fichier initrd via FTP +ou HTTP. La commande fai-chboot(8) prend cela en charge avec +l’option -U.

-

Customizing your install server setup

+

Personnaliser la configuration de son serveur d’installation

  • -local/faster package mirror +Miroir de paquets logiciels local/plus rapide

  • -different loguser +Loguser différent

  • -local root pw inside nfsroot +Mot de passe root local dans nfsroot

-

The configuration for the FAI package (not the configuration data for -the install clients) is defined in fai.conf(5). Definitions that are -only used for creating the nfsroot are located in -nfsroot.conf(5). Check these important variables in nfsroot.conf -before calling fai-setup or fai-make-nfsroot.

+

La configuration du paquet FAI (et non les données de configuration pour +les clients d’installation) est définie dans fai.conf(5). Les +définitions qui sont utilisées uniquement pour créer le nfsroot sont +situées dans nfsroot.conf(5). Vérifiez ces variables importantes dans +nfsroot.conf avant d’appeler fai-setup ou fai-make-nfsroot.

FAI_DEBOOTSTRAP

-Building the nfsroot uses the command debootstrap(8). It needs the location of a Debian mirror and the -name of the distribution (like bullsseye, bookworm, sid) for which the basic Debian -system should be built. Do not use different distributions here and in -/etc/fai/apt/sources.list. This will create a broken nfsroot. +La construction du nfsroot utilise la commande debootstrap(8). Elle +a besoin de l’emplacement d’un miroir Debian et du nom de la +distribution (comme bullsseye, bookworm, sid) pour laquelle le système +Debian de base devrait être construit. N’utilisez pas de distributions +différentes ici et dans /etc/fai/apt/sources.list. Cela créerait un +nfsroot dysfonctionnel.

@@ -3234,87 +3245,91 @@

The content of /etc/fai/apt/sources.list is -used by the install server and also by the clients. If your install -server has multiple network cards and different host names for each -card (as for a Beowulf server), use the install server name which is -known by the install clients.

-

If you have problems running fai-setup, they usually stem from -fai-make-nfsroot(8) which is called by former command. Adding -v -gives you a more verbose output which helps you pinpoint the -error. The output is written to -/var/log/fai/fai-make-nfsroot.log.
[For debugging purpose -it may help to enter the chroot environment manually using this -command. faiserver# chroot /srv/fai/nfsroot bash]

-

The setup also creates the account fai (defined by $LOGUSER) if -not already available. So you can add a user before calling -fai-setup(8) using the command adduser(8) and use this as your -local account for saving log files. The log files of all install -clients are saved to the home directory of this account. You should -change the primary group of this -account, so this account has write permissions to /srv/tftp/fai in -order to call fai-chboot for creating the PXE configuration for the hosts.

-

When you make changes to fai.conf, nfsroot.conf the -nfsroot has to be rebuilt by calling fai-make-nfsroot(8). If you -only like to install a new kernel package to the nfsroot add the flags -k or --K to fai-make-nfsroot. This will not recreate your nfsroot, but -only updates your kernel and kernel modules inside the nfsroot or add -additional packages into the nfsroot.

+

Le contenu de /etc/fai/apt/sources.list est utilisé par le serveur +d’installation et aussi par les clients. Si votre serveur d’installation a +plusieurs cartes réseau et différents noms d’hôte pour chaque carte +(comme pour un serveur Beowulf), utilisez le nom du serveur +d’installation qui est connu des clients d’installation.

+

Si vous avez des problèmes lors de l’exécution de fai-setup, ils +proviennent habituellement de fai-make-nfsroot(8) qui est appelé par +la commande précédente. L’ajout de -v vous donne une sortie plus +détaillée qui vous aide à repérer l’erreur. La sortie est écrite dans +/var/log/fai/fai-make-nfsroot.log.
[À des fins de débogage, +il peut être utile d’entrer dans l’environnement chroot à la main à l’aide +de cette commande : faiserver# chroot /srv/fai/nfsroot bash]

+

L’installation crée également le compte fai (défini par $LOGUSER) +s’il n’est pas déjà disponible. Vous pouvez donc ajouter un utilisateur +avant d’appeler fai-setup(8) à l’aide de la commande adduser(8) +et l’utiliser comme compte local pour enregistrer des fichiers journaux. Les +fichiers journaux de tous les clients d’installation sont enregistrés +dans le répertoire de personnel de ce compte. Vous devriez changer le groupe +principal de ce compte, afin que ce compte ait des droits d’écriture sur +/srv/tftp/fai afin d’appeler fai-chboot pour créer la configuration PXE +pour les hôtes.

+

Lorsque vous apportez des modifications à fai.conf, nfsroot.conf, le +nfsroot doit être reconstruit en appelant fai-make-nfsroot(8). Si +vous souhaitez uniquement installer un nouveau paquet de noyau sur +nfsroot, ajoutez les options -k ou -K à fai-make-nfsroot. Cela ne +recréera pas votre nfsroot, mais mettra à jour seulement vos noyaux et les +modules du noyau dans le nfsroot ou ajoutera des paquets supplémentaires +dans le nfsroot.

-

Creating a FAI CD or and USB stick

-

You can easily create an installation CD (or USB stick) of your -network installation setup. This will perform the same installation -and configuration from CD without the need of the install server. -Therefore you need to create a partial mirror of all Debian packages -needed for your FAI classes (using fai-mirror(1)). Then the command -fai-cd(8) will put this mirror, the nfsroot and the config space -onto a bootable CD. That’s it!

-

To easily create the installation CD, you can use the following command -(for more tuning details see fai-cd(8)):

+

Création d’un CD ou d’une clé USB FAI

+

Vous pouvez facilement créer un CD d’installation (ou une clé USB) de +votre installation réseau. Cela permettra d’effectuer la même +installation et la même configuration à partir du CD sans avoir besoin +du serveur d’installation. Par conséquent, vous devez créer un miroir +partiel de tous les paquets Debian nécessaires à vos classes FAI (à +l’aide de fai-mirror(1)). Ensuite, la commande fai-cd(8) écrira +ce miroir, le nfsroot et l’espace de configuration sur un CD amorçable. +Et voilà !

+

Pour créer facilement le CD d’installation, on peut utiliser la commande suivante +(Pour plus de détails de configuration voir fai-cd(8)) :

 faiserver# fai-cd -m <partialMirrorDir> fai-cd.iso
-

This installation CD contains all data needed for the -installation. The command fai-cd(8) puts the nfsroot, the -configuration space and a subset of the Debian mirror onto a -CD-ROM. A partial package mirror is created using the command -fai-mirror(1) which contains all packages that are used by the -classes used in your configuration space. A sample ISO image is -available at https://fai-project.org/fai-cd.

-

Using the command dd(1) you can also create a bootable USB -stick by just writing the content of the ISO file to your USB stick -(here the stick is /dev/sdf).

+

Ce CD d’installation contient toutes les données nécessaires à +l’installation. La commande fai-cd(8) écrit le nfsroot, l’espace de +configuration et un sous-ensemble du miroir Debian sur un CD-ROM. Un +miroir de paquets partiel est créé à l’aide de la commande +fai-mirror(1) qui contient tous les paquetages utilisés par les +classes utilisées dans votre espace de configuration. Un échantillon +d’image ISO est disponible à l’adresse https://fai-project.org/fai-cd.

+

Avec la commande dd(1), vous pouvez également créer une clé USB +amorçable en écrivant simplement le contenu du fichier ISO sur votre clé +USB (ici la clé est /dev/sdf).

 faiserver# dd if=fai-cd.iso of=/dev/sdf bs=1M
-

mk-data-partition is a tool that extends an ISO (that will be copied -to an USB stick) or an USB stick containing an ISO with -an ext4 or exFAT partition and sets the file system label to MY-DATA. -This partition is automatically mounted to /media/data by FAI. -You can copy your own .deb packages into this data partition und the -subdiretories pkgs/<CLASSNAME>. FAI will then install these packages -if the equivalent class is defined.

-

Example how to use mk-data-partition:

+

mk-data-partition est un outil qui étend une image ISO (qui sera copiée +sur une clé USB) ou une clé USB contenant une image ISO avec +une partition ext4 ou exFAT et y place le label MY-DATA. +Cette partition est automatiquement montée dans /media/data par FAI. +On peut copier ses propres paquets .deb dans cette partition de données sous les +sous-répertoires pkgs/<CLASSNAME>. FAI installera alors ces paquets +si la classe équivalente est définie.

+

exemple d’usage de mk-data-partition:

# mk-data-partition -s 1G -c faicd-large.iso A B
-

The former command creates the data partition of size 1 Gbytes inside -the ISO file and copy directories A and B to it. You can then copy the modified ISO -onto an USB stick.

-

If the ISO is already on the USB stick and if it’s available as -dev/sdf, you can add a data partition of type exFAT will will use -the whole remaining part of the USB stick by using this command:

+

La commande ci-desus crée la partition de données avec une taille de 1 Go dans +le fichier ISO et y copie les répertoires A et B. On peut écrire l’image ISO modifiée +sur une clé USB.

+

Si l’image ISO est déjà sur la clé USB, qui est disponible sous +dev/sdf, on peut ajouter la partition de données de type exFAT qui utilisera +tout l’espace disponible de la clé USB en utilisant cette commande + :

# mk-data-partition -F /dev/sdf
@@ -4402,7 +4417,7 @@

Boot errors

diff --git a/doc/fai-guide_fr.txt b/doc/fai-guide_fr.txt index 1d6a606cf..5be96f75b 100644 --- a/doc/fai-guide_fr.txt +++ b/doc/fai-guide_fr.txt @@ -1466,168 +1466,173 @@ Utilisé par `setup-storage(8)`. Les partitions marquées avec définie. Souvent, cette option est définie dans un fichier 'class/*.var' en utilisant le paramètre 'flag_initial=1'. -== [[install]] FAI installs your plan +== [[install]] FAI installe votre planification -=== The early part of an installation +=== La première phase d’une installation -After the kernel has booted, it mounts the root file system via NFS -from the install server and starts the script -'/usr/sbin/fai' footnote:[Since the root file system on the clients is mounted via -NFS, `fai` is located in -'/srv/fai/nfsroot/usr/sbin' on the install -server.]. This script controls the sequence of the -installation. No other scripts in '/etc/init.d/' are used. +Après le démarrage du noyau, on monte le système de fichiers racine via +NFS à partir du serveur d’installation et on démarre le script +'/usr/sbin/fai' footnote:[Comme le système de fichiers racine des clients +est monté via NFS, `fai` se situe dans '/srv/fai/nfsroot/usr/sbin' sur le +serveur d'installation.]. Ce script contrôle la séquence de +l’installation. Aucun autre script dans '/etc/init.d/' n’est utilisé. -The configuration space is made available via the configured method -(an NFS mount by default) from the install server to the path defined -in '$FAI' footnote:['$FAI' is an internal variable used by the FAI -scripts. By default the path is _/var/lib/fai/config_.] +L’espace de configuration est rendu disponible via la méthode configurée +(un montage NFS par défaut) depuis le serveur d’installation vers le chemin défini +dans '$FAI' footnote:['$FAI' est une variable interne utilisée par les scripts FAI. +Le chemin par défaut est _/var/lib/fai/config_.] -=== [[bootmesg]]Boot messages +=== [[bootmesg]]Messages de démarrage -When booting the install client from network card with PXE you will see some -messages like this: +Lorsqu'on démarre le client d’installation à partir de la carte +réseau avec PXE, on voit des messages comme ceci : include::includes/bootexample.txt[] -At this point the install client has successfully received the network -config via DHCP and the kernel and initrd via TFTP. It now boots the -Linux kernel and the initrd. If everything went right, the initrd -mounts the nfsroot footnote:['/srv/fai/nfsroot' from the install -server via NFS] and the FAI scripts are started. The first -thing you see is the red FAI copyright message. +À ce stade, le client d’installation a réussi à recevoir la configuration +réseau via DHCP, le noyau et le fichier initrd via TFTP. Il démarre maintenant Le +noyau Linux et met en place initrd. Si tout se passe bien, l’initrd monte +le nfsroot footnote:['/srv/fai/nfsroot' depuis le serveur d'installation via NFS] +et les scripts FAI sont lancés. La première +chose qu'on voit est le message de copyright en rouge de FAI. include::includes/fai-1st-part.txt[] -You can also see the list of FAI classes, that are defined for this -host. This list is very important for the rest of the installation. +On peut également voir la liste des classes FAI, qui sont définies +pour cet hôte. Cette liste est très importante pour le reste de l’installation. -The first task is called _confdir_, which is responsible for getting -access to the config space. Here, we use an NFS mount from the install -server as you can see on the console (and later in the logs). +La première tâche est appelée _confdir_, qui est chargée de accès à +l’espace de configuration. Ici, on utilise un montage NFS depuis +le serveur d'installation comme on peut le voir sur la console (et plus tard +dans les journaux). ---- FAI_CONFIG_SRC is set to nfs://faiserver/srv/fai/config Configuration space faiserver:/srv/fai/config mounted to /var/lib/fai/config ---- -Before the installation is started (+$FAI_ACTION=install+) the computer -beeps three times. So, be careful when you hear three beeps but you do -not want to perform an installation and let FAI erase all yout data on -the local disk! +Avant de lancer l’installation (+$FAI_ACTION=install+), l’ordinateur +émet trois bips. Donc, faites attention quand vous entendez trois bips +et que vous ne voulez pas effectuer une installation, ni laisser FAI +effacer toutes vos données sur Le disque local ! -=== [[reboot]]Rebooting the computer into the new system +=== [[reboot]]Redémarrage de l’ordinateur dans le nouveau système -For rebooting the computer during or at the end of the installation you -should use the command `faireboot` in favour of the normal reboot command. -Use `faireboot` also if logged in from remote. If the installation -hasn't finished, use _faireboot -s_, so the log files are also copied -to the install server. +Pour redémarrer l’ordinateur pendant ou à la fin de l’installation, vous +devez utiliser la commande `faireboot` de préférence à la commande de +redémarrage normal. Utilisez aussi `faireboot` si vous êtes connecté +à distance. Si l’installation n’est pas terminée, utilisez +_faireboot -s_, afin que les fichiers journaux soient aussi copiés sur le +serveur d’installation. -If the installation has finished successfully, the computer should boot a -small Debian system. You can login as user _demo_ or _root_ with password _fai_. +Si l’installation s'est bien terminée, l’ordinateur doit démarrer un petit +système Debian. Vous pouvez vous connecter en tant qu'utilisateur _demo_ ou _root_ +avec le mot de passe _fai_. -=== [[isetup]]Starting FAI (task confdir) +=== [[isetup]]Démarrage de FAI (tâche confdir) -After the install client has booted only the script '/usr/sbin/fai' is -executed. It will do some minimal initialization. The variable -+$FAI_CONFIG_SRC+ footnote:[It is defined on the kernel command line] -is used to get access to the FAI configuration space which is then -available in the directory +$FAI+ footnote:[/var/lib/fai/config]. FAI -will not proceed without the config space. +Une fois le client d’installation démarré, seul le script +'/usr/sbin/fai' est exécuté. Il effectuera une initialisation minimale. +La variable +$FAI_CONFIG_SRC+ footnote:[Celle-ci est définie dans la ligne de commande du noyau] +est utilisée pour accéder à l’espace de configuration FAI qui est alors +disponible dans le répertoire +$FAI+ footnote:[/var/lib/fai/config]. +FAI ne se fonctionnera pas sans l’espace de configuration. -You can access the config space using different methods. Supported -methods are: nfs:, file:, cvs:, svn: git:, hg:, http: and detect:. -See `fai.conf(5)` for a detailed description of these methods. +On peut accéder à l'espace de configuration à l'aide de diverses méthodes. Les +méthodes supportées sont : nfs:, file:, cvs:, svn: git:, hg:, http: et detect:. +Voir `fai.conf(5)` pour une description détaillée de ces méthodes. -=== [[iclass]]Defining classes and variables (tasks defclass and defvar) +=== [[iclass]]Définition de classes et de variables (tâches defclass et defvar) -The command `fai-class(1)` executes scripts in '$FAI/class' for defining -classes. If the scripts write a string to stdout, this will be defined -as a class. Read all the details in the man page of `fai-class(1)`. +La commande `fai-class(1)` exécute des scripts dans '$FAI/class' pour +définir des classes. Si les scripts écrivent une chaîne dans stdout, cela +sera défini comme une classe. Lisez tous les détails dans la page de +manuel de `fai-class(1)`. -After defining the classes, every file matching _.var_ with a prefix -which matches a defined class is sourced to define variables. It must -contain valid shell code. +Après avoir défini les classes, chaque fichier correspondant à _.var_ +avec un préfixe qui correspond à une classe définie est pris en compte pour +définir des variables. Il doit contenir du code shell valide. -=== [[ipartition]]Partitioning local disks, creating file systems (task partition) +=== [[ipartition]]Partitionnement des disques locaux, création des systèmes de fichiers (tâche partition) -For the disk partitioning exactly one disk configuration file from -'$FAI/disk_config' is selected using classes. +Pour le partitionnement du disque, un fichier de configuration de disque +de '$FAI/disk_config' est sélectionné à l’aide de classes, et un seul. -The format of the disk configuration is similar to a fstab file. +Le format de la configuration du disque est similaire à un fichier fstab. -The partitioning tool `setup-storage(8)` performs all commands -necessary for creating the disk partition layout, software RAID, LVM -and for creating the file systems. Disks and partitions may easily be -referenced by disk1.1, disk2.4 etc. Read the manual page of -`setup-storage(8)` for a detailed description and some examples of the -format. +L’outil de partitionnement `setup-storage(8)` exécute toutes les +commandes nécessaires pour créer l'organisation des partitions du +disque, du RAID logiciel, du LVM et pour créer les systèmes de +fichiers. Lisez la page de manuel de `setup-storage(8)` pour une +description détaillée et quelques exemples du format. -=== [[ipreseed]]Debconf preseeding (task debconf) -Files in '$FAI/debconf' are used for the usual `debconf(7)` preseeding -if the file names match a class name. +=== [[ipreseed]]Pré-ensemencement Debconf (tâche debconf) +Les fichiers dans '$FAI/debconf' sont utilisés par le système de pré-ensemencement +habituel de `debconf(7)` si les noms de fichier correspondent à un +nom de classe. -=== [[ipackages]]Installing software packages (task instsoft) +=== [[ipackages]]Installation de paquets logiciels (tâche instsoft) -The command `install_packages(8)` reads the config files from -'$FAI/package_config' in a class based manner and installs software -packages on the new file system. +La commande `install_packages(8)` lit les fichiers de configuration à +partir de '$FAI/package_config' d'une façon basée sur la classe et installe des paquets +logiciels sur le nouveau système de fichiers. -It installs the packages using `apt-get(8)`, `aptitude(1)`, `yum` or other -package tools without any manual interaction needed. Package -dependecies are also resolved by the package tools. +Elle installe les paquets en utilisant `apt-get(8)`, `aptitude(1)`, +`yum` ou d’autres gestionnaires de paquets sans besoin d'aucune interaction manuelle. +Les dépendances des paquets sont également résolues par les gestionnaires de paquets. -The format of the configuration files is described in <>. +Le format des fichiers de configuration est décrit dans <>. -Additionaly FAI will install packages ('.deb' or .rpm') from the -directories '$FAI/pkgs/'. +De plus, FAI installera les paquets ('.deb' or .rpm') depuis les +répertoires '$FAI/pkgs/'. -=== [[icscripts]]Site specific customization (task configure) +=== [[icscripts]]Personnalisation spécifique au site (tâche configure) -Often the default configurations of the software packages will not -meet your site-specific needs. You can call arbitrary scripts which -adjust the system configuration. Therefore the command -`fai-do-scripts(1)` executes scripts in '$FAI/scripts' in a class -based manner. It is possible to have several scripts of different -types (shell, cfengine, ...) to be executed for one class. +Souvent, les configurations par défaut des paquets logiciels ne répondent pas à +vos besoins spécifiques au site. Vous pouvez appeler des scripts +arbitraires qui ajustent la configuration du système. Par conséquent, la +commande `fai-do-scripts(1)` exécute des scripts dans '$FAI/scripts' +d’une manière basée sur la classe. Il est possible d’avoir plusieurs +scripts de différents types (shell, cfengine, …) à exécuter pour une classe. -The default set of scripts in '$FAI/scripts' include examples for -installing Debian and Rocky Linux machines. They set the root password, add -a user account (set by '$username, default to demo), set the timezone, configure the network for DHCP -or using a fixed IP address, setup grub and more. -They should do a reasonable job for your installation. You can edit -them or add new scripts to match your local needs. +L’ensemble de scripts par défaut dans '$FAI/scripts' inclut des exemples +d’installation de machines Debian et Rocky Linux. Ils définissent le mot de +passe root, ajoutent un compte utilisateur (défini par '$username', avec demo par défaut), +paramètrent le fuseau horaire, configurent le réseau avec DHCP ou en utilisant une adresse IP +fixe, configurent grub et plus encore. Ils devraient faire un +travail raisonnable pour votre installation. Vous pouvez les modifier ou +ajouter de nouveaux scripts pour répondre à vos besoins locaux. -More information about these scripts are described in <>. +Plus d’information sur ces scripts est disponible dans <>. -=== [[isavelog]]Saving log files (task savelog) +=== [[isavelog]]Enregistrement des fichiers journaux (tâche savelog) -When all tasks are finished, the log files are written to +Lorsque toutes les tâches sont terminées, les fichiers journaux sont écrits dans _/var/log/fai/$HOSTNAME/install/_ -footnote:['/var/log/fai/localhost/install/' is a link to this -directory.] on the new system and to the account on the install server -if +$LOGUSER+ is defined (you have to enable this in -'/srv/fai/config/class/FAIBASE.var'). It is also possible to specify -another host as log saving destination through the variable -+$LOGSERVER+. If +$LOGSERVER+ is not defined, FAI uses the variable -+$SERVER+ which is only defined during an initial installation (by -get-boot-info). - -Additionally, two symlinks will be created to indicated the last -directory written to. The symlink 'last' points to the log directory -of the last FAI action performed. The symlinks 'last-install' and -'last-sysinfo' point to the directory of the last corresponding -action. By default log files will be copied to the log -server using scp. You can use the variable +$FAI_LOGPROTO+ in file -'fai.conf(5)' to choose another method for saving logs to the remote -server. Here's an example of the symlink structure: +footnote:['/var/log/fai/localhost/install/' est un lien vers ce répertoire.] +sur le nouveau système, et sur le compte sur le serveur d’installation si ++$LOGUSER+ est défini (il faut l'activer dans '/srv/fai/config/class/FAIBASE.var'). +Il est également possible de spécifier un autre hôte comme destination pour cet enregistrement +à l'aide de la variable ++$LOGSERVER+. Si +$LOGSERVER+ n’est pas défini, FAI utilise la +variable +$SERVER+ qui n’est définie que lors d’une installation +initiale (par get-boot-info). + +De plus, deux liens symboliques seront créés pour indiquer le dernier +répertoire où on a écrit. Le lien symbolique 'last' pointe vers le répertoire +journal de la dernière action FAI exécutée. Les liens symboliques +'last-install' et 'last-sysinfo' pointent vers le répertoire avec la +dernière action correspondante. Par défaut, les fichiers journaux seront +copiés sur le serveur de journalisation à l’aide de scp. Vous pouvez utiliser +la variable +$FAI_LOGPROTO+ dans le fichier 'fai.conf(5)' pour choisir +une autre méthode d’enregistrement des journaux sur le serveur distant. +Voici un exemple de structure de lien symbolique : ---- lrwxrwxrwx 1 fai fai 23 Dec 2 2013 last-sysinfo -> sysinfo-20131202_161237 @@ -1639,119 +1644,122 @@ lrwxrwxrwx 1 fai fai 23 Dec 4 13:22 last -> install-20141204_131351 drwxr-xr-x 2 fai fai 4096 Dec 4 13:22 install-20141204_131351 ---- -Examples of the log files can be found at https://fai-project.org/logs. +Vous trouverez des exemples de fichiers journaux à l’adresse https://fai-project.org/logs. -=== [[ireboot]]Reboot the new installed system +=== [[ireboot]]Redémarrage du nouveau système installé -Before rebooting, the install client calls `fai-chboot -d ` -on the install server, to disable its own PXELINUX -configuration. Otherwise, it would restart the installation during the -next boot. Normally this should boot the new installed system from -its second boot device, the local hard disk. +Avant de redémarrer, le client d’installation appelle +`fai-chboot -d ` sur le serveur d’installation, pour +désactiver sa propre configuration PXELINUX. Sinon, il redémarrerait +l’installation lors de la prochaine initialisation. Normalement, cela +devrait démarrer le nouveau système installé à partir de son second +périphérique d’amorçage, le disque dur local. -At the end, the system is automatically rebooted if "reboot" was added to -+$FAI_FLAGS+. +À la fin, le système est automatiquement redémarré si "reboot" a été +ajouté à +$FAI_FLAGS+. -== [[advanced]]Advanced FAI topics +== [[advanced]]Sujets avancés pour FAI -=== [[checkbootp]]Checking parameters received from DHCP servers +=== [[checkbootp]]Vérification des paramètres reçus des serveurs DHCP -If the install client boots you can check -if all information from the DHCP daemon are received -correctly. The received information is written to -'/tmp/fai/boot.log'. An example of the result of a DHCP request can be -found in the sample log files. +Si le client d’installation démarre, vous pouvez vérifier si toutes les +informations provenant du démon DHCP sont correctement reçues. Les +informations reçues sont écrites dans '/tmp/fai/boot.log'. Un exemple de +résultat d’une requête DHCP peut être trouvé dans les fichiers journaux +d’exemple. -=== [[fai-monitor]]Monitoring multiple client installations +=== [[fai-monitor]]Surveillance de plusieurs clients d'installation -You can monitor the installation of all install clients with the -command `fai-monitor(8)`. All clients check if this daemon is running -on the install server (or the machine defined by the variable -+$monserver+). Each time a task starts or ends, a message is sent. The -FAI monitor daemon prints this messages to standard output. There's -also a graphical frontend available, called `fai-monitor-gui(1)`. +Vous pouvez surveiller l’installation de tous les clients d’installation +avec la commande `fai-monitor(8)`. Tous les clients vérifient si ce +démon est en cours d’exécution sur le serveur d’installation (ou sur +l’ordinateur défini par la variable +$monserver+). Chaque fois qu’une +tâche démarre ou se termine, un message est envoyé. Le démon du moniteur +FAI envoie ces messages dans sa sortie standard. On peut aussi utiliser une interface +graphique, appelée `fai-monitor-gui(1)`. ---- $ fai-monitor | fai-monitor-gui - & ---- -=== [[mac]]Collecting Ethernet addresses for multiple hosts +=== [[mac]]Collecte d’adresses Ethernet pour plusieurs hôtes -You have to collect all Ethernet (MAC) addresses of the install -clients and assign a host name and IP address to each client. To -collect the MAC addresses, boot your install clients. -You can already do this before any DHCP daemon is running in your -subnet. They will fail to boot (because of the missing DHCP or missing TFTP), -but you can still collect the MAC addresses. +Vous devez collecter toutes les adresses Ethernet (MAC) des clients +d’installation et affecter un nom d’hôte et une adresse IP à chaque +client. Pour collecter les adresses MAC, démarrez vos clients +d’installation. Vous pouvez déjà le faire avant que n’importe quel démon +DHCP s’exécute dans votre sous-réseau. Ils échoueront à démarrer (en +raison de l'absence de DHCP ou de TFTP), mais vous pouvez toujours +collecter les adresses MAC. -While the install clients are booting, they send broadcast packets to the -LAN. You can log the MAC addresses of these hosts by running the -following command simultaneously on the server: +Pendant que les clients d’installation démarrent, ils envoient des +paquets de diffusion (broadcast) au LAN. Vous pouvez enregistrer les adresses MAC de +ces hôtes en exécutant simultanément la commande suivante sur le serveur : ---- faiserver# tcpdump -qtel broadcast and port bootpc >/tmp/mac.list ---- -After the hosts have been sent some broadcast packets abort `tcpdump` -by typing _ctrl-c_. You get a list of all -unique MAC addresses with these commands: +Une fois que les hôtes ont envoyés quelques paquets de diffusion, arrêtez `tcpdump` +en tapant _ctrl-c_. Vous obtenez une liste de toutes les adresses MAC uniques avec ces commandes : ---- faiserver$ perl -ane 'print "\U$F[0]\n"' /tmp/mac.list|sort|uniq ---- -After that, you only have to assign these MAC addresses to host names -and IP addresses ('/etc/ethers' and '/etc/hosts' or corresponding NIS -maps). With this information you can configure your `DHCP` -daemon (see the section <>). footnote:[I recommend to write the MAC -addresses (last three bytes will suffice if you have network cards -from the same vendor) and the host name in the front of each chassis.] +Après cela, vous n’avez qu'à assigner ces adresses MAC aux noms d’hôte +et aux adresses IP ('/etc/ethers' et '/etc/hosts' ou aux associations NIS +correspondantes). Avec ces informations, vous pouvez configurer votre +démon DHCP (voir la section <>). footnote:[Je recommande d'inscrire +l'adresse MAC (les trois derniers octets devraient suffire si vous avez des cartes du +même vendeur) et le nom d'hôte devant chaque boîtier.] -==== Debugging the network traffic +==== Débogage du trafic réseau -If the client can't successfully boot from the network card, use -`tcpdump(8)` to look for Ethernet packets between the install server -and the client. Search also for entries in several log files made by -`tftpd(8)` and `dhcpd(8)` : +Si le client ne peut démarrer correctement à partir de la carte réseau, +utilisez `tcpdump(8)` pour rechercher des paquets Ethernet entre le +serveur d’installation et le client. Recherchez également dans les entrées de +plusieurs fichiers journaux venant de `tftpd(8)` et `dhcpd(8)` : ---- faiserver$ egrep "tftpd|dhcpd" /var/log/* ---- -=== [[pxeboot]]Details of PXE booting +=== [[pxeboot]]Détails du démarrage PXE -Here we describe the details of PXE booting, which are only needed if -you have problems when booting your install clients. +Ici, nous décrivons les détails du démarrage PXE, qui sont +nécessaires seulement si vous avez des problèmes lors du démarrage de vos +clients d’installation. -Almost all modern bootable network cards support the PXE boot environment. -PXE is the Preboot Execution Environment. -This requires the PXELINUX bootloader and a special version of the _TFTP_ -daemon, which is available in the Debian packages +pxelinux+ and -+tftpd-hpa+. PXE booting also needs a DHCP server, so that the network -card can configure its IP parameters. This is the sequence of a PXE boot: +Presque toutes les cartes réseau modernes prennent en charge +l’environnement de démarrage PXE. PXE est l’environnement d’exécution de +pré-lancement. Cela nécessite le chargeur de démarrage PXELINUX et une +version spéciale du démon _TFTP_, disponibles dans les paquets Debian ++pxelinux+ et +tftpd-hpa+. Le démarrage PXE nécessite également un +serveur DHCP, afin que la carte réseau puisse configurer ses paramètres +IP. Voici la séquence d’une amorce PXE : -* Network card of the client sends its MAC address -* DHCP server replies with IP configuration for the client -* Network card configures IP -* Install client gets the pxelinux.0 binary via TFTP -* Get the pxelinux.cfg/C0A8210C configuration file via TFTP -* C0A8210C is the IP address of the client in hexadecimal -* This configuration contains kernel, initrd and additional kernel -command line parameters, which was created by `fai-chboot`. -* Get the kernel and initrd via TFTP. +* La carte réseau du client envoie son adresse MAC +* Le serveur DHCP répond par la configuration IP du client +* La carte réseau configure son IP +* Le client d’installation obtient le binaire pxelinux.0 via TFTP +* Il obtient le fichier de configuration pxelinux.cfg/C0A8210C via TFTP +* C0A8210C est l’adresse IP du client en hexadécimal +* Cette configuration contient le noyau, le fichier initrd et les paramètres de ligne de commande supplémentaires du noyau, qui ont été créés par `fai-chboot`. +* Il obtient le noyau et le fichier initrd via TFTP. -Example of a pxelinux.cfg file: +Exemple d'un fichier pxelinux.cfg : ---- default fai-generated @@ -1760,126 +1768,133 @@ kernel vmlinuz-6.1.0-17-amd64 append initrd=initrd.img-6.1.0-17-amd64 ip=dhcp root=/srv/fai/nfsroot rootovl FAI_FLAGS=verbose,sshd,createvt FAI_CONFIG_SRC=nfs://faiserver/srv/fai/config FAI_ACTION=install ---- -See '/usr/share/doc/syslinux/pxelinux.doc' for more detailed -information about PXELINUX. FAI uses the lpxelinux.0 binary which also -supports loading the kernel and initrd via FTP or HTTP. The command -'fai-chboot(8)' supports this with the option '-U'. +Voir '/usr/share/doc/syslinux/pxelinux.doc' pour des informations plus +détaillées sur PXELINUX. FAI utilise le fichier binaire lpxelinux.0 qui +s'occupe du chargement du noyau et du fichier initrd via FTP +ou HTTP. La commande `fai-chboot(8)` prend cela en charge avec +l’option '-U'. -=== [[Customizing your install server setup]]Customizing your install server setup +=== [[Customizing your install server setup]]Personnaliser la configuration de son serveur d’installation -- local/faster package mirror -- different loguser -- local root pw inside nfsroot +- Miroir de paquets logiciels local/plus rapide +- Loguser différent +- Mot de passe root local dans nfsroot -The configuration for the FAI package (not the configuration data for -the install clients) is defined in 'fai.conf(5)'. Definitions that are -only used for creating the nfsroot are located in -'nfsroot.conf(5)'. Check these important variables in 'nfsroot.conf' -before calling 'fai-setup' or 'fai-make-nfsroot'. +La configuration du paquet FAI (et non les données de configuration pour +les clients d’installation) est définie dans 'fai.conf(5)'. Les +définitions qui sont utilisées uniquement pour créer le nfsroot sont +situées dans 'nfsroot.conf(5)'. Vérifiez ces variables importantes dans +'nfsroot.conf' avant d’appeler 'fai-setup' ou 'fai-make-nfsroot'. FAI_DEBOOTSTRAP:: -Building the nfsroot uses the command `debootstrap(8)`. It needs the location of a Debian mirror and the -name of the distribution (like bullsseye, bookworm, sid) for which the basic Debian -system should be built. Do not use different distributions here and in -'/etc/fai/apt/sources.list'. This will create a broken nfsroot. +La construction du nfsroot utilise la commande `debootstrap(8)`. Elle +a besoin de l’emplacement d’un miroir Debian et du nom de la +distribution (comme bullsseye, bookworm, sid) pour laquelle le système +Debian de base devrait être construit. N’utilisez pas de distributions +différentes ici et dans '/etc/fai/apt/sources.list'. Cela créerait un +nfsroot dysfonctionnel. NFSROOT_ETC_HOSTS:: -This variable is only needed if the clients do not have access to a DNS server. -This multiline variable is added to /etc/hosts inside the -nfsroot. Then the install clients can access those hosts by name -without using DNS. +Cette variable est nécessaire seulement si les clients n’ont pas accès à +un serveur DNS. Cette variable multiligne est ajoutée à /etc/hosts +dans le nfsroot. Ensuite, les clients d’installation peuvent accéder à +ces hôtes par leur nom sans utiliser DNS. -The content of '/etc/fai/apt/sources.list' is -used by the install server and also by the clients. If your install -server has multiple network cards and different host names for each -card (as for a Beowulf server), use the install server name which is -known by the install clients. +Le contenu de '/etc/fai/apt/sources.list' est utilisé par le serveur +d’installation et aussi par les clients. Si votre serveur d’installation a +plusieurs cartes réseau et différents noms d’hôte pour chaque carte +(comme pour un serveur Beowulf), utilisez le nom du serveur +d’installation qui est connu des clients d’installation. -If you have problems running `fai-setup`, they usually stem from -`fai-make-nfsroot(8)` which is called by former command. Adding '-v' -gives you a more verbose output which helps you pinpoint the -error. The output is written to -'/var/log/fai/fai-make-nfsroot.log'. footnote:[For debugging purpose -it may help to enter the chroot environment manually using this -command. 'faiserver# chroot /srv/fai/nfsroot bash'] +Si vous avez des problèmes lors de l’exécution de `fai-setup`, ils +proviennent habituellement de `fai-make-nfsroot(8)` qui est appelé par +la commande précédente. L’ajout de '-v' vous donne une sortie plus +détaillée qui vous aide à repérer l’erreur. La sortie est écrite dans +'/var/log/fai/fai-make-nfsroot.log'. footnote:[À des fins de débogage, +il peut être utile d'entrer dans l'environnement chroot à la main à l'aide +de cette commande : 'faiserver# chroot /srv/fai/nfsroot bash'] -The setup also creates the account _fai_ (defined by +$LOGUSER+) if -not already available. So you can add a user before calling -`fai-setup(8)` using the command `adduser(8)` and use this as your -local account for saving log files. The log files of all install -clients are saved to the home directory of this account. You should -change the primary group of this -account, so this account has write permissions to '/srv/tftp/fai' in -order to call fai-chboot for creating the PXE configuration for the hosts. +L’installation crée également le compte _fai_ (défini par +$LOGUSER+) +s’il n’est pas déjà disponible. Vous pouvez donc ajouter un utilisateur +avant d’appeler `fai-setup(8)` à l’aide de la commande `adduser(8)` +et l'utiliser comme compte local pour enregistrer des fichiers journaux. Les +fichiers journaux de tous les clients d’installation sont enregistrés +dans le répertoire de personnel de ce compte. Vous devriez changer le groupe +principal de ce compte, afin que ce compte ait des droits d'écriture sur +'/srv/tftp/fai' afin d'appeler fai-chboot pour créer la configuration PXE +pour les hôtes. -When you make changes to 'fai.conf', 'nfsroot.conf' the -nfsroot has to be rebuilt by calling `fai-make-nfsroot(8)`. If you -only like to install a new kernel package to the nfsroot add the flags _-k_ or -_-K_ to +fai-make-nfsroot+. This will not recreate your nfsroot, but -only updates your kernel and kernel modules inside the nfsroot or add -additional packages into the nfsroot. +Lorsque vous apportez des modifications à 'fai.conf', 'nfsroot.conf', le +nfsroot doit être reconstruit en appelant `fai-make-nfsroot(8)`. Si +vous souhaitez uniquement installer un nouveau paquet de noyau sur +nfsroot, ajoutez les options _-k_ ou _-K_ à +fai-make-nfsroot+. Cela ne +recréera pas votre nfsroot, mais mettra à jour seulement vos noyaux et les +modules du noyau dans le nfsroot ou ajoutera des paquets supplémentaires +dans le nfsroot. -=== [[cdboot]]Creating a FAI CD or and USB stick +=== [[cdboot]]Création d’un CD ou d’une clé USB FAI -You can easily create an installation CD (or USB stick) of your -network installation setup. This will perform the same installation -and configuration from CD without the need of the install server. -Therefore you need to create a partial mirror of all Debian packages -needed for your FAI classes (using `fai-mirror(1)`). Then the command -`fai-cd(8)` will put this mirror, the nfsroot and the config space -onto a bootable CD. That's it! +Vous pouvez facilement créer un CD d’installation (ou une clé USB) de +votre installation réseau. Cela permettra d’effectuer la même +installation et la même configuration à partir du CD sans avoir besoin +du serveur d’installation. Par conséquent, vous devez créer un miroir +partiel de tous les paquets Debian nécessaires à vos classes FAI (à +l’aide de `fai-mirror(1)`). Ensuite, la commande `fai-cd(8)` écrira +ce miroir, le nfsroot et l’espace de configuration sur un CD amorçable. +Et voilà ! -To easily create the installation CD, you can use the following command -(for more tuning details see `fai-cd(8)`): +Pour créer facilement le CD d'installation, on peut utiliser la commande suivante +(Pour plus de détails de configuration voir `fai-cd(8)`) : ---- faiserver# fai-cd -m fai-cd.iso ---- -This installation CD contains all data needed for the -installation. The command `fai-cd(8)` puts the nfsroot, the -configuration space and a subset of the Debian mirror onto a -CD-ROM. A partial package mirror is created using the command -`fai-mirror(1)` which contains all packages that are used by the -classes used in your configuration space. A sample ISO image is -available at https://fai-project.org/fai-cd. +Ce CD d’installation contient toutes les données nécessaires à +l’installation. La commande `fai-cd(8)` écrit le nfsroot, l’espace de +configuration et un sous-ensemble du miroir Debian sur un CD-ROM. Un +miroir de paquets partiel est créé à l’aide de la commande +`fai-mirror(1)` qui contient tous les paquetages utilisés par les +classes utilisées dans votre espace de configuration. Un échantillon +d’image ISO est disponible à l’adresse https://fai-project.org/fai-cd. -Using the command `dd(1)` you can also create a bootable USB -stick by just writing the content of the ISO file to your USB stick -(here the stick is _/dev/sdf_). +Avec la commande `dd(1)`, vous pouvez également créer une clé USB +amorçable en écrivant simplement le contenu du fichier ISO sur votre clé +USB (ici la clé est _/dev/sdf_). ---- faiserver# dd if=fai-cd.iso of=/dev/sdf bs=1M ---- -`mk-data-partition` is a tool that extends an ISO (that will be copied -to an USB stick) or an USB stick containing an ISO with -an ext4 or exFAT partition and sets the file system label to MY-DATA. -This partition is automatically mounted to '/media/data' by FAI. -You can copy your own _.deb_ packages into this data partition und the -subdiretories 'pkgs/'. FAI will then install these packages -if the equivalent class is defined. +`mk-data-partition` est un outil qui étend une image ISO (qui sera copiée +sur une clé USB) ou une clé USB contenant une image ISO avec +une partition ext4 ou exFAT et y place le label MY-DATA. +Cette partition est automatiquement montée dans '/media/data' par FAI. +On peut copier ses propres paquets _.deb_ dans cette partition de données sous les +sous-répertoires 'pkgs/'. FAI installera alors ces paquets +si la classe équivalente est définie. -Example how to use `mk-data-partition`: +exemple d'usage de `mk-data-partition`: ---- # mk-data-partition -s 1G -c faicd-large.iso A B ---- -The former command creates the data partition of size 1 Gbytes inside -the ISO file and copy directories A and B to it. You can then copy the modified ISO -onto an USB stick. +La commande ci-desus crée la partition de données avec une taille de 1 Go dans +le fichier ISO et y copie les répertoires A et B. On peut écrire l'image ISO modifiée +sur une clé USB. -If the ISO is already on the USB stick and if it's available as -_dev/sdf_, you can add a data partition of type exFAT will will use -the whole remaining part of the USB stick by using this command: +Si l'image ISO est déjà sur la clé USB, qui est disponible sous +_dev/sdf_, on peut ajouter la partition de données de type exFAT qui utilisera +tout l'espace disponible de la clé USB en utilisant cette commande + : ---- # mk-data-partition -F /dev/sdf ---- diff --git a/doc/po/fr.po b/doc/po/fr.po index e163e4d86..eb19afbda 100644 --- a/doc/po/fr.po +++ b/doc/po/fr.po @@ -4,7 +4,7 @@ msgstr "" "Project-Id-Version: FAI-GUIDE version 6.4\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-10-23 11:06+0200\n" -"PO-Revision-Date: 2025-10-24 09:15+0200\n" +"PO-Revision-Date: 2025-10-24 12:19+0200\n" "Last-Translator: Georges Khaznadar \n" "MIME-Version: 1.0\n" @@ -3260,11 +3260,11 @@ msgstr "" #: fai-guide.txt:1376 msgid "== [[install]] FAI installs your plan" -msgstr "" +msgstr "== [[install]] FAI installe votre planification" #: fai-guide.txt:1378 msgid "=== The early part of an installation" -msgstr "" +msgstr "=== La première phase d’une installation" #: fai-guide.txt:1386 msgid "" @@ -3277,6 +3277,12 @@ msgid "" "server.]. This script controls the sequence of the\n" "installation. No other scripts in '/etc/init.d/' are used." msgstr "" +"Après le démarrage du noyau, on monte le système de fichiers racine via\n" +"NFS à partir du serveur d’installation et on démarre le script\n" +"'/usr/sbin/fai' footnote:[Comme le système de fichiers racine des clients\n" +"est monté via NFS, `fai` se situe dans '/srv/fai/nfsroot/usr/sbin' sur le\n" +"serveur d'installation.]. Ce script contrôle la séquence de\n" +"l’installation. Aucun autre script dans '/etc/init.d/' n’est utilisé." #: fai-guide.txt:1391 msgid "" @@ -3285,10 +3291,14 @@ msgid "" "in '$FAI' footnote:['$FAI' is an internal variable used by the FAI\n" "scripts. By default the path is _/var/lib/fai/config_.]" msgstr "" +"L’espace de configuration est rendu disponible via la méthode configurée\n" +"(un montage NFS par défaut) depuis le serveur d’installation vers le chemin défini\n" +"dans '$FAI' footnote:['$FAI' est une variable interne utilisée par les scripts FAI.\n" +"Le chemin par défaut est _/var/lib/fai/config_.]" #: fai-guide.txt:1394 msgid "=== [[bootmesg]]Boot messages" -msgstr "" +msgstr "=== [[bootmesg]]Messages de démarrage" #: fai-guide.txt:1398 msgid "" @@ -3297,6 +3307,9 @@ msgid "" "messages like this:\n" "include::includes/bootexample.txt[]" msgstr "" +"Lorsqu'on démarre le client d’installation à partir de la carte\n" +"réseau avec PXE, on voit des messages comme ceci :\n" +"include::includes/bootexample.txt[]" #: fai-guide.txt:1405 msgid "" @@ -3307,6 +3320,12 @@ msgid "" "server via NFS] and the FAI scripts are started. The first\n" "thing you see is the red FAI copyright message." msgstr "" +"À ce stade, le client d’installation a réussi à recevoir la configuration\n" +"réseau via DHCP, le noyau et le fichier initrd via TFTP. Il démarre maintenant Le\n" +"noyau Linux et met en place initrd. Si tout se passe bien, l’initrd monte\n" +"le nfsroot footnote:['/srv/fai/nfsroot' depuis le serveur d'installation via NFS]\n" +"et les scripts FAI sont lancés. La première\n" +"chose qu'on voit est le message de copyright en rouge de FAI." #: fai-guide.txt:1407 msgid "include::includes/fai-1st-part.txt[]" @@ -3317,6 +3336,8 @@ msgid "" "You can also see the list of FAI classes, that are defined for this\n" "host. This list is very important for the rest of the installation." msgstr "" +"On peut également voir la liste des classes FAI, qui sont définies\n" +"pour cet hôte. Cette liste est très importante pour le reste de l’installation." #: fai-guide.txt:1414 msgid "" @@ -3324,6 +3345,10 @@ msgid "" "access to the config space. Here, we use an NFS mount from the install\n" "server as you can see on the console (and later in the logs)." msgstr "" +"La première tâche est appelée _confdir_, qui est chargée de accès à\n" +"l’espace de configuration. Ici, on utilise un montage NFS depuis\n" +"le serveur d'installation comme on peut le voir sur la console (et plus tard\n" +"dans les journaux)." #: fai-guide.txt:1419 msgid "" @@ -3333,6 +3358,10 @@ msgid "" "config\n" "----" msgstr "" +"----\n" +"FAI_CONFIG_SRC is set to nfs://faiserver/srv/fai/config\n" +"Configuration space faiserver:/srv/fai/config mounted to /var/lib/fai/config\n" +"----" #: fai-guide.txt:1424 msgid "" @@ -3341,10 +3370,14 @@ msgid "" "not want to perform an installation and let FAI erase all yout data on\n" "the local disk!" msgstr "" +"Avant de lancer l’installation (+$FAI_ACTION=install+), l’ordinateur\n" +"émet trois bips. Donc, faites attention quand vous entendez trois bips\n" +"et que vous ne voulez pas effectuer une installation, ni laisser FAI\n" +"effacer toutes vos données sur Le disque local !" #: fai-guide.txt:1427 msgid "=== [[reboot]]Rebooting the computer into the new system" -msgstr "" +msgstr "=== [[reboot]]Redémarrage de l’ordinateur dans le nouveau système" #: fai-guide.txt:1433 msgid "" @@ -3354,6 +3387,12 @@ msgid "" "hasn't finished, use _faireboot -s_, so the log files are also copied\n" "to the install server." msgstr "" +"Pour redémarrer l’ordinateur pendant ou à la fin de l’installation, vous\n" +"devez utiliser la commande `faireboot` de préférence à la commande de\n" +"redémarrage normal. Utilisez aussi `faireboot` si vous êtes connecté\n" +"à distance. Si l’installation n’est pas terminée, utilisez\n" +"_faireboot -s_, afin que les fichiers journaux soient aussi copiés sur le\n" +"serveur d’installation." #: fai-guide.txt:1436 msgid "" @@ -3361,10 +3400,13 @@ msgid "" "small Debian system. You can login as user _demo_ or _root_ with password " "_fai_." msgstr "" +"Si l’installation s'est bien terminée, l’ordinateur doit démarrer un petit\n" +"système Debian. Vous pouvez vous connecter en tant qu'utilisateur _demo_ ou _root_\n" +"avec le mot de passe _fai_." #: fai-guide.txt:1438 msgid "=== [[isetup]]Starting FAI (task confdir)" -msgstr "" +msgstr "=== [[isetup]]Démarrage de FAI (tâche confdir)" #: fai-guide.txt:1445 msgid "" @@ -3375,6 +3417,12 @@ msgid "" "available in the directory +$FAI+ footnote:[/var/lib/fai/config]. FAI\n" "will not proceed without the config space." msgstr "" +"Une fois le client d’installation démarré, seul le script\n" +"'/usr/sbin/fai' est exécuté. Il effectuera une initialisation minimale.\n" +"La variable +$FAI_CONFIG_SRC+ footnote:[Celle-ci est définie dans la ligne de commande du noyau]\n" +"est utilisée pour accéder à l’espace de configuration FAI qui est alors\n" +"disponible dans le répertoire +$FAI+ footnote:[/var/lib/fai/config].\n" +"FAI ne se fonctionnera pas sans l’espace de configuration." #: fai-guide.txt:1449 msgid "" @@ -3382,11 +3430,14 @@ msgid "" "methods are: nfs:, file:, cvs:, svn: git:, hg:, http: and detect:.\n" "See `fai.conf(5)` for a detailed description of these methods." msgstr "" +"On peut accéder à l'espace de configuration à l'aide de diverses méthodes. Les\n" +"méthodes supportées sont : nfs:, file:, cvs:, svn: git:, hg:, http: et detect:.\n" +"Voir `fai.conf(5)` pour une description détaillée de ces méthodes." #: fai-guide.txt:1452 msgid "" "=== [[iclass]]Defining classes and variables (tasks defclass and defvar)" -msgstr "" +msgstr "=== [[iclass]]Définition de classes et de variables (tâches defclass et defvar)" #: fai-guide.txt:1456 msgid "" @@ -3394,6 +3445,10 @@ msgid "" "classes. If the scripts write a string to stdout, this will be defined\n" "as a class. Read all the details in the man page of `fai-class(1)`." msgstr "" +"La commande `fai-class(1)` exécute des scripts dans '$FAI/class' pour\n" +"définir des classes. Si les scripts écrivent une chaîne dans stdout, cela\n" +"sera défini comme une classe. Lisez tous les détails dans la page de\n" +"manuel de `fai-class(1)`." #: fai-guide.txt:1461 msgid "" @@ -3401,22 +3456,27 @@ msgid "" "which matches a defined class is sourced to define variables. It must\n" "contain valid shell code." msgstr "" +"Après avoir défini les classes, chaque fichier correspondant à _.var_\n" +"avec un préfixe qui correspond à une classe définie est pris en compte pour\n" +"définir des variables. Il doit contenir du code shell valide." #: fai-guide.txt:1463 msgid "" "=== [[ipartition]]Partitioning local disks, creating file systems (task " "partition)" -msgstr "" +msgstr "=== [[ipartition]]Partitionnement des disques locaux, création des systèmes de fichiers (tâche partition)" #: fai-guide.txt:1466 msgid "" "For the disk partitioning exactly one disk configuration file from\n" "'$FAI/disk_config' is selected using classes." msgstr "" +"Pour le partitionnement du disque, un fichier de configuration de disque\n" +"de '$FAI/disk_config' est sélectionné à l’aide de classes, et un seul." #: fai-guide.txt:1468 msgid "The format of the disk configuration is similar to a fstab file." -msgstr "" +msgstr "Le format de la configuration du disque est similaire à un fichier fstab." #: fai-guide.txt:1475 msgid "" @@ -3427,6 +3487,11 @@ msgid "" "`setup-storage(8)` for a detailed description and some examples of the\n" "format." msgstr "" +"L’outil de partitionnement `setup-storage(8)` exécute toutes les\n" +"commandes nécessaires pour créer l'organisation des partitions du\n" +"disque, du RAID logiciel, du LVM et pour créer les systèmes de\n" +"fichiers. Lisez la page de manuel de `setup-storage(8)` pour une\n" +"description détaillée et quelques exemples du format." #: fai-guide.txt:1480 msgid "" @@ -3434,10 +3499,14 @@ msgid "" "Files in '$FAI/debconf' are used for the usual `debconf(7)` preseeding\n" "if the file names match a class name." msgstr "" +"=== [[ipreseed]]Pré-ensemencement Debconf (tâche debconf)\n" +"Les fichiers dans '$FAI/debconf' sont utilisés par le système de pré-ensemencement\n" +"habituel de `debconf(7)` si les noms de fichier correspondent à un\n" +"nom de classe." #: fai-guide.txt:1482 msgid "=== [[ipackages]]Installing software packages (task instsoft)" -msgstr "" +msgstr "=== [[ipackages]]Installation de paquets logiciels (tâche instsoft)" #: fai-guide.txt:1486 msgid "" @@ -3445,6 +3514,9 @@ msgid "" "'$FAI/package_config' in a class based manner and installs software\n" "packages on the new file system." msgstr "" +"La commande `install_packages(8)` lit les fichiers de configuration à\n" +"partir de '$FAI/package_config' d'une façon basée sur la classe et installe des paquets\n" +"logiciels sur le nouveau système de fichiers." #: fai-guide.txt:1490 msgid "" @@ -3452,21 +3524,26 @@ msgid "" "package tools without any manual interaction needed. Package\n" "dependecies are also resolved by the package tools." msgstr "" +"Elle installe les paquets en utilisant `apt-get(8)`, `aptitude(1)`,\n" +"`yum` ou d’autres gestionnaires de paquets sans besoin d'aucune interaction manuelle.\n" +"Les dépendances des paquets sont également résolues par les gestionnaires de paquets." #: fai-guide.txt:1492 msgid "" "The format of the configuration files is described in <>." -msgstr "" +msgstr "Le format des fichiers de configuration est décrit dans <>." #: fai-guide.txt:1495 msgid "" "Additionaly FAI will install packages ('.deb' or .rpm') from the\n" "directories '$FAI/pkgs/'." msgstr "" +"De plus, FAI installera les paquets ('.deb' or .rpm') depuis les\n" +"répertoires '$FAI/pkgs/'." #: fai-guide.txt:1498 msgid "=== [[icscripts]]Site specific customization (task configure)" -msgstr "" +msgstr "=== [[icscripts]]Personnalisation spécifique au site (tâche configure)" #: fai-guide.txt:1505 msgid "" @@ -3477,6 +3554,12 @@ msgid "" "based manner. It is possible to have several scripts of different\n" "types (shell, cfengine, ...) to be executed for one class." msgstr "" +"Souvent, les configurations par défaut des paquets logiciels ne répondent pas à\n" +"vos besoins spécifiques au site. Vous pouvez appeler des scripts\n" +"arbitraires qui ajustent la configuration du système. Par conséquent, la\n" +"commande `fai-do-scripts(1)` exécute des scripts dans '$FAI/scripts'\n" +"d’une manière basée sur la classe. Il est possible d’avoir plusieurs\n" +"scripts de différents types (shell, cfengine, …) à exécuter pour une classe." #: fai-guide.txt:1512 msgid "" @@ -3488,14 +3571,21 @@ msgid "" "They should do a reasonable job for your installation. You can edit\n" "them or add new scripts to match your local needs." msgstr "" +"L’ensemble de scripts par défaut dans '$FAI/scripts' inclut des exemples\n" +"d’installation de machines Debian et Rocky Linux. Ils définissent le mot de\n" +"passe root, ajoutent un compte utilisateur (défini par '$username', avec demo par défaut),\n" +"paramètrent le fuseau horaire, configurent le réseau avec DHCP ou en utilisant une adresse IP\n" +"fixe, configurent grub et plus encore. Ils devraient faire un\n" +"travail raisonnable pour votre installation. Vous pouvez les modifier ou\n" +"ajouter de nouveaux scripts pour répondre à vos besoins locaux." #: fai-guide.txt:1514 msgid "More information about these scripts are described in <>." -msgstr "" +msgstr "Plus d’information sur ces scripts est disponible dans <>." #: fai-guide.txt:1517 msgid "=== [[isavelog]]Saving log files (task savelog)" -msgstr "" +msgstr "=== [[isavelog]]Enregistrement des fichiers journaux (tâche savelog)" #: fai-guide.txt:1528 msgid "" @@ -3510,6 +3600,16 @@ msgid "" "+$SERVER+ which is only defined during an initial installation (by\n" "get-boot-info)." msgstr "" +"Lorsque toutes les tâches sont terminées, les fichiers journaux sont écrits dans\n" +"_/var/log/fai/$HOSTNAME/install/_\n" +"footnote:['/var/log/fai/localhost/install/' est un lien vers ce répertoire.]\n" +"sur le nouveau système, et sur le compte sur le serveur d’installation si\n" +"+$LOGUSER+ est défini (il faut l'activer dans '/srv/fai/config/class/FAIBASE.var').\n" +"Il est également possible de spécifier un autre hôte comme destination pour cet enregistrement\n" +"à l'aide de la variable\n" +"+$LOGSERVER+. Si +$LOGSERVER+ n’est pas défini, FAI utilise la\n" +"variable +$SERVER+ qui n’est définie que lors d’une installation\n" +"initiale (par get-boot-info)." #: fai-guide.txt:1537 msgid "" @@ -3522,6 +3622,15 @@ msgid "" "'fai.conf(5)' to choose another method for saving logs to the remote\n" "server. Here's an example of the symlink structure:" msgstr "" +"De plus, deux liens symboliques seront créés pour indiquer le dernier\n" +"répertoire où on a écrit. Le lien symbolique 'last' pointe vers le répertoire\n" +"journal de la dernière action FAI exécutée. Les liens symboliques\n" +"'last-install' et 'last-sysinfo' pointent vers le répertoire avec la\n" +"dernière action correspondante. Par défaut, les fichiers journaux seront\n" +"copiés sur le serveur de journalisation à l’aide de scp. Vous pouvez utiliser\n" +"la variable +$FAI_LOGPROTO+ dans le fichier 'fai.conf(5)' pour choisir\n" +"une autre méthode d’enregistrement des journaux sur le serveur distant.\n" +"Voici un exemple de structure de lien symbolique :" #: fai-guide.txt:1547 msgid "" @@ -3537,14 +3646,23 @@ msgid "" "drwxr-xr-x 2 fai fai 4096 Dec 4 13:22 install-20141204_131351\n" "----" msgstr "" +"----\n" +"lrwxrwxrwx 1 fai fai 23 Dec 2 2013 last-sysinfo -> sysinfo-20131202_161237\n" +"drwxr-xr-x 2 fai fai 4096 Dec 2 2013 sysinfo-20131202_161237\n" +"drwxr-xr-x 2 fai fai 4096 Feb 14 2014 install-20140214_142150\n" +"drwxr-xr-x 2 fai fai 4096 Dec 2 11:47 install-20141202_113918\n" +"lrwxrwxrwx 1 fai fai 23 Dec 4 13:22 last-install -> install-20141204_131351\n" +"lrwxrwxrwx 1 fai fai 23 Dec 4 13:22 last -> install-20141204_131351\n" +"drwxr-xr-x 2 fai fai 4096 Dec 4 13:22 install-20141204_131351\n" +"----" #: fai-guide.txt:1549 msgid "Examples of the log files can be found at https://fai-project.org/logs." -msgstr "" +msgstr "Vous trouverez des exemples de fichiers journaux à l’adresse https://fai-project.org/logs." #: fai-guide.txt:1552 msgid "=== [[ireboot]]Reboot the new installed system" -msgstr "" +msgstr "=== [[ireboot]]Redémarrage du nouveau système installé" #: fai-guide.txt:1558 msgid "" @@ -3554,20 +3672,28 @@ msgid "" "next boot. Normally this should boot the new installed system from\n" "its second boot device, the local hard disk." msgstr "" +"Avant de redémarrer, le client d’installation appelle\n" +"`fai-chboot -d ` sur le serveur d’installation, pour\n" +"désactiver sa propre configuration PXELINUX. Sinon, il redémarrerait\n" +"l’installation lors de la prochaine initialisation. Normalement, cela\n" +"devrait démarrer le nouveau système installé à partir de son second\n" +"périphérique d’amorçage, le disque dur local." #: fai-guide.txt:1561 msgid "" "At the end, the system is automatically rebooted if \"reboot\" was added to\n" "+$FAI_FLAGS+." msgstr "" +"À la fin, le système est automatiquement redémarré si \"reboot\" a été\n" +"ajouté à +$FAI_FLAGS+." #: fai-guide.txt:1565 msgid "== [[advanced]]Advanced FAI topics" -msgstr "" +msgstr "== [[advanced]]Sujets avancés pour FAI" #: fai-guide.txt:1568 msgid "=== [[checkbootp]]Checking parameters received from DHCP servers" -msgstr "" +msgstr "=== [[checkbootp]]Vérification des paramètres reçus des serveurs DHCP" #: fai-guide.txt:1574 msgid "" @@ -3577,10 +3703,15 @@ msgid "" "'/tmp/fai/boot.log'. An example of the result of a DHCP request can be\n" "found in the sample log files." msgstr "" +"Si le client d’installation démarre, vous pouvez vérifier si toutes les\n" +"informations provenant du démon DHCP sont correctement reçues. Les\n" +"informations reçues sont écrites dans '/tmp/fai/boot.log'. Un exemple de\n" +"résultat d’une requête DHCP peut être trouvé dans les fichiers journaux\n" +"d’exemple." #: fai-guide.txt:1579 msgid "=== [[fai-monitor]]Monitoring multiple client installations" -msgstr "" +msgstr "=== [[fai-monitor]]Surveillance de plusieurs clients d'installation" #: fai-guide.txt:1586 msgid "" @@ -3591,6 +3722,13 @@ msgid "" "FAI monitor daemon prints this messages to standard output. There's\n" "also a graphical frontend available, called `fai-monitor-gui(1)`." msgstr "" +"Vous pouvez surveiller l’installation de tous les clients d’installation\n" +"avec la commande `fai-monitor(8)`. Tous les clients vérifient si ce\n" +"démon est en cours d’exécution sur le serveur d’installation (ou sur\n" +"l’ordinateur défini par la variable +$monserver+). Chaque fois qu’une\n" +"tâche démarre ou se termine, un message est envoyé. Le démon du moniteur\n" +"FAI envoie ces messages dans sa sortie standard. On peut aussi utiliser une interface\n" +"graphique, appelée `fai-monitor-gui(1)`." #: fai-guide.txt:1590 msgid "" @@ -3598,10 +3736,13 @@ msgid "" "$ fai-monitor | fai-monitor-gui - &\n" "----" msgstr "" +"----\n" +"$ fai-monitor | fai-monitor-gui - &\n" +"----" #: fai-guide.txt:1593 msgid "=== [[mac]]Collecting Ethernet addresses for multiple hosts" -msgstr "" +msgstr "=== [[mac]]Collecte d’adresses Ethernet pour plusieurs hôtes" #: fai-guide.txt:1600 msgid "" @@ -3613,6 +3754,13 @@ msgid "" "\n" "but you can still collect the MAC addresses." msgstr "" +"Vous devez collecter toutes les adresses Ethernet (MAC) des clients\n" +"d’installation et affecter un nom d’hôte et une adresse IP à chaque\n" +"client. Pour collecter les adresses MAC, démarrez vos clients\n" +"d’installation. Vous pouvez déjà le faire avant que n’importe quel démon\n" +"DHCP s’exécute dans votre sous-réseau. Ils échoueront à démarrer (en\n" +"raison de l'absence de DHCP ou de TFTP), mais vous pouvez toujours\n" +"collecter les adresses MAC." #: fai-guide.txt:1604 msgid "" @@ -3620,6 +3768,9 @@ msgid "" "LAN. You can log the MAC addresses of these hosts by running the\n" "following command simultaneously on the server:" msgstr "" +"Pendant que les clients d’installation démarrent, ils envoient des\n" +"paquets de diffusion (broadcast) au LAN. Vous pouvez enregistrer les adresses MAC de\n" +"ces hôtes en exécutant simultanément la commande suivante sur le serveur :" #: fai-guide.txt:1608 msgid "" @@ -3627,6 +3778,9 @@ msgid "" "faiserver# tcpdump -qtel broadcast and port bootpc >/tmp/mac.list\n" "----" msgstr "" +"----\n" +"faiserver# tcpdump -qtel broadcast and port bootpc >/tmp/mac.list\n" +"----" #: fai-guide.txt:1612 msgid "" @@ -3634,6 +3788,8 @@ msgid "" "by typing _ctrl-c_. You get a list of all\n" "unique MAC addresses with these commands:" msgstr "" +"Une fois que les hôtes ont envoyés quelques paquets de diffusion, arrêtez `tcpdump`\n" +"en tapant _ctrl-c_. Vous obtenez une liste de toutes les adresses MAC uniques avec ces commandes :" #: fai-guide.txt:1616 msgid "" @@ -3642,6 +3798,9 @@ msgid "" "\"' /tmp/mac.list|sort|uniq\n" "----" msgstr "" +"----\n" +"faiserver$ perl -ane 'print \"\\U$F[0]\\n\"' /tmp/mac.list|sort|uniq\n" +"----" #: fai-guide.txt:1623 msgid "" @@ -3653,10 +3812,16 @@ msgid "" "addresses (last three bytes will suffice if you have network cards\n" "from the same vendor) and the host name in the front of each chassis.]" msgstr "" +"Après cela, vous n’avez qu'à assigner ces adresses MAC aux noms d’hôte\n" +"et aux adresses IP ('/etc/ethers' et '/etc/hosts' ou aux associations NIS\n" +"correspondantes). Avec ces informations, vous pouvez configurer votre\n" +"démon DHCP (voir la section <>). footnote:[Je recommande d'inscrire\n" +"l'adresse MAC (les trois derniers octets devraient suffire si vous avez des cartes du\n" +"même vendeur) et le nom d'hôte devant chaque boîtier.]" #: fai-guide.txt:1626 msgid "==== Debugging the network traffic" -msgstr "" +msgstr "==== Débogage du trafic réseau" #: fai-guide.txt:1631 msgid "" @@ -3665,6 +3830,10 @@ msgid "" "and the client. Search also for entries in several log files made by\n" "`tftpd(8)` and `dhcpd(8)` :" msgstr "" +"Si le client ne peut démarrer correctement à partir de la carte réseau,\n" +"utilisez `tcpdump(8)` pour rechercher des paquets Ethernet entre le\n" +"serveur d’installation et le client. Recherchez également dans les entrées de\n" +"plusieurs fichiers journaux venant de `tftpd(8)` et `dhcpd(8)` :" #: fai-guide.txt:1635 msgid "" @@ -3672,16 +3841,24 @@ msgid "" "faiserver$ egrep \"tftpd|dhcpd\" /var/log/*\n" "----" msgstr "" +"----\n" +"faiserver$ egrep \"tftpd|dhcpd\" /var/log/*\n" +"----" +# +# #: fai-guide.txt:1638 msgid "=== [[pxeboot]]Details of PXE booting" -msgstr "" +msgstr "=== [[pxeboot]]Détails du démarrage PXE" #: fai-guide.txt:1641 msgid "" "Here we describe the details of PXE booting, which are only needed if\n" "you have problems when booting your install clients." msgstr "" +"Ici, nous décrivons les détails du démarrage PXE, qui sont\n" +"nécessaires seulement si vous avez des problèmes lors du démarrage de vos\n" +"clients d’installation." #: fai-guide.txt:1648 msgid "" @@ -3692,6 +3869,13 @@ msgid "" "+tftpd-hpa+. PXE booting also needs a DHCP server, so that the network\n" "card can configure its IP parameters. This is the sequence of a PXE boot:" msgstr "" +"Presque toutes les cartes réseau modernes prennent en charge\n" +"l’environnement de démarrage PXE. PXE est l’environnement d’exécution de\n" +"pré-lancement. Cela nécessite le chargeur de démarrage PXELINUX et une\n" +"version spéciale du démon _TFTP_, disponibles dans les paquets Debian\n" +"+pxelinux+ et +tftpd-hpa+. Le démarrage PXE nécessite également un\n" +"serveur DHCP, afin que la carte réseau puisse configurer ses paramètres\n" +"IP. Voici la séquence d’une amorce PXE :" #: fai-guide.txt:1658 msgid "" @@ -3705,6 +3889,14 @@ msgid "" "command line parameters, which was created by `fai-chboot`.\n" "* Get the kernel and initrd via TFTP." msgstr "" +"* La carte réseau du client envoie son adresse MAC\n" +"* Le serveur DHCP répond par la configuration IP du client\n" +"* La carte réseau configure son IP\n" +"* Le client d’installation obtient le binaire pxelinux.0 via TFTP\n" +"* Il obtient le fichier de configuration pxelinux.cfg/C0A8210C via TFTP\n" +"* C0A8210C est l’adresse IP du client en hexadécimal\n" +"* Cette configuration contient le noyau, le fichier initrd et les paramètres de ligne de commande supplémentaires du noyau, qui ont été créés par `fai-chboot`.\n" +"* Il obtient le noyau et le fichier initrd via TFTP." #: fai-guide.txt:1663 msgid "" @@ -3712,6 +3904,9 @@ msgid "" "----\n" "default fai-generated" msgstr "" +"Exemple d'un fichier pxelinux.cfg :\n" +"----\n" +"default fai-generated" #: fai-guide.txt:1668 msgid "" @@ -3722,6 +3917,10 @@ msgid "" "fai/config FAI_ACTION=install\n" "----" msgstr "" +"label fai-generated\n" +"kernel vmlinuz-6.1.0-17-amd64\n" +"append initrd=initrd.img-6.1.0-17-amd64 ip=dhcp root=/srv/fai/nfsroot rootovl FAI_FLAGS=verbose,sshd,createvt FAI_CONFIG_SRC=nfs://faiserver/srv/fai/config FAI_ACTION=install\n" +"----" #: fai-guide.txt:1673 msgid "" @@ -3730,12 +3929,17 @@ msgid "" "supports loading the kernel and initrd via FTP or HTTP. The command\n" "'fai-chboot(8)' supports this with the option '-U'." msgstr "" +"Voir '/usr/share/doc/syslinux/pxelinux.doc' pour des informations plus\n" +"détaillées sur PXELINUX. FAI utilise le fichier binaire lpxelinux.0 qui\n" +"s'occupe du chargement du noyau et du fichier initrd via FTP\n" +"ou HTTP. La commande `fai-chboot(8)` prend cela en charge avec\n" +"l’option '-U'." #: fai-guide.txt:1676 msgid "" "=== [[Customizing your install server setup]]Customizing your install server " "setup" -msgstr "" +msgstr "=== [[Customizing your install server setup]]Personnaliser la configuration de son serveur d’installation" #: fai-guide.txt:1680 msgid "" @@ -3743,6 +3947,9 @@ msgid "" "- different loguser\n" "- local root pw inside nfsroot" msgstr "" +"- Miroir de paquets logiciels local/plus rapide\n" +"- Loguser différent\n" +"- Mot de passe root local dans nfsroot" #: fai-guide.txt:1686 msgid "" @@ -3752,6 +3959,11 @@ msgid "" "'nfsroot.conf(5)'. Check these important variables in 'nfsroot.conf'\n" "before calling 'fai-setup' or 'fai-make-nfsroot'." msgstr "" +"La configuration du paquet FAI (et non les données de configuration pour\n" +"les clients d’installation) est définie dans 'fai.conf(5)'. Les\n" +"définitions qui sont utilisées uniquement pour créer le nfsroot sont\n" +"situées dans 'nfsroot.conf(5)'. Vérifiez ces variables importantes dans\n" +"'nfsroot.conf' avant d’appeler 'fai-setup' ou 'fai-make-nfsroot'." #: fai-guide.txt:1692 msgid "" @@ -3763,6 +3975,13 @@ msgid "" "system should be built. Do not use different distributions here and in\n" "'/etc/fai/apt/sources.list'. This will create a broken nfsroot." msgstr "" +"FAI_DEBOOTSTRAP::\n" +"La construction du nfsroot utilise la commande `debootstrap(8)`. Elle\n" +"a besoin de l’emplacement d’un miroir Debian et du nom de la\n" +"distribution (comme bullsseye, bookworm, sid) pour laquelle le système\n" +"Debian de base devrait être construit. N’utilisez pas de distributions\n" +"différentes ici et dans '/etc/fai/apt/sources.list'. Cela créerait un\n" +"nfsroot dysfonctionnel." #: fai-guide.txt:1698 msgid "" @@ -3773,6 +3992,11 @@ msgid "" "nfsroot. Then the install clients can access those hosts by name\n" "without using DNS." msgstr "" +"NFSROOT_ETC_HOSTS::\n" +"Cette variable est nécessaire seulement si les clients n’ont pas accès à\n" +"un serveur DNS. Cette variable multiligne est ajoutée à /etc/hosts\n" +"dans le nfsroot. Ensuite, les clients d’installation peuvent accéder à\n" +"ces hôtes par leur nom sans utiliser DNS." #: fai-guide.txt:1705 msgid "" @@ -3782,6 +4006,11 @@ msgid "" "card (as for a Beowulf server), use the install server name which is\n" "known by the install clients." msgstr "" +"Le contenu de '/etc/fai/apt/sources.list' est utilisé par le serveur\n" +"d’installation et aussi par les clients. Si votre serveur d’installation a\n" +"plusieurs cartes réseau et différents noms d’hôte pour chaque carte\n" +"(comme pour un serveur Beowulf), utilisez le nom du serveur\n" +"d’installation qui est connu des clients d’installation." #: fai-guide.txt:1714 msgid "" @@ -3793,6 +4022,13 @@ msgid "" "it may help to enter the chroot environment manually using this\n" "command. 'faiserver# chroot /srv/fai/nfsroot bash']" msgstr "" +"Si vous avez des problèmes lors de l’exécution de `fai-setup`, ils\n" +"proviennent habituellement de `fai-make-nfsroot(8)` qui est appelé par\n" +"la commande précédente. L’ajout de '-v' vous donne une sortie plus\n" +"détaillée qui vous aide à repérer l’erreur. La sortie est écrite dans\n" +"'/var/log/fai/fai-make-nfsroot.log'. footnote:[À des fins de débogage,\n" +"il peut être utile d'entrer dans l'environnement chroot à la main à l'aide\n" +"de cette commande : 'faiserver# chroot /srv/fai/nfsroot bash']" #: fai-guide.txt:1724 msgid "" @@ -3805,6 +4041,15 @@ msgid "" "account, so this account has write permissions to '/srv/tftp/fai' in\n" "order to call fai-chboot for creating the PXE configuration for the hosts." msgstr "" +"L’installation crée également le compte _fai_ (défini par +$LOGUSER+)\n" +"s’il n’est pas déjà disponible. Vous pouvez donc ajouter un utilisateur\n" +"avant d’appeler `fai-setup(8)` à l’aide de la commande `adduser(8)`\n" +"et l'utiliser comme compte local pour enregistrer des fichiers journaux. Les\n" +"fichiers journaux de tous les clients d’installation sont enregistrés\n" +"dans le répertoire de personnel de ce compte. Vous devriez changer le groupe\n" +"principal de ce compte, afin que ce compte ait des droits d'écriture sur\n" +"'/srv/tftp/fai' afin d'appeler fai-chboot pour créer la configuration PXE\n" +"pour les hôtes." #: fai-guide.txt:1732 msgid "" @@ -3816,10 +4061,17 @@ msgid "" "only updates your kernel and kernel modules inside the nfsroot or add\n" "additional packages into the nfsroot." msgstr "" +"Lorsque vous apportez des modifications à 'fai.conf', 'nfsroot.conf', le\n" +"nfsroot doit être reconstruit en appelant `fai-make-nfsroot(8)`. Si\n" +"vous souhaitez uniquement installer un nouveau paquet de noyau sur\n" +"nfsroot, ajoutez les options _-k_ ou _-K_ à +fai-make-nfsroot+. Cela ne\n" +"recréera pas votre nfsroot, mais mettra à jour seulement vos noyaux et les\n" +"modules du noyau dans le nfsroot ou ajoutera des paquets supplémentaires\n" +"dans le nfsroot." #: fai-guide.txt:1735 msgid "=== [[cdboot]]Creating a FAI CD or and USB stick" -msgstr "" +msgstr "=== [[cdboot]]Création d’un CD ou d’une clé USB FAI" #: fai-guide.txt:1743 msgid "" @@ -3831,12 +4083,22 @@ msgid "" "`fai-cd(8)` will put this mirror, the nfsroot and the config space\n" "onto a bootable CD. That's it!" msgstr "" +"Vous pouvez facilement créer un CD d’installation (ou une clé USB) de\n" +"votre installation réseau. Cela permettra d’effectuer la même\n" +"installation et la même configuration à partir du CD sans avoir besoin\n" +"du serveur d’installation. Par conséquent, vous devez créer un miroir\n" +"partiel de tous les paquets Debian nécessaires à vos classes FAI (à\n" +"l’aide de `fai-mirror(1)`). Ensuite, la commande `fai-cd(8)` écrira\n" +"ce miroir, le nfsroot et l’espace de configuration sur un CD amorçable.\n" +"Et voilà !" #: fai-guide.txt:1746 msgid "" "To easily create the installation CD, you can use the following command\n" "(for more tuning details see `fai-cd(8)`):" msgstr "" +"Pour créer facilement le CD d'installation, on peut utiliser la commande suivante\n" +"(Pour plus de détails de configuration voir `fai-cd(8)`) :" #: fai-guide.txt:1750 msgid "" @@ -3844,6 +4106,9 @@ msgid "" " faiserver# fai-cd -m fai-cd.iso\n" "----" msgstr "" +"----\n" +" faiserver# fai-cd -m fai-cd.iso\n" +"----" #: fai-guide.txt:1758 msgid "" @@ -3855,6 +4120,13 @@ msgid "" "classes used in your configuration space. A sample ISO image is\n" "available at https://fai-project.org/fai-cd." msgstr "" +"Ce CD d’installation contient toutes les données nécessaires à\n" +"l’installation. La commande `fai-cd(8)` écrit le nfsroot, l’espace de\n" +"configuration et un sous-ensemble du miroir Debian sur un CD-ROM. Un\n" +"miroir de paquets partiel est créé à l’aide de la commande\n" +"`fai-mirror(1)` qui contient tous les paquetages utilisés par les\n" +"classes utilisées dans votre espace de configuration. Un échantillon\n" +"d’image ISO est disponible à l’adresse https://fai-project.org/fai-cd." #: fai-guide.txt:1762 msgid "" @@ -3862,6 +4134,9 @@ msgid "" "stick by just writing the content of the ISO file to your USB stick\n" "(here the stick is _/dev/sdf_)." msgstr "" +"Avec la commande `dd(1)`, vous pouvez également créer une clé USB\n" +"amorçable en écrivant simplement le contenu du fichier ISO sur votre clé\n" +"USB (ici la clé est _/dev/sdf_)." #: fai-guide.txt:1766 msgid "" @@ -3869,6 +4144,9 @@ msgid "" " faiserver# dd if=fai-cd.iso of=/dev/sdf bs=1M\n" "----" msgstr "" +"----\n" +" faiserver# dd if=fai-cd.iso of=/dev/sdf bs=1M\n" +"----" #: fai-guide.txt:1775 msgid "" @@ -3880,10 +4158,17 @@ msgid "" "subdiretories 'pkgs/'. FAI will then install these packages\n" "if the equivalent class is defined." msgstr "" +"`mk-data-partition` est un outil qui étend une image ISO (qui sera copiée\n" +"sur une clé USB) ou une clé USB contenant une image ISO avec\n" +"une partition ext4 ou exFAT et y place le label MY-DATA.\n" +"Cette partition est automatiquement montée dans '/media/data' par FAI.\n" +"On peut copier ses propres paquets _.deb_ dans cette partition de données sous les\n" +"sous-répertoires 'pkgs/'. FAI installera alors ces paquets\n" +"si la classe équivalente est définie." #: fai-guide.txt:1777 msgid "Example how to use `mk-data-partition`:" -msgstr "" +msgstr "exemple d'usage de `mk-data-partition`:" #: fai-guide.txt:1784 msgid "" @@ -3895,6 +4180,12 @@ msgid "" "modified ISO\n" "onto an USB stick." msgstr "" +"----\n" +"# mk-data-partition -s 1G -c faicd-large.iso A B\n" +"----\n" +"La commande ci-desus crée la partition de données avec une taille de 1 Go dans\n" +"le fichier ISO et y copie les répertoires A et B. On peut écrire l'image ISO modifiée\n" +"sur une clé USB." #: fai-guide.txt:1792 msgid "" @@ -3905,6 +4196,13 @@ msgid "" "# mk-data-partition -F /dev/sdf\n" "----" msgstr "" +"Si l'image ISO est déjà sur la clé USB, qui est disponible sous\n" +"_dev/sdf_, on peut ajouter la partition de données de type exFAT qui utilisera\n" +"tout l'espace disponible de la clé USB en utilisant cette commande\n" +" :\n" +"----\n" +"# mk-data-partition -F /dev/sdf\n" +"----" #: fai-guide.txt:1795 msgid "=== [[diskimage]]Creating VM disk images using FAI" From 2ede362875e75419d6a4fa5dc9524772225334cb Mon Sep 17 00:00:00 2001 From: Georges Khaznadar Date: Fri, 24 Oct 2025 15:50:35 +0200 Subject: [PATCH 4/9] improving the French translation --- doc/fai-guide_fr.html | 764 +++++++++++++++++++++-------------------- doc/fai-guide_fr.txt | 769 ++++++++++++++++++++++-------------------- doc/po/fr.po | 563 +++++++++++++++++++++++++++++-- 3 files changed, 1344 insertions(+), 752 deletions(-) diff --git a/doc/fai-guide_fr.html b/doc/fai-guide_fr.html index 423127b6b..279d41498 100644 --- a/doc/fai-guide_fr.html +++ b/doc/fai-guide_fr.html @@ -2025,12 +2025,12 @@

Planifiez vo http://www.infrastructures.org/papers/bootstrap/bootstrap.html

L’espace de configuration et ses sous-répertoires

-

The configuration space is the collection of information about how exactly -to install a client. The central configuration space for all install -clients is located on the install server in /srv/fai/config and its -subdirectories. This will be mounted by the install clients to -/var/lib/fai/config. The main installation command fai(8) uses all -these subdirectories in the order listed except for hooks.

+

L’espace de configuration est la collection des informations qui disent comment exactement +configurer un client. L’espace central de configuration pour tous les clients +d’installation est situé sur le serveur d’installation dans /srv/fai/config et ses +sous-répertoires. Il sera monté par les clients sous +/var/lib/fai/config. La commande princpale d’installation fai(8) utilise tous +ces sous-répertoires dans l’ordre listé sauf pour les hooks.

class/ @@ -3336,41 +3336,42 @@

<

-

Creating VM disk images using FAI

-

The command fai-diskimage(8) creates disk -images, which can be used with a virtual machine like KVM, VMware, -VirtualBox or a cloud service like OpenStack, GCE, EC2 and others. The -installation process performs the normal FAI tasks on a raw disk -image. After the installation you can boot the disk image and have a -running system. The disk image can also be converted to qcow2 format. -You do not need to setup the FAI nfsroot when only using -fai-diskimage. But you need a basefile in your configuration -space. Setting the variable $FAI_BASEFILEURL will automatically -download an appropriate base file into your config space.

-

Here’s an example how to create a raw disk image for a host called -cloud3, with a small set of software packages:

+

Création d’images de disque VM à l’aide de FAI

+

En utilisant la commande fai-diskimage(8), vous pouvez créer des +images de disques qui peuvent être utilisées avec une +machine virtuelle comme KVM, VMware, VirtualBox ou un service cloud +comme OpenStack, GCE, EC2 et autres. Le processus d’installation exécute +les tâches FAI normales sur une image de disque brut. Après +l’installation, vous pouvez démarrer l’image disque et avoir un système +fonctionnel. L’image disque peut également être convertie au format qcow2. +Vous n’avez pas besoin de mettre en place le nfsroot de FAI quand vous utilisez seulement +fai-diskimage. Mais vous avez besoin d’un fichier de base dans votre espace de +configuration. Le réglage de la variable $FAI_BASEFILEURL permet de télécharger automatiquement +un fichier de base approprié dans votre espace de configuration.

+

Voici par exemple comment créer une image de disque brute pour un hôte nommé +cloud3, avec un petit ensemble de paquets logiciels :

# export FAI_BASEFILEURL=https://fai-project.org/download/basefiles/
 # fai-diskimage -vu cloud3 -S2G -cDEBIAN,BOOKWORM64,AMD64,FAIBASE,GRUB_PC,DHCPC,DEMO,CLOUD,LAST disk.raw
-

This command will create a disk image called ubuntu.qcow2 for a Ubuntu 16.04 desktop -with hostname set to foobar.

+

Cette commande créera une image de disque nommée ubuntu.qcow2 pour une configuration de bureau Ubuntu 16.04 +avec pour nom d’hôte machin.

# export FAI_BASEFILEURL=https://fai-project.org/download/basefiles/
 # cl=DHCPC,UBUNTU,JAMMY,JAMMY64,AMD64,XORG,LAST
-# fai-diskimage -Nvu foobar -S5G -c$cl ubuntu.qcow2
+# fai-diskimage -Nvu machin -S5G -c$cl ubuntu.qcow2
-

You can give disk images a try without installing FAI, if you visit +

Vous pouvez essayer quelques images de disques sans installer FAI, si vous visitez https://fai-project.org/FAIme/cloud

-

Creating a bootable live image

-

Creating a bootable live ISO is easy with FAI. You only need two -steps. First, create your live environment using the command fai -dirinstall. Don’t forget to add the class LIVEISO. -Then create the live ISO using fai-cd:

+

Création d’une image vive amorçable

+

La création d’images ISO vives amorçables est facile avec FAI. Il suffit de deux +étapes. Premièrement, créez votre environnement vif à l’aide de la commande fai +dirinstall. N’oubliez pas d’ajouter la classe LIVEISO. +Ensuite, créez l’image ISO vive en utilisant fai-cd :

# cl="DEBIAN,BOOKWORM64,AMD64,FAIBASE,XFCE,XORG,DHCPC,DEMO,LIVEISO,LAST"
@@ -3379,15 +3380,15 @@ 

-

The nfsroot is not needed for a live ISO. -Currently there’s no live ISO of the install server available.

+

Le nfsroot n’est pas nécessaire pour une image ISO vive. +Il n’y a pas actuellement d’image vive ISO disponible sur le serveur d’installation.

-

Building cross-architecture disk images

-

Starting FAI 5.4 it’s now possible to build a disk image for -different architectures than the host is running. For example you can -build an image for 64-bit ARM architecture (aarch64) on a host running on amd64 -architecture. Here are the steps do to:

+

Construire des images disque d’architecture différente (cross-architecture)

+

À partir de FAI 5.4 il devient possible de construire une image disque pour +des architectures différentes de l’hôte qui est utilisé. Par exemple on peut +construire une image pour une architecture ARM 64-bit (aarch64) sur un hôte qui fonctionne +sur une architecture amd64. Voici les étapes successives :

# apt install qemu-system-arm qemu-user-static fai-server fai-setup-storage fai-doc qemu-utils
@@ -3399,39 +3400,42 @@ 

Then you can run qemu as a normal user:

+

Ensuite on peut lancer qemu en tant qu’utilisateur ordinaire :

> qemu-system-aarch64 -m 1000 -M virt,gic_version=3 -cpu cortex-a57 -drive file=arm64.raw,if=virtio,index=1 -no-reboot -nographic -name ARM64 -net nic,name=eth0,model=virtio -net user,name=eth0,-kernel vmlinuz -initrd initrd -append "console=ttyAMA0 rw ip=dhcp root=/dev/vda1 net.ifnames=0"
-

This works similar for other architectures. -Keep in mind, that qemu network setup will have poor performance if -not using the virtio driver as above or tap devices.

-
+

Ça fonctionne de même pour d’autres architectures. +Il faut garder en tête que les réglages réseau de qemu ont des performances dégradées si +on n’utilise pas le pilote virtio comme ci-dessus ou des TAPs réseaux.

+

On peut trouver les fichiers de base pour plusieurs architectures à +https://fai-project.org/download/basefiles/, ou utiliser mk-basefile pour +créer son fichier propre.

-

FAI rescue system

-

If you set the variable $FAI_ACTION to sysinfo (for e.g. by using -fai-chboot -S), the client will not install a new system, but will -collect a lot of system information. -If you set $FAI_ACTION to inventory you will only get a few -hardware information. -Both actions can be used for FAI as a rescue system.

-

Type ctrl-c to get a shell or use Alt-F2 or Alt-F3 and you will get -another console terminal, if you have added createvt to $FAI_FLAGS.

-

You now have a running Linux system on the install client without -using the local hard disk. Use this as a rescue system if your local -disk is damaged or the computer can’t boot properly from hard -disk. You will get a shell and you can execute various commands -(dmesg, lsmod, df, lspci, …). Look at the log file in -/tmp/fai. There you can find much information about the boot -process.

-

FAI mounts all file systems it finds on the local disks read only. It -also tells you on which partition a file /etc/fstab exists. When -only one file system table is found, the partitions are mounted -according to this information. Here’s an example:

+

Système de sauvetage FAI

+

Si vous assignez à la variable $FAI_ACTION la valeur sysinfo (par exemple +en utilisant fai-chboot -S), le client n’installera pas de nouveau +système, mais collectera beaucoup d’informations système. Si vous +assignez à $FAI_ACTION la valeur inventory, vous ne recevrez que +quelques informations sur le matériel. Les deux actions peuvent être +utilisées pour FAI comme un système de sauvetage.

+

Tapez ctrl-c pour obtenir un shell ou utilisez Alt-F2 ou Alt-F3 et +vous obtiendrez une autre console de terminal, si vous avez ajouté +createvt à $FAI_FLAGS.

+

Vous voilà maintenant avec un système Linux qui fonctionne sur le client +d’installation sans utiliser le disque dur local. Utilisez-le comme +système de secours si votre disque local est endommagé ou si +l’ordinateur ne peut pas démarrer correctement à partir du disque dur. +Vous obtiendrez un shell et vous pouvez exécuter diverses commandes +(dmesg, lsmod, df, lspci, …). Regardez le fichier +journal dans /tmp/fai. Vous y trouverez de nombreuses informations +sur le processus d’amorçage.

+

FAI monte tous les systèmes de fichiers qu’il trouve sur les disques +locaux en lecture seule. Il vous indique également sur quelle partition +un fichier /etc/fstab existe. Lorsqu’une seule table de système de +fichiers est trouvée, les partitions sont montées selon ces +informations. Voici un exemple :

demohost:~# df -h
@@ -3447,77 +3451,83 @@ 

FAI rescue system /dev/vda1 459M 53M 378M 13% /target/boot /dev/mapper/vg1-home 1.4G 72K 1.3G 1% /target/home

-

This method can be used as a rescue environment! If you need a file -system with read-write access use the rwmount command:

+

Cette méthode peut être utilisée comme un environnement de sauvetage ! Si +vous avez besoin d’un système de fichiers avec accès en +lecture/écriture, utilisez la commande rwmount :

demohost# rwmount /target/home
-

FAI without NFS

-

To boot into FAI and begin the installation sequence -without using the NFS protocol, you boot the client machine using PXE as -usual and then retrieve an image containing the nfsroot via http.

-

To create an image, use fai-cd’s -S argument and -M to avoid setting up -a partial mirror within the image.

+

FAI sans NFS

+

Pour démarrer dans FAI et commencer la séquence d’installation sans +utiliser le protocole NFS, vous démarrez la machine cliente en utilisant +PXE comme d’habitude, puis récupérez une image contenant le nfsroot via +http.

+

Pour créer une image, utilisez l’argument -S de fai-cd et -M pour éviter de créer +un miroir partiel à l’intérieur de l’image.

faiserver# fai-cd -M -S squash.img
-

Move this image to a directory from which it can be requested via http -(usually a directory served by the webserver)

-

To now request the squashfs image, add the following to your kernel -command line, e.g. in your pxelinux configuration file for the client -with fai-chboot.

+

Déplacez cette image vers un répertoire à partir duquel elle peut être +demandée via http (généralement un répertoire accessible par le serveur +web)

+

Pour demander alors l’image squashfs, ajoutez ce qui suit à votre +ligne de commande du noyau, par exemple dans votre fichier de configuration +pxelinux pour le client avec fai-chboot.

root=live:http://faiserver/cskoeln/squash.img FAI_CONFIG_SRC=file:///var/lib/fai/config
-

Replace faiserver with the domain name or IP of the machine your -squash image is served from.

+

Remplacez faiserver par le nom de domaine ou l’IP de la machine de laquelle +votre image de squash est servie.

-

Installing other distributions using a Debian nfsroot

-

You can install all sorts of Linux distributions from a single Debian -nfsroot. Therefore you have to create a base.tar.xz of the distribution -you like to install and place it into the basefiles directory. Then -name it UBUNTU2204.tar.xz for example. An install client which belongs -to the class UBUNTU2204 then extracts this base file into its empty -file system. Additionally you have to adjust the sources.list or -similar configuration files which are needed for specifying the -location of the package repository.

-

The tool rinse(8) is used for creating base files for distribution -like Rocky Linux, CentOS, openSUSE or Fedora. -Some basefiles can be downloaded from +

Installation d’autres distributions à l’aide d’un nfsroot Debian

+

Vous pouvez installer toutes sortes de distributions Linux à partir d’un +seul nfsroot Debian. Par conséquent, vous devez créer un fichier +base.tar.xz de la distribution que vous souhaitez installer et le placer +dans le répertoire basefiles. Puis nommez-le UBUNTU2204.tar.xz par +exemple. Un client d’installation appartenant à la classe UBUNTU2204 +extrait ensuite ce fichier de base dans son système de fichiers vide. De +plus, vous devez ajuster les sources.list ou les fichiers de +configuration similaires nécessaires pour spécifier l’emplacement du +dépôt de paquets.

+

L’outils rinse(8) est utilisé pour créer des fichiers de base pour +des distributions comme Rocky Linux, CentOS, openSUSE, ou Fedora. +Certains fichiers de base peuvent être téléchargés à partir de https://fai-project.org/download/basefiles/.

-

The script mk-basefile in -/usr/share/doc/fai-doc/examples/simple/basefiles/ helps creating -this base files.

+

Le script mk-basefile dans +/usr/share/doc/fai-doc/examples/simple/basefiles/ aide à créer ces +fichiers de base.

-

Creating chroot and virtualization environments

-

If you have to create some chroot environments, or a virtualization -environment where you neither can nor want to run a normal Debian -Installer in to get to a working system (for example, Xen guest -domains), there is the FAI action dirinstall. -By calling

+

Création d’environnements chroot et de virtualisation

+

Si vous devez créer certains environnements chroot, ou un environnement +de virtualisation où vous ne pouvez ni ne voulez exécuter un programme +d’installation Debian normal pour accéder à un système opérationnel (par +exemple, les domaines hôtes Xen), il y a l’action FAI dirinstall. En +appelant :

faiserver# fai <options> dirinstall <target-directory>
-

and using either the option -c <classes> or -N you get a FAI -installation, without the partitioning action, right into the target -directory. The host name for the target installation can be specified -using -u <host-name>

-

This, for example, can be used to combine FAI with the tool -xen-tools, which helps you to build Xen guest domains. xen-tools -are very nice for generating configuration files and block devices for -new guests based on simple commands and/or configuration files, but -they can only assign one role per installation for customization. -FAI-users need and want more, as they are used to have the class -system. They get them even in xen-tools installations, by using the -following code as a xen-tools role script:

+

et en utilisant l’option -c <classes> ou -N vous obtenez une +installation FAI, sans l’action de partitionnement, directement dans le +répertoire cible. Le nom d’hôte de la cible d’installation peut être +spécifié à l’aide de -u <nom-d-hote>

+

On peut utiliser cela, par exemple, pour combiner FAI avec les outils +xen-tools, qui vous aident à construire des domaines invités Xen. +Les xen-tools sont très agréables pour générer des fichiers de configuration +et bloquer des périphériques pour de nouveaux invités sur la base de +commandes simples et/ou des fichiers de configuration, mais ils ne +peuvent assigner qu’un seul rôle par installation pour la +personnalisation. Les utilisateurs de FAI ont besoin de plus et en veulent, car +ils ont l’habitude d’avoir le système de classes. Ils peuvent y arriver +même dans les installations xen-tools, en utilisant le code suivant en +tant que rôle xen-tools script :

#!/bin/sh
@@ -3526,55 +3536,57 @@ 

-

Then, you should set the variable install=0 in the config of -xen-tools for that host.

+

Ensuite, il faut définir la variable install=0 dans la configuration +xen-tools pour cet hôte.

-

Using FAI for updates

-

FAI can also do updates of already running systems, without a -re-installation from scratch. -This is called softupdate. A FAI softupdate skips the tasks which are -not suitable for updating a running system, like partitioning the -hard disks and creating file systems. Instead, it only executes the -tasks for updating and installing software packages and calling the -customization scripts.

-

To run a softupdate call:

+

Utilisation de FAI pour les mises à jour

+

FAI peut également effectuer des mises à jour de systèmes déjà en cours +d’exécution, sans réinstallation à partir de zéro. C’est ce qu’on +appelle softupdate. Un FAI softupdate ignore les tâches qui ne sont pas +adaptées à la mise à jour d’un système en cours d’exécution, comme le +partitionnement des disques durs et la création de systèmes de fichiers. +Au lieu de cela, il exécute uniquement les tâches de mise à jour et +d’installation des paquets logiciels et l’appel des scripts de +personnalisation.

+

Pour lancer un softupdate :

# fai -v -s nfs://faiserver/srv/fai/config softupdate
-

By default, a softupdate uses the list of classes defined during the -initial installation. Make sure to set the variable $LOGSERVER (done -in a class/*.var file) if FAI should save the log files to a remote -machine.

-

It’s up to you, how to start a softupdate on a bigger number of hosts. -You may do the softupdate on a regular basis via cron or you can use tools -like clusterssh(1) to start a softupdate via a push on a list of -hosts.

-

Keep in mind, that the customization scripts are run every time you do -a softupdate. That means, they have to be idempotent i.e. the result -of their operation should always produce the same result, even when -they run more than once.

-

For example appending a line to a file must not done via this code:

+

Par défaut, un softupdate utilise la liste des classes définies lors de +l’installation initiale. Assurez-vous de définir la variable +$LOGSERVER (ça se fait dans un fichier class/*.var) si FAI doit +enregistrer les fichiers journaux sur une machine distante.

+

C’est à vous de décider, comment démarrer un softupdate sur un plus grand nombre +d’hôtes. Vous pouvez faire le softupdate sur régulièreent via cron +ou vous pouvez utiliser des outils comme clusterssh(1) pour démarrer +un softupdate via un push sur une liste d’hôtes.

+

Gardez à l’esprit que les scripts de personnalisation sont exécutés +chaque fois que vous faites un softupdate. Cela signifie qu’ils doivent +être idempotents, c’est-à-dire que le résultat de leur fonctionnement +doit toujours produire le même résultat, même lorsqu’ils fonctionnent +plus d’une fois.

+

Par exemple, l’ajout d’une ligne à un fichier ne doit pas se faire via ce code :

$ echo "some strings" >> /etc/fstab
-

Instead use the command ainsl(1) in a shell script or use cfengine’s -function AppendIfNoSuchLine.

-

All commands in the customization script must be capable of modifying -the target file system wether it’s available in /target during the -initial installation or wether it’s the normal file system relative to -/ during softupdate.

-

Here are some variable that help writing these scripts:

+

Au lieu de ça, utilisez la commande ainsl(1) dans un script shell ou utilisez la fonction +de cfengine AppendIfNoSuchLine.

+

Toutes les commandes du script de personnalisation doivent être capables +de modifier le système de fichiers cible qui’il soit disponible dans +/target lors de l’installation initiale ou qu’il soit le système de +fichiers normal relatif à / pendant le softtupdate.

+

Voici quelques variables qui aident à écrire ces scripts :

$target

-Points to the root directory of the client, which -is /target during installation and / during a softupdate. +Pointe vers le répertoire racine du client, qui est /target pendant +l’installation et / pendant un softupdate.

@@ -3582,8 +3594,8 @@

Using F

-It’s the same value as $target. For historic reasons -we have both these variables in FAI. +C’est la même valeur que $target. Pour des raisons historiques, +on a ces deux variables dans FAI.

@@ -3591,9 +3603,10 @@

Using F

-In case of the installation this is an alias for chroot $target in case of -softupdate it’s just empty. You can prepend this to commands if you need to run a -command inside the clients target file system via chroot. +Dans le cas de l’installation, il s’agit d’un alias pour chroot $target +en cas de softupdate, c’est juste vide. Vous pouvez ajouter +ceci avant les commandes si vous avez besoin d’exécuter une commande dans le +système de fichiers cible des clients via chroot.

@@ -3601,75 +3614,77 @@

Using F

-If you need to call code depending on the FAI action performed, you -can use this variable. It contains the currently executed action: -install, softupdate, dirinstall, sysinfo, inventory or your -own defined action. +Si vous devez appeler le code en fonction de l’action FAI effectuée, +vous pouvez utiliser cette variable. Elle contient l’action actuellement +exécutée: install, softupdate, dirinstall, sysinfo, +inventory ou votre propre action définie.

-

How to install 32-bit OS from a 64-bit OS

-

To install a computer with a 32-bit OS, you need an i386 nfsroot. -Creating this 32-bit nfsroot on an install server running amd64 is -quite simple. Install and set up the FAI packages. Then copy your FAI -config files to a new subdirectory.

+

Comment installer un système d’exploitation 32 bits à partir d’un système d’exploitation 64 bits

+

Pour installer un ordinateur avec un système d’exploitation 32 bits, +vous avez besoin d’un nfsroot i386. La création de ce nfsroot 32 bits +sur un serveur d’installation qui fonctionne sous amd64 est simple. +Installez et configurez les paquets FAI. Copiez ensuite vos fichiers de +configuration FAI dans un nouveau sous-répertoire.

faiserver# cp -a /etc/fai /etc/fai-i386
-

Edit the variable $FAI_DEBOOTSTRAP_OPTS in -/etc/fai-i386/nfsroot.conf and add the option --arch -i386. Also choose a different directory for your new nfsroot. Here -are the two lines after editing.

+

Modifiez la variable $FAI_DEBOOTSTRAP_OPTS dans +/etc/fai-i386/nfsroot.conf et ajoutez l’option --arch i386. +Choisissez également un répertoire différent pour votre nouveau nfsroot. +Voici les deux lignes après l’édition.

NFSROOT=/srv/fai/nfsroot-i386
 FAI_DEBOOTSTRAP_OPTS="--arch i386 --exclude=info --include=aptitude""
-

Now call fai-make-nfsroot which creates the 32-bit nfsroot in +

Appelez maintenant fai-make-nfsroot qui crée le nfsroot 32 bits dans /srv/fai/nfsroot-i386

faiserver# fai-make-nfsroot -v -C/etc/fai-i386
-

Creating a partial mirror using fai-mirror(1) that is needed for -a bootable CD or USB stick is also possible on a different architecture. -You have to specify the architecture when calling fai-mirror.

+

La création d’un miroir partiel utilisant fai-mirror(1) qui est nécessaire à +un CD amorçable ou une clé USB est également possible sur une +architecture différente. Vous devez spécifier l’architecture lors de +l’appel de fai-mirror.

$ fai-mirror -m800 -B -a i386 -v -cDEFAULT,DEBIAN,FAIBASE,I386 /srv/mirror-i386
-

That’s all!

+

Et voilà !

-

Aborting the installation when an error occurs

-

Every task and hook can call the function task_error -to send an error value to the installation. This error will appear in -the log file and can be shown in the fai-monitor-gui(1). -The error value is also checked against the variable $STOP_ON_ERROR -which is set to 700 by default. If the error value -is greater than $STOP_ON_ERROR the installation will stop -immediately. In a hook, just add a call like this:

+

Arrêt d’urgence de l’installation quand une erreur se produit

+

Chaque tâche, chaque hook peut appeler la fonction task_error +pour envoyer une valeur d’erreur à l’installation. Cette erreur apparaîtra dans +le fichier de journalisation et peut être visionnée dans le fai-monitor-gui(1). +La valeur de l’erreur est aussi examinée en tenant compte de la variable $STOP_ON_ERROR +qui est réglée à 700 par défaut. Si la valeur d’erreur est +supérieure à $STOP_ON_ERROR, l’installation s’arrêtera +immédiatment. Dans un hook, ajoutez simplement un appel comme celui-ci :

-
task_error <value>
+
task_error <valeur>
-

It is comfortable to call task_error with $? as second parameter, for -e.g. if you want to set an error value of 123 use this

+

C’est commode d’appeler task_error avec $? comme deuxième paramètre, par +exemple si on veut émettre une valeur d’erreur de 123 on peut faire ainsi

<some command>
 task_error 123 $?
-

Then the task error is only set if the preceding command failed with -some error. The same syntax can be used by the scripts in the class -subdirectory ending in .sh.

-

A special case are scripts inside the class/ subdirectory that does -not end in .sh. In those scripts you have to call task_error with 1 as -third parameter. As an example you can use those two variants for -setting the value to 123

+

Alors, l’erreur de tâche n’est mise en place que si la commande précédente a échoué avec +une certaine erreur. La même syntaxe peut être utilisée par les scripts dans le sous-répertoire +de classe qui se terminent en .sh.

+

Un cas particulier est celui des scripts dans le sous-répertoire class/ qui ne se termine +pas en .sh. Dans ces scripts il faut appeler task_error avec 1 comme +troisième paramètre. Par exemple on peut utiliser deux variantes pour +régler la valeur à 123

task_error 123 $? 1
@@ -3679,59 +3694,63 @@

task_error 123 1 1

-

The latter command always sets the task error to 123 regardless of -the value of $?. If the error value is greater than $STOP_ON_ERROR, -the installation will abort immediately.

-

The error values are grouped into four categories

+

La dernière commande met toujours l’erreur de tâche à 123 sans tenir compte de $?. +Si la valeur d’erreur est supérieure à $STOP_ON_ERROR, +l’installation sera immédiatement stoppée.

+

Les valeurs d’erreur sont regroupées dans quatre catégories

-
normal or info messages:       1xx, 2xx
-warnings:                      3xx, 4xx
-minor errors:                  5xx, 6xx
-errors:                        7xx, 8xx
+
normale ou messages d'information :   1xx, 2xx
+avertissements :                      3xx, 4xx
+erreurs mineures :                    5xx, 6xx
+erreurs :                             7xx, 8xx
-

The fai-monitor-gui has 4 different icons for these error categories.

+

Le fai-monitor-gui possède 4 icônes différentes pour ces catégories d’erreur.

-

Various hints and details

+

Divers conseils et détails

-

The list of tasks

-

Most tasks of the installation are defined as subroutines which are -defined in /usr/lib/fai/subroutines (e.g. task_instsoft). -Some are external shell scripts located in /usr/lib/fai/. -They are called via a superior subroutine called task. -This subroutine calls hooks if available and then calls the task (defined as -task_<name>). A task and its hooks can be -skipped on demand by using the command skiptask().

-

Now follows the description of all tasks, listed in the order -they are executed.

+

La liste des tâches

+

La plupart des tâches de l’installation sont définies comme des +sous-routines qui sont définies dans /usr/lib/fai/subroutines (par +exemple task_instsoft). Certaines sont des scripts shell externes +situés dans /usr/lib/fai/. Elles sont appelées via un sous-programme +supérieur nommé task. Ce sous-programme appelle les hooks si +disponibles, puis appelle la tâche (définie comme task<nom>_). Une +tâche et ses hooks peuvent être ignorés à la demande en utilisant la +commande skiptask().

+

Voici maintenant la description de toutes les tâches, énumérées dans +l’ordre dans lequel elles sont exécutées.

confdir

-The kernel appended parameters may define variables, the syslog daemon is -started. Network parameters are fetched from a DHCP -server and are stored in boot.log. The DNS resolver configuration file is created. + Les paramètres ajoutés au noyau peuvent définir des variables, le + démon syslog est démarré. Les paramètres de réseau sont récupérés d’un serveur DHCP + et sont enregistrés dans boot.log. La configuration pour la résolution DNS est créée. +
+ L’emplacement de l’espace de configuration est défini par la variable + $FAI_CONFIG_SRC. +
+ Ensuite, le fichier $FAI/hooks/subroutines est sourcé s’il existe. + En utilisant ce fichier, vous pouvez définir vos propres + sous-programmes ou remplacer la définition des sous-programmes de FAI.

-

The location of the configuration space is defined by the variable -$FAI_CONFIG_SRC.

-

After that, the file $FAI/hooks/subroutines is sourced if it -exists. Using this file, you can define your own subroutines or -override the definition of FAI’s subroutines.

setup

-This task sets the system time, all $FAI_FLAGS are defined and two -additional virtual terminals are opened on demand. A secure shell -daemon is started on demand for remote logins. + Cette tâche définit l’heure du système, tous les $FAI_FLAGS sont + définis et deux terminaux virtuels supplémentaires sont ouverts à la + demande. Un démon ssh est lancé à la demande pour les + connexions à distance.

@@ -3739,10 +3758,11 @@

The list of tasks

-Calls fai-class(1) to define classes using scripts and files in -$FAI/class and classes from /tmp/fai/additional-classes and the -variable $ADDCLASSES. The list of all defined classes is stored in -the variable $classes and saved to /tmp/fai/FAI_CLASSES. + Appels de fai-class(1) pour définir des classes à l’aide de scripts + et de fichiers dans $FAI/class et classes de + /tmp/fai/additional-classes et la variable $ADDCLASSES. La liste + de toutes les classes définies est stockée dans la variable + $classes et enregistrée dans /tmp/fai/FAI_CLASSES.

@@ -3750,9 +3770,9 @@

The list of tasks

-Sources all files $FAI/class/*.var for every defined class. If a -hook has written some variable definitions to the file -$LOGDIR/additional.var, this file is also sourced. + Source tous les fichiers $FAI/class/*.var pour chaque classe + définie. Si un hook a écrit quelques définitions de variables dans le + fichier $LOGDIR/additional.var, ce fichier est également sourcé.

@@ -3760,12 +3780,12 @@

The list of tasks

-Depending on the value of $FAI_ACTION this subroutine decides which -action FAI should perform. The default available actions are: -sysinfo, install, inventory, dirinstall and softupdate. If $FAI_ACTION has another -value, a user defined action is called if a file -$FAI/hooks/$FAI_ACTION exists. So you can easily define your own -actions. + En fonction de la valeur de $FAI_ACTION, ce sous-programme décide + de l’action FAI à exécuter. Les actions disponibles par défaut sont : + sysinfo, install, inventory, dirinstall et softupdate. Si + $FAI_ACTION a une autre valeur, une action définie par + l’utilisateur est appelée si un fichier $FAI/hooks/$FAI_ACTION + existe. Ainsi, vous pouvez facilement définir vos propres actions.

@@ -3773,11 +3793,12 @@

The list of tasks

-Called when no installation is performed but the action is -sysinfo. It shows information about the detected hardware and mounts -the local hard disks read only to /target/partitionname or with -regard to a fstab file found inside a partition. Log files are -stored to the install server. + Appelée lorsque aucune installation n’est effectuée mais que l’action + est sysinfo. Elle affiche des informations sur le matériel détecté et + monte les disques durs locaux en lecture seule sur + /target/partitionname ou en tenant compte d’un fichier fstab trouvé à + l’intérieur d’une partition. Les fichiers journaux sont stockés sur le + serveur d’installation.

@@ -3785,7 +3806,7 @@

The list of tasks

-A short list of system information is printed. + Une courte liste des informations système est imprimée.

@@ -3793,12 +3814,13 @@

The list of tasks

-This task controls the installation sequence. You will hear three -beeps before the installation starts. The major work is to call other -tasks and to save the output to /tmp/fai/fai.log. If you have any -problems during installation, look at all files in /tmp/fai/. You -can find examples of the log files -at https://fai-project.org/logs/. + Cette tâche contrôle la séquence d’installation. Vous entendrez trois + bips avant le début de l’installation. Le travail principal consiste à + appeler d’autres tâches et à enregistrer la sortie dans + /tmp/fai/fai.log. Si vous avez des problèmes pendant l’installation, + regardez tous les fichiers dans /tmp/fai/. Vous trouverez des + exemples de fichiers journaux à l’adresse + https://fai-project.org/logs/.

@@ -3806,8 +3828,8 @@

The list of tasks

-Install into a directory, not onto a local disk. Use this for creating -chroot environments. + Installe dans un répertoire, et non pas sur un disque local. + Utilisez-le pour créer des environnements chroot.

@@ -3815,9 +3837,10 @@

The list of tasks

-This task, executed inside a running system via the fai(8) command -line interface, performs a softupdate. See chapter [softupdate] for -details. + Cette tâche, exécutée à l’intérieur d’un système en cours d’exécution + via la commande en ligne fai(8), effectue un + softupdate. Voir le chapitre [softupdate] pour plus + de détails.

@@ -3825,11 +3848,12 @@

The list of tasks

-Calls setup-storage(8) to partition the hard -disks and to create file systems. The task writes variable definitions -for the root and boot partition and device ($ROOT_PARTITION, -$BOOT_PARTITION, $BOOT_DEVICE) to /tmp/fai/disk_var.sh and creates -a fstab file for the new system. + Appelle setup-storage(8) pour partitionner les disques durs et + créer des systèmes de fichiers. La tâche écrit des définitions de + variables pour les partitions et périphériques racine et de démarrage + ($ROOT_PARTITION, $BOOT_PARTITION, $BOOT_DEVICE) dans + /tmp/fai/disk_var.sh et crée un fichier fstab pour le nouveau + système.

@@ -3837,8 +3861,8 @@

The list of tasks

-Mounts the created partitions according to the created -/tmp/fai/fstab file relative to $FAI_ROOT. + Monte les partitions créées en fonction du fichier /tmp/fai/fstab + créé par rapport à $FAI_ROOT.

@@ -3846,15 +3870,16 @@

The list of tasks

-Extracts a minimal system after that a chroot can be made into it. By -default the base tar file /var/tmp/base.tar.xz will be -extracted. Also files matching a class name in $FAI/basefiles/ are used for unpacking a -different tar file depending on classes defined. This can be used for -installing different Linux distributions than the one used for -creating the nfsroot. The default file base.tar.xz is a snapshot of a -basic Debian system created by debootstrap(8). -This task uses the variable FAI_BASEFILEURL for fetching the base -file via FTP, HTTPS or HTTP if it’s defined. + Extrait un système minimal après lequel un chroot puisse y être + introduit. Par défaut, le fichier tar de base /var/tmp/base.tar.xz sera + extrait. Les fichiers correspondant à un nom de classe dans + $FAI/basefiles/ sont également utilisés pour décompresser un autre + fichier tar selon les classes définies. Cela peut être utilisé pour + installer des distributions Linux différentes de celles utilisées pour + créer le nfsroot. Le fichier par défaut base.tar.xz est un + instantané d’un système Debian de base créé par debootstrap(8) + Cette tâche utilise la variable FAI_BASEFILEURL pour récupérer le + fichier de base via FTP, HTTPS ou HTTP si celle-ci est définie.

@@ -3862,7 +3887,8 @@

The list of tasks

-Calls fai-debconf(1) to set the values for the debconf preseeding database. + Appelle fai-debconf(1) pour définir les valeurs de la base de + données de pré-ensemencement de debconf.

@@ -3870,10 +3896,10 @@

The list of tasks

-Prepare access to the package repository by preparing the apt -configuration. This can also add repository keys -in a class based manner from files like CLASSNAME.gpg -in the directory package_config. + Prépare l’accès au dépôt de paquets en préparant la + configuration apt. Cela peut également ajouter des clés de dépôts + en tenant compte des classes à partir de fichiers comme + CLASSNAME.gpg dans le répertoire package_config.

@@ -3881,10 +3907,11 @@

The list of tasks

-Updates the base packages of the new system and updates the list of -available packages. It also fakes some commands (called diversions) -inside the new installed system using dpkg-divert(8), so no daemons -will be started during the installation. + Met à jour les paquets de base du nouveau système et met à jour la + liste des paquets disponibles. Il contrefait également certaines + commandes (appelées diversions) à l’intérieur du nouveau système + installé à l’aide de dpkg-divert(8), de sorte qu’aucun démon ne + soit démarré pendant l’installation.

@@ -3892,8 +3919,8 @@

The list of tasks

-Installs the desired software packages using class files in -$FAI/package_config/. + Installe les paquets logiciels souhaités en utilisant des fichiers de classe + dans $FAI/package_config/.

@@ -3901,8 +3928,8 @@

The list of tasks

-Calls scripts in $FAI/scripts/ and its subdirectories for every -defined class. + Appelle les scripts dans $FAI/scripts/ et ses sous-répertoires pour + chaque classe définie.

@@ -3910,8 +3937,8 @@

The list of tasks

-Calls test scripts in $FAI/tests/ and its subdirectories for every -defined class. + Appelle les scripts de test dans $FAI/tests/ et ses sous-répertoires + pour chaque classe définie.

@@ -3919,8 +3946,9 @@

The list of tasks

-Unmounts all file systems in the new installed system and removes -diversions of files using the command fai-divert. + Démonte tous les systèmes de fichiers dans le nouveau système installé + et supprime les diversions de fichiers à l’aide de la commande + fai-divert.

@@ -3928,10 +3956,11 @@

The list of tasks

-Changes the PXE configuration for a host on the install server which -indicates which PXELINUX configuration to load on the next boot from network -card via TFTP. Therefore the fai-chboot(8) command is executed -remotely on the install server. + Modifie la configuration PXE d’un hôte sur le serveur d’installation, + qui indique quelle configuration PXELINUX doit être chargée lors de la + prochaine initialisation à partir de la carte réseau via TFTP. Par + conséquent, la commande fai-chboot(8) est exécutée à distance sur + le serveur d’installation.

@@ -3939,8 +3968,9 @@

The list of tasks

-Saves log files to local disk and to the account $LOGUSER on -$LOGSERVER (defaults to the install server). + Enregistre les fichiers journaux sur le disque local et sur le compte + $LOGUSER sur $LOGSERVER (par défaut sur le serveur + d’installation).

@@ -3948,97 +3978,102 @@

The list of tasks

-Wait for background jobs to finish (e.g. emacs compiling lisp files) -and automatically reboots the install clients or waits for manual -input before reboot. + Attend que les travaux en arrière-plan se terminent (par exemple, + qu’emacs compile des fichiers lisp) puis redémarre automatiquement les + clients d’installation ou attend la saisie manuelle avant le + redémarrage.

-

Automated tests

-

After the customization scripts are executed, FAI will execute some -tests if available. Using these test, you can check for errors of the -installation. Test scripts are called via -fai-do-scripts(1) and should append its messages to -$LOGDIR/test.log. A Perl module including some useful subroutines -can be found in Faitest.pm. A test can also define a new class for -executing another tests during next boot via the variable -$ADDCLASSES.

+

Tests automatisés

+

Après l’exécution des scripts de personnalisation, FAI exécutera +certains tests si disponibles. En utilisant ces tests, vous pouvez +vérifier les erreurs de l’installation. Les scripts de test sont appelés +via fai-do-scripts(1) et doivent ajouter leurs messages à +$LOGDIR/test.log. Un module Perl comprenant des sous-routines utiles +peut être trouvé dans Faitest.pm. Un test peut également définir une +nouvelle classe pour exécuter d’autres tests lors du prochain démarrage +via la variable $ADDCLASSES.

-

Autodiscover

-

In FAI 5.0 we released a feature that allows clients to search for the -faiserver in their respective subnetwork. This lifts the necessity of -having to collect every client’s MAC address and configuring the DHCP -daemon.

-

This is done by booting from a small FAI autodiscover bootmedium (CD, -USB, etc.), which can be created via the command:

+

Découvrir automatiquement

+

Dans FAI 5.0, nous avons publié une fonctionnalité qui permet aux +clients de rechercher le faiserver dans leur sous-réseau respectif. Cela +soulève la nécessité de récupérer l’adresse MAC de chaque client et de +configurer le démon DHCP.

+

Cela se fait en démarrant à partir d’une petit media vif autodiscover FAI +(CD, USB, etc.), qui peut être créé via la commande :

faiserver# fai-cd -A autodiscover.iso
-

The image is roughly 25MB in size and scans the subnet for -a FAI server. By default it shows a menu with all profiles available -in the configuration space in the same manner as the menu flag -does. From this menu, you can select the installation type you wish to -perform.

-

For the clients to find the faiserver, the faiserver must run -fai-monitor.

+

L’image a une taille d’environ 25 Mo et analyse le sous-réseau d’un +serveur FAI. Par défaut, il affiche un menu avec tous les profils +disponibles dans l’espace de configuration de la même manière que +le fait l’option menu. Dans ce menu, vous pouvez sélectionner le type +d’installation que vous souhaitez effectuer.

+

Pour que les clients puissent trouver le faiserver, le faiserver doit +lancer fai-monitor.

-

Changing the boot device

-

Changing the boot sequence is normally done in the BIOS setup. But you -can’t change the BIOS from a running Linux system.

-

So, the boot sequence of the BIOS will remain unchanged and -your computer should always boot first from its network card and the -second boot device should be the local disk. Then you can -change the boot device of the client by creating different PXELINUX -configurations. This will define if an installation -should be performed, or if the client should to boot from local -disk. This is done using fai-chboot(8).

+

Modification du périphérique d’amorçage

+

La modification de la séquence d’amorçage s’effectue normalement dans la +configuration du BIOS. Mais vous ne pouvez pas changer le BIOS d’un +système Linux en cours d’exécution.

+

Ainsi, la séquence d’amorçage du BIOS restera inchangée et votre +ordinateur devrait toujours démarrer en premier à partir de sa carte +réseau et le deuxième périphérique d’amorçage devrait être le disque +local. Ensuite, vous pouvez changer le périphérique d’amorçage du client +en créant différentes configurations PXELINUX. Cela définira si une +installation doit être effectuée, ou si le client doit démarrer à partir +du disque local. Cela se fait à l’aide de fai-chboot(8).

-

How to create a local Debian mirror

-

The utility mkdebmirror
[You can find the script in -/usr/share/doc/fai-doc/examples/utils/]
can be used for creating -your own local Debian mirror. This script uses debmirror(1). A partial Debian mirror for amd64 architecture for -Debian 11 and 12 (aka bullseye and bookworm) without the source packages needs about -180GB of disk space. -Accessing the mirror via HTTP will be the -default way in most cases. To see more output from the script call -mkdebmirror -v. A root account is not necessary to create and -maintain the Debian mirror.

-

To use HTTP access to the local Debian mirror, install a web server -and create a symlink to the local directory where your mirror is -located:

+

Comment créer un miroir Debian local

+

Le script utilitaire mkdebmirror
[On peut trouver ce script dans +/usr/share/doc/fai-doc/examples/utils/]
peut +être utilisé pour créer votre propre miroir Debian local. Ce script +utilise la commande debmirror(1). Un miroir Debian partiel pour +l’architecture amd64 pour Debian 11 et 12 (noms de code bullseye et bookworm) sans les +paquets source nécessite environ 180 Go d’espace disque. L’accès au miroir +via HTTP sera la méthode par défaut dans la plupart des cas. Pour +afficher plus de résultats à partir du script, appelez +mkdebmirror -v. Un compte root n’est pas nécessaire pour créer et +maintenir le miroir Debian.

+

Pour utiliser l’accès HTTP au miroir Debian local, installez un serveur +web et créez un lien symbolique vers le répertoire local où se trouve +votre miroir :

faiserver# apt-get install apache2
 faiserver# ln -s /files/scratch/debmirror /var/www/html/debmirror
-

Create a file sources.list(5) in /etc/fai/apt which gives access -to your Debian mirror. Also add the IP-address of the -HTTP server to the variable $NFSROOT_ETC_HOSTS in -nfsroot.conf if the install clients have no DNS resolving.

+

Créez un fichier sources.list(5) dans /etc/fai/apt qui donne accès +à votre miroir Debian. Ajoutez également l’adresse IP du serveur HTTP à +la variable $NFSROOT_ETC_HOSTS dans nfsroot.conf si les clients +d’installation n’ont pas de résolution DNS.

-

Small hints

+

Petits conseils

  • -When using HTTP access to a Debian mirror, the local /var partition -on all install clients must be big enough to keep the downloaded -Debian packages. Do not try with less than 250 Mbytes unless you know -why. You can limit the number of packages installed at a time with the -variable $MAXPACKAGES. +Lorsque vous utilisez l’accès HTTP à un miroir Debian, la partition +locale /var sur tous les clients d’installation doit être suffisamment +grande pour conserver les paquets Debian téléchargés. N’essayez pas avec +moins de 250 Moctets à moins que vous sachiez pourquoi. Vous pouvez +limiter le nombre de paquets installés à la fois avec la variable +$MAXPACKAGES.

  • -You can remove the red logo on the install client by simply calling -reset once. If will also not appear if you create a file using this -command on the install server: +Vous pouvez supprimer le logo rouge sur le client d’installation en +appelant simplement une fois reset. Il ne s’affichera pas si vous +créez un fichier à l’aide de cette commande sur le serveur +d’installation :

@@ -4049,21 +4084,21 @@

Small hints

  • -A list of variables used by FAI can be found at +Une liste des variables utilisées par FAI peut être trouvée à https://wiki.fai-project.org/index.php/Variables.

  • -You can shorten some customization scripts by using one single fcopy -command fcopy -r /. +Vous pouvez raccourcir certains scripts de personnalisation en +utilisant une seule commande fcopy fcopy -r /.

  • -If you rebuild the nfsroot, you will create a new ssh host key inside -the nfsroot. Then logging in to an install client may fail, because -the host key changes. You can use this: +Si vous reconstruisez le nfsroot, vous allez créer une nouvelle clé +hôte ssh dans le nfsroot. La connexion à un client d’installation peut +échouer, car la clé hôte change. Vous pouvez utiliser ceci :

@@ -4074,20 +4109,23 @@

Small hints

  • -You can also delete the host entry on your install client in your -~/.ssh/known_hosts file by using the ssh-keygen -R command. +Vous pouvez également supprimer l’entrée hôte de votre client +d’installation dans votre fichier ~/.ssh/known_hosts à l’aide de la +commande ssh-keygen -R.

  • -In the tasks chboot and savelog, a connection using secure shell is -opened to the FAI server (see [isavelog]). To ensure that this works -non-interactively, a proper entry in NFSROOT/root/.ssh/known_hosts -must be created. When using fai-setup, this is done automatically, but -it may require manual editing in case the name of your FAI server was -not determined correctly. If you stumble over ssh connections that -require typing "yes" to accept the host key during installation, -please check the contents of your NFSROOT/root/.ssh/known_hosts file +Dans les tâches chboot et savelog, une connexion utilisant un shell +sécurisé est ouverte vers le serveur FAI (voir [isavelog]). +Pour garantir que cela fonctionne de manière non interactive, une entrée +appropriée dans NFSROOT/root/.ssh/known_hosts doit être créée. Lors de +l’utilisation de fai-setup, cela se fait automatiquement, mais il peut +s’avérer nécessaire de l’éditer manuellement si le nom de votre serveur +FAI n’a pas été correctement déterminé. Si vous trébuchez sur des +connexions ssh qui nécessitent de taper "yes" pour accepter la clé hôte +pendant l’installation, vérifiez le contenu de votre fichier +NFSROOT/root/.ssh/known_hosts

  • @@ -4417,7 +4455,7 @@

    Boot errors

diff --git a/doc/fai-guide_fr.txt b/doc/fai-guide_fr.txt index 5be96f75b..ba95c672f 100644 --- a/doc/fai-guide_fr.txt +++ b/doc/fai-guide_fr.txt @@ -848,12 +848,12 @@ http://www.infrastructures.org/papers/bootstrap/bootstrap.html === [[c3]]L’espace de configuration et ses sous-répertoires -The configuration space is the collection of information about how exactly -to install a client. The central configuration space for all install -clients is located on the install server in '/srv/fai/config' and its -subdirectories. This will be mounted by the install clients to -'/var/lib/fai/config'. The main installation command `fai(8)` uses all -these subdirectories in the order listed except for hooks. +L'espace de configuration est la collection des informations qui disent comment exactement +configurer un client. L'espace central de configuration pour tous les clients +d'installation est situé sur le serveur d'installation dans '/srv/fai/config' et ses +sous-répertoires. Il sera monté par les clients sous +'/var/lib/fai/config'. La commande princpale d'installation `fai(8)` utilise tous +ces sous-répertoires dans l'ordre listé sauf pour les hooks. _class/_:: Scripts et fichiers pour définir des classes et des variables. @@ -1900,45 +1900,46 @@ tout l'espace disponible de la clé USB en utilisant cette commande ---- -=== [[diskimage]]Creating VM disk images using FAI +=== [[diskimage]]Création d’images de disque VM à l’aide de FAI -The command `fai-diskimage(8)` creates disk -images, which can be used with a virtual machine like KVM, VMware, -VirtualBox or a cloud service like OpenStack, GCE, EC2 and others. The -installation process performs the normal FAI tasks on a raw disk -image. After the installation you can boot the disk image and have a -running system. The disk image can also be converted to qcow2 format. -You do not need to setup the FAI nfsroot when only using -fai-diskimage. But you need a basefile in your configuration -space. Setting the variable +$FAI_BASEFILEURL+ will automatically -download an appropriate base file into your config space. +En utilisant la commande `fai-diskimage(8)`, vous pouvez créer des +images de disques qui peuvent être utilisées avec une +machine virtuelle comme KVM, VMware, VirtualBox ou un service cloud +comme OpenStack, GCE, EC2 et autres. Le processus d’installation exécute +les tâches FAI normales sur une image de disque brut. Après +l’installation, vous pouvez démarrer l’image disque et avoir un système +fonctionnel. L’image disque peut également être convertie au format qcow2. +Vous n'avez pas besoin de mettre en place le nfsroot de FAI quand vous utilisez seulement +fai-diskimage. Mais vous avez besoin d'un fichier de base dans votre espace de +configuration. Le réglage de la variable +$FAI_BASEFILEURL+ permet de télécharger automatiquement +un fichier de base approprié dans votre espace de configuration. -Here's an example how to create a raw disk image for a host called -cloud3, with a small set of software packages: +Voici par exemple comment créer une image de disque brute pour un hôte nommé +cloud3, avec un petit ensemble de paquets logiciels : ---- # export FAI_BASEFILEURL=https://fai-project.org/download/basefiles/ # fai-diskimage -vu cloud3 -S2G -cDEBIAN,BOOKWORM64,AMD64,FAIBASE,GRUB_PC,DHCPC,DEMO,CLOUD,LAST disk.raw ---- -This command will create a disk image called ubuntu.qcow2 for a Ubuntu 16.04 desktop -with hostname set to foobar. +Cette commande créera une image de disque nommée ubuntu.qcow2 pour une configuration de bureau Ubuntu 16.04 +avec pour nom d'hôte machin. ---- # export FAI_BASEFILEURL=https://fai-project.org/download/basefiles/ # cl=DHCPC,UBUNTU,JAMMY,JAMMY64,AMD64,XORG,LAST -# fai-diskimage -Nvu foobar -S5G -c$cl ubuntu.qcow2 +# fai-diskimage -Nvu machin -S5G -c$cl ubuntu.qcow2 ---- -You can give disk images a try without installing FAI, if you visit +Vous pouvez essayer quelques images de disques sans installer FAI, si vous visitez https://fai-project.org/FAIme/cloud -=== [[live-image]]Creating a bootable live image +=== [[live-image]]Création d'une image vive amorçable -Creating a bootable live ISO is easy with FAI. You only need two -steps. First, create your live environment using the command 'fai -dirinstall'. Don't forget to add the class +LIVEISO+. -Then create the live ISO using 'fai-cd': +La création d'images ISO vives amorçables est facile avec FAI. Il suffit de deux +étapes. Premièrement, créez votre environnement vif à l'aide de la commande 'fai +dirinstall'. N'oubliez pas d'ajouter la classe +LIVEISO+. +Ensuite, créez l'image ISO vive en utilisant 'fai-cd' : ---- # cl="DEBIAN,BOOKWORM64,AMD64,FAIBASE,XFCE,XORG,DHCPC,DEMO,LIVEISO,LAST" @@ -1948,16 +1949,16 @@ Then create the live ISO using 'fai-cd': -n /srv/xfce live.iso ---- -The nfsroot is not needed for a live ISO. -Currently there's no live ISO of the install server available. +Le nfsroot n'est pas nécessaire pour une image ISO vive. +Il n'y a pas actuellement d'image vive ISO disponible sur le serveur d'installation. -=== [[cross-arch]]Building cross-architecture disk images +=== [[cross-arch]]Construire des images disque d'architecture différente (cross-architecture) -Starting FAI 5.4 it's now possible to build a disk image for -different architectures than the host is running. For example you can -build an image for 64-bit ARM architecture (aarch64) on a host running on amd64 -architecture. Here are the steps do to: +À partir de FAI 5.4 il devient possible de construire une image disque pour +des architectures différentes de l'hôte qui est utilisé. Par exemple on peut +construire une image pour une architecture ARM 64-bit (aarch64) sur un hôte qui fonctionne +sur une architecture amd64. Voici les étapes successives : ---- # apt install qemu-system-arm qemu-user-static fai-server fai-setup-storage fai-doc qemu-utils @@ -1970,48 +1971,51 @@ architecture. Here are the steps do to: # cp /var/log/fai/armhost/last/initrd.img* initrd ---- -Then you can run qemu as a normal user: +Ensuite on peut lancer qemu en tant qu'utilisateur ordinaire : ---- > qemu-system-aarch64 -m 1000 -M virt,gic_version=3 -cpu cortex-a57 -drive file=arm64.raw,if=virtio,index=1 -no-reboot -nographic -name ARM64 -net nic,name=eth0,model=virtio -net user,name=eth0,-kernel vmlinuz -initrd initrd -append "console=ttyAMA0 rw ip=dhcp root=/dev/vda1 net.ifnames=0" ---- -This works similar for other architectures. -Keep in mind, that qemu network setup will have poor performance if -not using the virtio driver as above or tap devices. +Ça fonctionne de même pour d'autres architectures. +Il faut garder en tête que les réglages réseau de qemu ont des performances dégradées si +on n'utilise pas le pilote virtio comme ci-dessus ou des TAPs réseaux. -You can find the base files for many architectures at -https://fai-project.org/download/basefiles/, or use `mk-basefile` to -create your own. +On peut trouver les fichiers de base pour plusieurs architectures à +https://fai-project.org/download/basefiles/, ou utiliser `mk-basefile` pour +créer son fichier propre. -=== [[sysinfo]]FAI rescue system +=== [[sysinfo]]Système de sauvetage FAI -If you set the variable +$FAI_ACTION+ to _sysinfo_ (for e.g. by using -+fai-chboot -S+), the client will not install a new system, but will -collect a lot of system information. -If you set +$FAI_ACTION+ to _inventory_ you will only get a few -hardware information. -Both actions can be used for FAI as a rescue system. +Si vous assignez à la variable +$FAI_ACTION+ la valeur _sysinfo_ (par exemple +en utilisant fai-chboot -S), le client n’installera pas de nouveau +système, mais collectera beaucoup d’informations système. Si vous +assignez à +$FAI_ACTION+ la valeur _inventory_, vous ne recevrez que +quelques informations sur le matériel. Les deux actions peuvent être +utilisées pour FAI comme un système de sauvetage. -Type _ctrl-c_ to get a shell or use _Alt-F2_ or _Alt-F3_ and you will get -another console terminal, if you have added _createvt_ to +$FAI_FLAGS+. +Tapez _ctrl-c_ pour obtenir un shell ou utilisez _Alt-F2_ ou _Alt-F3_ et +vous obtiendrez une autre console de terminal, si vous avez ajouté +_createvt_ à +$FAI_FLAGS+. -You now have a running Linux system on the install client without -using the local hard disk. Use this as a rescue system if your local -disk is damaged or the computer can't boot properly from hard -disk. You will get a shell and you can execute various commands -(`dmesg`, `lsmod`, `df`, `lspci`, ...). Look at the log file in -'/tmp/fai'. There you can find much information about the boot -process. +Vous voilà maintenant avec un système Linux qui fonctionne sur le client +d’installation sans utiliser le disque dur local. Utilisez-le comme +système de secours si votre disque local est endommagé ou si +l’ordinateur ne peut pas démarrer correctement à partir du disque dur. +Vous obtiendrez un shell et vous pouvez exécuter diverses commandes +(`dmesg`, `lsmod`, `df`, `lspci`, …). Regardez le fichier +journal dans `/tmp/fai`. Vous y trouverez de nombreuses informations +sur le processus d’amorçage. -FAI mounts all file systems it finds on the local disks read only. It -also tells you on which partition a file '/etc/fstab' exists. When -only one file system table is found, the partitions are mounted -according to this information. Here's an example: +FAI monte tous les systèmes de fichiers qu’il trouve sur les disques +locaux en lecture seule. Il vous indique également sur quelle partition +un fichier '/etc/fstab' existe. Lorsqu’une seule table de système de +fichiers est trouvée, les partitions sont montées selon ces +informations. Voici un exemple : ---- demohost:~# df -h @@ -2028,86 +2032,93 @@ LiveOS_rootfs 783M 18M 766M 3% / /dev/mapper/vg1-home 1.4G 72K 1.3G 1% /target/home ---- -*This method can be used as a rescue environment!* If you need a file -system with read-write access use the `rwmount` command: +*Cette méthode peut être utilisée comme un environnement de sauvetage !* Si +vous avez besoin d’un système de fichiers avec accès en +lecture/écriture, utilisez la commande `rwmount` : + ---- demohost# rwmount /target/home ---- -=== [[nonfs]]FAI without NFS +=== [[nonfs]]FAI sans NFS -To boot into FAI and begin the installation sequence -without using the NFS protocol, you boot the client machine using PXE as -usual and then retrieve an image containing the nfsroot via http. +Pour démarrer dans FAI et commencer la séquence d’installation sans +utiliser le protocole NFS, vous démarrez la machine cliente en utilisant +PXE comme d’habitude, puis récupérez une image contenant le nfsroot via +http. -To create an image, use fai-cd's -S argument and -M to avoid setting up -a partial mirror within the image. +Pour créer une image, utilisez l’argument -S de fai-cd et -M pour éviter de créer +un miroir partiel à l'intérieur de l'image. ---- faiserver# fai-cd -M -S squash.img ---- -Move this image to a directory from which it can be requested via http -(usually a directory served by the webserver) +Déplacez cette image vers un répertoire à partir duquel elle peut être +demandée via http (généralement un répertoire accessible par le serveur +web) -To now request the squashfs image, add the following to your kernel -command line, e.g. in your pxelinux configuration file for the client -with fai-chboot. +Pour demander alors l’image squashfs, ajoutez ce qui suit à votre +ligne de commande du noyau, par exemple dans votre fichier de configuration +pxelinux pour le client avec fai-chboot. ---- root=live:http://faiserver/cskoeln/squash.img FAI_CONFIG_SRC=file:///var/lib/fai/config ---- -Replace faiserver with the domain name or IP of the machine your -squash image is served from. +Remplacez faiserver par le nom de domaine ou l'IP de la machine de laquelle +votre image de squash est servie. -=== [[otherdists]]Installing other distributions using a Debian nfsroot +=== [[otherdists]]Installation d’autres distributions à l’aide d’un nfsroot Debian -You can install all sorts of Linux distributions from a single Debian -nfsroot. Therefore you have to create a base.tar.xz of the distribution -you like to install and place it into the `basefiles` directory. Then -name it UBUNTU2204.tar.xz for example. An install client which belongs -to the class UBUNTU2204 then extracts this base file into its empty -file system. Additionally you have to adjust the 'sources.list' or -similar configuration files which are needed for specifying the -location of the package repository. +Vous pouvez installer toutes sortes de distributions Linux à partir d’un +seul nfsroot Debian. Par conséquent, vous devez créer un fichier +base.tar.xz de la distribution que vous souhaitez installer et le placer +dans le répertoire `basefiles`. Puis nommez-le UBUNTU2204.tar.xz par +exemple. Un client d’installation appartenant à la classe UBUNTU2204 +extrait ensuite ce fichier de base dans son système de fichiers vide. De +plus, vous devez ajuster les 'sources.list' ou les fichiers de +configuration similaires nécessaires pour spécifier l’emplacement du +dépôt de paquets. -The tool `rinse(8)` is used for creating base files for distribution -like Rocky Linux, CentOS, openSUSE or Fedora. -Some basefiles can be downloaded from +L’outils `rinse(8)` est utilisé pour créer des fichiers de base pour +des distributions comme Rocky Linux, CentOS, openSUSE, ou Fedora. +Certains fichiers de base peuvent être téléchargés à partir de https://fai-project.org/download/basefiles/. -The script +mk-basefile+ in -'/usr/share/doc/fai-doc/examples/simple/basefiles/' helps creating -this base files. +Le script +mk-basefile+ dans +'/usr/share/doc/fai-doc/examples/simple/basefiles/' aide à créer ces +fichiers de base. -=== [[dirinstall]]Creating chroot and virtualization environments +=== [[dirinstall]]Création d’environnements chroot et de virtualisation -If you have to create some chroot environments, or a virtualization -environment where you neither can nor want to run a normal Debian -Installer in to get to a working system (for example, Xen guest -domains), there is the FAI action _dirinstall_. -By calling +Si vous devez créer certains environnements chroot, ou un environnement +de virtualisation où vous ne pouvez ni ne voulez exécuter un programme +d’installation Debian normal pour accéder à un système opérationnel (par +exemple, les domaines hôtes Xen), il y a l’action FAI _dirinstall_. En +appelant : ---- faiserver# fai dirinstall ---- -and using either the option _-c _ or _-N_ you get a FAI -installation, without the partitioning action, right into the target -directory. The host name for the target installation can be specified -using _-u _ +et en utilisant l’option _-c _ ou _-N_ vous obtenez une +installation FAI, sans l’action de partitionnement, directement dans le +répertoire cible. Le nom d’hôte de la cible d'installation peut être +spécifié à l’aide de _-u _ -This, for example, can be used to combine FAI with the tool -_xen-tools_, which helps you to build Xen guest domains. _xen-tools_ -are very nice for generating configuration files and block devices for -new guests based on simple commands and/or configuration files, but -they can only assign one role per installation for customization. -FAI-users need and want more, as they are used to have the class -system. They get them even in xen-tools installations, by using the -following code as a xen-tools role script: +On peut utiliser cela, par exemple, pour combiner FAI avec les outils +_xen-tools_, qui vous aident à construire des domaines invités Xen. +Les _xen-tools_ sont très agréables pour générer des fichiers de configuration +et bloquer des périphériques pour de nouveaux invités sur la base de +commandes simples et/ou des fichiers de configuration, mais ils ne +peuvent assigner qu’un seul rôle par installation pour la +personnalisation. Les utilisateurs de FAI ont besoin de plus et en veulent, car +ils ont l'habitude d'avoir le système de classes. Ils peuvent y arriver +même dans les installations xen-tools, en utilisant le code suivant en +tant que rôle xen-tools script : ---- #!/bin/sh @@ -2117,143 +2128,150 @@ echo running $CMD $CMD ---- -Then, you should set the variable _install=0_ in the config of -xen-tools for that host. +Ensuite, il faut définir la variable _install=0_ dans la configuration +xen-tools pour cet hôte. -=== [[softupdate]]Using FAI for updates -FAI can also do updates of already running systems, without a -re-installation from scratch. -This is called softupdate. A FAI softupdate skips the tasks which are -not suitable for updating a running system, like partitioning the -hard disks and creating file systems. Instead, it only executes the -tasks for updating and installing software packages and calling the -customization scripts. +=== [[softupdate]]Utilisation de FAI pour les mises à jour +FAI peut également effectuer des mises à jour de systèmes déjà en cours +d’exécution, sans réinstallation à partir de zéro. C’est ce qu’on +appelle softupdate. Un FAI softupdate ignore les tâches qui ne sont pas +adaptées à la mise à jour d’un système en cours d’exécution, comme le +partitionnement des disques durs et la création de systèmes de fichiers. +Au lieu de cela, il exécute uniquement les tâches de mise à jour et +d’installation des paquets logiciels et l’appel des scripts de +personnalisation. -To run a softupdate call: +Pour lancer un softupdate : ---- # fai -v -s nfs://faiserver/srv/fai/config softupdate ---- -By default, a softupdate uses the list of classes defined during the -initial installation. Make sure to set the variable +$LOGSERVER+ (done -in a _class/*.var_ file) if FAI should save the log files to a remote -machine. +Par défaut, un softupdate utilise la liste des classes définies lors de +l’installation initiale. Assurez-vous de définir la variable ++$LOGSERVER+ (ça se fait dans un fichier _class/*.var_) si FAI doit +enregistrer les fichiers journaux sur une machine distante. -It's up to you, how to start a softupdate on a bigger number of hosts. -You may do the softupdate on a regular basis via cron or you can use tools -like `clusterssh(1)` to start a softupdate via a push on a list of -hosts. +C’est à vous de décider, comment démarrer un softupdate sur un plus grand nombre +d’hôtes. Vous pouvez faire le softupdate sur régulièreent via cron +ou vous pouvez utiliser des outils comme `clusterssh(1)` pour démarrer +un softupdate via un push sur une liste d’hôtes. -Keep in mind, that the customization scripts are run every time you do -a softupdate. That means, they have to be *idempotent* i.e. the result -of their operation should always produce the same result, even when -they run more than once. +Gardez à l’esprit que les scripts de personnalisation sont exécutés +chaque fois que vous faites un softupdate. Cela signifie qu’ils doivent +être *idempotents*, c’est-à-dire que le résultat de leur fonctionnement +doit toujours produire le même résultat, même lorsqu’ils fonctionnent +plus d’une fois. -For example appending a line to a file must not done via this code: +Par exemple, l’ajout d’une ligne à un fichier ne doit pas se faire via ce code : ---- $ echo "some strings" >> /etc/fstab ---- -Instead use the command `ainsl(1)` in a shell script or use cfengine's -function _AppendIfNoSuchLine_. +Au lieu de ça, utilisez la commande `ainsl(1)` dans un script shell ou utilisez la fonction +de cfengine _AppendIfNoSuchLine_. -All commands in the customization script must be capable of modifying -the target file system wether it's available in _/target_ during the -initial installation or wether it's the normal file system relative to -_/_ during softupdate. +Toutes les commandes du script de personnalisation doivent être capables +de modifier le système de fichiers cible qui’il soit disponible dans +_/target_ lors de l’installation initiale ou qu'il soit le système de +fichiers normal relatif à _/_ pendant le softtupdate. -Here are some variable that help writing these scripts: +Voici quelques variables qui aident à écrire ces scripts : -+$target+:: Points to the root directory of the client, which -is _/target_ during installation and _/_ during a softupdate. ++$target+:: +Pointe vers le répertoire racine du client, qui est _/target_ pendant +l’installation et _/_ pendant un softupdate. -+$FAI_ROOT+:: It's the same value as +$target+. For historic reasons -we have both these variables in FAI. ++$FAI_ROOT+:: +C’est la même valeur que +$target+. Pour des raisons historiques, +on a ces deux variables dans FAI. +$ROOTCMD+:: -In case of the installation this is an alias for 'chroot $target' in case of -softupdate it's just empty. You can prepend this to commands if you need to run a -command inside the clients target file system via chroot. +Dans le cas de l’installation, il s’agit d’un alias pour 'chroot $target' +en cas de softupdate, c’est juste vide. Vous pouvez ajouter +ceci avant les commandes si vous avez besoin d’exécuter une commande dans le +système de fichiers cible des clients via chroot. +$FAI_ACTION+:: -If you need to call code depending on the FAI action performed, you -can use this variable. It contains the currently executed action: -_install_, _softupdate_, _dirinstall_, _sysinfo_, _inventory_ or your -own defined action. +Si vous devez appeler le code en fonction de l’action FAI effectuée, +vous pouvez utiliser cette variable. Elle contient l’action actuellement +exécutée: _install_, _softupdate_, _dirinstall_, _sysinfo_, +_inventory_ ou votre propre action définie. -=== [[archcross]]How to install 32-bit OS from a 64-bit OS +=== [[archcross]]Comment installer un système d’exploitation 32 bits à partir d’un système d’exploitation 64 bits -To install a computer with a 32-bit OS, you need an i386 nfsroot. -Creating this 32-bit nfsroot on an install server running amd64 is -quite simple. Install and set up the FAI packages. Then copy your FAI -config files to a new subdirectory. +Pour installer un ordinateur avec un système d’exploitation 32 bits, +vous avez besoin d’un nfsroot i386. La création de ce nfsroot 32 bits +sur un serveur d’installation qui fonctionne sous amd64 est simple. +Installez et configurez les paquets FAI. Copiez ensuite vos fichiers de +configuration FAI dans un nouveau sous-répertoire. ---- faiserver# cp -a /etc/fai /etc/fai-i386 ---- -Edit the variable +$FAI_DEBOOTSTRAP_OPTS+ in -'/etc/fai-i386/nfsroot.conf' and add the option +--arch -i386+. Also choose a different directory for your new nfsroot. Here -are the two lines after editing. +Modifiez la variable +$FAI_DEBOOTSTRAP_OPTS+ dans +'/etc/fai-i386/nfsroot.conf' et ajoutez l’option +--arch i386+. +Choisissez également un répertoire différent pour votre nouveau nfsroot. +Voici les deux lignes après l'édition. ---- NFSROOT=/srv/fai/nfsroot-i386 FAI_DEBOOTSTRAP_OPTS="--arch i386 --exclude=info --include=aptitude"" ---- -Now call fai-make-nfsroot which creates the 32-bit nfsroot in +Appelez maintenant fai-make-nfsroot qui crée le nfsroot 32 bits dans '/srv/fai/nfsroot-i386' ---- faiserver# fai-make-nfsroot -v -C/etc/fai-i386 ---- -Creating a partial mirror using `fai-mirror(1)` that is needed for -a bootable CD or USB stick is also possible on a different architecture. -You have to specify the architecture when calling fai-mirror. +La création d’un miroir partiel utilisant `fai-mirror(1)` qui est nécessaire à +un CD amorçable ou une clé USB est également possible sur une +architecture différente. Vous devez spécifier l’architecture lors de +l’appel de fai-mirror. ---- $ fai-mirror -m800 -B -a i386 -v -cDEFAULT,DEBIAN,FAIBASE,I386 /srv/mirror-i386 ---- -That's all! +Et voilà ! -=== [[error]]Aborting the installation when an error occurs +=== [[error]]Arrêt d'urgence de l'installation quand une erreur se produit -Every task and hook can call the function +task_error+ -to send an error value to the installation. This error will appear in -the log file and can be shown in the `fai-monitor-gui(1)`. -The error value is also checked against the variable +$STOP_ON_ERROR+ -which is set to 700 by default. If the error value -is greater than +$STOP_ON_ERROR+ the installation will stop -immediately. In a hook, just add a call like this: +Chaque tâche, chaque hook peut appeler la fonction +task_error+ +pour envoyer une valeur d'erreur à l'installation. Cette erreur apparaîtra dans +le fichier de journalisation et peut être visionnée dans le `fai-monitor-gui(1)`. +La valeur de l'erreur est aussi examinée en tenant compte de la variable +$STOP_ON_ERROR+ +qui est réglée à 700 par défaut. Si la valeur d'erreur est +supérieure à +$STOP_ON_ERROR+, l'installation s'arrêtera +immédiatment. Dans un hook, ajoutez simplement un appel comme celui-ci : ---- -task_error +task_error ---- -It is comfortable to call task_error with $? as second parameter, for -e.g. if you want to set an error value of 123 use this +C'est commode d'appeler task_error avec $? comme deuxième paramètre, par +exemple si on veut émettre une valeur d'erreur de 123 on peut faire ainsi ---- task_error 123 $? ---- -Then the task error is only set if the preceding command failed with -some error. The same syntax can be used by the scripts in the class -subdirectory ending in .sh. +Alors, l'erreur de tâche n'est mise en place que si la commande précédente a échoué avec +une certaine erreur. La même syntaxe peut être utilisée par les scripts dans le sous-répertoire +de classe qui se terminent en .sh. -A special case are scripts inside the class/ subdirectory that does -not end in .sh. In those scripts you have to call task_error with 1 as -third parameter. As an example you can use those two variants for -setting the value to 123 +Un cas particulier est celui des scripts dans le sous-répertoire class/ qui ne se termine +pas en .sh. Dans ces scripts il faut appeler task_error avec 1 comme +troisième paramètre. Par exemple on peut utiliser deux variantes pour +régler la valeur à 123 ---- task_error 123 $? 1 @@ -2265,291 +2283,312 @@ or task_error 123 1 1 ---- -The latter command always sets the task error to 123 regardless of -the value of +$?+. If the error value is greater than +$STOP_ON_ERROR+, -the installation will abort immediately. +La dernière commande met toujours l'erreur de tâche à 123 sans tenir compte de $?. +Si la valeur d'erreur est supérieure à +$STOP_ON_ERROR+, +l'installation sera immédiatement stoppée. -The error values are grouped into four categories +Les valeurs d'erreur sont regroupées dans quatre catégories ---- -normal or info messages: 1xx, 2xx -warnings: 3xx, 4xx -minor errors: 5xx, 6xx -errors: 7xx, 8xx +normale ou messages d'information : 1xx, 2xx +avertissements : 3xx, 4xx +erreurs mineures : 5xx, 6xx +erreurs : 7xx, 8xx ---- -The fai-monitor-gui has 4 different icons for these error categories. +Le fai-monitor-gui possède 4 icônes différentes pour ces catégories d'erreur. -== [[hints]]Various hints and details +== [[hints]]Divers conseils et détails -=== [[tasks]]The list of tasks +=== [[tasks]]La liste des tâches -Most tasks of the installation are defined as subroutines which are -defined in '/usr/lib/fai/subroutines' (e.g. +task_instsoft+). -Some are external shell scripts located in '/usr/lib/fai/'. -They are called via a superior subroutine called _task_. -This subroutine calls hooks if available and then calls the task (defined as -__task___). A task and its hooks can be -skipped on demand by using the command _skiptask()_. +La plupart des tâches de l’installation sont définies comme des +sous-routines qui sont définies dans '/usr/lib/fai/subroutines' (par +exemple +task_instsoft+). Certaines sont des scripts shell externes +situés dans '/usr/lib/fai/'. Elles sont appelées via un sous-programme +supérieur nommé _task_. Ce sous-programme appelle les hooks si +disponibles, puis appelle la tâche (définie comme __task___). Une +tâche et ses hooks peuvent être ignorés à la demande en utilisant la +commande _skiptask()_. -Now follows the description of all tasks, listed in the order -they are executed. +Voici maintenant la description de toutes les tâches, énumérées dans +l’ordre dans lequel elles sont exécutées. confdir:: -The kernel appended parameters may define variables, the syslog daemon is -started. Network parameters are fetched from a DHCP -server and are stored in +boot.log+. The DNS resolver configuration file is created. -+ -The location of the configuration space is defined by the variable -+$FAI_CONFIG_SRC+. -+ -After that, the file '$FAI/hooks/subroutines' is sourced if it -exists. Using this file, you can define your own subroutines or -override the definition of FAI's subroutines. + Les paramètres ajoutés au noyau peuvent définir des variables, le + démon syslog est démarré. Les paramètres de réseau sont récupérés d'un serveur DHCP + et sont enregistrés dans +boot.log+. La configuration pour la résolution DNS est créée. + + + L’emplacement de l’espace de configuration est défini par la variable + +$FAI_CONFIG_SRC+. + + + Ensuite, le fichier '$FAI/hooks/subroutines' est sourcé s’il existe. + En utilisant ce fichier, vous pouvez définir vos propres + sous-programmes ou remplacer la définition des sous-programmes de FAI. setup:: -This task sets the system time, all +$FAI_FLAGS+ are defined and two -additional virtual terminals are opened on demand. A secure shell -daemon is started on demand for remote logins. + Cette tâche définit l’heure du système, tous les +$FAI_FLAGS+ sont + définis et deux terminaux virtuels supplémentaires sont ouverts à la + demande. Un démon ssh est lancé à la demande pour les + connexions à distance. defclass:: -Calls `fai-class(1)` to define classes using scripts and files in -'$FAI/class' and classes from '/tmp/fai/additional-classes' and the -variable +$ADDCLASSES+. The list of all defined classes is stored in -the variable +$classes+ and saved to '/tmp/fai/FAI_CLASSES'. + Appels de `fai-class(1)` pour définir des classes à l’aide de scripts + et de fichiers dans '$FAI/class' et classes de + '/tmp/fai/additional-classes' et la variable +$ADDCLASSES+. La liste + de toutes les classes définies est stockée dans la variable + +$classes+ et enregistrée dans '/tmp/fai/FAI_CLASSES'. defvar:: -Sources all files '$FAI/class/*.var' for every defined class. If a -hook has written some variable definitions to the file -'$LOGDIR/additional.var', this file is also sourced. + Source tous les fichiers '$FAI/class/*.var' pour chaque classe + définie. Si un hook a écrit quelques définitions de variables dans le + fichier '$LOGDIR/additional.var', ce fichier est également sourcé. action:: -Depending on the value of +$FAI_ACTION+ this subroutine decides which -action FAI should perform. The default available actions are: -_sysinfo_, _install_, _inventory_, _dirinstall_ and _softupdate_. If +$FAI_ACTION+ has another -value, a user defined action is called if a file -'$FAI/hooks/$FAI_ACTION' exists. So you can easily define your own -actions. + En fonction de la valeur de +$FAI_ACTION+, ce sous-programme décide + de l’action FAI à exécuter. Les actions disponibles par défaut sont : + _sysinfo_, _install_, _inventory_, _dirinstall_ et _softupdate_. Si + +$FAI_ACTION+ a une autre valeur, une action définie par + l’utilisateur est appelée si un fichier '$FAI/hooks/$FAI_ACTION' + existe. Ainsi, vous pouvez facilement définir vos propres actions. sysinfo:: -Called when no installation is performed but the action is -_sysinfo_. It shows information about the detected hardware and mounts -the local hard disks read only to '/target/+partitionname+' or with -regard to a 'fstab' file found inside a partition. Log files are -stored to the install server. + Appelée lorsque aucune installation n’est effectuée mais que l’action + est _sysinfo_. Elle affiche des informations sur le matériel détecté et + monte les disques durs locaux en lecture seule sur + '/target/+partitionname+' ou en tenant compte d’un fichier 'fstab' trouvé à + l’intérieur d’une partition. Les fichiers journaux sont stockés sur le + serveur d’installation. inventory:: -A short list of system information is printed. + Une courte liste des informations système est imprimée. install:: -This task controls the installation sequence. You will hear three -beeps before the installation starts. The major work is to call other -tasks and to save the output to '/tmp/fai/fai.log'. If you have any -problems during installation, look at all files in '/tmp/fai/'. You -can find examples of the log files -at https://fai-project.org/logs/. + Cette tâche contrôle la séquence d’installation. Vous entendrez trois + bips avant le début de l’installation. Le travail principal consiste à + appeler d’autres tâches et à enregistrer la sortie dans + '/tmp/fai/fai.log'. Si vous avez des problèmes pendant l’installation, + regardez tous les fichiers dans '/tmp/fai/'. Vous trouverez des + exemples de fichiers journaux à l’adresse + https://fai-project.org/logs/. dirinstall:: -Install into a directory, not onto a local disk. Use this for creating -chroot environments. + Installe dans un répertoire, et non pas sur un disque local. + Utilisez-le pour créer des environnements chroot. softupdate:: -This task, executed inside a running system via the `fai(8)` command -line interface, performs a softupdate. See chapter <> for -details. + Cette tâche, exécutée à l’intérieur d’un système en cours d’exécution + via la commande en ligne `fai(8)`, effectue un + softupdate. Voir le chapitre <> pour plus + de détails. partition:: -Calls `setup-storage(8)` to partition the hard -disks and to create file systems. The task writes variable definitions -for the root and boot partition and device (+$ROOT_PARTITION, -$BOOT_PARTITION, $BOOT_DEVICE+) to '/tmp/fai/disk_var.sh' and creates -a 'fstab' file for the new system. + Appelle `setup-storage(8)` pour partitionner les disques durs et + créer des systèmes de fichiers. La tâche écrit des définitions de + variables pour les partitions et périphériques racine et de démarrage + (+$ROOT_PARTITION, $BOOT_PARTITION, $BOOT_DEVICE+) dans + '/tmp/fai/disk_var.sh' et crée un fichier 'fstab' pour le nouveau + système. mountdisks:: -Mounts the created partitions according to the created -'/tmp/fai/fstab' file relative to +$FAI_ROOT+. + Monte les partitions créées en fonction du fichier '/tmp/fai/fstab' + créé par rapport à +$FAI_ROOT+. extrbase:: -Extracts a minimal system after that a chroot can be made into it. By -default the base tar file '/var/tmp/base.tar.xz' will be -extracted. Also files matching a class name in `$FAI/basefiles/` are used for unpacking a -different tar file depending on classes defined. This can be used for -installing different Linux distributions than the one used for -creating the nfsroot. The default file 'base.tar.xz' is a snapshot of a -basic Debian system created by `debootstrap(8)`. -This task uses the variable +FAI_BASEFILEURL+ for fetching the base -file via FTP, HTTPS or HTTP if it's defined. + Extrait un système minimal après lequel un chroot puisse y être + introduit. Par défaut, le fichier tar de base '/var/tmp/base.tar.xz' sera + extrait. Les fichiers correspondant à un nom de classe dans + `$FAI/basefiles/` sont également utilisés pour décompresser un autre + fichier tar selon les classes définies. Cela peut être utilisé pour + installer des distributions Linux différentes de celles utilisées pour + créer le nfsroot. Le fichier par défaut 'base.tar.xz' est un + instantané d’un système Debian de base créé par `debootstrap(8)` + Cette tâche utilise la variable +FAI_BASEFILEURL+ pour récupérer le + fichier de base via FTP, HTTPS ou HTTP si celle-ci est définie. debconf:: -Calls `fai-debconf(1)` to set the values for the debconf preseeding database. + Appelle `fai-debconf(1)` pour définir les valeurs de la base de + données de pré-ensemencement de debconf. repository:: -Prepare access to the package repository by preparing the apt -configuration. This can also add repository keys -in a class based manner from files like _CLASSNAME.gpg_ -in the directory _package_config_. + Prépare l’accès au dépôt de paquets en préparant la + configuration apt. Cela peut également ajouter des clés de dépôts + en tenant compte des classes à partir de fichiers comme + _CLASSNAME.gpg_ dans le répertoire _package_config_. updatebase:: -Updates the base packages of the new system and updates the list of -available packages. It also fakes some commands (called diversions) -inside the new installed system using `dpkg-divert(8)`, so no daemons -will be started during the installation. + Met à jour les paquets de base du nouveau système et met à jour la + liste des paquets disponibles. Il contrefait également certaines + commandes (appelées diversions) à l’intérieur du nouveau système + installé à l’aide de `dpkg-divert(8)`, de sorte qu’aucun démon ne + soit démarré pendant l’installation. instsoft:: -Installs the desired software packages using class files in -'$FAI/package_config/'. + Installe les paquets logiciels souhaités en utilisant des fichiers de classe + dans '$FAI/package_config/'. configure:: -Calls scripts in '$FAI/scripts/' and its subdirectories for every -defined class. + Appelle les scripts dans '$FAI/scripts/' et ses sous-répertoires pour + chaque classe définie. tests:: -Calls test scripts in '$FAI/tests/' and its subdirectories for every -defined class. + Appelle les scripts de test dans '$FAI/tests/' et ses sous-répertoires + pour chaque classe définie. finish:: -Unmounts all file systems in the new installed system and removes -diversions of files using the command `fai-divert`. + Démonte tous les systèmes de fichiers dans le nouveau système installé + et supprime les diversions de fichiers à l’aide de la commande + `fai-divert`. chboot:: -Changes the PXE configuration for a host on the install server which -indicates which PXELINUX configuration to load on the next boot from network -card via TFTP. Therefore the `fai-chboot(8)` command is executed -remotely on the install server. + Modifie la configuration PXE d’un hôte sur le serveur d’installation, + qui indique quelle configuration PXELINUX doit être chargée lors de la + prochaine initialisation à partir de la carte réseau via TFTP. Par + conséquent, la commande `fai-chboot(8)` est exécutée à distance sur + le serveur d’installation. savelog:: -Saves log files to local disk and to the account +$LOGUSER+ on -+$LOGSERVER+ (defaults to the install server). + Enregistre les fichiers journaux sur le disque local et sur le compte + +$LOGUSER+ sur +$LOGSERVER+ (par défaut sur le serveur + d’installation). faiend:: -Wait for background jobs to finish (e.g. emacs compiling lisp files) -and automatically reboots the install clients or waits for manual -input before reboot. + Attend que les travaux en arrière-plan se terminent (par exemple, + qu'emacs compile des fichiers lisp) puis redémarre automatiquement les + clients d’installation ou attend la saisie manuelle avant le + redémarrage. -=== [[itests]]Automated tests +=== [[itests]]Tests automatisés -After the customization scripts are executed, FAI will execute some -tests if available. Using these test, you can check for errors of the -installation. Test scripts are called via -`fai-do-scripts(1)` and should append its messages to -_$LOGDIR/test.log_. A Perl module including some useful subroutines -can be found in _Faitest.pm_. A test can also define a new class for -executing another tests during next boot via the variable -+$ADDCLASSES+. +Après l’exécution des scripts de personnalisation, FAI exécutera +certains tests si disponibles. En utilisant ces tests, vous pouvez +vérifier les erreurs de l’installation. Les scripts de test sont appelés +via `fai-do-scripts(1)` et doivent ajouter leurs messages à +'$LOGDIR/test.log'. Un module Perl comprenant des sous-routines utiles +peut être trouvé dans _Faitest.pm_. Un test peut également définir une +nouvelle classe pour exécuter d’autres tests lors du prochain démarrage +via la variable +$ADDCLASSES+. -=== [[autodiscover]] Autodiscover +=== [[autodiscover]]Découvrir automatiquement -In FAI 5.0 we released a feature that allows clients to search for the -faiserver in their respective subnetwork. This lifts the necessity of -having to collect every client's MAC address and configuring the DHCP -daemon. +Dans FAI 5.0, nous avons publié une fonctionnalité qui permet aux +clients de rechercher le faiserver dans leur sous-réseau respectif. Cela +soulève la nécessité de récupérer l’adresse MAC de chaque client et de +configurer le démon DHCP. -This is done by booting from a small FAI autodiscover bootmedium (CD, -USB, etc.), which can be created via the command: +Cela se fait en démarrant à partir d’une petit media vif autodiscover FAI +(CD, USB, etc.), qui peut être créé via la commande : ---- faiserver# fai-cd -A autodiscover.iso ---- -The image is roughly 25MB in size and scans the subnet for -a FAI server. By default it shows a menu with all profiles available -in the configuration space in the same manner as the 'menu' flag -does. From this menu, you can select the installation type you wish to -perform. +L’image a une taille d’environ 25 Mo et analyse le sous-réseau d’un +serveur FAI. Par défaut, il affiche un menu avec tous les profils +disponibles dans l’espace de configuration de la même manière que +le fait l'option 'menu'. Dans ce menu, vous pouvez sélectionner le type +d’installation que vous souhaitez effectuer. -For the clients to find the faiserver, the faiserver must run -fai-monitor. +Pour que les clients puissent trouver le faiserver, le faiserver doit +lancer fai-monitor. -=== [[changeboot]]Changing the boot device +=== [[changeboot]]Modification du périphérique d’amorçage -Changing the boot sequence is normally done in the BIOS setup. But you -can't change the BIOS from a running Linux system. +La modification de la séquence d’amorçage s’effectue normalement dans la +configuration du BIOS. Mais vous ne pouvez pas changer le BIOS d’un +système Linux en cours d’exécution. -So, the boot sequence of the BIOS will remain unchanged and -your computer should always boot first from its network card and the -second boot device should be the local disk. Then you can -change the boot device of the client by creating different PXELINUX -configurations. This will define if an installation -should be performed, or if the client should to boot from local -disk. This is done using `fai-chboot(8)`. +Ainsi, la séquence d’amorçage du BIOS restera inchangée et votre +ordinateur devrait toujours démarrer en premier à partir de sa carte +réseau et le deuxième périphérique d’amorçage devrait être le disque +local. Ensuite, vous pouvez changer le périphérique d’amorçage du client +en créant différentes configurations PXELINUX. Cela définira si une +installation doit être effectuée, ou si le client doit démarrer à partir +du disque local. Cela se fait à l’aide de `fai-chboot(8)`. -=== [[debian-mirror]]How to create a local Debian mirror +=== [[debian-mirror]]Comment créer un miroir Debian local -The utility `mkdebmirror` footnote:[You can find the script in -'/usr/share/doc/fai-doc/examples/utils/'] can be used for creating -your own local Debian mirror. This script uses `debmirror(1)`. A partial Debian mirror for amd64 architecture for -Debian 11 and 12 (aka bullseye and bookworm) without the source packages needs about -180GB of disk space. -Accessing the mirror via HTTP will be the -default way in most cases. To see more output from the script call -+mkdebmirror -v+. A root account is not necessary to create and -maintain the Debian mirror. +Le script utilitaire `mkdebmirror` footnote:[On peut trouver ce script dans +'/usr/share/doc/fai-doc/examples/utils/'] peut +être utilisé pour créer votre propre miroir Debian local. Ce script +utilise la commande `debmirror(1)`. Un miroir Debian partiel pour +l’architecture amd64 pour Debian 11 et 12 (noms de code bullseye et bookworm) sans les +paquets source nécessite environ 180 Go d’espace disque. L’accès au miroir +via HTTP sera la méthode par défaut dans la plupart des cas. Pour +afficher plus de résultats à partir du script, appelez ++mkdebmirror -v+. Un compte root n’est pas nécessaire pour créer et +maintenir le miroir Debian. -To use HTTP access to the local Debian mirror, install a web server -and create a symlink to the local directory where your mirror is -located: +Pour utiliser l’accès HTTP au miroir Debian local, installez un serveur +web et créez un lien symbolique vers le répertoire local où se trouve +votre miroir : ---- faiserver# apt-get install apache2 faiserver# ln -s /files/scratch/debmirror /var/www/html/debmirror ---- -Create a file `sources.list(5)` in '/etc/fai/apt' which gives access -to your Debian mirror. Also add the IP-address of the -HTTP server to the variable +$NFSROOT_ETC_HOSTS+ in -'nfsroot.conf' if the install clients have no DNS resolving. +Créez un fichier `sources.list(5)` dans '/etc/fai/apt' qui donne accès +à votre miroir Debian. Ajoutez également l’adresse IP du serveur HTTP à +la variable +$NFSROOT_ETC_HOSTS+ dans 'nfsroot.conf' si les clients +d’installation n’ont pas de résolution DNS. -=== Small hints +=== Petits conseils -- When using HTTP access to a Debian mirror, the local _/var_ partition -on all install clients must be big enough to keep the downloaded -Debian packages. Do not try with less than 250 Mbytes unless you know -why. You can limit the number of packages installed at a time with the -variable +$MAXPACKAGES+. +- Lorsque vous utilisez l’accès HTTP à un miroir Debian, la partition +locale _/var_ sur tous les clients d’installation doit être suffisamment +grande pour conserver les paquets Debian téléchargés. N’essayez pas avec +moins de 250 Moctets à moins que vous sachiez pourquoi. Vous pouvez +limiter le nombre de paquets installés à la fois avec la variable ++$MAXPACKAGES+. -- You can remove the red logo on the install client by simply calling -`reset` once. If will also not appear if you create a file using this -command on the install server: +- Vous pouvez supprimer le logo rouge sur le client d’installation en +appelant simplement une fois `reset`. Il ne s’affichera pas si vous +créez un fichier à l’aide de cette commande sur le serveur +d’installation : ---- touch /srv/fai/nfsroot/.nocolorlogo ---- -- A list of variables used by FAI can be found at +- Une liste des variables utilisées par FAI peut être trouvée à https://wiki.fai-project.org/index.php/Variables. -- You can shorten some customization scripts by using one single fcopy -command _fcopy -r /_. +- Vous pouvez raccourcir certains scripts de personnalisation en +utilisant une seule commande fcopy _fcopy -r /_. -- If you rebuild the nfsroot, you will create a new ssh host key inside -the nfsroot. Then logging in to an install client may fail, because -the host key changes. You can use this: +- Si vous reconstruisez le nfsroot, vous allez créer une nouvelle clé +hôte ssh dans le nfsroot. La connexion à un client d’installation peut +échouer, car la clé hôte change. Vous pouvez utiliser ceci : ---- $ ssh -o StrictHostKeyChecking=no root@installclient ---- -- You can also delete the host entry on your install client in your -_~/.ssh/known_hosts_ file by using the _ssh-keygen -R_ command. - -- In the tasks chboot and savelog, a connection using secure shell is -opened to the FAI server (see <>). To ensure that this works -non-interactively, a proper entry in 'NFSROOT/root/.ssh/known_hosts' -must be created. When using fai-setup, this is done automatically, but -it may require manual editing in case the name of your FAI server was -not determined correctly. If you stumble over ssh connections that -require typing "yes" to accept the host key during installation, -please check the contents of your 'NFSROOT/root/.ssh/known_hosts file' +- Vous pouvez également supprimer l’entrée hôte de votre client +d’installation dans votre fichier _~/.ssh/known_hosts_ à l’aide de la +commande _ssh-keygen -R_. + +- Dans les tâches chboot et savelog, une connexion utilisant un shell +sécurisé est ouverte vers le serveur FAI (voir <>). +Pour garantir que cela fonctionne de manière non interactive, une entrée +appropriée dans 'NFSROOT/root/.ssh/known_hosts' doit être créée. Lors de +l’utilisation de fai-setup, cela se fait automatiquement, mais il peut +s’avérer nécessaire de l'éditer manuellement si le nom de votre serveur +FAI n’a pas été correctement déterminé. Si vous trébuchez sur des +connexions ssh qui nécessitent de taper "yes" pour accepter la clé hôte +pendant l’installation, vérifiez le contenu de votre fichier +'NFSROOT/root/.ssh/known_hosts' - A list of all local hard disks is stored in +$disklist+. It's defined after `set_disk_info` is called. diff --git a/doc/po/fr.po b/doc/po/fr.po index eb19afbda..3d7207a5f 100644 --- a/doc/po/fr.po +++ b/doc/po/fr.po @@ -4,7 +4,7 @@ msgstr "" "Project-Id-Version: FAI-GUIDE version 6.4\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-10-23 11:06+0200\n" -"PO-Revision-Date: 2025-10-24 12:19+0200\n" +"PO-Revision-Date: 2025-10-24 15:50+0200\n" "Last-Translator: Georges Khaznadar \n" "MIME-Version: 1.0\n" @@ -1909,6 +1909,12 @@ msgid "" "'/var/lib/fai/config'. The main installation command `fai(8)` uses all\n" "these subdirectories in the order listed except for hooks." msgstr "" +"L'espace de configuration est la collection des informations qui disent comment exactement\n" +"configurer un client. L'espace central de configuration pour tous les clients\n" +"d'installation est situé sur le serveur d'installation dans '/srv/fai/config' et ses\n" +"sous-répertoires. Il sera monté par les clients sous\n" +"'/var/lib/fai/config'. La commande princpale d'installation `fai(8)` utilise tous\n" +"ces sous-répertoires dans l'ordre listé sauf pour les hooks." #: fai-guide.txt:807 msgid "" @@ -3329,7 +3335,7 @@ msgstr "" #: fai-guide.txt:1407 msgid "include::includes/fai-1st-part.txt[]" -msgstr "" +msgstr "include::includes/fai-1st-part.txt[]" #: fai-guide.txt:1410 msgid "" @@ -4206,7 +4212,7 @@ msgstr "" #: fai-guide.txt:1795 msgid "=== [[diskimage]]Creating VM disk images using FAI" -msgstr "" +msgstr "=== [[diskimage]]Création d’images de disque VM à l’aide de FAI" #: fai-guide.txt:1806 msgid "" @@ -4221,6 +4227,17 @@ msgid "" "space. Setting the variable +$FAI_BASEFILEURL+ will automatically\n" "download an appropriate base file into your config space." msgstr "" +"En utilisant la commande `fai-diskimage(8)`, vous pouvez créer des\n" +"images de disques qui peuvent être utilisées avec une\n" +"machine virtuelle comme KVM, VMware, VirtualBox ou un service cloud\n" +"comme OpenStack, GCE, EC2 et autres. Le processus d’installation exécute\n" +"les tâches FAI normales sur une image de disque brut. Après\n" +"l’installation, vous pouvez démarrer l’image disque et avoir un système\n" +"fonctionnel. L’image disque peut également être convertie au format qcow2.\n" +"Vous n'avez pas besoin de mettre en place le nfsroot de FAI quand vous utilisez seulement\n" +"fai-diskimage. Mais vous avez besoin d'un fichier de base dans votre espace de\n" +"configuration. Le réglage de la variable +$FAI_BASEFILEURL+ permet de télécharger automatiquement\n" +"un fichier de base approprié dans votre espace de configuration." #: fai-guide.txt:1814 msgid "" @@ -4232,6 +4249,12 @@ msgid "" "cDEBIAN,BOOKWORM64,AMD64,FAIBASE,GRUB_PC,DHCPC,DEMO,CLOUD,LAST disk.raw\n" "----" msgstr "" +"Voici par exemple comment créer une image de disque brute pour un hôte nommé\n" +"cloud3, avec un petit ensemble de paquets logiciels :\n" +"----\n" +"# export FAI_BASEFILEURL=https://fai-project.org/download/basefiles/\n" +"# fai-diskimage -vu cloud3 -S2G -cDEBIAN,BOOKWORM64,AMD64,FAIBASE,GRUB_PC,DHCPC,DEMO,CLOUD,LAST disk.raw\n" +"----" #: fai-guide.txt:1822 msgid "" @@ -4244,16 +4267,25 @@ msgid "" "# fai-diskimage -Nvu foobar -S5G -c$cl ubuntu.qcow2\n" "----" msgstr "" +"Cette commande créera une image de disque nommée ubuntu.qcow2 pour une configuration de bureau Ubuntu 16.04\n" +"avec pour nom d'hôte machin.\n" +"----\n" +"# export FAI_BASEFILEURL=https://fai-project.org/download/basefiles/\n" +"# cl=DHCPC,UBUNTU,JAMMY,JAMMY64,AMD64,XORG,LAST\n" +"# fai-diskimage -Nvu machin -S5G -c$cl ubuntu.qcow2\n" +"----" #: fai-guide.txt:1825 msgid "" "You can give disk images a try without installing FAI, if you visit\n" "https://fai-project.org/FAIme/cloud" msgstr "" +"Vous pouvez essayer quelques images de disques sans installer FAI, si vous visitez\n" +"https://fai-project.org/FAIme/cloud" #: fai-guide.txt:1828 msgid "=== [[live-image]]Creating a bootable live image" -msgstr "" +msgstr "=== [[live-image]]Création d'une image vive amorçable" #: fai-guide.txt:1833 msgid "" @@ -4262,6 +4294,10 @@ msgid "" "dirinstall'. Don't forget to add the class +LIVEISO+.\n" "Then create the live ISO using 'fai-cd':" msgstr "" +"La création d'images ISO vives amorçables est facile avec FAI. Il suffit de deux\n" +"étapes. Premièrement, créez votre environnement vif à l'aide de la commande 'fai\n" +"dirinstall'. N'oubliez pas d'ajouter la classe +LIVEISO+.\n" +"Ensuite, créez l'image ISO vive en utilisant 'fai-cd' :" #: fai-guide.txt:1841 msgid "" @@ -4273,16 +4309,25 @@ msgid "" " -n /srv/xfce live.iso\n" "----" msgstr "" +"----\n" +"# cl=\"DEBIAN,BOOKWORM64,AMD64,FAIBASE,XFCE,XORG,DHCPC,DEMO,LIVEISO,LAST\"\n" +"# LC_ALL=C fai -v dirinstall -u xfce33 -c $cl \\\n" +" -s file:///srv/fai/config /srv/xfce\n" +"# fai-cd -s500 -MH -d none -g /etc/fai/grub.cfg.live \\\n" +" -n /srv/xfce live.iso\n" +"----" #: fai-guide.txt:1844 msgid "" "The nfsroot is not needed for a live ISO.\n" "Currently there's no live ISO of the install server available." msgstr "" +"Le nfsroot n'est pas nécessaire pour une image ISO vive.\n" +"Il n'y a pas actuellement d'image vive ISO disponible sur le serveur d'installation." #: fai-guide.txt:1847 msgid "=== [[cross-arch]]Building cross-architecture disk images" -msgstr "" +msgstr "=== [[cross-arch]]Construire des images disque d'architecture différente (cross-architecture)" #: fai-guide.txt:1852 msgid "" @@ -4292,6 +4337,10 @@ msgid "" "amd64\n" "architecture. Here are the steps do to:" msgstr "" +"À partir de FAI 5.4 il devient possible de construire une image disque pour\n" +"des architectures différentes de l'hôte qui est utilisé. Par exemple on peut\n" +"construire une image pour une architecture ARM 64-bit (aarch64) sur un hôte qui fonctionne\n" +"sur une architecture amd64. Voici les étapes successives :" #: fai-guide.txt:1856 msgid "" @@ -4300,6 +4349,9 @@ msgid "" "fai-doc qemu-utils\n" "# fai-mk-configspace" msgstr "" +"----\n" +"# apt install qemu-system-arm qemu-user-static fai-server fai-setup-storage fai-doc qemu-utils\n" +"# fai-mk-configspace" #: fai-guide.txt:1863 msgid "" @@ -4311,6 +4363,12 @@ msgid "" "# cp /var/log/fai/armhost/last/initrd.img* initrd\n" "----" msgstr "" +"# export FAI_BASEFILEURL=https://fai-project.org/download/basefiles/\n" +"# fai-diskimage -vu armhost -S2G -cDEFAULT,DHCPC,DEBIAN,ARM64,BUSTER_ARM64,FAIBASE,DEMO,CLOUD,LAST arm64.raw\n" +"# chown your_user_id arm64.raw\n" +"# cp /var/log/fai/armhost/last/vmlinuz* vmlinuz\n" +"# cp /var/log/fai/armhost/last/initrd.img* initrd\n" +"----" #: fai-guide.txt:1868 msgid "" @@ -4322,6 +4380,10 @@ msgid "" "initrd -append \"console=ttyAMA0 rw ip=dhcp root=/dev/vda1 net.ifnames=0\"\n" "----" msgstr "" +"Ensuite on peut lancer qemu en tant qu'utilisateur ordinaire :\n" +"----\n" +"> qemu-system-aarch64 -m 1000 -M virt,gic_version=3 -cpu cortex-a57 -drive file=arm64.raw,if=virtio,index=1 -no-reboot -nographic -name ARM64 -net nic,name=eth0,model=virtio -net user,name=eth0,-kernel vmlinuz -initrd initrd -append \"console=ttyAMA0 rw ip=dhcp root=/dev/vda1 net.ifnames=0\"\n" +"----" #: fai-guide.txt:1872 msgid "" @@ -4329,6 +4391,9 @@ msgid "" "Keep in mind, that qemu network setup will have poor performance if\n" "not using the virtio driver as above or tap devices." msgstr "" +"Ça fonctionne de même pour d'autres architectures.\n" +"Il faut garder en tête que les réglages réseau de qemu ont des performances dégradées si\n" +"on n'utilise pas le pilote virtio comme ci-dessus ou des TAPs réseaux." #: fai-guide.txt:1878 msgid "" @@ -4336,10 +4401,13 @@ msgid "" "https://fai-project.org/download/basefiles/, or use `mk-basefile` to\n" "create your own." msgstr "" +"On peut trouver les fichiers de base pour plusieurs architectures à\n" +"https://fai-project.org/download/basefiles/, ou utiliser `mk-basefile` pour\n" +"créer son fichier propre." #: fai-guide.txt:1881 msgid "=== [[sysinfo]]FAI rescue system" -msgstr "" +msgstr "=== [[sysinfo]]Système de sauvetage FAI" #: fai-guide.txt:1888 msgid "" @@ -4350,12 +4418,21 @@ msgid "" "hardware information.\n" "Both actions can be used for FAI as a rescue system." msgstr "" +"Si vous assignez à la variable +$FAI_ACTION+ la valeur _sysinfo_ (par exemple\n" +"en utilisant fai-chboot -S), le client n’installera pas de nouveau\n" +"système, mais collectera beaucoup d’informations système. Si vous\n" +"assignez à +$FAI_ACTION+ la valeur _inventory_, vous ne recevrez que\n" +"quelques informations sur le matériel. Les deux actions peuvent être\n" +"utilisées pour FAI comme un système de sauvetage." #: fai-guide.txt:1891 msgid "" "Type _ctrl-c_ to get a shell or use _Alt-F2_ or _Alt-F3_ and you will get\n" "another console terminal, if you have added _createvt_ to +$FAI_FLAGS+." msgstr "" +"Tapez _ctrl-c_ pour obtenir un shell ou utilisez _Alt-F2_ ou _Alt-F3_ et\n" +"vous obtiendrez une autre console de terminal, si vous avez ajouté\n" +"_createvt_ à +$FAI_FLAGS+." #: fai-guide.txt:1899 msgid "" @@ -4367,6 +4444,14 @@ msgid "" "'/tmp/fai'. There you can find much information about the boot\n" "process." msgstr "" +"Vous voilà maintenant avec un système Linux qui fonctionne sur le client\n" +"d’installation sans utiliser le disque dur local. Utilisez-le comme\n" +"système de secours si votre disque local est endommagé ou si\n" +"l’ordinateur ne peut pas démarrer correctement à partir du disque dur.\n" +"Vous obtiendrez un shell et vous pouvez exécuter diverses commandes\n" +"(`dmesg`, `lsmod`, `df`, `lspci`, …). Regardez le fichier\n" +"journal dans `/tmp/fai`. Vous y trouverez de nombreuses informations\n" +"sur le processus d’amorçage." #: fai-guide.txt:1906 msgid "" @@ -4375,12 +4460,19 @@ msgid "" "only one file system table is found, the partitions are mounted\n" "according to this information. Here's an example:" msgstr "" +"FAI monte tous les systèmes de fichiers qu’il trouve sur les disques\n" +"locaux en lecture seule. Il vous indique également sur quelle partition\n" +"un fichier '/etc/fstab' existe. Lorsqu’une seule table de système de\n" +"fichiers est trouvée, les partitions sont montées selon ces\n" +"informations. Voici un exemple :" #: fai-guide.txt:1909 msgid "" "----\n" "demohost:~# df -h" msgstr "" +"----\n" +"demohost:~# df -h" #: fai-guide.txt:1921 msgid "" @@ -4396,12 +4488,26 @@ msgid "" "/dev/mapper/vg1-home 1.4G 72K 1.3G 1% /target/home\n" "----" msgstr "" +"Filesystem Size Used Avail Use% Mounted on\n" +"devtmpfs 4.0M 0 4.0M 0% /dev\n" +"tmpfs 2.0G 0 2.0G 0% /dev/shm\n" +"tmpfs 783M 18M 766M 3% /run\n" +"tmpfs 5.0M 0 5.0M 0% /run/lock\n" +"LiveOS_rootfs 783M 18M 766M 3% /\n" +"192.168.33.250:/srv/fai/config 59G 23G 24G 49% /var/lib/fai/config\n" +"/dev/mapper/vg1-root 7.3G 1.8G 5.2G 26% /target\n" +"/dev/vda1 459M 53M 378M 13% /target/boot\n" +"/dev/mapper/vg1-home 1.4G 72K 1.3G 1% /target/home\n" +"----" #: fai-guide.txt:1924 msgid "" "*This method can be used as a rescue environment!* If you need a file\n" "system with read-write access use the `rwmount` command:" msgstr "" +"*Cette méthode peut être utilisée comme un environnement de sauvetage !* Si\n" +"vous avez besoin d’un système de fichiers avec accès en\n" +"lecture/écriture, utilisez la commande `rwmount` :\n" #: fai-guide.txt:1928 msgid "" @@ -4409,10 +4515,13 @@ msgid "" "demohost# rwmount /target/home\n" "----" msgstr "" +"----\n" +"demohost# rwmount /target/home\n" +"----" #: fai-guide.txt:1930 msgid "=== [[nonfs]]FAI without NFS" -msgstr "" +msgstr "=== [[nonfs]]FAI sans NFS" #: fai-guide.txt:1934 msgid "" @@ -4420,12 +4529,18 @@ msgid "" "without using the NFS protocol, you boot the client machine using PXE as\n" "usual and then retrieve an image containing the nfsroot via http." msgstr "" +"Pour démarrer dans FAI et commencer la séquence d’installation sans\n" +"utiliser le protocole NFS, vous démarrez la machine cliente en utilisant\n" +"PXE comme d’habitude, puis récupérez une image contenant le nfsroot via\n" +"http." #: fai-guide.txt:1937 msgid "" "To create an image, use fai-cd's -S argument and -M to avoid setting up\n" "a partial mirror within the image." msgstr "" +"Pour créer une image, utilisez l’argument -S de fai-cd et -M pour éviter de créer\n" +"un miroir partiel à l'intérieur de l'image." #: fai-guide.txt:1941 msgid "" @@ -4433,12 +4548,18 @@ msgid "" "faiserver# fai-cd -M -S squash.img\n" "----" msgstr "" +"----\n" +"faiserver# fai-cd -M -S squash.img\n" +"----" #: fai-guide.txt:1944 msgid "" "Move this image to a directory from which it can be requested via http\n" "(usually a directory served by the webserver)" msgstr "" +"Déplacez cette image vers un répertoire à partir duquel elle peut être\n" +"demandée via http (généralement un répertoire accessible par le serveur\n" +"web)" #: fai-guide.txt:1948 msgid "" @@ -4446,6 +4567,9 @@ msgid "" "command line, e.g. in your pxelinux configuration file for the client\n" "with fai-chboot." msgstr "" +"Pour demander alors l’image squashfs, ajoutez ce qui suit à votre\n" +"ligne de commande du noyau, par exemple dans votre fichier de configuration\n" +"pxelinux pour le client avec fai-chboot." #: fai-guide.txt:1952 msgid "" @@ -4454,16 +4578,21 @@ msgid "" "fai/config\n" "----" msgstr "" +"----\n" +"root=live:http://faiserver/cskoeln/squash.img FAI_CONFIG_SRC=file:///var/lib/fai/config\n" +"----" #: fai-guide.txt:1955 msgid "" "Replace faiserver with the domain name or IP of the machine your\n" "squash image is served from." msgstr "" +"Remplacez faiserver par le nom de domaine ou l'IP de la machine de laquelle\n" +"votre image de squash est servie." #: fai-guide.txt:1958 msgid "=== [[otherdists]]Installing other distributions using a Debian nfsroot" -msgstr "" +msgstr "=== [[otherdists]]Installation d’autres distributions à l’aide d’un nfsroot Debian" #: fai-guide.txt:1967 msgid "" @@ -4476,6 +4605,15 @@ msgid "" "similar configuration files which are needed for specifying the\n" "location of the package repository." msgstr "" +"Vous pouvez installer toutes sortes de distributions Linux à partir d’un\n" +"seul nfsroot Debian. Par conséquent, vous devez créer un fichier\n" +"base.tar.xz de la distribution que vous souhaitez installer et le placer\n" +"dans le répertoire `basefiles`. Puis nommez-le UBUNTU2204.tar.xz par\n" +"exemple. Un client d’installation appartenant à la classe UBUNTU2204\n" +"extrait ensuite ce fichier de base dans son système de fichiers vide. De\n" +"plus, vous devez ajuster les 'sources.list' ou les fichiers de\n" +"configuration similaires nécessaires pour spécifier l’emplacement du\n" +"dépôt de paquets." #: fai-guide.txt:1972 msgid "" @@ -4484,6 +4622,10 @@ msgid "" "Some basefiles can be downloaded from\n" "https://fai-project.org/download/basefiles/." msgstr "" +"L’outils `rinse(8)` est utilisé pour créer des fichiers de base pour\n" +"des distributions comme Rocky Linux, CentOS, openSUSE, ou Fedora.\n" +"Certains fichiers de base peuvent être téléchargés à partir de\n" +"https://fai-project.org/download/basefiles/." #: fai-guide.txt:1976 msgid "" @@ -4491,10 +4633,13 @@ msgid "" "'/usr/share/doc/fai-doc/examples/simple/basefiles/' helps creating\n" "this base files." msgstr "" +"Le script +mk-basefile+ dans\n" +"'/usr/share/doc/fai-doc/examples/simple/basefiles/' aide à créer ces\n" +"fichiers de base." #: fai-guide.txt:1978 msgid "=== [[dirinstall]]Creating chroot and virtualization environments" -msgstr "" +msgstr "=== [[dirinstall]]Création d’environnements chroot et de virtualisation" #: fai-guide.txt:1984 msgid "" @@ -4504,6 +4649,11 @@ msgid "" "domains), there is the FAI action _dirinstall_.\n" "By calling" msgstr "" +"Si vous devez créer certains environnements chroot, ou un environnement\n" +"de virtualisation où vous ne pouvez ni ne voulez exécuter un programme\n" +"d’installation Debian normal pour accéder à un système opérationnel (par\n" +"exemple, les domaines hôtes Xen), il y a l’action FAI _dirinstall_. En\n" +"appelant :" #: fai-guide.txt:1988 msgid "" @@ -4511,6 +4661,9 @@ msgid "" "faiserver# fai dirinstall \n" "----" msgstr "" +"----\n" +"faiserver# fai dirinstall \n" +"----" #: fai-guide.txt:1993 msgid "" @@ -4519,6 +4672,10 @@ msgid "" "directory. The host name for the target installation can be specified\n" "using _-u _" msgstr "" +"et en utilisant l’option _-c _ ou _-N_ vous obtenez une\n" +"installation FAI, sans l’action de partitionnement, directement dans le\n" +"répertoire cible. Le nom d’hôte de la cible d'installation peut être\n" +"spécifié à l’aide de _-u _" #: fai-guide.txt:2002 msgid "" @@ -4531,6 +4688,16 @@ msgid "" "system. They get them even in xen-tools installations, by using the\n" "following code as a xen-tools role script:" msgstr "" +"On peut utiliser cela, par exemple, pour combiner FAI avec les outils\n" +"_xen-tools_, qui vous aident à construire des domaines invités Xen.\n" +"Les _xen-tools_ sont très agréables pour générer des fichiers de configuration\n" +"et bloquer des périphériques pour de nouveaux invités sur la base de\n" +"commandes simples et/ou des fichiers de configuration, mais ils ne\n" +"peuvent assigner qu’un seul rôle par installation pour la\n" +"personnalisation. Les utilisateurs de FAI ont besoin de plus et en veulent, car\n" +"ils ont l'habitude d'avoir le système de classes. Ils peuvent y arriver\n" +"même dans les installations xen-tools, en utilisant le code suivant en\n" +"tant que rôle xen-tools script :" #: fai-guide.txt:2010 msgid "" @@ -4542,12 +4709,21 @@ msgid "" "$CMD\n" "----" msgstr "" +"----\n" +"#!/bin/sh\n" +"TARGET=$1\n" +"CMD=\"fai -N -v -u ${hostname} dirinstall $TARGET\"\n" +"echo running $CMD\n" +"$CMD\n" +"----" #: fai-guide.txt:2013 msgid "" "Then, you should set the variable _install=0_ in the config of\n" "xen-tools for that host." msgstr "" +"Ensuite, il faut définir la variable _install=0_ dans la configuration\n" +"xen-tools pour cet hôte." #: fai-guide.txt:2022 msgid "" @@ -4560,6 +4736,15 @@ msgid "" "tasks for updating and installing software packages and calling the\n" "customization scripts." msgstr "" +"=== [[softupdate]]Utilisation de FAI pour les mises à jour\n" +"FAI peut également effectuer des mises à jour de systèmes déjà en cours\n" +"d’exécution, sans réinstallation à partir de zéro. C’est ce qu’on\n" +"appelle softupdate. Un FAI softupdate ignore les tâches qui ne sont pas\n" +"adaptées à la mise à jour d’un système en cours d’exécution, comme le\n" +"partitionnement des disques durs et la création de systèmes de fichiers.\n" +"Au lieu de cela, il exécute uniquement les tâches de mise à jour et\n" +"d’installation des paquets logiciels et l’appel des scripts de\n" +"personnalisation." #: fai-guide.txt:2027 msgid "" @@ -4568,6 +4753,10 @@ msgid "" "# fai -v -s nfs://faiserver/srv/fai/config softupdate\n" "----" msgstr "" +"Pour lancer un softupdate :\n" +"----\n" +"# fai -v -s nfs://faiserver/srv/fai/config softupdate\n" +"----" #: fai-guide.txt:2032 msgid "" @@ -4576,6 +4765,10 @@ msgid "" "in a _class/*.var_ file) if FAI should save the log files to a remote\n" "machine." msgstr "" +"Par défaut, un softupdate utilise la liste des classes définies lors de\n" +"l’installation initiale. Assurez-vous de définir la variable\n" +"+$LOGSERVER+ (ça se fait dans un fichier _class/*.var_) si FAI doit\n" +"enregistrer les fichiers journaux sur une machine distante." #: fai-guide.txt:2038 msgid "" @@ -4584,6 +4777,10 @@ msgid "" "like `clusterssh(1)` to start a softupdate via a push on a list of\n" "hosts." msgstr "" +"C’est à vous de décider, comment démarrer un softupdate sur un plus grand nombre\n" +"d’hôtes. Vous pouvez faire le softupdate sur régulièreent via cron\n" +"ou vous pouvez utiliser des outils comme `clusterssh(1)` pour démarrer\n" +"un softupdate via un push sur une liste d’hôtes." #: fai-guide.txt:2044 msgid "" @@ -4592,10 +4789,15 @@ msgid "" "of their operation should always produce the same result, even when\n" "they run more than once." msgstr "" +"Gardez à l’esprit que les scripts de personnalisation sont exécutés\n" +"chaque fois que vous faites un softupdate. Cela signifie qu’ils doivent\n" +"être *idempotents*, c’est-à-dire que le résultat de leur fonctionnement\n" +"doit toujours produire le même résultat, même lorsqu’ils fonctionnent\n" +"plus d’une fois." #: fai-guide.txt:2046 msgid "For example appending a line to a file must not done via this code:" -msgstr "" +msgstr "Par exemple, l’ajout d’une ligne à un fichier ne doit pas se faire via ce code :" #: fai-guide.txt:2052 msgid "" @@ -4605,6 +4807,11 @@ msgid "" "Instead use the command `ainsl(1)` in a shell script or use cfengine's\n" "function _AppendIfNoSuchLine_." msgstr "" +"----\n" +"$ echo \"some strings\" >> /etc/fstab\n" +"----\n" +"Au lieu de ça, utilisez la commande `ainsl(1)` dans un script shell ou utilisez la fonction\n" +"de cfengine _AppendIfNoSuchLine_." #: fai-guide.txt:2058 msgid "" @@ -4613,22 +4820,32 @@ msgid "" "initial installation or wether it's the normal file system relative to\n" "_/_ during softupdate." msgstr "" +"Toutes les commandes du script de personnalisation doivent être capables\n" +"de modifier le système de fichiers cible qui’il soit disponible dans\n" +"_/target_ lors de l’installation initiale ou qu'il soit le système de\n" +"fichiers normal relatif à _/_ pendant le softtupdate." #: fai-guide.txt:2060 msgid "Here are some variable that help writing these scripts:" -msgstr "" +msgstr "Voici quelques variables qui aident à écrire ces scripts :" #: fai-guide.txt:2063 msgid "" "+$target+:: Points to the root directory of the client, which\n" "is _/target_ during installation and _/_ during a softupdate." msgstr "" +"+$target+::\n" +"Pointe vers le répertoire racine du client, qui est _/target_ pendant\n" +"l’installation et _/_ pendant un softupdate." #: fai-guide.txt:2066 msgid "" "+$FAI_ROOT+:: It's the same value as +$target+. For historic reasons\n" "we have both these variables in FAI." msgstr "" +"+$FAI_ROOT+::\n" +"C’est la même valeur que +$target+. Pour des raisons historiques,\n" +"on a ces deux variables dans FAI." #: fai-guide.txt:2071 msgid "" @@ -4639,6 +4856,11 @@ msgid "" "run a\n" "command inside the clients target file system via chroot." msgstr "" +"+$ROOTCMD+::\n" +"Dans le cas de l’installation, il s’agit d’un alias pour 'chroot $target'\n" +"en cas de softupdate, c’est juste vide. Vous pouvez ajouter\n" +"ceci avant les commandes si vous avez besoin d’exécuter une commande dans le\n" +"système de fichiers cible des clients via chroot." #: fai-guide.txt:2078 msgid "" @@ -4648,10 +4870,15 @@ msgid "" "_install_, _softupdate_, _dirinstall_, _sysinfo_, _inventory_ or your\n" "own defined action." msgstr "" +"+$FAI_ACTION+::\n" +"Si vous devez appeler le code en fonction de l’action FAI effectuée,\n" +"vous pouvez utiliser cette variable. Elle contient l’action actuellement\n" +"exécutée: _install_, _softupdate_, _dirinstall_, _sysinfo_,\n" +"_inventory_ ou votre propre action définie." #: fai-guide.txt:2080 msgid "=== [[archcross]]How to install 32-bit OS from a 64-bit OS" -msgstr "" +msgstr "=== [[archcross]]Comment installer un système d’exploitation 32 bits à partir d’un système d’exploitation 64 bits" #: fai-guide.txt:2085 msgid "" @@ -4660,6 +4887,11 @@ msgid "" "quite simple. Install and set up the FAI packages. Then copy your FAI\n" "config files to a new subdirectory." msgstr "" +"Pour installer un ordinateur avec un système d’exploitation 32 bits,\n" +"vous avez besoin d’un nfsroot i386. La création de ce nfsroot 32 bits\n" +"sur un serveur d’installation qui fonctionne sous amd64 est simple.\n" +"Installez et configurez les paquets FAI. Copiez ensuite vos fichiers de\n" +"configuration FAI dans un nouveau sous-répertoire." #: fai-guide.txt:2089 msgid "" @@ -4667,6 +4899,9 @@ msgid "" "faiserver# cp -a /etc/fai /etc/fai-i386\n" "----" msgstr "" +"----\n" +"faiserver# cp -a /etc/fai /etc/fai-i386\n" +"----" #: fai-guide.txt:2094 msgid "" @@ -4675,6 +4910,10 @@ msgid "" "i386+. Also choose a different directory for your new nfsroot. Here\n" "are the two lines after editing." msgstr "" +"Modifiez la variable +$FAI_DEBOOTSTRAP_OPTS+ dans\n" +"'/etc/fai-i386/nfsroot.conf' et ajoutez l’option +--arch i386+.\n" +"Choisissez également un répertoire différent pour votre nouveau nfsroot.\n" +"Voici les deux lignes après l'édition." #: fai-guide.txt:2099 msgid "" @@ -4683,12 +4922,18 @@ msgid "" "FAI_DEBOOTSTRAP_OPTS=\"--arch i386 --exclude=info --include=aptitude\"\"\n" "----" msgstr "" +"----\n" +"NFSROOT=/srv/fai/nfsroot-i386\n" +"FAI_DEBOOTSTRAP_OPTS=\"--arch i386 --exclude=info --include=aptitude\"\"\n" +"----" #: fai-guide.txt:2102 msgid "" "Now call fai-make-nfsroot which creates the 32-bit nfsroot in\n" "'/srv/fai/nfsroot-i386'" msgstr "" +"Appelez maintenant fai-make-nfsroot qui crée le nfsroot 32 bits dans\n" +"'/srv/fai/nfsroot-i386'" #: fai-guide.txt:2106 msgid "" @@ -4696,6 +4941,9 @@ msgid "" "faiserver# fai-make-nfsroot -v -C/etc/fai-i386\n" "----" msgstr "" +"----\n" +"faiserver# fai-make-nfsroot -v -C/etc/fai-i386\n" +"----" #: fai-guide.txt:2110 msgid "" @@ -4703,6 +4951,10 @@ msgid "" "a bootable CD or USB stick is also possible on a different architecture.\n" "You have to specify the architecture when calling fai-mirror." msgstr "" +"La création d’un miroir partiel utilisant `fai-mirror(1)` qui est nécessaire à\n" +"un CD amorçable ou une clé USB est également possible sur une\n" +"architecture différente. Vous devez spécifier l’architecture lors de\n" +"l’appel de fai-mirror." #: fai-guide.txt:2114 msgid "" @@ -4711,14 +4963,17 @@ msgid "" "i386\n" "----" msgstr "" +"----\n" +"$ fai-mirror -m800 -B -a i386 -v -cDEFAULT,DEBIAN,FAIBASE,I386 /srv/mirror-i386\n" +"----" #: fai-guide.txt:2116 msgid "That's all!" -msgstr "" +msgstr "Et voilà !" #: fai-guide.txt:2119 msgid "=== [[error]]Aborting the installation when an error occurs" -msgstr "" +msgstr "=== [[error]]Arrêt d'urgence de l'installation quand une erreur se produit" #: fai-guide.txt:2127 msgid "" @@ -4730,6 +4985,13 @@ msgid "" "is greater than +$STOP_ON_ERROR+ the installation will stop\n" "immediately. In a hook, just add a call like this:" msgstr "" +"Chaque tâche, chaque hook peut appeler la fonction +task_error+\n" +"pour envoyer une valeur d'erreur à l'installation. Cette erreur apparaîtra dans\n" +"le fichier de journalisation et peut être visionnée dans le `fai-monitor-gui(1)`.\n" +"La valeur de l'erreur est aussi examinée en tenant compte de la variable +$STOP_ON_ERROR+\n" +"qui est réglée à 700 par défaut. Si la valeur d'erreur est\n" +"supérieure à +$STOP_ON_ERROR+, l'installation s'arrêtera\n" +"immédiatment. Dans un hook, ajoutez simplement un appel comme celui-ci :" #: fai-guide.txt:2131 msgid "" @@ -4737,12 +4999,17 @@ msgid "" "task_error \n" "----" msgstr "" +"----\n" +"task_error \n" +"----" #: fai-guide.txt:2134 msgid "" "It is comfortable to call task_error with $? as second parameter, for\n" "e.g. if you want to set an error value of 123 use this" msgstr "" +"C'est commode d'appeler task_error avec $? comme deuxième paramètre, par\n" +"exemple si on veut émettre une valeur d'erreur de 123 on peut faire ainsi" #: fai-guide.txt:2139 msgid "" @@ -4751,6 +5018,10 @@ msgid "" "task_error 123 $?\n" "----" msgstr "" +"----\n" +"\n" +"task_error 123 $?\n" +"----" #: fai-guide.txt:2143 msgid "" @@ -4758,6 +5029,9 @@ msgid "" "some error. The same syntax can be used by the scripts in the class\n" "subdirectory ending in .sh." msgstr "" +"Alors, l'erreur de tâche n'est mise en place que si la commande précédente a échoué avec\n" +"une certaine erreur. La même syntaxe peut être utilisée par les scripts dans le sous-répertoire\n" +"de classe qui se terminent en .sh." #: fai-guide.txt:2148 msgid "" @@ -4766,6 +5040,10 @@ msgid "" "third parameter. As an example you can use those two variants for\n" "setting the value to 123" msgstr "" +"Un cas particulier est celui des scripts dans le sous-répertoire class/ qui ne se termine\n" +"pas en .sh. Dans ces scripts il faut appeler task_error avec 1 comme\n" +"troisième paramètre. Par exemple on peut utiliser deux variantes pour\n" +"régler la valeur à 123" #: fai-guide.txt:2152 msgid "" @@ -4773,11 +5051,14 @@ msgid "" "task_error 123 $? 1\n" "----" msgstr "" +"----\n" +"task_error 123 $? 1\n" +"----" #: fai-guide.txt:2154 msgctxt "fai-guide.txt:2154" msgid "or" -msgstr "" +msgstr "or" #: fai-guide.txt:2158 msgid "" @@ -4785,6 +5066,9 @@ msgid "" "task_error 123 1 1\n" "----" msgstr "" +"----\n" +"task_error 123 1 1\n" +"----" #: fai-guide.txt:2162 msgid "" @@ -4792,10 +5076,13 @@ msgid "" "the value of +$?+. If the error value is greater than +$STOP_ON_ERROR+,\n" "the installation will abort immediately." msgstr "" +"La dernière commande met toujours l'erreur de tâche à 123 sans tenir compte de $?.\n" +"Si la valeur d'erreur est supérieure à +$STOP_ON_ERROR+,\n" +"l'installation sera immédiatement stoppée." #: fai-guide.txt:2164 msgid "The error values are grouped into four categories" -msgstr "" +msgstr "Les valeurs d'erreur sont regroupées dans quatre catégories" #: fai-guide.txt:2171 msgid "" @@ -4806,18 +5093,24 @@ msgid "" "errors: 7xx, 8xx\n" "----" msgstr "" +"----\n" +"normale ou messages d'information : 1xx, 2xx\n" +"avertissements : 3xx, 4xx\n" +"erreurs mineures : 5xx, 6xx\n" +"erreurs : 7xx, 8xx\n" +"----" #: fai-guide.txt:2173 msgid "The fai-monitor-gui has 4 different icons for these error categories." -msgstr "" +msgstr "Le fai-monitor-gui possède 4 icônes différentes pour ces catégories d'erreur." #: fai-guide.txt:2176 msgid "== [[hints]]Various hints and details" -msgstr "" +msgstr "== [[hints]]Divers conseils et détails" #: fai-guide.txt:2179 msgid "=== [[tasks]]The list of tasks" -msgstr "" +msgstr "=== [[tasks]]La liste des tâches" #: fai-guide.txt:2187 msgid "" @@ -4830,12 +5123,22 @@ msgid "" "__task___). A task and its hooks can be\n" "skipped on demand by using the command _skiptask()_." msgstr "" +"La plupart des tâches de l’installation sont définies comme des\n" +"sous-routines qui sont définies dans '/usr/lib/fai/subroutines' (par\n" +"exemple +task_instsoft+). Certaines sont des scripts shell externes\n" +"situés dans '/usr/lib/fai/'. Elles sont appelées via un sous-programme\n" +"supérieur nommé _task_. Ce sous-programme appelle les hooks si\n" +"disponibles, puis appelle la tâche (définie comme __task___). Une\n" +"tâche et ses hooks peuvent être ignorés à la demande en utilisant la\n" +"commande _skiptask()_." #: fai-guide.txt:2190 msgid "" "Now follows the description of all tasks, listed in the order\n" "they are executed." msgstr "" +"Voici maintenant la description de toutes les tâches, énumérées dans\n" +"l’ordre dans lequel elles sont exécutées." #: fai-guide.txt:2203 msgid "" @@ -4852,6 +5155,17 @@ msgid "" "exists. Using this file, you can define your own subroutines or\n" "override the definition of FAI's subroutines." msgstr "" +"confdir::\n" +" Les paramètres ajoutés au noyau peuvent définir des variables, le\n" +" démon syslog est démarré. Les paramètres de réseau sont récupérés d'un serveur DHCP\n" +" et sont enregistrés dans +boot.log+. La configuration pour la résolution DNS est créée.\n" +" +\n" +" L’emplacement de l’espace de configuration est défini par la variable\n" +" +$FAI_CONFIG_SRC+.\n" +" +\n" +" Ensuite, le fichier '$FAI/hooks/subroutines' est sourcé s’il existe.\n" +" En utilisant ce fichier, vous pouvez définir vos propres\n" +" sous-programmes ou remplacer la définition des sous-programmes de FAI." #: fai-guide.txt:2209 msgid "" @@ -4860,6 +5174,11 @@ msgid "" "additional virtual terminals are opened on demand. A secure shell\n" "daemon is started on demand for remote logins." msgstr "" +"setup::\n" +" Cette tâche définit l’heure du système, tous les +$FAI_FLAGS+ sont\n" +" définis et deux terminaux virtuels supplémentaires sont ouverts à la\n" +" demande. Un démon ssh est lancé à la demande pour les\n" +" connexions à distance." #: fai-guide.txt:2215 msgid "" @@ -4869,6 +5188,12 @@ msgid "" "variable +$ADDCLASSES+. The list of all defined classes is stored in\n" "the variable +$classes+ and saved to '/tmp/fai/FAI_CLASSES'." msgstr "" +"defclass::\n" +" Appels de `fai-class(1)` pour définir des classes à l’aide de scripts\n" +" et de fichiers dans '$FAI/class' et classes de\n" +" '/tmp/fai/additional-classes' et la variable +$ADDCLASSES+. La liste\n" +" de toutes les classes définies est stockée dans la variable\n" +" +$classes+ et enregistrée dans '/tmp/fai/FAI_CLASSES'." #: fai-guide.txt:2220 msgid "" @@ -4877,6 +5202,10 @@ msgid "" "hook has written some variable definitions to the file\n" "'$LOGDIR/additional.var', this file is also sourced." msgstr "" +"defvar::\n" +" Source tous les fichiers '$FAI/class/*.var' pour chaque classe\n" +" définie. Si un hook a écrit quelques définitions de variables dans le\n" +" fichier '$LOGDIR/additional.var', ce fichier est également sourcé." #: fai-guide.txt:2228 msgid "" @@ -4889,6 +5218,13 @@ msgid "" "'$FAI/hooks/$FAI_ACTION' exists. So you can easily define your own\n" "actions." msgstr "" +"action::\n" +" En fonction de la valeur de +$FAI_ACTION+, ce sous-programme décide\n" +" de l’action FAI à exécuter. Les actions disponibles par défaut sont :\n" +" _sysinfo_, _install_, _inventory_, _dirinstall_ et _softupdate_. Si\n" +" +$FAI_ACTION+ a une autre valeur, une action définie par\n" +" l’utilisateur est appelée si un fichier '$FAI/hooks/$FAI_ACTION'\n" +" existe. Ainsi, vous pouvez facilement définir vos propres actions." #: fai-guide.txt:2235 msgid "" @@ -4899,12 +5235,21 @@ msgid "" "regard to a 'fstab' file found inside a partition. Log files are\n" "stored to the install server." msgstr "" +"sysinfo::\n" +" Appelée lorsque aucune installation n’est effectuée mais que l’action\n" +" est _sysinfo_. Elle affiche des informations sur le matériel détecté et\n" +" monte les disques durs locaux en lecture seule sur\n" +" '/target/+partitionname+' ou en tenant compte d’un fichier 'fstab' trouvé à\n" +" l’intérieur d’une partition. Les fichiers journaux sont stockés sur le\n" +" serveur d’installation." #: fai-guide.txt:2238 msgid "" "inventory::\n" "A short list of system information is printed." msgstr "" +"inventory::\n" +" Une courte liste des informations système est imprimée." #: fai-guide.txt:2246 msgid "" @@ -4916,6 +5261,14 @@ msgid "" "can find examples of the log files\n" "at https://fai-project.org/logs/." msgstr "" +"install::\n" +" Cette tâche contrôle la séquence d’installation. Vous entendrez trois\n" +" bips avant le début de l’installation. Le travail principal consiste à\n" +" appeler d’autres tâches et à enregistrer la sortie dans\n" +" '/tmp/fai/fai.log'. Si vous avez des problèmes pendant l’installation,\n" +" regardez tous les fichiers dans '/tmp/fai/'. Vous trouverez des\n" +" exemples de fichiers journaux à l’adresse\n" +" https://fai-project.org/logs/." #: fai-guide.txt:2250 msgid "" @@ -4923,6 +5276,9 @@ msgid "" "Install into a directory, not onto a local disk. Use this for creating\n" "chroot environments." msgstr "" +"dirinstall::\n" +" Installe dans un répertoire, et non pas sur un disque local.\n" +" Utilisez-le pour créer des environnements chroot." #: fai-guide.txt:2255 msgid "" @@ -4931,6 +5287,11 @@ msgid "" "line interface, performs a softupdate. See chapter <> for\n" "details." msgstr "" +"softupdate::\n" +" Cette tâche, exécutée à l’intérieur d’un système en cours d’exécution\n" +" via la commande en ligne `fai(8)`, effectue un\n" +" softupdate. Voir le chapitre <> pour plus\n" +" de détails." #: fai-guide.txt:2262 msgid "" @@ -4941,6 +5302,13 @@ msgid "" "$BOOT_PARTITION, $BOOT_DEVICE+) to '/tmp/fai/disk_var.sh' and creates\n" "a 'fstab' file for the new system." msgstr "" +"partition::\n" +" Appelle `setup-storage(8)` pour partitionner les disques durs et\n" +" créer des systèmes de fichiers. La tâche écrit des définitions de\n" +" variables pour les partitions et périphériques racine et de démarrage\n" +" (+$ROOT_PARTITION, $BOOT_PARTITION, $BOOT_DEVICE+) dans\n" +" '/tmp/fai/disk_var.sh' et crée un fichier 'fstab' pour le nouveau\n" +" système." #: fai-guide.txt:2266 msgid "" @@ -4948,6 +5316,9 @@ msgid "" "Mounts the created partitions according to the created\n" "'/tmp/fai/fstab' file relative to +$FAI_ROOT+." msgstr "" +"mountdisks::\n" +" Monte les partitions créées en fonction du fichier '/tmp/fai/fstab'\n" +" créé par rapport à +$FAI_ROOT+." #: fai-guide.txt:2277 msgid "" @@ -4963,12 +5334,26 @@ msgid "" "This task uses the variable +FAI_BASEFILEURL+ for fetching the base\n" "file via FTP, HTTPS or HTTP if it's defined." msgstr "" +"extrbase::\n" +" Extrait un système minimal après lequel un chroot puisse y être\n" +" introduit. Par défaut, le fichier tar de base '/var/tmp/base.tar.xz' sera\n" +" extrait. Les fichiers correspondant à un nom de classe dans\n" +" `$FAI/basefiles/` sont également utilisés pour décompresser un autre\n" +" fichier tar selon les classes définies. Cela peut être utilisé pour\n" +" installer des distributions Linux différentes de celles utilisées pour\n" +" créer le nfsroot. Le fichier par défaut 'base.tar.xz' est un\n" +" instantané d’un système Debian de base créé par `debootstrap(8)`\n" +" Cette tâche utilise la variable +FAI_BASEFILEURL+ pour récupérer le\n" +" fichier de base via FTP, HTTPS ou HTTP si celle-ci est définie." #: fai-guide.txt:2280 msgid "" "debconf::\n" "Calls `fai-debconf(1)` to set the values for the debconf preseeding database." msgstr "" +"debconf::\n" +" Appelle `fai-debconf(1)` pour définir les valeurs de la base de\n" +" données de pré-ensemencement de debconf." #: fai-guide.txt:2286 msgid "" @@ -4978,6 +5363,11 @@ msgid "" "in a class based manner from files like _CLASSNAME.gpg_\n" "in the directory _package_config_." msgstr "" +"repository::\n" +" Prépare l’accès au dépôt de paquets en préparant la\n" +" configuration apt. Cela peut également ajouter des clés de dépôts\n" +" en tenant compte des classes à partir de fichiers comme\n" +" _CLASSNAME.gpg_ dans le répertoire _package_config_." #: fai-guide.txt:2293 msgid "" @@ -4987,6 +5377,12 @@ msgid "" "inside the new installed system using `dpkg-divert(8)`, so no daemons\n" "will be started during the installation." msgstr "" +"updatebase::\n" +" Met à jour les paquets de base du nouveau système et met à jour la\n" +" liste des paquets disponibles. Il contrefait également certaines\n" +" commandes (appelées diversions) à l’intérieur du nouveau système\n" +" installé à l’aide de `dpkg-divert(8)`, de sorte qu’aucun démon ne\n" +" soit démarré pendant l’installation." #: fai-guide.txt:2297 msgid "" @@ -4994,6 +5390,9 @@ msgid "" "Installs the desired software packages using class files in\n" "'$FAI/package_config/'." msgstr "" +"instsoft::\n" +" Installe les paquets logiciels souhaités en utilisant des fichiers de classe\n" +" dans '$FAI/package_config/'." #: fai-guide.txt:2301 msgid "" @@ -5001,6 +5400,9 @@ msgid "" "Calls scripts in '$FAI/scripts/' and its subdirectories for every\n" "defined class." msgstr "" +"configure::\n" +" Appelle les scripts dans '$FAI/scripts/' et ses sous-répertoires pour\n" +" chaque classe définie." #: fai-guide.txt:2305 msgid "" @@ -5008,6 +5410,9 @@ msgid "" "Calls test scripts in '$FAI/tests/' and its subdirectories for every\n" "defined class." msgstr "" +"tests::\n" +" Appelle les scripts de test dans '$FAI/tests/' et ses sous-répertoires\n" +" pour chaque classe définie." #: fai-guide.txt:2309 msgid "" @@ -5015,6 +5420,10 @@ msgid "" "Unmounts all file systems in the new installed system and removes\n" "diversions of files using the command `fai-divert`." msgstr "" +"finish::\n" +" Démonte tous les systèmes de fichiers dans le nouveau système installé\n" +" et supprime les diversions de fichiers à l’aide de la commande\n" +" `fai-divert`." #: fai-guide.txt:2315 msgid "" @@ -5025,6 +5434,12 @@ msgid "" "card via TFTP. Therefore the `fai-chboot(8)` command is executed\n" "remotely on the install server." msgstr "" +"chboot::\n" +" Modifie la configuration PXE d’un hôte sur le serveur d’installation,\n" +" qui indique quelle configuration PXELINUX doit être chargée lors de la\n" +" prochaine initialisation à partir de la carte réseau via TFTP. Par\n" +" conséquent, la commande `fai-chboot(8)` est exécutée à distance sur\n" +" le serveur d’installation." #: fai-guide.txt:2319 msgid "" @@ -5032,6 +5447,10 @@ msgid "" "Saves log files to local disk and to the account +$LOGUSER+ on\n" "+$LOGSERVER+ (defaults to the install server)." msgstr "" +"savelog::\n" +" Enregistre les fichiers journaux sur le disque local et sur le compte\n" +" +$LOGUSER+ sur +$LOGSERVER+ (par défaut sur le serveur\n" +" d’installation)." #: fai-guide.txt:2324 msgid "" @@ -5040,10 +5459,15 @@ msgid "" "and automatically reboots the install clients or waits for manual\n" "input before reboot." msgstr "" +"faiend::\n" +" Attend que les travaux en arrière-plan se terminent (par exemple,\n" +" qu'emacs compile des fichiers lisp) puis redémarre automatiquement les\n" +" clients d’installation ou attend la saisie manuelle avant le\n" +" redémarrage." #: fai-guide.txt:2327 msgid "=== [[itests]]Automated tests" -msgstr "" +msgstr "=== [[itests]]Tests automatisés" #: fai-guide.txt:2336 msgid "" @@ -5056,10 +5480,18 @@ msgid "" "executing another tests during next boot via the variable\n" "+$ADDCLASSES+." msgstr "" +"Après l’exécution des scripts de personnalisation, FAI exécutera\n" +"certains tests si disponibles. En utilisant ces tests, vous pouvez\n" +"vérifier les erreurs de l’installation. Les scripts de test sont appelés\n" +"via `fai-do-scripts(1)` et doivent ajouter leurs messages à\n" +"'$LOGDIR/test.log'. Un module Perl comprenant des sous-routines utiles\n" +"peut être trouvé dans _Faitest.pm_. Un test peut également définir une\n" +"nouvelle classe pour exécuter d’autres tests lors du prochain démarrage\n" +"via la variable +$ADDCLASSES+." #: fai-guide.txt:2339 msgid "=== [[autodiscover]] Autodiscover" -msgstr "" +msgstr "=== [[autodiscover]]Découvrir automatiquement" #: fai-guide.txt:2344 msgid "" @@ -5068,12 +5500,18 @@ msgid "" "having to collect every client's MAC address and configuring the DHCP\n" "daemon." msgstr "" +"Dans FAI 5.0, nous avons publié une fonctionnalité qui permet aux\n" +"clients de rechercher le faiserver dans leur sous-réseau respectif. Cela\n" +"soulève la nécessité de récupérer l’adresse MAC de chaque client et de\n" +"configurer le démon DHCP." #: fai-guide.txt:2347 msgid "" "This is done by booting from a small FAI autodiscover bootmedium (CD,\n" "USB, etc.), which can be created via the command:" msgstr "" +"Cela se fait en démarrant à partir d’une petit media vif autodiscover FAI\n" +"(CD, USB, etc.), qui peut être créé via la commande :" #: fai-guide.txt:2351 msgid "" @@ -5081,6 +5519,9 @@ msgid "" "faiserver# fai-cd -A autodiscover.iso\n" "----" msgstr "" +"----\n" +"faiserver# fai-cd -A autodiscover.iso\n" +"----" #: fai-guide.txt:2357 msgid "" @@ -5090,22 +5531,32 @@ msgid "" "does. From this menu, you can select the installation type you wish to\n" "perform." msgstr "" +"L’image a une taille d’environ 25 Mo et analyse le sous-réseau d’un\n" +"serveur FAI. Par défaut, il affiche un menu avec tous les profils\n" +"disponibles dans l’espace de configuration de la même manière que\n" +"le fait l'option 'menu'. Dans ce menu, vous pouvez sélectionner le type\n" +"d’installation que vous souhaitez effectuer." #: fai-guide.txt:2360 msgid "" "For the clients to find the faiserver, the faiserver must run\n" "fai-monitor." msgstr "" +"Pour que les clients puissent trouver le faiserver, le faiserver doit\n" +"lancer fai-monitor." #: fai-guide.txt:2362 msgid "=== [[changeboot]]Changing the boot device" -msgstr "" +msgstr "=== [[changeboot]]Modification du périphérique d’amorçage" #: fai-guide.txt:2365 msgid "" "Changing the boot sequence is normally done in the BIOS setup. But you\n" "can't change the BIOS from a running Linux system." msgstr "" +"La modification de la séquence d’amorçage s’effectue normalement dans la\n" +"configuration du BIOS. Mais vous ne pouvez pas changer le BIOS d’un\n" +"système Linux en cours d’exécution." #: fai-guide.txt:2373 msgid "" @@ -5117,10 +5568,17 @@ msgid "" "should be performed, or if the client should to boot from local\n" "disk. This is done using `fai-chboot(8)`." msgstr "" +"Ainsi, la séquence d’amorçage du BIOS restera inchangée et votre\n" +"ordinateur devrait toujours démarrer en premier à partir de sa carte\n" +"réseau et le deuxième périphérique d’amorçage devrait être le disque\n" +"local. Ensuite, vous pouvez changer le périphérique d’amorçage du client\n" +"en créant différentes configurations PXELINUX. Cela définira si une\n" +"installation doit être effectuée, ou si le client doit démarrer à partir\n" +"du disque local. Cela se fait à l’aide de `fai-chboot(8)`." #: fai-guide.txt:2376 msgid "=== [[debian-mirror]]How to create a local Debian mirror" -msgstr "" +msgstr "=== [[debian-mirror]]Comment créer un miroir Debian local" #: fai-guide.txt:2386 msgid "" @@ -5136,6 +5594,16 @@ msgid "" "+mkdebmirror -v+. A root account is not necessary to create and\n" "maintain the Debian mirror." msgstr "" +"Le script utilitaire `mkdebmirror` footnote:[On peut trouver ce script dans\n" +"'/usr/share/doc/fai-doc/examples/utils/'] peut\n" +"être utilisé pour créer votre propre miroir Debian local. Ce script\n" +"utilise la commande `debmirror(1)`. Un miroir Debian partiel pour\n" +"l’architecture amd64 pour Debian 11 et 12 (noms de code bullseye et bookworm) sans les\n" +"paquets source nécessite environ 180 Go d’espace disque. L’accès au miroir\n" +"via HTTP sera la méthode par défaut dans la plupart des cas. Pour\n" +"afficher plus de résultats à partir du script, appelez\n" +"+mkdebmirror -v+. Un compte root n’est pas nécessaire pour créer et\n" +"maintenir le miroir Debian." #: fai-guide.txt:2390 msgid "" @@ -5143,6 +5611,9 @@ msgid "" "and create a symlink to the local directory where your mirror is\n" "located:" msgstr "" +"Pour utiliser l’accès HTTP au miroir Debian local, installez un serveur\n" +"web et créez un lien symbolique vers le répertoire local où se trouve\n" +"votre miroir :" #: fai-guide.txt:2395 msgid "" @@ -5151,6 +5622,10 @@ msgid "" "faiserver# ln -s /files/scratch/debmirror /var/www/html/debmirror\n" "----" msgstr "" +"----\n" +"faiserver# apt-get install apache2\n" +"faiserver# ln -s /files/scratch/debmirror /var/www/html/debmirror\n" +"----" #: fai-guide.txt:2400 msgid "" @@ -5159,10 +5634,14 @@ msgid "" "HTTP server to the variable +$NFSROOT_ETC_HOSTS+ in\n" "'nfsroot.conf' if the install clients have no DNS resolving." msgstr "" +"Créez un fichier `sources.list(5)` dans '/etc/fai/apt' qui donne accès\n" +"à votre miroir Debian. Ajoutez également l’adresse IP du serveur HTTP à\n" +"la variable +$NFSROOT_ETC_HOSTS+ dans 'nfsroot.conf' si les clients\n" +"d’installation n’ont pas de résolution DNS." #: fai-guide.txt:2403 msgid "=== Small hints" -msgstr "" +msgstr "=== Petits conseils" #: fai-guide.txt:2410 msgid "" @@ -5172,6 +5651,12 @@ msgid "" "why. You can limit the number of packages installed at a time with the\n" "variable +$MAXPACKAGES+." msgstr "" +"- Lorsque vous utilisez l’accès HTTP à un miroir Debian, la partition\n" +"locale _/var_ sur tous les clients d’installation doit être suffisamment\n" +"grande pour conserver les paquets Debian téléchargés. N’essayez pas avec\n" +"moins de 250 Moctets à moins que vous sachiez pourquoi. Vous pouvez\n" +"limiter le nombre de paquets installés à la fois avec la variable\n" +"+$MAXPACKAGES+." #: fai-guide.txt:2414 msgid "" @@ -5179,6 +5664,10 @@ msgid "" "`reset` once. If will also not appear if you create a file using this\n" "command on the install server:" msgstr "" +"- Vous pouvez supprimer le logo rouge sur le client d’installation en\n" +"appelant simplement une fois `reset`. Il ne s’affichera pas si vous\n" +"créez un fichier à l’aide de cette commande sur le serveur\n" +"d’installation :" #: fai-guide.txt:2418 msgid "" @@ -5186,18 +5675,25 @@ msgid "" "touch /srv/fai/nfsroot/.nocolorlogo\n" "----" msgstr "" +"----\n" +"touch /srv/fai/nfsroot/.nocolorlogo\n" +"----" #: fai-guide.txt:2421 msgid "" "- A list of variables used by FAI can be found at\n" "https://wiki.fai-project.org/index.php/Variables." msgstr "" +"- Une liste des variables utilisées par FAI peut être trouvée à\n" +"https://wiki.fai-project.org/index.php/Variables." #: fai-guide.txt:2424 msgid "" "- You can shorten some customization scripts by using one single fcopy\n" "command _fcopy -r /_." msgstr "" +"- Vous pouvez raccourcir certains scripts de personnalisation en\n" +"utilisant une seule commande fcopy _fcopy -r /_." #: fai-guide.txt:2428 msgid "" @@ -5205,6 +5701,9 @@ msgid "" "the nfsroot. Then logging in to an install client may fail, because\n" "the host key changes. You can use this:" msgstr "" +"- Si vous reconstruisez le nfsroot, vous allez créer une nouvelle clé\n" +"hôte ssh dans le nfsroot. La connexion à un client d’installation peut\n" +"échouer, car la clé hôte change. Vous pouvez utiliser ceci :" #: fai-guide.txt:2432 msgid "" @@ -5212,12 +5711,18 @@ msgid "" "$ ssh -o StrictHostKeyChecking=no root@installclient\n" "----" msgstr "" +"----\n" +"$ ssh -o StrictHostKeyChecking=no root@installclient\n" +"----" #: fai-guide.txt:2435 msgid "" "- You can also delete the host entry on your install client in your\n" "_~/.ssh/known_hosts_ file by using the _ssh-keygen -R_ command." msgstr "" +"- Vous pouvez également supprimer l’entrée hôte de votre client\n" +"d’installation dans votre fichier _~/.ssh/known_hosts_ à l’aide de la\n" +"commande _ssh-keygen -R_." #: fai-guide.txt:2444 msgid "" @@ -5230,6 +5735,16 @@ msgid "" "require typing \"yes\" to accept the host key during installation,\n" "please check the contents of your 'NFSROOT/root/.ssh/known_hosts file'" msgstr "" +"- Dans les tâches chboot et savelog, une connexion utilisant un shell\n" +"sécurisé est ouverte vers le serveur FAI (voir <>).\n" +"Pour garantir que cela fonctionne de manière non interactive, une entrée\n" +"appropriée dans 'NFSROOT/root/.ssh/known_hosts' doit être créée. Lors de\n" +"l’utilisation de fai-setup, cela se fait automatiquement, mais il peut\n" +"s’avérer nécessaire de l'éditer manuellement si le nom de votre serveur\n" +"FAI n’a pas été correctement déterminé. Si vous trébuchez sur des\n" +"connexions ssh qui nécessitent de taper \"yes\" pour accepter la clé hôte\n" +"pendant l’installation, vérifiez le contenu de votre fichier\n" +"'NFSROOT/root/.ssh/known_hosts'" #: fai-guide.txt:2447 msgid "" From e588c66de6cc546e1db8bc48f1313ac1d3f24392 Mon Sep 17 00:00:00 2001 From: Georges Khaznadar Date: Sat, 25 Oct 2025 13:18:03 +0200 Subject: [PATCH 5/9] appended a non-breaking space char after "or" when it's alone. This prevents translation issues for other sentences which contain the "or" string --- doc/fai-guide.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/fai-guide.txt b/doc/fai-guide.txt index e4784cf1e..20405c4bb 100644 --- a/doc/fai-guide.txt +++ b/doc/fai-guide.txt @@ -521,7 +521,7 @@ Use these commands for installing: # echo "deb http://fai-project.org/download bookworm koeln" > /etc/apt/sources.list.d/fai.list ---- -or +or  ---- # apt install extrepo ; extrepo enable fai @@ -2150,7 +2150,7 @@ setting the value to 123 task_error 123 $? 1 ---- -or +or  ---- task_error 123 1 1 From 06bea6800829218a437acd253fc805568756f5f4 Mon Sep 17 00:00:00 2001 From: Georges Khaznadar Date: Sat, 25 Oct 2025 14:14:15 +0200 Subject: [PATCH 6/9] fixed a boolean operator --- doc/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/Makefile b/doc/Makefile index 980a5ef97..ba6419c98 100644 --- a/doc/Makefile +++ b/doc/Makefile @@ -24,7 +24,7 @@ potfile: $(DOC).txt updatepo: potfile for l in $(LANGUAGES); do \ [ -f po/$$l.po ] || cp po/$(DOC).pot po/$$l.po ; \ - pot2po po/$(DOC).pot -o po/$$l.po.tmp -t po/$$l.po || \ + pot2po po/$(DOC).pot -o po/$$l.po.tmp -t po/$$l.po && \ mv po/$$l.po.tmp po/$$l.po ; \ done From a9ba629fbbc8239b34300104429220e3bee08598 Mon Sep 17 00:00:00 2001 From: Georges Khaznadar Date: Sat, 25 Oct 2025 14:14:54 +0200 Subject: [PATCH 7/9] finished the French translation --- doc/fai-guide.html | 2 +- doc/fai-guide.pdf | Bin 281933 -> 281933 bytes doc/fai-guide_fr.html | 214 +-- doc/fai-guide_fr.pdf | Bin 286965 -> 299310 bytes doc/fai-guide_fr.text | 3146 ++++++++++++++++++++++------------------- doc/fai-guide_fr.txt | 212 +-- doc/po/fai-guide.pot | 6 +- doc/po/fr.po | 828 ++++++++--- 8 files changed, 2516 insertions(+), 1892 deletions(-) diff --git a/doc/fai-guide.html b/doc/fai-guide.html index 71178f544..c257fe39d 100644 --- a/doc/fai-guide.html +++ b/doc/fai-guide.html @@ -4312,7 +4312,7 @@

Boot errors

diff --git a/doc/fai-guide.pdf b/doc/fai-guide.pdf index e1ca2a5806173e1d0457775ec6374454e58ff479..dc0e13740cc658dc59fd770065f98732cb626880 100644 GIT binary patch delta 118 zcmX>*OYrP0!G;#b7N!>FEiA3(?52jsMkYq)(|gQWWMG`_>&;mIvnmfA~xLVjL*bq{(eX#?}DjoogoF3Q! delta 118 zcmX>*OYrP0!G;#b7N!>FEiA3(?8b&BhGxb_(|gQWWMG`_>&;madJI2k$_ mnpv1wS~@!!7&u!x85kM4Ih(t=xR~21*bq{(eX#?}Djooln;#MY diff --git a/doc/fai-guide_fr.html b/doc/fai-guide_fr.html index 279d41498..917409f5c 100644 --- a/doc/fai-guide_fr.html +++ b/doc/fai-guide_fr.html @@ -1655,7 +1655,7 @@

Installer les paquets FAI

# wget -O /etc/apt/trusted.gpg.d/fai-project.gpg https://fai-project.org/download/2BF8D9FE074BCDE4.gpg
 # echo "deb http://fai-project.org/download bookworm koeln" > /etc/apt/sources.list.d/fai.list
-

or

+

ou

-

or

+

ou

task_error 123 1 1
@@ -4130,14 +4130,14 @@

Petits conseils

  • -A list of all local hard disks is -stored in $disklist. It’s defined after set_disk_info is called. +Une liste de tous les disques durs locaux est stockée dans +$disklist. Elle est définie après l’appel de set_disk_info.

  • -There are multiple functions for generating a customized disk -list. See fai-disk-info for an example. +Il y a de nombreuses fonctions pour générer un liste personnalisée +de disques. Voir fai-disk-info pour un exemple.

    @@ -4264,31 +4270,32 @@

    Petits conseils

    flag_reboot (FAI_FLAGS)

    -

    If flag_reboot is set, by adding "reboot" to $FAI_FLAGS, your client -machine will reboot after the task faiend has finished. This is true -for network as well as bootmedium installations.

    +

    Si flag_reboot est défini, en ajoutant "reboot" à $FAI_FLAGS, votre +ordinateur client redémarrera après la fin de la tâche faiend. Ceci est vrai +pour les installations par réseau ainsi que pour les installations par +media amorçable.

    -

    Log files

    -

    FAI is creating several log files. During installation they are stored -in /tmp/fai on the install client itself. At the end of the -installation they will be copied to the install server (see -[isavelog]). After the install client rebooted into his newly -installed system, you can find the FAI logs in /var/log/fai. -Log files are also created when doing the softupdate or dirinstall -action.

    -

    On the faiserver, you can find the (remote) log files under the ~fai -directory.

    -

    Sample log files from successfully installed computers are -available on https://fai-project.org/logs. -These a some log files which are created by FAI.

    +

    Fichiers journaux

    +

    FAI crée plusieurs fichiers journaux. Pendant l’installation, ils sont +stockés dans /tmp/fai sur le client d’installation lui-même. A la fin +de l’installation, ils seront copiés sur le serveur d’installation (voir +[isavelog]). Une fois le client d’installation redémarré +dans son système nouvellement installé, vous pouvez trouver les journaux +FAI dans /var/log/fai. Les fichiers journaux sont également créés lors +de l’action softupdate ou dirinstall.

    +

    Sur le faiserver, vous pouvez trouver les fichiers journaux (distants) +sous le répertoire ~fai.

    +

    Des exemples de fichiers journaux d’ordinateurs installés avec succès +sont disponibles sur https://fai-project.org/logs. Ce sont quelques +fichiers journaux qui sont créés par FAI.

    FAI_CLASSES

    -Contains a list of all classes defined. + Contient une liste de toutes les classes définies.

    @@ -4296,8 +4303,8 @@

    Log files

    -Output of the dmesg command. Contains useful messages of the kernel -ring buffer. + La sortie de la commande dmesg. Contient des messages utiles de la + mémoire tampon du noyau.

    @@ -4305,8 +4312,8 @@

    Log files

    -The main log file. Contains all important information. You should -always read this file. + Le fichier journal principal. Contient toutes les informations + importantes. Vous devez toujours lire ce fichier.

    @@ -4314,7 +4321,8 @@

    Log files

    -A list of variables of network parameters, mostly defined by the DHCP daemon. + Une liste de variables de paramètres de réseau, principalement définis + par le démon DHCP.

    @@ -4322,7 +4330,7 @@

    Log files

    -Output of the partition tool setup-storage(8). + Sortie de l’outil de partition setup-storage(8).

    @@ -4330,7 +4338,7 @@

    Log files

    -Output of all scripts, that are used for customization. +Sortie de tous les scripts, qui sont utilisés pour la personnalisation.

    @@ -4338,8 +4346,8 @@

    Log files

    -A list of all shell variables which are available during an -installation. + Une liste de toutes les variables shell qui sont disponibles au cours + d’une installation.

    @@ -4347,7 +4355,7 @@

    Log files

    -A summary of possible errors in all log files. + Résumé des erreurs possibles dans tous les fichiers journaux.

    @@ -4355,31 +4363,33 @@

    Log files

    -A list of variables that contain information about devices and -partitions to boot from, the root partition and a list of swap -devices. These information is used by some customization scripts -(e.g. GRUB_PC/10-setup). + Une liste des variables contenant des informations sur les + périphériques et les partitions à partir desquelles on démarre, la partition + racine et une liste de périphériques de swap. Ces informations sont + utilisées par certains scripts de personnalisation (par exemple + GRUB_PC/10-setup).

    -

    If the installation process finishes, the hook savelog.LAST.sh -searches all log files for common errors and writes them to the file -error.log. So, you should first look into this file for errors. Also -the file status.log give you the exit code of the last command -executed in a script. To be sure, you should look for more details in -all log files.

    +

    Si le processus d’installation se termine, le hook savelog.LAST.sh +recherche dans tous les fichiers journaux les erreurs courantes et les +écrit dans le fichier error.log. Donc, vous devriez d’abord regarder +dans ce fichier pour les erreurs. Le fichier status.log vous donne +également le code de sortie de la dernière commande exécutée dans un +script. Pour être sûr, vous devrez rechercher plus de détails dans tous +les fichiers journaux.

    -

    How to use HTTP for PXE boot

    -

    fai-make-nfsroot now uses the lpxelinux.0 binary which already -supports transfer of the kernel and initrd via http (additional to tftp). -You only have to enable HTTP access to the tftp directory:

    +

    Comment utiliser HTTP pour le démarrage PXE

    +

    fai-make-nfsroot utilise maintenant le fichier binaire lpxelinux.0 qui +prend en charge déjà le transfert du noyau et du fichier initrd via http +(en plus de tftp). Il vous suffit d’activer un accès HTTP au répertoire tftp :

    cd /var/www/html
     ln -s /srv/tftp/fai
    -

    Add -U URL to the fai-chboot call. For example:

    +

    Ajoutez -U URL à l’appel fai-chboot. Par exemple :

    fai-chboot -U http://faiserver/fai -IFv .......
    @@ -4388,13 +4398,13 @@

    How to use HTTP for PXE boot

    -

    Troubleshooting

    +

    Dépannage

    -

    Boot errors

    -

    The following error message indicates that your install client doesn’t -get an answer from a DHCP server. Check your cables or start the -dhcpd(8) daemon with the debug flag enabled.

    +

    Erreurs d’amorçage

    +

    Le message d’erreur suivant indique que votre client d’installation +n’obtient pas de réponse d’un serveur DHCP. Vérifiez vos câbles ou +démarrez le démon dhcpd(8) avec l’option debug activée.

    @@ -4405,24 +4415,26 @@

    Boot errors

    -

    If you do not see the following message, the install kernel could not -detect your network card, for example because of a missing driver:

    +

    Si vous ne voyez pas le message suivant, le noyau d’installation n’a pas +pu détecter votre carte réseau, par exemple en raison d’un pilote +manquant :

    Starting dhcp for interface eth0
     dhcp: PREINIT eth0 up
     dhcp: BOND setting eth
    -

    Check the initrd in the nfsroot (lsinird) if the kernel driver of your network -card is included there and check if you like to add the package -firmware-linux-nonfree in /etc/fai/NFSROOT and rebuild the initrd -by calling fai-make-nfsroot -k. -You may also add a driver to /srv/fai/nfsroot/etc/dracut.conf in -the line add_drivers+=.

    -

    This is the error message you will see, when your network card is -working, but the install server does not export the nfsroot -directory to the install clients, This is often caused by missing -NFS permissions on the server side.

    +

    Vérifiez le fichier initrd dans le nfsroot (lsinird) pour voir +si le pilote du noyau de +votre carte réseau est inclus et vérifiez si vous souhaitez ajouter le +paquet firmware-linux-nonfree dans /etc/fai/NFSROOT` puis +reconstruisez le fichier initrd en appelant fai-make-nfsroot -k. Vous pouvez +également ajouter un pilote à +/srv/fai/nfsroot/etc/dracut.conf dans +la ligne add_drivers+=.

    +

    Voici le message d’erreur que vous verrez, lorsque votre carte réseau +fonctionne, mais le serveur d’installation n’exporte pas le répertoire +nfsroot vers les clients d’installation. Cela est souvent dû aux +permissions NFS manquantes du côté serveur.

    Starting dhcp for interface eth0
    @@ -4436,12 +4448,14 @@ 

    Boot errors

    Dropping to debug shell dracut:/#
    -

    Now, you are inside the emergency shell of the initrd which was created -by dracut(8). You will get a shell prompt, and can look at the log files. -For more information about debugging the early boot process using -dracut see dracut.cmdline(7)

    -

    Use the following command on the install server to see which directories are exported -from the install server (named faiserver):

    +

    Maintenant, vous êtes à l’intérieur du shell d’urgence de l’initrd qui a +été créé par dracut(8). Vous obtiendrez une invite du shell et pourrez +consulter les fichiers journaux. Pour plus d’informations sur le +débogage du processus de démarrage précoce à l’aide de dracut, consultez +dracut.cmdline(7)

    +

    Utilisez la commande suivante sur le serveur d’installation pour voir +quels répertoires sont exportés à partir du serveur d’installation +(nommé faiserver) :

    $ showmount -e faiserver
    @@ -4455,7 +4469,7 @@

    Boot errors

    diff --git a/doc/fai-guide_fr.pdf b/doc/fai-guide_fr.pdf index ff30e31ef9d408b93515018c6dc272b5be69febd..7368cfe3804743db7261f52f3af0c74f2eb611a2 100644 GIT binary patch delta 242472 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 z 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

    8N<_;c7sC@a1*3VT>_z_d2vYh8=M;1$y*(dO8=> zK(Jr0GbXIi?6eV0aXa;Bn8kGaM+`8qc@j71=+A6(!y9U#`CIi%1P68}Fk31O9ICc= zPGyhPwEYGieYkQq1bwv*7XV?x-fP8LFpf*=tS_d#+hjU@Z^IcTjpoScG)h^@awvvwh~^>iPisadZq^EEN2n=RO&^7X*+SB- z47JV$3&!In#`A~bR$I${&(s?yFB7V^31;F3Tn2riscg~y$_W+zx6z;4*po?5;2&?E z{2D>y?!2ct#@|w1m!w{=Z3-9)SwD9galUgZ_$5_p2A(|L`|e24vHZB{OvmJ>nG3vF zdsiuCojqh)#Zv2`%Kz`#v}k@w<32bj@ILwNWb?TyAw}tv!{~1KOw;@fIB>aJ10QJr1&s^Sy-gC?;>WjLT1tIvl9d@4! zgU^Nghjc0=5#G#dF?d0F>Eusc7AvhnI9ppJdp8|5%PvOPWB1;mg$Ee65s0uR8GsvJ z%dB++Ymq7GSlM1E=P7`F?IAB5{K(fccbtW~Rr$)U;SWE{D&JK&e!W-fVOzjeYuoV1 z$bvF6*Sg5UuSfgr#DP$fhpQc`1kM**&P=FF&3c+n5N#<9B>j0;O;i~1saAw$^|NZR zK>@1>mER&m0$P4j9MsXG#0AH$YFDMvBlHV0aVN~ zG!qtI5JDD~QrL>^6i8KzAKW%CR==(ayd?G}WUDN%u+zK(&mxD_64Dp6@8&e{sW3Lf z5{0`QsB65A3DU0!v0)|9E3Du&W&#d~Kwfi0n8d86K%BVfo^2S}8#@ zd?=ebT$wE9unoYqR0=dkbNNUc|EWR@Ub)PKcsr$uh03mh{Q81{U9%2gzRbNi#R8vV z64^0miav1za|iuUsd*fl3|xkTT*Y)2;&#BBhEKSEpuiBd$MxXc2`O zMaY+lCKT_vz|sdF z^vM&(QF&rj1d*}E(62A2EJ0?6jch9i{3sd2FyIu-l_jyPN~1tGF505~L`JT15j8Bp zuI`l~grXr_G%F2OHCuLrTKnth*ke_^jS*`|x&R&?==`ZeUP?f9CQu54(7=eBDfpqD zhrCi3fYy6dg;*b-t-Yn7p-><=IV+kq>G)yacW6eNKTK(DHva7YWcrpa2 zdde0zNqx|QZj6VBBWtbe6HQ>E8`+De~xdFM1;BN=fc68Pp`@V;_tL^?oFB4I}{P_UEIR;i3O;tr|5(xq>jl@y{p7Bvsn1W8k$!`5DLSO9}fB z>}_c)UJdUqWxW?kIidqkLNn}7)OP*Re|-TI2(gFz&xwTo1~y}iKGH^vbK9ysBH&9* zKtcQoSR$nQQsS0NqW+?hdWO82a4p8YZB`QTOU&rk&r>7Feh&A&IrB)&bp@9;A@QH~ zb@`w6_174Bd93&NhNF`BkzV|6J3n>Ke=GT_J^Dnm+?Ad};gpCfe+XS93|JG89)JYQ z+z*DyPcl%Xv)_jn^I!q_JU>Z@Ct%mOx=U#HBp#m>)JL?NjGWr(#EJHgPK2!(LPH5C zT>&>+pV7AoJ`9V-k!&aiJtc->5WN>vwOyl87G^L#ZU%`chL7;Uw5WgBjy}JFICMt^ zG!Ul2bsa*lkT8w)Fu%l>!C{NB+U}oR~pcQ&o^@1<1SefUh$(L%rBtW}f&2S$I=OL%y)&ALkIe*GN zE7T8_>oQqHp@+F)7+=o`IB_$A5@iaR4hAGjJuJYN#{aozTF9-@p{5=LtFCJvXPQ)2 z=b1K|!OT85yD12nBg_W~Ub8fj&u;D4<1u$>oJRMa%9zDE(b7Eb^iiQ4R{vcsr4EX&x+H9Q()1mGB%bHv4| z@L!6w^DaYi(uhX3rC6lX3X$s;^}%>>YL<0TKGs@A(CL5%f4OKt5?ZPAIjl?n@~p#d zwzxqTO=(V}CgN;5(yGKNxVF_vztL{hAO)6+{e%p=f4o_#MBR!Kpr_yq81yOn?Y+u> zhw@kuNQTp~o%rIYMP#gXE}v@-OU4f1P z6BLbER|ar&L~!7BQ_`ll5YInwiNd^H_DbJK&i;va3;D4duQ74qIFKEK`}9w4L}zdw zBl|6D3|8*`Gz}P=f6!nIa(Z29}S3~u#k!DbIPaZfFnh{9gB2OFxPy9 zi$oT%70Kq0BeR|zeyD7^Wt{Bs;9=sS2Iy5Rx(jNTiKZcUjHp5@U~x{7dPJ#guYGzREjuj?v~%=Jbjt*0D4LV0Nv zI%TDbIR3Um7TmI&$!<8jSkOonJijc!>;h~zL=}gK=?x+$G+~gnyHBi+F#a4!%SgnspYTy@VTh^?^{r=X$#u!`mny6v zJ~NUnQVCspf{-I}Iy`}>$D_~hx3%e9^J`g`XaxH5oO=Ko_|$A3Y9uyZHId!vG| zGNtbE0aF8-aP{mDIPUm+`a>DKSZb9XKI?k4Y}F-s=DOPoGx$3!cFkwH%J&)*E!8brPXLjv30u8N@xK&{T~ig>CfIOj+(PRM z_K1S}R##+ymOwBy?ny?X{y~K)!LA|8!IK{R@!JGC$@2B$df!QhXIdWIo`Xcy10+<= z5cFsza{IhH8l~&w$!DVYRbi#?en;{4NDnWyxC_E0)}1fUxg>0DRn6595$kg zJ#vZYO*C361)4~MMwyhOvk@T|fBcU4s-T4wYHt=(}8CdX{0==p+DY{I|1}WXQQ!@4HX7^xMPx;w`*Vu@MAcUfv1%UvM_@F@V8_ z4@10TTh={E3oOLi$UvkbxI<~b|y@d&!7n$**pF%^Fwvl>L z(;5-X6xN|O@tblIAL|sRc-wMlY#2DF8C)HezW}^kk5sl*rFb`b=eh(PIqOzr`=9xI z%qr1E^$!QcMyj7O4K3R4GZjYkkAMtw3oymL9E$eGYgUPt@(cOLz5V^yS5KUmkg~co z>AI`3T0=L8Q6&F9s87v{ii-^74Dfo8W_AlO0nDKVW|&_NM09!ac?uos2Aya+IAt6x z(wK~kmX=%~#E}jjDi{;WmDrGxJ7xX#i~1sUm~E{&2&{ z=R@H9@zYdXOwk%l>T$*sXM`hmwuy}ec_SNJRChzFt9&t5nkHwQ6#zP&*7wS#6Xtyj z^{wb<8wgxukdz}wQMUY(V8dI&&QE5)iU4}paWS#6Q+>@~KOFz`7ty(El}eUL&h8ZF zm z>n@st3{(n3o_XWSpq50@tR!e8x@(Y@_wGyr{QJZEL_G9}erDG4&4Gs9(g1UjLPbu0DycRwb zCk(Sm6U%2@#)YwQP|(_4y+)d>*n)@;*|t=PjDkp9HpA+8dw2vUEz7woi`}S#ia-Q{ z0K_$@9*Qa#cM@13oxoZdZ()UWU4t^%jifL`RwOKfYxWASiN(3E7`*%3a9~ZC>j_ks;%R;8lTCAI>w}0@46=hvi^-*N%Z4h|nk0HHb9D(Q_ zLrr))*msiHdYV(6?H!#x-#o4&2X_-Ck`3CvxX>c&cq3tOMn29S@GCLVPB4AVn`mm~ zt^W>WI#dYEObwjzPH?^lvDGHVOorycWC)pnfJm5e!~n>_*NAB6ZPBFeO_BlXq&SBF zcS8?I{dDw~Eq}#P?q8SLP`t)1(0HRyxxIlIg|MG>U01J)Pz7OotC|)5zwZ2dY&CYR zV^TKIA=%G(Xm%!0M`;nsa8uI`#Ch!eF^a0z8$FnnTL~tZE%!rAkX~Oy z%QUMFjWnM+OA}{=HFCfn-?0Cd7?1sk^f=<=%;e4RoUO{~7|9BNhrb^o zjLn;waP4W76>FPysr^w z>;+7=mX^B|vp#1S5}|EN7ujD*9}!2+jjyD43r}@i9$pZ|wd$8W;_d(U{Q z()rKGPcH?1FhM;%&gRkbCNlPN#^U*uUMm1$4lPd(gsLgAQwz{n3VASk_K8_{B$m;Z zKEZ?gY;IxSfMe1gN{}VAXb8{JJ;%WMI{<=#(>;`0?0`?vs6n&UGxjWr_p(E$D-N@; z`uu|;GUZPTRe0azNVCG4`m&abfsEL)A$#3l^J!r7J+85$BK3Ejd$msR>+$F<#e~Ua zr>l~lM?OK6-(ZFzD3ZZeE9YCxqWfKH5+#C5h(B5?a=P_*wm%%+@B8R;zsEz9#R1-P zR~R99$$wnkQ{fnRkmTa5&u>hBH_Afjxq$i{bHyNt?jSW%Hi`ms8d-)w5DL6-usl~k z3E3?oB188mc8jSKO7yc&utL}tW_(@U|9VE`5hx@^4~^DKCIQ+q3UP@X)AteL#ZeI_ zi^;wqatxF_2T7M_DUQ)dMQc3fECKkNcg-Ffn)7%`G|I2_!jm&YVzbg1^3-lL0A1q- zBpzKY*IS8H>gu@Ie&Awn!8XU;AfgQeyE7*YtKi> zS1=$}RN+Akm6nKV)Zm>+N8s=|@I1^CP|oUbj|9wKz{(w7C$>ZZ!*ij8V#Szm_U;^d zAC%csnaC59H=?M6-vzrXZwP;nt<)7AKvXnrXOAxK5P5SFO%W2L4r6XPL_hOgOF>9BKdHJ zZ2~t_J2A@A~hlOx1FvN;^=tokzquS z(!bl!=TLaQw1T&$;nDor_bIZ<$Zs)Z-sDwK7Blc-(;>-MrOphV ztfQjcP5MT3g?ks4YbT1noBMUi@uU0sMp*9}rmr=7(R&@hlIj!N!En40l7D=)bj>$q zwPfzazFJV7#kkHH?A?<8dAWMC2902UqR$ab+Fh7p9dAbJ{>P|W!8vSRR>?Z%;$jLk zn8=sA>?u>7wtDz#;heDevDw#pn*6|1o8MGTrw22HzW!LD+C+OKO3MF*r9;i?9d_TH7?iIHuJ)>>+za~&kK=(`yYLZf)8d$Vl zLVFmxl5%;i@hY=wJ0{hMEb@8GRPnx*Rwu<@?m<&tT>-cLQmR#+ypP>sN+MD7P4%1_WD*Ncg920#3w;ok( zg2pYNr~Yl}-<48soSM^a+^~$hsaVD*dw)r2RP+W;j zTxjA!JB-d&oF?=0eL6VFbYy+CW9{BZNz}=Vi*q{aAFoEtb!X?x%>MpaB++Y{eAZree(18MPK)D8op|iM|#)WFsZ-QZCmf-x}P)j=^26W{a^r7 zKW;=J1xz2ARW`>w;CdWjw?-p9xw;kV1S`sjplnXiyG*v%^?g}5OI1N4!52OR>OW}f z?Ym{2t^26Aq|4li6F!wWb-?9>nJIHC(q#GWH3TajUAeUz+sb|~D=KdfmyFm==r$e~ zkSe9ipFTw@=&Cl+TW_00=dCx@Kj<)~qk+Q7nVb#IaFY+Wals5=0PQS0_c8z~1VdRz z9X!2R)>Kb!uO6z>^$a!IS{U_-qwPfsI#qY#hV^afY44Hv@CXXl*CHe!JoxFi8(Dk8 zj9lYGKs_da%1?j7Zp%%F57F>ts2uG?>{VKKj2f-Qb|x@dC(;L~ zqATH|`&cX2RSv`Z7WU7I!Ko{(mCA``ZeQu5nQQZH*8(74)Y7yY*;$*2B&0HEGa<^M z`AB*#%#Up0_~c&4gn-YwQi^-neZw(%vIz$V|`*&aS(7cX@@XsT4?1 zIbvV$2Sd^(#+@;6ThM#nR7#-$j4R$?ltssc702B#*M>Zm%+@fW<404*P7r)M^s4cq z&)4zs^7MEy^mFmhB0snI3Dd4Y9Y1Uflv3xQDI>~$l3%rYbPO7(F07?89=yPP^!mAu@yyT>{0@4|(H4 zdp;csO5q*#9nry`At*K#lGFFl)DO53e9>jCQ5pGDZfRp>4f#w-P%i`%8{&`Yid zYY@+4as$B-AW{T}N6}m7awq?tV)7D2tOFV1H?*AqEs<3{Zaxp*Lt*X`(_1QNIhdUZ z<3s?|XD#M+w*+WN)|&u$Vzn{`#>=kc8X5g_=@sx7ng6DMlrv*Q zXYcd1n1~6H%iqD0?a>8{<)u7vg{q*+lR|)NPR3I)w=H#q82v(gE(w`)H1T%7eY^$v~Hv>&i62M;2IZ@CB39p*w(` zEyZC!<5eTo`8bspnF;#kF;5nmU`Je2w^oTo&5Ql8J2JB{V9w-_h;>Dbk-PlBEL5jd z-04c{$n~1;FR^<9*FS;T-5hoz~zyy0YYeES{>j@)zS6sHQNbX$yBD@gqSY~VK z-ibsKf-Z@j1hQpi9_gr_ybfK=3U znJze!3U4swZ`SY1<$KJ%hrL#wE@OMPzqco4?>J<$TdFdDCW1Vn7>vPK1#keT1q~#- zb|5b?rB*u925><4Jc+=Z6U*Akbr02CA48#r`)jo~yhnI{1t5qD!%A!8qd( z)sKd9j(=d0799QaUtq++C4AeCx$UaRn&r)8vF83QaW(S`PwOS)5+HPOV5zwD_c@iu z2%YNzs%YabPzR*EYq83Q4@v;-k|Tz+nO`>cocu{_OjTg_e+V)|sHS3ogR&&()Uc?u zCgxAUmtjIgCWniO+ynNpDw~g?L(0PqpkT*wK+aU=0Z`9=V5#?bSNJ-5A5yI08Ybzi zAl^a_dP`3IP`7j@m%YSb&B@&Q4LE;MrJn!RONLU3>%-%^g>r;ME#Lv*drd$YBLaOb zQ_y&?7iv{0>?V$F(7P|o@=&8QG;cscCiFb8BB}Evr7$gw`UvEnP(6snco$;BVNu20 z4MbIL8`xH^!>D6-MlXcw|G5I~c7xqc%*-S+rJdFL2b`()TAVucdGs2*X*tMLiCaE7 z0O;zWKMjS}9Br>pRT==*P|EpSQ3N$BNJHV6foFp1et!PnhOe&!>HMUEvHP172{)bk zpy|(bDBR(c&eNp)yn!lZTYLUVF7;JVU;c>aLp>Vl^ z(Rz^C9M%{t2E_-3jlnq3&;@O0u^P}6jX;5-a9_x3Mu1Pw1_4Zh)OJWtQMg>YtpTLC zoKH*+cd;XEj)Bul87I#%xE=+jXQac?OyOOdfX-IOAJZHU_9nBDIs3_;KlVFYZ<8hE zTbftBrX#ToLBMrxzN4{-k*JL}wsTF4Ed>s;FgfKY5RpeQcGnmZM=;;1fkup~OhUmn?GsuFO6a(e7xVLHwr?Qzz{#d?e;+`a_Y11k9r?hu<%uFVW}MCv!jmINX} zH6#`6JO=YmZ@$68duabTY=3o$?g|Rb4|YkSHy}S^b68HkYA9W(2r7gRB-b;O>vjml z1kyc?Aq<)hT7XU%lq%-k@qVasu$7jcvf`IDn5wWRR|`R(wEw%-o%1KBGk0zUp&SQJ zgXBD|0h|~_{%!4#b@cN)(HO=mKj*Y~%3nz4000BC>CE}&1BNtZAwsh$BFyMIX6}qB ztClIc>CKDNHf-}167%LcA9oR7QqdS}@Bf}0w6f6kOUFLp=!^E&k9T)0F)dy_MHXW% zhluift+Ejt5Ar-qUN@W;^H3slCWS!c7nPKB5HY7nqrERl8dD2Gmaw76etN?wum52@ zb^hjiM1)ut0sT+a!;+fU1Wbj%!TtYkd9ktm-+21ZH7_(tB;TEyQ%Mi0Un^CN@xdlS zWK!X1Yhp4+uYJt8M#66KT~K$=-0Tn|F_2VIe`<@(j^$kS6g1Ro5ah{SB%qu(CRx5pgWQ3va7M^(yKY^ z$^)i$l2bBxs!KTVIF&JVu=~m(@RV@i@Emc_xe~;{5u?%m2$MD{2RKU9W};mv2Lka% zdy%Ao7z$am&m#!mtmdL>`osuk(3|?$UC!H-E1E^kSPz{{LV@!!o#rE`z}@Bve}Q?0 zL??$+FkHoBfw@c5fIUki38O%g1})a|kN}2WQsrQSBASv=V6!;5dX0c8gs^-~rQj>x zi)JgOBB|MMNqICwstlDL4_kLUV0<-IiP^+9;AGicd-SkojWsJ|^|0?owl0|~*|B~b z8WJoG{CU728>pltj)gFyuVnBCj^M);A*DD(4hE{m!bll6HBBZ~%?Ky63+d%@WCc{h zfN_GFprio<*La6sLj_H)NfetZxPvboyQ~2B2}MEBV8qR66%{Hlh5&te5}^qP0kJrX z8pY%PU5Lg-M~r0E=1+#`FMp%8;8@wrtKF}2rLs{lK+?+W_=j5vuNih4xc!3nFwgCx z@Ud6cxygf&-2&YE)t*-U^rXIU-~uRARGb&i@Oypa%LgJ($YWsEN@)B=CXJ z5qAn~$Qg8-j_3mWGBY=pvah4Nq5LCG)PTxj1S$gOO<$~`L!n3?RFqxR6bDbGvgR%= zR`ZlCNoQh3n!0UF;Sr(aFXB~XVy+KHt9MUD8djxcg*3sB3TbN))B;&2r2~Lh){~iN zvVw~AO77|ps@&=7-ca<9$l$$$Ut4Wh4K_FaS5PU>Z zr#gGu2IkI3h|%4(3H7xg#REf z_}BiYLSTnWQgIG}p!7n+V+TO5UHg1(r)I^&@y@6#gTQd@(ab%d`Q%`>&x%L$x6Mvg zPBr84v7q3aLt*g)+*AQV_e1aYl!V@((Rrd;?%mVS(Wnb58`?0@f;;8Ty}tRFt{w}MZR`gFRaQb3WlUFn+%K*_-nYZaR0C{D$WljJfw>J8D%2K z0PezynQpkY+u=ihFkcJNj+rjwF>JW#{14f<6_%89;R^2u_Kla1{G?C|o%ZpCjmf%zBAIwnT*G7@?NTLW6K$9?QmTjEO1 z-_-<>tMRx>P!mn2xOjv6oz@S@CHcJb7lhVN{C@u({<+!y%ZLKACNeG20Jd~(?Kikk zzOsMkfnEi|S6U{JJSuMzOv`6xxhFQRw65y8UmHn z!y;)iE;?}CJ8+32K>wA5vx?U<8Ds0raadBcnUVFkrukxnv(->?po06h^~%TZ zMArQHJs+hz8V5UwX^RKA!eN_#DpIYG+9i@ZeUXab@} zTq)wU1tvA-0IFTF&aWL&KkWO(lUx9XFMR~&+<*wbIu{J>)ODg6>)IVTZT5V+53P-6 z;kn8zEP2S$(SXF)^s25)phXvzjIp{vB~iP^27%ZBgqUZUi$;6GaCX0j(k&S{hw+~y zF(w}cbU@d+^8vX{Jb?u$NUp3^S`}_qL5NkZ0Dh|gfXGiXop#fzT0fOvUo)3{;$CX> zs!k9ogiO#Z1j>P*Jp6aICP^lPja(LA^MKZ4nD`{h5^tfzpjv+frjm7ruhLMyT=+eC z_2I|YO3R&5Vs(W(`dXHn9<5$^MLl(_oNJso9li08PF7Ds{w@ysJd)r_^xOov02u;2 zl2A1kpmWeTq7_(TaBn~ni3i*H_`N_aTJwED^i2RPEOxsbL>eo6zWL$kWi|JAbR!S@ zzlA%Yuz~Ad8)-#D0+`8(yuV=c3q;r_JeDsH?}uF8r|Q$7GFv=+B8Nk0A3VR_CP`H7DdD(lvfDyu5T$8^=8Xp z@&pj$MqM+SD*b^6JU+7!(C^9eE6Mk6-7g!5+|%b|s~}orKxyq;#1#rV zC|b*t8AOpJLg6sb+aLFLUDMu~%>U+(^NGNKsYCYKu z0QJ_D0MT`P_45b%I-{vdXmuzswqD6v5*{)jQ9bH=gW030E4lF>vy`u*w8-Ja+BW{V zQ%3Rl${K32T7z(-`QL^6Zyrs(Ty7nHZwWOi38!JUesTFZ2dO;2Xuc13kR@?&@$c{x z1A~EY5!e418ULS=%9FW5GkEa_&j87!P!YH|Ob1xdS?vG~Z+h5Cldh=Mw1)4Xeipn0Lb;~$<&3OnVf`1l>CuCp*S3dzJ;T;sx zpSc?ZrC4_r6QzrbKl}!V21rnnK=SWP8XW!&la?sngK{**TE(9IS&aa*pVgQR(_B$; zW?8AETB&`2Q)cs>*GtqCUtp}{l2b%7q*dOdRqv^;zU?K6JD=UCTxeM=V{f3~aeW=h z({AftdPp6nmDgd)G^Lwyt%B3B!k|~~aze}~*d@mU$MP(kYHkzA7bMV3R)m2~g4)7smeMLUD-WDT}>PZ$+}-3mFDMb97;q&ppyMzRLIIbxM*GmF>3X zy}{_R(yjX&0`hNJjlzyH;6D>)pMhYOf)>a&EO;B*w?{~#UG%nVY>+80KsEgjmYsP3 zd?4Y?^Hm5j5FUJIH|`MGKRfrvWw;UrB01a1yuTFivqwUHe8wM+;$NY9jT_^2S^dz7 z*82S%K-%j~;SYM4<3N~yG)YP?4IC|~$0}W@v!3pB@j#z!JyjX*6b`E!)g#m*)?d?o~l{N!5sD95gtyEDm*IsaHWMHSFl6Z>c&ZmTABz1Y-WCqVIW~4-B`ICi zZIW%?K{oCzeO>)405@NInOC4qC2%9mf4SKTui3MOF=FT6lLFMMNx4)TX3_cwlLKgs z+n&N7VI-e=VwXvOSDqkrHo?QycT&1GTjM-mCGuwULb(V zqFyo26LPPiyPZm4_m+Xtl+DC!0F(Kmcoqk+S{NJC=fYAkWWa^nNecU^4$MY|*5CNd z&>~Z;VE*j|$EKaS#!Ih>mJR+`uZF(pEf2_rr$AP05siX6LxVp<`Vu|7?o~hA_3STm zMbI9Ef9@3qC(Z+Xu;Ii%>Q2-_@O;4X|6%K^gX##nFL4O&?(V_e-95Ow1`95OLvVKp z9^BnsgS)%CJ1pORRa?8YzyIE=SKT$Q=ghr*r_ViyrCIqBsr@z$XLjKi9Q!>{2sk|R zG`si`bdYO`#afPi35<<-lw2H~zoOJWzQb)^%bYVBMNIj8>Dzg;0@hAGAm<#oWRlen z<-BO1(kKOAJc$_Z`B51`bCDH>u$5(0`W5q38~aTbhjm=6zuc9G^;#wp zmH*n8Abf?Oxt_jBgihnI`|p3xp7aJKFflP!<+fi8rXWWccDE8CO{U=ZP%xL}w~$79fsAzV{o-U!Cn zOD@{S(0?`_zqL(_;wd2gF+2sh|In+p$Ccs15-Wy~X1VzD_>3_cj+ZN7U5T}ma8VJ% zPftVSpefwVs_$A<6`rd0;GRqUVYeHZ2Q1&7 zPt1S$*c+p0KExhC3;#o+GEER1hYwd|#l$#kVIr_9hNt5_HUG*$>;KZV5`Ibyv~XB2 zD-?VG;>PJ}V`XV_nwP>;OS!zL99;Z!DX5D(*X!uZRDhuPNa_fJG6w&mlJc(Be0!Zw zW2=WV<_fj?6#@JdN+5EGg@D2g8Wy}+1JcwI;=K% zwviyE3-R`<7f*ke-6kh(a3mGX4Aapqesi^7T9%U%)f0e*Bkyz-dq5NeZEg_MA>O7) z(+@CHcBL>#3_e}Dhld+*P~N6-9rf_jP2?K77N>~E-r%yKd!fl?Ix zg4tqAUd`&~p4eBg9j1Rk?p4)m(1ZI}<6l$4s>2+QhPsyr1+fA(+Ln?yf7JRR$f!p} zYTH_m;@B0fu+Xy>WV-=m3Jf>Mv3RK(s>y_Z#va+GF24$Seml%sYBDT}6avL{><0Fw z&iGA#B{&2&vhJ}DseWDIoArsmDV-Q)aLz4o`DhvQYc-a9hAnh38(yvr)OiXD{W?8P zu;b5mkcAy-%6xt$Iy^t`{eQTmruN3xupDe$|7DZ1{`c+I`Twb&w!tyEpqHjd#ZM@j zd5PsSem=CG>nH47O!1?K%MXc|jZlq@JovsN7??)X7D|~lEJ5B-#1(Hl{5#xsFt?pf zTT{#&IZeQ7qN<}idr3eJCcLI>8vAw|i`9xI81yNSy~apM^jG7rK$gDlpKO!^IRpD$ zNDUyRi|b#@3grlvi&qUpor~I_vx`?2rdcBSRBR#fZ^cjN*L>{pEC{Cb!|-WKAtgU> zCJ96_reF7g$8zt^{L_bf^XDUgBGWJzT6+@`Ppd79!5{Cp7}hUpCJ_~4o)MErV*Kg1 zK19+==*5w}gFPau=#MEx*tBN!PyI#qwqd~SsQ)kM4K_-;IIpk~vO;w%BGuO;s>9A- zVxaT$q^kUkRYWf(R0P!*+@!Gg%{Py6LnAZCU*z`!cMlV6Nm2j6{ogS+`>ILKcoOQF@Qh@ zADeA)%+kpzSms~UBElA0%Q~fixYvpVaTxRkttBw^xQ>nYnLv(xj`uFo>w7Um1um zGI!HD(&(`{P&-;X34L0C(P&+^1pG|*QR1EZZlI^FV0PvU&%^G%BQycbJ8nWH3`WxAwfiSgCNv3+f4!@s_51eNB1C^Koscq#) z$DEd7ClRm>livw#mJKY7gk;#XZmiUvJqC?tBHc{Qb zmVo$DS*-oaCO-<&U?QRTnEKCPV2PLo8=u^Jvb!c8F9cF5i3XNt^xoHT>?kOrq9o<_ zXBGu7GDgX*fyI!w?6UaOX(7&goq(TqXUJ1D!i=-UT`In{prb_X0PUSvsL5Ow_Y+N{ zjze5AxeXg*`U^vgrHw80t#0I+l13(!;*+D|wiX5yUpY(VbS(3|4yno4Jl}=!#q=JR zWwCFTj)~9p=A_!ZY;!Rc29%$7E$7(pbyOA?mJsuJNb))>4WptauXhTvkc@L>LI=TW zb2kyCyiA~iYS8KwQkAC z;~hdpxJRq+JJ8*`NP?Wp3>i4w7I$lo6U+is7cGH5KzF~N=XAP%UhM4e4~+Lf|K zJ|FjGte*P&Ai`gu`rcmrsoDT|&Tg7Iy>HE0d2rX^?~`qTI(8SBWp5<^vNv_pJ`&+2 zxY$z>LO+WjSBraDLN4fFKj#AwBVPQ&THqW+qWeiGv)M31@|9&smHX0i?rSZazQ`OT zd)L@Ex_a?mV??hQ7MPCL+`l87j@(ouEDg`2nUh$ep)$X2B$ti}uc0xzhv)AYd=Px` z7}PfGlv2Rfi49x+J()=xkJt2FIhEu_H;Q%N3TuEUPMgo0TL8WglY&&10f7^VGmZuR_D27WS>tmJp zmflL+gNGpb^{=A8qKu;uqxjO7CKude69On2VCDg}G(=IOsJ+AtG*@Yn5~+@S08YDd+; z3(Gs}w|C%O=H|g9v?smXPQKr~Oa>uos`bPpdE0Z>dowz$O&Ds&^2aN>NzS!8K_E+v ziVF&bcu^&6C6W@2#*2vWAx)Lv`%RbQLAd$V}V!E-H>^L&Fp+-9gt$^cf?J;dg+ zXq{Hto>p!$iO`@kHa9&{oX1oE2kGR(t8l4SU$?A0BYy=(oD)LoL7>F-80fQW;@Aw7!WB+9 zeM#04nSPq;S=gwI0>b0+}}&aV-e#sclC&x*Cl{(5lxT|r)pzu%DxF<6_3{t z&(%oj@p&y3*hlppW$QzRhwt!b)jcyxjO` zfJKOg5&>=?1e~ut8aHhBF~37~?s}`Lp>kKzM=iGdrG{)9dL{^q?Y0tzSwkWNj7`5! zKAU$+tdplhn>8H=lFZ@r?<2TGVraiB3Xe6~iZQ_vu>MW+y>Sm8uz7!}oQvV)3q965 zWuoSX7cQgvVcR!G=EyObAD}VqSz9L-!I;Nl{SC;AhtE@Ez`*+RX&S5ICmf`4r$s&O zcZ_Ub?(xElL)0?P9yZXzcKNKAd@MDGbZ6*LGbFz@P?8zgDl{st^i=#a{JZ$b;*b=m zIdVYh=8W!d0Tu{Eaffyyo^mk#=3)c{w+OpR@i#riwDh?)2kw0b64s!X1Sr0#Jf+YG z<0QZiZC!C-oJnjwyg^`T+fZBz^or~R4POt=)1lCY=9s+rk@&-O^=)c}3|+zB7S^$d zN>{ewYZh25P_;0FC#kS8OG zPwM;IjI!kw!ZX`$hjy`oPl)xJZ#cHQJ>R1^lj_78GLh}@8)1d1F(lUOHMB#i4P(Hk z1fBw{xgC-_7Ih#6bD?Lpyn!n1;4gZ6zvBdlp-<#klIw)BvQ$&neuYQ7s@+HEo-lX^ z4gZP!fIqPzBC^?`a+LzON(m5$kVV<8M{hqv^fmt1?|!XTyRk zC3N*Yml8t3!K4bOK8#%p8@mx61(W@=y~FS^E}5OrRr~X@Z z>YMfHUut4DJac`dbE-t}uF`*oMFT|xQlVR*Z>k6J+n~`)CWDA0CjBU139SL`J)SsZ z!+pt|eSHb2sp_&fA(MNh{6HHc@OpK#99q0MRNB?p$+8nP-BQOIrNq)?>q~!+hy>+ErM+gRuc9tKj}&cOLdy`6{OJELJNS6W?J`b&NitLq@({=me|w z?^eaHX0JuNcB=lsa4T<0;mN!W<;S!&+!WG%F}EO=N_Mec=IOf7x%mlV`$OM_@O7;9 z@oRHAuEt~1UMW52OG~&;u*(faq_gQ+K5i`D2CkjdWq6P(+Rx~QmWCL>JdLw7e2hY= zPQ<1s$zo+-u3^+3gYS~ET%p)x$lU~*>Nj({E#1;bY;bFc{D@?I|nIAM>W{XZ;fqOSS&r3X|n!cUw$M<4qx z&Ut5dJ((CwzBm3o&#+>T;RzJ;EHa*VZ_KYr+ip^14Zc$+=wQC9zWW3h(@x&|pDHNU z|0u>%A#t((Ut|K-|2juiq{>I&OTvd--qM|<;;X0<#h1cH_7HI)k{j9*#nTILJ&>oS zW>xD4-d^4o*V!zL@sxFEYxBQ1$`op-bnv%&(n=3WHB1(i6>vn_$g2dGQO@_)!Fg%b zb~Z4Ct2|75)XZ9jwKfLde+XSKi`` zQUyti)DI>``;{JRnfQWQgCUyLWAGd(u&tg-+>=35nM&0My6aAQyX&fKF(xTZEHEYq z^(%Hfs&U8yc%ZgI4wpeV`4mmM*5(FA7p~e9#qqMSbU0O}!mBOuuvOh8sG~HW&5YpR zeyKzRD>Fxmd&vS7b@rzOq96%z3n_u@?8k_Mb#j>dA^5`+IVC0IQK1K~9H`TB(h*zB zQXMEVcr)8QQO7avKCKpUa}k%aZ1*Qd)eiPH=kR%6hb>kEsr14#ZOBztL)by1jcxG^ zs`?szNN{e4qrVJ`1E~g`n6f2@>b5=Py2}@-mRb64@y`G_ET5hvVGjd+)*|U}tSFoi z4TR;C9kag10h?)CBY10YED`Ml1lnYJ!+P>88RmG#tZqA)5Dj`fWEALKt)jr|as@OB z>Jzq}4ka31vf~~9)&AQYg^n#V7z%JK7O9FFiZp$W#2h*Od&>CvHxwHNS3^^Sh?H@B zY}z)jM_1rA1^9H4dbOzfwt#yZ-UK-FLmaoY5B=)qVc=52F2M zhp+ovqC)uN>CBlAPvJp}{`u9fkcfhcH#oq-)3bkfWMTQO*5#pVu~pCD{9>~UbtGi- z+`#+o+`H}bdj0rM+k4;c@@n65qp?Q=(E4fgc?1;v(d)Op0Ae{Yhd^tG29NOg`BXDBar0i`@kg_)La4!kpm&sDoT1Jy$ zKbT*&i<@hU2nrd2to7Q~?wFC$->~J6@zB9Px5kf=zT)`v=kNPu*IRmL89QguAiinF zgCOw!^zmL+G-%LLLHd}liZS~(>8Evs}=qS z4xMtAVy{W6s7^$4;1l*`p5}`m!OL?!NUd(eJ(zAij=PRyHg;jW)L8o`hQu~&In)P6 zN1}*SM6<|_5VefOTo97TBp~jOMFca+!Yu$Fl7p@grQDMy9yd_Dbv9-*P#mjXTUL$S zSgtEk{_iDSZVub7*iSbQVJ=M-rV=|jp?IKi;fGTOGc7K^?jWo&H-4ZAZcB2YmL+=H z*er4~t#buNuZmfIKP~jSOx?iDDlOG*xukZ+L{05jO)D~d1#jFH4nuA6K|Ihe7BetU|BQp#!C$XfsYU%z@yjS>%45e# z>%0C=(ck-JiBa7ZZ~ppe#!J&z@0E+ICcxFz`*z2#QG`{{H~!%}(w~Vc*(Dp}6;pkz zS*gBHvLd_6uWy3ceB__5t)eL7KY==+RgEMob0ShSh!|BJdSzc7W&Kj2Re$t(Op0;e zn+dgrQvbc|Hr%~oP1)Z7t;)bpFk%skLYRKVTpIo){4K;EAWN3k(2g)l`!(PRKUPpi zfmy|TT&nq>kDQjVcr|jZ3+C`+#WtAvz4eELvQ^T%31ngWeWg{{7$INqBFyiN@P;Hq`M8bE2dgPTBt< zpmTHl=am>Z6Z=M5y(Pd$@Z&uWC-`{btk<98u|tRtarsc3R2T`foqA6yh)*3v5|j=*eQrWYp%6v1s`Dj1_gwubr&> zkk?}t%63ou4ODBa#qJ=4u*NJ`YtGqiSe$idVfAL7T@eVK>=vc=%ma-r!?7BR)=EIj zxH2f3$*oOdeh<||lN2@Dzx4}}F3&e3Bq~vuHC8-R&;jnPMEDH%2Ve8AMU=H@J9uX$ z(MxNuu+*#|q%CGnbWaY>hilt(EJsr+nyHt$4u!R}G2%%#%-NN!%^zOv1QAoKYUi@s z!GLU1*$9|E{A zKkV@X8^JY$hXRjgBHDH00?Ql*jaamaM^Cu2E4h1-j#50O*HR7Dmd>K)=Q?wT4k7o> z%b_YOE{Shr$^B3o0OL5ZntKW3RSV_NKsjXe26jscVPnQCOP8-}L1JoGrG&C;UdtM$ zKx2p1QVHa^dr35VUF62Tu|qLHF(0kYiK~IsAamh>*?~*8$n9iqlYz%_TO`s#g47bu zJ;7&}`TU5GN6I*|Th-bL#{Ttt+MlWg?=}s!w71o^44xtAyQ9i!5NSld*0)M~?#DKj zeE=gX)E&YX$iItAHT|L6X@TLPP<8L#OzqQu64o|~RUYjYAWg(U`=!3U z_;@MCM+N!@x*bE#$Ss2w*ycE0K54Y=xpHvh<)N$7ee<4Np;Cbo0!*nYw6Oc=b=OPpu+1r3I1H?uxk)^&zP_!%lPVe+e#&rEd$Wh z1L_cL)*8D5YG@f<9Y50BZ)h)7%iW9<;xh%fN^;28gE*IA7vu1z{r$(2Q)i~qa>4Jl z;SnU<*H95R!s9B@laQ_8h*!D3emVr1G6MORju1JWM@U{n+1C#AA4(UUCU zHWjS|F@$iZ)B=uez&Q=+fQ}HntiK%k6oX_RGoMA+47r1tLzR}OGA4(2W1-GV`HyS1qX2!k zGXZ++e484d=$ItM(x7h>PAJ3=TK{a+#-W&Y!438T*A1F@>)|9*2x>-Ru7|n&Ixrjr zYtSvjuqp6w1t4O`G+3OQNolen8 zkHKFJDj1V_GtI<|WNo_MGuBoY>dWV^LK77EVY4RL)Bln`5x25_MhzuEQ*~`(el&M# zZ;F721Y0Wb?*d>|>6>Qzw&y7+czN>u!G6w(CQPhs7fcgfXW}xZ-_}sr87#|n> zt6-?>{d^UJ)^JGYCx{F2f%jvHZg^9qIQJTj@n;TdLdKcm`7v3wAVi=$$p#QS(=2pS z2ns={QlkRXIA&vgG@vP7fgPUZp?B7ojESx#(6-s&MOs)Po&fJ! zmzEayX%OgP-MS>81F*1O{QFI`+WwuW#Mx8CUdo453KY+{+D(Sd3aaHsOnUF{FvH9` zufhr`^&scO*mJup`LB(t+))ZTbMKe%MyX9`c3IdLxA)-DR{4D2>$nOjHH+U)V&bJO zgV(AUaQjtR07vjIsnedxTYp{;WM#B;G`Zzy!Tl6FffKZ-5)jvE`kp?{nPHo62%Cuz zQra7URra{b5npWc+c{)3iTa{WT>bPN)-_R&dv%gh1iy2v5EtX7UaNchvlj6+$E)=Ka zBpN@Q1?$&MQdQ=XBUz~bR0CO~m4ye|Aah~}qs7zr$3g z7J@$R{~Qs8&8`Ct6KN8PZCppi#<(iVgf5J?n5I*DfSuva(zg5%W#r|=1qJ8iFsnc! zZJz)wo!^HZPzGrmJ~@Cg70uEnY|+xoMP?;5v?5@df^PVcQloHHQ1uOCR-I<=$H27J);lUX_E=$o`Ma_}8_`>0rGx9gil1I-6wo zk}5B4h{qJjNSc9RTe2Vg=nQ=|=Ej?-Z-ly}kXpE$O>uCozz zz3QsqjjRsb74pH8mQ9H1*p+^tdJS|%x{e`qmNGuAmnvJM(bB{kq%Q`1E3%`Sit8|Y zH=%_Jy*^p{K6VGM$L;g!5U}ap?EBH${OAu8Xj!H3Y$&3U5zr6}g<5F$5HObS@k4;t z0EBSBn3?hc{!v2~UGLo=m|_o}Asdz2VJ zmtQRb9n1ZcJ|dA?T$dNjeBYYb_UbbE`}~sCgs?7YsN1M3>Iq&e>P786a#k@+Y0OfC zW@F>}liRLT_28U#y!)l8-gYSE3;~_D0!W(ornDI-r2n$4Bp^fJ z*LJJ+=>H@rOYn&apeE-(skx3dk^{zs1L$2o_uN7;gYhl$PWS zxbz<@Q~V9AqO2laJT%baC}t)~Qu5hYb%=ushQ@V>Dk{0yVN~~Zbxd!;b?jbz9;Hk4 z@%xwZg<0-Ro5MHCvn}ahJ-@;e4nTDqqgoJL5p6j+R)Nvq?L7_otN4B)uU}0>f-LJR z8Vt`~!pZ@O^mO)cyay*fS-oFets+xLD%R&ebM6oIr)`mc_vsdN)RA|^F7;Vdu_j!S z0TmJy??`?xt%m!crMuI#0e_-ECv4!7SqXJ|K~rn7zwS8c)htWKYa!d41$w@_w8&ah zYkVx^vWk8Np)VJ~{VIMGl=^uJ#Nv;!Rt*3AfG&9srQ3`Q5W;ar0sF2kCo*{_(l%Z& zEDQ=?Z_7S)2Szkph$HcjA%;53_%_vs_m_e*C&Llq6r-&Q7?976y=C|uGR`*SwEejB zNOS8Rjia?;@QhXQ2@a`4hsp5&*9e?nae*%Uf-O!b$ z*YpGeMM0aQoG%JnbWij6n}vlF68quAX~~o3gaqHl&)_NIi%iSH0|>Q=K_8iUS=(M$ zJ|m=z=` zh*>>xiD5BO>fxO-VKldwug}AU97vR1ScNZ>Qj0`8Uz>*s-nTm+yQO3_s6lA?7B*cY z9Tg9yiKxqo4o)Yf)By2NcsC3V*F11OA6JLW@(Ah5p?+(R`5Sg7bX zCw<@V6issWE!O134OhR~T1niF9&@}f%{q)?C~cp?Q6FKSXrnHp61aZ$8tCwKlf;~u zclTxj7x=~tZZ7KoMst<+*xtRn3a)bx&|M(R_J8II!hMm99#d+YCg1BuU^E)dWIcF- z9-oPRU*#w9Lu|`vg-2Nj90`DcgrdX*zWfS>${^sqQ}D4C;7%5|T;3{E2-z3-B&+eR zuMIWSl96oz44DjynoPih>mcju{)kGT%wVSi1UeTu2!^f&4(Fmhw$RDdS+o8vlb=#d zL=|TwhM2u7xo@*9F`DKG*4O{80p3)i+J7R!q+H1V^pA9UuN9yUKtFf8z1wR;{gy+- zU}nlc54l#1)=Df?eCN14@rz=@^NEC>^qnh$oCb1XkoaUFK8}$$4gvDs81)B`ATMFS zlDqSENc`y%t*X;T8YdI6%I8CJ=ibr`si%xcv(n)c{=4rh$4h{ zMO~c&O}6n;Usqp&3>f0cqO#IAdt6RHT}xifaAH!}oL|?yY|#%b!QI=NbB?txszfE( z0X!XDOmK$~#CB=He)h}P@u)TB04A6;3uf_62xH@kE!WydgY&qyL-vA^GAwZv);oHq zOUlA57(Q#Nygso!6_9X=hX}^}q4ez^*W^rIZZx*GO)?mjC*8h;Tc2?1Ae;)Im$4Jn z2^b{0sEUo<-7+Is*=of$GgFAvDU>~Oz1F95H7=j%%y5pJ9C6r(va>VOQlYAs7&}^+G-ST3T{V|_r5i)f^ zht`~xbcLyhcglK15)lt(QL0acKN~zbo>~u;q`J6SN72AUHzOk`I2q#?n;-XNaMqtu zrSwGxNxt{|{MM65{BF!SqSA7!8DkLX#V+WPTk{qkXgsgVaWO!jwDhoT>RT)bIlduwOWdt&z1;jJ&8AV$!RK2x#n1 z*qh-WNbn0ekIbEMJWhvgSQtARIS(^K|6WT<5l$}NkG{eoym`Lv_wL2#ubgyjXy~2m zcS0ivYW8>j>1L~U8X)jLm zt(!q7f=wc}fduGj#M$*Uj@!dm*9xbrIMrb-)qpK={tG69B&UkA^BPgX^^0?z(xh7) zw_cCaE(9`~SFjB26Bj9@BZ`gm#mmHt2>8`|+A$4VQZ<4OBOZvy9FYX_smV8ji2D$5 z=*6IWXP*HcQK2v&rUmn@oWuN`WGOb9sfLSOOGib%~4aVfB~$dLi{IU31iRstFIwl&s+u$bRuyg#vR zcLORAc~GsVwQ{SvO|0LG7k6fmgXT$+Yo$&tlNQzgopT1kCw5?Tokj@l*Ez2 zShmzSw^vJ7z0FWz`8ag-wyLZ(bDl^&FK4T|{vB*mcYE#xwM&i;HVlo<8j4wx{gcf~{D@uwBd`GHePOS(5g4!}cGGBz$E& zk%ZkOeqy$`#`>TR1imI5;l++mGXQ3~zs$5lH>&M9%fF|Ma-8U~x|-iGhV=05%Bc5; z7JobiZom&dj-JU$x5?_3Cdvas>tW#9RWCnA>2TSBn~=|(^jC$DZ@MJhc3^p|Jv^hi zdlSbGLIZe1e}+WH2V*ST7Wr#J7}p(DeT%=93PRu*%^mU*E^`EUl;Max%8ru}q zs+GtSJn-!<4vL}T2E2la>$V0(aM}9td+Sl2ne9@-pP-f7rI+{FvE1KnHJfKds_>G0 z)2&vHU0ADdc3l_Gj$cMQX8_fZGf-^iW;>SjXRulp8H0qX{1g4sMfr9+q9+n&R5jvxC$H43v{+`?-DpP495IClXRSg7lU ziAnT3^BLP#x!f^Glu6#Q&+#9Yayw}-@MazXP?{GQ;JFHZHmc^ zD?KlIMi>5SCdMKxGY|nv&@S|u&8nt;)T~FKZ6>;jnLg#@y_h;`S6;Bmd(BVa zFhvkHXKzZwIn5t=hL6$p2UmpXLP8;}B<7oO(#_FoTT$Wm7>H&0BCFg7GBz{oVhqug zI7~puws-uYPujq{)h(^0pLy$+RTXyisgFeB|C$>iHh#2viite0mML%<{0HPwv zyZ@oWVEeC490xaR0!i3^Y~sGU8gIOOgR8l=_Qc5&Jj=R$hKr;#2J}~L+PlHd^OWdU zFiS%<5);fF1wTUYRgz6dYIdQT74x1_aV8QnNtlzNm^ZTDS$H$_RjHUr>2B;cQyJhV zo8E?*17JEq+0B1nFSlnyRC+kFayRiCcdi$F>pQ^Oi93}~=HIyl28tMOn-vb9yi~7v zCRmQB;ZmikfC*oWC44dn+fK6TmR!4FHV9*K($(NXVM~SU-6!Mm<@vL-DppwMFyW@V z9+4r|gXiT#!QXM+OI1)cYt(Fnd;iw1sB3J8LS4B?_tgwjIh?Zq=P4?Qg;|LM{U~gW0Vn}R ztl#>n`-l8guXQwmn-IPUxf!}tZ8{Oe9y{%K2f3rFr}lHLL=(t;bOxC_uem1M6Wm6O;5cPw zlWC4z#QNU zZ+-2gj=e}yQRhMX3BD1zWSZlPinerL4hdFPlkhde&?riVyOpaj9t!)Q4IcjR9P;#K zvO?|!V#Ht!#HimeNWBY%DrN>{t*^{-!F_r(dlNI{F>;2S0;7J=2M~J7o@r_9>kT?p z3fJWY)@m78HAPHx?zgwhH~TuM@UR(}dW?|7auKrcgG~>QLF~XaLIz+f?HW*B{6<81 zPDr~R`SK~rt*%KyrR>S$<%TGvh=L<#AdFFo~#wsrSg6bN%a zpk|q76+#-%8qVOf?8mB3OIhOUs2i42{pnx4WU}(YJ2qo{>k}k5w2Y=_q~tk#JI_O? zYac!fah-VIeOEyX*X>^Em&}A-$#Z>su)Z&8+knWJ0~(;CV0aRIPh05{VWoL)lCdju zKS08TR2sr%h33^#GM87ceq@in;G#PKaF+@1EKFI+l%!XSY&a9)|BAtIUbrW^_QUg7 zzjqro2!j1JmPpB=GU0TJqDK+4 z@ChfPrijh*TZl}Jrzh-)YSYw3cgsWi;wv=2*ytT9L3&95sZ8m$NCTIC3vc>VWS)-u1a(TAJl!|HGkpj!KD7{f?{Nw8} zaVen8;Nzmmr6D0u1TDqxX@5-v$b`AM5(j44oMS>F@H#rs1yjW!B!dM4L+N|r1MI4& zLqAoG;Sv8G-X=xXl6AfeQLiQocVrZq&s9n&%Zv|BHfC+jKXMsZ^mW!(&Dk~Z-?1Eu z_21||?lU?oAZzI#bu5`xLVwnetsVChI;J^`$eVvZQqWJcrQ4x5H&@2-r@ey8PTwWUjYF_BJBd2+SzE8ZG$2R%3G)X9mI;ft!zOA! z=_p)%o+Q3gH8H-S?Ypwn3=NM5FJYB1-6HhO3kS4KiuXTzNxFB6Gk`r_@T)}L_PfO- z6x#hf1kY^G$x(0(e+Phckhz&l7_p#Ue zUSM9t6>gZSlX!4lK`y1moSKgbvK#Ro+`Y`P;5tPo^n1r%!OtIGb`DPO?Xm3bp*>(u z4ib`Ex6{A(Q+UqV#i(p9{(QBPZPcR+I~q%K!ut5#=*?0SitP*nB+eqo24j9x8+^(B z>eo(QT$%A`kVJZ>NgPrW$po8Q0bdp*r)GO!oaBQ$c$>3LtS`ulngeu^WhIU=h~ zyyl5@eB(f=r#taepj~jZhGSsVWG7d?B6dlzT8UYI%`ME1TR+UxV{8z$Bd@t`dp@yh z$9e~XGJ|s8dz7dJXiryg37HSr*run8B2BslQ}Uomh!?{mH3b!hVoZ%cg+Tb#@3vo* zJv_iuW4As0Kmhh;+bs7J#YZ$$VqsGF8@4=R_)+bkP`Hl{ta=hiWm&u9Od@r5+Bf9i zAnk``XPa$W3Ao*A!U@nSGzmtI?zHnHjnuOQ(C9#0TS>+laKT};Y+I@;ixRmb@cABl zH>w~FkA2=9och#?dw`(c$H>{vczbtwfHRO^jASTJ4Wq+O^0Z9~4Tsunk#teac}l?Y zF!ygTUO(iL79Y!X5yAr)pz~QoYu0k+BzF}xnveV=$vJ)2KWLt~ zE271H@@UITa1FP98(FPRw?Si{QWhP-Gp&GPydNBN@$W$f>g%-V&awDqB>_6r)6}NG z;yuYbW4_A^Hm4s=*`aE6fK_|tU)}y6TvOvXO)MaS7cA6PNkK$2Md;L3xLKtGdOz}* z=)x7Ij?-tRWEHTYoBMqxL?=E$L2daY|A&n$M?$O@IyfgMb3!f$H88Jp8nfGo^4SRl zN1zuYWSVu*Kz`|huC|?0wCH-Z3FGMo2-%D@*4FMx-Pkn(K8NBR>MN3*Iyryj5JJEB zGnvnhQW!P4U+W^q|J@=8{xYWxGB6uw+*$tnoDuAF`1cZ1 zc9r$eKE^83;hJie71+eDI|~t1jB%-nIr%mI=klgBx)vTr95HiY=P<&)n$rSP$i6eM zqs8A2LLFpONwN`I{s)u6bNy=J6vBFR{Ivvno+Tf#|J!0ug`xVeq zN#m3*m$N60O2w=?i!ghl*Bj)LOzEM=%+8paip7rRI^D~Wi#C=42h{6RB~>r>5?&uJ zKOVm6QBZKw09e_aoS3phcX(NW&mXDtR>=n=KB8g9({1P0Npq+3mBm6Pscfm$8|?)i z^P1=}$gs~vv=Mm{?DVM*dhtluDvgXEmWSYiq}z59^5@|)+O?!=?dW6U`5kKdf4e=( zpLaD2pOYh)h;LjFy1_`PLB$M4-g~W_4e2;fdHcFR6J&nDjVECVR1#KXoY1* zN>!yhnv4!w38TX^r3<`fQ~z$Q;%lC3dbtM`9AKgw5$M^_0*SK3DK4mET1ZDr17yKL zqa1tYysFPP?NU7hc{VnC7*P>M^brm5$>_4F?(e~p8>p)cT}APd%Of47MIzY6wBgl} zI2xs8fOIAD?NMedM$LhKd1WV(-wV8z;*N5nNEr7x47J`*zG>)7J@?G3Ot}Pbtz}rv z;I^4oKL?VbZ7cTgSL(wZ$L|@5iZxdN4u!S*n(JlCH~hO;(VE+R$AL8y>5v$ne|dIC&)gC3W0Ds z1H_6Zje}sQuF|f>sVgwN1<$!s&PL{N{vs;L!4C^u$#9hpo_VS$u6ji-@;}kV(Pzo@ zeWFKysBb~7$4B&vpU4+XqJ4u4m1}p0Tg=GsOAgr$F_D_;7t;Spkq69etKvl0e#4|* zRccJ<4zZ`X7*lZ@TrI5ETuI(;Fp)53QibLtrriU-a5Vzlc-{!vGJ@NYN! zgHoD&As2O=Q^A)-o|noC0@eNo?z$j8??71K;U;is?e%_CU|^_9i20 zUuGu!i!*3)x7NrinBrfn(~V+cSb*tRo-u>;)T~l3&tY2qFWU@F-?%y-*UfPgcxV78 zP$l4CoEG)&o@n@W|+G(Vy89{ z&Y-b{Yw-!tft2&ee>um?!PiThpZDU7Z#h8H;T zS$K!TkX2gwX*`M=S)58Q($I4 z2G)eh;=t)U8}+x%!++x&1Qr3i#G6wc7{m;zzvWRQIWb|p(;syVd@8o$j2mO6rqa>L zGEY?^^#tDJK>7&U(NqyGSq%J=z)L7S+@&W^H!bu$;{0!>qJlG9{gj@cz`H?JA)%sR zQ3rqWFI3$6pHJVCqC*}5)F&51U`)XkZ*t63zc5^|=m6r>kP=?Wf)!(a2(NXb{d9{8 zl3s6~OGN|RT|Hcx#743qCC@WWH_wP@R*s9tdv!x^;t);R9p9-N=9oLc+>BCEPAS^J zut2NSB2`XZuBl0t?86@oKr!a|*pe{IhM6SMHV|L+M_-oK=anR9jE0^!1&jp4s&a5l{2TU6|Fz@dt(B=zUaiY*ElTpcG!YX5Q(ry#s8!&6FCbOK zT8mJaQU$@X90gqo$fp|=e3FiX^fhx~uy+W+KlcOq2D&S>N~$z~DGVWo#z)4Kh6Sy2 z{cK0=NUzI0bM=$gedyu&f3bCr?SVAWx{i&BZQHhO+qRvKt%)_UlZhv`Inl)S#5U&S z-RHykaP|+V>gukms%zC+&;6{3EpjWDuxCNuhMrRf$lftmt}shf@&1OYY;9!A3th$G z#<%M$n*myuVIGFJTkJxbqhum0Y8Ir2uGDyC@6o^abie4hW=R6YZnJA0`_Bp!aCaba z1^B(=c+U=)C_+m*>KYr$-w~M^@x7iB@X=*t%v-+h`j>X@p9{_7>pgPT+t6%eh0dM@ z3r?O*rKwXCbvNW_*+>>(FVUM|2&uG2P)Q7C=DjOM)T}4>>fkK-=C+jl(xm;#q`#}< z`*-uQwK+G$p7sI-UlK<3e>Mmv`USn;f~OUiW+`!$x;(zjzM8P&p9o5J5*F)U%EnlK zhp=bLFv+HJ{HLMz-H&UzmGW08A`sw5sFKudb*34KHA<;z%f ze+MwnY?4HV?#hsp`*gb~pV1@m9j2rDOzh#%wp5KcvhkTiXBny{55qW6yIgYQhg>N8 zkkdcnGh16ct`9%XZ_Xn(0h89Y*YF#;hhZTlz75dvfeIauL;0A@B;W-6N%GLhWpk=v zC(C4pye6<}Dn&gJsb#17FIl;^X9$XOs44&=6+~&vj*(7)im^FeEH5q=$p%qhC6bix z=6A%{ld7Y;su-$duJki_&p>Qc*QvhxuAP^pBm&w&xIrs1QScWfF;OM0M-=HX7KK5? zKMP698{73M{wJ2y&vgqGy8x_o89JjQT~{_H9#wwixtH_gWxG-Imk8+Y9 z$1OZ>tEtrR-8(jmp#47WOamvI4h!gBDXoN_vPlZJ&~d&zTHmzfm5`o-6t-I28PSqL zsp{F)^F&8v`Ei@&|4Xj-3Mdgww}P2=2ZG8K5o$SGjlKblSTslEy(_6}SJ zj0;;*TEdxR)_DuR>I_hcFf&_!FhBDjxm*QkM$O`0?VJ|Lr`YNi4=%Ro20Wa0F5KN+ zVZq#N^?v%YmM1V521G&sv=B;4kP*CTtO^hTljp@@lU8wp$|QZcphm{~#$*}YlR`$n zKAJXd@$`3k@oXEi<`y!ehYC2^XfO%1X7#&c_F@C9FGo1V2AlFx8njJ}y+7|r(u3d2 zNz$q4_(GK2rJE0n*{kOP`08OHCnhIcmg#9ztrB8_*7!4FbdD~^619us1a&$7!!pD-ITS@r8g6;Iy_sPF)k@(K%5A79OG0E+|_TlHk{#F`M~YS%$)Cal^D z3=UmKzc*knOg#I95#aLzg^XX*7jT+o$Jn*;dkS78qxnXzG;CGTc{Ll?%C|zY?bntU zg#IVbG14HAe224T|IuL-W4-_TCO)boZw%_@5oWj6-Wf(#CX0Coo%=IGN&vVGELiHR zs2}#{+vGApz3GF(&{xsj>tl`IVvjd4$hKA3SArw*?C(Vl4!kJE4Jv7P@*?S_TWJS> z0C+Xnb&DlUJd;biZXz7^H zOR!1%Cp}1_1=OZh^J}|9g?ubFqLxn+#TVFU?%y*gRf&^{nNP{D&6dl3ZNh9J^^!fA z$M4>-{sSAMb}!Bm(h*EsOP!CGcp-_gSM-yl+g!(p&a}5B?}E!_&4OJ7i&U>?(kVo5 zqPja{p06D1MFDhCOh5RpHioVw79E2EpS{k7WEizWPCmH+nOEe|65)*hCG6$m$(YLq z#Q*syG>2N5H`-Z7S3E!Eg= z1c-faWY9?;)3& zh^L4Iu&VIlUttorxF0s~r-+8?VS%DIA@u(HHl&-A(I9PC~!PA#rbvv+Q!&|A1fN&YAl%7%4~q zc(}Cf>M6Io21%m>vdi8dLMT(Xv&!E!IMLL_XGbu@f@?15g0APK<}j{*DsAqmS;h=06SZG6??8i+odmO` zO^?u-bbrCxoQ_VhvpHpWA;yq?9 z20Ud^GpO^d*lBsj(~5s>yu@XT_AR&Ah-4NM9v1zRlhK!n9k;;49F#LrGeczrEb47s z3V;R*{T6uy|7~d^3*Irm`!fRIwm(=3e_Ni!nYu2Y6SlHPkO&N$H6)kVyYBVEI2VZQJyD)7W)#qW?gg1veS zVAg9e+>4C}-t7qQGE=?hCS+K^?~=*D1 zG^I3a>Q4o1f^()U+V`UlW+D1|!M_<2x#k#y=5+RhoCZynf1dQDRIPMcq|dImd;MCw zp)-j*o(C^x>%0Gnebj6L;0{+PR13Uc1h#$cinL3E%$O_)5{1_L)oz1KQJ0$ClJ=P1 za`q>R7K!ZWh^U`l$(B5oI(a!BowrDEqvZTEvR>=bI$W&6t#rdabLMvPQ ze@{Fcjl9?wJ#ZvouoYrJp^S{Q2%<00uAtZlaYMeVIT?>( zTyo!KQ+$djlPMjL(n+A*nkkF+X$?D=VRo{QQn7x`9FFbyF&;NRma~u@uY=o@!X0>x zYROfckTcwD!Xt0SoipDIGrzHGKY{xh*xA6l*yhZ${}SzjN;#ta z%$wiHSi!X6L^MY&PGNs53{#%KCHIo@658C7aep>(_jv(g>E8=Hw`R1Ktx$JzjvpN> zIfUcRcj=38Kl4=AzZzF^xSOZAcE^G?R16K zgE=Rb>0fjZ&*fr80Bv_%)#qLkTgZeST%Be&KGMgrbgGA1hzZD`V4?$O{2ksvi3&ox z5<3ag5(Usek?KFIB7LHli1KNOX+sVA8UI25u4@e&O0|}nbe80$hu6QiN->E} zhQ1O@uNlsE{rP?r(@QJw-=@kGuv-@<;K0xX9R&#ebRj4ZpXk$-{8tz+0yv1=aadidj$Y-1G~a@* zC?gt)Rs1+e+IK{@mv2(rEU@F6NN_0`9Y(wH;Z9_zXy?jL^X__*VAWX1`HI-!E%DRF zjuL=t*{KDC6b#oR?lJXUeGG@KHliT+WY_CHgUmO*3tUGo_gPMHyx$zGQPEKnP<-ij z&u;{i-O-zY^ms!eWiP*44!9iVs{SRmZOxRAQVrsyf{%hMtM@PKw#_~&EGty^w>M0D z@BYlI+Pi8me??tyEN92ds$H^CGr-?YWHbjzp+^ZEmJrc=txOB-gk3+JQ~I{&Rz6v8 zDj9RUt~+->mz>C7wG_BIVz`&SJ7Nz;dt(4fC|7d!YV7O5p_w4I1+7!_EzFb`)IUX} z@rq0s=1SOolA{DTxKkNs1Mw9?Y*I?Pa7E-NC_Y#=DWtt3;E$HBpU}Fuh8&k`JL~{b zyQI`Ap>%b=%IF63jLF1gf{{&6Wpt^=8)O~W@+_g1^c>2UP;vgje0hoj_^a0Ztz`m4 z9P_pnH$-4&dO2g|!q>*Bx@b}t4=D^xeFob1s0D&aY3xE?M_GB2Gjh{ z%x%~ut>HESedl;rNe%h0>a=M})@OyJpG)60M49ZU9Xvo&A^B@YYzxf-52L?CBN5bN zM;WZoHg&4Ip5rEuo&(p4)&rq>HAZ`b@=qLTN}f8&7ZShr&KsZSG3U)Q!lxvD)j%zP zwWNVB#)w|9dQQ+C;GL?_HR)hvaAJh&j_isNA9%Y5(D0%!XtT=u2kkakPEuFBw_i)> z!O3PwtYTEWtgv$4#0nG8eYqeREss?q zgZ&;q{DAs=1bIX-f>&Fc&DZ>w`^R0p8eY~rDUHpXsF;`~hIIx(NmB?5{ zmAhBtWBpMWu_7?67rXjLUtPw|{kLmT9!)5`R6k!U>H16eMK(0=PPExR`^mZ)nd+73 zuqDOD3++NP7?WZFhC6uvbFRD{ooxi{@bp=FL^5TIiIll}ewesz$RhxD`g%ATC-x}aUq4o$i>i|0-4kYD=w#$7+&tmP zrWmRNkvFb9)B-*y@mAB8pXU1Om@NJRR13gB&0yh|i6LgC!%%((;31_~g1l&pa2B2u zFJgK{L!+I2ZTPO6UvJ;v!V$*s#MFODvm%0SKCVqk##=X?{tY4TcKI?S;-=Fc41AT* zCk4OS@-Hw(1KiqaP<%Ar@Q5bI=8$4eHi<1VebW?j4U6UWU9L$g3&n`|u{$q{3#va7 zw50O2`b+1(o>3}lY~f)-@KJ0~iICT~3o9>UTq5@N$wwHv$HKU zM~=8>O-5LHRWfem{^1bAJ^mLfYmviYwXwRy5a1!z=z8wa7=2<5-|iDz(jEvD{!kX# zRuj0V&=?R{Vn;*K(_Zcu4>`8SgKQX*ge$r!3+i3=bS$J!U%`N72s~4CG!wsJzrk$k z%eWW~-CpFpT&U|ur?5Q@Ah&{r|xo=U3(@g&LWg{r?eOINATp zZ_;Eq6M!NBearhV^#)(CCUFs43h|0RoO>kpn9?GhDvi?j+fP#lw*e`csvI$K~3Y;?X0kV9(8~q`f zw!BmD{6-Ow3{hCldOXlLUc3SLqwK;E+F&-5c};uGC^1TF2IE*BNYQZR!YtjfDQ^KP z7|2Y7I+z~W-`@~+;+8Sc;r?1KB8ZT%htd&azpL!@+AsEJ4)ntO{#~m44U2XqEl#Go z1G29fI7l&lj8F-tX#aIE0;x#fGyu{6;*2E!8=5`~!B-pXcn%FQL=>4W?8q2?YHtUu zkQW;c@(#U*Qf^lV)IigSYe&1mIlN%je|N{!vlU}yIL$l`&GR>;=JgnkyU)S7I-Y41 zx+JBhwc|IqK5sb~N4n1_1mg$nyJ1L!U^EgK0K!NgAuPaUajx|Ax?D#&l_2IkOYmTNLB&PLF%S(wa74H zGgLn!JuDc)y@q-au{n$*F&Gj(2;;21vL=FY;(}^H`4R8>S~eonK&^-xoYUa-u@Mjo z1hUgx6lWUm->xs$U0EsRC(LG4AM)Begzr)`sI7H{fkt|g4({Vr-NN4b+q1ylV(6(GJW;>;6wu%4-zp!r_fD|EntWj4Ony0Q+P&EGez>si z;U;`qdS1SY{Rr*0s=hMe+C_H2b!$)t!c85nSk|{t)FG-Jz_$$}crQxFa2avckg)SD=vA0;?$GMQT98ve!?a+wpW$1t$E-T%w^h3 zH>{iNA+(B9f9=e>T03I5azPVBj#|xDsA>Cn4ngd+p62<_lDt#Ee3AvwL0Z?-+lLr@ z^be@lMdBMIax!{5o;!Ycy?)Lxd2aK%KDf4iKu#T9oGafwJ6*Whhn5>M*2;eB!=39k z&N-;qdL&h)YPyCd-~E`m8-%WbEH$AU#|e*d2+=%-LOqrZHlT&v(#xlVTp716tD}R& z>T696k*OgabG;ahkv{^?WonM)PD79QvuY?C#?Uuhi8vK9LTKn8(KQuc>+RA6g~ zqNic-q??r(aN#cWVIjjUTa8t~WgqhNi-~SK?mH&s36cDCkIbvw6)J}dVL#Njt6PR?q_Qona(2Y7JTrk3d(;v7~@KZN6d?`pHT)CYA|T zqIC2ev34}QqI?~vgnNZ{D)ACS!`6JElOJ`T$jVm|wSWA^y(*uMfont$&hFJ0= zv=}?UT!VngUiT4=nit*SNl5G2yXW7tDVM`N+UC8_wM;&cf^wzrG?KSLO)j>0xjMAAo{S0=b6`2#%3wqCxfY4dd2konVcj_JXE3T8x=!sw>UrI=4J zzg_UX)83P4TF{!yZF#=d={Tdz!P@DR8&&-sC^y05@<`@i*!M6vv{4==5!kY{z#xZJ zKfq}=zstYs9iDrh3Z27GDAviV^qT^=JPNQ$DRF(do>i#V!{wLEu#h#4uz7%#nzFh%Y{Z1XVY7dK;86C4+2G!rAh$CD z?5{24;^-Rkk4eeV?XxR}glsX~h1lNNGN>CUhn=;dnrL7Z{W;FSbO-pj92BAuITF}x zvqp68;bM9!HO>l(CK5@1R_ahzS=#$*#8hojm+g@kYMvQ8;;!xI_JiCzrf}&yh=byn ziC|V~-6VfDbroTH;8@XBh2j*fh)8At2nWXNfh)tATnv~+UPxrc_s#Ilx_oPIcQ&jvd1(i;?p zB*v_yXCT3&cuXUAOWYwEh)$&y!+e4_1&_7bAWbOT${5ZHH@QAHfIRdxNRg~NBC}9Y zT=l17B3e~DssLBN<+w|8UQ7Ozpe(6|2VBm@!Dv4GGWRU6SaV<@Yc6M)f(-$jxt|RN ztxs7b-Gre+Uoaz0I#L^IzN{2*lXCHl<+XkpBf;cXx2r1r6+S@Lh>z}4FO4Jvr~7eo z^!k`_R(Ivp`|mQSB#2u&W^4755Y(9Gclt}=?;Z$VRq6urdkk$hXbo+Cv>bDO=;ym; ziVFEQ!vkwOq^QeVM`v>U@a|I?VtLc=G!4{x&@tvM${1)P^I`>tvirV3HkVrHqBlng z4*XCoE^M$5_1e_j0KbfIdnIo{FS*vtOEPYyM7jrc2Wc8}9a)r5bK`7`CT8}|1X3)t zVVQ?D`F1yl0s9iwXmWx&`O;QSYuNJPC1bKh!h0j&@yw#%_Avowq>@Krs&nZkKR8 zUw)@br8h-{kAccq#}t9|;*r=6EeTAr%bMjM}_`pv9vWqn(XFbM8WRQJ>P29V2^O?bUpyo$BF5p6dG; z4^a4FdC$JF6I+l;Ynkw2_9Zh*S0H_rfT`#U5?8nyy;Y(sAmjM(#ADdw zIR5P0W`%uVt!MxOTz$YLDA zPn3LgZMJ@a1$P*DR%TiSBmWJ;+6lNS4O~Zq@AXW&#nl?9rGS1#7MaS@w;E(52xk=t zidHKmpyAcDoBF}aLgsDE#F6pgNm~$WDORpI(pvH4WCqmb9&Kfwe1?&RA~gnA&Yhh@ z39h%QTyua?kfUhZW^C(pH)390sm~9M_+g3(_4UeDPAWZbU3~|k=9p$PC%1ZT15}*^eQf z@GT>rnhNa76A^sBx{ zg&&LJq|?hjIuEURb^q?9G#054;1W7f!L~L7@;0jR&r5#tT`1YXi15NjUdwCsrMXlru&7bq!XvKM z`R{ormB;X>JCRxb@aR3q4tG}{)IY$aW`KFEC0D`hYZz5i{|zI~<}cKfwAI#d;@(@Q zQ4D|GqsQn&pb)d0E(wC3SHPV=+<)JYq>R4bapTF|vTDC>29v40-;!+P@92KagB}qNzZmzn+bOH%pBHTds}8P~*q=FO zoteLFVyi+-DXJQL&*voH?R_`CMwVF4>L;EkfR(iMKIQw44Qc;RT}V!UJTyZY6X>A$8-22xyzpKk-p9(ge${uUh^oUhJ_ z#)s?RQT)6^CRWO?0wi6+Cj>fV@)D>QCl(k7W)AAgdvwTm2E4a_-mutkE4J z*5ovoKD}8_?4B^h+@TtZR+YxLy{E@?2il66`?qL>@dqNWlOq`4d?GwjL74h$u z7a9dmxfc3ZPPr2n&C1$LH-Nicl1rxF@A9D(pHvZ7VKIDPiUY07+TS)E~sB zI9RSSpuex>w^z?>u@K@yIU66?g2I#s>!0XB)+jj@{>#xuD&c^gu)os$c#>pIZd-}= zz*8ec*sU2s>Y3pFt4W6o@1uU~_#OUPQ)Gb{S9j)_;}hrA6C>lr!Ec9Pdw59q3>rpp zYA3>P^J67OHhT)XMTN=a(6|5K-N7t!29`y7feQk@=spF_-Rt^_kYpDLo12ZnbgBmH zb@XYEuFw^@T8A8dB;**SFHvtXqXSSn~2d%|NdUye=5~@ivhe=VbL9CN~p} z62IBI^)^sd{@b46oI3c%|1Nns&FnF$roZ!9yh1Lrf*94xSeWR@@GRkj%l_RKv!t7@ zyH%*-*rIOTv&jUHFGD#E>M_7}-}227q1)zZ;B?l)89q!3mB0_{y|=PLrs97IcGy!~ z#L&Um*#4vL&;nn&f^|;R|8xa)h|aep=?^XH&7jGgu=7-mtN52mkKhaoEgg*qrww>d z&i~$~og*5_<@B63E~vf_E+?_&z97ozq)ZQGclG$X1aJTrov||JlEG;5wO;^y=FqVp z^rX*>=i?8yxBcE62HqogTnkzIdLw7NIx@1K_Ag7-0IvdaYJj2Ei=w)W{3@4@PBc5D zXr73I-|OT(Kf;PI3RquU&O|)poa&5atzLsw<)QqEH=uUi0FQF1BD_c%jp&|KW1xi2@6r z=y)BQ2ZK{BHI{)gEhLV2wsi2awaJaN$%lU$;&982P}>=ECPD_JKNUYgq_N$F zqo?~oQlrlp%pAS`IyEFH!xPxco$`+21B0kda zeXRxyRicITR1kwjOPR8)E>>z;7T5nx@ zwO3@pu1M+G{e8PvxM%yH_s5nCeO(i+He!1Asf_+wqG_uV#nUVQS&f?TnR~7)gk3%* zYc+L1tHK@wMF#71lY$Hmhs(QTsUx{8;~DGnpGj&7dX4ZXy3J+IUG!S?(!dsaszY`r zwla6L_I0huh3vz^nggUSI}{-9xLPBG70W!1biNam;^Zssw9d}=9J5&Gp~LbMrC~dT z2tD1$Kz=hEWpZ9#vY!2o7Sm3V$gcEXy6SPjxGOQt=U zPPQ&5@QGD%37VC5sztWMXX6zANuk`EX%DYqSDxg_Cky{Ug=uXdt`AVJmgpRbsKpx4 zJv^zuG_wKCrkJA&b8zeBu8hPD+U^*_F_E1fdmv?nv=x-5#OPOV68yQg+m|49>QZcW z=|H$$(2Sg_VR=PUf>nFNVg0Fem8UAwld;14wvlg_64Q1puSTv!&VZ5Jl?^R8E|Wf)Bz+vO%nTfUM0 z!?2HpJzp(s$ZCE2(YliPgs-VoqbT>~wupl@-h<0xtK8F>Wz)%7bgoP@F4=;RI(^od znW0zs7!T31|AJcr%&&VVehn~Aa6qUPTE&LcQ1`O5 zGEv+RqE9-@Hre5<-6nAVFd`ZSA0;SuZ;8L6{8y_FOYVraQPZc+Fn{3HO;-qFUt(2h zYM*f-j5GQ6E~t0K)s_|TSeq!jh%4J{B%zx{*BbK2K|~+y*KY7AAghrY5L{QF ztGsnc7~{)Oxd#w*1kzeP>ND%Z?vrjW;tjGj=F)h{HdTT@P6#uc)(nEGZ%4aZUvYq( z!f@L#mnM}U@dR)+o}xkopu_vPEc`|GNhcek@H^9UKz>W5{+G@_R+es2%JrrgL?Mp% ztWHN>7i(cXU30&6W^8wz(l${122&9FxFxnOS_qpt6$^y6h(Rc&!3|~?V(uS%AggvB z4cvl!opRhzRLM45!5133qs=5u*l7;TH%DfFY(-R-gFh#SapZ7-j#aGQx* z3Pcii?E#3#NbbdVfD}yJ33SS}dP-c-7=T8A9>aJtc4}Vr4kc41Ji1QQSc{#KI4~-j z9~9Xa9y;eM#9>@C_aPRv5`cOjE^+cVCE%EE z%B~8C#-C2gvLXxYh95ya3>=JVN4n_g4JI{3ia~cP9K^<@nWzrOHabt2p`>xUXG{|D zQ32?5krpdJ??1AHPo%P@>qnfK?UnOEqVd2}S=hduYwVL%86T_*v8C%$Jb-vt{_y-}t`D%v@JLJG53 z1HXhsCfP4n0%H;jRP7w|6ct{rQ;1=S+GntN!$SJy3n$`&+2%q|gd6uBvz4gz#ak7U z0OheSw`~>G00al0sW>zSb(oLyThSAtA*3R5)r^2-c5-j7wi*xNlY;$V3R{FwL14l9 z+Gw)pTABc%eG%q+NiEb^N8cS8ijIlWl*0I5XCLdFwAyyvV;fl(Lp99f*Jq7X0(?GZ z{K;zAn;z~3C*SMgizjR4**pA&gaN70knT^W&=4#(KBRa48LsXm#HC{(C(*2sVtCmB z-CgOzb-mI*V#r|Koe(+OtFu=bAINBY1u?#C&pY9R_ne#A?g{kS%oxzxSM@d(QinsL zm$w$m!|wPnqK=Hs3Wy@cU%n4bg1C7=-p-ZYZE|6WgOGfJAQZ~WedT`QY75u_@z7!! z5&cQ^Ve{$LB`2N(_wtziew9+x?vfti)o*p|i%G|7FzUmPc=ZSrMi@<<17hqOo>P4> z(t{RV(=#bjDpopfBX^MlXIHsGn3;ItWq56gl=X)HGGNbLEs02(Cpp3M>&Ap^ECLn` zyn*puh&VH_3cKGQY$JL8^6<~!NMBO-*Bc>SXvTL(;&h+BO`$8r1W%kThUoN;s!lY&TPE950Fx^A4F^%4E_`K z5OLwYUu4G(0=k+0SnsM)k+#$^W<%e#`cg(y7*pIH6V|3#x?)@8Py79opOhLwOG}Y9 zicK1GXip&Wx8|#ipsChb@Huk$C^4z7L=c%OZi3)~j>-5`{?q-8*yodaZAh{OhGP37ss^J@AR&AIc3_-lO~4_>srV&rwFr7ML|*nQbLjE$G)Azs6PJ+f5+O9raN zu!Ps`KIW8qo+a>Gyi=dpvMv!;b+K3pH8w;ymjF^^IuaQGP84G~a_=k1spUGB?DTF1%Js-^jT;!_(vOcF5vC$QZ$Rtk5OW9qR=`~V! zQm1~-^N*-j8A|B<+^)*cgv8}P1pQ!LIDtOHB*@n27!+_IYbR)Tnk>@w6;b4w^P1#i zbWR@hhLkz+yyZ};npf$mhDoyhSfJ#*cFwFnpHj6O(Vzj@8rLHex*6O?WyJus1-Clo zA6HcTo9kh8!{Lq+UY-G^*2+F^SQ=+u^bFz~#yN9dd@gVa`j{5&5*$sVMi##)sM|Hc5{v3GOz?NA#e6%CS5~qmYP9AG=K4pSiHMZU|wfj zlN>HRR;8y-;XrjM=-Sr@6(>dvG4|Fne|B@Yr>Tsg$~$`P7BZV4WL;UzNqRD{fh^4* zL9^`j*|spJjWVEDgvb;r=}0pm9~*=)@VchWdIrwjD`%xBxe1)l$yX&R#RlJ2O9uvm9t@bnS%<6BIspX^PRrjlGuUnz` z78pVt5NRPCMuOis*IJw;V}$o|+G29gQ$@RD`-ee=wedc3@?FyJ^hSFfy*;s9F(uSG z%|%lIq`x3A`!4rZ4d~5r;0IZ^^1HKs80eFn;}zogwpdLaMVw_BMj;A?l_$pO*!$xf z#0OZhcM~evFXMLCY0Dp;)ur1RXaLoVDepW#C)^ceF~{?lWmJ+E;b3gQ80MZ^R}=l& z?Y~SuBVVi)jdMWZj9E>I`NC=gnLCn@&u;{+GMbvUXTCKzAT(zYxewK%{G1W|w8UZY zf19h9r$UI6nsaq%8)J1i?|++U6MCD;D#dgV==H|RDkLi((h`xO&rrv(Jp>L_yTwm@ z6_T}oPQ&6(3C2K$Q4Ghx!*N*bIQ=q`QG*U4Oeio6?!w+{J^9%u*7YVK7RE*nj#kIDfz$* zJq}Zy~w_h_-)oN$ojw8zI}|E<`kwG=)4k*IF0Jj_;0J_78frR9WI;*&vu z85*nK%P-;8dU`G$>*9>B3K*Rtb^;Q-Ox5(16c@izh^%WzNMB2(mroTY1gumqT@}P} zcr$@A@}$rL+`WZ#ri+SaMd7fm1!fZ_d-)Y8ap4gNGB%ilxZffH@Rco=bxW)ceScrd&yjY&z)!%#D#)jAEG=T?U8oqSASX1}TggJ$&~2wU|}T zN<{f?{ml}sGrnP=N(xwZJ(=5gTi=h9%STVoHYEP=;San5Vux5=jkTkg&9;sDP{Aqi zl!m^me#1FFmvN9U=-P&>Yz#ZiJ*9>Mdak|aikL2AD}AfY6ENHs{yDMGBVMIn31_&1|wLKGpEyFLTiC=&IuH{f(7Yf@Qd?s8C{)L5O-`Ezs{x`t>j{>@i zWaN;e<^2BQ{PoeYEx?6GTYJ2}@fSWl{UJzdRFpO}wF+%ILbEoEAsDj%w}{bB`o$*& zc{p`cnuRcAoaz4SCH5oYSbKq5P1>%p9oTHzaIngD3P7Rq;!IV6Q9+h)=+_9eqefmR zt@t_oPin4Xp`qW2Rmmd(k0e$vn+daEimDRvTS1mt-G|uzEvJ?9m*WE2ak5$b87aMgs{(Yr}7&G z^Y`^rC}5v#vQbi~ME^%3D+Wp#oDu_lR{lx~wC2Rqy5CFg@dk8>-An9P@ar0G)r6cTMb07v@5bXBU@!XtRL8?*PCOA`u2Oj3{Ktpx zSb$GiJbskRAThhE?NpA8W2~N#haU(PyTJM~xb#R=t6+NXR5jnbM@ZlpjDjH{ciAcKln#GT6@HLZ>a#tBaz#&1 zu>BJoprKQMq4+ZOu{pxR-|X{kiI%ux6?hN&*a>oV_MQslewH37iixJJ|l zP1$B^W}zV?MzT#ayrdL49qX&oFBIvbo`@876Klcx0%`YKRqf z9#R^M(5bs3)P%$1sLAb|8Ue^S_r1J%wc3xI>bIY0ki`G&kohsb#o|HenM)xs#SON*tpPMKnLLFZClw799@|Y4d>J;+Z?E-q{|E*md%a3E zSDAKjlnS&IHP(_8*PH*PhUgMmT{v8<1`kGg3&siJ>v5dg|m)DJhX(BEjOtIT~WWf6-6j}v88{nMRpK@benZD^(QY7t&N zNamM41bh9ms?Lfq&Xm;gq!X=<98`H!MIQe8N>_=3dOK_xR=ly7sm9vJNfxbeG>9Sp zp^D99&`gwP3Ny!{XvhCSL6A`GK6jjPCd%5F)|SMW4|W(V3y3yspdTbLWPxYRIJTc5 zpjSpwDrjdNrAQ1vMskofNatf&l6!SaV%O6!mV}_GLsMO2GT4x-3H*X+#O~Y^HKf5y z%{~JyZ=HRA5A=N7UAUMopX}^h?*wNIJjtDhKRD+%S}f()P=*LW-V*ypm`DDV z+~Z#uYz(nrFO-W*lohGzj=w9S=}hIQaWmWLHAg zEwfuPN2m2zlB6e(d6vwaKS!u@75|YyOptWh=pj=%zN4c|t2PrZy9yD2|26hYVTHFm zb~hiBPxaRS&&Ea#Q`T-mZ{wPw@3BDr95Sfu z0K%oEKx}hF%@wRyxY?0 zkX9(*K5UP=eVgBxc8~s z)loQIY;UAq>|!<}3bDNurJ-|{?a!n4#eIEyeeIt964zFCx$@-d{e9H%GR2qYyHn#-Lb1LptYCl{rme1+<$vg;#_R3mYiQ|iLviH^#<8Y zoI>pw81Z~Xe!~${L{lj99Lg9HU<+l8 z-BvN0zw82E8jQggd>$a3rV|$`7vDRH2LoO!YR_JdIZ~XzEKz?((T;&Jq#Xz^WZSZB zk}_lFuFVk}8q{IV_(E)pj8>jLWyxgkOSc5QPmAY*O$Aq}H4kwPwI#70{A``| z^0Mf(=(#oV`1@Ol~Oji5l0PJ2naUcZz;W zFYOlvv+?WnZk5uqGU)8>FJv7XdqX9qR$X(yg?>2S`kY=y&D=luN^rXqes%M4^Ly9( zr@7}e9zZyG>;wd{%mX9FaVP>;vM}s-op{I2S$cSQ40;9lb#fIrv+7xAZRFa`sJ~Vzd_n&fsKC#dl|t|K zXPTAUSPJ-W#%p_yR#<}RDB*WN6tthC1qJz;)rVoNIyym&)myI3#*3^|Y-NVj?>Tryel19JWb_*P%n>2sY;QeG^ zzH4M`Ka*YBeugzW>bwg5;7#mU@#4{kn*9iTGWcfcz6c$WTV^r6%ms2sIHs3fbZh*; zA+v`tkU~1TxTC~28nDzIIXVSIzhQkX4EO%aP0z)ZG@y(6ADKlDgc{I;W2167e$U${ zOjsV7Jt!Qva7mLw3yCne0>SX>!R$5?CDpb{eU%HxO6%LtyVS>2OR{=k%Fod%m!JRZ zhG1)Su|8(12(V30*Qjian)OUmBu>(6NDHW<(Klknyo<3-N{hr} zB5BMl#o!0ZqRFzb(r0MkJ-u{OE?w7>#oLm7ASwD*(XT^l+`FvyslLrxHN6-q7*2?l zeL}g{U7g?z%1egYPoTgpC=e8QRYZNH*R99mdTXxWihqI<5@Tu4~dgY=u4gpyu>^mx(aW#*?i$5yo z;|+otg9XDBsc82^p-it<6_0i#TY!}wu_aSOQ1x@=$LDxU$3HXc9xe-oX3TXDEU2+K z**#tk-^;~dQx5+^wgd|~6`F#druufTz$22wBhwNFs|9Fyr5L*;srH}n*pLH(nTt=M z6uMG4y`@%jg5Se9CCe_!;3QbhciRa_ogc2h^Emkt`R69H3mH%qlXo?B+IMVCg4$Ez zz(?W z01Mgb2moB3fuYtDst`lt!ipdbbn^Y=&jw+t*JA)cjWC8SZ1ql6as*NHAWg9o!G!B7 z%6B#4G`+}NhmUOayjQ-!IT(1a?iqp#j)%F*NTLPDpF70L^=&1HLGzIV7Ue#dpZDONgA7`=ngMmmiOW55Z&*!(^Y1PpbI-t@>!a97 z6{uSjV6uy?RqnXh;|QMOOtX{1lye|s{YWZRtDnp~3G@#v*71iL31S>H$Hb|qR{KjN zs9>Rt-t#;hIVa4KpbWORk6JVMKh>n&H+q6Hn8$-pYJ{$kJv-FgMora?#UKK*Tft= zxkp8>2m+0S6B2LY-(%o({BMvC_lBmsgA#(xc;YP~Zu&P>hm$UFEZeb$n*hk6U;yES zku;_tmj9wJad5eqx>-r==t=h#CM8iJD&t|@AF9dCf@IMR zcD(jB&=-8iFwfcG;rIm9xKHdb696dXH!rj)R@$SuVTW^yNeNh{>TJ|BTUAmwlE~PG z`q@~Zz-+^Ix^m#UGX!EWi-9RdM|r~t=39zTA6BF{aPy^>kSOOnrUox*ocpgNVkGY3 zy`f)>XtA#F2&Icx9$W4*=yj7$AjFvxP$rk%s{8b^d^Hd6FsGJvZCzL zmZxUq6{`fnT!zHIsvvnxyUUPp;IA-+)e;t~i#YPA>A@2V!QHugQQllK@g>$aHAdH)H^QB@3cSOnm6-8j6M<8CGvJb8{r~Y{QMt8bJ^C|!ttY~t)H)u|?*z0+a!sC2@P=InBUA4Jyn!Qi54qQ49 zeO)0S#Viu%)c*1j1n_xzgpI3>(y*4gCe)2?mX2YRjy6}gC$pJqY9pp$c?yPlgyd6Pl49I%4bS*h-~e$t&|@S2gII1#$}tj)>=!Rt9SZM z#eKTrm}MG3IYPAvRI`6))c7)9g0LJ4Bd>hNw%b}SP^XH7e6^h+h-dodm>Z>te zt~jyW@?|-{1Jv9{ZNg&wq7u2t`ayn6ERJ6#LRvw6qJDD+FESPTs-+OR#g;Lf7rqpY zayLQY)`6GeO@m6XRl8ntA8W2CdPqAEsyhHA%sFmZDEb{;s#|StreQ_XgIkbPWzFzb zCz5E-_sT#br-ZIx3B*i78ZmX+WY<2n6xYDM$$;|H0V3+jB@b)tU==1++Sh~9Ho>qQ6%#G%jN?_?h|i;;E?X_0!jD?9+BKiZ z+2pEcxQo`XU!T!ysTey{VE5Ty>t^Yw)_2&)jG~ZCc-(Q%V7$40tE=aoBUy**6+rJF zr~;?P0(P*UpCoNY;_IuV=2g1xt@wh*MXdfNidugj;9H-B6_+&|v6Y5~>TE6Q`$080 z(sJVK4z8-fg9_HH;iA(yjM!ARA)boz-pJ>iS>?QD`(3fo3FhYH<@sg)`Saz>`F*!< zq{XJRotpgSfx(O8_u*>ioZQs(S(SB(yrLYiQc}>8 zgtOHs$@aTHn8NK?)EOYJ1PSNx6HEzQ4e(ScUJr962(hiv*8*kXfT37j%`6-ZOyho5 zJQJj3cEVSCdbgs}b~XJ~Kv*cAs}1?m5zD~P~abGu3n=!tu5oS z#f8%Qsc{xxSyE{nfv8mYa$=gTHRG9RTWvd|PLUEMDS4ER2oJn*|NU_-&PgRrkt3Nk zMWAXM;OWZwabG~~QIFjooX4n7&p7JPZOD-xccKE|(X55scV)|g4Bo)YWp${Rg~-e1 z9NHM}(1v6Dns@WxF^eF3K;#6t?p{6oO~};X)k7DyU}ncGStOY&D55bc=KS0J7u*9D z0{Myq-my*UD2{{?#C%#j5K_e=fwfeEX@nbdZ7Qmdfe-5tp_?DT#0&-LlB$xLgn0o$w@8uv5lL7Xc07}qlYj93NpACCj*ntg@ha_{MWOnR* z_FLX8y`d@Y`Q)=G;@>oRGqJ;2-Pj-*P!P$mxezF8p{S|9MQ2x+5PBz3d)u4!)LsnA z>%sf2ZCF{KsV=%A6UveuhuNhHWO$JMGHU@a^<%>`Quf}`c{-)2Q=Nl820mUCj^t~q zDZEJ*r#7^9mlnzsgyjM*!?ho>Sq6H9tROq7EA=X71W>zHhbO8uk0is)i7#YX+{Qp{ zs8PK2QbsQvomVJ7hp}yx5Q8(Cgkp;c9wqB9TTxmISFvHVB8A;ACg{{xn*SkzRiIeFg$S^*HPUa@ok`8=bkFa(rAM$ZbD8 z8%gz;DXr9ONFHUG)oR|4ixwN}|F*$n@@oFI%Skb;vVaz%;ZAurvwq11kHxr%EpMm! zmvU^~wZsoE3IGD|!@y0y+jyRH^A<}N8xxVe*)e7D{t$TQFI!6#5wf_L{wh&kcE8tt zc%Y?jn@r3ne80XP@M~uA5hH?%qaDseue0atsnn_#pRb%EFkvYl_n=u{d_y@GRjMPB zdEE&0m4J@+G2}p%c*shI4j0ye5&dTUCJgw&+`88`eZvJDqdRwoG~OD9x>SR7*ahyWhTdO4DYDcPS17wEtDF{MU6F9PP++|K z2mAj)E3D4Ci+dXz15Z7hXY|brI}b_U%8S*?VuWoD1wD!4=h-sgS{FMTqhum8wDeNI z!Q|Y+)KyznyX;7s`Lt*`EZ;|k3{Y@LMVNDuZm9tKD$DuZV8P&SD_xCb1^IQ*Q@?gC zj0s)FZ7CNDmIkSqtie*1a9IgDS|bX?gor^)kF++xnBn&()^+GIoWfKpM~ZhB5yskd zCX|OO)(1(d+1M_;hxQ&pHP4hZKbsBC9uueubJ_RE5{@sTmzR#-n}EtMR$Y+{%^_zQ zk)Z+MF@M8mo%l9=kUZ(b%5e|DP(n81jihHhT9=qh41FIAf#4~DutrWkMQ1n2;mQzKn%hDj=GZu;F9w_oQU22pEkf1Li{ z#T%7y-pWxX<1z5E17U+Ao=))-fz5&HRW*-IFx79630atf0_H|7ujdT690A*qu?xi+ zi)T*-@TaqP7%mM&pS&x2{!Jc<92#Uimjw;JRgqk^7sU~K3IWYI+g0`a!teewD<}Y? z&<4RM8Oz(7c$i!L?hb8VA>J!cSV|i$|CMKHDzC=aIwKNYJ^HgEiG&m_ApK_Qzley(sF=x$+Yoh$V6m|h_b8Y!KnzxRclbzxgo(_Rrm|PkiEMXWez*=A| zmt1B#(NM{v^4YLvJ9Bt0J?uH~gTBVJ2@U9^Lp;GLV}2Ca8&#%9S7;q$(;sZEDLTlz z_>YOErSXla?7wg>NS+6mdjd_QjA&&J)$m~o6!|CzqR-~{#uacf56sAe>+Jw6y`eo! zlUR^^8AkbB#MAV;l(9|&r0NBi6to@&*E%Ja(U&ZE@cFp1&CSWhJynf>IgAgRQXr*T zbexy{l3rl*^a~1!Qe0VzxlBs=H~*^P6{PQdI-#g4W!wFSnhMlg$aUH zDqr@gr`>w2BD!YV>Yt-u2sm+7&R?VjB}(ABubx(XlDF7QyOUW!l5qf635k^3;tLUY zb)ec?N%CU>Vo*BF@^4l&lbdp9orkx>m&iPwCcKH2TsRGM5@Wi?u5WVM77RUSTAw;6yUw7o@1bF7kvm;^ZSoM)N7=hHug$IHw0d>;3|#6=v(mRuja z*>QsrTiWZ+vCuQt&@Gr+SbQ3zdV(Mv&BE~=UH#L7?12R?z}0ZaF3 zApNhH7z%>V7x}P_Di=_i+MBdtm)9Cbb8dt7zoV`VqFBN%15JSO;rK!_v9fB**h(1l zxVpQXun-~AlQ~M@U#-QV9yX!WY4*Zzv#CV!6xadlQ}U#)HVxwFzi!bEqhmutKJ9Ng z(xluOZN6eco)#m=J|9_;8<~KBalu~VwVAU@hc}@no<(RSf9r3Wjj&d&Yu0mZpmfNW z=7Jfdu;(E=?ymyc^6KsK)=AWsdd3SEi^AviKAO|8B$En2&z`v3@PC;4{z#}MLC;Rd z7iYB3wtkRddr2dHBOs}6O?jDXsCT8ndv7F#Q0pK(d4}L>|8@>5Bnq&6?kk7H>)2RZV4-`&Q62INK z3p_w4$yD5pq~+h2mn`}_ht0FJX~mS&i#D*^W2vlA(+{f zRV4yP0$MOG*zTC_#X;9<9Xduk&X~5n8`d_u}Tn;%9zH`(@xK?e~*@dX_5;*NRj}9}MWbg|91CdxA>G$U4KsMa=UPtO8zdH!N?7EtH zNdRW1YHK_i=~=9M>s)E4PoiU_jF|XaB%@ zhd|GA`}FXA9?SM)?IH*JGBHQz*m}GiD)c4|bvfYgMq#*|u10TjH{A6Q$p$dwTsHOP zy?0yv7(ONl?))7@eH@oE*{3H#k($y%>H-*840@<(IYj?T9cs7<>W>mV$c9ZP7-Rdv zIr-!gbWfoeA;MkFBTQ~>tGV8iO%*)}?Io60f8Q^6pRyoos=ldAO~IX!IQVM`@%MRX ztj(a-0ML4&a2r!z_1j|T2*AfiI76giqndCvsh$_#OyrXvrVf8zEVOhNyW;Iga|-Cu zFJLt6sWmJ3MI9#)8&dk^!U0Jgg;A_YcGGDeAO0t0+MWZRilq$mr$Qr>stMlnKuaxj zXH)%(*5Pnwwus7YMc$l`ugc@IkggK`o*uS`@MK6UE6R|kSWjlthV-0bpjo`;qO%1B z3mk-*>R%g@(GMG$yA^JPkIig;fIVOy_Ux!1#i}X)GpCxz##pT7R+~fvM*L1I0q8ZB z91gEt)v9~XC89etkLT3rY$ho{UCVP|fUX{S|8oz|yx?|GUQK?jOD&U(Uw~`39syOL zY09li@rle#kF5Sn9<=U&^HA?BXExK=feqxgWCQw%rn%7|ros%L?h9lMgA|Yk5$ph4 zwDMVW-csu^9Zkkz+Hewj<{catFGj6V0+I!Vy8Bf)0p++V+pbe0!KWGC)p__waz~_9 zZ38~RRrgMrUG9%;t|dH6h>)nZP$5=_ZagW1hzGaKfXjI*#1qe8*a9+&rI#lav3IAi zybmZIRN4(+-CPE&J_z&6)jx9q^yv7^;8rJXM(SrzrDw+=Op}WCRLlX!HqQa}?r8+W z`O4=UX1Qct^}-Qn5=#3{@*;x~c>S0{C3VE+ikAjWVH6E**LJq<8LY<8M8?pVc-czl zA$O-vV4G#sBorL}30Q(Aa~V4~s|v!UjgXal9-idG3a~`G>GlKWcvuY+K%uir1 zQVA7V!^CIu zBx%Sf&9RZ1=^7aZ|5#+G3#XLY8C6NB!KTj9qoJk4G#S{ijEJFMu?m*l*#Z11bFi*w z51U#{x7wqq!)`{GGPx&>Ngpior1rL*ICOPAG8j?~L73doP!15v3_DFC=*x*{hR&+_ z2cBc6$$;}YHq5_R4I6AebA;P~3v@d5e%APa-Dy>dm@o?%HU8Qn{&$V~E`wxaC zg83Rn=I~LJtOTHl>q1^%w4V+L`k`-OBmi}|D=@B2VxIR&S8r z*vu&LflFTcG_^vcxRw@}mev_1Kgj5(oWJ$a{C1z?7&E}&&JFs*7m8DYbyi{4vFY!+ z0ZAMrg)Tv~Ahnpo4=V1RybGhN-}n#W47>JQE+XVJoJ)=@URmP_RUp`6p3bfjlEEGZ zFA#?$%mc|h_?}S{yCoq{@LLxxf!2ZwX5T%Sv)MX$TP7td6vkCiMbds@#M?Rn@U~&H zUBQoN2o7N62Axq*`j2L0>W0IoWXPXs&$7zcon4IUR0Cvxgl#_+M5!9&6DWKIF_@-H z;)Mta`>jDA&#G6J!`D{|%Z@`lXgsYFF5JXye5Zg;#Qtfp?O9iASQVjYMf-3)ecBo5 zUEGI8x5Ftbdk>R!bX>k+Of2#?t27 zk+Kpd%v72p&O(Ic3zCAX_|Y=HOv>~pe9JQrGN&CeIidK=~3844X3c)c`-wDmu~Ge zim6?6s9PxW%LY`xyjTL4z%4DWI5i)cq&+;gCHHD9hAT)K+qOu8k};aM~m9W5gg=4upp&;^`KUt3sx!bRc!gLHDs zRyMjcL9;5+NY4;dFdK5dtI&!` zV2zShFF+c@j^SGFcC&D}`bIPXY8|k1WF6XlSvux4c)%6N6`LyE!vsIA0YpsVK)_v) z7M`q*`Upwe<)~ZU@VEfiD`*7(=e5g$FB$WEM64ay^M*Q6mEh#KP6=gm2;Wn|1LwdL zhcuits>ZK*qFyQX^qLEun)GV-HBV!9#DQZACq9Qkpm$@;YGoSy7$BmXrvp?MbPS_* zI;T-0KO3FrTLLF20vltwjf+F&N~O@9L7hbuPT@+$pl>Q_q;7(3@S3mB1#USGA$Urx zIG9GPH{59B2=~H5!Am4E!#m!NqJdG`z|yRRv>Zil6dSUAZ_$#(XoOJu2?zVC@+){dKp?m zhO)N9MpC1*doHbe&^%?UT_lpWJm$|{?xMkC>GV@E!%;Uvg75^5$Oi<&3I`S{+ff~z zA#F0DAP@tOKGTMMp&R$(f@tSKxBUR2D)WHF>9mj>00I5>1&+7rJ2gt|-AWO2V@;Km zl?)N84AjxaWj`?1G3&Jn3F=vsT&x(DM$ALgc|HS)lLWRLTgcPcL!Q`W>w&Zv}G@^YZpW-?|ySc$2hwe{5 zNh9IWx4nI>f>~#s!;C?{weFW441`1Uu}a7K{6dR%dqD&r{)V0bJ}+YMP|KHXK}b5o z=dUR#8sk{xvoaWz4bl_zlSkvBd>+9ej{!4aCoF#!%2Zn?KF+aX;?M=}C`SxjJ3Hoe z9F>eNDx5P5ApeWNJd#AvP}|LZ z&F}iN{$qmUPo>$$`!|#?{4Zc4>m?`Vkk^6n+t-EJ2UXOC^0ARkHYckksaQW#Y?d$h zl+V##eHQX{#+0BdO(V%F{q1Hewhjwk@FU`O`Q)uu#la{86pq6b zJW-Z)o1lF}7od$p+~SGs9c2hSZ7Hk-rg94FAs$EdPwL*?(f#X;3>13{=JRc6oXjQW zcE6u=TfMjS8hbmkG1#$|o{|LCiz!YWEpz&D;DFh?(F|yRp9k*tO2oesfbOQF$YqIZ zuLmq;BQEv7`n`4r%^>IL=(k+}ooiP1vcj7%N~3B&nqX0kMN!nB2)0${$`*OvxJN30 zwC&7qd2n(H9#XkI78*(;H={#{*8z-Va@W8r+mnUmjd%UP1HATHb;LDGs2&#a#8^!4 zgLAn)vt@h~B@9k`w~iW*J#$6Hu*_SCkO2MXlOo)7eJHzLL84!+K5eY}qvV+4tbutNc>o5yVfkYVnPEKhK=?@f3 z%aGX6AZvx>+v+!#j&ob|ezY+G`-iEi6T0&jIDgx>TV#=qHExwW3X2BxWbr9pRPZzP zL;u8GAcCQSi8C?9SED2m0VC`~f&)-P#DzZ&BOyxGp>UvC=k`KCQ-;l2q!&Fqipmbu zRBq@t8jlQJDa8V+q)Ih;jR`Zo2lnz0>746UMSpU24!kPhl8XJHtZ`Cha9mi8)~0?n zcC+)&oZm0J4mmGl^jqW)>VXsV0#E1mHa_|JgTo_^_2C3kT>DQ+(WwaI2wvN3d2l3Cq-FfPz z7wx4ZT4WFDpZ`fk!Ok7yc^jNCO{mS#~($&czBuef{g` zzmuVtD3qd$O$qn?8Cb*)u}OW|kVX;5BiYtWxoi+KQ7fi#tH*~-*|E*-{&X|ger31C zagnugmAmWY5F^BXx+EU?Q(yQ@Bm{+VV?JsldDegPbIHDC{(|T@JOIcYD+=a&xcgSg z`5Z`HRv%B@z%&9?1?~tcf2-p*!}%~F_FAeG;fDX4Q$C{$mZGj4YUw!DC8FTT^4jnQ z;X!lG?W3CAq%1in11uuk9zH&F_^a`lEX425Sq$i5Dr!CxnasfmnGR52ypLF4d>PV@e;aupB5mVCg0zdsWEx~U;?mYLy_{F6|Clkhc4ak zkrK4sxzTzp_(RgX#a`<>XgOId4i`B5J?y}G<>ImQ2C%4`Ca#o)4wJ$0Q4#pB#ba40 zdY0W|h5|`PIyD=U+l<8!h!T7J)}m_{^CF39krMF3%8%vw-Zdw%oQ0Ea`~1L=s$8NL zc;<735x@wStpIpuA|PepoT39O;PSKK$?wK3u_ati8Q-F-i~3vBkl-C%$S>5dGlbTP z8CFMu;g#bBqo{%GJvRg*DT4>Git35n{Gtc)z)uUm<;*tlWVej+Sw1TAD%LjFKv+@jwMvMxnr{L40mGNcQO1igu0R z&-Q!nF@POOo_G)qNcxCg!XnlNDCZyqN@Woy#@EGg<+R4!)Vp^7FbctNCfbjZ!$d91 zKgZ;LhO|2<042#(_i0va6uWymbrrbwoLZ8G!| zkv7LGXral5ASHH}qW-cKdZHtr&=uvaRjHdc(*RPB`MG$o0#iEz_-YyCU$n&p*Cj!F zdLlsqGrlb*7qp-lPs0>OOPlD^c!$zPuIYlnhAUD{x_N`=+qiKyxgBy7lH=pVqrF8b zftRT~e%?NpDkxmH0fco&B80xR`ya`xOO`FGztOBSl|?5@Dtgs*Kb7#!r%^93tg1S8 z$^i;)i;lIWoXYxVqA!(SLu69AW{0HqT{l}kHuIBCFovydl1Hg)Hp~QC9}Efhc>Y>i zpzJ|xz|3vIm9#oLPobI`uhKQNny9UuNXVu;F9WQC)j#XM=08bU20P3xcv5T}b-8T3 z{a^V>IdBVDxatC2ZZ&(10ZhA=m}ELy^?+OOVhgpz;!wz7A&o$t?xAt>I&pEUeP%L! z3`m8-riAMEYPDbd5tB&~-E8o8Lr5Z#*RVVX5_1jR%Oen#5sBYo&@9X>*G^G;7@3T1-Wy*yIIaS5AI^s~J0eO1UFxB#IL z5|7V}33uUVcL8Uy#9`N>KTY1KjY7bZ4aaP2VSQkwl(;`a6ORM9v(x9HGAu)X(B4 z=<3w*ORNsTn07|C(y*dfis6uGD9%5b(47*j!+S9&+63a8sv(vc-ewGIt=&v*HtZ&} zsP`Xq>ZjmxYq<_;N;h_k%|k(NfdDupOH;$o^0He`h&M!^$xoTT+xiEBhYYvcs&Kcs z&o``7Qts1Ikqhx^7&7yy#(fMNi;jwvWS-#G+9TdV6Cc}DVo~HTtkT4d-}7=1Y0sy% z4Qr6?FzTh#1~>vfe!py!fK zoqiDpRG|{lc!N9YnEiJT8B^+)ar&Z|q%Sd*?pVpf+Y966L7leM)K zmJ+6&FRRI7R!q|NuD8u2q^N~Lc_?r{Ys`RvmfKcBIww^ew#t;~90U2XVJ9ZG^yLd? zxQ7)@9YJ^^Ckp<}XtE&BQGl^6&(0`VJet1#pWgRQx*NSZ z?DATy_nKpQ-NTYdUqvJNpJ2+q`%r)DpNttiyypA>yQETr|7SNva&d~y##DyPEMlzyOCbA|2n%oj75Oj*bZ?| zLgM!HYnoEF?b@0^yYykV9*?=0Flv~K@2#g^hTdi4tWo}OHKZ)QEKNejqJNStYOKK* zqj_gJ@xt3~{ROn7w+D7ms$ojix|ZgVe_C(Z*G@M}q7tX)rwP|ob6C6cI@u24`J zE&nv0ySM2HA_yA))A6w4Gmz|YKt~Xi*hfd%%T#h7D|H1TuOE$nXX3HhF@!O>4%~FO zHgH*5!7x4`9V%*r>n|A-DNeRxTt+KLY(p2xd@1(I zF=REVG10>>J`21`ITOM6h!t3#Rjb3>dG?K%edzrAy1!X~cRM-kx&Ylx2>IOx{) z8RVeXn4;!K^Wy$+;diE@c8FuWrCN+(l{xX%lhQtj47D71*(OhGwt%|)-n=^#f#|hR zA^`Lo6<+Qgv?U_aQM!5`fo?UB+*O@2S(a5J84Le4SE4oo9yI%YLhg%6j&JYg&RH^0 z9Utg(wwoWq#P$`|f%wvwWhpD-EspCo?1&Wl%Kz<4xY2T54S*>3-Fo4OH45RKZL7be>$W!yifX}j#m`3EM^x&_gc80cFp@}4BF~ua8p%D|iS`RY$YF2d7h(F9X9)=^qdWr%lUE7v+J^jA`(>13emllVYYV(#;Y(9*kw^^3=*#OhJeHdu7 zo8A$8g1KjgL28%-_r@`s2+dvpVfE#Q+b6MYHmeg|JuCn&~%*#h#96pFMO*A;o;QGIetpO#ZOwf2>!j4FK;b46{fB+*G^ z!z9u-$O;#>XFAsFOKhig!(WDKu+|pZtF`JZC$-2QJ(TRb$X9bqtUSPuXVw$fw3akE zJ=6!i=kGk~K|qAcbAQ){P52^Fc;P_EJs*I(-o4RQfdRbc-yqn@j|kLO z4eKI;tqRQ1X_<_mesz>jnH%T`;S4MR(?EL5NS9*$!Wk;Q06$cNsLfK_urD3#A3}?y z-HhI3p=v>^J`yF@>{M3HQ|qxqp-bGm;9?Dlu8s7U5HmPLAG^hlp^L;%>-<=>IKpap z-dg-ns!A?aJG%;Mpa2|k^Bi$k9uCU2>5^&EF358gJA9=_>;tbrv}Y&mMn^b4iDVP~ zCS4HG6dw%cm74DtVK8b`K=ckJ8-`#UF9+tnPEns(DSetYt4lgx-pJ3Gw||msc;%%1k4LMS&7X;Xi3|Iv_|uMt5^ zVq$`1Z3yL8BPfXTz{oK z3Q)&HX9uk&|2=T2tuTaJd*@UZ*kqc%IV+SCW7Fz=r&2Owu1XCB2odBfh;e$v5dM`ew~d z%m!FzhtGiJU}vYaWT{c6^a`k4^uk3#Zrs=NupkII%)ZhFUDDlIiSSS8`zkd)%Fh=N;RsXu zOZj~vL5ABasxl* z>GSOD@XZZjEKveksJ{(ID04 zk1e3-inq6SU44Y7auLhG;juBY5soJkkLvuYZG_R8!yJq$YwXBY-Y_Wuf+#vOyn|^O zaoWb0Ng=kwyQ%%-6&)OBDqrH=kjN#*)9?A2b4qe=i!n?rn~CWq@?SsCG6~0HehzkC z-M72hxtLDP2(P-!J#j&x$r}TCK`@CEu{nT^3HHrKi((?uhg@Z*xJqD)0^vED8yulF zicUXYVDj1IATstDfL{h6dfiBy>Qq)^AJ@v9G<&Hz01s^n@mqgTPA~$3_1cm zpGZnuz;|mvcv_ONOc&lD#zQyeHbYBWeO+1R-p_@zNzX7_ygnO6P_0T5bwo^G%o-qd zmv}NIT%BTKDB-GMOM3*;3vTOfrTZBE0EU|-sak=j!pi74tfzD)m0GAN7;N5eXddf# zaQDpAJH#o>@dwv`)Dbn8tsVe*JJ zVq_b6h{8wSXgv$Yc_~fYz~}`3f)U_|h5J}x?!4;vCq%fO|HgkqUyR7p%bI! zNDQ6S5%qUSDx!jTdfC^JI!(VzGYUT@hAW)e-)3ZRx}IUo^LQ`qAdupho;@x{H8jL8 zkSQm#=0h#w6koxjS}A|OdoN;@822gE4)m!+2@-uLes*z4HYT3Eu2_UCa9)6+gKo9O zvTo7a4f8x1>@n1Q2d0%8VhDP*TUCFZw_I#)zJnS*VM4`_liEeTYAJ%QRh?LW1l}Bn zAm&^#C-=##F)TdPg0q@!lW1#2rj{gQ3S)+94T+QsbroyEE;NR>bhV7g!VxG~fp zJjRXqX)i=1Xv&|wO=H ztu#nVbefe`0tEAOI_Q3T#41Q(Bx}nVRB8~K74a%STyb&Vk%9JIj#*(`nKtw7~ zqB$1h7oxv<{G#jSYeVV0z{ve+-IUFs)K{1rmYw2$g{evTVNy>r9Fa!w%O}AW$YDYb z39$p;O&IEqGr~$}HvT+MANks~a_s6Ni!B;dK51LM?S4L1>*w|YEWrOmm%fTxXhc<6 z;VAZ{X0Ug}S=8L}?oP@wR8UxRSaB17^~Dt=7Svd))IUpahSc}8aAQcC%lP+eMmGh}^c@1CJyZR^E9$a||*PE7?`zqd zlBQ@v&KQj;O&17%=@779D_yDp??v~ewrl#1W&f?i0SI^vat(OZRrDC<&uVY0Yqu(* zschJ5KZ%x6m><-##w@&!G)k9Dw?{D}4VmkHzcFG-IzqGVa>ij$731H!J)}L0LGM0U z>OnysJm!|Zv7jyFqfu7~vJ&jn|HPmD*C4lPuI?3X%xVK|-; z4BypHg1tS6u3gZ!XbZOAx}|32_ZQ^KUOcj9p#nz!9xSp;dxD56 za@g(=CB`Y@{02L@-YL?Zoq;)sjMz zyw5#_O$;X7gLOwi%UyQbY`$E`Tpm?$u;1BX^j&m5p=r&m$9e+&?wQJWd3KX)xi>x# zQ(s36g7D02@1$_T)Nm(0mf_f7?N7WLJ{;q(;Vc1LFQuyo@9h`o&s6lk$XwATP z1jq$kED#gkJH9g-P)uAx4wyr2SkWciKLef>W;Rz(N*xrI*F92!9_+HOBu{adjJokuD)(tpdbpf_e-rP2INfG@qlrKLrw@!}XXjFSCppjm z93;w9<+48ap)mi=^{Tt2{QI8Fz!+Lk1>o-+V;5BM>ua^qA6`+^GwAJoeTSXB=3&h5 zDf1&0!N#{*))#f`8US&2vyr{MkRBE3g^=m0v(jBIoA}(@JTmz=a;rgbe(L2@sCK5p zuKIlIS$$6XCVya??yeV+J)e-GWW|80)Kx8oK*ep)w$y49s*IR)EA<^Fz!!Ya9q4G{ z*84Je6Fsd}u$mMcc!J#SV%@09#Zj7_edIB@(9E6meXz5k`hw)|GPr#g zqN-a$Vm+M|UQTQJM4HaW&DT*QOhNR#q}gZj^~%W zGH&uuG}()S-ae1$5b!_{^7@ArCI5l#7g_XHQOg3MqS{iP0Tm-fCW;m>p7*sq!8vp) zc)k&Ike2qCuh3fNGW@v7t(m4ag{CVp;n7uf{f!m;3*z>cycmTvQ6`IRfb%OH>faNE zgWidCYwN?%$k_7hSzwCd1i2s7E9wE}!zI%QA97})R3Y_|=k__@*WFp%BgMV;JhAbi^dRI{5aiR*e#sPIyeW(M6i;JB zdiy}cg_FI`=yU;ZPiyxHpu2IYtxCFDKo6C=7TuMJ5?nj?di{&&vaWv-ExoGv@b*~E zj&=U8UAIFXpIcH^iuOeBM#*6r;C-sLwS`PU27ewM`6`M{q1 z%`z2ta{jfd$ozH|CIzR5#_S{gq>Yg|WeB2;DT?}g%bjG>dAL!oz84V@CEH-4#_nn1 zf>&!1)g6%l?PYrnqTF}vvD82R0D1^S;f|9M`b z5Q5Smb8-GZgeMovf9uAoHFp#UxKMn1dk132MY~!oMxIn@(4>>7l^9*ad&3O z-~Y_eg%N1wS#gDLCT=h=Z|G22E$V0-^@5*@q5P&|=}p5O9a(DCxc$?pFn9y(E~(vl z`j9dpBN2eY!wYA2g+7^>fyC@=>F0?{4FaUA>~r70AILXPxFupZzY?8&o!s4-e|^5| zSBd2|A!a7=>vkbd=8?cH2oi(3tEA-ZEavVH=WhvYa&XxWt@`5ETxnDv%#*0zt@K`Vd>bY~) z)q6JIetEL;dCmcDe?jpJ_7jugLb@M7He;|z{B;Gwd{oe-ey?Qwgu2(xE692gB4>0$ z_bvun(8g4(hZ~rh5i?!xetl#9gvM7y(5?e3#XgLt`ZrIijNep-+>V-A8SB4Zr_A4A zg^yKISK-UlVwwgr-b;3Bl8MJH3T65sIf&<=`Yp*L7ArrR5t^dB!S1Ji=x(;6_$&H0 z6)(r()M-=CAzwk`M)r)C;wG^t5&F0`k(WIn#k@jdJQTvNKR)t*7+HXWv|J2IAj_QE$~s@JuXj}JW5{`n`z`N@|4^WK)u zU$47g&AbMmvu>r5jTR@7p9+f4ANwjE%Ye4K0_kR&w?@;Jkhkt8cURSLHE6y=k3%p3 zt4B;4S(sEvDAYaScZsCF>;_s{SmZRN58n7X7mf>>{o-Igtv{W$} zf2OQB)>eg)?8zH>%ERYUm^kQ0Wne$- zT$LbaZ(EE4U+{`hb-X9+G+VZ7mrFX0mWS9l<|wmho8_Po)C!jzWuXwPa`4_boo(YZvNIP6ux??x5Vu7|On*38$!(n(Vp7Bp1M-nS3MZ{_cPyu}?Bt8yg*8XdOq zwm91rIAl8F2+1@oIOaIj!I+|%An~m~e15XLdp(&QbJ6eH`m%nU%?Rdt^b#?cOA^nN zOiEV9rY&?ERkDHlF6^^s_wum!#Cfz_@(ukZx}a_o$G zNrNQ3NE7m@{F;*R_pq{G<(`B+6ZHzT9MF5<&C)nQ)|~EOPZ1Z%-OX-d0Iu1;iKW-l zRu_l`a9*~O_?ISi$*WQGA?D*d+v=DUstyq_Tl*m_;vz)&ZcjuzR!3<^8~Z`!J04$A zVqqis zKmSVAYLm{H%otnunA)zS=GNk16nUMlCDRm<(@k#J+3fJRroS;1>GEp6dNicCTNY&J zMD%~1IOTSwf6xVB+ zu^>HVG#ub_gPNc*?$Zn#h(KBCI?OtL*U&2Ox07xau-@H1ee%6&8k@#e8=K}~*9IDC z{VyTGC3rlNCi-EAp5;I_rveI;3OxZG)WwD-M9YI1Z9D#sE6(+%#H!5@-SfH7Z%e#U zG(?pZR~3!leq?Bs+f;XhHz}6&ctq9<{!AWWJ-N`QozYFmp5q6Xo=cJ2qLp!b!&piQ zNjhW(K}XE>a#P=v;EGP%$d3_et+v2oEah`4+X|a9%OFl+Il{$%5PeN_io*a@_3+gY z))yyQ87S!$okP1I^v!j2>Dre*+ zi3c6KPh4_Z1c-eTMjdY?zzyacHSs~acX%?DB3uqr6~9MznUGc&^n1faEeuKc4l$?twT z?r{66Z$M%EQu^jw7`_+hVup|iqEsgZuPh*%_b9D&hH}mE%TB;ZS@<{_$R_CR+8wF zKis4be0^pHuxQfqq`2fapabcR+r8YM4MDjzXSm@xnHjVkvwlT~8j5)GQ=-S{(^CZx ztFT$+Um~bvJ$zHicpy*_zJfeSS1*FLA@Y1-L-W*UHX+PO&;m$rRDa_ImYQ=yU_}|n zYo)ldyNIHF zv#Nb2p{0s~c|f9yiuGi65MK;L9l-d24~2omR=iEZXJkf|N{25BIe(cJ>PT;v1q1Ph znJH4v*oLHPCI_V9s1R|Fgc!D__$Zd|Y5IRKD>=t`FWyUWol&&y%ff<9Cma571}FX@ ztQ>?Jlf)W?E3PE;ft-GX#jfx>IK4W$avUJFk>&(XzpX@|&O#{W4NcD# zuQQ1dyAvQFVL8F=hrdTVLsLB$f#O#rfv&?-W*tTOJ#JBx=+SU^Sl2&q#Oe;za%7Y# zEQ?e^>>=vtSWLEtR^LHr4F`4JD!6phYo;nfKuEE&5Se)q?|hHkZbcFnBzCw|+A5^F#W zNyayhu{9Zf@DxS%Xo--MVA_JdrFTXm)bbDkU+5i1Fs~<`!_9vRnH@h|ty?MaH#J9- zu@f8kL1E#rx3g~TDn2K#r|*~q_2UVqjITnC;Bp#{!LnB&xM7(^B_(IBrLDt5h5qzP zBp}@#^;gOJu|Xg=rZ*cfci`5?86ul=>%vM#cG$D)@`J@%j1I0A%d0FB(4_bST zSa+kh*_de6auHDze(~=pQJ&rs9R8(#9WTwvYhHMLLhS-28=LZI%8@-ocbg{Q?OKsF zoXa=-^d1qSVg~U&mA%U9rS8{9+d`TxKHw!h7!`tv2#biA4)qQe)v8whJ+@0{Ce8-btqU6!x896{&&-e;A@pAsj;(fC6&n_n%Lflj zuShYqI#{XFUh$sGSi~LUdX}KQz_Cr+WzV$AY|+&>$V4BlR`q`2{Pv}ClFHBJd>PkG zO~LWRTT-SCe*dU>vqlV0ek>f!@7*?#{Nv?yvZ5ukgn&mo9O6BnUy15Opm+O@Rpoanz=Ae)@?Dnw z`nsy*K2K3(;pW8|q=t{bQwodGh4;a|%8c~ZO+nLh<<){Kr=Q2+=a&U*w^Y@b_6qm4 z8e#-egK2&ejPH%&cy{TGmq-lsK5@czp%DubY;7G$4rS#DUs$SL>2<<_S>@46u+5+w z{qbv!V<dfXQJa$H$`qItW*?wvY4!GzXkFnA$U3U**}J4* zIw$Lu_~xZd!B_L*mJ_lT<2LuJ0S`jRhsRIhb;~}(cbn($lQ1nikVfpha8iA>O)$6p z#TU7mqOEnopL;Li`@93uIyQYLvQ(XD;gVnN<+rL=%y<4nbo6_zuuAGvD-lhNNp03) zWS!5M!?h!!oo^qkM`6cUEz;C6AH%n$^PDm7(aQp!Ja)-yr`I}ny}S|zbHfK? z=lRbHv(-}%Y>7BE7#9o^m6L__|0Y3J5*8j7_Ee=QFic1m9v*I%#Cj}hpsK^fwODU~ z5l@G(v=B3saHAy~N!@m%#co4>w8gH|#NF}j*G~6y>!{b$YvauG0ntH@8b@tMMNNiF z70a@mL{XkBwWX~M3`S$KQ-Mi=#Ua>Ox(+@s-^BX**eormTs9~WUFB$MI)EeuPVJ(D zj|xsrf-OX7iGTu%2bz`+fXZfNWjUIH80qkNK)a~0QG*m$B=BM)B3=SopRk}f9bXDF zJJ~VEC7d94y-bWk^g4VtdC?07VPEIb6G9|?;|MU!EUjQ*K}VSElt)9LN&C(fAWnIR zv;BQ=dAqj%OwAzTSh&E}xxvaos9KOfDgh=Ci5AY0|%#M`!_-tQu^@06+y8qpPJ&SP4PWCGjl%WsQ(t6j>7Sh%A z9sVBsZ|>E*Mz-HqwI?_qAN@0M+47;W__c3%bqLeMnjdOn{F%8h_Q%0q#RZ=`1b`Bs z9~r{x8+vi*tZ&@a2pr;=dZz#F9cQS&&=2;iA&+42*sl}WAdZqXMo4fge zuNDFKZf)!3y)fX;Ll5+zS&m^Yp($2mamo9*E0_?2+WY@@}a7zrOLI zNzyt>enoq@$rw+LD9lF z>cdR<&U2zxW0D`3+#lk~I!VuE=zGn_ae!eXbAPGb7c# zrc)2`UV|pvk}H6IaET%G^@iF4n-Z05-P$|{s^>9^lE4XHvXqo+cTW>CQ++YZkZ{yj zqSfZX6JRG8=Vz*DxO>_Xs5uaJKHpBhPB+@>LD+;fvZVNJ5V_^FCrj(*N`J)Y00`}e zwPcDb4Ej@UtK8M|YqXM@I>tIaUz_&|(jigeI39~rjOg@e*!p_32HXJw#F&5=q1L-} z36faE0z7>SOT@m`%Ymr?8g0e>CBHD1%rdk<~vx ztYk^BQ+KHY17GrdIT*nLgFRkm%Yj`17Ys3ex%{=#3FHXS4siQ z-%iamtM`0PDmSGl+v|_F5cg-#IPcxU_3+)F2}(<%@v0^C+wcC72K<2EME6X6Y5WN% z{;7EK6w=Abt$CY3JJupINyNyvFdwV;X}e_Vw{DF6YXq2e+0I%sS`-?YM4&{Vc>AU; z$$Td>7QeEmUK~y8&St_a@b3gR;@brtt$Y{&oXXUf9jjn0HuK$;>m=jTC}r33(F|U- z{Umm^gyU2dCf<}}x8^zu34GE)j0(c`TXixBMM0glqcx{h8?CH;xl3^sh*gZmsY6c} zl9^V)*V@R`9oc`ECzfTf0b&DM#}msO4-2+WS=m?*2KRz|(?TCJhV%p!Nj*!>6de9s zYc7?S3VMMjF>mz1ruu0xr`0g96SwP#-BJ97{E1A18KbY&Z*1qc?rIJu}vxO|}mn%)zh{8_vnV zCHHd{itbtD2VqfF4$wFgi}@a%WA)SG@uFc0A(b6#&v5wQP0~K`th;xGjg!!53&p05 z?Oh35v8~fbNO25b9>r5;|{g7QnGRdQBxTA55nsSdmj{ z=U-(T+;QPEiAl>Ugw_0(C-+aV1Hq7YKF zJ%f_uGoy87j^^~+Ipv88@%T~xlBJOCc@s|y9R9pDnbKc-2ooWL37!<{CN~@_?n*?& zLQCglZdguI62QvmO*j;AMN8y>5=@qEDvq{EiX=n_sVn`(JKRz#5{Cv#qGry35Xv=; zl%)zL;h$&AA0V4(Hxlw8(kw0kJ;PK$(5bf~eR6p(4xcP! z*9}s6QFoT{t7E#YIPIKgN8-rImC?zKlpQUBhT~`;M|a}3#%g1QqaG!e__{sU@m$aL zYO3N$gManKo2I^o(=t2jiuDp%gPusxN65!R?cM1Wj`-X%QLF7CgM#pNJ=rd3PtC^o?V6Vixemt5#=c}f=~CxU4T*OnbbRFv(4%Yu?xny>DYP_54_@J zEJR=+gZ_pm_0eA1>SR)@L)%4CH87|0_o%Z{c9oIh=}EmY{U)2G6oq*d%sU*6XKT#6 z41rn4NeitwRfNNpSqVG19`V^3*BTy)Q1Dr$({H7xoS?fi5Hw9h-KkpUAOo}#_E0U< zT;QO+$h;5ti_L%m6zXw)HceLhrk$8o4@6;ezk5oyZ?yG{@H|_3B$(%0eRL{jGab1C zSbkWO1H>RlRPwjWWRst{9iKYv$0sbNL+X%k?YxpWRMF+A@?T16DR_A+P9R}Vx1r-*b1B|wm9m57;L@O-g=nWvt+PG#3>^4X~ycJG9W zUH0pDFz_OZ}sa=`P^veiLGb9;>D(<;{k^aNyge{9m*Q%pG zkFo5zGBOk=`)UKcv|jd2kYW%6Fb140t_YT<&6sBn-5BS@5vPPO$Fio+x2DVy0zI_2 zp?w?7{bj#(t$V@pZoUl#F86$B6$8zx>h5WHultuIIcb!j&=cePgveVrm>U+HGBKhQe=CM1PI0S>^Kn_$IJ>YXj4a{bgVEq^D|(;>Tzzd2&otvdGA=-kMR z1lEL~Mq8SqKM@94TO260@HN%%Gosf^00z_Z-5&{P=@mCZ5J<$a3t2tiJvA2zu~Lb2FR@ z$rAgI>EZl&uEJ{=vg{5dql zAKIKi^a3^Jw`@N^b&N;!m@YcohkVCW9EOf=BKz`RIB1err;U~@|9+c>0G*nCIZ9u# zvnzw4FuR8@){UY53m;#CC`=QIB}d+#?^L!CWCQ*z5E_1gvUpHBFuU*Bo78IxTe1|X zvfntKk&UQ5CzMzRo(()d#Z;y;zNg?T8&ds%{S?!wRb!}MJvppPwv!x&heT6VGBkYu z0j;|iz$p%LzG6fB@W(Sxs&>O#R#x=>b5ivi>SO^F3l;1qUR)DrbM|IjL_d^_3$}5t zY^#l9>pS|8B&KRn%2MF3h*zQgz|Rw7;(=JLV~@JpFh?dUD?(t|)w42Ute*uPo|58? z-M0Ptn1I*pRRlMG%si{hwALYU;m3`hU4sm4~UHw1DmtN7_P~f9}pUT`5aO$Npa-VIR%~atj9^!(k!U*-0+T=)I0xgCd;y%cDE9goZ}M>#v23LJ6LXERXK8A(^7K z)s81Yv(C#Bz9(;Diy~Zeq(D?hoGs4?N+a}V#-z5N;ma=gQ$wFQYmzu`wb<+;_e-7_ z6{;!+vNYm41i<^AX#Q0ZbR^Nerzpqd1KE-dE&)al!@>yN;1ICKt|>6Z_>8N< zy2V*ONyx>9wE-zwnOt1eie@BkmC?Dti0ifSfR?Qj9-F+@^GB*UU*AXsr-bwX?Mh7I zKWaBfAfN$=$j2c~HNUwr77zx+?)Rq?!}YARTlZGs@o*i z4%-Zr29-Kq*jf0}kYP~ac{YAbaFxPzsna|K%|EldPyye_@mplQokSO8e~VH0s(b-h z$^dxU*EFe|%cap`qR4W}@iufB*^jWFGQgzOxlkWU(RlQ^%F-WS1d4OHnIZ9XEUfPW ziMFnc)Hrc%6O}qcHB^=HdC-|C2AxAzXsC7We&}+Io3Qo+BaduIW*|99E)FK%uX+UK z_Tm>0lG^OhiOEUxuJp2mk*Kzi>Xg<`B8q)P_W*_rEkzp2FsK=vNO`2V3dqWI0vH4chTQ0;eKK787RboAfAHhfNoMuW|E^O%=v_Pzfl?3#dY(Lt= zSWx2zt2c$*xjQ0u-AEZL&Q#+h{8DbDm7KBZ%Tb|RCgUL9pA0osw>?xfelia51DPWC zNQhLk!R=D^9Dkt0rnmisZ*1omNd9H?tg%t(=mn zsqvC^4DKtg>xX+UP(aq^5{R|W zueM?}4gHlA4}XzuJYGSht1ncuE_$92ri0W>+Ue-|UNmh4jgiK3n6WinW2n z>GjmPo)8;b&L~fiqu@8#bT))_U?Mqq=kwiO8TRTRHBddk!q#5o-cSbeY|usJFJv_=L+&Y-EF zapt~=^#h)cn`y>B{#`3(yjE1N`F9d|e^-!ysDwWO@Rzm@Afucv9sLJVK`T|}zlWGBhK&jQq?+Rn)g zM&gM=>(!t(1;e)jNlv{x$cuf;=xYH^{SBlq6oA$VIfU-RGH++$70<8vj4f==omQh= z;YXI|xZ_AB|H8t32?xktW2-TE-3+a(TgL@gz& zc;=XdTA`9m%@W2w$4E?Fe(+At$%PH{M6hz;*L+o2&tU-{!!&DIbpaG2Yr&K2+O#|0 zQ2|X2Gnh6t6SBI;(X+x!rkKEEr`a6ztv&GGq4Q6{6RDNEOX^-{$>h=|km~;4w4B7m zQ`dZp?Z?b>1U2Cl> z{@ZW6tF$MSVjp1?n?$3z2@1#0oytWcgM5vQ{gi-niE#LPKgKC89(hl=UW|kbMo0wt zpWv*;{T9>_-~L$WBMBq7M!yEbmDNzJyvMHpGT4Vufm?tQNDZ&+yc_atE$(H769CSF zPI=kTf3&e=RQyc{o@}ra222`e0*f^c$Jnu&6wA5Q^d;v+X2!=`H^?#%Tq~8QN%>-# zO6mVjzSuHO&%GiO6^@~|K7_{9J!TH8Ryqg8p-nu9jTc>B%8Ft3S-(o(Rop>U2j>zS zE|9>b95wlKX*;~+ti1gxai}Mew*;sj^aht_BU9<=xKb*8-A*2)YLSD9itA;#gE(wn zB+h9A&?|>JJl7(s=YA^Y5B|KiyW+0pR+_Fc=Q#3OhJF^`M>wF9-(ZQe^SSMG&a}MT z%u`EKFzw80zb+~qpNhHdIA#6H{|atNjz##HAdG6MsL`T0BJbA-eyTOAODBcq_l zZi@>8iNUnP?vmf^9{Ge4kdyv73)iy8MMu8vm*Q5^rDA`)>Ij$sHESOH9Blo)BkOp9 ztR8Ccc+4aFeDq&Iy3OA1(J1?Z1ILSdG_%S_^eP7I}B6@fw2sYF@8~&y|LUh`duHPPuFsMxEltG=#RhVHMu?_)ax7%O(`}xTn zLol_iVyr_w&~ig%Ku`S#Eok`lBi@>1oroNyta@5jJAG25ucDzzA82l_Fx;=U%{~rD zviBgiMA}lqoY-rc2=Gd;7Fjjx<6e|h5vcOMNm_r%|GOC`{wL&akH{$fM(~sOH_mQt zMNGs~!tA+JXQSK0;NDy~>RNOnjoI9rJ2%E8NmDWm?!9QAAuGtp$GdG0`=c`xU%FPI zSgb=;zxvg~r1UR6Bw(Vq^xMb`FUyn`WTl}Lm)sVai}lngh5Usg?s#Zm1Ad2v_+alJ zh;M<6kOZVS`W0rZLbzTNM#>%XK7EkV!`Ao=9NOX{h$lvWvsQR1Yo^ zcO{sh*iI$c)B&Yl(Cq8`)WM($rP50JuaZy2%!gV&-M%>*vp35D;uvL#JCV^Y>1GtH z6&oT5RMu23zF7Mq#{O%TN!NlS6pqG7eFL<|o{({yB0iZaLr%0TEpr z6Y5vbA>UwbBsT~r5pqnOGoQ2!dVr%#5hDsKJ>9#{7a+f^Op%<4Y+I(J`&%_lAPdze z4i%d4U(6;xx~E+SwS2|Iy-Ju1!UWKlKu<`~(8m=@aL-Z7r;g{yiD4hH`P82M>Co#qb6MF)s_}7 zv=OmKTR&gSx8=Aj&!MAg3{wQk$FIKg8Y2+Wvir&2A^-awzZBsuE1`U9_J4tVjgKK> z@!EIXX+L;`OWtkMtlbqnR%dwhhT z!dKX_3%t|7OS~%~hBcaEQ66ffx?>p~9F33=!pT26)gHtuKcYa!fJk*hfpGI;L|_@+2Rx_f{Vh z>65O*60No6U;K8J$U`nzNF34iIV`+fcJX95tci@#5HElJ0h7mYKT{u1l4{mn5#ORLn|t8@9I9lI4h;RI zYCY=A#+)8dGkK{|F#seiuVJG={t5lTepZ&oVbvsyEQ@5`@7GT`Q75TpOPQOn-h14; zHfd?E(Sz9s;tLpRp>dV&PxyrM?Opym$@$ZB54q%bzcEEy5CH=#Ec{`c@U<&iqLhJcC| zW9xRN@Jp(|^d|SL+qZLKOdTUIW+KmE%r`rbi#JrXq0Vs`V*uciw0WKZOwm2_D1(H! zv>Vo}n~A_OnIn-%8c+p_nzgW)^4=fkzRYtHs#&!z*TCU0_|c4!WEj)=NmNTtoa~Vf zV1AT#^NjLEN*zzlUUb za+U*!7Tu!0M;vU{l_EEix4Bs>Zjd(FDhv>RJ33o*bgT{;4|jz?(pp!z&Ro)%(|Sd6&>K;rAwK6!$0?!b}Lq z3C{%E$ylDG%uC85NU|1FeG{yatjpQnGe|vG8nrX;9XNvu*6aM}X3S;&%&Sn|&WE@# z)%AK>dND488Euq%=Ar4*;;!UrO^0ktBusc0fY)W5 z-UelAU@Acev3O7JX*LeZ5BxAA`xQ56YAd>y6E=;3*zmEz$C=95dNyq*IPBotw}H(8 zKp{RQzpeqfIpzLY_59ZUMBUUQ>|rI~bPNWc(KxG$(PXweAg$)<5?{_@6I43RS16%s z&rMs(K~MlFaBXc7LeSArra*2dQ=Pc7yKU6kpZ?YiMz4N573=Cy+Oy3w zQWdgu7aRcB&R;twNbpS9ob{6jDW!PCsqQM0Z?PIo<2o2|J6~{j>isbLp9_+{Wha1@HnAtVC`g^G)mt5b+O49(OvqZx1-SndByxb8F`R`71*@En% z;LXhN`V1+0+>A3vtH?exPi}g2@c(g} zRqxq~xBi3A{&w*PP#jpLtrb&c#IliD3`@elRX|l)ui-8drhnvAF>}qIm4ogr7|^aC zsxc27WIXYW^47l4Hft2N+G)~t|FS-j{iu1u^&l8;)S>1195u@de1{ng4jnPL#w$h68nKd82ANjN}FvOq#9oq7Li z8iPkpZMi@f_Cg%O(T96r6+0ysF7zQv%3eL;<9VKKjF0pRXN_#COkz z(wjtlao6+T8(9X~(3pMXu5_lk=C>9iOe(GR!`Dv5F-O~b)|9*o-{;;{%`UJUC(ziP|UiVU5O zx7P7D9j4%51e|34G%?kuk)fT7-~*d;&q~tN=R}Ezx6S*qZY4eFF=`iqrbZ48VON#7F#&xT@(C+dowYVaZ9A9VPN#AIjWv`=C9T&c8{?AQI#T@ zSw2;}(&hP{TW!0i2zYh%s}Dv%6DnEvS|*8fW&MKikIwM=;&s1Q*;EQaH#g_?S~}e9 zqk4mEn@1TAH=5ce{xZpHnMK3^NqnISdswutz^6S9EpKHqk;$Pkr9FXqpsB9ydFdTi z2gW!}X!UDVi*C5nQ;|MR!pU0Lj*|b(vkZAxx;$R|T4Ut6xv`*Hk4-tSXlor2sgxjtDpGrNhj9(8Il3BTvY zc2Mm#o+T7^oONc_of1MwkC_~2&m#*y)#cGjWU*g)LllY!9FLH6#LoyWX%o1d1(zeP z*dN!%i$WY~9G@?eCN3!mH6HgX!)1P;7zXyb<$URADXy;QJIWQWmk?Ia7MY+rQneSb-ut}b#Npp<%+FQ!%F657Jztn{Nj4K{ zf-}Rpvn6sn8c{5I?Hk}aVfXI!(Qp>CYS@3b4M-%{Y0KkOPR@wkV2cybq1lg!WAj;$ zrA-R|$-1P!X>b8STbqmz`&)neZ^wi(@tuzxc?^%-{g`X-+ zjGnO;Zfz(?E#;IM41~z~>|9Yms*wj*HUtSGxbD_ko2A1t?k{FE$WUSRKcceR$qz?o z^Tfzmr|a?Lo@5LP&euc8ay~{N{&_7jeiW-?vx*;IKKu<;H{%ZNH@)%D$|lLc9{Vo< zNkF#0KOym9eKO=x+;bkjK=t2yrt=_^zCCBM`j%{H+_`Tzb^+hOj1SvL;z-8fF`Pen zP{rm3z^-zHs{1Us?HEoVki zozUq-X^9Xi5hjly4D?V~CW{XdMKjpB$uzmat=4&5A_2!CCRg;jyE5%$<=khnnv z5vf94vP9FmTsPcNpp(_1XF$i19(h zplMHQM>eEsHWeJJMJ`l3oeN~;FnN?^FC7&&~ zkrkw==aMkMy)NM_-=iJm zG5NIG?=B!A3SK}~JM9w3`fPRMxHd{MZr*4G?rGg(7Jusb2F+QO6;sBk-iU16{Yk2KPxDT_jKZ7qw}+??ja@k3xkAL#)ffw(@1||K4$%!^N*#2W zQPo|OT^0C?B!F5R$1p*piD)=h))}Gw-gF)fN9^t#s5xhFD_N$aB%Jc2=4UFf+#Q|4qP&8KCT2bG_yWjOBCMt=g zs?}!t=R=$CC&}%pC(W62mIjwxAY5xcF6j*OYGqOUJlCR^meHWxmw zfb3s!C`!W}nwwx$g4&N~d$|fQXvxzP*BUUaUE|?k-|tMwZKH`$$&qwA)}`)>FPKHT zbko9gzpGf0LdUeJZ{}*kUMplpk$gy!bt@x+mrcdWD>d5Q4E5b>$_=iJb;~q?tZRx> z`G5DZV>-q55w)270dum~O`(&37VV*?Mp&QzQA6lkEd1Q{u6v;+BtZJXR&({lF&}ht zXcCwLUm#o~<=#id03sc}+)SqsV>A5{sIKp)39h61z*r`pIetMwx5Z!%sz%ZU}q zjwf!jw&JXOehu(P9HslpSUB31a@ke+l7B8q<}Ik|eokyo_lXltwe;$-$bClr$SO?E z;4V}j@3UG%UR6)0l-CMHh7^lA;9-do+J=(mAxW+jgC&=?q!#(6XVQkKwQzdTWk8pz zo_hw17MM%uEoWkmqtLc_Z+<7oru9?1a9q;S;^3Cg{}XDLyZrXoStU#8z~wN|xPMjZ zovQiG;H6eXwRDLagbj{^{_cA;s=p)(#GKfhH6z6a`&kH1#4fLkQ99$qF0E;jB5t{4qQhkt2pV1|?zK z$5hii8g!P*$n8N<9Gkw)y zN&fMEBiAD2*cvccetl{k=oiuetyZF!37ku$A<{si<2wk-eH_t>Vyz6_y?-bWJ;~;A z@tTm_-8&WY<^+Bp)RTgrO#G5R<4jY!_h|j(WSw+*T&vC_l zLS8g7?5U1X4Zo_`t;h^!;>Cwfsy5+yE-UM&5%b409V^EBeYXOvWD?r}aZJ5{&|Sre zBk_w~XS8lvmXvlqCVyF$wMjt98e+%X#LDZqEw56|^|nAx$P&5ZoTUQNJxUssll^78 zslI2R_wUW}v3IuzrK=p>6>BYnKk-M2wvCLU-v$c7mHxQ51_ybI!|~6YwAtT?MMRt? z_ZsothESN?f)<6~sNYcW@B5fXOA8-uvl?TOrd@nE2Z4=To`0QG!;p)>eUn`hM~&r? zDiNFDh|Ek)>kOqHq9{&LuZ}f>K4?83$%(S>9|_W@B?r68VW)%PPxfR%5vB?un@=&x zxaA_7lbh6+$^Cw)-F}8b9;>UV%zd1lS{^;NVbOFc5bQ4Y5n=ABSQ)zs>l|L2J8-a$ zZU|{mp%gFMLw_nXzTn!5+Id_H1BvX3lLI_C9FHDR*oth0D^CLf=z0|x`V>u>44LB_ z9cSX(zTz3w@nNU-CsCHgCUfs8SOzB_m_~GbJ3nJ0;jz^v$5~b#7@7aF_-MsxN|J}2*#`L+hlP_LrP`a|o3I$7}Dg*35Of*?MXz!jj-ESNN( zaCeZqJZ0vnP~|LaAAzHbxx{pxI?qbtJhU=TwC}&4AgABvZ{n%5)PVEB z-hXV=*15xG3G6o>h_0NQ-PSW|1lEWR@eT7!FTtr+Zv}P*)x4Dq-v=$#bA7wbq!zrT`NldDA_J-f6-hk2}TSmO`Hc#eQB;4^7tQ`K93m0$mZ5BO#xFPnBJJ`yh)5s zG?W{+8{-j%qD0sRkM-&6G~W#EJQ!12f|)hVMoq(TYMvOMPsmfkv|0(+fa8lh)uKAUtp^aJ@XA`uNASw!SV-I|KYnj!0%UDO{X( zzbFkHq2Y|yBF`r6{VgI+zG4^wh<|`h>189#@MA*2lAYV}XU9DP7)rvyMJz1(E7_DFwaXTX^xss4ZmO)W9M}J|b0zC`O zz^z(p=gi1G*8zgU_AqVGC10@tWwSx5m4zt&j1sUrN_?mR&s>HBs&x<5kc>VgG zD;(BGiU#z*9I2gNRaC9$&OjPju0pbBYUp2v5I|<9cF2|U>Ovux_I(W|Ic&v2Y{VCO z{Sv)UjWW=WGf0>k7;MhAy?-m-j2qzVgXIn|CU4;?>*bDZ@Wms_x8l889~*B*PDWiE z-Yt}1z7qzO%H_`RsoA%Bl0D2zs3=12KuUr-ffd2; zLQ?@8zQRwL!1uCVgSIcuN;a*G*&yyYJs`U*2?>)#Z>j7aF`eT-&7>rk+QFUzCGH_~ zt35*Ba#G6eS(JqrC;NVKL6GF`4|Ci55x_rvP1LO7y|?!r1A<(7U*RgJJ|)T6QF)Za!+0Ds+u%v10H!;y9=7|!+! z!v5zpAf19AlNi1`O>hLEr-EBTBZ-3JGu|u@6SEU-*-+wOycDnv3qk8W#?Uv~oN8Kx zn@`}P{pAJkL6N4M;o7g~2aH8n70P=PS5$P$yI2_RSjXvREe`N;ReKS-A3ggtBaw3- zUBhh+E9L6;3V-cK(3zz$>z7_ab;p5mrAD>m9Z|y@KVhm^JI^&&BXrj=Wk?@Je6vv{ ze{!f|8>0nh&(~H}C#U-EWQM_Y$5|q@m76xBwwy+%o(>wb2Ip?85a~YWaaA(gPU%`H zibTf@$h7{HM%W?U^)>P}WiJ&f^lR~DdH@FdYtxNMS$`i=0XVNa%9HPr*_Yc!UHxAD zRrG?Da>~HM_G$w-Zj*tL6A6Zyz5Cwol->KW)+ij*)0L05+cFt3efTkcaj%cn`)g^Y zIKU~AEb4M##JLk^u6AhX)c(t@{tILWAIm0!!_{4}yo|ccZMrSRrm=M;YN*X+bONZ1 zzFdej&wm)yIwq#AO9bp8ii_b3Jd}wi=l84(w6v@aN773sWwMpx_KhMv+Ykv2hjr}Hdf?oS9sx`PZShNpw9ClOre zBzsh2n2tKBGo{-f9FmuQ`D79C59E!XiZ@ojMUGr;fKwEYOo0z(ypE^>ECy{W_-3^O zq@L2((WR$ZVdN5HBFdGw(9(Yr43tQ}8GrklCNZ7+xD_i35^+E}&0wI%MLDI;N5?vN zfo!w>k|>-g`W0ZP;qyCNo!<-C-rl@>Wco~06;6yo9L}m%+@9*Z;lV&Rla%LXr#qfg z$JtoPCh}yn;1RwiV)A)o2+exKB+aVlK&RzS$Ab66jM+O3a}+T+5}j_oxW?ZKBY&`r zgu7;=A|dULaPfczR@$;OSr!TI z7M#;y@_rRj$%dlzwbcc@3ta7C~ z?b5U3bEQ8cVxl0bls>8*^C7 zMboikLRVUPu1cXu_{nV2g>R?og(K3cC{LB)Xsa2Cx*t3O=YRJ^?+hU%g-xj$4POn@ z;OJ$z$<;2I1SZ}CRTOfiQF}|&(=im%^6YFKb$~1g_ankBRDGvan3>9 z+4N=-X6417#u2w`lLHKqB3i>tf4cPwG3s?RDtCP1K?~gYxoQr653kOhJ}V^;ug0~x zU*%u z#0l$*_rZr#g}|ONhZK`ELX|I(RN@3XUee#dC*CiwW`E#5d`Lx(T#O-0_ugdPwGVf3 zVD88UX?qfX!P=4K;r}-1l~!1nZLy_DlTX|Y3_i~-AZN)o5on2Trn>b?Fut$H7-l^29-(2ms-)R| zz&v~}nM&SMiqldEHle=d0$EzyxfFL<6q9YdLx0RuOunpS2KMC@rcP*iE?@CHEUOW7 zstr{DEh=N`*T0^rnX%j^uIc#`e$>sS3dR!4Tskx&{e*|cV`)x{qk>@88E>o>q(utb zxTlxRSfi;?+*#?T4lM10o^0!qC-BG9D_=c+Ttl3UwzUA-n;bKr{SqO?$D$aS4A`1x^z$mAAar;pW)Mn=m0)EKc@E(^8`wPxwX?RXW!J zRQtSbI*CcryM)IR2eI!{G1}KRGQ*;hbWgAWM zD-j&oLxOz!X5kJw$vJkB*YtrJBH;(oC^sC#$RXc%%K|Ov+mA(_Nm7k-bE)ouStZnY zfrS-XBF#S~DuXP+x##3yH@3u0FMUYc$(phqVqm=O8*as$w&fD46-wtiq7!#Piw6FEP?g!YY?rI7 zNJ?RuzqJh1{expMz(J;{dKMVtK!zGhRv5~6cqsJWBwS@12Fys$&#)p_?2vrz&o@kL zLi3>J`3gI|cjVUQHl~!K!C-XOj(nz7iM>yA@gtpJV0_n5r4rJ6%O=a ziE|i_;odE|sK`OA^R(t4zsZNLICiEoSCt zD6fXW)jB$d8$s!w>RVUm43Reg4?MG#qnl=AClv^qFCe z5yFU(sB>!Vtthfr_Y5G_wK7QA@_@gg7|YEE>y+{h0Ee5rR#}WmVc5B5(?aKJ>ib{no*f@AM4F5!_iEs7j$mNHTK= zN&EiQ_2_M88u`-amClDLhiEw#2-pe?TlYP_3_!X*u7k{g%YSS9-gm?bJ&md>n?FHC z5ak23+}eeh(<+jc8#UAL!(z(?u{LS}zKu zg17p@%T&#r@qcB)rIQ>@d8qf2pO$avOyidHvb$kDBGHwrWk(0k+|HNCioy5SCA|JD zQ%<*FyI8P7)bdR|Q|vJH#>VX8{&9eR4uzgjrbp>K`Z}=rXPC{FtxHXj|PrSALp=L5vhh>UX!RQ zllh9_wts3%n#gPcpG%I4d%4dYMy2q8|Dx9{y21sy0PX^^G6-rd|8_meY8dZkE&_!fs2l^J1{AwJ0z z!(b@7Xh+RP-=osYr;iFo_YD;I2_p9niAy4}fq#moHJM1@ft*iN^5|@McA=OWe-5yz zs1c^p)`nlxOrnAaP*OHPemfsU4VbcqUKF@VOzTO{#O4HQ5!^|>OeLUsZan6vfFwTtpau9vEBrWcCDj0Bl?Sh!_s&j)_i! z%QkEsHnSl?35pHz2sBm#8Xi_Rbo1QMTfo)H(kP!jAWp!+qMFFM1>R+QJX}hAfqw*J zhFIWcMnB<}zEM)&Fbiio5}K}!nxR{os))Z0uw|W-5<4A73X)?in207!yc}r`3CU5O zr(e_P@n#d3^U#c4vBt7 z7jokzGhBd~QoN^KptLnCZD>^RO4nhID1ZlyXs9#@EkoElrjCQRDyPEF_zHj2Xp8=W zb$aCV4i#0O{=0*Rk*a^6TBAY)0v(aTe%-oA>o^Ff zHW3Hw4!r|ou9e`$br&Xo@4s=A=nH5o>0<{W^0t;0=DaE^3rulK=* z0vosS$39Yv&1?KotYI>E0+YY8K7}R_=VAGhXN%@8=5GO@4*fEc$vsK+6X(77J}IlE zNx|zM|NO>$%8!VN9F!0JS$|ABmHi5yzLEpYw=5YF>`y$#>YicAc~L*04Oxy%l=5xO z@QTrb<#OD_NGL~#Iwnnnvz9mYvyN|kW~C<`*1~-1Ei$a8m~V6*mqsng@);da{|ja> zYpdb+4|3r8S3ppdFl%XI%Nz-oGt}(0sOeW=^1t1mx~PNz|8cN&l79nourbjolUFDZ z+z++chgfd8JeY(tskPUpvn93UnxMIZ#j0)8Ced(7aVYDTMj_2XfLfEI1)-2ShkSH* zI&o<{tR{}w#Z||IeM3WIv;Oj>w9?Jj7E5M77&1oiH*iRCqJNpA#C;z1YJ{iguCREQ z<^;V3OL4WlBrJ=noT#f=g#Oq3fEUsxAZrD|fBO*Qrs0BbsF%YM;fYxp^yqJ^4Xawq z)@?KiX_sWd2)89eW(>J(QB1t;1X(Y9#%zlB9&-yG3z7ixy* zBy3;d*^g#FF@Hj0DE#y()&iFr;Z2;q={M@;ih5H1)M2GQX6v zC=E&F{n;c#42arb)v?ndTvH-TOcaMb-X&(imSCs+P=7(AHk=K*^*m1@mCWJ5jQega zJrp{*LLI)-#dTTih>Eos-fpoE&6_)zJsWVG(eX4c<@P7EgUA@yVX8d$+H4*LT1Q}` zD{(RhoD5h~QCT68M%0GihI1KM<@%9i`l?d)?v%U>rv}m(ZXC%P=3>ip=*RfW(YVDg zNEc`F?SKEudB<$`stevmSq6D+2$G{aq##{`I#xdf`dQB%^Rqj?xk_3r_n|~V3@>fR z(&At=pw5ey0QCmWC7GL_Ob`)4K<~o`m=k|q_QM9&?e#z+I}9(NA{lqp!I5hNndo2s!{C|cbm2}u_heBwAy@^7m=5v~$3tA0t z=!v9XD~HHHnx!-H7@T$M8mk3Re|yAj(VZax68l4*Q<|3mOiSvlUS_H373NvoVj`tf z$ns)dLepqxFr?;Ni_4(p)yro~!%QOP1hvf&wO3nEVd!7D5a}9X4P9u%%q^X;K{^}V$<<3A5WpL_A^q_4r2$t zsMqC=t#86kl`jG8Q7#@m%9Rhn0lcy#*dDcVZhy|W7WF<7x^Eai z+x*16CgZ@=NN32Kn6zk7AnHqUBeavVun>em?m6*E63Q2ptd!7tjaIc~#=uiM{Z3)6_kSx8!OEqfIsxp%DKkM&L^OG_(O6+da?!J-aa7FQ| z5X0n5v03Y+L`@-@HM~xCh4_3#>|QnRr82B-05ODv<8(SIE0JSsRisw49Rxv6A^+%0 z_3wMVG;WPmB_X9Q+WR0w_H^oVy?=_u(Kfj%rOH5I#iz)b>rmbAO*z^2ZQGK8x#5e^ zn29_d6IeIX-0CsK!cT`j92LYnz@h0v9Aq3=LgDRmhBvP8KQS&6y>XuVuEU6{43!b6 z2PEayF#jzSt~SE9psSnmI2a~Zmfg~j;Yy(cdE^|o4hEGOHnMP1y3`c%=YPcSp%(~w zz_8aD2(i{Pxxs3JzgwoHp(|j=%Bl@=_(E)dRqoj4gNeZ+#y2LAdMnhmzl& z0Be04^cBW2OZ49}Jf3iY&L}Y}1wk}jkC2^%Lc3N94Wsh}Yq&W`lp2t7o8CG1Ti)-F_%#40~G`^ zG&44nu@)zPt$1Zr9NLmKPH+hBjk~+M1`F=qK;tgK-Q6L$ySo$I-Ccr1@F0PYd*8fy zv)(tqX68q))u*b?u3fe3)aum~BuXj_BBpl6KuJ4WX9gBVW?p~-$i~>kNyW%kjzQGU z+7$3%jZEHx;y`s%NPiMFa5uSzhBd3Y; zM{aYFEj-g-gCb*VW(Qzl{)gSv#r~f@SD@qH4Wj;QW@tW07@6AHT6+LYfoAYb3UY6zDldhXvon0`!@YMO6fy&XH^gT4`TmOhrFHXe;)qA5EZp^2Y52DaIpax*qFIK z9vd?ofQOyO`@hNeHxSFe&hkdijv#k{&PUPAEPt2&AD@4n^!^P-!q&vj^shO8QE@i1 zHT@W^|1|vNHgR!u{804o*ZxuRKhJ*;IS}X$G=X1TvNPcevP{cNcdo_G8JZB+>F;HM z916BCX;3Z9_p7$+@l6Zc;i)iutqEpqoZ@|J^H@B!|8pQqdpOdIWlhzS0=@Ft__ z%SYR!?BJq13}DhPK}tWXF8e%r)N+ zgZ#lB*~cWcJ{GeRwGr%dZNcdoW#aMU1J%Ij@X%n-HFVzrK3#S!90i{dwomdYNs_aN zq2pbH$sad{YTm5G;7Jmb{t+0)ry6pEUUH~I5qx1ni%Y#U0k-W3ljb#lp9Qfayc1d0 zDZ)BEmw5E%psrE+#!N$xmRGcBmDauJ4JSqkL3VsIvd&XD*}NloVl82wG;yGYrCgz-qmlLH~H*e z9CmsdGeQUqDB@X0z&3h+_g--0I#biAJhHm?(*Dlv&zhzaBLv=>*NM(8gp-v&2H2H4 zO9?ooRE8JCVQAB)0JLRsL&}T7b(?S!nG620t}b%~bGs6`bLNOFoW+B77o5+g(16}j zzbDn{FQ?A#Ss0@&WAG=$3R4gWwe!ZAlp-cJNSQ z*SHuYH>|7>;s)Ax(hiqP$u_(KdwA^o5DWOrmp6qFyk;RxSK(tOA*BbNMf!H(>sp8- zsBiV27Gx0sWtSrj9t#lv8*zkTQ;pCla09xdQm4y?@lj3@1BxuCPH-(qqp03kdQ7)) z{&z}k86T(&N(X*_gQ8L35$psZ0EL>_Yv|#fsW8_v!saZhU9NVPa}8EYsG@JA9ZhDH zK$J-mPc(Z_ruT)=Afo-DBBoJ*|>**QGk?-y~(@C z;OlNa+^IHtsN32~5}y-}Ri6*!3rssOMu!c0KhFJrEA7jF8ys)LasVbWQ?SISA^uzu zODV1`rf)0`xECZ#7+w$TQa>)s>r*Si*KX*!$^+wyu=Krz9HaoE&AOPh&~cv_-kt6> z_K6wM2<`#VBcc6j}HnLW1*lKs5vo)3sT`0R%tw&5{aleTPfy&>d8LXnEjU; z>p7Q3%8oIA2E;DWGfz|m0?l7yJj8z~>m`YSM zHjA))_>tBX6U=U}K>bshM)B?O1jNI_s!1v3t~IT;ikrQ+#0gpkk-c5>l}3D6qBf57 zNK^qd;^E1TUCSwR(sfns`h5|;h!t?Q=yII(uM;zW^{5JB^`Ch-*B_U5?9H%B%xy|| znG3AnNLgNrcHcnBv`p}QUnK^o@6bw{yc^s^ua;W;Qf6L3FO#P{QKxWlwdO*o^mx%h;ESzkEy3({{exVzQZljF*Zb#}WLmm~tT@apE^ zyI%}{0Dsw~j{O17FSA36--*$%<2Id_IFw;viaS#yffLQgoquB2t0_;7_iZ4t)lAb3 zXkmF+)s}xqKtkT0tVz!C(GUs#X~~O!MRY-&-YR36GhK-;!|*0V(nEkqxWM|N z%moeu3vfct`PyO_aHZflcXL+#4eY#kw~TaYYjNOLiS3n;Ev6%CL7}BAGnyhKT`tWE z;G33YD>>6>8;@FwYSU;SQH53ib?GFP$CG;6jn($v0m;O4)$&gZG1Jm12Mt9Ab7h`? z1E@z;GVj81^)JKq0uEX_ge$qt3|773ZwPazX%eyZIFS)`HKyDrAi#HNiwEIEq!H%vg7x&iB4q(^rD^AWf*^y3d<{~# ze0q@xrKUUaauy8{ra|Lb6fVU9f=c@$0BoWWQ`?=UK4-%2EY#I zmkAz(^TBz1;dTY6p3n85@U!B?%?AdZhF)+0MY?#=$bAo0N_1UCsR`PD4Jx7;I$gKh z;4rqj4gEa~xJTP^)EZ{Jwxt$Nm^)w5v#0lHM_VN=^$KDXm=bz1s4L^X$}pFmh$6~# zL|1amm7D}wA%2f;OX$*DHP}Fm*10*FX}=nniroVqdU{$%#qWA}x9Y{6;e=tsim%68 zm+Y%_Dy-)W#`!oW4wgZPIHCbcpA;9H%A)+Xc(ewmKn zw%a%CDm_f_<%o>bIX8v7#g`FC8a1;_DA2xY zTbkmu96~sKr% zDBrWk;Wlg~(tA#PiL#3zG=jeB`twjOrnI^o zJC$ml%^<{#ZXSmcrISS_B>%}b{`;i50vImjVzwhBq5%^&FSu)6;Uxlvka;L4%J1MvD^W#6gr2RMq_^yaa24sWlv{ z9#--R3x3{Dphb+DOr;Y57iIi;yGq0t)h0pN1!fE}Bh0k#%qZRaZN1}qMtRl$R7;4~ zS~kwy@;p(sSSyHgcFPCzAT?3^EY&jJ*g`+-T$LP@^Qv%GG2sR2VRbMbMk&o5 zL+cBFqEV5O*YjKCFnZ-e6QWkjOJKAn1ztp__LsOP6`3MQbcWPD*zEoxuk~X;f*0q% z{&9(Yb2Pk5SVZnl@XaOfA?r}PN|rgB>NVn|Zi>KL`AKm^PV3eIxNm^sh?gax%QsaO zyn+e!sgK)7n?0Hsh0BV+e@;x28vYu0JEWO^Npf%V&g#DWaIU1F!=q?-v5wGX8#;JS z9u{um@sqWcG2X8UbUbYV&OSlD!o}Bf-_Nur2Hf^Cxj(c>VwEjM^JBk+(p-%%AD6%m zY?wL`rO3g5r8L#x3WR+E6Pf?oDxTye+_W;Ry(WZb@UjQvB}u7pSzCe9!?=bQ1h@i! z$`T>mM&g-HuHvQQn8e?HeV7#uMMIfBD5*r0m5DMUxmW?*OkaW0pE7duj^#BZ7jucE zBB?LxCE4!!#oJ1>94gA2*gVs-X%HG=W0p`olv(!QGJirB>X6ub%&AjtEFL(N-D0jW z;WwQ{v`g6bfXh`pf{rg1^+>mU&(=_X%R^HXxEZ}zo^q@>Vj1qHa=xCxECqu+cD~am zaT3>DQViqDG5p}A^4usG8MMFuEfx9`8txE@wYXYaBO!rJ^PKJ&UAl(Q;d z*fSiYB{Umac%y-vhg%Fy>RIU#GZ<7SrFG>uK=XIZfHUK4h~x!&`7L^+i7rZi*PVy6 zXnO#-E^H+--Z4Z9iKH&pipJ%s7izfL_f#fw{NNvwI{a#cxnbetPv#`4R8KPR)1?x% z48?5lm0{_VNL#+FEC+TEBI%G(U{*m`5a5FCk8!nEP{Nn!8tUXb4QA(IW=6s__2qYF zJ6(14Bt%gCL5&Nri3u z-PzdTpxdMOavSLTXAU=iOq6+<~n)hR0xm9S-y3JR{cD#GJWRAKjR2oS&?GcB6?}3|W93{_I zyf!mcv`^6UZJ)jGuFvx{hXaXO;+EHVt5+-Lj-!UpKy**vu$11CuIXJfAHC0}TJRQt zKTmRHtuJ+ylYh#&54*kq68N7$7P)Jh9BWnSFMUFs&rAMs&Bf{ z?EX1433)HC{(^nIct2==IX~XxIZ?h6PD3YRrApYq|w6`Nm<2(gmE*eb2_ z#abR9elx7d{?9M!-A10-m7#hGd#7e{Bfsi8bErqQZJmowuH!zeR*Cv7^1d<_@$6t+b0!7d8P zA*ylk-HQ!x#Z<`9#iWCaZNM90k>5lU(-x$vRf8@d56dgI_Z5f*w-?lL#PJKv?VQq8 zAw#d*6tN7V5}w>$ESw2Faz%@;f^aVM{0v;Yp1G7ZTG5<;I;44SsMoC>AV>z14Upx~ zeVeyi!22cW9v+-8qSf{mVmLh)8*1}nnh(B)Ny{fO`^{hjoprhCXmg&{AOgdZSB;y6 z3z2G-ExDR^=Z6c=-lYKDKK;a+3GU+zEPRmioAZEa~*5hnEZ{%>NZo_%XQmW^hhOtQ;)M#gd%9JM3jBuml*T{T{3pn z$0NtdZs{*bG)$4|PJNBFcVCDi(aY1Bhc`;)mkhkt>iw#Tpc(n?3GRY;2nZa}Y&$vHN^DKXS zs?*k7CiXQ~rh7gTzH-PSSTN<%YzATRoBm*bLn}p0O@1WYolKQAOw(Ec@xBF-Th;}{ z&}>IwUsCc6)ejo0ICQL_&y70|V&j=?z|$mjOUL&K7py7XT37eL^n6!WCn8ChNp;im8nYE1JT8<&*9<@ z$iEBZ4_{SN!{`e%%%r*@Dgww$lC8x5357El`)YUwQUB+{<8sq(zS&41SWh2&2?B{~ zgL%zfa6pqpkW7oY_>(00>*Sfli@CLb`OlGp7i-$lV3&hU;U_L8XK9m)#Pocg5{37q z8_DTz;0;UY;?8C5vphnFYIUsZCBT4EW$4r854y$0TVf@meT~>CCZiP^nJ>S+A3rA* zHX5Olv>mWZ&h1J5NpM*e&{#=z~RSk^9t&XKd@l&GKW1In*|+IIv` z=E&#HNqCtv*V%kxBN&pLH_N|_uQiqui0blEOEBP{iQ0?WKti% zh8;%I{vF>Biy}NP=hTfN<K z*q(&(U;MdoEi1auMV?CBM=#BPEVMU;sOteR`nq#hP|Gv0iX5FP)gqnWh>j51zD0*2 zhwIEe;iaWFsHu#?Jjh%tHK}>!(DWJJspR4RCLSck*4{sFHf0hFuG*$k?=`DDExHl@ zdf^Rfl(Vlin-;kC=6{M5INMel`YKJdJd`l~sf(z1umNGuFIlMd)qK@|5SyvhU|~+a zR=`C#YR{$g1$k(Vxt%Ge=`22jFrj%eU)$~3_+dYivX$y#&c%<}*cfGWnx|w?%#Nt? z=ey4_>bh{AvZ1yCl3MmA21XP+7HcG~a?<7^K3Cos76tYm3?Fu7S9m;g%c@uZDu!CD z2|Vtv>3~k_##AYE8?9;Vb>v(Hc z2x2Qtx&F_lR>L@zsraQ97cVQK5!@Z`37%^G)Z900qRT&cGUwu}^CLd}&ZAc_YT-Mj zVI86C@3up?ff{wZ(xDkmtT}(&+0Q)@2uG>y@J{}mxUg8f$kT^^=61`(t$6Q%rcai>>1xm+57hj%dlO5$1U5@WNUPASP?IN9ZHJ&z34$ee%a7b%#taK>IeG3H z?4m+EVR)DUhq1PQm(mpIkDpWm7g8>p6bf^?GyVIxSV4|`%C1`Qos#A>X9E_Rm5!Ww z%!BPk&I(hDUv)Wed?J#*h+SjV?mYy3J>otzT{(peY=sK=X+8+VCGcT<`f{F`(T@>= zn?SgWoH!5uz+9+}mO~m)`-f!4f1(1F=f`r? z+ptz8awe}#e9NO}baHi5%FqualwX_~Zs?x5Cje4Ft-ohK8F>hoig(uMg6r-beuTLo zX4V--=Bmu&jZ-eO{!#4;+#d*rq=mr-&GWL%I~z^`(y4^7NPEL8`0KHX`n}CoB5SdI zY=&BM=AaJA^fe|de`E@PPZeUMlHzym5$89F{LhQOMAY$Z)9bO_maiW@bPAuGeJ9;0 zK!+MfSe@P4Fjmw>1kn`)aC1zZ#D%r~n(bS|bD=aTq4}JLu*!Zgv|nu#j{|#Uf6N(Q zU8f8oz)Q5wdbNC6E9`k#YvM-iF><{1s;x(Mn-5nw`jhDxe^?X8s2PWH5(nkU`Cxjr zyvYJIDe_C+zq0xoCvCn=c2-H(mdQ|k@YaAH9*?Avt2r72LAw#-vMIvtFjj#!O39!m;8n+|ZO{<> zSORY?V8c^^u%!?I6@36S|QI z>Kj(ArDi218Iw3cWZDo|ErPMRA zNnW|EpP`2G*;rpM42K9oY#0Rf+&Rf>U==Zv2#x-Z?4as3(kwB3PYc?wn$RLt=l6ha ze-=r9!2>8yDq$~C+iUh#ldprQ-`+bi&v`Ag6NiEhjQJ7mQ(T&pjUqp`f1KT|$uGZ` zDF;Yd(CN0PAN}JUona)zN>()N%B3VJbvX&Oej`P6PR};Ql3Tiiofa7Q-KU3M^ddua zeZ|+gY&?=)Xjc8Y4xaeM>+Ft~^BKZ4f4qU>Rw5$4%(1jSi`vmEG&(J-8z5d<6M7K( zdaMtF_@@*m*X4@bO3H*v6wixQtgKO`7m54HgWf)_`%Q@kB5_^Lh}IPi#vH9AE5b&n zEG+oNE$DGw>!W^>PyQl%_v`F60r#s?eRCnmdHfql)GF>E0S^e}(k4kW4WFkWe+iZ^ zm57hRWp3rh$ckAMTt(`I^64P=3Mkhgb@K8YXAJ*;{=o&+zVn4SYZB5*VD8*3(QvFN ztdU}~#;mM7F=H!L*YET2T20WswrT`|mP&K|Nm-Bsl$>(FQh#a^erXo}Fb3PXems~Y z0SPBRGl1CIF=Ul8(ZrD#1)NG{fAII7s&Q_8SG_U=F5Tp8KcbSd`W^?+d$ca?>6NhN zYS?Xs=}d$=0bJ7hNf?e^T0>f)m=OVg4E?xG_<_ZcJ?Y!q8+hCT+G$!=!Ac7+jM!1M z^w8qib&b>)P7<+u)KR$%SKJn73%);VA|`|u_a|Krn4weC+s;eo0tMdDe+i&@Oy zZtpxtKHcp`YHGH;*EgzqCS#80VqtPUR-PKyY)ftHM{X<#=G!9>?=q!9C7Y_a*Nm)N zn!`_`m+}T9XQf52IP63oQ7?dR2SGyli^K|S;DU!3ldPBQ1b1$vM&Tu38bSa^ z?weD~xyH@yb9nlJ#ruYs>>1cLf%WRTpT#!8nCT8^cH$|iFJGpFe-OBw zIn7If<TWG0s7u2zEk&%`9$(Jn-#7oLNBtRy1r^XU%b?$1YI0&Hf9#8VV%H|xVm0+67R?O# zx;yhzQ77f6{QnFX-#(phXOlY5z}kPNa5V)Wf5acgVqJ$et|%1K6Io>D2W&=h)t+L=jwOT}S~InY zy#hJ#pCaE>e?O6)5t3fWl^xx#F?o`S50KIqB8+->lWHj;q10D81R+lES*hLgsTI|2 zf?Bf{7=rY=JySr6y5#umvzG*1Bs8N=)0K;d(djFOF;UDU@5K$KkC66NQ9DP5Z{Td* z$Te55a^&@V#@^p6WW7lX*MJ%H@hHcW`5df$X?ZLVf2`ET(*k59hSBuY`EV;kj<(DZ zj}P|Q#-OU7Man@{t}(MyCU1oCY8<*M`1s!lB*(2$fj4f&9a~b9pWBd#mC~DqHhEs& z?Mreypjz8l-um`s%jnw;nBmvif=jX?i#v3GFOU=Xv)8miat?GciYHtQCZKSoDYH6m z(7D4ge{4YaI8w>rYvoYp@mPJ^g|3WlQSu*B>~&RXmqEm*Um^MU7wf|IM-sFgn+ zmw^qC02j%N-XoMqBw5|AlrpR89-P`Hjx{bcpDJjEK#q~Kl8o&xR@J-CKWm5yy0j0e zPb#>rMt8ut*GpREbEQvO3OF^_nD9kAqVZ&u3K!Gk5YH(>uIY{M`-z2^9l-|B)M zdEK3*T`p#QOEySsJp6!ocPW%60sA;uf4)hf>v9+dEdDkDID}9%QiYA-()T3vW2c07j~op#`g46UPEdpnrgdps#RT;0kfoysA8 z$K~QO=g67A2E3(-UJ0a5H~z3AXbQcp-E{eqsN^Z9t0s@#qt$J=`XK_0lM~wre>A=x z6-l*rE_h$lcX?$mkRH+PL*=dw_^P>4t-%*uU^TKR`$L7^nU@3M!Q8-zVHaHV9fVNo zmNsgn#i963{1EL?=}~-tYmn1a1EMN^fI5)&3TLXf5Zn5jIo0WPz3cw~1S8&*uf8@8L{(^D% zn+CmXpj>xcb{k(lnD)eY5rdD+Tzo>K(Qd!H!!7m>LZM2xM@Zj=uNl_yo`iuYYM|DL zhb!*>T&CN2(RQ=NW)Nar-i5RE6Aaw2nwgO-^h*Yu!}s@^6vStrjL@&MV5%Wao=ph^ zw=l}@NN&NAu{vtiZz!&Ke^S#Lr1%d4t$MqjI{0Dr6$LkO5ndkg)~j^e^J5qx(Q_|L zEN<0$a!JH+h|mLwP0%dl`J@6`FKUmv#6bkIJ><&7@I?_i{WB#giNutu^8Fg=hifCZ zIr$3xgWXrZDr8yA9)%AW2gP41@s$Gg@1LtMwkWOaqkFfN-CpO2kFf9|#x1-oo5s-GB^fZq@{XjH!WriL{)o>De-RErl8Kc?A}U0BLGba{ zYUTWyzVB!!Txes?-w5P)4VpX@j0R#3abq(1Pfl=y8H?&ed#R*w1%q>SZSZ49I1a#! zMr3JI?rw|2+B}vKg5=ttaxGU$#az7dbrkPHzF=GKrJ~tDQr8J|*|qNa3hCUK9%-Aa zA|xjkM|vyIf2efC98dL&Fw3e%sIGX(liyEa%22;7$iVQgJ|Q346Zj4$(Ge35kZJ~T z4Ic;N6*ygD1=u7IhMZG6nj-(4ECe!Z-*EVwbs-R)_>&*mfG7HXe@k`1fj!^oIeL-~ zE)r~!cc;$X*b>9QRnq8-gxDXB`h;GhsZnHFNdhG1e^uk%J77;FaLHMON{{nQulR8X zX%_RuUbyKhQifj%JC(8014kP9MptYy5`e2#2<~h5yv6@=yd43je8S#3a)y{VK_?l< za>RR0w=kifl9EZA$oiPtu8ZzeuYjrxV_hwyj*e=Xu@gE^@=bTnRGI50`g)?H!&@uZ zh#+}if9mHO`&$A5CNrCpn*9ddn;w~M!$EHr3Qi)@iMbP6qI)_1NTDW&E09Jr0$6<7 z>W>C6hPXs-d`vqO`rPEyF@Rf;iDztlZrS;2;mWlKn~vU3pfq>yoNVYttG7wO8_*Th z(&e>l!eyj9K zpJ+q{0l zvqISt2LH}k9#<9S4tKm!RjkQwts9=m%wy*`%mwT$`P!ed3A2KWn{e@h4rZ<6>onyZ ze=2G3ICjk)qWp%GVWaN-qArn3&;H ztU&aW6h26|)O3^G5P|!4MWh(Jf3b8x zc2C$v4A`>6k(4+VF|F%xJD3e;88ucR9z*<1kjFr3dit;k!zN64t>=uw(8Q3t#D#*d zOoKQ0Tsg$}&=0+W=^w`wStb&$kb4pfStklMi;ivx`KRDQ%y;Sho0VL*XKY2?udo(} zQz+qU=`l2FBJR%!k+ z(=`j=DS8So=KuqbQxys9(7n;8WZ2W<;lf|j<`vnZw&+494I>h z!PXg-5nAwA%cl8kMN(Q;a_GIn;!Lc!{wOeomFFerkS74J91t<;#s}u&1?hy-js$ZE zp2*~?`?EN=U;DsX)QKE7e^q`!tRw!U@>A;h)Ubn&Q)Y}!s+@Vev>(|sg~k}WFWY%9 z`yR+$01oj&)fa*a@gpU&LYWCmhqt6wey!I^S7u{AdRQ$rZ=KeQzgir${=Eg=GyUXi z=uC=gKJl;{lZyhFCqspmGZj`R`TXtVRzP zZsf?B1ltcrc)ZOeRou>zXiRVWh>UY3g`CfQ_-7AW?tVX7X*SlDPHs<^RG=(72Kcyq z%FFNd>x>i!&=sJTf3HU;XMwttIOh)_b-{g2Io!Se@i3oe-=3w?J_=n|U3hL-43cRK ztThMLB`#}z|Mv`ywQ#uhnWnEH$FvSx5O^5V-4DE&{IeHt1FSy6M3QI7jj&8#H*jv@ zP{xNMVH`U((wS^51z)`E*=<4fTC?Piu_w8u&hV z#m?B%1Vg~&&z%VNjd6MWF(S}RfS{tMHK_O^vDhd)$8{nNUvtX5op3wcraC?6aX7`c zjg6YCXzL}V+Mn;^isSh8X$=9cg(ifrzOgoHB%Jnpf5y-oFN;t>^G7NjB|Thd_qzKp zr_2qdZwgj&=3?tcLf?)@RbG&EC(d}ExBV(Z4;iJhefCe~>&d_>iFvx-!^@7?1ZFT< zrHvuT>bqH_j7z{SB`4ln4i#?JH1(sS6xInBNSwOvBDY=x`5;&wl+MbqXQi~N-6@!0 z&o~u-e?86gC5^Gfv5A(HiXt{R!avkd>oq8K8_G>f2LDh-T^yo|TB}0satuHCl{w8^ zix7om!_E3@_S*NSFqT}$@90S#kNYyE+%*RU@0d>{fO7OLb|4Nd{F~D_6o7KsOE9FG zWMNr@rLQ*?)x)iAFZX5KwP!Yx<82n5toM3Mf5I^^LmY&b5j|8IuYR=2=D9xCZoBP^ zvlWzP@Do<5yJ@H4%)%erZ3i=^81c|hU*`n%S97j$jUZfiJxf)lI->=onpy@eO?k8s{5@D#{Jnb2L%bZ?dxNzJmt)g%gu zIY)L%!(RR$yq2-{3T19&b98cLVQmU!m(7s_2LmxMIhPR~0VWVRIXDV0Ol59obZ8(m zG&VDrVIu)4e;a9U+c@@neuX~HV75bv;w7Lc(6o~_JH4h!JDr{G2iaB)gA0&x%vh5!%ZBtbv~OzJr* z;E|q_1d_voh(>`_5&;?{OdSEhf<)mQ%3pk!H-c4 z%M!s6VgaR*o+kiedY%jbKoqcy@)$>17*H7@X^aBIbzdCNBu3&G2S{j01aTZyQ4pe}e`pvqqyQ=17YCqd-NysTsO}SBKVVh> zDS(hF3QCaz?SO*ONP(K6V3bmY{3t?Wkc#P19;lEpgd{+~K0qo^s9G??5FoTau%AH1 z6z9Gc#4lxw>!tj8Xpxt zHuy;Kv9yoMo&OCV1wOX;DBZCeyF~A>fBy04@#BD;1>{9>UIgTM@I$qoRoQ%#7wezp z&(V*;lP5m0=lHn7N9Jyv**!~(;#&`MJ7MFFX<{$jp49SufD}?YklS6SIHY|JkL}{3 zN9oG)TG@w2d)W?5V2t}1-`mBr0o*O;mo6!rVMWaC;*}Nq*3Qp*7SZm$u`4G~f2?iK zo!ebmomW1-)r3S?Um|C|j>{=wjJVF{kca+GnzZX-fvv3>E-b1>Ry>;Ef%kcMZUu1R zQ$E7O+&ARbz_Ol;x9+iUyKjAg<@V#uZr$H&myEoL3!k4+awmxFY}2864^fN0sNaoQ zN;ewp5dYH7n)|WEBRn4v(BFDme=PlwxXW@|+gSD-ZQP>{(&DZVJSwF<6d`xn{A|p( zJZehcCNuk3>=4;Lye{@3WRgSG=kRno4~>vr`KfMW18C|?qOY#GWv`oS4i(E#79FB% z57{ImQ9Jid)#LugcF*n9)&b@{Kic|~wrNez|7$eqe~%oHTTySj`k9nXe-w@gC$%AO zG73#biG!72`4nV>_@;S_4lQ8rS5E9v@MXQ^a!?J@ur%Q0PwmFHekPj_qa7(fTBE)3 zjeK{FsD|q9XTI>-kT7CMonW8()oZ61^h~Mrkz^Lh?J)Bfc2Vn}W=!XUmzMr_Jzcdl z+;&Ks5Ya&4{(2zKw<;)ie+X-3-F)eXlbhkhJojUL=GV{emr6!#ej#*r)rR2 z2E4QMU31f`>=yP>4jhX55$eL%#C=77Ww&uM*s!oXc@6ngr&`%s!CW4G?&^r@&gb^J zw?pfd7o99Pp?S88kJiTW;md*kQCs`uCu;_#d*UQIK_nkB&pi_Qe~8$3-D>RNX!`}7 z{;Z9~cr(GW7-9KPI+b(?y0ogm0f5p^5F+Sp4olMrAL9*{~(WM4U=MhToeDPiR(a+1qZ|pW_Q~2rk zJkJ(mRl|rjH+~g1^SSBPKL@#W+N(L+tey|wC$|T^$~Wtpttm;y4-XHmo0K~aO}no8 za{n%8>+9}-GjdzNcJ^(jt_BL-NzWUoRX!XLqW35tx3*MVfB2m47a9iYl$RFK-SAoN z9#uz-4{Af@%y(`x>#fbt`y8!2n-}n-3QGJGGh|@J-%wAZm}F9tOWP zn4pD@7}$2;e_YUU=tU2Aw%1Y6;vR_GX1gI8Iw`EZCv*-D6Bya9yPVYbpTpc~*Iip{ zEw_GUpG}bakcc??-A6VWxF)}K*)N-~{Iumb`vkjULD1BnA`FA?*#7z5cl=*$AVn(W z&kEjAs6TQTz=r>)7RPbGxd^CK8pamtr;r>V9E(+=dvH!T@~6im7T~`wAZ|^tp4*TjPRp z^I6Zse&{oD(Q<<~qtw!6Xha<5?ec~&Hq$SgwH|*c^Jagu2hxadY#OKDi|aRMk)sJi zxq?}a#QyJ4{{_xytjBmCTGW8|g(9ded2jDSf2-oP<#5g?y^qWA!QO{^*rst&ZKbAZ z&v9Vcc#HOa>_@MH&&D&Y_cfmBe#Uubjh0Kpv!!E)_qje{yw7+d(xi1V=6zfYX${_e ztsxzu_0xm2rsHs{H4N2Sb^i&q;s0hEF=@2Dz)=4kfGX~eKaHP zf2N+^ROIUo7HhpV@2=k5Y^565jN3JhznC#My6W)+|MNW5Z%)H*)HJepWmb1!#5W(@ zKRc5<%k4}<4w8Yh>$i)}rUlw!lnexA#-!7Ssmt_*O*720)-vk;dcEXr$4bHO?Q}NY zz#gU{o%n-;ZhSNnaw`=h@oucNl}RU7O8q+x=1JZ4IVKWoW^Rn^#Y&fUH&zY>6{k`e z@;Qd`MpzA1DmY`e&mrHg4s8|Gb-6?xtZ6!gb9&yRLzghJDlTva3A=2{R(>WEqz^oI@LH$G6Q&PBZ30+e!l~ z@kZGbu}zuSW(;+*qKH-N>ylY2e@yIfapx^rHWe<~paV z`)JOuCzz)p6Hm?C$l2AnttZeKyN;+5Z=I&sl~0r4X%lv8ZQ-Az>o$~mC4{MkcGnZy z4~9Y_ioq0{P7UDtm1<|p7?8<^3dPz!6Wy9Vd#rAl^^8UE#>JRzZqnJif1c=um!0(l z5H?g#xE3&GovP7Z)Bbt%`0)`r|8|oFg>b2)8n6> zy?%Wfg)p#8FROsnGmejoufd;>;E?l3|3oWf_|rCUX7aR}XX{NM5}5fcy?L4Cmsjvn z#YY6u;Mk)G2TwQYGM_(Pe_t*$=z)&2O}6?7EFF&lenjM(K%w`y!C82$&oZ0dpmQf^sErtYz>E zNZ|!}36l6b`IWqCf8_BFByt8a`9MCB-^nNP2S_Jf-GDgK^@60;JkRHOIp3~oc#|&| z8GxIt%&TjXZpe(x()o3@Osgw^N-`_cd4|?hL)u+5c%5x*H^BA4oXm@5v4-br1!`#( zqgf%@mu6(IqS%(8x63k1feLa(uD;z|e`RZulYfzGvLwr_s>q70 z$vR(WWW8O@fSLSqO$t&##|^nj%WSPl(NIkYaEvm>cU~;W&2n3jFXYQMtMG~*fMSy^ zX3H9=a+E%pPDQG0mDem(*)32}0m?jN5{e}8#;*0s2|vt>SPbt0;*PC`NQ0ILJ*wRRVe+Fc4-%(Ws45IVS7htv2F zPJes(@$~o8hSRfjXL!LMbU%vmXVPJa89H&oC#5c*`lIEOMq}O;x$ebdy4$^4*ZR$I zu21M#mt_hTJkw@h8$4KgI^S;KRgcwnkEY&O`_dS^A7kif=GMZe%o@%4OKrDxUv0L= zSnp@1Hsk#pv^{!em%)((6aqCjmk}-l6t~(K12z?xEX@KImnJR)4g)kbIhRoC0~G`| zGchrfu@)zPt+r)UoZZ$XifeFpcXxMpcb5VRDXefOxVyW%TX1&?9tfJCA-F?;oA;dV z{(79-_fOyNM~(69C3DTS=GuD{4TZWEi-fhaB|z301ZLr2Wfvq@1v*)JxNAB)sX7ZN zv#0>9f#iSfJV-P&Qf>eXFwhw!Z2<-dlIsDi$)y2*R^*(V00jOE@qeAD1pttP?EvI9 zKt}+%l$yGMf~p)jy_~8Jxf}olaI4Trv~mFbBLL68T>y~vf71Ue)xXHI85$a@8E7#5A0F3#1*-pD0;HB52S!rT*_+&tg@c!$oP~><dUP@?St4|8-We0J{Ob$&LPh_RY@m zukQcH@4rqa{{bTdvU0ZmXKl2=79i`toA$p9|G2F@+}!>O{IARZx9k6T{@2a}0NwyA zq>VLaE1@v^tlVsH6JFu?thCYaAP4k#xJzZLc3DYqgY!U8R@9zAt@)qEaMreY!S^pd ztG`^{4ip&=CkJsI=>{?Y7sbSX0aOe_B^cYZJ$y`up=_p=DA{LvaekL8%DXUzyzIJ% z`?DIFrWJqSNalOE+z>7w8G@-iOM$C2!Ha0xmI;o`VhML4lIz3cKYj`xCEH%ry!gP*~u985sCgo66!@lSw z4L-)VgJB}4jvkP{^0D)f1oV=vr{O@((v_U(;m?W32z>_ zxrUv6xRarOXIsaz{UJj1vHqEWb>4=B%NdX8wios{MH^<&XQ-luc4>9bIh{qlpX zwKSnnJZr74f|1K~(C6>0{3Y<(15Q6s*Ga;Qp+j*e|@-^W` zTyI7%EzoO!sc#=Yhw%qYad*qC1Cm+HZ|8+gbTiqZKQisWiu09+&dAlGgYe&iue@RV zV^1;fBdaVoh}938+j|n#2#Hk2U+1hq6;V=)`wSGy0fjEXGzd$W;5B|Y9ye+Jv z=5lT|!)k@U5xjU6^MN0P;oz>M+4^LVa)9CS{%xIqmony0AWB|rwWM`-b6k_kG(wO1 zC<3WbaV7R8WPC5dCN9oH#Ej1m5hEY_Y;J-4JQG?C*CG*yHtgVKec<)r15t76btxj4 z-tkOcSOepOGNNW^;R{Gv%vr>xPygN9ayVI%X>l&j1Yj6PrO1wJ<-k|b`}*Ez!o_6; zfO!jl_!Bfm<~MEWv&~u5DC=C_fiya`)m(}bZ{F&Q9e23ex4%BSSnWQ*5Og$Nk8dP_ z!Y9Ds_qY|h};E{NxVMP-4;lv)Hx5hGZ&-n7w zzPvrTA@@71$@{%yHOpGGXvZLPBYdmf?Cr&W9Zb7$-AD12?1^5@1+R_CrRthhDFO{5 zTiF5Z`?X$Lvy&h^N!n;hZH4aerZ8`K!62s&8_^T0UGRhN52D4lm=GpkeKP!G_#lEL zfcQ?M5=w8rLAgOoU-xK2&8I6zWFoZ?k3%XJ8|e~S1iouG4`;Y~sxZs5sr3_I&v0CS zbJXQOAK`%Ua_ft#CKXv~M~m^pblHG}<+yPLXzI?{sG6oZEJO-j1j=tu`O`-DP@VLN zZ;Dl(YTeQq(t4Lhh5Bli_RHD$# z(ZMsQKctpX@M5!g6@y9X(`T3;9^@|G>NQZ@2y`FGQ5zCd&(j+u^Zh4hYsE0cW~bAm zCSKjFMQanCVty@daYuy_6w8mD+M$f0V(Yw$G|!p3v?G7J(CQ!^q1WKXnvFPr)|%D< z8n{dpcRvV*@Ck_qTnFPBR45MON(xB!hkh<5NmcmSpYhSr2NtWx*8j;u3g1@{<&&-3 zX*t5grq_cyIIF|CSeWZW$qz9$WA~6NTa@x9GW`{wn!TlT6Wm==@Y|)t4-8al+Kd6K z%iN-aPrcoB#uodRq5AEI!7wQSu!zR;v_IJfZ0T!8k%2pqpRB;uwy?%L3emX2fP z>z}UWpSvy7F+*=VuxAgP1*V4$w17vKCc-&QRXVfy8d4yhG>PC@i^oI(_;ABYl{%*W_!_G)oo)lWIN7(sL7S>F9#>2 zIBW%Yn3NmT+^V)F;N2Vx*BA*!&#s=+qoRwMA@;tR20k}|XUZ=>LOQPEYCCK)GUC2r z3rsoTai6o!6AQ%c`eXJ)7I?e+n4c2Y@XDuk^V1LwM*t(W zJNzP5*f(n;4B^-OL(1g0d`vZddVH2Wha(sK2u z)hy!T3;+vVlg90#6UH&r^+gc77w-2W2ljf1ukzx`&{pz>sQp{g?Ln_hJUoWIB`t_f zB#+i(vKW`z&LgvbHBw=^{*jZ=I|FKVUual=mrwI4S&y?SJ$Bj!;f5?iukViHK>D-l zYZN(jhf&R7;ApZF;Qq#wq?9+!6l%b9D2;e)Vm{OGF1;O&;g8T>`8po61(!6*b)y~V zRY~W}u5N$CeGx~~o1ap-n~JrCxmP4c8Q=q&%h{0~J-ViU#|)-LFD%~DPA7)zQN_9( z&IyVi18Wj%NJ@vz?qgK$NUkz{#-_$fbGcqGrsT$u6|(o>o#Mk^>{b!P&hwmZ!1&?I zeWjn1to7R{S3NTKFV?-7q-$+= zhM>Vpf3)?Bgf%e><#uAVSJpzlxbxSQZPPR}NWfSA!L!oQiajjE9f^QJ3FS#Pkg$Om ztF?hOpk)J;KXx#s zFMK+GmbGu1h3GNQVRP(=jE}RA0MY6V^5Tmk*2-I1Q6u@rDF?RD;3SEm`yM6D5K~a& zmv4hq5i-MC$5{I{eT!2vA!Hby&uJqf<}8XzcDYbLR-nQmp(+}XhJt3%fto=P5T(^g zfKeA-GzTJx?p0HpzESF#W&8NH#g)dpDVU*uT(EAHLQO3hyCfRp5^oX9?WCZV7RI|% zn}}ymXju{m>@GB|=1`EPyH{yqD8| zNw_g$zz5wWB8qrpic6n{=v1$nzjI?RyFbOW0%@pdf1YGW1Mqdy>ir!18{4LwT2mZC zM!T)$W|h8(aWc3Iea8#z|_pyP2pzHVUYJP9EC?vl_UKtDptNJj{B+aU>nuIA<);zlfR7 zO(>PzVL)%)Iz_7#a*C*lC21Kes5pO=U`4%_UjXrgFSZ@B>9Y+W_O#&ktnI9(FDA?sX&IL{7cIBUV_8w->I!Uu)A_`2^YYH zYVF)E;*cnM&t~`c4B)L{W0PWbWi>Z5g0b1s#9bsG02YZjg35ourgVUhJE|LXmgb|h z1L9nTyZoT!Zj7E=xxj7ba`7rf>RPXynLi@2f3ppH2gyWH$lHT|w6Doqok3D&{O3$t zS<)0aI@gdf8u_@())%(~jxVkR4{@M&P2u-K+-fD5* zM^Ws(#BAJmOs#a7fIp)pOxJ0=%n{7!BMYJ&mBa|a-s23))D0e_Bl?Wly5QI|Su3Zb zjF#@0)Qp!|nZ^ZwsG1ZZP?#M4&O^jG6oInGj)lh`!s5^%lC3A=iG!fG9`RWK?W5vi zQ>5Kz4^CT!VyNXQv_p&#H z%bkTc&2G08tS-V5gsd4GsxdN&_Z+i)Gj$YAgymKGtR3ZlJSx#xfQ$iU4HEj4|DtRy zUmbtFv(a4f$yt5did$juE3s;Hz9FUWf`6xFaCC@NkqiF)r^Pc@b?SMw?4aWKTVfKS zZQ_z_7MU;oh60Q>%jR(K?1yv#Mo+(-+l=V_>rIn(w8V4gr%xfFL*lY)AHplRrAP{u z^_;B-Y8I1!0Z^8+W8I6s055QsVS{^-Dn{B|GNpfI@%gN172^w>@~wpX-O@OtV}3mp zJs2G^PM`oidv;20aKMTyiZh!Ri&G-)Z6oNV9aKk?4L$i$1SR=rjw+K@Eq-I)i z9?mq$yz4x|wcAYrai~bRpl(*?i)Dou$AtY z>r7-Od7{{labHSq$7`KbxUAu02iIZ7HAA1F1(LExB$GYZjmgCqb1Adyq!C}DN!T?F z!PlMLp$0FsWQST!5($-byyChBsSl5z!Vr|IlEC@_g6P7FRXw5ZE2>h>4Iy&9k0m>O zf;UTl=pOJ}FjdNgX%+12azR_=ybL!c`y5xvk!?!f#)(Jl6L#K#ftdl(_cDX~yzHp* z1^F^tN=6k2LBwinx&V>v)87Yk;Y`7_3bd>-qo;X5p$&R2q8h*Dr)yf5d@UPJc>}6rC^<<~1Hyu|;VZ;J1nk@|San}yCaj@S=g=?PTn&Upee?BI9#(y-C zAB52MxUsbd6o^%dM-EEd&7_s(emtbCQQVTuh(Zxy7U_LzuDVb-bqEd2%oR&F+V!M= z6-5-k@0e$hzKVunlryGv=Mr7d{}k%3-su-wZ2cu?AC+@3E)arhWtF>wyt(Nl`6-Kc z$Q?B}ShisNMVLfh(ioe;Df;JQ(6*Xy}p zuWF5UX?~z@1d}PCmO0rtBThaEqfgvvCThs#LH}Bpa}9Z7c$4qx-2w*7Rw{e zr|%@Bc7PE+PzAgQV4iz-N@#)W;q{CdVGow~;dIyBGCex0jYRh7=|yUSvdc}H=+#Ly zP0@@wAl3X2Thk6l?b3u(ODO9BPl!7sfo-w?A#!G&FS6y*P7KRSRO&#s>p+L-MNij*nXOn z%q_kKXZaRe8l74}^umz_w5PN_+gl;KQ;tt5E2?T@4D6cqYJTLUH%m5ua&*KCh9=!j z3C5d!u@O?FK*2Pu7Mj#^B-znNA+z>BM@D?9yr9H888UtR!tsUVpCp80b@e_h7aqH~cM`HZfyrOr5>Q~6#0{P%*nx#xF%FE%z8rXu1) z{5FEK^b`_(xa*E-U9P04y zUU?8luP74DTjyd(;n_G`SNn(8;IYlm0iLTWXa_K^mbUv5%W0C!?_2RELY8c}Q0}&- z!aIZ@wVe-Wm_WwQpf%*N7~*C#XB~nyiS7cDU%Sa_<7Q`nG95|i@3Q>WPrr&b*kEM+ zyIa~zk;v*T8yp>*O64fh!x#vG5ylD=CtZ|PIilnGys=^Pd~KCKCxX+ z&(uN=ZQJ(h7+llv$G7jK`%-~*X?=NYlf5>u3__hyh?8S~Sx>+2Wp}do#Dp=hw-(EG z2Auri6iAKgY_~Dc?MG2mh8({0XKWZ9ng!-5YM`cn{Ev{U7>G6O{p@xzCKX+5H}=8V zvZUq?(9#dVtp$jW*9hqQ?&`GhAsWaIe@Hy~B`Q^+G5 zG^5NFmw|F=P^MN_X4?CN^u*VW&9_W7%uJuSDrIy|UEWnTN0*ULPNCKp_{D@1Eh zNrU;w0QRacb07gK$zn763^-lScQa&P(z;o#K=#h@j9;P3Bsy7dXaU>RL{FGH8{P1$VI)kA}ta9F?e#?$BC!>`*C>g+KZwA?w3(69p`Y550Wd zp`xQRf1xIs2r?kV8&Cz(Kw(-yY{qxEDD_bh)KZ{zK#N7XXOVv#Y_owt9$Zw!SFhP%}`82mg;7!@Avu#N^c}9Xg(rtD%Ou#kniA3*#j?QvqL0 zf7*&$wx6&5L+1F<|x$&yM(YvDD zLRz0I#;Kk*RJSm;4uSVzC{W=v`tn<|=2f{8MVh9>pZD-!!g+>a!&rR-`xR6dl`CO> z<3XxpE*GQB<;#c3-0lH|i>k6L>a5OFe}s8o1rI3^!UcnT!~4LhGOyk%!n{MKuI3aq zSRcw3lP(E`ud2Oh7;q08-wi4geV}yC@Nu2#USHgP{UYoMwWRqFI;VxIj6c=^LcO#w z414MOP!U-VuM)k;h^pB?s#!sUR&*~08`)8|Y&cZzisio;=|qo&g5Xz24aLuo{LzYWPrWkh7ce0X zgQ`yJ1hY5KccX6FS=O8i=rb?7C4I$_2rh%r-(ciYc#n>Ran~ykO(WnzZxXk;X~SyC z{C6wT5y6?OHj1a3T{Jk~RC#N2e_QXE8?^J=H) zm1=#EOeQFZS)?b>Bn^>%J?B7s>k7dSy7hMnS59mnaD=^ftjA(}>Wzj)LEl<Htc9$Bk6v2QBviqaDy+!OGiy*=JLh{FP`InVUSPXdiYFY{r5 zd>ika_w>_$4D7)nf3P4MZ-#H5Xz|@oWd?+zy3AOmVI2h0z@M+@-WcH%E+Z`EQNhc| z_S4%C(=pxTwr^!6Zcum@sXFrsH8`d0SxbVdd-$e@u(Jj_ISOG}V$pIdFEj z8j$qG!VT!C$5>d?&bOx6OH;0gms5hpW=Q4M6YqcxaohP;8y>@lAa2Sic{u9l+{Te> zqx_+tT@)pm+II#-nWC>q_~`qDJJ9^cU|V%f_@dSJ`KegqefyW%Og}Z|fwXP#q&`w# z$>W#brVQUWfAhbNQ=&X5S(Ik4RebcIxF>|e6!Db_sFf9M77jw0@B$bWDKZm-bL#m) zLLv?9-bZj7Q);3FuSp4Lx46Pu3z3*SpAn@$abLb5V&zlj6JEoKf#*~qg-;F^>QA5x zOtbGSb2KV~(m!w!HIe=LMex>%`V$*|`R3hnrGee1e`Bo%*r^rRVcF&{Q{J#`D=GYm zqk^LKox|p_SY#n==kI@zQ$TT6zG$rMnV@okKO+Z6w(2kS+8Ifzx%cRt{_-&qJ5bki zMr@Vf`+|~@N0(w8%=CV5^I3)9WI^)%_E%xD$G~_`RtSJ&F-wrExZgdkjcuLj4kSU# zE=uD%fA7J@BK&C6h!);`Ap&v6PO^QK!cZgG`CdI9v^Fk@wrR!?~|_e>$Krks(=UKgiI}Z);OOkw#ykuE}6G zz=@;}z1$5cr=)$VoKNN6F_NfC=y!{~f($%MvQ}0?a6La43aKNVD)e4)Aliv->nk}f zKhKmgjC;gmj*>*Bq=b_OC$kGLkH=~veWToh$=W68UEGu4nGVq8m;ocopOG@1xm`_o&F1p4C;^`Q(3qST= ze~@8cL~4K44zL#(!M-^W&6wQiWAN25`w=D0a}k zT)q?dq!7f!b>B;VjoV=x6%?Viuaq6}1^H-{9@=Z1zXx?RtT>w0r&{rDM3X zkC}t-L>huDn=<@;nTkZ9`uD=H%CW6P%xbkC-LXvd{%p3$8wf!j911XqUs(+JDo{^9 z%^=bE5N+;kRB#xL%BYd8YqgK7f4%uWB09%IYjTh7aSMRfT?vy~-Y2+#CSGknv9qQp zCsl8ON{-H)dy28~ZuPD8qw#GR!D|kTvMi2!@XaTvZLr;Rk3q|Na+Nyeya8RYZ3S1@ zE)hazi)(XrMCe>D@WL|@2GIzCCVP2R zXG1jff;sHpsS5mv^QL&+Cc$!9d0A}kTKW39=w~>SQxp2p6Nko2fR^BGY@z9QnFwv1 zwA%3_W?5lpQcDfC2&^HTe^6JzF~Od;Ss7u=aM}2)J=qtGP!z9<{ViZ;Rl-Ht9f4<> z4&*IU>t`8l+a)}&fG-ol#g*{}Z&3@iG_o^$OjY+JhjUUNKDbi(L1aT6&wB6ng ziRSj#7>w{sGv6!9etubw%dz{x%Uf*L#k>cde-MMO5_tgmd*)$xe|hK1L<@}uhL?4} zj!ll&ZQ$Lf$0@tsaGXMBqU>E?%<^aCncFSho+wfp(eH8S20#A9(6s%5UvufX;8?979ZZiZTZBv)iSJ!Pq? zs;{msL{QZadCkc`f1dt)IR6k7?2QNQ^SQ3o%ev>=nbmi++BXz`J}waIau{5=Hq(XN zkn;_w3vToel}-+*;JJ8#M6-5yNhS=w(|R|5nIc9bwo;m87mG?Ipn`|;p#|I0Xy2U(|O8n-?BDNYeF{ULC_rIN!(%fC` zGpnMlyF3>-;RVU&l>>1stD#iN7s$LvU3f>Y2VIi}I*43RHXX+iDyZJ14JIOwS&Z8l zesWtNAppH#ned7@Ep6TSLuhwNNAWZ|6{eNakqDRDf1|$^K)l0wD>A^`p?0umOr z*ruv`ePI#_Z7WidW7*va<8`{`y3Nr}z}ahIYqCI3jR%_sgWu^MJ6vCG)QBBkQtOO% zjPQG2f6ccPFu~Yax!%(IkR^}*rvMhmJUNXZCAkK?kSDVWOw==mJUWZ)52fovJ9nv2 zx_hDoJ)BItA&zGs)C($O+^=$B5>B;lavH*QL)s2`0jK>V<=@ij>`Q~*FD>YX?c9dq zmr`{IurFp(>?p}9N!G%W zf0pk0*yNpaMdkfS6G^Aw*lFNsD^25xQ7xg}#+hUV!mV+3eq+N%58!~Tw3DaaqELIE%gdfrU7 zD7jC%_=d;9+(!bQD&CZY(&MMUopFwDfA3-?xY!Ddnw3&2`lps1Ot{}@>}6#qR)|4% zd06l~h+TtxD(9E`p}#wp!u!PgHbpl8(&=#`~(N-8MpAL>LXe?(l! ziTmMA;w&^+u#(Z2GrYJeUj#ww96gZ3RiFlS>FDre42^~!l^P>xX4k%@qWsNl+!Uv| zo-#@18Q#hVzC?2HUXw+tqyKrJncw}jV)?iOLzFqpD;{0Hs9vgIBRfJw#Jtn;LMg!2VT127B6GE3v@>e;icNS$Gnrq*+Sd3wYWQ4 z6wykW`O`ssk_KlrMR3hafY1+d$nMZECv5PaNM$J=huXEW_G>Sg(r&hzYM5mC*4<;~ zB+Za`nqkT&@pq10>Z8@!e>>Ir5aKOvtc>u&u5Rtq;^4U;$oKI?Ii)@7<_5e#@_J)> zMn$ZlFt*sU=>u<~7N5K7rWmS2i%!bBXEf2F4YlRpjxzmDWUcB5Lg|GmxW=D8be@w$ z3wMNmnh`8#pBP|d#muhpxM92wJ)XOHhc8o>@UVCXdQ>mc3t^d%f8`k9uD@IAex!(- zbEFb_oL7C!4ijO2*s9aJ6iEV$@Ul?mG^nJvHXx5Z|5-mF~gLq+I(M}A! z{r19WQ;Vb}+Jik_e~(&v{EhgzhAMYK9_ip4DL=_nN>Z~0TAmsFqI3^v*=lUp?=Iq9 zs&xGh&{fFh@Eq|ya`-z_n+8Ic4!-?|+v{sE=2k<9xP2OWYVi;^eY+fPVl^n{C+#QW z@gTTpzOV9!KysVrz_5n7d^_UCC+)2$2fK^r!JKUN6@~p2-Z`hDK`LhfzNe`BDT*y_(gnFhp)Qb9PH1SNkidT_OT$Oiu2=c@4hNS@!IsS~;P_|bS| zWwRwCzNu5;@9Cce20Zn*t>~l8vc+X2W7{+&Wy=JHSd;!p$d6TC%SNf*+EZZg*h;r% zz^V#=NmjGlUBz(ckVhwS4t-QkG8vUZ)fMM_VpSQ$fAmt@_~t^cm&j7RqCYXgohB$Q|iiT04huDWi`p=suUN@=B`XwjI1t_#2OWz zQMBm~G_lO1^c7rRe+{^~9Rh#T+uL{BEiF!gg~gEJFw>86Wk|)wm0gPg0e&-s4MjvO z{9#2Me^~X$8Ll_5VaY?7CfPYXJ%t8df--25hLX)$+j=hax2TA18P>P4^r4JDo}X=F z97@+TZ9HQZGiuxM$CO;yGUeSVqhRb8LnN_Pyt-Tb69&PG=;yl~>(VvT=z|@Y4_*T4 zJnV>Aj#GpQNuA&qPG7)R1$|2;c>q#Hyya`ie_iejayqfy#0zhb(??4JW8Um3~P0jf@^5`L&_O$SH+$_;YW)so;%|#^u75WZE2EU zfOGaAs02qnk*_EjVe3x%o)Jv8srMU32=(hh5jQZVkdct${wh2SOKn=iI3fK|t9-d- ze|F6EC^H8SSP`C+dF1Lj&Y7b4sPs|3vk=*Eh<;TOvfb5dSE|jj8W6*0Q`kly&zn0P z0d#bY&}CXkAt6JqApmiOn(w6bzmz~Toi#WEoxr%2Xv{sOp~=|mY8|wE)Y)vdi9Y6$ z_4*@G;8&6P%`>}Vy3dXz+}Lc&vSw*Nf4Csp*51Gyh%b?l>k#XlqAf)F;9ub>d_;b= z5-8ioWL+& zh$0A%*!i^-{>#5A?wW+eSdsF^%^ zOT4Plq{i3-oB9G}maGc^+iwnse@D{N2GqDqxcAU%%e_Bn@)(Bm#2|9@C4Eg@VZ%r# zJrp&6bBH&8J;~WQgClu4!7Fbc9q^7eRha!y5qbMj`MO-Ad_$T^3=I{D2)=EyyD3hs zvD2vR&z#?4(oIwVpGJ%Bfz?3f9resu0yYe zws$lylQXGmdh2lcuXkTQn)hP+AQ2nY{BKZ|DBucK&g9t-m3Gp~1o@m4F_33#oFDd9 zuNfA6<2PkdTo@i*6 zG3?l^tV{L3C^8+kVM%BqRYob`BbyDv`0-NL zR#dPS3)m^1kXAtlX{v66yXmJ1wn_G!677QT)0DeW+sRBj(Yf_Pf7nLMf<19zKO?&4 zrVx8IWwraNG*c#^jsy~%r~KM>Kq<9&1%gjoqeJJz#5FHTSku4u3_9@6^)R5MDBB>> zJrL9mDlTg|x0$g?U!FQgx-354A;-Ml;i=(WjAO#HM!sGW?(0V1SLoF^ZaU<8Yrvj% zuJs>i8;?Y$HkLVve|a*kXE&&PwA`rET%SENUdl@=t&%lRNWxPH(fMo+;$p+SYz4G;pZ*d$f7ue z7>`bn{0oKSlzx1mMz2LdW;n|$G1~Rk^zQ8jVxd9|O}fI6f50Vd*-F|?(3AphO=$?l zgz6G%AYhxSwq_!GBRg(CKFxJZ`0jPOoD36>WpI5bKOhU?(z}6(mWMHeb7G1==_0R- zImW3vqfl`c0irg{+I+0BBI18K^rrUGM_My;chbW-C=up4@h_rs*h&ra4!ZtMm;09U zP@wvp78l`1fAjM2Kuu-Z_&cy*q>zx2p~5?vx8)M`=fzBy;rt1?x`>DaGjfT-TBD)W z0%xhfoMHPbpY`N%roS@W5=5{%ruN}+pY+6xXl?^;u~o+hz`)Eqh{|u=93P?y@0OE( zmaRH+=Uw`?jwo`g7WtU%f0MOBL~+L$DQY&*8kB(l!Lth` zHwkza%_R6eOa2Jo^xzUPEA@arMax({DxB4^w!t@^q-TBMM>4=ewqay%zG4>UQ*qM# zVObui`BG%-o3DbF8mIwJo*(I!)=pb{?F4g;)h6L$^ z!3fQfLJ@v!n}s(&Hu$q%H%0$E3TH=7Qc&mhe>33>%qCYy4BwQ$L_k$-)N)mkiy*2K zeqXd?)+ti~A7{%v=A9F(8>{-!hyJterVhq~UjT}cV;s{3r969XZZ`?SMd}ZoaGg)z z4sLRo-FJq-+b8{uE!uoqtKZSyIgzJKh-npj^P_P^g%{Ku<0`Y z341u(QnM&R45~O+ieuRPby-sTjG>RkfPPl4=y~L7&Sj!xgWUGY zazE$17&{TI>xmn)YrM(~7!HiUV68TQLf@Fvfr|?Ld@P&ZSd20Iw3F!n$U+wx+i)V- zYzTNj+l1&j+v9_0b7b-(rU{@o{*9UrGM|nu|`<9qd>L-37darS?KnP7**Fgn|4RV|bVXtU( zT?rkFE=tclu|B!gO@dV@kJQUAfB13CjmQz0xJy-p`l!0gi?M#QdxuF6T$cudaJS3C zxDvEJ7Idp&UWv5!iD>dWTyS3>l`+fhoaH^vzA>4FR^%MIcki6J?C73lYoU&Or=*~Y zl8m8TpP)p59+-TdG@7>jwxOXDe5itfaBHmKg{_bYcMEOq!19BUpR6Y}f2&SaYI;FP zoa*$|2i3v+%`|WDpeHq|6}g?3SN-H?=vLBh_lNxikF^%5=WY(7Yvu+bdrYdZQ`(PY z=vf{32i|ES^=eqBpmaFvj1PbpH?qw~)#ZD%1-E}Cs;|RPt1PSAE<6If_v78WSd|9#k$fFB8TI@0{=yIW)KvD=2C3?4xrY(BlamwYI^V2Y+M?Jkn*MK4 zYXdQdi<6V2zp}05_($us_&=B)AhK&b~s1 zGT*crr3w|w3`&6bXVIe71(+PC8EoYB{2qqQ6YNyze>qF<$SOsWs6Y&Mkb0cAMzo^X zQx#U*tOMnrUBky>O&?i+O=0ae*Z#?us>SJsq;+w>(j#=L@))0{g%59vkCbT7>4$9m z=2^IKh|D9FGSAt#CaDOtf}gctcla1kOEeSUgC)|{p?~_vn2&ZnBwL(t`npJ|9M4SP z62#53e-_?Mg!JGbHyr|Qi_VNQP0W__1=WYcIi-jyAcj#atm^B3;V{2oyw9Wi^-+gF z^=q#p*ar}hPV^`bWmK6{Sq^wWoJ;-uevR6~?GC+I@Pnj^T$BxyEB&c4_tEkO3WJ2} zJ74gr=r)7DupIaz{IZ68a?yn!GQp$dsy)_Oe=lelyHI-6fu-b4k3&W=iE|ODmT45f zq#~olPvC?HYsXBVq;cy~J)jA}1S(36H<_Vh8PYz@Q0i0o9~}ir(T~fSL$=1Bm^Q;! z?kOTQtQ5OYlf}dYJr>Xw9Ttw&G_Z#Z$3}@``+f%}jgd>tDXAH~5dD2ooqtL;r+*|U zr`@_0QBL2tQ;zOfKo@`J<$Y=u`edUizBZPs`G(V(4@mT(A)LOWCNGJoqb<|?Sm-Q_ zrM5ta`Bk8g#gT^(c^g@3T_8NQ7zue=f00X$#$olPhNXJ>Xj8uTlj~P&=OFhI&O3s~ zDqGKR&?X7${_RuV!(i9C$JgR?jGr=kj*@PHiErU@KfpJ%6oKy(_ZI^texH=+lbO35 z(WenRd%x|FYe4&`lS|Aow7Ms?UfMR)ht0;~c=Bbim77lAwaq?Uej9d)I!g=?xV`Ej!-^M6*&w9UWJM z-%zWcP$I?rN#3dyVFy2j-NMWFl&?t9sN7v=AwgGVyZ8OUuL+d{-e-xcjUxyHKO2F@1EvIo_G$!x}32}ncenF3*ndIBB13rRwkMtGT#lP z*a~fj?c}H=mpo9y{{wNlG_#k%kpmQ$l;r{!w>@tIm?D?N7y}lU>yZNw12Ho=mr&{h z6a_LdIX5|zu@)zPthZxyWo@@699tDTJGLvfZQHhOR%}}p+qP|+72C;I&-?c2)8l;I zf4a|)J;u5xu6a$|bFEEED6d2-U~Fe-B5G&rOv^~ezzLAGurYLTQna&?wd0VcRWvbk z0sNJ-z>ty(Ihq(aTiDqO8#tSA0@O^50m3Fm0462?BL@e62Mj4d$j;uw(ZbB!89*-`+W(y$u``~I~ZD(&|V(a`D;{V!F$;1TUY;FQDwXik; z2+7H7NXUu-D8yt{0AeP#CXNQy0C^WfYYQWQw1tt0t&<5Qz|_tWVEyj{z{t+l*y5km zoap{y2{-|N3;<5{CPo&2-Avq#Ozi(r(E#jC9BnL|oc=xoESvyljs~{Qe{0}u2e7a; zvUV~4hrnOCsolQ_**n_(wXpfC`wJ#-=j7~U4cY@=r?t(*1?`t93T8uyq1Bo47mw6U)$l1Ym68WN&TY@i+EgFndRff6;Jp zvamJ#PX;sqM-wvxM`LRfC#SzKf3g3m&VS|!_+PR&u(!AN_?NfczpVZz2McE>6KhjC z7)GYQF^!!6#x}FCg`xjvRwQgq?Es7n|CSrO*#C#l)x_~%1)}(8W+?xXFfg{Wwe|oQ zo0!6X(97C6{|yPC_`mBi-G5(`{~KET-_qd!miGR?HTS>v=zqDy|F8G?ze0<;SX;{) z*!&%UfA1K;-z8&U3;4Td0MdYe7LB!mgsD-~*#G7BKeCar zGyb24e_#X!?c4!gw2Z9m09qz?#=rOPFCh-5pFaPakpBW={LizDfwQB9J3#Ai-VBU? z|H}S<{QmQ#^Iu>@Y>n)U{}~-6X9HW~zti?V1^=jxTpS($Hu+x*;BVIdasJobo0zzp z7{RP9+Zk~MTc%~EJJ(|54o?be_4hJ@4u{zPZcr{N@UOP(@kqAU`*;nvmi>!l<`Y4cI_cwg{xmuLh^`i6+m?kTO z>e1e$f}(E82L#@92eTv8^)sbEv1@@pD#?>Qg0E3(eJolhQX>#@ZQ-ADvc%KpC-T9u zk>R19TkyU^9O|4{Xi_c%4BzBGgh|dG`i>6`Mql7>u53<~OIa;y)jtwd+&poA-j`hn zNFHN$Q5e%NneolO1%MA2_?Hc1rQEKUlZS ztTIAm-TvTjR{R#$hL2umRR0-yfONq?hM$sUwP!?1>U_a#uN6f|#)Y@Y9b&t%Q>PlQFo znxV!<8m-7v?cEBTtaiba%$^9={Uk2DOu*CiPxO5W{Y!p?hz&@r;p(2B^vBdDq|iHvsvk&Fh1+Icn|&l1 zsr>=8x2tRBQe0kc6&mq>K^OkgXRu3elUFh@hQ?g6wtYjo{pO4-MAk-1oOzL<)u>T5 zo>~eRFpBaNZ!_Zke_&cv2?a@ z6^jj$O+aX=UWj|0lPc1at9y_=D&u2;JhK3hJfNB5K^;jL@m}D6vPkWviUph9|FWUPj=lGthMIyDM5}luj*C!@am^6vy+~!y9N5sy(j^XyVwmg-aboe zXxH-f*vw_nQaS1$|=5G=63VRzb zB|E)OB@h78{xcIZo=i=Lt>iV#&w;V#wvB@8Joj~gIlt^~1o%M9xGM>rE6x3Pk2 z`WIN?k5>Wc;1%UU`CNt74B2PCH@{r2$yNArn4i0Ud(g-&zwE*FJxE;w*=D=A5-L+H z>hd>lb8kZBg3A(nyzfl$a5w_qhYmjnid$e;GN)OFKR#eI$AKV(xO)2lki02dlBaec zMEW0JKXMmMw7G6z52M6j;X_XdYsOI#k9!z{Y!oh2gdF7ud66CcKtR$_*s{c4uFMRaLWn}?8RQ4!e`9Y?4K z(%&9en>%FUr^Z7_XJIqWnkkioIe!Kd^qjlW?WV3`A^5jFT)YU|Pm7CjgKR|Ams5v- z@B<&m1zM4enAboCCTgsy>l$;wk#3_@>VZUm(aTkdWJ?H{cy0yL-!IRhvNJSze=Bp& zH0#vmLx|40QuD(~P(+D?Di(DnB8t%`?u+ebt%U%9yXer5un(?pmGUERC~4+(t1~dH z;}u>9FZ`Nde}UM=BLk8d3iXCj6`2M+mXwnDXl9n0Gi%i2`Kgbnq+wC?={RUp))zZ} zwKe5yhbS#i#rjQeD+j4At?bAiBm&1{#?pv z27OHwI=(2ue+_VJSh>+cY2OUdfFRsfC3Obq(*!<9V(*~bsStGh+oRg z0^JpWLBngl80;KC`{I)g&gqzs#?WBfX4mvFQ@5qhlw}mPCVgny_ra^lxz{O24N|?< z6eNPi7rT3Sy-{&_FeWXmUMB-i5aLv?_XJW_)PoEj;&11=38gQ-ZQA^269SZfAQ2i) zc#>?PaQ8ue0I@npPT)g-kloN{0eUY8MfrI!U;npI1Pg~sAZv*4hskr}aF3D{YTM$) zVskeA(I@(r)Mvk8&G?0V;u6_=Xpi_5++-edl3IlE_ZYK!1CJ(qR}L3#_2E3Vu!j_XObIuc$&87ld0-{akJj1P7jteGQHe*11(Q|NCv!SS z##5QwQ`MWGw02X*x3S6b_IeYg;Hoi)TCNi1-$r}5A5-c$BMJxQ%nd`C;TUypF>r#& z*Q%bt2nF*MV#ihi1c5ivo-o_T!0x|a>axxY1?PkT>a{PE#-sz1XEe}%RS0I%c;Ys4 zYn>evRJm8@$utlG@z9IjFw+(D_7n-uoZ5hO%K-O?q`kMo16l}VF(Rb3v+LAH029dC zkK4syRi0UGasF;t$!5I)x8AgKq{L>YTECygd5gEU7zCN(!>J6=BcVAfZ0}PqRV45` z;LP7NDTF+2foU$Z>%38a2x%gyg-TGcKjpqlqx>}{*ZL!mhdkzn_EAr}yRi@XSEqBB z9Ol{R8g!OLNor!CQCx(q32N$;fy8s-5&j593KRe`NkZ6+V&|k%v#P&MVPb2b*qvl8 zaQdv}S-409(v-t*P9V^3_d8ED@>q7DfEZkckaB-T`%Vq&E55jYp_>&dd)wd5bqA@K zj%zR3r7;LwtD9upOjlhBvt-0AbP1+%9u#x-$HFwOPEhhB!}bh)wA^aG4LpPyK-NbJp_;1?^%03Y9_z`z7y3kP9qyOqyu}uVNRQcgtan!Q3?ADqF z)A~?xtM=o|3`aJ9mC*Pe9*lE`xdaStA7q#?kZ%q|WTS4w1se3*q`4?Emw~^~A6d1g z7RL9Q-co!x4QZe`J*&<_4@&nLv2}eRaeECsr|Nq)jiYvzAm{lEFKO7;o3b?rA3k#Z z$$C{Sw7(Kg7{+ch8|&0~c4Zo95)>091vDCWtc_J!WG1|S)q*06IIl^klB)IXnp>A0 zv2oB5;+xN!&J7XUFPV66tNB+Fp9r?hjIuBu9jzAo%i=dy>ae0TwIohD$#%|Gv*Xc> z@zG0G0VQQn_7OA~K4N$K=BRIR#`RmK!bw)EQuPx4YyO4mGk7<)htbGxp%(y{z(W|(=Lk@kMFy-;# z9fh2dM;wj8$gDCqn>83~M|6@I_=`+4g5+|3TZO5A_h?xNNi}AeRdu4y1|#6dZEn&_ zml5f&8pPJo_RcUKMmd6~E5)H(bVl%DD1uazBaWILp1yaLHxKp7%r;(XLxUa%)(S~V z6;TP$m@>%Eqv=%naO(h5qY~p8ylI}~7e8z{kQ->s?*;xluTfc#OYeYI@VDK}RR^Dt z#lii5GXanj@=fTwjC+-4GZ!mEOcM{Uv;;utrE$+_jTXlr2JVf330hFt=RQIUeq;ks zW{}=MtAkgZriG}a%VRhneB1Y%;`0p062#y(06Uhh_Mtnw33n)A`e5 zhS}VB9Mm#7S*%C>xC5ycEd+ipqci!iZBQb#dxC{!H+?69P??tW9bQtGQ^%-6ze_iN zjz6rDY^Xiz&+bd6Eq{C(&dA8$pI;;i*>vIZoM@)ZC=P%QeLs5$PVMJnHglKc{NZ1^ zFkHFP?1sN43@LENL}*2~mAIT)96NT!Dc==H0qd5w;2&Q& zt;Mt5pkwC3fEff2M|lzYK11f1zR&4@x$u_{yWE4|1I&|j%h~ez_Rj#Yz~85OREO9R z<+jtg+NuBtwy`1`@;>S;x!_7tdN&DMn~9})2=(t=Nh?jH27G4NBQ9Y7xVS(6@j)Sy z3;}k88f|Rekt^&r4pATB!wDYqQmwNa89vZ@dgA7kXThD^J*icXM?BF|uF(sBy@+fQ z2RxFak=ENsP!v87-%8>s{+pd)*M~fl52bMDjt7mE4C{^QX&FWrG5a0dV_I0THe$l2 z-8+Z+RhJhz+Zh@g0=k>GZ;c!WjQ+%XNZQl#5s4}RdPX$XgA4!}^rc z5KP5mFcM7_Hs!}72^cW_^_~6rHVoOxkXNDjsr$R8!GgHQWntALE&3_syVBjVyW%PB zhpuT@KefRsYO$$qA(uoA3lfRCnb}_TaP$WWY;`}(VtMf`yUsl`9rX@>!js31WQmBf zw`@hiuYtRKCCZJ?iyy{n^7xue{AMrCI17OAG|e$ez0w4V*tyFq|MWA)d47`t&VV9W zDMR3@nD;vW*fn7hxQdHkI|An$Z+&zFuQ*=2M>^RPb5ev72zQ#(ZY=nMZtEq6&m{M3 zFqKUl&U)q?j_xB|C8NuKJmglG`G@WsQjfwo_$mz!lq;Jz;)*~4`PB?x`mSb4OMWp# zsD@&>0IB3!+|MZm6fpt_Tsm%Z^o$owDI48!DGlfMAg06E`}fP_Wq`3oA~Jp=?!Ps5BOy-!4XfEm;XnUu*T_anENH ztLlN1xb$4Fa*Dy8n_tOGujf3_W%kH+g55YG@Az-u$0B3xOY16--wbR81TfRLUY!U7 zuhT42Zf}s6l-xH>ju7!kr7&MSaY>~*tI4n!a@Dl7O%scug zUhJ_V(PmRB3aJc#Ik;}K<3Vq|mzxf6zGC(CU0IZ;0HR9MWksFBRZ0DG-W80WioS3{?ReuNU0qsEBA<{3JKTMk2M5Dslg8qG6{@-o;l; zultQN$&F=8Aq*b4cP7^X}V=M!LQl|x1amqzgqUhFik-Q8iSDIqkFHix>9}I-=4T$aYl^Z}cYkUg;F@(BOfwGdx zmNDBH?>8I^?Zm7Xk`vqJ2fyAn*`F3lNo3l%VYyy^4=xOU%#E~*?w=QZmU6@Ol98frv#OSUBxYGeJs`de$}L;u*?VALZuI+l zctcVk*xt$#HA0p=zs&U51TuPYOvIj`bH)Wf1cr#=LCm0@|DrUn8O5o(^#TiK@Mft0B;62@|d_~FA& zaPfVsp>p^=O_EQSj=?|IX~tq<=J5^Y%YJ`d(K=FmjlLqmRf+t1odjo_q5lm+ackLM zyk8WZ4-;$(P_Oz!;VH*d?|hqG$7Df&Q9@W~-%tZSYBq6DRjgC3zv`0`y9MqDJAgHZ zL}}-a`}X6H4t!h~=yYuQRn&zu=M&<68P8r;A^YU2;^k=+dEH6(LP$IO6rAOB?k*>V zJ3PDOVO$kO-DE~R3XjL~4Z|7%Zi;VPow=~Hf+t>{+22p))%zFM28iin*}*t}#fJjG z{u{QG5qGmj?0~>d&@W@z-uJnyO1)vI@Xnb9zoZrEHA#DQB6Z9Puo#CX9Ik3Af=;>Y zmY$N3`c{Ras_5k8i3Kd}ty6J=>2ElGeb-MsA7DG7L&KiO-*UKIp12D4jz+Hx)O<2^ zU6wvStaVPnO{Tk5piLy>O#(iD;qDRfmS_h6azS^fQ0o*4=V$vJj#cWN1(%IY??{w= zcBhLMZL;xl1kz zM;wfCTpPB)5|a3~hJjK|A+E8@c~#F(+ROAL%3yLwUv&9 z)jGR5J5BHzt5Fnt1ZM1{gigM9e?3JJE%2t zTcp!pO#p_~;G%sF#hW|t$Q!rkTF9@`i$pA17Fdl`fLemti;EY$edNp;3WraZVQDOa zBq9kTu-$&r*Nx>k@)dc zeL$ipj2M!+Ec0x~4@py;U`i5pW?dI9?cuF|mR>qWT7>e*|)0JI5K9h&S-Q*v>M%yG{gh)*e=Sjbk1l|aL%qd|TPi@K zO~ss#d_9BEUpHS`&=*7f4eDGqfg@qSA{IR^{%5mCezsNcrS2#DgA(FYw(u6V{nn4e zCXnS4Fj>#4t|yz00$d6hrSG@xP(BkJ^12TTkA5qxwym@hB4g$xo^-O)-h(NX8ws+u zo%v&zNCq{>f5mY#Cg$o3&%v|O9e#CCS8pQ!L4>*WlDxwj4E;nr$YqBUZp z!!Z?o@4dRmI)51Q`-iGx0S%)`oL(cX?uS$4aa{y=f0i&FFiF&F!v5NJJ5-dF6n?Gw zuN0s))Ksu@ktD7gPkwWh_Ny|y`-SyD21xv8+#7ZfMB{<0J0#*<4Zhd(X|^%S&Hy*PXVuNpmF?eqHVKOrvrU|;#XHI^P3SDACRyF zQ(FCZh1>7UC)G!vW!%8hCHlua=13m#^Rkt~kjO<~%R@Fe=^yi-M6KctLt~xM`e^6M zHT`Wum(%I^yttJLchX^l&iA2K&d9>@Z}G*Ue;*OXmUEuEhk&6r839J$oAlMTg)9~u_I=8?|bOXKW`MZw9_ ze*_A(SanOSp`?3iQeF3Z40J(WBhmqIE~o64te@&Q34xtVCq9iDn%58AueAJ^jXk7} zS7xh%-f7Wf`>VbmI*vLy5&F0U#yvQ`xv<#j4ot*P* zTM803QfebQ$yh|U`w(`G;I|##!ORV_eGCol5FLa~HQKNCBC~<+)OkZ&38&R#T>0pg z?4zCS%{V_cy_VtpD68NK+QLik?$yfHuEy)Eu{%Q62b6oFT$liOJF|VH<>rgZf0f*` zcG3^*Ua7a<^&5rmPT|boX@&<-*dM?ui*@lz)^E=-`Z)asO(V?%_+y#{9fcNd{It^!vV*CA=EQd`A23h^HyLxK@JaD$O47m#|@_3luaj zu!N7@DNraq#MX>fY8;3Gb=<23*xT5=XTO3wqe^%*9uVxSO zi??va*=tRMp+u@gkF$lC(fCuR9e90U(A(;t&ie`)Bqthy^?5Q|iB`LhiR96F`bGr9 z3fP!(IfsN?U2pgDxnEh9pu~qg5$`%W zkxLmRcdj8tUS-=*nj7>kf3UfK=1UdSpVbK_9_T&;Y3Z+m5ZX2K4n9IAdt??CVVF?RbC>L%4UW=uqc25r$NrtP`Ij+ z=IsJgr!`D;VncJUvgLrC4ZrLJ7-4IC_Kx7u*yrGfHq!~!K1f@xf9Nzs3!y2;eVU*F zLq1ctVk{42G#3e7QR|NkMh(lRoe&B|z`|9`g37&E@t8kHXTC*q+stxAM}6;-WMlI@ z!q4S)@}A^~XK$LR0Hq#@oRhhHQpk64l*jQ)8(eSBK!kj9rnQxwF$lqn{Z|G0kgVJe zM6+6veDCqhD!52&e=G8tlb@uezdj|L>*gv0;g!E6RcSrT*?sx90B${j*~5v1D5qtR zUS-TCm7#S!L`fC#I~Ntqd*myrNZW|CFih_#wGG+tbG0XbOu5~4+vi?-w{)C!noQ6$ zZT9-Ybygyo{OsUB6TSP)Lu$|Wao{d^jUPOX39r-){VJ6`e-6(AnB`@I$6ti^qFB7Y zSWMP$`bt#MT`uFG$1C`~g1ND>I6j8jq z1uekQ?OIuGTE4j(>BQubOnR-49tYP%MGzsS7zS++)G5TdGbf56&7O$1MxQ6L3`F`- zntvgwPQMGmfA5}00a3X@XhKCTw(BxEB*i575 zVmjNBWC84?{A!x?iI|?exzJqw1yL56Ha-Iz@1o+uuc~7#f3zU3Pq%aBbU+rZj`VT} zRXnZf$vwXj5=Wasx^i;dMbVD|K2ffAPkEg30#r=8Ay}{3uqRO6KfkbI~)hpa1rPCU9@1jJ#Pm5J^ zhT8>ZKB7xBeJ3aL8FfSvp`Nx$NN_@`k7HwYoJ~NB^W4Q@(iy*zDYiYNfH7Q0iXG=& zi5N9Ze^&TzgLGAaJ@#)G>EEL~YXsJUhIhm-Z-qT(p$OCLcKh}~(uB(;!iNi~IQ8Lk z2~F)}rqQxTMo2Nn_fR@oVCUE2I3^x@4kNLCfjbOCk$_N_t=4{zo=TJ&Wd|xgwUMBz zYrWWO(v2;bh!m>h?=KIHQUtlUZ#y(vjIhFVe*xw1a;Q4!6rK6V@)x#adK6I-ZxyAK zT1H4Fw1-hhB)_lJUP3XAv)u41eA8Q7rBR!S_a9zbv1s;=)>mC=dJa!Kw%3kUFStOr z=hpSV1S)jGErCCH-EK{AIE87jcQe8RF)xmAFOO-uPGOWJ{7Oj+$2jGe+xBt-SMOEb zf7{O{m0}=qCC1GBG;yuGo4SXv<@ijcwv^HwNwm3 z^-6|rX6_35!WXIcL1z3(jDI_v6kDpJfA~8gv`EZ_a57ilO%Qd#iGd{MtE#lxV~<&y2fZQ8y~srbbF2AdzUH{G@_(CxY!PVO1UR(N}kNf5FhH zP6R?&tkMP>Z3YjUEp_HpuSrX_65=>FLnAH2Nr8sNf3ix{_@`>QzS0ljLM{l?Up+vx z_~A0SU=xa%gsF`9^?69$n1lB5(zi=Q$h?L=K+sNZq%i?Ahg-9i7KKuJ%KGYfOhNb!=-a7-qIqG-rHDTHMC(bBd6&z0T$%QyQ+<5RHI2qp?OcRZbvX9w*kJGbR z&lpQF%MCBE;3 zpFlqHiQ7$LA5Up5UN{$|Qe|p{FLhhNl#DB|==$RrXf5@uNl9}f0w75FZW-$d+0+;Q zr1kp{Lr_85O_fiPJjv@b?V0FL=2uP>%Yy7|} z_7aE0p&&aS80HM@_-XzYf2w*uP|WsUk^<@tA=NwZ{C28zT?0TBc5VxyU?|L{5MvZY zsBZ)_p|3JODXAL<1BP82Is(NC>ID_||CmJz5nQhrdFJZluG8>eCyB&0$5i2W1s5hg zxCha&PO&icOrrGHa{*`i9blUZK{s8%qRE5Puz9n9g4a8NRzw0@e-W`+M=@(fwj*Sz z$OFHx-z5oZHb^Xlh!aSWW(T0Jk3X*+sY}CoQAg0sA zw`agF2H;$E{BGTEF(V2m3m*G2k( z(@e7&QYRlE6dQ;vf6CDgBb3cPF9Qg7b;wBCw3@w4t%5tzMKB$>I_43OR^xXCXzDqPT9Q-qAeoX_(%GzxpE>V0RdDoK3X6@8ZhN)?SZYRK3 z%x|m9YN~j;nLP$r0n*nUx(1X_9)ACx6(Zz7Dl`7lU@>F%q&aRTpi`umfrjbppv9*A zeO0{DY;#=Ff9I(5K))i-9YzY$8y0_;;m+84!~VUfo1X!d1cBTrxyXmhe7;LitKV|u zQ)9k&64C#r6b%|i>~a$nZKf%|GMiTi9^!vbiRLq?KVp!zE>-y^nQBm7!0hs@PV5#n zsI>UQIvJ07oqQ0yERhU~=oqtwfPN{Y&0Nz{0UC|)NMu%)9-NGm79@7`smoil>cim?$pG1$0}MhTi1}OzM8y`D&C} zN=YN?mL{qj4tx}TP286s9tyX$n)z&WE>YN4BXXw_w!>u-SIanWYpt<1y8CfVL&nc& z>mEZAfBL}aj0(RpOjhbyS#E$x-oJXNNh@KEF(XXBet)cZpCX#6mYQH9Ha>~8GGGvyb|E|4;D-+Eq-jf zV^+`#{DgoZb552TEg!>?nc{466B~OVqL83{;ooD1VWA zqMug6sgRv8-E+Be*xdzAMCvkPoY=pbGxg9sG$TKq4aFtfGCYeA-dNLxyPxLn(-}Vt ze=lw&C%A-lt}jfl8W&yxM|v@|HHXoRileBA7frkn_XPdwUe;BV7n%Uz)Od6nm6hf~ zMIOTR;Q*=v0?ZR4aT`ZgMQ$A#mIyKj@UwI~4JybAR~I(;^EPJM2A**NgF;_F=2YqA z!JR~P<~9N5Pt9=1<|5x~h4{8gdg|m~e;vBvdIW+o+*5k$7I27>LPf8$gfDjQOnI%VW$&r2hCZ}m0FOK;rEek^t66=0&l zke~M^=e93Kr6?ltK2tzmXhmgKJZDLpN?Qrh$g-z9Bo7~Ak zIa;#jxpODCUCy@Ada0MZ4-^+-yF6YM4Y$4he3@GB{hYd}I6&MlC`-1U1izDdm6Lvm z6|#2gii&2Yg`J!Ovsv^$me;{KfcIc`UQEaTG(eKUJk?Zc;Up-t6;Ct_f8u_RI{Y1u ze)6=25{bPSeOCC`w8L^w7ilskx9i0vCqtoxQ~O7z7Yh^WD%Bs=jw3Snl=4T01#!i7W3h8h^y^hzva32)3|QIW0Q`lGPMq-siDa;?F6a<>%^kZ9e`)V$hkePeH7v)%2da&yh@O_+*I`{Z`;tV3gXidoNgNYh zao;~J#ss}q0b;Vu9=TCqGLEwDXx6L6noQeKHJ7Xy7{lb+oeIX@-%i8VfjQ0KyXZb7 z;8g2ODC4@Fc`qA6-i+2gBEGRo)kubLqbt8BdO$wSPa5OFRVs>I33hRGdXA#JooH^yLVV)7H$}nok|HzYFY~2 z=74))JN)FS9K`M1L}0i(v6*lq!Xr=D%rYg{7mx<#=NCFe3CemIvr$04Z-l?b?h1P% zb{%w8j#wnr1(2nAgC9hXK8wnr;i!#yhw-RmaHzpEKv6IjgrmbOjftj)jCM66jLKDnK+*n~c%C5w=qi@f1_*N!ThEbu+)$yTVc&w&hZ*qZerP$1@ViFnoAW1e^A_H(w^v+@F$;QC^Bwtcs?x{v73aY8&oY1 zS@^EKGWLaQe*j=Y4Rf_5fkUW)|bwwfmbevc#t_&X{?;IF~o@^Q9Jx^enUl z?VK3s=?J_^wHQ}Y96gSdSUQug;^QBKfCj#%AO=`@e{Xy3Z9vw_Gj3W7y-dpbIyGKr zbUn9Uz#dlL6H;vlIGz7QUFwc>JPbt3gONUr?d}RageO^@at1u==j7r`FP(Nhz0gu4 z@1^O5pJUkuV0~6U-Q;Xz>VZ#Kvka{T(G11J`KTd1&g_xzYDTY#<6EL|S!eW}iS|ge z9jytmf3P4SDi$SAjjB`cUlI6OoE?JU86L|BkBwm)$F1hNu#5xDGNmPq+AKisOGQ{| zR_`Ex9Wi_~l00RrFz9dLx?>(g!RRTxRP`kY6*{v{GqZ`SEo4~aDW30evFxrn5Xka} zFN+RBqR4qbouHx)zmFQYIESK-$s~mxJojtbf6&2DZ$}}yQWLqCgA~$1otv$i%X~?s zV3>nc^r=k^-=8VQN9n`nqoT++M~FMDvq$>9mdCqel_fO&xa(?!KPNN^)dAPTi_BN337AQ81>ham2SN}C8`V=3O;mgvUf^V3q7l6eF(L((OhY=lhlEG(K+5aH8?qt@pa7LZOl>| zJvlt!_Gcp`8ch%M-6EEEF}n6|E|&wzpEGg-c#ZtJ>iuy*tMf|5haL$EAerrHFgbWaKe2XrSe^L-rkB9DNvClGYCKF`2)qB!HU}omYuq^J0 z=YotyVrl) zjv|t<-7|y}Vxb?DipipGQVhyK2bm%W`&szY4*~U5{k0t1fV|f=o;$bh5Gm`uacRy| z!Vmpc(q_Me^5$}$U9gyQ%S|^$y}(y~e$3*fBiBlqXJx(f%^tR6nyK$Yi_x_se%sn{ zID_KD>=d1}FQo$H6$2j(W-2#=HBTm4jk960Qf54Z{|2gHfZ6V?%a6l2@8i};jbw*N$%QKo7@u+?m^z=a= zM(_%8>(Q$w5V_n&g0#^N*;>SgiB4f2PCE=YLwq$2eBJ1(;hDs9n|OQ6Y1}4 zSk>@cdUfTLn=+1f0mGNL?Hf!YzO!Z8*PRrx$6d?2P?A2HM}I6Vf6SJ?c-_g|@IItE zH!bO3l#mH>KhRw)!CL5<>jJ*yms;?!7cdwaB0Q~*8oeH#+)wf_RO()#WK2O9-xP-X zfykanW|e=;$kNV{EFhcB0hI8H$(#s<7}Q{-cp8n-6e*?H?(?ZAyHEWdG~!?oaZ4wN zZOPLYuZRU0#gFDjfB)^@QA|Wu!cyNoaMEOu5{9x6B=anU`tdlL=X7U*cUFR-eaq(dG9%tvYW)i!gRQD zhBqC^wM5JVInLY0sjn<%HD)&;P7T8mc$NPtaT82A9 zVXU8K?`kDGe~@hP2OkJw-{oKhTrSu%+P!(}T)+*D-yN)a_+&FC9rRmkx6eFguU(GI zWPisr`YC@GxZBiMHl<&t+|*RPLQjfAJ87-2KC78sYbH}17kIH0t-LDxPrgTHoKY+& z5*xfk2Gk%7SvVzo74YZ^y7tOZ>fOxD%iY>lwv317e_3ME%0c)<&Pp(w0xuEv7L#LA0|*sHF#+1=l_ z=+-WHf1J2%aKc2P!JG>Dk>_ThE<;@%uXc?hW{%Br8(@yTa33_|{P2P%JpqE>3$HD- zO=V5EDLTvuzSP&sra4;1gTZ@N^&_zrm0J$5O`lJn9q`YP3hMFrK&AZ{3$g7gB zAlk44+sm0kv_w2N`^NSxVda8#lnqUVAzvcLfAbpt9_z*JRsvLO4vBxFN}nr96l55G zZyWci6A#kP#z4bqoqd=(37*URK^knBOU#|^iakh8a}7b*32qsruFEY_;|M-U=hxb- zMYZZJmhqj)VeXZjt_(^L4KZ>uZGehOJ~)c~wI-Gw+97<&jfOWJckiK)P5}u?gIy*7 ze{aE5u&J~?Q2k)MovTik)&g;`p(I9njcOz5ey&grxC8wOstwgVCO4i3fCdUi#EAO( zJkK1Me_YF+y%+8kGnfXslh-*uB1E%u9-__7IYSnzHFK|!wKz%9L7$j}n?XoEqzw9U z;w>wA9OZ)NudAhgMb93Bm?R`T{%i3gejcD|b({JQ`P^BXso^5m724o-CWV=Qu z_&&!d5$xqL_|BM^cOxg@+~KBQyiMTls?M0C!Y5xlM|f5i@jXN!AdtRPT)td*31C4A z5hX*|bItUclk^Zj6p&MKf3+&J zSF5?)PY2I%o+d?d;L)&rtW)j*$3vf0a%Pkc)E6JJX6(x`G9_lcFZcOoBoM@)+Z@z$ zNo>M$$w194z+aNqan18Gb}>;7y(ESKTbtB9MSfNU0An(k$oU4cUS8ColtBp6Tkh#X zGkfBIF~1GB0rJDVID4|_P%RD*f8zNP5`oLC;lK18tv@9Lod@7^7eK8CU=y3`;1^9N z6Ir$ip^p5C=N7$9reR3pSdMk8Or81WDB8DzI5w0zce(Rx^{V#lS0wA5M{2dC*%%?< z4$-;xKa!rID9*@?4xj6=eZDHU;1fS?6woEqfF7^?!OOK>b`D7ecL(2{e@41D_Yt)h zp{@57D)`U*SYPP>unq=I7H$CNb}b>MhVC!5Zh8md%dM`kYyUX9H8O3d!|!f=WvwY! z@t&F#o`J~R0??25yGt?F3{ zGYYQ2j>8QpkXt14>(9FIe=co?Kd7Yj1ELV($RY?U!8u%T95_d<5Qbnn^`hfXJiy#HH?lWs?pU7pB?-bN`_09mn0jEjT#i`{@{7ghK6 zsuCZwNHu>kB7*4dI~0Ny<+^}`KFVr%E2WX2x|(g8p@UB11dWvCejed2Z5=d&V2{{!DmE7ir$m?Dg|u;wcSeuGiP5& z)u{JkiH2*2><6Ad1#g4%7Gn*JknR{Q7~iPY+KTm&9q{yeZ}F*{jsluTm%Nt}Jl5w` z)Vv?v%ee=}Slo{rfA*JI___LCP49jIT3f67g`?)RvJ$EY+2BQX{=C{h95ULdsonT8FAiab{@`zK&SP1PF*oNv1D^Yv5-Sa`{ zr>+P=#so8FUqW75vFv+=9q^7qL3~U1-!zg3)QzliBDhgie9_^A@rllVJGSZDI|4yelZwRXzaNiW$`xuqU zR&mbQz{r|CXgmfIZ`A}!=ctnr(h)AaMo=_T6x|fSqJ? zsUY8b<{IQIdf5h>%BoxVRZiCdGX?ns{}wPIsD~d*#%YKGK*bZuhttWHnb`%LsPPV1 z(o$K5-;U<#_!CZYg7U0Xc@M@EbUAn&_?6{K$NA+yNA{_1JACwvWIv)cJCe_RdkIJPe7cR!y`GC_-F7Xm{SdcTKt zyZNQ#B)cl7U>3Y_yM!leJ@c{Cwz;#Sc_73_Aw_ZeOw_SVpxJno;O&pcVvU0&%~ov) zeckIrizv4o@7&4l8&-qFJ$C^kiCG;-e|PzPBR#w$S%W5RahxSvorKwP%>op2W~_o> zvf9x{p1Ww|9HR#kbx5GNCkU2Vxsu7^erCi3OAvG+*X@%58Ez$3yTcld_H7EAT6F%3 z)E>jbpzeL84Lp`mQkH zb}dwxdT;6G-;}h5&U^_3`jCSX3FG+UCtf^@4cUYvc?DhkTB4b`w698Yu-N&$MzDIr zec<3VNMy<&`$`iDTdC(NS0#h%e?$l*0o^_>Gpwhtzgi zyTAQhd72!h@_TiPlrJWuFQw9|8miLX5<+@p=r+;M02b88@GA_meE^mG7OKQ}{5Nvz;Nrs?ne4*e6U7Ryg`C(>pjjxNR{Gx7#Cd?qXxMXC2#cbRf6YkZpIJXE z%H0+!bwX#_#}vKVnSNdTD7;sxLh#_c&U!0*v8Sar)eM0hT7LU$GsUKome=a|!{MgQ z?Dc`oz%8Qd-%oWI7Dw9T_ngpQU-u+Yav0rk4;XH|mL1>S0PjQ9>Q(VZLR^lY(Oc1a|f?RLevmo3(qdy#Q!E&MOBb7}JC+$&zgiDMPZn?%pd zA9BwdktI1T6BD3C4Gn$U6Jk9@vsRVa9I9EqFsSpzU@re(0M`^Kf9sWLm#=Nv1@Cuy zQ|gZ?B!n4(!Th=b_BGrXmE2CYl>GH1y}!`4=0%u|4ZXTG}aEZ|mRC4z2p zoc9(c>Ws~T33d3}`nWb3aN7Kuc}eg81=4UixKrWfOR;cmyG;4PiGHzMEj_1zMx!|5 z-Zik8>Gy_naZ}5be+J+23Ra3I@6eThDNE>(eS9P}(=O-}yrlYIsH@=TrEK6NslU-z z19F0|Al+IDu&q_xcwF`I11?j)%^0(^Qw0^MgWRd3wLb&2FxsA$SvDT zqNL;lKd9Q$fFKY>nu<55a9u*nd4;5PVQ9r2)-VEg(pwOJ_ks=+fbSKG0u_|xzmf>v zGv!2$3`)(!fBt6Mek265JZnvWDE&|?6Xo2dl)bMJll;@K_vX3dD)NjgnXj6tfAqd^n=AX;_CMX#H)YLQs1ZgP z4`>>Yy_jlCq*r`6$kcnwe4hQBkJs6C`Q{T9G>?$>FnTOF>Bh<`(IE6OXX~n7by3dR z-JbwHYb4`x-N0~5D_k~j&41HfbpgmgR;2{g+`$xZr){S zPX~W|e}qM7a70Ln)Yc;>_m6N{AE!oyJ_oED*vq>CG>V^+kMzSMMp5;x%38;)RR}zF zwCtcoFPI$P*^Utq-i-%wKtl_e&*rwRlzCY>i+-@HQcdypXr+Xg_C zLA5Y>uS0RbhCp1>qddn#NGBEmkjFAd0b8?ie;HvOMzME7Z+yabOYN&nCtR`rd@Jw; z9N%BkK}CiO*1M2<7#`EwbD#p!nn4!2R6-o8hY;G7`0MZpD4)f4_e&R06j zfA;}>zOucIyd!buNJ6;R>B||)8P``P>W7Ziuf-Y+9cqFJeO9fj3EiyIKO5f%!xTkl zf4CT%W);nf%RJlA$sgc&SMgCkD$<%l)8*Sqy&gUSP9>$?9t|ei6?3Ude?l@P zZ0yt|S2fI9jIg9D{Zr zHi6D~L9M<`cTMAvM zzX6%8;?e?;6pKTF?O?D&_FwjrD9?pAy}6l=uP7urUU_fQQj)XCYpp}+NX zGXR*Gpgr3DYW;p?iaCwVb0vt>+QeUpy>TuI{6+$~ zz{GlC&a|>sSV?afnF!}$e|nU-YVV==&f8gmN|=x3bSDR}$W$x9B|F%>i+e(zffH(g zBg#w4evJ&pmKv_R&-QM(*u^W#HwN80re&WL@G~LAAY->M60tB-Yuaa<^EucW8*cr2 z^O=X-{^YH82MwqaXMe!;kzdv5BJ;LNNkh<)s?Uf;Na5GCDGdR3L?7`-_TzJjS-1jb#F-Sy^#K{qnNA`h#7USsWGEB;H||Ag-kp`3 z?JKn-X;UI(Z=vB)f0+_jU@2%EIXs6=QmC0Ot;4!~V*%4|R`d zt{C@q-B3c@jNwG`Q<0#(eM0%)|AS$WE92e*9TW<>ezkgMeC<3S2PPLZ~O zJ0m2wTj;MlNi|F{^h=cC_J4yql)kiuQsQ*FWSj20>FvslnwV&DW|hC(ythnx@u+h} zPARu7F?RM2o{Gx=+xe?`(?5DBcQXSQc9DsLIUSN_w?w5mMS$4xc-%Tpq5!gI6A-09;1%oFUWHys~KCD%yz}*QP$LkayfIr5(lg%S>C0fAfe#Bi+tWp%UkA_7?hhY&Fy>%($F; ztF-z}jLS9Ld>nnIFl6kgf09Z@lsCxB#%J&aE;VMPv^~dScmp|nsu&x|7dCfD7C|6 z2z$|h{O*&v1sg8r3~F_sbWCnUjzP0le+|ut0#aU5OB?tcIjmH$@FXmeS0ti=OBQIP zDPJ=Xv-;EF;9Py$2fw!8`CI};>t=)?Zce_W)?A(;06A^4Xd!|S$@I08;`+H33~~lTK}@>g@2l3S$sHBRRE000}qgi^BDDFTqelY;D6RRgTEsh~kQ| zqs84@;e0PDLk$}ld9qT^TOvzOe>}>(7`rqmay0@q%a+X=i?Fx-$ykma7=a7R0N&7{ zPl+!k&LRhm8N#rjjbkk`a={jP-{{lvd~Q>|k4EzqW1Sw`zq`H6No>0*`KFIZ9bf6$s9XhPcI zl!m11xuqDU$_E{)y{?UUR$gxm`PxL|(srPox;8!(R1K2(m@!`qHjVKH#+3k2PwQB2 z%(}ZUI}Zi$0~{G}?V8KksqqkS0(aR1T8F{@?KoZ?lU8v928Vu4Z2s(+A}vZadV;cH z7!{%NO#yB)Z^A8^l5Kjce+t+4&4hTcdbV8+vs|bmi#WOpdxMfJX|v$|Y7(Kd_*?9` zr!!9>ep={{57pF5mG_A^^lLl%kP@)I58cNWyWZJdDByFDPBLMa(o-xp3Xwc>U(VT2^HRoR#~@e~Y`H$Tpe(s)4y) zAO+*rr4!>1FitAbToR3^FB6DKWKu(k=N#}?lZRv#i@Mm2msdS+M6Z_!3W5i;?A>2; zVre@Y#Hps#sj?VFu(&P_!^BWoIcMl5BBj=3Plq*Oakt=1+Gn9*!(;aeV~6BD(ZkO& z>))w7t8--!JT=}Xe{7F45NES_tD|1rARPFO#+odb;N6cTt+@d^9pJeUZ=FeZY~!IH z4NOEW4Cr+CIgQ_wL)4IU=Z_&q?qX`jvXXLSu*gMJ{9dg2&l&1?iWwuBo&h*x_bwur zX>w#_)M<3;u@we4#9fXKJo~s$%cmXpZ`8hftv&#W2X7=We^*JB7@6c%g%CY(&s00v z(Qv08Q6GD)T4+VFB-lq)(Fa<1l?I$VtV$cJIkzZ#ga0bA?l4`sT7 zJ_sRU4w}8Khlv#^XW7=rcS|#MDKv~tp2gXWQP-Q9d_fgNPSgpgc?<18)lS4QlzLsp z5N2lEe;i~RW2FAzDV|1lJhZYzM9#2emqFt<`u+0p4<8J>%Q1rZs)b46!;Qi0`a%9v zcVeX{!^}9l4?EaC0u??SP9l3?T>&xgZ;nnkoHf^F)??hC?2xHhJOf@QUvCNAx)D4a zg~>jSMCR6ygV{;HM60MkcHQ=g%EQ2O*Cm8mf5W-OP_&$}d1@hziu$^`FB)iuASwM1 z3?|d$!CG*dN644OmO`}DK;U*Xx7wN>931)IDaEqy)U zB1t=j@kD;Pu$`_vQ_8^X;(-(s@?924gBZ*uv-CRAw9{c;mD_*sMqYINFD}8*Ovspx zf6oIJ(tfX_L0LD?RKl;anzA8L{pIckntmyG^sE+7j;6}v7VE!&TnxAn7P-xAQlkpt zUH|pdyjea6IYyn|a$r--j)mnYJ3f&ns`SS2Y|3@yh;xKwJZay3l9HWQ9@mZsHC2`9 zrKEklu?Iw4o)Yz>Zh2)9%mhq$YnJ&vfB*Clc_IbreWZPgNIHgjYG4?&9%BkcHMEGn zksY6^8ev7YBMxPxXKVq8Ez_LSIDtQil;<(SE9#vfpNSwgRQ}q~dRrseixZWv+0Z4U zp$4`x#Qa&hK^;BBs5!}SMYVe{_OdW$KxN3q7$qOyJgEsifU@z}9?f~1@NCV_d1ahT`WI^^Vm* zg?Icw>L~!|`G)P*on*4u)F*<1?;MVvGl_Q=5od@ND|6SyPIWqO9bbr%Lq^OPVbm;rV0uOY zA?Av>BhBt8d&3nHOUyECppf_?BCPzpvlx4G#j*ld!~)+xaA!#sf)L`lJ*8OgIwoI8 zw@zta(W+h3Dg>QPqhd3LfB)9O8m;Fm)%Gp-yTrD?#sA41yAwPSre8+* zcQUQ(D^3hq2yTG$lk;`a?DmK!w zmZ~q zc0avk1G#4KI+@~}C%3_OA+kILFOi;@llVQ&es1%_aVMda*ctzRf(21n$DZxZO4{f0 zP@1U#8nTM8)DjCxe=LRTmRP@>W}?punGrpe`~g&>d1dh)p$iQBA#nwh7JBun8i^`h zG3$p_o>zvnJjMPhol{8$jmg?5x4x*$4ghNr2Gx9Hdx9F^l-3nGcgr=RLxq_HPJj90 zx~<*tsCxo%c}KU{;6DXBcgCj|&!-8;E#bV@GdAOb@-s&;e=52G^B`~dsoQ9!#xW%Ba?|w#m!N+L|tGs8A?gWjGLMZ^>({7am@R4)=KKq#;~u!sW~hNI{bx z(i*ajGVKjD2ACTz2{eY6!I1+Lmk%xj7neWk0}cZ=IWd<|>H`)7H8nGnu@)zPthaM` zrC+lq9CU1_!yVhUZ6_UL$2K~))nUiBZQHh;bZk!l-gnNNxz6{^KQrf#=eeF$_o}<9 z)?KUiwaJJSRp^9F?2LfocDBxRO!SQ00C@`=BNr!SI~#dBE?GKdpqY!5v!ONMFUAH- zMkeA2G<3GGvlTUT266*5fF=NcQJ^t^nHj*u#l;0n1`x5c_i(f@Gj|41swrzw(a_NT zr{$k503(n8K>m6_KtRcci8;J{*o!$IXOESJ6hN~1O7%;6czt>p3dfm&i}-AviJ)F>`edeG_f;w z`KP3RVSj1g16QC(9gS?&d z-;e;x|2viG|NBJ#Z;<%EMd1GydH>(U{jVDRZBbhBg+~9{(rj|GHZP`0uR$C+B~K{~bce*6goB zbWCjYZ2vY}IEh<-xC2cTEu4+b0j7r5e-H0pb~RfQprf^gE%2|%|2p5lPK=EI1yeP* zFt)P&M-8@rLqJ=T|60Re-TqYpgNnGkx{w0R|6$txYqR3tu5ecMum=MEXCw_dJCpyl z_=ieZ*v=i`MaRU>1)yW*VElU-|6WHfW>)Y2pRoTTV*1a2wVa`|qlG&_n~|Q8kqPkk z{U6VNu5|wkjhL;moyk9aq~dI7Yx1}C{+Hn&*x1F<@vq|lng)L>|Bv;*E&&ke4m5^c zU9vOg39?N6o#tGFl|3{es@>Pa1U?jOUtF(Rkmpxr*X^4cw!>9!@LnBE-!R4f+3K-) zX8&;@O?^0j(t~MD(VYyu%*FF2q3X>;*(7i0pg9a+&?`nrJJ*Qvx>}Ik{`P~NQT=dt zLP=S#=p7P&s-49V`s#_wkHj_451sVU9?{1*r7jku1GxbNwI=`UoILU5>5*b!ba-g6 z`v#)-0GB2!7KV(+5X&d&jOdrMhk@gLz40f+t1E|p3!EE*7h2kf3yHriajKn2t>@ee zvma%9@m=7Qj&O=o{i=BbqvzGoy}1Y<2_O_N_&uHDr@wd&NsMvG?KSd2AI}34BVN)L zjkH>Nr>mylL;XrJ!cTDqN|y8sDfe5$91TNFR`X^a@ij{2b^PCODv!c0N=+xeIOqwv znaj?96GOQ(-O+^Abuzv6g|=c8@h5Kyka?rqm~JPMML*?+RVSfYP^^Q09M8|==A;nSL(UC>3kPh0@_npKVPJ~?Y8tgsW#wH< zGcth;Sf1DGQI|P2RY)ecEWjDrD(zEnV~v((O*zh=C(V8sD9_ zzy(bo^^~L25yZt^%7713O<-|j0RV2-B@QpQtC3oCRmz}yRN}fEDp$*5(s6)!ucaF6 z5nea+w`Hsgo%SW1f{NM*=E6XZ!3&sVdzd$T%?+sl;p&(X)n30R#>jHG+=k@*Kt`Fq ze?J($Q|V~)*WiSLIh|peA5?36y|?+3o-Nh8Lf+QX(;^gbN<{I#S{~@jyj4y`s^@YV z)S=y*;+B6G`)OY3#5yF1{(g*RBCzE*1tK#|M21QA2PRuW6!P%ns=OzUf6P|Iitkq5 zd#IAb`^%{w{Qv}15R4-NImy|IwHia;f0-f5a}w0qNWeFpR%lzo$j;EyrczDZz%p97 zMGT`Bg=F|oOy(*poVjQQm?$yPmc}@H$o{vF?(qIS1Z#uwoM9~RyP6+?m8(aHk1PfodtWx>u|-I$rM8y7Iatp`0^cl|sJh9DEayk;rGATN2?y6_8XN8?yie8HVd}mByv0DU(P8{3u}+2ov?x z$gnBkj4{rq+vmDtVyns4d2Gy*-=`>05~B@%R6u-?b)d;4IGg3u0xCFXug9|roF^Gq zqAvi5>)f>NrlW3VQ5tv?*J;*(DNp#!kuD=S@H(=dj+)_=az?x>huc;ImCtCDC5s7Qzvf((-zdX04X%^1)oIrQ zjH=|4od}>(U8uH6tZjooL%<9R4A&37(0_x8vn6+uyYu~-U1nPwJuo!^f0kcf`4(JF z5A}|S0eXl(JmirC%l*-ZU5sfqEjxJ%e@95S4uw?8VXv*??`hu3shPDIhNBfPA z7F9Tsak=gOQ}|8zn~@#2fAbj=b#HUBY}&vn)^}(|+zg&ng}M@&ZdI-c@!~oVp73ukVECM~+0_R#+F%P9`q!W%2}2k{A6&9j}(s?G#$20YP3i$*l<+7D<`Ol;+MrZXDG4>pOT z*_2;!)P!U(zq7#};Yz&Iw7f(6 zbuS7^c7@m?STAVm$hNkNmu3A=`QPzc+K`0+iE`UitL zSmc4i+iknD%)hX#Z1`ZOX;Dkj7YGM>SVcG>&SW11f0x##SwQclO;SlsyZ&h0$M}hD zferwQ6v(K4GLjKN76@S=zb}g7dVLM!_zwSfxQT+2F1|tqLurD*kq}Jptj~ zPeh#D{`7XNw$HeArH2#IIS=;wqmAf8H~;hhkBCu-$Fh87=V`NgeX6(;E} zs?j|t(LDCGoH|b#I^%x)6uTMrptU(OKusRc*G9$DnU{UGB~=pe-DM4YYkerlw|icY zf6;ea*`h(NOcSdrxJj1#JMw&aglhOV*8L$!<0aWHP|x}CU^=w0wL{;HR*mVSPc;OQ z1aqo7Rc`l|tkgQy-$Iv1M`7f~^dAQKe=tsXoO3xwe}?-x>va3}eUraZB|+O37`Srw z$}$Bv9mmZYQ0ct&cUz0O$q5+cTfUzCe+lM;v3M?Ny}~C=31O9Y`*Q~ossU8MxALU( zT}E1x5Dr*4TktJ+UsVRFXGfO?)ijFvoZ>y%pckI@>*@>*6{>-*#>}rv!#8!42)-5u z6WF}7+HKwmO=>vGoPaWf!Egp#Zh1>UsG`HJ_Q({{X&lf6r!@ zO5>=T0o8&N`3*+m%XPOy&EU55g}g9WR}}P(&}h;+qx8c27pE}@)#B@vVCR#^BiLjA z-Nend9V@$R5!sit%R_T!i7!?+1Uxz`DZx661*NFQW#|?x1LUP7&;3=nX~K&-byLW; z%s~Ir03!X^Ir9@ zyqOT2EY=WhKk==)%TeK<6hBJ_`IMx~WaV!j1h(hvtPBdPZ2HRrc)=H8t7so-)pNX) z<4GMI;JD`vN;DWllk~B(^@a>TD0p|?X#)yN7C+$x^U)UY1>?d$=mgNTf1~Oy{Za~$ z3%LlwwDNUm#o)B4+!YA6Rj14f6X&>~;=v6dmm(Z7`+f7gxo}uiVz{4p6yo>~Mb|*- zsd!a_hjbNxCHD;i;FZ`ph!%c^y)FKVhz|)+*)-CR)0@dXOJnnDIl{8P6d5aNX{iDR z?J>`$->g}EXD*H(ONEsSe;Km;ECC{eiPYf%mwEA{CG6{DvpGD11{D2!G(yy*t#c4R zV>-YGkA=SKL3E;240Rz&Tmd*eU5nojYBdGLwe{0lIlUGE>PHN!vvwSmnX>`_?vwEd zDCT8CW7Al%=u4jFa`Xk@IHH0Pk>~-&nd(l&b#U&0G&P8txY=~|e{%uWocL|jWt>{> zs4%QAiiG;1LfNY)V`S3N2XsyJ{1cls6MoRbj6<)uPSTF{>|+yn1ur$V;FYkMb9U#0 zK6?#D`i9q|{~6*0;aGKp)9$uzV)5c;tfn|cMeAbM2$`*`;79JoAf~hR*?@x}$`}xd z40)lvh0V-g{Q@xGe}iRmY{jbb$vyi-m4M7>;}R3~;F|`ttP6m-Y5c=IqZs^>$D&>C zZx#uF-y%zrl%gs(3Z<*g50L83;9K_{%F}Yaz78&YY5T{&&jgER5-oDq>X%r1F2KwP?IrO?fH>D>;&sb;e|a($@e7P*iLMml;E~uZU44a=R@`I z&@22__3kya8g)$7ho-T|^mI~j&Vr-rdrUO8u=V*{#ka!xuKn}7<&rx`Uw(w%jw5JG zdT^@==!rUQf11jVCapUNCha|^!{uo9j;hVK^hFxtPH9a4n*$^7X=y)rLdY!2 z@GvDorld2mfvt~n1bn@RWC>aCaJR9Fp#IO#`Ez3(gX9A3pRQq-WHABs6^}hE1cgl6 zKK|3Q{NXhAh4HeZFAAP0_ljf${EG!k^0f<0UVR++e+cA$EDv#1Qb2Hj*W;&+Dda7m z;#$@q(I?QzlXZd*pK;5~s8Y`24FAT$=#ee-vDL4M@xb9 z+UHJzds1qa-rz1gh1@?iv38J^@jAMGSRMsZl(ElQV$59bj7kq^%n|P`d^kd=%tn`J z=_Q_le_2up0+1-!e=Et?#UP+MO}PNLBXDp{ZOvoKhH#y3Ng2o|&vo9Wl4Mw`I-Us! zztKNA+#4}sZ2aiU3f!(}W<@+&QT)}q#8YJn{~bq=k}s*(31~-yLp*SCMw-s{SQA;^@hx5GDlqf33rxMHCWrF|*i9SenJO782PgUw!9D zAq?+@5v1}@!>_p(0TSnp0Gjl~vIg87&nh=;Ui4S(51l9dfw-WsF36$QRUQJtxr=qI zU41(1z*GimvRE))0)#(KG7*Y`MFziMx+hFH(a@(PlNjhJFfhGCLG5Ygd(@m#SNNRW zfAUpgHX=YnjMREh{7(?w;6`P?-n)hTOYC5I+eRo<5Brvqr~VuY(@MU2k6pQF$?_uc z%_Jz`vS!0sYGw~*aETC8J;J=jR1rt5Pjxkg~1^XC%Z z{OB3GXH=}SB!oHxf>=`u%$@8?1TMQne?*Jg7uzcLj105ckW*jW``P)hCl`0R<3{MGX{(km!!!8kR&+AkEe?SJ} z>p?z>0`yQ;ko&o0>a|`XJZ^OiiXd~We7+!DZIcBnyY*#pf4bNP15_nr@Pl?|d-aP2 za}Zx^dVhOaTk<@gh|q{ygihuDQfSFJ!dwlEl6i?FY10cw#oj}vuTv5eeGx)e4B$>0 zVCla_2p%#a5^@l6H8x5SBRfUrf4GBx{JtW2D%C*fx%R|5fiZzlg$tv%OQVt`v!P%J5FC~lptewy)(gJ#@*msPYfgp`+$#gg)p zW>L@?MM`@CUH?=`$0z8E@ z)g?m@9$7rkfSg5rHN)OyhXtNTJ0HsJiK2))(%m0ClO=i&%X$ZgI3Ecv@vKjEm!40{ z@1H&7DT=Ifw)wC8pA7wmyJuppHH_o0q#<4^Rdm~v#c7j@65ZN%mTS`)0YC07vv6@} zK&RWdU`dKv+hIJE%$6axe_o)owrBaz)rH#y&2~u4=53w)D3EqT98PDqZ)qC$|3MQt?L+p(zO+q3{PvLQ z;_{Q7V?ar(8xfDIKVoL#J{xS1^DP{qgiL`&@qWnOPjM-z_pp7ef8Ghrw4WDjHW67} z5;HuG&CR4LYy^MB$Tg;1nIr(k5!BqHcTAqc8;p>KyY=l)?2pX`wMvB#6HECjESO2G zAJpr2yliG2_Oy;uS{&$JLw~N~vz4-jo4Xdd`XGvp7Mw^Me)>-#h~tAn>ry3Kx7Oo2 z6!$>FnsbkdRR`(re@bBwn=eYlb2%HYntTcq-xK`KdXd);|(mC3QUwCfzgN4`{XM|ra>5q034caQ) zYD z-sum(m|_;T1WJ!;)1oDYpAld!4e=HH8eeWhJ@yH5e;hV#SSn$w-9IIzs9kN)6MUAP z7pRQ2wzUDvuP6$AtG}lX4TA-bjjhF-O3+Z~W5ctE0$Gz&>)Jc_=K;5XRJnfPSgn)a zDP@e~MnYgER>^xdS)rEyxzXLK9=%!>@36_`OLpC&kC^wSq0yYsQ47_O0Bo4+cyL52 zT_$wwe<$4~cB1LzfJ@~NMNbPws|Tg8t!&wgZ>7r!7BmmT_(m~dwS{RpRr(8G{N5L# zd*H71bT=tz>jsKtydy$uHuCyo(gq$>ls-NSmB+it6v`@jo=!i8xs0<(6jJcAU8BDq z6Bb=xM9)+a25xQd<^>LEcnZ3II<%_sMwDI=e|ag{S=jCxnNLGzNy#h#YM9PouJKvw z;xvSA&L;1b7REF}QQ(^edF7t%y)-wtuUL<}_W-OSG50T*d|ctZ!TDMKo<)9b#F-o| zD1scXx3ZHVg{Y|`(bhdR?6{LA0_^wFT-{+mY83qBBQCRy zqBSB_t*hb47#_>aVldFuACyl&CoOcKoVt#yfy3t#uL1&fG`O^VIo$>fKYQ{_WPQQ# zTZ|w14$Z!~;^Ig&pQ(KCakpVku3bp2e~)4MTxsNv$e2S!78mX~;vohlS%^|~sAoF! z6bLkQc<_{bpp87`w=q-lsJ#AgQq%Oh-Y?KjU!f0r(Z57qxV;;LBOn6ndwf86Bgxjs z>gcZYOjv(2Fnq4v&P%fbxV>hXy44i^x?Vne+Z6C zC!85~Ta3ghuRaVXhwOTfb>$ff+u)_;qBA54amv5Ge4mw;b0cF`|NV7j(j6xVLbxQ$ArWD){ZDp3sLjJj@K?(Irk7%7Y|65-6##e=x8MRXZe_h#+CP&D5=LMz$a)5jPWpTWGwWzXu#kJ7s!LE_FQ+x5u zKJOGgv&^6ufqd!u(zUKwNfH=z*e}L{D{_qU-HAjt!7Q@blK4QPrJ@{!(2A|9t#gh+^`RHpN<%S5P&f0nQ%e4?p5CU^-| zX5kR^jZzsy{25}a5d+Bg{{sgj?^c!DSp&^Ox z!I8x_XoN&Mim?@-(A(xM70`cwfBHBMct#HNV&1Za3X6U??3t6`dD+YMcMyqAwwGD^ z+Ay?$lIFSfH7a9xcNnpErIzOgkZ}nm_M?@N$R?Kucv5O+e}7JH;Gb(35s=8Jqu!HS z!}h-pdZH=cXDT=3xmYzdWJ;}H!gr6q3z+(SBKw{q$869x^w{u!BV~jw8d!8*#+5vt z*m6$K<*%*3{W=Qw?KSq*qF0wE##i?l2ubf62`~UPg;bS%Xv0QvVqI)A7(_PLp!31si zGqjEswE<^J3y23+7xFLoJ6%=cG;O`DIU2C~7tF0Je{Xw_N4eyWEmpaY#R}&I<@^k+-_`E0^ zYtpK00@Ke-~1`V_FZy@-TXE;rMp)r7O4F+Ye<5n-Y;DXBpj@S zm4n-!e*K0e^%^z znN*%Jzv|rPWW*=w$8AN?Ree+z&-^Q=bNkz)q!OcsX!_)(U=&J;HI9;R2vNHvjEjab z;Vj5hUXY%PF0m*MOMt?M-2PNKO-d6a3*B;~ftjK21^0U#7Ow3kKj6MNIFwt*_GYk@@7lhBqbv(??hKY`SpL^FSugz98!Vh*Y=_@Z zmYIm(ZqMZUUYVb-gadABb(z;UuknAXe?%0OozmCV-Q|&PE&%C`ElFa-5mg5Q%G2(t*2zf9oHafb<<+N$6$#jjJ*!lb7p}DPOcuewEda0dqZFJN(hQcSi7tP| zgnQww%j7)`t(#n|9p&_6ap_DLCw<=#$8XPe?Lz3uQim{yMGc? zmG}SwS`W+d-P*9quz8Sa3!(9j5`Oxfs(?Uv+8e+8<&(2`Z_FVF^4C1}iybpC5NAi> zjSS&pZrQr;{G({tJT!Zi9SL$o7vlMYAGI|lUq8VHzH8`nm|pvWe@f&u4nQ_j^|+-Qz}bm=U)lc zdryl-J{*QCckBCa&ov`ffwTcG>&A?on2Bf1eQ>qc0J66De^&FW_j4wg{V#2IS7fpw zYEJ!2rB@7Q{y`zy0~yF z%$uE@;eq;Se4wYV52^cSO1Ntj@?(*_6?cQ-D)>)oe`XTli%s)SBS$f9lv>zzIAaa>G`9rHVxLF@8Fy6Yy%<)y(rx)hGo-LjUIWql^}v@NF#-X)eC zGWW+|){eoy!v4%R_uy-N-rhj`>1ji93~fPWWQ6s2W1b~XZR=B-YJ{?d$)`mXRtBDT zD+{?29_##yU;-6vc+rd1QuD2bb9KBP+|hKKe*mo8R*@sBj@k&Y$ya&V#1IRhkN%Sk$;LNGt0HBEcnys!BNy}chA*4adcCMdeWa3>5h>HAdDdczAyDizGNNwRHR#^X4L&eZKO;~3Mt|+{IrDInr2$>o3iuh8!mJTgc9|=w>eV~*n38oU z7Oa-Uhun$c_Je_mssr8Z*CkP^bglR`f4O!(;8(jykT-cu#tq2}#xq4{6GOv2VZ+dJ z_RYUH%KB6^i0QS#wudDJS88-B&9&dFI$$~6?ki}@uW4&AI$`3rsJfy({p9ACO@1IH+%RyB%T{O+Otti~*5t?z2s$vH#2 zLHo#dp=uI?=zEcVk)f(A>h>d@6cG9R$urp%)nM3ZM#>OWX%^1e9nuY8v>JGy+>am* zz$N@ml(x*Ee6=rNa~yjWB9t2jf4a|)xtMKGV^iO$QullD#9VAMWux_MT_O(f9jakG z6zf#mC8hEwDSDGIBmF!(%9NEt$^)++PdJ9fDIsNR-EA@@nxY7OSAS z+Qnb@fY-a;UFM2s^$ltde|gVi0~!Qc0tNSLH`Z^WeFGZ$4&N4_ghD73+DP(vgxIwC zZO@(BzyRU2K#nS7gsb0gG6|-dvEdhCH_G>IhCT&IT3IC{QLV@G5t5CPtyI-*Z@EOm zPbTX$0k9vFFA90b&;%5L_PiWCS?CnMM$2?(?$}i;CG{o=i@K=&0EZF8Jbr=leWF2eRDr5{1U%t9H9b< zsn=@b9#L-FMTO$YzzmIrc}JgXQJ8nA)hM)93Y47l3Cc2`R;GZtdw_S?4jgsY;gku( z>Kk7#ozu2}CJcGif6mi*B?6+)k1;|Ehb~ph3U#l1rHK=AXO<{pUi;itHjfTHi)IvQ zXR&{Ca_erDpczX3eH2|)t1|v7w1aX%fc$e0y8uJ2?K6;?x%mRFOG1Je8{;M0mSdAe z!j=8GEo5Ma9%me@qN@~QW-Rx|kDyqEwPm@v@`vC|s$->$e>nGu5zIsW{V3y?yTUSL z-V!^8wmD$ZD}foLlSeK8YGcA$eaIg#nl#7;yU386hu`cs9x&`Ky13c+_GcU;edVMQ z}3}>3n1%b`Cz-zmCm z*Wp4o6m1%xf24~j(UEAVWVCWJpSL3~p}wCc>be6!iQQvoFDMeNeDau?goGvVT&_HU z#be)BEkgqvDt0JD+I~naZye|Tk^dVA0}JqK5=w%EZgy0G85+LvZq#4<)&3(=itT4P2mK1Tbn(7(B?Ux(4mU7 zpLNmIfBhn?niU6}Mfo7Hdx33GAlgeq;Dcsi#Olit-Md&{WY>WRy?KAb*arbKoj>(4 ze`f{*yQeqJ2t>e#`Bp#*am-SEp};$Q#*&v;KkADyzVc^Cs0Iw~x^E%3xFudgewd41 zexSG(|F_K#c8f$@abINSoG`w41M()r-bFkz%$e~7Prf(=_^g8eQe-nOeTj_jJh{5<}!OY5Ca zy`68)GQhzN`7nxNs1M%;8E7#6(w2T$pgbTk*RD3PwU#Y#Fr)uvm+U7iy2`aWWUzy( zGJ<|7ATg-anj<{Ex<&I{!xeGyrcKOTz|K(d_chCtEVB>O%p?x2A~ECpYRrPUfA6&X zO-%M;pK8?Uhy4Vn2VZ#JG42nx3~3mu<_vQwh@upo{3;M-bLQH-&*znZA| z9BwR@4UI{kx1sK0pc2T-H`dIv0nG!~cWlK4yh+&lolbgw(uGx!p?c-5f52@*{6dk; z4vbiF`rB4lACR>B&sH9u4x|~L??=Y@SXAy*F&8xy#BO}=$(}FgF4c?>Xd@(zX>*?< z0c|aL@GR+VNb#k^n&`!I_F%zF(f5ssU?h>5p-R}Awz**+V#mB;kHQPkt)Y(rE;#H9g#9wzA z*C;<3-d~wPUWGB-bR6}}?gKUGvMg?x3G}Wn#yfb`ZEo7wJ<*)KFBXlGCa>kq|a$r6rOj?-40m$#rHJoDv)T{2is;-+#=nSSa(zo=%Kr(-jmp`7JFi zm%x2lsYM`(Q4FufhN`{9+bw*S<0%8d{l~m#dO#O-(Q@B*cfvU9Q-I>HRd`yu9Y3qG zZeX%_6mI$hOW|6ie+;Qc#i9G!#xRD&sTzUuH7hDR5jnYoVF=g5{GR|ZJN@f0d*)OP zMn>+cAiY(*8B!*#xQ&dx!^HJeA|=uH(zu#IgTd2;sj}}|CT_LnP1P-$un67e6qEa> z*#?Jk2n?**Lt53kM*ZF3c?TPbbx|_?sy936QkwpT=CoX?e`FQa9xSq%#Ul9ik9#<) z5PCfsXzBEqGg05DJoV zV0>EiHJIMLe@DCENR5Q4jCXtP8A6NI4+mi4TgclqrY6h9^sLnVwFSyhXG&f8C7<}r zq?T41$5JzgiTTV@7YlTc+1HmAk z-u%IC3TE*k^virnrC0UX%C61k5YB7zqn}YzDBXIYe}y91kLq$7COL&`AvbFJ;qr-? zy_`j58kfxkwWSGl*C_VGz7f6Pc6fo0I#@bAJ_H?S60HxQgRo#r+ZTLpbv_qiOXYuy zy&y%ef7oh>qI9q*Fviooy}cQO$GP@>B8CUC;L#N?G;=;>p%E;|5w0e{I6`CpGrHOr@j`j{xt+*UQTClMU=n6`}rRh0i9T*!O5ZRfC`R*VEI|Y^f{j z70Q8s#$XrLcPD8(P9(A4x3QdTyIi((KN*|o1)Lff18UTl`A}zpkunNMC@jQw$Dthes?a* zy$-H697qrjah|;n>UAaW8@|O@N^h3Z!nWwF^q(A(o3{{!XJ?9L+Y@YHbSNX?cR1Nc zM+yK_-eMNrZ9i*RvEqnd?IGoTs)+U>c5SLo4Fr@fw(gMp#TM2xbgww^zYRr;lt4jY ze}IU7eg_i_JE6g2eC1@JG9W}18ro~g{6RNMCS&Je>&(~Pfv!mpV8dSYoqL_!6~e$7 z7Sy`4;AD8~IgyD%`1^mBj5ayNUq@I`HML-P8d_&F5p>z3j$u>&pb({XaJBrStqT@M zmG1GuyBD0Y*<Z?~fbP_MjTxMS$ncw)+s{z7Q5IQ%c>jU*lU^cd9)DhN|f6o1m4g`B=|I8ZHC zPr0})=Ki##cNVQM#VL;|QW6v-TQoD&LC#;>R0gtm2Q=kSd#?1a{hMIhy&@@9e^_$% z-QuR5*yCH~4iX5=tb8o+xkBfrad774Kh$|s44Bq@L>v-*Qe8SaPLO+eCDKV!!7KGT zb5WIbLgwag%&UDBp4$eh_3EXJTN%iYoTZdlO1M@FkGCA#VZOsNXeeu($lp1~wPfaY zlBKLUs+95`5@ zo!q{|+u3Xp56&xY#^}pOk5=O~CBYxCj0^D+s#^p1;$%KYrGLDcf5A#V2R5ZYWSv7R za$r8GZ3xz*3_Y7jM@OgvFN&RK-&Zr5SvbthP@8HT#T$~*mAvxwW_l>|`%1vitx+?5 z2e~-OHpQ0Seo5b1CM0OK--{temd4DHe0k|uOcI)NXUGEbrlCwC&mW+7WQd*Q66wnM zhOR5$-7fxn^`_KFdL#GSGvV~cMC^+$50;pN zcFhF@w?pFr^)c#Ca0ARga|q;jz1?bz1}CP)UoHwp?}Li>i|9>xqe(zq5X{hQ?uy!_ zp_`c#)p$||;@e{A$0gz;>kd@WTl2b0EX|<;GV}a!5k7OZe?#w>h={s^y-;%mzU1q> zjVyq-8MyR*z6OT8j5TABOb%`ScZ>0*kgJaYCrsZj3TC{PX@MN8C2X9 z?MW5x>>u!qO=cjd+%)me7-GD}A3ijKKENrf1Ru}A5Lz7}{m0QxkuG-@+JLcS=lY#>GjYx%U3INg0W)KB|R=WZ03pU;a4c=OJ$u z)`iB3 zEx8KjtLJKN{=kBzYAS49(B@~@L{fp0vf$dPe;qkQ4ZiAREB-}M`9fka|H|nw9So^3 z;)a2R#So&Euwr9vH6skkP7~f`WycF+C_(Nz>E7n@)7FYcC*KktzOrXGj3Sb)+%jok z*KFm4%3-M+V6!&p4+3V^VqzadR~cyp(ivgSil`;(?x|KMf&er4xnRWwVJ%bk`nlDg ze`3wOtLy!($=C&bh%E5IIB=V?vfr0)|9XxRjh$=rz{;yRe-{$)S}T5%V=p-;qG7ob z?N6G_+i*KLl% zCM&(>%WcB+kHHlLOqwePEe?}WYT`$He~(2m5pN-a;K?1q>!H{ff@jPz_t17e}%zn z_~RyNe)}(tTT$}Nss_&RVSD0dd>12Kn-zXpwr{GWEJ*&OZUcm#@S}jZOd9UW)Hj(b z@Wh{lvUls{vAcCp+(O<-NKCukME=?7f}B|9x81Lp5`EGjSMU|BKsnWJidXT1u^M_5 z)6seC@#E7&R<*%-aI?8Ps@T=4e<+{q!p@%jS{qDk-*n5Bai&> zTkaXYa>Jh`twL+#;q&wd>#x&Lp;B%6L1PcYcGLMA9JPfxhedf*x)}rcCKQj3gPye+ zZnsEU&1X~H7fc9D+j-}LG1FaSJ;F*fac9n)y+)7;TI12nJgG`$_ytp7e~#j&ZW>Fy zrni+go0$Z$Hup~7vD;ubGo2NARA6OPHPJ&QCZst8ijZHSl`%$%C{y!Kf)9epx7*g* z&xWeA8V3uo^k zXb!G}$Y+>ylvD?cFV#O%Al@Y-MRdz~p z(0voR#sR9C#6@Fs7b+#-8f=#N`97LwJip@C*V`Ty9${37$(hYSqpB9ypsdch`nmKD zZE=^cMgCkkQ@Lj6e{Qy6&erR&f(OCdL=rf*2O^tP3LS<&$vHW#(CxKU_QnE5cqH|X zbl`9I^w8n5Z+FL9IaMAwFQ+g{5ZpJW@$$s|fBxhWSs`t<5~X5#!!DIL=9fr7%DFcp znB$3oERi1pGOsIf¥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. fai-mk-network @@ -387,7 +391,7 @@ partition est de 4 Go de taille), mais alors que la VM écrit des données sur son disque, cela commencera à consommer de l’espace dans +/tmp+. -Démarrez le premier hôte virtuel, qui deviendra le serveur FAI ^[4]: +Démarrez le premier hôte virtuel, qui deviendra le serveur FAI ^[5] : fai-kvm -Vn -s20 -u 1 cd faicd64-small.iso @@ -466,227 +470,240 @@ utiles à ce sujet. Commençons par décrire quelques termes utilisés dans ce manuel. -Le serveur d’installation +Le serveur d’installation  Il fournit les services DHCP, TFTP et NFS ainsi que les données de configuration pour tous les clients d’installation. Dans les exemples de ce manuel, cet hôte s’appelle faiserver. C’est l’hôte où le paquet faiserver est installé. -install client - A host which will be installed using FAI and a configuration - provided by the install server. Also called client for short. In - this manual, the example hosts are called demohost, xfcehost, - gnomehost … This computer should boot from its network interface - using PXE. -configuration space - - A subdirectory structure containg several files. Those files - describe the details of how the installation of the clients will - be performed. All configuration data is stored here. It’s also - called config space for short. It includes information about: - - o Hard disk layout in a format similar to fstab - o Local file systems, their types, mount points and mount - options - o Software packages - o Keyboard layout, time zone, Xorg configuration, remote file - systems, user accounts, printers … - - The package fai-doc includes a sample configuration space - including examples for hosts using the XFCE and GNOME environment - amongst other examples. Calling fai-mk-configspace copies these - examples to /srv/fai/config. It’s recommended to study those - config files and scripts for easier understanding how FAI works. - -nfsroot, NFS-Root - A file system located on the install server. During the - installation process it’s the complete file system for the - install clients. All clients share the same nfsroot, which they - mount read only. The nfsroot needs about 1.1GB of free disk - space. -TFTP - Serves clients the initrd and kernel that is used for the - installation process. Along with the file system served by NFS, - these two make up a temporary OS in which the installations are - performed. -FAI classes - Classes are names which determine which configuration file is - selected. If a client belongs to class WEBSERVER, it will be - configured as a webserver, the class DESKTOP for e.g. determines - which software packages will be installed. -profile - A FAI profile is just a list of FAI classes assiged to a profile - name, which is extended by a description of this profile. I.e. - one could have two "Webserver" profiles, one including the APACHE - class another including the NGINX class, to then install the - respective webserver solution. -tasks - The installation of a client consists of several parts, which are - called tasks. Tasks are predefined subroutines which perform a - certain part of the FAI. The following FAI tasks are performed - during an installation on the install clients. - - confdir # get the config space - setup # some initialization, start sshd on demand - defclass # define FAI classes - defvar # define variables - action # evaluate FAI_ACTION - install # Start the installation - partition # partition the harddisks, create file systems - mountdisks # mount the file systems - extrbase # extract the base.tar.xz - debconf # do the Debian debconf preseeding - repository # prepare access to the package repository - updatebase # Set up package tools and update packages - instsoft # install software packages - configure # call customization scripts - finish # do some cleanup, show installation statistics - tests # call tests if defined - chboot # call fai-chboot on the install server - savelog # save log files to local and remote location - faiend # reboot host, eject CD if needed - - These are tasks, which are only executed when a different action - is performed - - dirinstall # install a chroot environment - softupdate # only do the system configuration - sysinfo # print detailed system information - inventory # print short hardware inventory list - -For a more in-depth description of tasks , see [tasks]. - -Note that you are not limited to the FAI tasks. You can also define -additional programs or scripts which will be run on particular -occasions. They are called hooks. +Le client d’installation  + Un hôte qui sera installé à l’aide de FAI et une configuration + fournie par le serveur d’installation. Aussi appelé client pour + faire court. Dans ce manuel, les hôtes d’exemple sont appelés + demohost, xfcehost, gnomehost … Cet ordinateur doit démarrer à + partir de son interface réseau à l’aide de PXE. +Espace de configuration + + Une structure de sous-répertoire contenant plusieurs fichiers. + Ces fichiers décrivent les détails de la manière dont + l’installation des clients sera effectuée. Toutes les données de + configuration sont stockées là. Il est également appelé config + space pour faire court. Il comprend des informations sur : + + o Organisation du disque dur dans un format similaire à fstab + o Systèmes de fichiers locaux, leurs types, points de montage + et options de montage + o Paquets logiciels + o Disposition du clavier, fuseau horaire, configuration Xorg, + systèmes de fichiers distants, comptes utilisateurs, + imprimantes … + + Le package fai-doc inclut un exemple d’espace de configuration + incluant des exemples pour les hôtes utilisant l’environnement + XFCE et GNOME entre autres. En invoquant fai-mk-configspace on + copie ces exemples vers /srv/fai/config. Il est recommandé + d’étudier ces fichiers de configuration et ces scripts pour mieux + comprendre comment FAI fonctionne. + +nfsroot, NFS-Root  + Un système de fichiers situé sur le serveur d’installation. + Pendant le processus d’installation, c’est le système de fichiers + complet pour les clients d’installation. Tous les clients + partagent le même nfsroot, qu’ils montent en lecture seule. Le + nfsroot a besoin d’environ 1.1Go d’espace disque libre. +TFTP  + Sert aux clients le fichier initrd et le noyau utilisés pour le + processus d’installation. Avec le système de fichiers servi par + NFS, ces deux composent un système d’exploitation temporaire dans + lequel les installations sont réalisées. +Classes FAI  + Les classes sont des noms qui déterminent quel fichier de + configuration est sélectionné. Si un client appartient à la + classe WEBSERVER, il sera configuré en tant que serveur Web, la + classe DESKTOP pour, par exemple, déterminer les paquets + logiciels qui seront installés. +profil  + Un profil FAI est juste une liste de classes FAI assignées à un + nom de profil, qui est étendu par une description de ce profil. + C’est-à-dire que l’on peut avoir deux profils "Webserver", l’un + incluant la classe APACHE, et un autre incluant la classe NGINX, + pour ensuite installer la solution de serveur web correspondante. +les tâches  + L’installation d’un client se compose de plusieurs parties, + appelées tâches. Les tâches sont des sous-programmes prédéfinis + qui effectuent une certaine partie de la FAI. Les tâches FAI + suivantes sont exécutées au cours d’une installation sur les + clients d’installation. + + confdir # trouver l'espace de configuration + setup # quelques initialisations, lancement de sshd à la demande + defclass # définition des classes FAI + defvar # définition de variables + action # évaluer FAI_ACTION + install # Démarrer l'installation + partition # partitionner les disques durs, créer les systèmes de fichiers + mountdisks # monter les systèmes de fichiers + extrbase # extraire le fichier base.tar.xz + debconf # pré-ensemencer le deconf de Debian + repository # préparer l'accès aux dépôts de paquets + updatebase # mettre en place les outils de gestion de paquets et mettre les paquets à jour + instsoft # installer les paquets logiciels + configure # lancer les scripts de personnalisation + finish # faire un peu de ménage, afficher les statistiques d'installation + tests # appeler des tests s'il y en a + chboot # lancer fai-chboot sur le serveur d'installation + savelog # enregistrer les fichiers de journalisation localement et à distance + faiend # redémarrage de l'hôte, éjection du CD si nécessaire + + Voilà des tâches qui sont exécutées seulement lorsqu’on fait une + action différente + + dirinstall # installer un environnement chroot + softupdate # ne faire que la configuration du système + sysinfo # imprimer une information système détaillée + inventory # imprimer un inventaire court du matériel + +Pour une description plus détaillée des tâches , voir [tasks]. + +Notez que vous n’êtes pas limité aux tâches FAI. Vous pouvez +également définir des programmes ou des scripts supplémentaires qui +seront exécutés à certaines occasions. On les appelle des hooks. hooks - Hooks are plugins, they can add additional functionality to the - installation process or even replace entire tasks of FAI. Hooks - are explained in detail in [hooks]. + Les Hooks sont des plugins, ils peuvent ajouter des + fonctionnalités supplémentaires au processus d’installation ou + même remplacer des tâches entières de FAI. Les Hooks sont + expliqués en détail dans [hooks]. -4.2. The class concept +4.2. Le concept de classe -------------- -Classes are used in nearly all tasks of the installation. Classes -determine which configuration files to choose from a list of -available alternatives. To determine which config files to use, FAI -searches the list of defined classes and uses all configuration files -that match a class name ^[5]. The following loop implements this -function in pseudo shell code: +Les classes sont utilisées dans presque toutes les tâches de +l’installation. Les classes déterminent quels fichiers de +configuration choisir parmi une liste d’alternatives disponibles. +Pour déterminer les fichiers de configuration à utiliser, FAI +recherche dans la liste des classes définies et utilise tous les +fichiers de configuration correspondant à un nom de classe ^[6]. La +boucle suivante implémente cette fonction en pseudo-code shell : for class in $all_classes; do - if [ -r $config_dir/$class ]; then # if a file with name $class exists - your_command $config_dir/$class # call a command with this file name - # exit if only the first matching file is needed + if [ -r $config_dir/$class ]; then # s'il exite un fichier nommé $class + your_command $config_dir/$class # invoquer une commande avec ce nom de fichier + # sortir si on n'a besoin que du premier fichier qui convient fi done -The very nice feature of this is that you can add a new configuration -alternative and it will automatically be used by FAI without changing -the code, if the configuration file uses a class name. - -This is because the loop automatically detects new configuration -files that should be used. The idea of using classes in general and -using certain files matching a class name for a configuration is -adopted from the installation scripts by Casper Dik for Solaris. This -technique proved to be very useful and easy. - -You can group multiple hosts that share the same configuration files -by using the same class. You can also split the whole configuration -data for all clients into several classes and use them like lego -bricks and build the entire configuration for a single client by -assembling the bricks together. - -If a client belongs to class A, we say the class A is defined for -this client. A class has no value, it is just defined or undefined. - -Classes determine how the installation is performed. For example, an -install client can be configured to get the XFCE desktop by just -adding the class XFCE to it. Naturally, also more granular -configurations are possible. For instance, classes can describe how -the hard disk should be partitioned, they can define which software -packages will be installed, or which customization steps are -performed. - -Often, a client configuration is created by only changing or -appending the classes to which this client belongs, making the -installation of a new client very easy. Thus no additional -information needs to be added to the configuration space if the -existing classes suffice for your needs. - -As you can see, classes are a central pillar of customizing your -configuration space and with that your client installation. On how to -define your own classes, refer to [defining classes]. +La beauté de ceci c’est qu’on peut ajouter une nouvelle alternative +de configuration et qu’elle sera automatiquement utilisée par FAI +sans modifier le code, si le fichier de configuration utilise un nom +de classe. + +C’est parce que la boucle détecte automatiquement les nouveaux +fichiers de configuration qui doivent être utilisés. L’idée +d’utiliser des classes en général et d’utiliser certains fichiers +correspondant à un nom de classe pour une configuration est adoptée à +partir des scripts d’installation par Casper Dik pour Solaris. Cette +technique s’est avérée très utile et facile. + +Vous pouvez regrouper plusieurs hôtes partageant les mêmes fichiers +de configuration en utilisant la même classe. Vous pouvez également +diviser l’ensemble des données de configuration pour tous les clients +en plusieurs classes et les utiliser comme des briques de lego et +construire la configuration entière pour un seul client en assemblant +les briques. + +Si un client appartient à la classe A, on dit que la classe A est +définie pour ce client. Une classe n’a pas de valeur, elle est juste +définie ou indéfinie. + +Les classes déterminent comment l’installation est effectuée. Par +exemple, un client d’installation peut être configuré pour obtenir le +bureau XFCE en y ajoutant simplement la classe XFCE . Naturellement, +des configurations plus granulaires sont également possibles. Par +exemple, les classes peuvent décrire comment le disque dur doit être +partitionné, elles peuvent définir quels paquets logiciels seront +installés, ou quelles étapes de personnalisation seront exécutées. + +Souvent, une configuration client est juste créée en modifiant ou en +ajoutant les classes auxquelles ce client appartient, ce qui rend +l’installation d’un nouveau client très facile. Ainsi, aucune +information supplémentaire ne doit être ajoutée à l’espace de +configuration si les classes existantes suffisent à vos besoins. + +Comme vous pouvez le voir, les classes sont un pilier central de la +personnalisation de votre espace de configuration et de celui de de +votre client d’installation. Pour définir vos propres classes, +reportez-vous à [defining classes]. --------------------------------------------------------------------- -5. Setup your faiserver +5. Configurer votre faiserver --------------------------------------------------------------------- -Here’s how to set up the install server in a few minutes. Following -steps are needed: +Voici comment configurer le serveur d’installation en quelques +minutes. Les étapes suivantes sont nécessaires : - 1. Set up the install server + 1. Configurer le serveur d’installation - a. Install FAI packages - b. Create the nfsroot - c. Copy the examples to the config space - d. Configure network daemons - e. Create the PXELINUX configurations - 2. Boot and install clients + a. Installer les paquets de FAI + b. Créer le nfsroot + c. Copier les exemples dans l’espace de configuration + d. Configurer les démons réseau + e. Créer les configurations PXELINUX + 2. Démarrage et installation des clients -5.1. Install the FAI packages +5.1. Installer les paquets FAI -------------- - * Install the key of the FAI project package repository. - * Add the URL of the package repository of the FAI project. - * Install the package fai-quickstart on your install server. + * Installer la clé du dépôt de paquets du projet FAI. + * Ajouter l’URL du dépôt de paquets du projet FAI. + * Installer le paquet fai-quickstart sur le serveur d’installation. -Use these commands for installing: +Utilisez ces commandes pour l’installation : # wget -O /etc/apt/trusted.gpg.d/fai-project.gpg https://fai-project.org/download/2BF8D9FE074BCDE4.gpg # echo "deb http://fai-project.org/download bookworm koeln" > /etc/apt/sources.list.d/fai.list -or +ou # apt install extrepo ; extrepo enable fai -and then +et ensuite : # apt-get update # aptitude install fai-quickstart -This will also install the packages for DHCP, TFTP and NFS server -daemons. +Cela installera également les paquets pour les démons de serveur +DHCP, TFTP et NFS. -5.2. Create the nfsroot +5.2. Créer le nfsroot -------------- - * Also enable the package repository of the FAI project in a - different sources.list file which is used when building the - nfsroot. Then, enable the log user for FAI. + * Activez également le dépôt de paquets du projet FAI dans un autre + fichier sources.list qui est utilisé lors de la construction du + nfsroot. Ensuite, activez l’utilisateur de journal pour FAI. # sed -i -e 's/^#deb/deb/' /etc/fai/apt/sources.list # sed -i -e 's/#LOGUSER/LOGUSER/' /etc/fai/fai.conf - * By default, FAI uses http://deb.debian.org as package mirror, - which should attempt to find a fast package repository for you. ^ - [6] Now, we can run fai-setup(8) ^[7] and check if everything - went well. The log file is written to /var/log/fai/fai-setup.log. + * Par défaut, FAI utilise http://httpredir.debian.org/ comme miroir + de paquets, qui va tenter de trouver un dépôt de paquets rapide + pour vous. ^[7] Ensuite, on peut lancer fai-setup(8) ^[8] Et + vérifiez si tout s’est bien passé. Le fichier de journal est + écrit dans /var/log/fai/fai-setup.log. # fai-setup -v - * These are some of the lines you will see at the end of fai-setup. - A complete example of fai-setup.log is available on the FAI web - page at https://fai-project.org/logs/fai-setup.log. + * Voilà quelques-unes des lignes que vous verrez à la fin de + fai-setup. Un exemple complet de fai-setup.log est disponible sur + la page web FAI à https://fai-project.org/logs/fai-setup.log. FAI packages and related packages inside the nfsroot: dracut 059-4 @@ -709,75 +726,83 @@ Please don't forget to fill out the FAI questionnaire after you've finished your FAI setup finished. Log file written to /var/log/fai/fai-setup.log - * fai-setup has created the LOGUSER, the nfsroot and has added - additional lines to /etc/exports. The subdirectories added to / - etc/exports are exported via NFS v3, so all install clients in - the same subnet can mount them via NFS. + * fai-setup a créé le LOGUSER, le nfsroot et a ajouté des lignes + supplémentaires à /etc/exports. Les sous-répertoires ajoutés à / + etc/exports sont exportés via NFS v3, de sorte que tous les + clients d’installation dans le même sous-réseau peuvent les + monter via NFS. -5.3. Creating the configuration space +5.3. Création de l’espace de configuration -------------- -Install the simple examples into the configuration space ^[8]. +Installez les exemples simples dans l’espace de configuration ^[9]. $ fai-mk-configspace -These examples contain configuration for some sample hosts. Depending -on the host name used, your computer will be configured as follows: +Ces exemples contiennent la configuration pour certains hôtes +d’exemple. Selon le nom d’hôte utilisé, votre ordinateur sera +configuré comme suit : demohost - A machine which needs only a small hard disk. This machine is - configured with network as DHCP client, and an account demo is - created. + Une machine qui n’a besoin que d’un petit disque dur. Cette + machine est configurée avec le réseau en tant que client DHCP, et + une démo de compte est créée. xfcehost - A XFCE desktop is installed, using LVM, and the account demo is - created. + Un bureau XFCE est installé, utilisant LVM, et la démo du compte + est créée. gnomehost - A GNOME desktop is installed, and the account demo is created. -ubuntuhost - A Ubuntu desktop will be installed, and the account demo is - created. -other host names - Hosts with another host name will most notably use the classes - FAIBASE, DHCPC and GRUB. + Un bureau GNOME est installé et la démo du compte est créée. + +ubuntuhost::\n" Un bureau Ubuntu sera installé et la démo du compte +est créée. + +autres noms d’hôtes + Les hôtes disposant d’un autre nom d’hôte utiliseront notamment + les classes FAIBASE, DHCPC et GRUB. -All hosts will have an account called demo with password fai. The -root account also has the password fai. +Tous les hôtes auront un compte appelé demo avec mot de passe fai. Le +compte root a également le mot de passe fai. -If the FAI flag menu is added, instead of using the host name for -determing the type of installation, a menu is presented, and the user -can choose a profile for the installation. +Si l’indicateur FAI menu est ajouté, au lieu d’utiliser le nom d’hôte +pour déterminer le type d’installation, un menu est présenté et +l’utilisateur peut choisir un profil pour l’installation. -5.4. Configure the network daemons +5.4. Configurer les démons réseau -------------- -For booting the install client via PXE, the install server needs a -DHCP and a TFTP daemon running. The package fai-quickstart has -already installed the software packages for those daemons. -Additionally the package of the NFS server for exporting the nfsroot -and the config space was installed. +Pour démarrer le client d’installation via PXE, le serveur +d’installation a besoin d’un démon DHCP et d’un démon TFTP +fonctionnels. Le paquet fai-quickstart a déjà installé les paquets +logiciels pour ces démons. En outre, le paquet du serveur NFS pour +l’exportation du nfsroot et de l’espace de configuration a été +installé. -5.4.1. Configuration of the DHCP daemon +5.4.1. Configuration du démon DHCP -Ideally, your faiserver should also be your DHCP server. If that is -not the case, instruct the admin responsible of the DHCP server to -configure it according to this section. Optionally, it is possible to -avoid that by using the [autodiscover] feature released in FAI 5.0. +Idéalement, votre faiserver doit également être votre serveur DHCP. +Si ce n’est pas le cas, demandez à l’administrateur responsable du +serveur DHCP de le configurer conformément à cette section. Il est +possible d’éviter cela optionnellement en utilisant la fonctionnalité +[autodiscover] diffusée dans FAI 5.0. -An example for dhcpd.conf(5) is provided with the fai-doc package. -Start using this example and look at all options used therein. +Un exemple pour dhcpd.conf(5) est fourni avec le paquet fai-doc. +Commencez à utiliser cet exemple et regardez toutes les options qui y +sont utilisées. # cp /usr/share/doc/fai-doc/examples/etc/dhcpd.conf /etc/dhcp/ -The only FAI specific information inside this configuration file is -to set filename (DHCP option 67) to fai/pxelinux.0 and to set -next-server (DHCP option 66, also called TFTP server name) and -server-name to the name of your install server. All other information -is only network related data, which is used in almost all DHCP -configurations. Adjust these network parameters to your local needs. +Les seules informations spécifiques FAI contenues dans ce fichier de +configuration sont d’assigner filename (DHCP option 67) à la valeur +fai/pxelinux.0 et d’assigner next-server (DHCP option 66, also aussi +nommée TFTP server name) et server-name à la valeur du nom de votre +serveur d’install . Toutes les autres informations sont uniquement +des données liées au réseau, qui sont utilisées dans presque toutes +les configurations DHCP. Ajustez ces paramètres de réseau à vos +besoins locaux. deny unknown-clients; option dhcp-max-message-size 2048; @@ -794,62 +819,63 @@ subnet 192.168.33.0 netmask 255.255.255.0 { filename "fai/pxelinux.0"; } -If you make any changes to the DHCP configuration, you must restart -the daemon. +Si vous apportez des modifications à la configuration DHCP, vous +devez redémarrer le démon. # invoke-rc.d isc-dhcp-server restart -If you have multiple network interfaces, you can define on which -interface the server will listen in /etc/default/isc-dhcp-server. By -default, the DHCP daemon writes its log messages to /var/log/ -daemon.log. +Si vous disposez de plusieurs interfaces réseau, vous pouvez définir +l’interface que le serveur écoutera dans /etc/default/isc-dhcp-server +. Par défaut, le démon DHCP écrit ses messages de journalisation dans +/var/log/daemon.log. -5.4.2. Adding a host entry to DHCP +5.4.2. Ajout d’une entrée d’hôte au DHCP -The MAC address is given by the hardware of the network card. For -each install client you collect its MAC address and to map it to an -IP address and to a host name. First, we add the IP address and the -hostname to /etc/hosts ^[9]. +L’adresse MAC est donnée par le matériel de la carte réseau. Pour +chaque client d’installation, vous collectez son adresse MAC et +l’associez à une adresse IP et à un nom d’hôte. Tout d’abord, nous +ajoutons l’adresse IP et le nom d’hôte à /etc/hosts ^[10]. 192.168.33.100 demohost -The mapping from the MAC address to the IP address is done in the -dhcpd.conf file. Here, we add a host entry using the command -dhcp-edit(8). Here you have to replace 01:02:03:AB:CD:EF ith the MAC -you have found. +L’association de l’adresse MAC à l’adresse IP est effectuée dans le +fichier dhcpd.conf. Ici, nous ajoutons une entrée d’hôte en utilisant +la commande +dhcp-edit(8)+ . Ici, vous devez remplacer +01:02:03:AB:CD:EF avec l’adresse MAC que vous avez trouvé. # dhcp-edit demohost 01:02:03:AB:CD:EF -After calling this command, this is what the host entry in dhcpd.conf -will look like: +Après l’invocation de cette commande, voici à quoi l’entrée d’hôte +dans dhcpd.conf ressemblera : host demohost {hardware ethernet 01:02:03:AB:CD:EF;fixed-address demohost;} 5.4.3. TFTP -Normally, you do not need any changes to the TFTP dameon -configuration. The files which are provided by TFTP are located in / -srv/tftp/fai. +Normalement, vous n’avez pas besoin d’apporter de modifications à la +configuration démon TFTP. Les fichiers fournis par TFTP sont situés +dans /srv/tftp/fai. 5.4.4. NFS -The command fai-setup has already set up the NFS daemon and added -some lines to the configuration file /etc/exports. It exports the -directories using NFS v3. +La commande fai-setup a déjà configuré le démon NFS et ajouté +quelques lignes au fichier de configuration /etc/exports. Il exporte +les répertoires en utilisant NFS v3. -5.5. Creating the PXELINUX configuration +5.5. Création de la configuration PXELINUX -------------- -The last step before booting your client for the first time is to -specify what configuration the client should boot when doing PXE -boot. We use the command fai-chboot(8) to create a pxelinux -configuration for each install client. This includes information -about the kernel, the initrd, the config space and some boot -parameters. You should read the manual page, which gives you some -good examples. Here’s the command for starting the installation for -the host demohost. +La dernière étape avant de démarrer votre client pour la première +fois est de spécifier quelle configuration le client doit démarrer +lors de l’amorçage PXE. Nous utilisons la commande fai-chboot(8) pour +créer une configuration pxelinux pour chaque client d’installation. +Cela comprend des informations sur le noyau, le fichier initrd, +l’espace de configuration et certains paramètres d’amorçage. Vous +devriez lire la page de manuel, qui vous donne quelques bons +exemples. Voici la commande pour démarrer l’installation de l’hôte +demohost. $ fai-chboot -IFv -u nfs://faiserver/srv/fai/config demohost @@ -860,177 +886,198 @@ Booting kernel vmlinuz-4.19.0-5-amd64 demohost has 192.168.33.100 in hex C0A82164 Writing file /srv/tftp/fai/pxelinux.cfg/C0A82164 for demohost -At this point, you should have a working faiserver setup and your -clients should boot into FAI and be able to install one of the -examples. +À ce stade, vous devriez avoir une configuration faiserver de travail +et vos clients devraient démarrer dans FAI et être en mesure +d’installer l’un des exemples. -In the following section, you can read about planning your -installation, tailoring your configuration space to your particular -needs and extending FAI using hooks. +Dans la section suivante, vous pouvez lire la planification de votre +installation, adapter votre espace de configuration à vos besoins +particuliers et étendre FAI à l’aide de hooks. -5.6. Custom server +5.6. Serveur personnalisé -------------- -The faiserver and its setup is by no means static. It is possible to -customize and extend your server. For this, please refer to the -[Customizing your install server setup] section in [advanced]. +Le faiserver et sa configuration n’est nullement statique. Il est +possible de personnaliser et d’étendre votre serveur. Pour cela, +reportez-vous à la section[Customizing your install server setup] +dans [advanced]." --------------------------------------------------------------------- -6. Plan your installation +6. Planifiez votre installation --------------------------------------------------------------------- -Before starting your installation, you should invest a lot of time -into planning your installation. Once you’re happy with your -installation concept, FAI can do all the boring and repetitive tasks -to turn your plans into reality. FAI can’t do good installations if -your concept is imperfect or lacks some important details. Start -planning the installation by answering the following questions: - - * Will I create a Beowulf cluster, or do I have to install some - desktop machines? - * What does my LAN topology look like? - * Do I have uniform hardware? Will the hardware stay uniform in the - future? - * Does the hardware need a special kernel? - * How should the hosts be named? - * How should the local hard disks be partitioned? - * Which applications will be run by the users? - * Do the users need a queuing system? - * What software should be installed? - * Which daemons should be started, and what should the - configuration for these look like? - * Which remote file systems should be mounted? - * How should backups be performed? - -You also have to think about user accounts, printers, a mail system, -cron jobs, graphic cards, dual boot, NIS, NTP, timezone, keyboard -layout, exporting and mounting directories via NFS and many other -things. So, there’s a lot to do before starting an installation. And -remember that knowledge is power, and it’s up to you to use it. -Installation and administration is a process, not a product. FAI -can’t do things you don’t tell it to do. - -You don’t need to start from scratch. Look at the files and scripts -in the configuration space. There are a lot of things you can use for -your own installation. A good paper called "Bootstrapping an -Infrastructure" with more aspects of building an infrastructure is -available at http://www.infrastructures.org/papers/bootstrap/ -bootstrap.html - - -6.1. The configuration space and its subdirectories +Avant de commencer votre installation, vous devriez investir beaucoup +de temps dans la planification de votre installation. Une fois que +vous êtes satisfait de votre concept d’installation, FAI peut faire +toutes les tâches ennuyeuses et répétitives pour transformer vos +plans en réalité. FAI ne peut pas faire de bonnes installations si +votre concept est imparfait ou qu’il y manque quelques détails +importants. Commencez à planifier l’installation en répondant aux +questions suivantes : + + * Est-ce que je vais créer un cluster Beowulf ou dois-je installer + des machines de bureau ? + * À quoi ressemble ma topologie LAN ? + * Ai-je un matériel uniforme ? Le matériel sera-t-il uniforme à + l’avenir ? + * Le matériel a-t-il besoin d’un noyau spécial ? + * Comment nommer les hôtes ? + * Comment les disques durs locaux doivent-ils être partitionnés ? + * Quelles applications seront lancées par les utilisateurs ? + * Les utilisateurs ont-ils besoin d’un système de mise en file + d’attente ? + * Quels logiciels faut-il installer ? + * Quels démons devraient être lancés, et à quoi devrait ressembler + leur configuration ? + * Quels systèmes de fichiers distants doivent être montés ? + * Comment effectuer les sauvegardes ? + +Vous devez également penser à des comptes d’utilisateur, des +imprimantes, un système de courrier, des travaux de cron, des cartes +graphiques, au double amorçage, au NIS, au NTP, au fuseau horaire, à +la disposition de clavier, à l’exportation et au montage des +annuaires via NFS et à beaucoup d’autres choses. Donc, il ya beaucoup +à faire avant de commencer une installation. Et rappelez-vous que la +connaissance est le pouvoir, et c’est à vous de l’utiliser. +L’installation et l’administration sont un processus et non un +produit. FAI ne peut pas faire les choses que vous ne lui dites pas +de faire. + +Mais vous ne devez pas commencer à partir de zéro. Examinez les +fichiers et les scripts dans l’espace de configuration. Il ya +beaucoup de choses que vous pouvez utiliser pour votre propre +installation. Un bon article intitulé « Bootstrapping an +Infrastructure » avec d’autres aspects de la construction d’une +infrastructure est disponible sur http://www.infrastructures.org/ +papers/bootstrap/bootstrap.html + + +6.1. L’espace de configuration et ses sous-répertoires -------------- -The configuration space is the collection of information about how -exactly to install a client. The central configuration space for all -install clients is located on the install server in /srv/fai/config -and its subdirectories. This will be mounted by the install clients -to /var/lib/fai/config. The main installation command fai(8) uses all -these subdirectories in the order listed except for hooks. +L’espace de configuration est la collection des informations qui +disent comment exactement configurer un client. L’espace central de +configuration pour tous les clients d’installation est situé sur le +serveur d’installation dans /srv/fai/config et ses sous-répertoires. +Il sera monté par les clients sous /var/lib/fai/config. La commande +princpale d’installation fai(8) utilise tous ces sous-répertoires +dans l’ordre listé sauf pour les hooks. class/ - Scripts and files to define classes and variables. + Scripts et fichiers pour définir des classes et des variables. disk_config/ - Configuration files for disk partitioning, software RAID, LVM and - file system creation. + Fichiers de configuration pour le partitionnement de disque, RAID + logiciel, LVM et création de système de fichiers. basefiles/ - Normally the file base.tar.xz (located inside the nfsroot) is - extracted on the install client after the new file systems are - created and before package are installed. This is a minimal base - image, created right after calling debootstrap during the - creation of the nfsroot on the install server. If you want to - install another distribution than the nfsroot is, you can put a - tar file into the subdirectory basefiles/ and name it after a - class. Then the command ftar(8) is used to extract the tar file - based on the classes defined. Thus the file has to be named - CLASS.tar.xz not CLASS.base.tar.xz. This is done in task extrbase - . Use this if you want to install another distribution or version - than that running during the installation. - - This basefile can also be received based on FAI classes via HTTP/ - HTTPS or FTP by defining the variable FAI_BASEFILEURL. FAI will - download a file CLASSNAME.tar.xz (or tgz, or tar.gz,…) from this - URL, if CLASSNAME matches a FAI class. - - Example: + Normalement , le fichier base.tar.xz (situé à l’intérieur du + nfsroot) est extrait sur le client d’installation après la + création des nouveaux systèmes de fichiers et avant + l’installation des paquets. Il s’agit d’une image de base + minimale, créée juste après avoir appelé debootstrap lors de la + création du nfsroot sur le serveur d’installation. Si vous voulez + installer une autre distribution que celle du nfsroot, vous + pouvez mettre un fichier tar dans le sous-répertoire basefiles/ + et le nommer selon une classe. Ensuite, la commande ftar(8) est + utilisée pour extraire le fichier tar en fonction des classes + définies. Ainsi, le fichier doit être nommé CLASS.tar.xz et non + CLASS.base.tar.xz. Cela se fait dans la tâche extrbase. Utilisez + cette option si vous souhaitez installer une autre distribution + ou une version différente de celle exécutée pendant + l’installation. + + Ce fichier de base peut également être reçu en fonction des + classes FAI via HTTP/HTTPS ou FTP en définissant la variable + FAI_BASEFILEURL. FAI téléchargera un fichier CLASSNAME.tar.xz (ou + tgz, ou tar.gz, …) à partir de cette URL, si CLASSNAME correspond + à une classe FAI. + + Exemple : FAI_BASEFILEURL=https://fai-project.org/download/basefiles/ -The folder must support directory listing. FAI will not probe for -potentially matching files. +Le dossier doit prendre en charge la liste des répertoires. FAI ne +recherchera pas de fichiers potentiellement correspondants. -See chapter [otherdists] for how to install different distributions. +Voir le chapitre [otherdists] pour savoir comment installer +différentes distributions. debconf/ - This directory holds all debconf(7) data. The format is the same - that is used by debconf-set-selections(1). + Ce répertoire contient toutes les données debconf(7). Le format + est le même que celui utilisé par debconf-set-selections(1). package_config/ - Files with class names contain lists of software packages to be - installed or removed by install_packages(8). Files named - .gpg are added to the list of keys used by apt for trusted - package repositories. + Les fichiers avec des noms de classe contiennent des listes de + paquets à installer ou à désinstaller par install_packages(8). + Les fichiers nommés .gpg sont ajoutés à la liste des clés + utilisées par apt pour les dépôts de paquets approuvés. pkgs/ - This directory can contain subdirectories named by classes. You - can put .deb or .rpm files into these subdirectories. FAI will - then install these packages without the need of creating the - metadata of a package repository. + Ce répertoire peut avoir des sous-répertoires nommés selon des + classes. Vous pouvez mettre des fichiers .deb ou .rpm dans ces + sous-répertoires. FAI installera ces paquets sans qu’il soit + besoin de créer les métadonnées d’un dépôt de paquets. scripts/ - Scripts for your local site customization. Used by fai-do-scripts - (1). + Scripts pour la personnalisation de votre site local. Utilisé par + fai-do-scripts(1). files/ - Files used by customization scripts. Most files are located in a - subtree structure which reflects the ordinary directory tree. For - example, the templates for nsswitch.conf are located in $FAI/ - files/etc/nsswitch.conf and are named according to the classes - that they should match: $FAI/files/etc/nsswitch.conf/NIS is the - version of /etc/nsswitch.conf to use for the NIS class. Note that - the contents of the files directory are not automatically copied - to the target machine, rather they must be explicitly copied by - customization scripts using the fcopy(8) command. + Les Fichiers utilisés par les scripts de personnalisation. La + plupart des fichiers se trouvent dans un sous-répertoire qui + reflète l’arborescence de répertoires ordinaire. Par exemple, les + modèles de _nsswitch.conf_ se trouvent dans $FAI/files/etc/ + nsswitch.conf et sont nommés en fonction des classes auxquelles + ils doivent correspondre : $FAI/files/etc/nsswitch.conf/NIS est + la version de /etc/nsswitch.conf à utiliser pour la classe NIS. + Notez que le contenu du répertoire n’est pas automatiquement + copié sur la machine cible, mais qu’il doit être explicitement + copié par des scripts de personnalisation à l’aide de la commande + fcopy(8). hooks/ - Hooks are user defined programs or scripts, which are called - during the installation process. They can extend or replace the - default tasks. The file name must be of format taskname.CLASSNAME - [.sh]. A hook called updatebase.DEBIAN is executed prior to the - task updatebase and only if the install client belongs to the - class DEBIAN. + Les hooks sont des programmes ou des scripts définis par + l’utilisateur, qui sont lancés pendant le processus + d’installation. Ils peuvent étendre ou remplacer les tâches par + défaut. Le nom du fichier doit être de format taskname.CLASSNAME + [.sh]. Un hook appelé updatebase.DEBIAN est exécuté avant la + tâche updatebase et seulement si l’installation du client fait + partie de la classe DEBIAN. -6.2. Defining classes +6.2. Définition des classes -------------- -There are different possibilities to define classes: - - 1. Some default classes are defined for every host: DEFAULT, LAST - and its host name. - 2. Classes may be listed within a file (by default in class/ - ) - 3. Classes may be dynamically defined by scripts. - -The last option is a very nice feature, since these scripts will -define classes in a very flexible way. For example, several classes -may be defined only if certain hardware is identified or a class is -defined depending on the network subnet information. - -All names of classes, except the host name, are written in uppercase. -They must not contain a hyphen, a hash, a semicolon or a dot, but may -contain underscores and digits. - -The task defclass calls the command fai-class(1) to define classes. -All scripts matching ^[0-9][0-9]* (they start with two digits) in the -subdirectory $FAI/class are executed for defining classes. Everything -that is printed to STDOUT is automatically defined as a class. For -more information on defining class, read the manual pages for -fai-class(1). The script 50-host-classes (see below a stripped -version) is used to define classes depending on the host name. +Il existe différentes possibilités pour définir des classes : + + 1. Certaines classes par défaut sont définies pour chaque hôte : + DEFAULT, LAST et son nom d’hôte. + 2. Les classes peuvent être répertoriées dans un fichier (par défaut + dans class/). + 3. Les classes peuvent être dynamiquement définies par des scripts. + +La dernière option est une fonctionnalité très intéressante, puisque +ces scripts définiront des classes d’une façon très souple. Par +exemple, plusieurs classes peuvent être définies uniquement si +certains matériels sont identifiés ou si une classe est définie en +fonction des informations du sous-réseau. + +Tous les noms de classes, sauf le nom d’hôte, sont écrits en +majuscules. Ils ne doivent pas contenir de trait d’union, de dièse, +de point-virgule ni de point, mais peuvent contenir des caractères de +soulignement et des chiffres. + +La tâche defclass appelle la commande fai-class(1) pour définir les +classes. Tous les scripts correspondant à l’expression ^[0-9][0-9]* +(qui commencent avec deux chiffres) Dans le sous-repertoire $FAI/ +class sont exécutés afin de définir les classes. Tout ce qui is +affiché sur STDOUT est automatiquement defini comme une classe. Pour +plus d’informations sur Les définitions de classe , lire les pages de +manuel de fai-class(1). Le script 50-host-classes (voir ci - dessous +la version allégée) est utilisé pour les définir des classes en +fonction du nom d’hôte. # use a list of classes for our demo machines case $HOSTNAME in @@ -1046,118 +1093,126 @@ case $HOSTNAME in echo "FAIBASE DEBIAN DEMO" ;; esac -Host names should rarely be used for the configuration files in the -configuration space. Instead, a class should be defined and then -added for a given host. This is because most of the time the -configuration data is not specific for one host, but can be shared -among several hosts. +Les noms d’hôtes doivent rarement être utilisé pour les fichiers de +configuration dans l’espace de configuration. Au lieu de ça, une +classe doit être définie et ensuite ajoutée pour un hôte donné. En +effet, la plupart du temps les données de configuration ne sont pas +spécifiques à un nom d’hôte, mais peuvent être partagées entre +différents hôtes. -The order of the classes is important because it defines the priority -of the classes from low to high. +L’ordre des classes est important car celui-ci définit la priorité +des classes de faible à élevée. -6.3. Defining variables +6.3. Définition des Variables -------------- -The task defvar defines the variables for the install client. -Variables are defined by scripts in class/*.var. All global variables -can be set in DEFAULT.var. For groups of hosts use a class file. For -a single host use the file $HOSTNAME .var. Also here, it’s useful to -study all the examples. +La tâche defvar definit les variables pour le client d’installation. +Les variables sont définies par les scripts dans class/*.var. Toutes +les variables globales peuvent être définies dans DEFAULT.var. Pour +un groupe d’hôtes utiliser un fichier de classe. Pour un hôte seul, +utiliser le Fichier $HOSTNAME .var. Ici aussi, il est utile d’étudier +tous les exemples. -The following variables are used in the examples and may also be -useful for your installation: +Les variables suivantes sont utilisées dans les exemples et peuvent +aussi être utiles pour votre installation : FAI_ACTION - Set the action FAI should perform. Normally this is done by - fai-chboot(8). If you can’t use this command, define this - variable i.e. in the script LAST.var. + Configure les actions que doit effectuer FAI. Normalement, ceci + se fait par fai-chboot(8). Si vous ne pouvez pas utiliser cette + commande, définissez cette variable dans le script LAST.var. FAI_ALLOW_UNSIGNED - If set to 1, FAI allows the installation of packages from - unsigned repositories. + Si cette variable vaut 1, FAI permet l’installation de paquets à + partir de dépôts non signés. CONSOLEFONT - Is the font which is loaded during installation by setfont(8). + La police de caractères qui est chargée lors de l’installation + par setfont(8). KEYMAP - Defines the keyboard map files in /usr/share/keymaps and $FAI/ - files. You don’t need to specify the full path, since this file - will be located automatically. + Définit les fichiers de disposition du clavier dans /usr/share/ + keymaps et $FAI/files. Vous n’avez pas besoin de spécifier le + chemin complet, car ce fichier sera localisé automatiquement. ROOTPW - The encrypted root password for the new system. You can use crypt - (3), md5 and other hash types for the password. Use mkpasswd(1) - for creating the hash for a certain password. For example, to - generate a md5 hash for the password use + Le mot de passe root chiffré pour le nouveau système. Vous pouvez + utiliser crypt(3), md5 et d’autres types de hachage pour le mot + de passe. Utilisez 'mkpasswd(1)+` pour créer le hachage d’un mot + de passe donné. Par exemple, pour générer le hachage MD5 un mot + de passe, utilisez : -$ echo "yoursecrectpassword" | mkpasswd -m yescrypt -s +$ echo "votre_mot_secret" | mkpasswd -m yescrypt -s UTC - Set hardware clock to UTC if UTC=yes. Otherwise set clock to - local time. See clock(8) for more information. + Règle l’horloge matérielle à UTC si UTC=yes. Sinon, règle + l’horloge à l’heure locale. Voir clock(8) pour plus + d’informations. TIMEZONE - Is the file relative to /usr/share/zoneinfo/ which indicates your - time zone. E.g.: TIMEZONE=Europe/Berlin. + C’est le fichier sous /usr/share/zoneinfo/ qui indique votre + fuseau horaire. Par exemple : TIMEZONE=Europe/Berlin. MODULESLIST - A list of kernel modules which are loaded during boot of the new - system (written to /etc/modules). + Une liste des modules du noyau qui sont chargés pendant le + démarrage du nouveau système (écrits dans /etc/modules). -6.4. Hard disk configuration +6.4. Configuration du disque dur -------------- -The tool setup-storage(8) reads a file in $FAI/disk_config for the -disk configuration. This file describes how all the local disks will -be partitioned, which file system types should be created (like ext3/ -4, xfs, btrfs), and where they are mounted to. You can also create -software RAID and LVM setups using this config file. It’s also -possible to preserve the disk layout or to preserve the data on -certain partitions. +L’outil setup-storage(8) lit un fichier dans $FAI/disk_config pour la +configuration du disque. Ce fichier décrit comment tous les disques +Locaux seront partitionnés, quels types de systèmes de fichiers +doivent etre créés (comme ext3/4, xfs, btrfs), et où ils seront +montés. Vous pouvez aussi créer des configurations RAID logiciel et +LVM en utilisant ce fichier de configuration. Il est aussi possible +de préserver le partitionnement du disque ou de préserver les données +sur certaines partitions. -During the installation process all local file systems are mounted -relative to /target. For example if you specify the mount point /home -in a disk configuration file this will be the directory /target/home -during the installation process and will become /home for the new -installed system. +Pendant le processus d’installation, tous les systèmes de fichiers +locaux sont montés sous le répertoire /target. Par exemple, si vous +spécifiez le point de montage /home dans un fichier de configuration +de disque, ce sera le répertoire /target/home pendant le processus +d’installation et ça deviendra /home pour le nouveau système +installé. -6.5. Extract base file +6.5. Extraction du fichier de base -------------- -A base file is only needed when installing a distribution which is -different from the one in the nfsroot. +Un fichier de base n’est nécessaire que si on installe une +distribution qui est défférente de celle dans le nfsroot. -6.6. Debconf preseeding +6.6. Pré-ensemencement Debconf -------------- -You can use the format described in debconf-set-selections(1). +On peut utiliser le fomat décrit dans debconf-set-selections(1). -6.7. Access to the package repository +6.7. Accès au dépôt de paquets -------------- -FAI supports http, https and NFS for accessing the package mirror. -Set the variable $FAI_DEBMIRROR for using NFS. +FAI supporte http, https, et NFS pour l’accès au miroir de paquets. +Réglez la variable $FAI_DEBMIRROR pour l’utilisation de NFS. -6.8. Software package configuration +6.8. Configuration des paquets logiciels -------------- -Before installing packages, FAI will add the content of all files -named package_config/class.gpg to the list of apt keys. If your local -repository is signed by your keyid AB12CD34 you can easily add this -key, so FAI will use it during installation. Use this command for -creating the CLASS.gpg file: +Avant l’installation de paquets, FAI va ajouter le contenu de tous +les fichiers nommés package_config/class.gpg à la liste des clés apt. +Si votre dépôt local est signé par votre keyid AB12CD34 vous pouvez +facilement ajouter cette clé, ainsi FAI l’utilisera pendant +l’installation. Utilisez cette commande pour créer le fichier +CLASS.gpg : faiserver$ gpg --export AB12CD34 > /srv/fai/config/package_config/MYCLASS.gpg -The script install_packages(8) installs the selected software -packages. It reads all configuration files in $FAI/package_config -whose file name matches a defined class. The syntax is very simple. +Le script install_packages(8) installe les logiciels sélectionnés. Il +lira tous les fichiers de configuration Dans $FAI/package_config dont +le nom correspond à une classe définie. La syntaxe est très simple. # an example package class @@ -1174,346 +1229,378 @@ gpm xdm PACKAGES install GRUB_PC grub-pc -Comments are starting with a hash (#) and are ending at the end of -the line. Every package command begins with the word PACKAGES -followed by a command name, which maps to a different package tool -like apt-get, aptitude or dnf for e.g. The command defines which -command will be used to install the packages named after this -command. The list of all available commands can be listed using -install_packages -H. Supported package tools are: apt, apt-get, -aptitude, smart, yast, dnf, rpm, zypper +Les commentaires commencent par une dièse (#) et se terminent à la +fin de la ligne. Chaque commande de paquet commence par le mot +PACKAGES suivi par un nom de commande, qui correspond à gestionnaire +de paquets distinct comme apt-get, aptitude ou dnf par exemple. la +commande définit quelle commande sera utilisé pour installer les +paquets nommés après cette commande. La liste de toutes les commandes +disponibles peut être listée en utilisant install_packages -H. Les +gestionnaires de paquets pris en charges sont aptitude, apt-get, +smart, yast, dnf, rpm, zypper hold - Put a package on hold. This package will not be handled by dpkg, - e.g not upgraded. + Mettre un paquet en attente. Ce paquet ne sera pas pris en charge + par dpkg, pas exemple il ne sera pas mis à niveau. install - Install all packages (using apt-get) that are specified in the - following lines. If a hyphen is appended to the package name - (with no intervening space), the package will be removed, not - installed. All package names are checked for misspellings. Any - package which does not exist, will be removed from the list of - packages to install. So be careful not to misspell any package - names. + Pour installer tous les paquets (en utilisant apt-get) qui sont + précisés dans les lignes suivantes. Si un tiret est ajouté au nom + du paquet (sans espace intermédiaire), le paquet sera supprimé, + pas installé. Tous les noms de paquets sont vérifiées pour les + fautes de frappe. Tout paquet qui n’existe pas, sera retiré de la + liste des paquets à installer. Soyez donc attentif à ne pas mal + orthographier les noms de paquets. install-norec - Like install but without installing the recommended packages. + Comme install, mais sans installer les paquets recommandés. remove - Remove all packages that are specified in the following lines. - Append a + to the package name if the package should be - installed. + Supprimer tous les paquets qui sont pécisés dans les lignes + suivantes. Si on ajoute un + au nom du paquet, le paquet doit + être installé. taskinst - Install all packages belonging to the tasks that are specified in - the following lines using tasksel(1). You can also use aptitude - for installing tasks. + Installer tous les paquets appartenant aux tâches qui sont + spécifiées dans les lignes suivantes à l’aide de tasksel(1). Vous + pouvez aussi utiliser aptitude pour installer les tâches. aptitude - Install all packages with the command aptitude. This will be the - default in the future and may replace apt-get and taskinst. - Aptitude can also install task packages. + Installer tous les paquets avec la commande aptitude. Ce sera la + valeur par défaut à l’avenir et pourra remplacer apt-get et + taskinst. Aptitude peut aussi installer les tâches de paquets. aptitude-r - Same as aptitude with option --with-recommends. + Idem aptitude avec l’option --with-recommends. unpack - Download package and unpack only. Do not configure the package. + Télécharger les paquets et les décompresser seulement. Ne pas + configurer les paquets. dselect-upgrade - Set package selections using the following lines and install or - remove the packages specified. These lines are the output of the - command dpkg --get-selections. It’s not recommended to use this - format, since you are also specifying all packages which are only - installed because of a dependency or a recommends. It’s better - just to specify the pacakge you like to have, and to let FAI (and - apt-get) resolve the dependencies. - -Multiple lines with lists of space separated names of packages follow -the PACKAGES lines. All dependencies are resolved. Packages with -suffix - (eg. lilo-) will be removed instead of installed. The order -of the packages doesn’t matter. If you like to install packages from -another release than the default, you can append the release name to -the package name like in openoffice.org/etch-backports. You can also -specify a certain version like apt=0.3.1. More information on these -features are described in aptitude(8). - -You can specify additional parameters for the package manager adding -key=value after PACKAGES . Currently we support release= - which will add -t when installing packages. - -Example: + Definir des sélections des paquets en utilisant les lignes + suivantes puis installer ou supprimer les paquets précisés. Ces + lignes sont le résultat de la commande dpkg --get-selections. Il + est recommandé de ne pas utiliser ce format, puisque cela + spécifie aussi tous les paquets qui sont installés seulement en + raison d’une dépendance ou d’une recommandation. Il vaut mieux + juste spécifier le paquet que vous voulez avoir, et de laisser + FAI (et apt-get) résoudre les dépendances. + +Plusieurs lignes avec des listes de noms de paquets séparés par des +espaces suivent les directive PACKAGES. Toutes les dépendances sont +résolues. Les paquets avec suffixe - (par exemple, lilo-) seront +supprimés au lieu d’être installés. L’ordre des paquet n’a pas +d’importance. Si vous souhaitez installer des paquets d’une autre +version que la valeur par défaut, vous pouvez ajouter le nom de la +version au nom du paquet comme dans openoffice.org/etch-backports. +Vous pouvez également spécifier une certaine version comme apt=0.3.1. +Plus d’informations sur ces fonctionnalités sont décrites dans +aptitude(8). + +On peut spécifier des paramètres supplémentaires pour le gestionnaire +de paquets en ajoutant des paires cle=valeur après PACKAGES +. les paires clé, valeur actuellement supportées sont +release= qui ajoute -t durant l’installation des paquets. + +Exemple: PACKAGES install-norec release=testing nvidia-smi -This will install the nvidia-smi package from the testing release, -including the dependencies. Don’t forget to add an entry into -sources.list. You may also want to adjust the apt pinning (see -apt_references(5)). +Cela installerait le paquet nvidia-smi de la distribution testing, en +incluant les dépendances. N’oubliez pas d’ajouter une entrée dans +sources.list. Vous pouvez aussi vouloir ajuste l’épinglage apt (apt +pinning) (voir apt_references(5)) -A line which contains the PRELOADRM commands, downloads a file using -wget(1) into a directory before installing the packages. Using the -file: URL, this file is copied from $FAI_ROOT to the download -directory. For example the package realplayer needs an archive to -install the software, so this archive is downloaded to the directory -/root. After installing the packages this file will be removed. If -the file shouldn’t be removed, use the command PRELOAD instead. +Une ligne qui contient la commande PRELOADRM, télécharge un fichier à +l’aide de wget(1) dans un répertoire avant d’installer les paquets. À +l’aide d’une URL de type file:, ce fichier est copié de $FAI_ROOT +vers le répertoire de téléchargement. Par exemple, le paquet +realplayer a besoin d’une archive pour installer le logiciel, donc +cette archive est téléchargée dans le répertoire /root. Après +l’installation des paquets, ce fichier sera supprimé. Si le fichier +ne doit pas être supprimé, utilisez plutôt la commande PRELOAD. -You can add an arbitrary boolean expression using FAI classes to -define when the list of packages should be installed. Here, the -packages are only installed if the class XORG is defined but the -class MINT is not defined. +On peut ajouter une expression booléenne arbitraire qui utilise des +classes FAI pour définir quand la liste des paquets devrait être +installée. Ici, les paquets seront installés seulement si la classe +XORG est définie mais la classe MINT n’est pas définie. -Example: +Exemple: PACKAGES install UBUNTU && XORG && ! MINT ubuntu-standard ubuntu-desktop -The old way of adding some logic in the PACKAGES lines is still -supported: It’s possible to append a list of class names after the -command for apt-get. So this PACKAGES command will only be executed -when at least one of the corresponding classes is defined (logical -OR). So you can combine many small files into the file DEFAULT. - -If you want to remove a package name from a certain class was part of -this class before, you should not remove the package name from the -class file, but instead append a dash (-) to it. This will make sure -that the package is removed during a softupdate on hosts which were -installed using the old class definition which included this package -name. - -If you specify a package that does not exist this package will be -removed automatically from the installation list only if the command -install is used. - -The concept of classes priority allows a higher priority class (one -that comes later in the sequence of classes) to override the -selection of packages of a lower priority class. For this to work -correctly, the higher priority class must use the same PACKAGES -command (e.g. PACKAGES install-norec instead of just PACKAGES install -) as the one used by the class it is trying to override. This is -useful to suppress installation of a package, for example, to avoid -installing the linuxlogo package installed by class FAIBASE: - -# example of how to override: +L’ancienne façon d’ajouter des expressions logiques dans les lignes +PACKAGES est encore valable : Il est possible d’ajouter une liste de +noms de classes après la commande pour apt-get. Ainsi une telle +commande PACKAGES sera exécutée seulement au moins une des classes +correspondantes est définie (OU logique). On peut donc combiner +plusieurs petits fichiers dans le fichier DEFAULT. + +Si vous souhaitez supprimer un nom de paquet d’une certaine classe +faisait partie de cette classe précédemment, vous ne devez pas +supprimer le nom du paquet classe, mais plutôt de lui ajouter un +tiret (-). Cela garantira que le paquet soit enlevé pendant une mise +a jour sur des hôtes qui étaient installés en utilisant l’ancienne +définition de classe qui comprenait ce nom de paquet. + +Si vous spécifiez un paquet qui n’existe pas, ce paquet sera supprimé +automatiquement de la liste d’installation uniquement si la commande +install est utilisée. + +Le concept de priorité des classes permet à une classe de priorité +plus élevée (qui arrive plus tard dans la séquence des classes) +d’écraser les sélections des paquets de priorité plus basse. Pour que +cela fonctionne correctement, les classes de priorité plus élevée +doivent utiliser les mêmes commandes PACKAGES (par exemple PACKAGES +install-norec au lieu de seulement PACKAGES install) que celles +qu’utilisent la classe qu’on essaie d’écraser. Cela est utile pour +supprimer l’installation d’un paquet, par exemple, pour éviter +d’installer le paquet linuxlogo installé par la classe FAIBASE : + +# exemple montrant comment écraser : # -# On FAIBASE we have: +# Dans FAIBASE il y a : # PACKAGES install-norec # linuxlogo # -# We want to _not_ install linuxlogo, and it is in a -# install-norec section, so we must also use install-norec. +# On veut _ne pas_ installer linuxlogo, et il se trouve dans +# une section install-norec, donc il faut aussi utiliser install-norec. PACKAGES install-norec linuxlogo- -6.9.  Customization scripts +6.9. Scripts de personnalisation -------------- -The command fai-do-scripts(1) is called to execute all scripts in -this directory. If a directory with a class name exists, all scripts -matching ^[0-9][0-9]* are executed in alphabetical order. So it’s -possible to use scripts of different languages (shell, cfengine, -Perl, Python, Ruby, expect,..) for one class. +La commande fai-do-scripts(1) est lancée pour exécuter tous les +scripts dans ce répertoire. Si un répertoire avec un nom de classe +existe, tous les scripts correspondant à l’expression ^[0-9][0-9]* +sont exécutés par ordre alphabétique. Il est donc possible d’utiliser +des scripts de différentes langages (shell, cfengine, Perl, Python, +Ruby, expect,..) pour une classe. -Thoses scripts write their output to sripts.log. The file status.log -contains the names of all scripts executed and their exit status. +Ces scripts écrivent leur sortie standard dans scripts.log. Le +fichier status.log contient les noms de tous les scripts exécutés et +leur statut de terminaison. -6.9.1. Shell scripts +6.9.1. Scripts shell -Most scripts are Bourne shell scripts. Shell scripts are useful if -the configuration task only needs to call some shell commands or -create a file from scratch. In order not to write many short scripts, -it’s possible to use the ifclass command for testing if certain -classes are defined. +La plupart des scripts sont des scripts Bourne shell. Les scripts +shell sont utiles si la tâche de configuration n’a besoin d’appeler +que quelques commandes shell ou créer un fichier à partir de zéro. +Afin d’éviter d’écrire beaucoup de scripts courts, il est possible +d’utiliser la commande ifclass pour tester si certaines classes sont +définies. ifclass -o A B C -checks if one of classes A, B or C are defined. Using -a (logical -AND) checks if all classes of a list are defined. The command ifclass -C checks if only class C is defined. +Vérifie si l’une des classes A, B ou C est définie. L’utilisation de +-a (ET, AND logique) vérifie si toutes les classes d’une liste sont +définies. La commande ifclass C vérifie si seule la classe C est +définie. -For copying files with classes, use the command fcopy(8). If you want -to extract an archive using classes, use ftar(8). For appending lines -to a configuration file use ainsl(1) instead of just echo string >> +Pour copier des fichiers avec des classes, utilisez la commande fcopy +(8). Si vous voulez extraire une archive à l’aide de classes, +utilisez ftar(8). Pour ajouter des lignes à un fichier de +configuration, utilisez ainsl(1) au lieu de simplement echo string >> filename. -FAI also supports zsh(1) scripts during the customization task. -Within scripts, the variable $classes holds a space separated list -with the names of all defined classes. +FAI prend également en charge les scripts zsh(1) pendant la tâche de +personnalisation. Dans les scripts, la variable $classes contient une +liste séparée par des espaces avec les noms de toutes les classes +définies. -6.9.2. Cfengine scripts +6.9.2. Scripts cfengine -CFEngine has a rich set of functions to edit existing configuration -files, e.g LocateLineMatching, ReplaceAll, InsertLine, -AppendIfNoSuchLine, HashCommentLinesContaining. But it can’t handle -variables which are undefined. If a variable is undefined, the whole -cfengine script will abort. +CFEngine dispose d’un riche ensemble de fonctions pour modifier les +fichiers de configuration existants, par exemple LocateLineMatching, +ReplaceAll, InsertLine, AppendIfNoSuchLine, +HashCommentLinesContaining. Mais il ne peut pas traiter les variables +qui sont indéfinies. Si une variable n’est pas définie, l’ensemble du +script cfengine s’arrêtera. -More information can be found in the manual page cfengine(8) or at -the cfengine homepage https://www.cfengine.com. +On peut trouver plus d’informations dans la page de manuel cfengine +(8) ou sur la page d’accueil de cfengine https://www.cfengine.com. -6.10. Hooks +6.10. Les hooks, les « crochets » -------------- -Hooks let you specify functions or programs which are run at certain -steps of the installation process. Before a task is called, FAI -searches for existing hooks for this task and executes them. As you -might expect, classes are also used when calling hooks. Hooks are -executed for every defined class. You only have to create the hook -with the name for the desired class and it will be used. If several -hooks for a task exists, they are called in the order defined by the -classes. If debug is included in $FAI_FLAG the option -d is passed to -all hooks, so you can debug your own hooks. If some default tasks -should be skipped, use the subroutine skiptask and a list of default -tasks as parameters. In the examples provided, the hooks of the class -CENTOS skips some Debian specific tasks. - -The directory $FAI/hooks/ contains all hooks. A hook is an executable -file following the naming scheme taskname.CLASSNAME[.sh] (e.g. -repository.CENTOS or 'savelog.LAST.sh). The task name specifies which -task to precede executing this hook, if the specified class is -defined for the installing client. See section [tasks] for a complete -list of default tasks that can be used. - -A hook of the form hookprefix.classname can’t define variables for -the installation script, because it’s a subprocess. But you can use -any binary executable or any script you wrote. Hooks that have the -suffix .sh (e.g. partition.DEFAULT.sh) must be Bourne shell scripts -and are sourced. So it’s possible to redefine variables for the -installation scripts. - -In the first part of FAI, all hooks with prefix confdir are called. -Those hooks can not be located in the config space, since it’s not -yet available. Therefore these hooks are the only hooks located in -$nfsroot/$FAI/hooks on the install server. All other hooks are found -in $FAI_CONFIGDIR/hooks on the install server. - -All hooks that are called before classes are defined can only use the -following classes: DEFAULT $HOSTNAME LAST. If a hook for class -DEFAULT should only be called if no hook for class $HOSTNAME is -available, insert these lines to the default hook: +Les crochets (hooks) vous permettent de spécifier des fonctions ou +des programmes qui sont exécutés à certaines étapes du processus +d’installation. Avant qu’une tâche soit appelée, FAI recherche les +crochets existants pour cette tâche et les exécute. Comme on peut s’y +attendre, les classes sont également utilisées lors de l’appel de +hooks. Les hooks sont exécutés pour chaque classe définie. Il vous +suffit de créer le hook avec le nom de la classe désirée et il sera +utilisé. Si plusieurs hooks pour une tâche existent, ils sont appelés +dans l’ordre défini par les classes. Si debug est inclus dans +$FAI_FLAG l’option -d est passée à tous les hooks, donc vous pouvez +déboguer vos propres hooks. Si certaines tâches par défaut doivent +être ignorées, utilisez la sous-routine skiptask et une liste de +tâches par défaut comme paramètres. Dans les exemples fournis, les +hooks de la classe CENTOS ignorent certaines tâches spécifiques de +Debian. + +Le répertoire $FAI/hooks/ contient tous les hooks. Un hook est un +fichier exécutable qui est nommé selon la tâche : taskname.CLASSNAME +[.sh] (par exemple, repository.CENTOS ou savelog.LAST.sh). Le nom de +tâche spécifie quelle tâche précède l’exécution de ce hook, si la +classe spécifiée est définie pour le client d’installation. Voir la +section [tasks] pour une liste complète des tâches par défaut qu’on +peut utiliser. + +Un hook du formulaire hookprefix.classname ne peut pas définir de +variables pour le script d’installation, car il s’agit d’un +sous-processus. Mais vous pouvez utiliser n’importe quel exécutable +binaire ou n’importe quel script que vous avez écrit. Les hooks qui +ont le suffixe .sh (par exemple, partition.DEFAULT.sh) doivent être +des scripts Bourne shell et sont sourcé. Il est donc possible de +redéfinir des variables pour les scripts d’installation. + +Dans la première partie de FAI, tous les hooks avec le préfixe +confdir sont appelés. Ces hooks ne peuvent pas être localisés dans +l’espace de configuration, car il n’est pas encore disponible. Par +conséquent, ces hooks sont les seuls hooks situés dans $nfsroot/$FAI/ +hooks sur le serveur d’installation. Tous les autres hooks se +trouvent dans $FAI_CONFIGDIR/hooks sur le serveur d’installation. + +Tous les hooks appelés avant la définition des classes peuvent +utiliser uniquement les classes suivantes: DEFAULT $HOSTNAME LAST. Si +un hook pour la classe DEFAULT doit être appelé uniquement dans le +cas où aucun hook pour la classe $HOSTNAME n’est disponible, insérez +ces lignes dans le hook par défaut : hookexample.DEFAULT: #! /bin/sh -# skip DEFAULT hook if a hook for $HOSTNAME exists +# sauter le hook DEFAULT s'il existe un hook pour $HOSTNAME scriptname=$(basename $0 .DEFAULT) [-f $FAI/hooks/$scriptname.$HOSTNAME ] && exit -# here follows the actions for class DEFAULT +# suivent alors les actions pour la classe DEFAULT . . -Some examples for what hooks could be used: +Quelques exemples de ce à quoi les hooks pourraient être utiles : - * Load kernel modules before classes are defined in $FAI/class. - * Send an email to the administrator if the installation is - finished. - * Install a diskless client and skip local disk partitioning. - * Have a look at hooks/debconf.IMAGE for how to clone a machine - using a file system image. + * Charger les modules du noyau avant que les classes soient + définies dans $FAI/class. + * Envoyer un courriel à l’administrateur si l’installation est + terminée. + * Installer un client sans disque et sautez le partitionnement de + disque local. + * Jeter un œil à hooks/debconf.IMAGE pour savoir comment cloner une + machine en utilisant une image de système de fichiers. -6.11. FAI flags +6.11. Options (flags) de FAI -------------- -The variable $FAI_FLAGS contains a space separated list of flags. -Flags are normally defined in the pxelinux.cfg file which should be -created by fai-chboot(1). The following flags are known: +La variable $FAI_FLAGS contient une liste d’options séparées par des +espaces. Les options sont normalement définies dans le fichier +pxelinux.cfg qui est censément créé par fai-chboot(1). Les options +suivantes sont connues : verbose - Create verbose output during installation. This should always be - the first flag, so consecutive definitions of flags will be - verbosely displayed. + Rend l’installation verbeuse. Cela doit toujours être la première + option (le premier flag), de sorte que les définitions suivantes + des options soient affichées verbeusement. debug - Create debug output. No unattended installation is performed. - During package installation you have to answer all questions of - the postinstall scripts on the client’s console. A lot of debug - information will be printed out. This flag is only useful for FAI - developers. + Afficher des informations de débogage. Aucune installation sans + assistance n’est effectuée. Pendant l’installation du paquet, + vous devez répondre à toutes les questions des scripts + postinstall sur la console du client. Beaucoup d’informations de + débogage seront affichées. Cette option n’est utile que pour les + développeurs FAI. sshd - Start the ssh daemon to enable remote logins. You can then log in - as root to all install clients during the installation. The - default password is fai and can be changed by setting FAI_ROOTPW - in nfsroot.conf(5). To log in from your server to the install - client (named demohost in this example) use: + Démarrer le démon ssh pour activer les connexions à distance. + Vous pouvez ensuite vous connecter en tant que root à tous les + clients d’installation pendant l’installation. Le mot de passe + par défaut est fai et peut être modifié en définissant FAI_ROOTPW + dans nfsroot.conf(5). Pour vous connecter à partir de votre + serveur vers le client d’installation (nommé demohost dans cet + exemple), utilisez : $ ssh root@demohost Warning: Permanently added 'demohost,192.168.33.100' to the list of known hosts. root@demohost's password: -This is only the root password during the installation process, not -for the new installed system. You can also log in without a password -when using $SSH_IDENTITY. +Ce n’est le mot de passe root que pendant le processus +d’installation, pas pour le nouveau système installé. Vous pouvez +également vous connecter sans mot de passe lorsque vous utilisez +$SSH_IDENTITY. createvt - Create two virtual terminals and execute a bash if ctrl-c is - typed in the console terminal. The additional terminals can be - accessed by typing Alt-F2 or Alt-F3. Otherwise, no terminals are - available and typing ctrl-c will reboot the install client. - Setting this flag is useful for debugging. If you want an - installation which should not be interruptible, do not set this - flag. + Créez deux terminaux virtuels et exécutez un bash si ctrl-c est + tapé dans le terminal de console. Vous pouvez accéder aux + terminaux supplémentaires en tapant Alt-F2 ou Alt-F3. Sinon, + aucun terminal n’est disponible et la saisie ctrl-c va redémarrer + le client d’installation. La définition de cette option est utile + pour le débogage. Si vous voulez une installation qui ne soit pas + interruptible, ne définissez pas cette option. menu - This enables a user menu for selecting a profile. All files class - /*.profile are read and a curses based menu will be created. + Cela active un menu utilisateur pour sélectionner un profil. Tous + les fichiers class/*.profile sont lus et un menu basé sur curses + sera créé. screen - Run FAI inside a screen(1) session. The session is called FAI. If - you log in via ssh from remote you can attach to the session - using: + Lancer FAI dans une session screen(1). La session est nommée FAI. + Si on se connecte via ssh à distance on peut se rattacher à la + session en utilisant : $ screen -x tmux - Run FAI inside a tmux(1) session. The session is called FAI. If - you log in via ssh from remote you can attach to the session - using: + Lancer FAI dans une session tmux(1). La session est nommée FAI. + Si on se connecte via ssh à distance on peut se rattacher à la + session en utilisant : $ tmux attach reboot - Reboot the install client after installation is finished without - typing RETURN on the console. If this flag is not set, and - error.log contains anything, the install client will stop and - wait that you press RETURN. If no errors occurred, the client - will always reboot automatically. + Redémarrer le client d’installation une fois l’installation + terminée sans taper Entrée sur la console. Si cette option n’est + pas définie, et que error.log contient quelque chose, le client + d’installation s’arrêtera et attendra que vous appuyez sur + Entrée. Si aucune erreur ne s’est produite, le client redémarrera + toujours automatiquement. halt - Halt the install client at the end of the installation, instead - of rebooting into the new system. + Arrêter le client d’installation à la fin de l’installation, au + lieu de redémarrer dans le nouveau système. initial - Used by setup-storage(8). Partitions marked with - preserve_reinstall are preserved unless this flag is set. Often, - this flag is set in a file class/*.var by using setting - flag_initial=1. + Utilisé par setup-storage(8). Les partitions marquées avec + preserve_reinstall sont préservées à moins que cette option ne + soit définie. Souvent, cette option est définie dans un fichier + class/*.var en utilisant le paramètre flag_initial=1. --------------------------------------------------------------------- -7.  FAI installs your plan +7.  FAI installe votre planification --------------------------------------------------------------------- -7.1. The early part of an installation +7.1. La première phase d’une installation -------------- -After the kernel has booted, it mounts the root file system via NFS -from the install server and starts the script /usr/sbin/fai ^[10]. -This script controls the sequence of the installation. No other -scripts in /etc/init.d/ are used. +Après le démarrage du noyau, on monte le système de fichiers racine +via NFS à partir du serveur d’installation et on démarre le script / +usr/sbin/fai ^[11]. Ce script contrôle la séquence de l’installation. +Aucun autre script dans /etc/init.d/ n’est utilisé. -The configuration space is made available via the configured method -(an NFS mount by default) from the install server to the path defined -in $FAI ^[11] +L’espace de configuration est rendu disponible via la méthode +configurée (un montage NFS par défaut) depuis le serveur +d’installation vers le chemin défini dans $FAI ^[12] -7.2. Boot messages +7.2. Messages de démarrage -------------- -When booting the install client from network card with PXE you will -see some messages like this: +Lorsqu’on démarre le client d’installation à partir de la carte +réseau avec PXE, on voit des messages comme ceci : Managed PC Boot Agent (MBA) v4.00 Pre-boot eXecution Environment (PXE) v2.00 @@ -1538,11 +1625,12 @@ Trying to load pxelinux.cfg/C0A82164 Loading vmlinuz-6.1.0-17-amd64.................. Loading initrd.img-6.1.0-17-amd64......................ready. -At this point the install client has successfully received the -network config via DHCP and the kernel and initrd via TFTP. It now -boots the Linux kernel and the initrd. If everything went right, the -initrd mounts the nfsroot ^[12] and the FAI scripts are started. The -first thing you see is the red FAI copyright message. +À ce stade, le client d’installation a réussi à recevoir la +configuration réseau via DHCP, le noyau et le fichier initrd via +TFTP. Il démarre maintenant Le noyau Linux et met en place initrd. Si +tout se passe bien, l’initrd monte le nfsroot ^[13] et les scripts +FAI sont lancés. La première chose qu’on voit est le message de +copyright en rouge de FAI. ------------------------------------------------- Fully Automatic Installation - FAI @@ -1590,153 +1678,168 @@ Executing /var/lib/fai/config/class/85-efi-classes. 85-efi-classes OK. List of all classes: DEFAULT LINUX AMD64 DHCPC FAIBASE DEBIAN DEMO GRUB_PC demohost2 LAST -You can also see the list of FAI classes, that are defined for this -host. This list is very important for the rest of the installation. +On peut également voir la liste des classes FAI, qui sont définies +pour cet hôte. Cette liste est très importante pour le reste de +l’installation. -The first task is called confdir, which is responsible for getting -access to the config space. Here, we use an NFS mount from the -install server as you can see on the console (and later in the logs). +La première tâche est appelée confdir, qui est chargée de accès à +l’espace de configuration. Ici, on utilise un montage NFS depuis le +serveur d’installation comme on peut le voir sur la console (et plus +tard dans les journaux). FAI_CONFIG_SRC is set to nfs://faiserver/srv/fai/config Configuration space faiserver:/srv/fai/config mounted to /var/lib/fai/config -Before the installation is started ($FAI_ACTION=install) the computer -beeps three times. So, be careful when you hear three beeps but you -do not want to perform an installation and let FAI erase all yout -data on the local disk! +Avant de lancer l’installation ($FAI_ACTION=install), l’ordinateur +émet trois bips. Donc, faites attention quand vous entendez trois +bips et que vous ne voulez pas effectuer une installation, ni laisser +FAI effacer toutes vos données sur Le disque local ! -7.3. Rebooting the computer into the new system +7.3. Redémarrage de l’ordinateur dans le nouveau système -------------- -For rebooting the computer during or at the end of the installation -you should use the command faireboot in favour of the normal reboot -command. Use faireboot also if logged in from remote. If the -installation hasn’t finished, use faireboot -s, so the log files are -also copied to the install server. +Pour redémarrer l’ordinateur pendant ou à la fin de l’installation, +vous devez utiliser la commande faireboot de préférence à la commande +de redémarrage normal. Utilisez aussi faireboot si vous êtes connecté +à distance. Si l’installation n’est pas terminée, utilisez faireboot +-s, afin que les fichiers journaux soient aussi copiés sur le serveur +d’installation. -If the installation has finished successfully, the computer should -boot a small Debian system. You can login as user demo or root with -password fai. +Si l’installation s’est bien terminée, l’ordinateur doit démarrer un +petit système Debian. Vous pouvez vous connecter en tant +qu’utilisateur demo ou root avec le mot de passe fai. -7.4. Starting FAI (task confdir) +7.4. Démarrage de FAI (tâche confdir) -------------- -After the install client has booted only the script /usr/sbin/fai is -executed. It will do some minimal initialization. The variable -$FAI_CONFIG_SRC ^[13] is used to get access to the FAI configuration -space which is then available in the directory $FAI ^[14]. FAI will -not proceed without the config space. +Une fois le client d’installation démarré, seul le script /usr/sbin/ +fai est exécuté. Il effectuera une initialisation minimale. La +variable $FAI_CONFIG_SRC ^[14] est utilisée pour accéder à l’espace +de configuration FAI qui est alors disponible dans le répertoire $FAI +^[15]. FAI ne se fonctionnera pas sans l’espace de configuration. -You can access the config space using different methods. Supported -methods are: nfs:, file:, cvs:, svn: git:, hg:, http: and detect:. -See fai.conf(5) for a detailed description of these methods. +On peut accéder à l’espace de configuration à l’aide de diverses +méthodes. Les méthodes supportées sont : nfs:, file:, cvs:, svn: +git:, hg:, http: et detect:. Voir fai.conf(5) pour une description +détaillée de ces méthodes. -7.5. Defining classes and variables (tasks defclass and defvar) +7.5. Définition de classes et de variables (tâches defclass et +defvar) -------------- -The command fai-class(1) executes scripts in $FAI/class for defining -classes. If the scripts write a string to stdout, this will be -defined as a class. Read all the details in the man page of fai-class -(1). +La commande fai-class(1) exécute des scripts dans $FAI/class pour +définir des classes. Si les scripts écrivent une chaîne dans stdout, +cela sera défini comme une classe. Lisez tous les détails dans la +page de manuel de fai-class(1). -After defining the classes, every file matching .var with a prefix -which matches a defined class is sourced to define variables. It must -contain valid shell code. +Après avoir défini les classes, chaque fichier correspondant à .var +avec un préfixe qui correspond à une classe définie est pris en +compte pour définir des variables. Il doit contenir du code shell +valide. -7.6. Partitioning local disks, creating file systems (task partition) +7.6. Partitionnement des disques locaux, création des systèmes de +fichiers (tâche partition) -------------- -For the disk partitioning exactly one disk configuration file from -$FAI/disk_config is selected using classes. +Pour le partitionnement du disque, un fichier de configuration de +disque de $FAI/disk_config est sélectionné à l’aide de classes, et un +seul. -The format of the disk configuration is similar to a fstab file. +Le format de la configuration du disque est similaire à un fichier +fstab. -The partitioning tool setup-storage(8) performs all commands -necessary for creating the disk partition layout, software RAID, LVM -and for creating the file systems. Disks and partitions may easily be -referenced by disk1.1, disk2.4 etc. Read the manual page of -setup-storage(8) for a detailed description and some examples of the -format. +L’outil de partitionnement setup-storage(8) exécute toutes les +commandes nécessaires pour créer l’organisation des partitions du +disque, du RAID logiciel, du LVM et pour créer les systèmes de +fichiers. Lisez la page de manuel de setup-storage(8) pour une +description détaillée et quelques exemples du format. -7.7. Debconf preseeding (task debconf) +7.7. Pré-ensemencement Debconf (tâche debconf) -------------- -Files in $FAI/debconf are used for the usual debconf(7) preseeding if -the file names match a class name. +Les fichiers dans $FAI/debconf sont utilisés par le système de +pré-ensemencement habituel de debconf(7) si les noms de fichier +correspondent à un nom de classe. -7.8. Installing software packages (task instsoft) +7.8. Installation de paquets logiciels (tâche instsoft) -------------- -The command install_packages(8) reads the config files from $FAI/ -package_config in a class based manner and installs software packages -on the new file system. +La commande install_packages(8) lit les fichiers de configuration à +partir de $FAI/package_config d’une façon basée sur la classe et +installe des paquets logiciels sur le nouveau système de fichiers. -It installs the packages using apt-get(8), aptitude(1), yum or other -package tools without any manual interaction needed. Package -dependecies are also resolved by the package tools. +Elle installe les paquets en utilisant apt-get(8), aptitude(1), yum +ou d’autres gestionnaires de paquets sans besoin d’aucune interaction +manuelle. Les dépendances des paquets sont également résolues par les +gestionnaires de paquets. -The format of the configuration files is described in [packageconfig] -. +Le format des fichiers de configuration est décrit dans +[packageconfig]. -Additionaly FAI will install packages (.deb or .rpm') from the -directories $FAI/pkgs/. +De plus, FAI installera les paquets (.deb or .rpm') depuis les +répertoires $FAI/pkgs/. -7.9. Site specific customization (task configure) +7.9. Personnalisation spécifique au site (tâche configure) -------------- -Often the default configurations of the software packages will not -meet your site-specific needs. You can call arbitrary scripts which -adjust the system configuration. Therefore the command fai-do-scripts -(1) executes scripts in $FAI/scripts in a class based manner. It is -possible to have several scripts of different types (shell, cfengine, -…) to be executed for one class. +Souvent, les configurations par défaut des paquets logiciels ne +répondent pas à vos besoins spécifiques au site. Vous pouvez appeler +des scripts arbitraires qui ajustent la configuration du système. Par +conséquent, la commande fai-do-scripts(1) exécute des scripts dans +$FAI/scripts d’une manière basée sur la classe. Il est possible +d’avoir plusieurs scripts de différents types (shell, cfengine, …) à +exécuter pour une classe. -The default set of scripts in $FAI/scripts include examples for -installing Debian and Rocky Linux machines. They set the root -password, add a user account (set by '$username, default to demo), -set the timezone, configure the network for DHCP or using a fixed IP -address, setup grub and more. They should do a reasonable job for -your installation. You can edit them or add new scripts to match your -local needs. +L’ensemble de scripts par défaut dans $FAI/scripts inclut des +exemples d’installation de machines Debian et Rocky Linux. Ils +définissent le mot de passe root, ajoutent un compte utilisateur +(défini par $username, avec demo par défaut), paramètrent le fuseau +horaire, configurent le réseau avec DHCP ou en utilisant une adresse +IP fixe, configurent grub et plus encore. Ils devraient faire un +travail raisonnable pour votre installation. Vous pouvez les modifier +ou ajouter de nouveaux scripts pour répondre à vos besoins locaux. -More information about these scripts are described in [cscripts]. +Plus d’information sur ces scripts est disponible dans [cscripts]. -7.10. Saving log files (task savelog) +7.10. Enregistrement des fichiers journaux (tâche savelog) -------------- -When all tasks are finished, the log files are written to /var/log/ -fai/$HOSTNAME/install/ ^[15] on the new system and to the account on -the install server if $LOGUSER is defined (you have to enable this in -/srv/fai/config/class/FAIBASE.var). It is also possible to specify -another host as log saving destination through the variable -$LOGSERVER. If $LOGSERVER is not defined, FAI uses the variable -$SERVER which is only defined during an initial installation (by +Lorsque toutes les tâches sont terminées, les fichiers journaux sont +écrits dans /var/log/fai/$HOSTNAME/install/ ^[16] sur le nouveau +système, et sur le compte sur le serveur d’installation si $LOGUSER +est défini (il faut l’activer dans /srv/fai/config/class/FAIBASE.var +). Il est également possible de spécifier un autre hôte comme +destination pour cet enregistrement à l’aide de la variable +$LOGSERVER. Si $LOGSERVER n’est pas défini, FAI utilise la variable +$SERVER qui n’est définie que lors d’une installation initiale (par get-boot-info). -Additionally, two symlinks will be created to indicated the last -directory written to. The symlink last points to the log directory of -the last FAI action performed. The symlinks last-install and -last-sysinfo point to the directory of the last corresponding action. -By default log files will be copied to the log server using scp. You -can use the variable $FAI_LOGPROTO in file fai.conf(5) to choose -another method for saving logs to the remote server. Here’s an -example of the symlink structure: +De plus, deux liens symboliques seront créés pour indiquer le dernier +répertoire où on a écrit. Le lien symbolique last pointe vers le +répertoire journal de la dernière action FAI exécutée. Les liens +symboliques last-install et last-sysinfo pointent vers le répertoire +avec la dernière action correspondante. Par défaut, les fichiers +journaux seront copiés sur le serveur de journalisation à l’aide de +scp. Vous pouvez utiliser la variable $FAI_LOGPROTO dans le fichier +fai.conf(5) pour choisir une autre méthode d’enregistrement des +journaux sur le serveur distant. Voici un exemple de structure de +lien symbolique : lrwxrwxrwx 1 fai fai 23 Dec 2 2013 last-sysinfo -> sysinfo-20131202_161237 drwxr-xr-x 2 fai fai 4096 Dec 2 2013 sysinfo-20131202_161237 @@ -1746,118 +1849,129 @@ lrwxrwxrwx 1 fai fai 23 Dec 4 13:22 last-install -> install-20141204_131351 lrwxrwxrwx 1 fai fai 23 Dec 4 13:22 last -> install-20141204_131351 drwxr-xr-x 2 fai fai 4096 Dec 4 13:22 install-20141204_131351 -Examples of the log files can be found at https://fai-project.org/ -logs. +Vous trouverez des exemples de fichiers journaux à l’adresse https:// +fai-project.org/logs. -7.11. Reboot the new installed system +7.11. Redémarrage du nouveau système installé -------------- -Before rebooting, the install client calls fai-chboot -d -on the install server, to disable its own PXELINUX configuration. -Otherwise, it would restart the installation during the next boot. -Normally this should boot the new installed system from its second -boot device, the local hard disk. +Avant de redémarrer, le client d’installation appelle fai-chboot -d + sur le serveur d’installation, pour désactiver sa propre +configuration PXELINUX. Sinon, il redémarrerait l’installation lors +de la prochaine initialisation. Normalement, cela devrait démarrer le +nouveau système installé à partir de son second périphérique +d’amorçage, le disque dur local. -At the end, the system is automatically rebooted if "reboot" was -added to $FAI_FLAGS. +À la fin, le système est automatiquement redémarré si "reboot" a été +ajouté à $FAI_FLAGS. --------------------------------------------------------------------- -8. Advanced FAI topics +8. Sujets avancés pour FAI --------------------------------------------------------------------- -8.1. Checking parameters received from DHCP servers +8.1. Vérification des paramètres reçus des serveurs DHCP -------------- -If the install client boots you can check if all information from the -DHCP daemon are received correctly. The received information is -written to /tmp/fai/boot.log. An example of the result of a DHCP -request can be found in the sample log files. +Si le client d’installation démarre, vous pouvez vérifier si toutes +les informations provenant du démon DHCP sont correctement reçues. +Les informations reçues sont écrites dans /tmp/fai/boot.log. Un +exemple de résultat d’une requête DHCP peut être trouvé dans les +fichiers journaux d’exemple. -8.2. Monitoring multiple client installations +8.2. Surveillance de plusieurs clients d’installation -------------- -You can monitor the installation of all install clients with the -command fai-monitor(8). All clients check if this daemon is running -on the install server (or the machine defined by the variable -$monserver). Each time a task starts or ends, a message is sent. The -FAI monitor daemon prints this messages to standard output. There’s -also a graphical frontend available, called fai-monitor-gui(1). +Vous pouvez surveiller l’installation de tous les clients +d’installation avec la commande fai-monitor(8). Tous les clients +vérifient si ce démon est en cours d’exécution sur le serveur +d’installation (ou sur l’ordinateur défini par la variable +$monserver). Chaque fois qu’une tâche démarre ou se termine, un +message est envoyé. Le démon du moniteur FAI envoie ces messages dans +sa sortie standard. On peut aussi utiliser une interface graphique, +appelée fai-monitor-gui(1). $ fai-monitor | fai-monitor-gui - & -8.3. Collecting Ethernet addresses for multiple hosts +8.3. Collecte d’adresses Ethernet pour plusieurs hôtes -------------- -You have to collect all Ethernet (MAC) addresses of the install -clients and assign a host name and IP address to each client. To -collect the MAC addresses, boot your install clients. You can already -do this before any DHCP daemon is running in your subnet. They will -fail to boot (because of the missing DHCP or missing TFTP), but you -can still collect the MAC addresses. +Vous devez collecter toutes les adresses Ethernet (MAC) des clients +d’installation et affecter un nom d’hôte et une adresse IP à chaque +client. Pour collecter les adresses MAC, démarrez vos clients +d’installation. Vous pouvez déjà le faire avant que n’importe quel +démon DHCP s’exécute dans votre sous-réseau. Ils échoueront à +démarrer (en raison de l’absence de DHCP ou de TFTP), mais vous +pouvez toujours collecter les adresses MAC. -While the install clients are booting, they send broadcast packets to -the LAN. You can log the MAC addresses of these hosts by running the -following command simultaneously on the server: +Pendant que les clients d’installation démarrent, ils envoient des +paquets de diffusion (broadcast) au LAN. Vous pouvez enregistrer les +adresses MAC de ces hôtes en exécutant simultanément la commande +suivante sur le serveur : faiserver# tcpdump -qtel broadcast and port bootpc >/tmp/mac.list -After the hosts have been sent some broadcast packets abort tcpdump -by typing ctrl-c. You get a list of all unique MAC addresses with -these commands: +Une fois que les hôtes ont envoyés quelques paquets de diffusion, +arrêtez tcpdump en tapant ctrl-c. Vous obtenez une liste de toutes +les adresses MAC uniques avec ces commandes : faiserver$ perl -ane 'print "\U$F[0]\n"' /tmp/mac.list|sort|uniq -After that, you only have to assign these MAC addresses to host names -and IP addresses (/etc/ethers and /etc/hosts or corresponding NIS -maps). With this information you can configure your DHCP daemon (see -the section [bootdhcp]). ^[16] +Après cela, vous n’avez qu’à assigner ces adresses MAC aux noms +d’hôte et aux adresses IP (/etc/ethers et /etc/hosts ou aux +associations NIS correspondantes). Avec ces informations, vous pouvez +configurer votre démon DHCP (voir la section [bootdhcp]). ^[17] -8.3.1. Debugging the network traffic +8.3.1. Débogage du trafic réseau -If the client can’t successfully boot from the network card, use -tcpdump(8) to look for Ethernet packets between the install server -and the client. Search also for entries in several log files made by -tftpd(8) and dhcpd(8) : +Si le client ne peut démarrer correctement à partir de la carte +réseau, utilisez tcpdump(8) pour rechercher des paquets Ethernet +entre le serveur d’installation et le client. Recherchez également +dans les entrées de plusieurs fichiers journaux venant de tftpd(8) et +dhcpd(8) : faiserver$ egrep "tftpd|dhcpd" /var/log/* -8.4. Details of PXE booting +8.4. Détails du démarrage PXE -------------- -Here we describe the details of PXE booting, which are only needed if -you have problems when booting your install clients. - -Almost all modern bootable network cards support the PXE boot -environment. PXE is the Preboot Execution Environment. This requires -the PXELINUX bootloader and a special version of the TFTP daemon, -which is available in the Debian packages pxelinux and tftpd-hpa. PXE -booting also needs a DHCP server, so that the network card can -configure its IP parameters. This is the sequence of a PXE boot: - - * Network card of the client sends its MAC address - * DHCP server replies with IP configuration for the client - * Network card configures IP - * Install client gets the pxelinux.0 binary via TFTP - * Get the pxelinux.cfg/C0A8210C configuration file via TFTP - * C0A8210C is the IP address of the client in hexadecimal - * This configuration contains kernel, initrd and additional kernel - command line parameters, which was created by fai-chboot. - * Get the kernel and initrd via TFTP. - -Example of a pxelinux.cfg file: +Ici, nous décrivons les détails du démarrage PXE, qui sont +nécessaires seulement si vous avez des problèmes lors du démarrage de +vos clients d’installation. + +Presque toutes les cartes réseau modernes prennent en charge +l’environnement de démarrage PXE. PXE est l’environnement d’exécution +de pré-lancement. Cela nécessite le chargeur de démarrage PXELINUX et +une version spéciale du démon TFTP, disponibles dans les paquets +Debian pxelinux et tftpd-hpa. Le démarrage PXE nécessite également un +serveur DHCP, afin que la carte réseau puisse configurer ses +paramètres IP. Voici la séquence d’une amorce PXE : + + * La carte réseau du client envoie son adresse MAC + * Le serveur DHCP répond par la configuration IP du client + * La carte réseau configure son IP + * Le client d’installation obtient le binaire pxelinux.0 via TFTP + * Il obtient le fichier de configuration pxelinux.cfg/C0A8210C via + TFTP + * C0A8210C est l’adresse IP du client en hexadécimal + * Cette configuration contient le noyau, le fichier initrd et les + paramètres de ligne de commande supplémentaires du noyau, qui ont + été créés par fai-chboot. + * Il obtient le noyau et le fichier initrd via TFTP. + +Exemple d’un fichier pxelinux.cfg : default fai-generated @@ -1865,160 +1979,171 @@ label fai-generated kernel vmlinuz-6.1.0-17-amd64 append initrd=initrd.img-6.1.0-17-amd64 ip=dhcp root=/srv/fai/nfsroot rootovl FAI_FLAGS=verbose,sshd,createvt FAI_CONFIG_SRC=nfs://faiserver/srv/fai/config FAI_ACTION=install -See /usr/share/doc/syslinux/pxelinux.doc for more detailed -information about PXELINUX. FAI uses the lpxelinux.0 binary which -also supports loading the kernel and initrd via FTP or HTTP. The -command fai-chboot(8) supports this with the option -U. +Voir /usr/share/doc/syslinux/pxelinux.doc pour des informations plus +détaillées sur PXELINUX. FAI utilise le fichier binaire lpxelinux.0 +qui s’occupe du chargement du noyau et du fichier initrd via FTP ou +HTTP. La commande fai-chboot(8) prend cela en charge avec l’option -U +. -8.5. Customizing your install server setup +8.5. Personnaliser la configuration de son serveur d’installation -------------- - * local/faster package mirror - * different loguser - * local root pw inside nfsroot + * Miroir de paquets logiciels local/plus rapide + * Loguser différent + * Mot de passe root local dans nfsroot -The configuration for the FAI package (not the configuration data for -the install clients) is defined in fai.conf(5). Definitions that are -only used for creating the nfsroot are located in nfsroot.conf(5). -Check these important variables in nfsroot.conf before calling -fai-setup or fai-make-nfsroot. +La configuration du paquet FAI (et non les données de configuration +pour les clients d’installation) est définie dans fai.conf(5). Les +définitions qui sont utilisées uniquement pour créer le nfsroot sont +situées dans nfsroot.conf(5). Vérifiez ces variables importantes dans +nfsroot.conf avant d’appeler fai-setup ou fai-make-nfsroot. FAI_DEBOOTSTRAP - Building the nfsroot uses the command debootstrap(8). It needs - the location of a Debian mirror and the name of the distribution - (like bullsseye, bookworm, sid) for which the basic Debian system - should be built. Do not use different distributions here and in / - etc/fai/apt/sources.list. This will create a broken nfsroot. + La construction du nfsroot utilise la commande debootstrap(8). + Elle a besoin de l’emplacement d’un miroir Debian et du nom de la + distribution (comme bullsseye, bookworm, sid) pour laquelle le + système Debian de base devrait être construit. N’utilisez pas de + distributions différentes ici et dans /etc/fai/apt/sources.list. + Cela créerait un nfsroot dysfonctionnel. NFSROOT_ETC_HOSTS - This variable is only needed if the clients do not have access to - a DNS server. This multiline variable is added to /etc/hosts - inside the nfsroot. Then the install clients can access those - hosts by name without using DNS. - -The content of /etc/fai/apt/sources.list is used by the install -server and also by the clients. If your install server has multiple -network cards and different host names for each card (as for a -Beowulf server), use the install server name which is known by the -install clients. - -If you have problems running fai-setup, they usually stem from -fai-make-nfsroot(8) which is called by former command. Adding -v -gives you a more verbose output which helps you pinpoint the error. -The output is written to /var/log/fai/fai-make-nfsroot.log. ^[17] - -The setup also creates the account fai (defined by $LOGUSER) if not -already available. So you can add a user before calling fai-setup(8) -using the command adduser(8) and use this as your local account for -saving log files. The log files of all install clients are saved to -the home directory of this account. You should change the primary -group of this account, so this account has write permissions to /srv/ -tftp/fai in order to call fai-chboot for creating the PXE -configuration for the hosts. - -When you make changes to fai.conf, nfsroot.conf the nfsroot has to be -rebuilt by calling fai-make-nfsroot(8). If you only like to install a -new kernel package to the nfsroot add the flags -k or -K to -fai-make-nfsroot. This will not recreate your nfsroot, but only -updates your kernel and kernel modules inside the nfsroot or add -additional packages into the nfsroot. - - -8.6. Creating a FAI CD or and USB stick + Cette variable est nécessaire seulement si les clients n’ont pas + accès à un serveur DNS. Cette variable multiligne est ajoutée à / + etc/hosts dans le nfsroot. Ensuite, les clients d’installation + peuvent accéder à ces hôtes par leur nom sans utiliser DNS. + +Le contenu de /etc/fai/apt/sources.list est utilisé par le serveur +d’installation et aussi par les clients. Si votre serveur +d’installation a plusieurs cartes réseau et différents noms d’hôte +pour chaque carte (comme pour un serveur Beowulf), utilisez le nom du +serveur d’installation qui est connu des clients d’installation. + +Si vous avez des problèmes lors de l’exécution de fai-setup, ils +proviennent habituellement de fai-make-nfsroot(8) qui est appelé par +la commande précédente. L’ajout de -v vous donne une sortie plus +détaillée qui vous aide à repérer l’erreur. La sortie est écrite dans +/var/log/fai/fai-make-nfsroot.log. ^[18] + +L’installation crée également le compte fai (défini par $LOGUSER) +s’il n’est pas déjà disponible. Vous pouvez donc ajouter un +utilisateur avant d’appeler fai-setup(8) à l’aide de la commande +adduser(8) et l’utiliser comme compte local pour enregistrer des +fichiers journaux. Les fichiers journaux de tous les clients +d’installation sont enregistrés dans le répertoire de personnel de ce +compte. Vous devriez changer le groupe principal de ce compte, afin +que ce compte ait des droits d’écriture sur /srv/tftp/fai afin +d’appeler fai-chboot pour créer la configuration PXE pour les hôtes. + +Lorsque vous apportez des modifications à fai.conf, nfsroot.conf, le +nfsroot doit être reconstruit en appelant fai-make-nfsroot(8). Si +vous souhaitez uniquement installer un nouveau paquet de noyau sur +nfsroot, ajoutez les options -k ou -K à fai-make-nfsroot. Cela ne +recréera pas votre nfsroot, mais mettra à jour seulement vos noyaux +et les modules du noyau dans le nfsroot ou ajoutera des paquets +supplémentaires dans le nfsroot. + + +8.6. Création d’un CD ou d’une clé USB FAI -------------- -You can easily create an installation CD (or USB stick) of your -network installation setup. This will perform the same installation -and configuration from CD without the need of the install server. -Therefore you need to create a partial mirror of all Debian packages -needed for your FAI classes (using fai-mirror(1)). Then the command -fai-cd(8) will put this mirror, the nfsroot and the config space onto -a bootable CD. That’s it! +Vous pouvez facilement créer un CD d’installation (ou une clé USB) de +votre installation réseau. Cela permettra d’effectuer la même +installation et la même configuration à partir du CD sans avoir +besoin du serveur d’installation. Par conséquent, vous devez créer un +miroir partiel de tous les paquets Debian nécessaires à vos classes +FAI (à l’aide de fai-mirror(1)). Ensuite, la commande fai-cd(8) +écrira ce miroir, le nfsroot et l’espace de configuration sur un CD +amorçable. Et voilà ! -To easily create the installation CD, you can use the following -command (for more tuning details see fai-cd(8)): +Pour créer facilement le CD d’installation, on peut utiliser la +commande suivante (Pour plus de détails de configuration voir fai-cd +(8)) : faiserver# fai-cd -m fai-cd.iso -This installation CD contains all data needed for the installation. -The command fai-cd(8) puts the nfsroot, the configuration space and a -subset of the Debian mirror onto a CD-ROM. A partial package mirror -is created using the command fai-mirror(1) which contains all -packages that are used by the classes used in your configuration -space. A sample ISO image is available at https://fai-project.org/ -fai-cd. +Ce CD d’installation contient toutes les données nécessaires à +l’installation. La commande fai-cd(8) écrit le nfsroot, l’espace de +configuration et un sous-ensemble du miroir Debian sur un CD-ROM. Un +miroir de paquets partiel est créé à l’aide de la commande fai-mirror +(1) qui contient tous les paquetages utilisés par les classes +utilisées dans votre espace de configuration. Un échantillon d’image +ISO est disponible à l’adresse https://fai-project.org/fai-cd. -Using the command dd(1) you can also create a bootable USB stick by -just writing the content of the ISO file to your USB stick (here the -stick is /dev/sdf). +Avec la commande dd(1), vous pouvez également créer une clé USB +amorçable en écrivant simplement le contenu du fichier ISO sur votre +clé USB (ici la clé est /dev/sdf). faiserver# dd if=fai-cd.iso of=/dev/sdf bs=1M -mk-data-partition is a tool that extends an ISO (that will be copied -to an USB stick) or an USB stick containing an ISO with an ext4 or -exFAT partition and sets the file system label to MY-DATA. This -partition is automatically mounted to /media/data by FAI. You can -copy your own .deb packages into this data partition und the -subdiretories pkgs/. FAI will then install these packages -if the equivalent class is defined. +mk-data-partition est un outil qui étend une image ISO (qui sera +copiée sur une clé USB) ou une clé USB contenant une image ISO avec +une partition ext4 ou exFAT et y place le label MY-DATA. Cette +partition est automatiquement montée dans /media/data par FAI. On +peut copier ses propres paquets .deb dans cette partition de données +sous les sous-répertoires pkgs/. FAI installera alors ces +paquets si la classe équivalente est définie. -Example how to use mk-data-partition: +exemple d’usage de mk-data-partition: # mk-data-partition -s 1G -c faicd-large.iso A B -The former command creates the data partition of size 1 Gbytes inside -the ISO file and copy directories A and B to it. You can then copy -the modified ISO onto an USB stick. +La commande ci-desus crée la partition de données avec une taille de +1 Go dans le fichier ISO et y copie les répertoires A et B. On peut +écrire l’image ISO modifiée sur une clé USB. -If the ISO is already on the USB stick and if it’s available as dev/ -sdf, you can add a data partition of type exFAT will will use the -whole remaining part of the USB stick by using this command: +Si l’image ISO est déjà sur la clé USB, qui est disponible sous dev/ +sdf, on peut ajouter la partition de données de type exFAT qui +utilisera tout l’espace disponible de la clé USB en utilisant cette +commande  : # mk-data-partition -F /dev/sdf -8.7. Creating VM disk images using FAI +8.7. Création d’images de disque VM à l’aide de FAI -------------- -The command fai-diskimage(8) creates disk images, which can be used -with a virtual machine like KVM, VMware, VirtualBox or a cloud -service like OpenStack, GCE, EC2 and others. The installation process -performs the normal FAI tasks on a raw disk image. After the -installation you can boot the disk image and have a running system. -The disk image can also be converted to qcow2 format. You do not need -to setup the FAI nfsroot when only using fai-diskimage. But you need -a basefile in your configuration space. Setting the variable -$FAI_BASEFILEURL will automatically download an appropriate base file -into your config space. - -Here’s an example how to create a raw disk image for a host called -cloud3, with a small set of software packages: +En utilisant la commande fai-diskimage(8), vous pouvez créer des +images de disques qui peuvent être utilisées avec une machine +virtuelle comme KVM, VMware, VirtualBox ou un service cloud comme +OpenStack, GCE, EC2 et autres. Le processus d’installation exécute +les tâches FAI normales sur une image de disque brut. Après +l’installation, vous pouvez démarrer l’image disque et avoir un +système fonctionnel. L’image disque peut également être convertie au +format qcow2. Vous n’avez pas besoin de mettre en place le nfsroot de +FAI quand vous utilisez seulement fai-diskimage. Mais vous avez +besoin d’un fichier de base dans votre espace de configuration. Le +réglage de la variable $FAI_BASEFILEURL permet de télécharger +automatiquement un fichier de base approprié dans votre espace de +configuration. + +Voici par exemple comment créer une image de disque brute pour un +hôte nommé cloud3, avec un petit ensemble de paquets logiciels : # export FAI_BASEFILEURL=https://fai-project.org/download/basefiles/ # fai-diskimage -vu cloud3 -S2G -cDEBIAN,BOOKWORM64,AMD64,FAIBASE,GRUB_PC,DHCPC,DEMO,CLOUD,LAST disk.raw -This command will create a disk image called ubuntu.qcow2 for a -Ubuntu 16.04 desktop with hostname set to foobar. +Cette commande créera une image de disque nommée ubuntu.qcow2 pour +une configuration de bureau Ubuntu 16.04 avec pour nom d’hôte machin. # export FAI_BASEFILEURL=https://fai-project.org/download/basefiles/ # cl=DHCPC,UBUNTU,JAMMY,JAMMY64,AMD64,XORG,LAST -# fai-diskimage -Nvu foobar -S5G -c$cl ubuntu.qcow2 +# fai-diskimage -Nvu machin -S5G -c$cl ubuntu.qcow2 -You can give disk images a try without installing FAI, if you visit -https://fai-project.org/FAIme/cloud +Vous pouvez essayer quelques images de disques sans installer FAI, si +vous visitez https://fai-project.org/FAIme/cloud -8.8. Creating a bootable live image +8.8. Création d’une image vive amorçable -------------- -Creating a bootable live ISO is easy with FAI. You only need two -steps. First, create your live environment using the command fai -dirinstall. Don’t forget to add the class LIVEISO. Then create the -live ISO using fai-cd: +La création d’images ISO vives amorçables est facile avec FAI. Il +suffit de deux étapes. Premièrement, créez votre environnement vif à +l’aide de la commande fai dirinstall. N’oubliez pas d’ajouter la +classe LIVEISO. Ensuite, créez l’image ISO vive en utilisant fai-cd : # cl="DEBIAN,BOOKWORM64,AMD64,FAIBASE,XFCE,XORG,DHCPC,DEMO,LIVEISO,LAST" # LC_ALL=C fai -v dirinstall -u xfce33 -c $cl \ @@ -2026,18 +2151,21 @@ live ISO using fai-cd: # fai-cd -s500 -MH -d none -g /etc/fai/grub.cfg.live \ -n /srv/xfce live.iso -The nfsroot is not needed for a live ISO. Currently there’s no live -ISO of the install server available. +Le nfsroot n’est pas nécessaire pour une image ISO vive. Il n’y a pas +actuellement d’image vive ISO disponible sur le serveur +d’installation. -8.9. Building cross-architecture disk images +8.9. Construire des images disque d’architecture différente +(cross-architecture) -------------- -Starting FAI 5.4 it’s now possible to build a disk image for -different architectures than the host is running. For example you can -build an image for 64-bit ARM architecture (aarch64) on a host -running on amd64 architecture. Here are the steps do to: +À partir de FAI 5.4 il devient possible de construire une image +disque pour des architectures différentes de l’hôte qui est utilisé. +Par exemple on peut construire une image pour une architecture ARM +64-bit (aarch64) sur un hôte qui fonctionne sur une architecture +amd64. Voici les étapes successives : # apt install qemu-system-arm qemu-user-static fai-server fai-setup-storage fai-doc qemu-utils # fai-mk-configspace @@ -2048,43 +2176,49 @@ running on amd64 architecture. Here are the steps do to: # cp /var/log/fai/armhost/last/vmlinuz* vmlinuz # cp /var/log/fai/armhost/last/initrd.img* initrd -Then you can run qemu as a normal user: +Ensuite on peut lancer qemu en tant qu’utilisateur ordinaire : > qemu-system-aarch64 -m 1000 -M virt,gic_version=3 -cpu cortex-a57 -drive file=arm64.raw,if=virtio,index=1 -no-reboot -nographic -name ARM64 -net nic,name=eth0,model=virtio -net user,name=eth0,-kernel vmlinuz -initrd initrd -append "console=ttyAMA0 rw ip=dhcp root=/dev/vda1 net.ifnames=0" -This works similar for other architectures. Keep in mind, that qemu -network setup will have poor performance if not using the virtio -driver as above or tap devices. +Ça fonctionne de même pour d’autres architectures. Il faut garder en +tête que les réglages réseau de qemu ont des performances dégradées +si on n’utilise pas le pilote virtio comme ci-dessus ou des TAPs +réseaux. -You can find the base files for many architectures at https:// -fai-project.org/download/basefiles/, or use mk-basefile to create -your own. +On peut trouver les fichiers de base pour plusieurs architectures à +https://fai-project.org/download/basefiles/, ou utiliser mk-basefile +pour créer son fichier propre. -8.10. FAI rescue system +8.10. Système de sauvetage FAI -------------- -If you set the variable $FAI_ACTION to sysinfo (for e.g. by using -fai-chboot -S), the client will not install a new system, but will -collect a lot of system information. If you set $FAI_ACTION to -inventory you will only get a few hardware information. Both actions -can be used for FAI as a rescue system. - -Type ctrl-c to get a shell or use Alt-F2 or Alt-F3 and you will get -another console terminal, if you have added createvt to $FAI_FLAGS. - -You now have a running Linux system on the install client without -using the local hard disk. Use this as a rescue system if your local -disk is damaged or the computer can’t boot properly from hard disk. -You will get a shell and you can execute various commands (dmesg, -lsmod, df, lspci, …). Look at the log file in /tmp/fai. There you can -find much information about the boot process. - -FAI mounts all file systems it finds on the local disks read only. It -also tells you on which partition a file /etc/fstab exists. When only -one file system table is found, the partitions are mounted according -to this information. Here’s an example: +Si vous assignez à la variable $FAI_ACTION la valeur sysinfo (par +exemple en utilisant fai-chboot -S), le client n’installera pas de +nouveau système, mais collectera beaucoup d’informations système. Si +vous assignez à $FAI_ACTION la valeur inventory, vous ne recevrez que +quelques informations sur le matériel. Les deux actions peuvent être +utilisées pour FAI comme un système de sauvetage. + +Tapez ctrl-c pour obtenir un shell ou utilisez Alt-F2 ou Alt-F3 et +vous obtiendrez une autre console de terminal, si vous avez ajouté +createvt à $FAI_FLAGS. + +Vous voilà maintenant avec un système Linux qui fonctionne sur le +client d’installation sans utiliser le disque dur local. Utilisez-le +comme système de secours si votre disque local est endommagé ou si +l’ordinateur ne peut pas démarrer correctement à partir du disque +dur. Vous obtiendrez un shell et vous pouvez exécuter diverses +commandes (dmesg, lsmod, df, lspci, …). Regardez le fichier journal +dans /tmp/fai. Vous y trouverez de nombreuses informations sur le +processus d’amorçage. + +FAI monte tous les systèmes de fichiers qu’il trouve sur les disques +locaux en lecture seule. Il vous indique également sur quelle +partition un fichier /etc/fstab existe. Lorsqu’une seule table de +système de fichiers est trouvée, les partitions sont montées selon +ces informations. Voici un exemple : demohost:~# df -h @@ -2099,83 +2233,92 @@ LiveOS_rootfs 783M 18M 766M 3% / /dev/vda1 459M 53M 378M 13% /target/boot /dev/mapper/vg1-home 1.4G 72K 1.3G 1% /target/home -This method can be used as a rescue environment! If you need a file -system with read-write access use the rwmount command: +Cette méthode peut être utilisée comme un environnement de +sauvetage ! Si vous avez besoin d’un système de fichiers avec accès +en lecture/écriture, utilisez la commande rwmount : demohost# rwmount /target/home -8.11. FAI without NFS +8.11. FAI sans NFS -------------- -To boot into FAI and begin the installation sequence without using -the NFS protocol, you boot the client machine using PXE as usual and -then retrieve an image containing the nfsroot via http. +Pour démarrer dans FAI et commencer la séquence d’installation sans +utiliser le protocole NFS, vous démarrez la machine cliente en +utilisant PXE comme d’habitude, puis récupérez une image contenant le +nfsroot via http. -To create an image, use fai-cd’s -S argument and -M to avoid setting -up a partial mirror within the image. +Pour créer une image, utilisez l’argument -S de fai-cd et -M pour +éviter de créer un miroir partiel à l’intérieur de l’image. faiserver# fai-cd -M -S squash.img -Move this image to a directory from which it can be requested via -http (usually a directory served by the webserver) +Déplacez cette image vers un répertoire à partir duquel elle peut +être demandée via http (généralement un répertoire accessible par le +serveur web) -To now request the squashfs image, add the following to your kernel -command line, e.g. in your pxelinux configuration file for the client -with fai-chboot. +Pour demander alors l’image squashfs, ajoutez ce qui suit à votre +ligne de commande du noyau, par exemple dans votre fichier de +configuration pxelinux pour le client avec fai-chboot. root=live:http://faiserver/cskoeln/squash.img FAI_CONFIG_SRC=file:///var/lib/fai/config -Replace faiserver with the domain name or IP of the machine your -squash image is served from. +Remplacez faiserver par le nom de domaine ou l’IP de la machine de +laquelle votre image de squash est servie. -8.12. Installing other distributions using a Debian nfsroot +8.12. Installation d’autres distributions à l’aide d’un nfsroot +Debian -------------- -You can install all sorts of Linux distributions from a single Debian -nfsroot. Therefore you have to create a base.tar.xz of the -distribution you like to install and place it into the basefiles -directory. Then name it UBUNTU2204.tar.xz for example. An install -client which belongs to the class UBUNTU2204 then extracts this base -file into its empty file system. Additionally you have to adjust the -sources.list or similar configuration files which are needed for -specifying the location of the package repository. +Vous pouvez installer toutes sortes de distributions Linux à partir +d’un seul nfsroot Debian. Par conséquent, vous devez créer un fichier +base.tar.xz de la distribution que vous souhaitez installer et le +placer dans le répertoire basefiles. Puis nommez-le UBUNTU2204.tar.xz +par exemple. Un client d’installation appartenant à la classe +UBUNTU2204 extrait ensuite ce fichier de base dans son système de +fichiers vide. De plus, vous devez ajuster les sources.list ou les +fichiers de configuration similaires nécessaires pour spécifier +l’emplacement du dépôt de paquets. -The tool rinse(8) is used for creating base files for distribution -like Rocky Linux, CentOS, openSUSE or Fedora. Some basefiles can be -downloaded from https://fai-project.org/download/basefiles/. +L’outils rinse(8) est utilisé pour créer des fichiers de base pour +des distributions comme Rocky Linux, CentOS, openSUSE, ou Fedora. +Certains fichiers de base peuvent être téléchargés à partir de https: +//fai-project.org/download/basefiles/. -The script mk-basefile in /usr/share/doc/fai-doc/examples/simple/ -basefiles/ helps creating this base files. +Le script mk-basefile dans /usr/share/doc/fai-doc/examples/simple/ +basefiles/ aide à créer ces fichiers de base. -8.13. Creating chroot and virtualization environments +8.13. Création d’environnements chroot et de virtualisation -------------- -If you have to create some chroot environments, or a virtualization -environment where you neither can nor want to run a normal Debian -Installer in to get to a working system (for example, Xen guest -domains), there is the FAI action dirinstall. By calling +Si vous devez créer certains environnements chroot, ou un +environnement de virtualisation où vous ne pouvez ni ne voulez +exécuter un programme d’installation Debian normal pour accéder à un +système opérationnel (par exemple, les domaines hôtes Xen), il y a +l’action FAI dirinstall. En appelant : faiserver# fai dirinstall -and using either the option -c or -N you get a FAI -installation, without the partitioning action, right into the target -directory. The host name for the target installation can be specified -using -u - -This, for example, can be used to combine FAI with the tool xen-tools -, which helps you to build Xen guest domains. xen-tools are very nice -for generating configuration files and block devices for new guests -based on simple commands and/or configuration files, but they can -only assign one role per installation for customization. FAI-users -need and want more, as they are used to have the class system. They -get them even in xen-tools installations, by using the following code -as a xen-tools role script: +et en utilisant l’option -c ou -N vous obtenez une +installation FAI, sans l’action de partitionnement, directement dans +le répertoire cible. Le nom d’hôte de la cible d’installation peut +être spécifié à l’aide de -u + +On peut utiliser cela, par exemple, pour combiner FAI avec les outils +xen-tools, qui vous aident à construire des domaines invités Xen. Les +xen-tools sont très agréables pour générer des fichiers de +configuration et bloquer des périphériques pour de nouveaux invités +sur la base de commandes simples et/ou des fichiers de configuration, +mais ils ne peuvent assigner qu’un seul rôle par installation pour la +personnalisation. Les utilisateurs de FAI ont besoin de plus et en +veulent, car ils ont l’habitude d’avoir le système de classes. Ils +peuvent y arriver même dans les installations xen-tools, en utilisant +le code suivant en tant que rôle xen-tools script : #!/bin/sh TARGET=$1 @@ -2183,408 +2326,443 @@ CMD="fai -N -v -u ${hostname} dirinstall $TARGET" echo running $CMD $CMD -Then, you should set the variable install=0 in the config of -xen-tools for that host. +Ensuite, il faut définir la variable install=0 dans la configuration +xen-tools pour cet hôte. -8.14. Using FAI for updates +8.14. Utilisation de FAI pour les mises à jour -------------- -FAI can also do updates of already running systems, without a -re-installation from scratch. This is called softupdate. A FAI -softupdate skips the tasks which are not suitable for updating a -running system, like partitioning the hard disks and creating file -systems. Instead, it only executes the tasks for updating and -installing software packages and calling the customization scripts. +FAI peut également effectuer des mises à jour de systèmes déjà en +cours d’exécution, sans réinstallation à partir de zéro. C’est ce +qu’on appelle softupdate. Un FAI softupdate ignore les tâches qui ne +sont pas adaptées à la mise à jour d’un système en cours d’exécution, +comme le partitionnement des disques durs et la création de systèmes +de fichiers. Au lieu de cela, il exécute uniquement les tâches de +mise à jour et d’installation des paquets logiciels et l’appel des +scripts de personnalisation. -To run a softupdate call: +Pour lancer un softupdate : # fai -v -s nfs://faiserver/srv/fai/config softupdate -By default, a softupdate uses the list of classes defined during the -initial installation. Make sure to set the variable $LOGSERVER (done -in a class/*.var file) if FAI should save the log files to a remote -machine. +Par défaut, un softupdate utilise la liste des classes définies lors +de l’installation initiale. Assurez-vous de définir la variable +$LOGSERVER (ça se fait dans un fichier class/*.var) si FAI doit +enregistrer les fichiers journaux sur une machine distante. -It’s up to you, how to start a softupdate on a bigger number of -hosts. You may do the softupdate on a regular basis via cron or you -can use tools like clusterssh(1) to start a softupdate via a push on -a list of hosts. +C’est à vous de décider, comment démarrer un softupdate sur un plus +grand nombre d’hôtes. Vous pouvez faire le softupdate sur +régulièreent via cron ou vous pouvez utiliser des outils comme +clusterssh(1) pour démarrer un softupdate via un push sur une liste +d’hôtes. -Keep in mind, that the customization scripts are run every time you -do a softupdate. That means, they have to be idempotent i.e. the -result of their operation should always produce the same result, even -when they run more than once. +Gardez à l’esprit que les scripts de personnalisation sont exécutés +chaque fois que vous faites un softupdate. Cela signifie qu’ils +doivent être idempotents, c’est-à-dire que le résultat de leur +fonctionnement doit toujours produire le même résultat, même +lorsqu’ils fonctionnent plus d’une fois. -For example appending a line to a file must not done via this code: +Par exemple, l’ajout d’une ligne à un fichier ne doit pas se faire +via ce code : $ echo "some strings" >> /etc/fstab -Instead use the command ainsl(1) in a shell script or use cfengine’s -function AppendIfNoSuchLine. +Au lieu de ça, utilisez la commande ainsl(1) dans un script shell ou +utilisez la fonction de cfengine AppendIfNoSuchLine. -All commands in the customization script must be capable of modifying -the target file system wether it’s available in /target during the -initial installation or wether it’s the normal file system relative -to / during softupdate. +Toutes les commandes du script de personnalisation doivent être +capables de modifier le système de fichiers cible qui’il soit +disponible dans /target lors de l’installation initiale ou qu’il soit +le système de fichiers normal relatif à / pendant le softtupdate. -Here are some variable that help writing these scripts: +Voici quelques variables qui aident à écrire ces scripts : $target - Points to the root directory of the client, which is /target - during installation and / during a softupdate. + Pointe vers le répertoire racine du client, qui est /target + pendant l’installation et / pendant un softupdate. $FAI_ROOT - It’s the same value as $target. For historic reasons we have both - these variables in FAI. + C’est la même valeur que $target. Pour des raisons historiques, + on a ces deux variables dans FAI. $ROOTCMD - In case of the installation this is an alias for chroot $target - in case of softupdate it’s just empty. You can prepend this to - commands if you need to run a command inside the clients target - file system via chroot. + Dans le cas de l’installation, il s’agit d’un alias pour chroot + $target en cas de softupdate, c’est juste vide. Vous pouvez + ajouter ceci avant les commandes si vous avez besoin d’exécuter + une commande dans le système de fichiers cible des clients via + chroot. $FAI_ACTION - If you need to call code depending on the FAI action performed, - you can use this variable. It contains the currently executed - action: install, softupdate, dirinstall, sysinfo, inventory or - your own defined action. + Si vous devez appeler le code en fonction de l’action FAI + effectuée, vous pouvez utiliser cette variable. Elle contient + l’action actuellement exécutée: install, softupdate, dirinstall, + sysinfo, inventory ou votre propre action définie. -8.15. How to install 32-bit OS from a 64-bit OS +8.15. Comment installer un système d’exploitation 32 bits à partir +d’un système d’exploitation 64 bits -------------- -To install a computer with a 32-bit OS, you need an i386 nfsroot. -Creating this 32-bit nfsroot on an install server running amd64 is -quite simple. Install and set up the FAI packages. Then copy your FAI -config files to a new subdirectory. +Pour installer un ordinateur avec un système d’exploitation 32 bits, +vous avez besoin d’un nfsroot i386. La création de ce nfsroot 32 bits +sur un serveur d’installation qui fonctionne sous amd64 est simple. +Installez et configurez les paquets FAI. Copiez ensuite vos fichiers +de configuration FAI dans un nouveau sous-répertoire. faiserver# cp -a /etc/fai /etc/fai-i386 -Edit the variable $FAI_DEBOOTSTRAP_OPTS in /etc/fai-i386/nfsroot.conf -and add the option --arch i386. Also choose a different directory for -your new nfsroot. Here are the two lines after editing. +Modifiez la variable $FAI_DEBOOTSTRAP_OPTS dans /etc/fai-i386/ +nfsroot.conf et ajoutez l’option --arch i386. Choisissez également un +répertoire différent pour votre nouveau nfsroot. Voici les deux +lignes après l’édition. NFSROOT=/srv/fai/nfsroot-i386 FAI_DEBOOTSTRAP_OPTS="--arch i386 --exclude=info --include=aptitude"" -Now call fai-make-nfsroot which creates the 32-bit nfsroot in /srv/ -fai/nfsroot-i386 +Appelez maintenant fai-make-nfsroot qui crée le nfsroot 32 bits dans +/srv/fai/nfsroot-i386 faiserver# fai-make-nfsroot -v -C/etc/fai-i386 -Creating a partial mirror using fai-mirror(1) that is needed for a -bootable CD or USB stick is also possible on a different -architecture. You have to specify the architecture when calling -fai-mirror. +La création d’un miroir partiel utilisant fai-mirror(1) qui est +nécessaire à un CD amorçable ou une clé USB est également possible +sur une architecture différente. Vous devez spécifier l’architecture +lors de l’appel de fai-mirror. $ fai-mirror -m800 -B -a i386 -v -cDEFAULT,DEBIAN,FAIBASE,I386 /srv/mirror-i386 -That’s all! +Et voilà ! -8.16. Aborting the installation when an error occurs +8.16. Arrêt d’urgence de l’installation quand une erreur se produit -------------- -Every task and hook can call the function task_error to send an error -value to the installation. This error will appear in the log file and -can be shown in the fai-monitor-gui(1). The error value is also -checked against the variable $STOP_ON_ERROR which is set to 700 by -default. If the error value is greater than $STOP_ON_ERROR the -installation will stop immediately. In a hook, just add a call like -this: +Chaque tâche, chaque hook peut appeler la fonction task_error pour +envoyer une valeur d’erreur à l’installation. Cette erreur apparaîtra +dans le fichier de journalisation et peut être visionnée dans le +fai-monitor-gui(1). La valeur de l’erreur est aussi examinée en +tenant compte de la variable $STOP_ON_ERROR qui est réglée à 700 par +défaut. Si la valeur d’erreur est supérieure à $STOP_ON_ERROR, +l’installation s’arrêtera immédiatment. Dans un hook, ajoutez +simplement un appel comme celui-ci : -task_error +task_error -It is comfortable to call task_error with $? as second parameter, for -e.g. if you want to set an error value of 123 use this +C’est commode d’appeler task_error avec $? comme deuxième paramètre, +par exemple si on veut émettre une valeur d’erreur de 123 on peut +faire ainsi task_error 123 $? -Then the task error is only set if the preceding command failed with -some error. The same syntax can be used by the scripts in the class -subdirectory ending in .sh. +Alors, l’erreur de tâche n’est mise en place que si la commande +précédente a échoué avec une certaine erreur. La même syntaxe peut +être utilisée par les scripts dans le sous-répertoire de classe qui +se terminent en .sh. -A special case are scripts inside the class/ subdirectory that does -not end in .sh. In those scripts you have to call task_error with 1 -as third parameter. As an example you can use those two variants for -setting the value to 123 +Un cas particulier est celui des scripts dans le sous-répertoire +class/ qui ne se termine pas en .sh. Dans ces scripts il faut appeler +task_error avec 1 comme troisième paramètre. Par exemple on peut +utiliser deux variantes pour régler la valeur à 123 task_error 123 $? 1 -or +ou task_error 123 1 1 -The latter command always sets the task error to 123 regardless of -the value of $?. If the error value is greater than $STOP_ON_ERROR, -the installation will abort immediately. +La dernière commande met toujours l’erreur de tâche à 123 sans tenir +compte de $?. Si la valeur d’erreur est supérieure à $STOP_ON_ERROR, +l’installation sera immédiatement stoppée. -The error values are grouped into four categories +Les valeurs d’erreur sont regroupées dans quatre catégories -normal or info messages: 1xx, 2xx -warnings: 3xx, 4xx -minor errors: 5xx, 6xx -errors: 7xx, 8xx +normale ou messages d'information : 1xx, 2xx +avertissements : 3xx, 4xx +erreurs mineures : 5xx, 6xx +erreurs : 7xx, 8xx -The fai-monitor-gui has 4 different icons for these error categories. +Le fai-monitor-gui possède 4 icônes différentes pour ces catégories +d’erreur. --------------------------------------------------------------------- -9. Various hints and details +9. Divers conseils et détails --------------------------------------------------------------------- -9.1. The list of tasks +9.1. La liste des tâches -------------- -Most tasks of the installation are defined as subroutines which are -defined in /usr/lib/fai/subroutines (e.g. task_instsoft). Some are -external shell scripts located in /usr/lib/fai/. They are called via -a superior subroutine called task. This subroutine calls hooks if -available and then calls the task (defined as task_). A task -and its hooks can be skipped on demand by using the command skiptask -(). +La plupart des tâches de l’installation sont définies comme des +sous-routines qui sont définies dans /usr/lib/fai/subroutines (par +exemple task_instsoft). Certaines sont des scripts shell externes +situés dans /usr/lib/fai/. Elles sont appelées via un sous-programme +supérieur nommé task. Ce sous-programme appelle les hooks si +disponibles, puis appelle la tâche (définie comme task_). Une +tâche et ses hooks peuvent être ignorés à la demande en utilisant la +commande skiptask(). -Now follows the description of all tasks, listed in the order they -are executed. +Voici maintenant la description de toutes les tâches, énumérées dans +l’ordre dans lequel elles sont exécutées. confdir - - The kernel appended parameters may define variables, the syslog - daemon is started. Network parameters are fetched from a DHCP - server and are stored in boot.log. The DNS resolver configuration - file is created. - - The location of the configuration space is defined by the - variable $FAI_CONFIG_SRC. - - After that, the file $FAI/hooks/subroutines is sourced if it - exists. Using this file, you can define your own subroutines or - override the definition of FAI’s subroutines. - + Les paramètres ajoutés au noyau peuvent définir des variables, le + démon syslog est démarré. Les paramètres de réseau sont récupérés + d’un serveur DHCP et sont enregistrés dans boot.log. La + configuration pour la résolution DNS est créée. L’emplacement de + l’espace de configuration est défini par la variable + $FAI_CONFIG_SRC. Ensuite, le fichier $FAI/hooks/subroutines est + sourcé s’il existe. En utilisant ce fichier, vous pouvez définir + vos propres sous-programmes ou remplacer la définition des + sous-programmes de FAI. setup - This task sets the system time, all $FAI_FLAGS are defined and - two additional virtual terminals are opened on demand. A secure - shell daemon is started on demand for remote logins. + Cette tâche définit l’heure du système, tous les $FAI_FLAGS sont + définis et deux terminaux virtuels supplémentaires sont ouverts à + la demande. Un démon ssh est lancé à la demande pour les + connexions à distance. defclass - Calls fai-class(1) to define classes using scripts and files in - $FAI/class and classes from /tmp/fai/additional-classes and the - variable $ADDCLASSES. The list of all defined classes is stored - in the variable $classes and saved to /tmp/fai/FAI_CLASSES. + Appels de fai-class(1) pour définir des classes à l’aide de + scripts et de fichiers dans $FAI/class et classes de /tmp/fai/ + additional-classes et la variable $ADDCLASSES. La liste de toutes + les classes définies est stockée dans la variable $classes et + enregistrée dans /tmp/fai/FAI_CLASSES. defvar - Sources all files $FAI/class/*.var for every defined class. If a - hook has written some variable definitions to the file $LOGDIR/ - additional.var, this file is also sourced. + Source tous les fichiers $FAI/class/*.var pour chaque classe + définie. Si un hook a écrit quelques définitions de variables + dans le fichier $LOGDIR/additional.var, ce fichier est également + sourcé. action - Depending on the value of $FAI_ACTION this subroutine decides - which action FAI should perform. The default available actions - are: sysinfo, install, inventory, dirinstall and softupdate. If - $FAI_ACTION has another value, a user defined action is called if - a file $FAI/hooks/$FAI_ACTION exists. So you can easily define - your own actions. + En fonction de la valeur de $FAI_ACTION, ce sous-programme décide + de l’action FAI à exécuter. Les actions disponibles par défaut + sont : sysinfo, install, inventory, dirinstall et softupdate. Si + $FAI_ACTION a une autre valeur, une action définie par + l’utilisateur est appelée si un fichier $FAI/hooks/$FAI_ACTION + existe. Ainsi, vous pouvez facilement définir vos propres + actions. sysinfo - Called when no installation is performed but the action is - sysinfo. It shows information about the detected hardware and - mounts the local hard disks read only to /target/partitionname or - with regard to a fstab file found inside a partition. Log files - are stored to the install server. + Appelée lorsque aucune installation n’est effectuée mais que + l’action est sysinfo. Elle affiche des informations sur le + matériel détecté et monte les disques durs locaux en lecture + seule sur /target/partitionname ou en tenant compte d’un fichier + fstab trouvé à l’intérieur d’une partition. Les fichiers journaux + sont stockés sur le serveur d’installation. inventory - A short list of system information is printed. + Une courte liste des informations système est imprimée. install - This task controls the installation sequence. You will hear three - beeps before the installation starts. The major work is to call - other tasks and to save the output to /tmp/fai/fai.log. If you - have any problems during installation, look at all files in /tmp/ - fai/. You can find examples of the log files at https:// + Cette tâche contrôle la séquence d’installation. Vous entendrez + trois bips avant le début de l’installation. Le travail principal + consiste à appeler d’autres tâches et à enregistrer la sortie + dans /tmp/fai/fai.log. Si vous avez des problèmes pendant + l’installation, regardez tous les fichiers dans /tmp/fai/. Vous + trouverez des exemples de fichiers journaux à l’adresse https:// fai-project.org/logs/. dirinstall - Install into a directory, not onto a local disk. Use this for - creating chroot environments. + Installe dans un répertoire, et non pas sur un disque local. + Utilisez-le pour créer des environnements chroot. softupdate - This task, executed inside a running system via the fai(8) - command line interface, performs a softupdate. See chapter - [softupdate] for details. + Cette tâche, exécutée à l’intérieur d’un système en cours + d’exécution via la commande en ligne fai(8), effectue un + softupdate. Voir le chapitre [softupdate] pour plus de détails. partition - Calls setup-storage(8) to partition the hard disks and to create - file systems. The task writes variable definitions for the root - and boot partition and device ($ROOT_PARTITION, $BOOT_PARTITION, - $BOOT_DEVICE) to /tmp/fai/disk_var.sh and creates a fstab file - for the new system. + Appelle setup-storage(8) pour partitionner les disques durs et + créer des systèmes de fichiers. La tâche écrit des définitions de + variables pour les partitions et périphériques racine et de + démarrage ($ROOT_PARTITION, $BOOT_PARTITION, $BOOT_DEVICE) dans / + tmp/fai/disk_var.sh et crée un fichier fstab pour le nouveau + système. mountdisks - Mounts the created partitions according to the created /tmp/fai/ - fstab file relative to $FAI_ROOT. + Monte les partitions créées en fonction du fichier /tmp/fai/fstab + créé par rapport à $FAI_ROOT. extrbase - Extracts a minimal system after that a chroot can be made into - it. By default the base tar file /var/tmp/base.tar.xz will be - extracted. Also files matching a class name in $FAI/basefiles/ - are used for unpacking a different tar file depending on classes - defined. This can be used for installing different Linux - distributions than the one used for creating the nfsroot. The - default file base.tar.xz is a snapshot of a basic Debian system - created by debootstrap(8). This task uses the variable - FAI_BASEFILEURL for fetching the base file via FTP, HTTPS or HTTP - if it’s defined. + Extrait un système minimal après lequel un chroot puisse y être + introduit. Par défaut, le fichier tar de base /var/tmp/ + base.tar.xz sera extrait. Les fichiers correspondant à un nom de + classe dans $FAI/basefiles/ sont également utilisés pour + décompresser un autre fichier tar selon les classes définies. + Cela peut être utilisé pour installer des distributions Linux + différentes de celles utilisées pour créer le nfsroot. Le fichier + par défaut base.tar.xz est un instantané d’un système Debian de + base créé par debootstrap(8) Cette tâche utilise la variable + FAI_BASEFILEURL pour récupérer le fichier de base via FTP, HTTPS + ou HTTP si celle-ci est définie. debconf - Calls fai-debconf(1) to set the values for the debconf preseeding - database. + Appelle fai-debconf(1) pour définir les valeurs de la base de + données de pré-ensemencement de debconf. repository - Prepare access to the package repository by preparing the apt - configuration. This can also add repository keys in a class based - manner from files like CLASSNAME.gpg in the directory - package_config. + Prépare l’accès au dépôt de paquets en préparant la configuration + apt. Cela peut également ajouter des clés de dépôts en tenant + compte des classes à partir de fichiers comme CLASSNAME.gpg dans + le répertoire package_config. updatebase - Updates the base packages of the new system and updates the list - of available packages. It also fakes some commands (called - diversions) inside the new installed system using dpkg-divert(8), - so no daemons will be started during the installation. + Met à jour les paquets de base du nouveau système et met à jour + la liste des paquets disponibles. Il contrefait également + certaines commandes (appelées diversions) à l’intérieur du + nouveau système installé à l’aide de dpkg-divert(8), de sorte + qu’aucun démon ne soit démarré pendant l’installation. instsoft - Installs the desired software packages using class files in $FAI/ - package_config/. + Installe les paquets logiciels souhaités en utilisant des + fichiers de classe dans $FAI/package_config/. configure - Calls scripts in $FAI/scripts/ and its subdirectories for every - defined class. + Appelle les scripts dans $FAI/scripts/ et ses sous-répertoires + pour chaque classe définie. tests - Calls test scripts in $FAI/tests/ and its subdirectories for - every defined class. + Appelle les scripts de test dans $FAI/tests/ et ses + sous-répertoires pour chaque classe définie. finish - Unmounts all file systems in the new installed system and removes - diversions of files using the command fai-divert. + Démonte tous les systèmes de fichiers dans le nouveau système + installé et supprime les diversions de fichiers à l’aide de la + commande fai-divert. chboot - Changes the PXE configuration for a host on the install server - which indicates which PXELINUX configuration to load on the next - boot from network card via TFTP. Therefore the fai-chboot(8) - command is executed remotely on the install server. + Modifie la configuration PXE d’un hôte sur le serveur + d’installation, qui indique quelle configuration PXELINUX doit + être chargée lors de la prochaine initialisation à partir de la + carte réseau via TFTP. Par conséquent, la commande fai-chboot(8) + est exécutée à distance sur le serveur d’installation. savelog - Saves log files to local disk and to the account $LOGUSER on - $LOGSERVER (defaults to the install server). + Enregistre les fichiers journaux sur le disque local et sur le + compte $LOGUSER sur $LOGSERVER (par défaut sur le serveur + d’installation). faiend - Wait for background jobs to finish (e.g. emacs compiling lisp - files) and automatically reboots the install clients or waits for - manual input before reboot. + Attend que les travaux en arrière-plan se terminent (par exemple, + qu’emacs compile des fichiers lisp) puis redémarre + automatiquement les clients d’installation ou attend la saisie + manuelle avant le redémarrage. -9.2. Automated tests +9.2. Tests automatisés -------------- -After the customization scripts are executed, FAI will execute some -tests if available. Using these test, you can check for errors of the -installation. Test scripts are called via fai-do-scripts(1) and -should append its messages to $LOGDIR/test.log. A Perl module -including some useful subroutines can be found in Faitest.pm. A test -can also define a new class for executing another tests during next -boot via the variable $ADDCLASSES. +Après l’exécution des scripts de personnalisation, FAI exécutera +certains tests si disponibles. En utilisant ces tests, vous pouvez +vérifier les erreurs de l’installation. Les scripts de test sont +appelés via fai-do-scripts(1) et doivent ajouter leurs messages à +$LOGDIR/test.log. Un module Perl comprenant des sous-routines utiles +peut être trouvé dans Faitest.pm. Un test peut également définir une +nouvelle classe pour exécuter d’autres tests lors du prochain +démarrage via la variable $ADDCLASSES. -9.3.  Autodiscover +9.3. Découvrir automatiquement -------------- -In FAI 5.0 we released a feature that allows clients to search for -the faiserver in their respective subnetwork. This lifts the -necessity of having to collect every client’s MAC address and -configuring the DHCP daemon. +Dans FAI 5.0, nous avons publié une fonctionnalité qui permet aux +clients de rechercher le faiserver dans leur sous-réseau respectif. +Cela soulève la nécessité de récupérer l’adresse MAC de chaque client +et de configurer le démon DHCP. -This is done by booting from a small FAI autodiscover bootmedium (CD, -USB, etc.), which can be created via the command: +Cela se fait en démarrant à partir d’une petit media vif autodiscover +FAI (CD, USB, etc.), qui peut être créé via la commande : faiserver# fai-cd -A autodiscover.iso -The image is roughly 25MB in size and scans the subnet for a FAI -server. By default it shows a menu with all profiles available in the -configuration space in the same manner as the menu flag does. From -this menu, you can select the installation type you wish to perform. +L’image a une taille d’environ 25 Mo et analyse le sous-réseau d’un +serveur FAI. Par défaut, il affiche un menu avec tous les profils +disponibles dans l’espace de configuration de la même manière que le +fait l’option menu. Dans ce menu, vous pouvez sélectionner le type +d’installation que vous souhaitez effectuer. -For the clients to find the faiserver, the faiserver must run -fai-monitor. +Pour que les clients puissent trouver le faiserver, le faiserver doit +lancer fai-monitor. -9.4. Changing the boot device +9.4. Modification du périphérique d’amorçage -------------- -Changing the boot sequence is normally done in the BIOS setup. But -you can’t change the BIOS from a running Linux system. +La modification de la séquence d’amorçage s’effectue normalement dans +la configuration du BIOS. Mais vous ne pouvez pas changer le BIOS +d’un système Linux en cours d’exécution. -So, the boot sequence of the BIOS will remain unchanged and your -computer should always boot first from its network card and the -second boot device should be the local disk. Then you can change the -boot device of the client by creating different PXELINUX -configurations. This will define if an installation should be -performed, or if the client should to boot from local disk. This is -done using fai-chboot(8). +Ainsi, la séquence d’amorçage du BIOS restera inchangée et votre +ordinateur devrait toujours démarrer en premier à partir de sa carte +réseau et le deuxième périphérique d’amorçage devrait être le disque +local. Ensuite, vous pouvez changer le périphérique d’amorçage du +client en créant différentes configurations PXELINUX. Cela définira +si une installation doit être effectuée, ou si le client doit +démarrer à partir du disque local. Cela se fait à l’aide de +fai-chboot(8). -9.5. How to create a local Debian mirror +9.5. Comment créer un miroir Debian local -------------- -The utility mkdebmirror ^[18] can be used for creating your own local -Debian mirror. This script uses debmirror(1). A partial Debian mirror -for amd64 architecture for Debian 11 and 12 (aka bullseye and -bookworm) without the source packages needs about 180GB of disk -space. Accessing the mirror via HTTP will be the default way in most -cases. To see more output from the script call mkdebmirror -v. A root -account is not necessary to create and maintain the Debian mirror. +Le script utilitaire mkdebmirror ^[19] peut être utilisé pour créer +votre propre miroir Debian local. Ce script utilise la commande +debmirror(1). Un miroir Debian partiel pour l’architecture amd64 pour +Debian 11 et 12 (noms de code bullseye et bookworm) sans les paquets +source nécessite environ 180 Go d’espace disque. L’accès au miroir +via HTTP sera la méthode par défaut dans la plupart des cas. Pour +afficher plus de résultats à partir du script, appelez mkdebmirror +-v. Un compte root n’est pas nécessaire pour créer et maintenir le +miroir Debian. -To use HTTP access to the local Debian mirror, install a web server -and create a symlink to the local directory where your mirror is -located: +Pour utiliser l’accès HTTP au miroir Debian local, installez un +serveur web et créez un lien symbolique vers le répertoire local où +se trouve votre miroir : faiserver# apt-get install apache2 faiserver# ln -s /files/scratch/debmirror /var/www/html/debmirror -Create a file sources.list(5) in /etc/fai/apt which gives access to -your Debian mirror. Also add the IP-address of the HTTP server to the -variable $NFSROOT_ETC_HOSTS in nfsroot.conf if the install clients -have no DNS resolving. +Créez un fichier sources.list(5) dans /etc/fai/apt qui donne accès à +votre miroir Debian. Ajoutez également l’adresse IP du serveur HTTP à +la variable $NFSROOT_ETC_HOSTS dans nfsroot.conf si les clients +d’installation n’ont pas de résolution DNS. -9.6. Small hints +9.6. Petits conseils -------------- - * When using HTTP access to a Debian mirror, the local /var - partition on all install clients must be big enough to keep the - downloaded Debian packages. Do not try with less than 250 Mbytes - unless you know why. You can limit the number of packages - installed at a time with the variable $MAXPACKAGES. - * You can remove the red logo on the install client by simply - calling reset once. If will also not appear if you create a file - using this command on the install server: + * Lorsque vous utilisez l’accès HTTP à un miroir Debian, la + partition locale /var sur tous les clients d’installation doit + être suffisamment grande pour conserver les paquets Debian + téléchargés. N’essayez pas avec moins de 250 Moctets à moins que + vous sachiez pourquoi. Vous pouvez limiter le nombre de paquets + installés à la fois avec la variable $MAXPACKAGES. + * Vous pouvez supprimer le logo rouge sur le client d’installation + en appelant simplement une fois reset. Il ne s’affichera pas si + vous créez un fichier à l’aide de cette commande sur le serveur + d’installation : touch /srv/fai/nfsroot/.nocolorlogo - * A list of variables used by FAI can be found at https:// - wiki.fai-project.org/index.php/Variables. - * You can shorten some customization scripts by using one single - fcopy command fcopy -r /. - * If you rebuild the nfsroot, you will create a new ssh host key - inside the nfsroot. Then logging in to an install client may - fail, because the host key changes. You can use this: + * Une liste des variables utilisées par FAI peut être trouvée à + https://wiki.fai-project.org/index.php/Variables. + * Vous pouvez raccourcir certains scripts de personnalisation en + utilisant une seule commande fcopy fcopy -r /. + * Si vous reconstruisez le nfsroot, vous allez créer une nouvelle + clé hôte ssh dans le nfsroot. La connexion à un client + d’installation peut échouer, car la clé hôte change. Vous pouvez + utiliser ceci : $ ssh -o StrictHostKeyChecking=no root@installclient - * You can also delete the host entry on your install client in your - ~/.ssh/known_hosts file by using the ssh-keygen -R command. - * In the tasks chboot and savelog, a connection using secure shell - is opened to the FAI server (see [isavelog]). To ensure that this - works non-interactively, a proper entry in NFSROOT/root/.ssh/ - known_hosts must be created. When using fai-setup, this is done - automatically, but it may require manual editing in case the name - of your FAI server was not determined correctly. If you stumble - over ssh connections that require typing "yes" to accept the host - key during installation, please check the contents of your - NFSROOT/root/.ssh/known_hosts file - * A list of all local hard disks is stored in $disklist. It’s - defined after set_disk_info is called. - * There are multiple functions for generating a customized disk - list. See fai-disk-info for an example. + * Vous pouvez également supprimer l’entrée hôte de votre client + d’installation dans votre fichier ~/.ssh/known_hosts à l’aide de + la commande ssh-keygen -R. + * Dans les tâches chboot et savelog, une connexion utilisant un + shell sécurisé est ouverte vers le serveur FAI (voir [isavelog]). + Pour garantir que cela fonctionne de manière non interactive, une + entrée appropriée dans NFSROOT/root/.ssh/known_hosts doit être + créée. Lors de l’utilisation de fai-setup, cela se fait + automatiquement, mais il peut s’avérer nécessaire de l’éditer + manuellement si le nom de votre serveur FAI n’a pas été + correctement déterminé. Si vous trébuchez sur des connexions ssh + qui nécessitent de taper "yes" pour accepter la clé hôte pendant + l’installation, vérifiez le contenu de votre fichier NFSROOT/root + /.ssh/known_hosts + * Une liste de tous les disques durs locaux est stockée dans + $disklist. Elle est définie après l’appel de set_disk_info. + * Il y a de nombreuses fonctions pour générer un liste + personnalisée de disques. Voir fai-disk-info pour un exemple. + set_bootstick() + grepv_disks() @@ -2598,44 +2776,50 @@ $ ssh -o StrictHostKeyChecking=no root@installclient + once_only() + checkdisk() + disks_by_id() - * Use fai-divert -a if a postinst script calls a configuration - program, e.g. the postinst script for package apache calls - apacheconfig, which needs manual input. You can fake the - configuration program so the installation can be fully automatic. - * Sometimes the installation seems to stop, but often there’s only - a postinstall script of a software package that requires manual - input from the console. Change to another virtual terminal and - look which process is running with tools like top(1) and pstree - (1). You can add debug to FAI_FLAGS to make the installation - process show all output from the postinst scripts on the console - and get its input also from the console. - * How can I define classes on the kernel command line? - - Read the man page of fai-class(8). If you like to define some - additional classes (for e.g. A,B,C) on the kernel command line - add this: ADDCLASSES=A,B,C - - * How to use a custom kernel inside the nfsroot? - - Build your customized kernel by building a kernel package using - make-kpkg(8) and use the option --initrd. Copy this Debian - package to a local repository and add it to /etc/fai/ - sources.list. Add the name of your package to /etc/fai/NFSROOT. - Then call + * Utilisez fai-divert -a si un script postinst appelle un programme + de configuration, par exemple le script postinst pour le paquet + apache appelle apacheconfig, qui nécessite une entrée manuelle. + Vous pouvez contrefaire le programme de configuration pour que + l’installation puisse être entièrement automatique. + * Parfois, l’installation semble s’arrêter, mais souvent il y a + seulement un script postinstall d’un logiciel qui nécessite une + entrée manuelle de la console. Passez à un autre terminal virtuel + et regardez quel processus fonctionne avec des outils comme top + (1) et pstree(1). Vous pouvez ajouter debug à FAI_FLAGS pour + faire en sorte que le processus d’installation affiche toutes les + sorties des scripts postinst sur la console et obtenir son entrée + aussi à partir de la console. + * Comment puis-je définir des classes sur la ligne de commande du + noyau ? + + Lire la page de manuel de fai-class(8). Si vous voulez définir + quelques classes supplémentaires (par exemple A; B, C) dans la + commande du noyau, ajoutez ceci : ADDCLASSES=A,B,C + + * Comment utiliser un noyau personnalisé dans le nfsroot ? + + Construisez votre noyau personnalisé en construisant un paquet + kernelde noyau à l’aide de make-kpkg(8) et utilisez l’option + --initrd. Copiez ce paquet Debian dans un dépôt local et + ajoutez-le à /etc/fai/sources.list. Ajoutez le nom de votre + paquet à /etc/fai/NFSROOT. Ensuite appelez # fai-make-nfsroot -k - * How to use the nfsroot as system for diskless clients? + * Comment utiliser le nfsroot comme système pour les clients sans + disque ? https://wiki.fai-project.org/index.php/ Use_nfsroot_for_diskless_clients - * How to serve multiple nfsroot directories on one FAI server? + * Comment faire pour servir plusieurs arborescence nfsroot sur un + serveur FAI ? - If you want to serve multiple nfsroot directories, you need to - create specific config directories in /etc for FAI, like /etc/ - fai-buster and /etc/fai-bookworm. Then you need to set the - $NFSROOT variables to different directories and run + Si vous souhaitez diffuser plusieurs répertoires nfsroot, vous + devez créer des répertoires de configuration spécifiques dans / + etc pour FAI, comme /etc/fai-buster et /etc/fai-bookworm. + Ensuite, vous devez définir les variables $NFSROOT dans + différents répertoires et lancer faiserver#fai-make-nfsroot -C /etc/fai-buster @@ -2644,115 +2828,122 @@ faiserver#fai-make-nfsroot -C /etc/fai-buster -------------- -If flag_reboot is set, by adding "reboot" to $FAI_FLAGS, your client -machine will reboot after the task faiend has finished. This is true -for network as well as bootmedium installations. +Si flag_reboot est défini, en ajoutant "reboot" à $FAI_FLAGS, votre +ordinateur client redémarrera après la fin de la tâche faiend. Ceci +est vrai pour les installations par réseau ainsi que pour les +installations par media amorçable. -9.8. Log files +9.8. Fichiers journaux -------------- -FAI is creating several log files. During installation they are -stored in /tmp/fai on the install client itself. At the end of the -installation they will be copied to the install server (see -[isavelog]). After the install client rebooted into his newly -installed system, you can find the FAI logs in /var/log/fai. Log -files are also created when doing the softupdate or dirinstall -action. +FAI crée plusieurs fichiers journaux. Pendant l’installation, ils +sont stockés dans /tmp/fai sur le client d’installation lui-même. A +la fin de l’installation, ils seront copiés sur le serveur +d’installation (voir [isavelog]). Une fois le client d’installation +redémarré dans son système nouvellement installé, vous pouvez trouver +les journaux FAI dans /var/log/fai. Les fichiers journaux sont +également créés lors de l’action softupdate ou dirinstall. -On the faiserver, you can find the (remote) log files under the ~fai -directory. +Sur le faiserver, vous pouvez trouver les fichiers journaux +(distants) sous le répertoire ~fai. -Sample log files from successfully installed computers are available -on https://fai-project.org/logs. These a some log files which are -created by FAI. +Des exemples de fichiers journaux d’ordinateurs installés avec succès +sont disponibles sur https://fai-project.org/logs. Ce sont quelques +fichiers journaux qui sont créés par FAI. FAI_CLASSES - Contains a list of all classes defined. + Contient une liste de toutes les classes définies. dmesg.log - Output of the dmesg command. Contains useful messages of the - kernel ring buffer. + La sortie de la commande dmesg. Contient des messages utiles de + la mémoire tampon du noyau. fai.log - The main log file. Contains all important information. You should - always read this file. + Le fichier journal principal. Contient toutes les informations + importantes. Vous devez toujours lire ce fichier. boot.log - A list of variables of network parameters, mostly defined by the - DHCP daemon. + Une liste de variables de paramètres de réseau, principalement + définis par le démon DHCP. format.log - Output of the partition tool setup-storage(8). + Sortie de l’outil de partition setup-storage(8). scripts.log - Output of all scripts, that are used for customization. + Sortie de tous les scripts, qui sont utilisés pour la + personnalisation. variables.log - A list of all shell variables which are available during an - installation. + Une liste de toutes les variables shell qui sont disponibles au + cours d’une installation. error.log - A summary of possible errors in all log files. + Résumé des erreurs possibles dans tous les fichiers journaux. disk_var.sh - A list of variables that contain information about devices and - partitions to boot from, the root partition and a list of swap - devices. These information is used by some customization scripts - (e.g. GRUB_PC/10-setup). + Une liste des variables contenant des informations sur les + périphériques et les partitions à partir desquelles on démarre, + la partition racine et une liste de périphériques de swap. Ces + informations sont utilisées par certains scripts de + personnalisation (par exemple GRUB_PC/10-setup). -If the installation process finishes, the hook savelog.LAST.sh -searches all log files for common errors and writes them to the file -error.log. So, you should first look into this file for errors. Also -the file status.log give you the exit code of the last command -executed in a script. To be sure, you should look for more details in -all log files. +Si le processus d’installation se termine, le hook savelog.LAST.sh +recherche dans tous les fichiers journaux les erreurs courantes et +les écrit dans le fichier error.log. Donc, vous devriez d’abord +regarder dans ce fichier pour les erreurs. Le fichier status.log vous +donne également le code de sortie de la dernière commande exécutée +dans un script. Pour être sûr, vous devrez rechercher plus de détails +dans tous les fichiers journaux. -9.9. How to use HTTP for PXE boot +9.9. Comment utiliser HTTP pour le démarrage PXE -------------- -fai-make-nfsroot now uses the lpxelinux.0 binary which already -supports transfer of the kernel and initrd via http (additional to -tftp). You only have to enable HTTP access to the tftp directory: +fai-make-nfsroot utilise maintenant le fichier binaire lpxelinux.0 +qui prend en charge déjà le transfert du noyau et du fichier initrd +via http (en plus de tftp). Il vous suffit d’activer un accès HTTP au +répertoire tftp : cd /var/www/html ln -s /srv/tftp/fai -Add -U URL to the fai-chboot call. For example: +Ajoutez -U URL à l’appel fai-chboot. Par exemple : fai-chboot -U http://faiserver/fai -IFv ....... --------------------------------------------------------------------- -10. Troubleshooting +10. Dépannage --------------------------------------------------------------------- -10.1. Boot errors +10.1. Erreurs d’amorçage -------------- -The following error message indicates that your install client -doesn’t get an answer from a DHCP server. Check your cables or start -the dhcpd(8) daemon with the debug flag enabled. +Le message d’erreur suivant indique que votre client d’installation +n’obtient pas de réponse d’un serveur DHCP. Vérifiez vos câbles ou +démarrez le démon dhcpd(8) avec l’option debug activée. PXE-E51: No DHCP or BOOTP offers received Network boot aborted -If you do not see the following message, the install kernel could not -detect your network card, for example because of a missing driver: +Si vous ne voyez pas le message suivant, le noyau d’installation n’a +pas pu détecter votre carte réseau, par exemple en raison d’un pilote +manquant : Starting dhcp for interface eth0 dhcp: PREINIT eth0 up dhcp: BOND setting eth -Check the initrd in the nfsroot (lsinird) if the kernel driver of -your network card is included there and check if you like to add the -package firmware-linux-nonfree in /etc/fai/NFSROOT and rebuild the -initrd by calling fai-make-nfsroot -k. You may also add a driver to / -srv/fai/nfsroot/etc/dracut.conf in the line add_drivers+=. +Vérifiez le fichier initrd dans le nfsroot (lsinird) pour voir si le +pilote du noyau de votre carte réseau est inclus et vérifiez si vous +souhaitez ajouter le paquet firmware-linux-nonfree dans /etc/fai/ +NFSROOT` puis reconstruisez le fichier initrd en appelant +fai-make-nfsroot -k. Vous pouvez également ajouter un pilote à +/srv/ +fai/nfsroot/etc/dracut.conf dans la ligne add_drivers+=. -This is the error message you will see, when your network card is -working, but the install server does not export the nfsroot directory -to the install clients, This is often caused by missing NFS -permissions on the server side. +Voici le message d’erreur que vous verrez, lorsque votre carte réseau +fonctionne, mais le serveur d’installation n’exporte pas le +répertoire nfsroot vers les clients d’installation. Cela est souvent +dû aux permissions NFS manquantes du côté serveur. Starting dhcp for interface eth0 dhcp: PREINIT eth0 up @@ -2765,13 +2956,15 @@ dracut Warning: Could not boot Dropping to debug shell dracut:/# -Now, you are inside the emergency shell of the initrd which was -created by dracut(8). You will get a shell prompt, and can look at -the log files. For more information about debugging the early boot -process using dracut see dracut.cmdline(7) +Maintenant, vous êtes à l’intérieur du shell d’urgence de l’initrd +qui a été créé par dracut(8). Vous obtiendrez une invite du shell et +pourrez consulter les fichiers journaux. Pour plus d’informations sur +le débogage du processus de démarrage précoce à l’aide de dracut, +consultez dracut.cmdline(7) -Use the following command on the install server to see which -directories are exported from the install server (named faiserver): +Utilisez la commande suivante sur le serveur d’installation pour voir +quels répertoires sont exportés à partir du serveur d’installation +(nommé faiserver) : $ showmount -e faiserver @@ -2786,44 +2979,49 @@ docs.oracle.com/cd/E19455-01/806-0957/806-0957.pdf ^[3] https://wiki.fai-project.org/index.php/ VirtualBox_for_your_first_FAI_installation -^[4] Cette installation utilisera environ 2GB d’espace dans /tmp. +^[4] https://fr.wikipedia.org/wiki/TAP_r%C3%A9seau + +^[5] Cette installation utilisera environ 2GB d’espace dans /tmp. -^[5] It’s also possible to use only the configuration file with the -highest priority since the order of classes define a priority from -low to high within the list of classes. +^[6] on peut aussi seulement utiliser le fichier de configuration qui +a la priorité la plus élevée, comme l’ordre des classes définit une +priorité de la plus basse à la plus élevée dans la liste des classes. -^[6] If you want to use a faster mirror, adjust the URL in /etc/fai/ -apt/sources.list and FAI_DEBOOTSTRAP in /etc/fai/nfsroot.conf before -calling fai-setup. +^[7] Si vous voulez un miroir plus rapide, ajustez l’URL dans /etc/ +fai/apt/sources.list et FAI_DEBOOTSTRAP dans /etc/fai/nfsroot.conf +avant de lancer fai-setup. -^[7] This will call fai-make-nfsroot(8) internally. +^[8] Cela invoque fai-make-nfsroot(8) en interne. -^[8] These files need not belong to the root account. +^[9] Il n’est pas nécessaires que ces fichiers appartiennent au +compte root. -^[9] You may also add this into your Domain Name System (DNS) +^[10] On peut aussi ajouter cela dans son serveur de noms de domaine +(DNS) -^[10] Since the root file system on the clients is mounted via NFS, -fai is located in /srv/fai/nfsroot/usr/sbin on the install server. +^[11] Comme le système de fichiers racine des clients est monté via +NFS, fai se situe dans /srv/fai/nfsroot/usr/sbin sur le serveur +d’installation. -^[11] $FAI is an internal variable used by the FAI scripts. By -default the path is /var/lib/fai/config. +^[12] $FAI est une variable interne utilisée par les scripts FAI. Le +chemin par défaut est /var/lib/fai/config. -^[12] /srv/fai/nfsroot from the install server via NFS +^[13] /srv/fai/nfsroot depuis le serveur d’installation via NFS -^[13] It is defined on the kernel command line +^[14] Celle-ci est définie dans la ligne de commande du noyau -^[14] /var/lib/fai/config +^[15] /var/lib/fai/config -^[15] /var/log/fai/localhost/install/ is a link to this directory. +^[16] /var/log/fai/localhost/install/ est un lien vers ce répertoire. -^[16] I recommend to write the MAC addresses (last three bytes will -suffice if you have network cards from the same vendor) and the host -name in the front of each chassis. +^[17] Je recommande d’inscrire l’adresse MAC (les trois derniers +octets devraient suffire si vous avez des cartes du même vendeur) et +le nom d’hôte devant chaque boîtier. -^[17] For debugging purpose it may help to enter the chroot -environment manually using this command. faiserver# chroot /srv/fai/ -nfsroot bash +^[18] À des fins de débogage, il peut être utile d’entrer dans +l’environnement chroot à la main à l’aide de cette commande : +faiserver# chroot /srv/fai/nfsroot bash -^[18] You can find the script in /usr/share/doc/fai-doc/examples/ +^[19] On peut trouver ce script dans /usr/share/doc/fai-doc/examples/ utils/ diff --git a/doc/fai-guide_fr.txt b/doc/fai-guide_fr.txt index ba95c672f..3d18eec80 100644 --- a/doc/fai-guide_fr.txt +++ b/doc/fai-guide_fr.txt @@ -554,7 +554,7 @@ Utilisez ces commandes pour l'installation : # echo "deb http://fai-project.org/download bookworm koeln" > /etc/apt/sources.list.d/fai.list ---- -or +ou  ---- # apt install extrepo ; extrepo enable fai @@ -1002,9 +1002,9 @@ Les variables suivantes sont utilisées dans les exemples et peuvent aussi être utiles pour votre installation : FAI_ACTION:: -Set the action FAI should perform. Normally this is done by -`fai-chboot(8)`. If you can't use this command, define this variable -i.e. in the script 'LAST.var'. +Configure les actions que doit effectuer FAI. Normalement, ceci se fait +par `fai-chboot(8)`. Si vous ne pouvez pas utiliser cette commande, +définissez cette variable dans le script 'LAST.var'. FAI_ALLOW_UNSIGNED:: Si cette variable vaut 1, FAI permet l’installation de paquets à partir de @@ -2277,7 +2277,7 @@ régler la valeur à 123 task_error 123 $? 1 ---- -or +ou  ---- task_error 123 1 1 @@ -2590,11 +2590,11 @@ connexions ssh qui nécessitent de taper "yes" pour accepter la clé hôte pendant l’installation, vérifiez le contenu de votre fichier 'NFSROOT/root/.ssh/known_hosts' -- A list of all local hard disks is -stored in +$disklist+. It's defined after `set_disk_info` is called. +- Une liste de tous les disques durs locaux est stockée dans ++$disklist+. Elle est définie après l’appel de `set_disk_info`. -- There are multiple functions for generating a customized disk -list. See `fai-disk-info` for an example. +- Il y a de nombreuses fonctions pour générer un liste personnalisée +de disques. Voir `fai-disk-info` pour un exemple. * set_bootstick() * grepv_disks() * grep_disks() @@ -2608,49 +2608,55 @@ list. See `fai-disk-info` for an example. * checkdisk() * disks_by_id() -- Use `fai-divert -a` if a postinst script calls a configuration -program, e.g. the postinst script for package apache calls -apacheconfig, which needs manual input. You can fake the configuration -program so the installation can be fully automatic. +- Utilisez `fai-divert -a` si un script postinst appelle un programme +de configuration, par exemple le script postinst pour le paquet apache +appelle apacheconfig, qui nécessite une entrée manuelle. Vous pouvez +contrefaire le programme de configuration pour que l’installation puisse +être entièrement automatique. -- Sometimes the installation seems to stop, but often there's only a -postinstall script of a software package that requires manual input -from the console. Change to another virtual terminal and look which -process is running with tools like `top(1)` and `pstree(1)`. You can -add _debug_ to _FAI_FLAGS_ to make the installation process show all -output from the postinst scripts on the console and get its input also -from the console. +- Parfois, l’installation semble s’arrêter, mais souvent il y a seulement +un script postinstall d’un logiciel qui nécessite une entrée manuelle de +la console. Passez à un autre terminal virtuel et regardez quel +processus fonctionne avec des outils comme `top(1)` et `pstree(1)`. +Vous pouvez ajouter _debug_ à _FAI_FLAGS_ pour faire en sorte que le +processus d’installation affiche toutes les sorties des scripts postinst +sur la console et obtenir son entrée aussi à partir de la console. -- How can I define classes on the kernel command line? +- Comment puis-je définir des classes sur la ligne de commande du noyau ? + -Read the man page of `fai-class(8)`. If you like to define some -additional classes (for e.g. A,B,C) on the kernel command line add this: _ADDCLASSES=A,B,C_ +Lire la page de manuel de `fai-class(8)`. Si vous voulez définir quelques +classes supplémentaires (par exemple A; B, C) dans la commande du noyau, +ajoutez ceci : _ADDCLASSES=A,B,C_ -- How to use a custom kernel inside the nfsroot? +- Comment utiliser un noyau personnalisé dans le nfsroot ? + -Build your customized kernel by building a kernel package using -`make-kpkg(8)` and use the option `--initrd`. Copy this Debian package -to a local repository and add it to /etc/fai/sources.list. Add the -name of your package to /etc/fai/NFSROOT. Then call +Construisez votre noyau personnalisé en construisant un paquet kernelde noyau à +l’aide de `make-kpkg(8)` et utilisez l’option `--initrd`. Copiez ce +paquet Debian dans un dépôt local et ajoutez-le à +/etc/fai/sources.list. Ajoutez le nom de votre paquet à +/etc/fai/NFSROOT. Ensuite appelez + ---- # fai-make-nfsroot -k ---- -- How to use the nfsroot as system for diskless clients? +- Comment utiliser le nfsroot comme système pour les clients sans +disque ? + https://wiki.fai-project.org/index.php/Use_nfsroot_for_diskless_clients -- How to serve multiple nfsroot directories on one FAI server? +- Comment faire pour servir plusieurs arborescence nfsroot sur un +serveur FAI ? + -If you want to serve multiple nfsroot directories, -you need to create specific config directories in '/etc' for FAI, like -'/etc/fai-buster' and '/etc/fai-bookworm'. Then you need to set the -+$NFSROOT+ variables to different directories and run +Si vous souhaitez diffuser plusieurs répertoires nfsroot, vous devez +créer des répertoires de configuration spécifiques dans '/etc' pour FAI, +comme '/etc/fai-buster' et '/etc/fai-bookworm'. Ensuite, vous devez +définir les variables +$NFSROOT+ dans différents répertoires et +lancer ---- faiserver#fai-make-nfsroot -C /etc/fai-buster @@ -2659,104 +2665,109 @@ faiserver#fai-make-nfsroot -C /etc/fai-buster === flag_reboot (FAI_FLAGS) -If flag_reboot is set, by adding "reboot" to +$FAI_FLAGS+, your client -machine will reboot after the task faiend has finished. This is true -for network as well as bootmedium installations. +Si flag_reboot est défini, en ajoutant "reboot" à +$FAI_FLAGS+, votre +ordinateur client redémarrera après la fin de la tâche faiend. Ceci est vrai +pour les installations par réseau ainsi que pour les installations par +media amorçable. -=== [[logfiles]]Log files +=== [[logfiles]]Fichiers journaux -FAI is creating several log files. During installation they are stored -in '/tmp/fai' on the install client itself. At the end of the -installation they will be copied to the install server (see -<>). After the install client rebooted into his newly -installed system, you can find the FAI logs in '/var/log/fai'. -Log files are also created when doing the softupdate or dirinstall -action. +FAI crée plusieurs fichiers journaux. Pendant l’installation, ils sont +stockés dans '/tmp/fai' sur le client d’installation lui-même. A la fin +de l’installation, ils seront copiés sur le serveur d’installation (voir +<>). Une fois le client d’installation redémarré +dans son système nouvellement installé, vous pouvez trouver les journaux +FAI dans '/var/log/fai'. Les fichiers journaux sont également créés lors +de l’action softupdate ou dirinstall. -On the faiserver, you can find the (remote) log files under the ~fai -directory. +Sur le faiserver, vous pouvez trouver les fichiers journaux (distants) +sous le répertoire ~fai. -Sample log files from successfully installed computers are -available on https://fai-project.org/logs. -These a some log files which are created by FAI. +Des exemples de fichiers journaux d'ordinateurs installés avec succès +sont disponibles sur https://fai-project.org/logs. Ce sont quelques +fichiers journaux qui sont créés par FAI. FAI_CLASSES:: -Contains a list of all classes defined. + Contient une liste de toutes les classes définies. dmesg.log:: -Output of the `dmesg` command. Contains useful messages of the kernel -ring buffer. + La sortie de la commande `dmesg`. Contient des messages utiles de la + mémoire tampon du noyau. fai.log:: -The main log file. Contains all important information. You should -*always* read this file. + Le fichier journal principal. Contient toutes les informations + importantes. Vous devez *toujours* lire ce fichier. boot.log:: -A list of variables of network parameters, mostly defined by the DHCP daemon. + Une liste de variables de paramètres de réseau, principalement définis + par le démon DHCP. format.log:: -Output of the partition tool `setup-storage(8)`. + Sortie de l’outil de partition `setup-storage(8)`. scripts.log:: -Output of all scripts, that are used for customization. +Sortie de tous les scripts, qui sont utilisés pour la personnalisation. variables.log:: -A list of all shell variables which are available during an -installation. + Une liste de toutes les variables shell qui sont disponibles au cours + d’une installation. error.log:: -A summary of possible errors in all log files. + Résumé des erreurs possibles dans tous les fichiers journaux. disk_var.sh:: -A list of variables that contain information about devices and -partitions to boot from, the root partition and a list of swap -devices. These information is used by some customization scripts -(e.g. _GRUB_PC/10-setup_). + Une liste des variables contenant des informations sur les + périphériques et les partitions à partir desquelles on démarre, la partition + racine et une liste de périphériques de swap. Ces informations sont + utilisées par certains scripts de personnalisation (par exemple + _GRUB_PC/10-setup_). -If the installation process finishes, the hook 'savelog.LAST.sh' -searches all log files for common errors and writes them to the file -'error.log'. So, you should first look into this file for errors. Also -the file 'status.log' give you the exit code of the last command -executed in a script. To be sure, you should look for more details in -all log files. +Si le processus d’installation se termine, le hook 'savelog.LAST.sh' +recherche dans tous les fichiers journaux les erreurs courantes et les +écrit dans le fichier 'error.log'. Donc, vous devriez d’abord regarder +dans ce fichier pour les erreurs. Le fichier 'status.log' vous donne +également le code de sortie de la dernière commande exécutée dans un +script. Pour être sûr, vous devrez rechercher plus de détails dans tous +les fichiers journaux. -=== How to use HTTP for PXE boot +=== Comment utiliser HTTP pour le démarrage PXE -fai-make-nfsroot now uses the lpxelinux.0 binary which already -supports transfer of the kernel and initrd via http (additional to tftp). -You only have to enable HTTP access to the tftp directory: +fai-make-nfsroot utilise maintenant le fichier binaire lpxelinux.0 qui +prend en charge déjà le transfert du noyau et du fichier initrd via http +(en plus de tftp). Il vous suffit d'activer un accès HTTP au répertoire tftp : ---- cd /var/www/html ln -s /srv/tftp/fai ---- -Add '-U URL' to the 'fai-chboot' call. For example: +Ajoutez '-U URL' à l’appel 'fai-chboot'. Par exemple : ---- fai-chboot -U http://faiserver/fai -IFv ....... ---- -== [[troubleshoot]]Troubleshooting +== [[troubleshoot]]Dépannage -=== [[booterror]]Boot errors +=== [[booterror]]Erreurs d’amorçage -The following error message indicates that your install client doesn't -get an answer from a DHCP server. Check your cables or start the -`dhcpd(8)` daemon with the debug flag enabled. +Le message d’erreur suivant indique que votre client d’installation +n’obtient pas de réponse d’un serveur DHCP. Vérifiez vos câbles ou +démarrez le démon `dhcpd(8)` avec l'option debug activée. ____ PXE-E51: No DHCP or BOOTP offers received Network boot aborted ____ -If you do not see the following message, the install kernel could not -detect your network card, for example because of a missing driver: +Si vous ne voyez pas le message suivant, le noyau d’installation n’a pas +pu détecter votre carte réseau, par exemple en raison d’un pilote +manquant : ---- Starting dhcp for interface eth0 @@ -2764,18 +2775,19 @@ dhcp: PREINIT eth0 up dhcp: BOND setting eth ---- -Check the initrd in the nfsroot (`lsinird`) if the kernel driver of your network -card is included there and check if you like to add the package -'firmware-linux-nonfree' in +/etc/fai/NFSROOT+ and rebuild the initrd -by calling `fai-make-nfsroot -k`. -You may also add a driver to +/srv/fai/nfsroot/etc/dracut.conf+ in -the line +add_drivers+++=+. +Vérifiez le fichier initrd dans le nfsroot (`lsinird`) pour voir +si le pilote du noyau de +votre carte réseau est inclus et vérifiez si vous souhaitez ajouter le +paquet 'firmware-linux-nonfree' dans +/etc/fai/NFSROOT` puis +reconstruisez le fichier initrd en appelant `fai-make-nfsroot -k`. Vous pouvez +également ajouter un pilote à +/srv/fai/nfsroot/etc/dracut.conf+ dans +la ligne +add_drivers+++=+. -This is the error message you will see, when your network card is -working, but the install server does not export the nfsroot -directory to the install clients, This is often caused by missing -NFS permissions on the server side. +Voici le message d’erreur que vous verrez, lorsque votre carte réseau +fonctionne, mais le serveur d’installation n’exporte pas le répertoire +nfsroot vers les clients d’installation. Cela est souvent dû aux +permissions NFS manquantes du côté serveur. ---- Starting dhcp for interface eth0 @@ -2790,13 +2802,15 @@ Dropping to debug shell dracut:/# ---- -Now, you are inside the emergency shell of the initrd which was created -by 'dracut(8)'. You will get a shell prompt, and can look at the log files. -For more information about debugging the early boot process using -dracut see `dracut.cmdline(7)` +Maintenant, vous êtes à l’intérieur du shell d’urgence de l’initrd qui a +été créé par 'dracut(8)'. Vous obtiendrez une invite du shell et pourrez +consulter les fichiers journaux. Pour plus d’informations sur le +débogage du processus de démarrage précoce à l’aide de dracut, consultez +`dracut.cmdline(7)` -Use the following command on the install server to see which directories are exported -from the install server (named faiserver): +Utilisez la commande suivante sur le serveur d’installation pour voir +quels répertoires sont exportés à partir du serveur d’installation +(nommé faiserver) : ---- $ showmount -e faiserver diff --git a/doc/po/fai-guide.pot b/doc/po/fai-guide.pot index 376e61d76..26059caef 100644 --- a/doc/po/fai-guide.pot +++ b/doc/po/fai-guide.pot @@ -4,7 +4,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-10-23 16:13+0200\n" +"POT-Creation-Date: 2025-10-25 13:22+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -818,7 +818,7 @@ msgstr "" #: fai-guide.txt:525 msgctxt "fai-guide.txt:525" -msgid "or" +msgid "or " msgstr "" #: fai-guide.txt:529 @@ -3378,7 +3378,7 @@ msgstr "" #: fai-guide.txt:2154 msgctxt "fai-guide.txt:2154" -msgid "or" +msgid "or " msgstr "" #: fai-guide.txt:2158 diff --git a/doc/po/fr.po b/doc/po/fr.po index 3d7207a5f..d52798884 100644 --- a/doc/po/fr.po +++ b/doc/po/fr.po @@ -3,8 +3,8 @@ msgid "" msgstr "" "Project-Id-Version: FAI-GUIDE version 6.4\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-10-23 11:06+0200\n" -"PO-Revision-Date: 2025-10-24 15:50+0200\n" +"POT-Creation-Date: 2025-10-25 13:22+0200\n" +"PO-Revision-Date: 2025-10-25 13:23+0200\n" "Last-Translator: Georges Khaznadar \n" "MIME-Version: 1.0\n" @@ -80,8 +80,10 @@ msgstr "" "Résumé\n" "------\n" "FAI est un système non-interactif pour installer, configurer et gérer des\n" -"systèmes Linux et les configurations de logiciels sur des ordinateurs comme sur des machines\n" -"virtuelles et des environnements chroot, depuis des petits réseaux jusqu'à de\n" +"systèmes Linux et les configurations de logiciels sur des ordinateurs comme " +"sur des machines\n" +"virtuelles et des environnements chroot, depuis des petits réseaux jusqu'à " +"de\n" "grandes infrastructures et de grands clusters." #: fai-guide.txt:34 @@ -91,7 +93,8 @@ msgid "" "of the\n" "configuration and how to deal with errors." msgstr "" -"Ce manuel décrit le logiciel Fully Automatic Installation (installation entièrement automatique).\n" +"Ce manuel décrit le logiciel Fully Automatic Installation (installation " +"entièrement automatique).\n" "Cela inclut l’installation des paquets, la configuration du serveur, la\n" "création de la configuration et la gestion des erreurs." @@ -206,7 +209,8 @@ msgid "" "to the mailing list." msgstr "" "Retour d'information::\n" -"Envoyez vos réflexions et vos commentaires à mailto:fai@fai-project.org[] ou\n" +"Envoyez vos réflexions et vos commentaires à mailto:fai@fai-project.org[] " +"ou\n" "à la liste de diffusion." #: fai-guide.txt:88 @@ -215,7 +219,8 @@ msgid "" "Use the Debian bug tracking system (BTS) https://bugs.debian.org/src:fai" msgstr "" "Boguess::\n" -"Utiliser le système de suivi des bogues Debian (BTS) https://bugs.debian.org/src:fai" +"Utiliser le système de suivi des bogues Debian (BTS) https://bugs.debian.org/" +"src:fai" #: fai-guide.txt:91 msgid "" @@ -279,8 +284,10 @@ msgstr "" "Répéter la même tâche encore et encore est ennuyeux -- et conduira\n" "certainement à des erreurs. Aussi beaucoup de temps pourrait être sauvé\n" "si les installations étaient faites automatiquement. Un processus\n" -"d’installation avec interaction manuelle ne peut pas passer à l'échelle. Mais les\n" -"grappes (clusters) ont l’habitude de croître au fil des ans. Pensez à long terme\n" +"d’installation avec interaction manuelle ne peut pas passer à l'échelle. " +"Mais les\n" +"grappes (clusters) ont l’habitude de croître au fil des ans. Pensez à long " +"terme\n" "plutôt que de planifier seulement quelques mois dans l’avenir." #: fai-guide.txt:142 @@ -317,7 +324,8 @@ msgstr "" "sur le matériel de SUN SPARC, l’idée de construire une installation\n" "automatique pour Debian est née. Solaris dispose d’une fonctionnalité\n" "d’installation automatique appelée JumpStart\n" -"footnote:[Solaris 8 Advanced Installation Guide at \"https://docs.oracle.com/cd/E19455-01/806-0957/806-0957.pdf].\n" +"footnote:[Solaris 8 Advanced Installation Guide at \"https://docs.oracle.com/" +"cd/E19455-01/806-0957/806-0957.pdf].\n" "En conjonction avec les scripts d’auto-installation de Casper Dik\n" "footnote:[http://www.science.uva.nl/pub/solaris/auto-install],\n" "Je pouvais épargner beaucoup de temps non seulement pour chaque nouvel\n" @@ -326,7 +334,8 @@ msgstr "" "avec quatre stations de travail SUN pour une conférence, qui a duré\n" "seulement quelques jours. J’ai retiré ces postes de travail de notre\n" "réseau de recherche habituel et mis en place une nouvelle installation\n" -"pour la conférence. Quand elle a été terminée, j’ai simplement réintégré les\n" +"pour la conférence. Quand elle a été terminée, j’ai simplement réintégré " +"les\n" "postes de travail dans le réseau de recherche, redémarré une seule fois,\n" "et après une demi-heure, tout était opérationnel comme avant. La\n" "configuration de tous les postes de travail était exactement la même\n" @@ -439,22 +448,30 @@ msgstr "" "* Système flexible grâce à un concept de classe simple.\n" "* Mise à jour des systèmes en cours d’exécution sans réinstallation.\n" "* Images « Cloud » pour un environnement de virtualisation.\n" -"* Les hôtes peuvent démarrer à partir d’une carte réseau, d’un CD, d’une clé USB.\n" +"* Les hôtes peuvent démarrer à partir d’une carte réseau, d’un CD, d’une clé " +"USB.\n" "* Création simple d’une image ISO vive ou pour l'installation.\n" "* Prise en charge de PXE avec la méthode de démarrage DHCP.\n" "* Support des systèmes de fichiers ReiserFS, ext3/ext4, btrfs et XFS.\n" "* Support logiciel RAID et LVM. Support LUKS.\n" "* Détection automatique du matériel.\n" "* On peut déployer Debian, Ubuntu, Rocky Linux, CentOS, AlmaLinux, SuSE\n" -"* Possibilité de connexion à distance via ssh lors du processus d’installation.\n" -"* Toutes les configurations similaires sont partagées entre tous les les clients d’installation.\n" -"* Les fichiers journaux de toutes les installations sont enregistrés sur le serveur d’installation.\n" -"* Prise en charge des scripts Shell, Perl, Python, Ruby, expect et CFEngine lors de l'étape de personnalisation.\n" +"* Possibilité de connexion à distance via ssh lors du processus " +"d’installation.\n" +"* Toutes les configurations similaires sont partagées entre tous les les " +"clients d’installation.\n" +"* Les fichiers journaux de toutes les installations sont enregistrés sur le " +"serveur d’installation.\n" +"* Prise en charge des scripts Shell, Perl, Python, Ruby, expect et CFEngine " +"lors de l'étape de personnalisation.\n" "* Prise en charge de nombreux protocoles comme NFS, FTP, HTTP, git.\n" -"* Peut être utilisé comme un système de sauvetage et pour l’inventaire matériel.\n" +"* Peut être utilisé comme un système de sauvetage et pour l’inventaire " +"matériel.\n" "* Prise en charge de clients sans disque.\n" -"* Prise en charge trans-architecture, par exemple pour des appareils embarqués (embedded devices).\n" -"* Ajoutez facilement vos propres fonctions via des hooks ou modifiez le comportement par défaut.\n" +"* Prise en charge trans-architecture, par exemple pour des appareils " +"embarqués (embedded devices).\n" +"* Ajoutez facilement vos propres fonctions via des hooks ou modifiez le " +"comportement par défaut.\n" "* Prise en charge du clonage de machines utilisant des images de disque." #: fai-guide.txt:202 @@ -529,7 +546,8 @@ msgid "" msgstr "" "Cette installation s’exécutera sans serveur d’installation.\n" "L’installation à partir du CD est identique à celle exécutée dans un\n" -"environnement réseau à l’aide du serveur d’installation FAI, et peut être aussi\n" +"environnement réseau à l’aide du serveur d’installation FAI, et peut être " +"aussi\n" "effectuée à l'aide d'une clé USB sur un ordinateur physique." #: fai-guide.txt:237 @@ -538,7 +556,8 @@ msgid "" "image on the webpage https://fai-project.org/FAIme without the need of\n" "installing FAI on your computer." msgstr "" -"On peut aussi créer soi-même une image FAI (installation entièrement automatique)\n" +"On peut aussi créer soi-même une image FAI (installation entièrement " +"automatique)\n" "à la page web https://fai-project.org/FAIme sans avoir besoin d'installer\n" "FAI sur son ordinateur." @@ -568,7 +587,8 @@ msgstr "" "Si vous avez l’intention d’utiliser VMware ou VirtualBox, assurez-vous\n" "que votre client utilise une connexion réseau pontée (bridged network).\n" "On trouve une description détaillée dans le wiki FAI\n" -"footnote:[https://wiki.fai-project.org/index.php/VirtualBox_for_your_first_FAI_installation].\n" +"footnote:[https://wiki.fai-project.org/index.php/" +"VirtualBox_for_your_first_FAI_installation].\n" "on ne peut pas utiliser des interfaces réseau pontées via le réseau sans\n" "fil, car la plupart des cartes réseau WiFi ne prennent pas en charge\n" "cette fonctionnalité." @@ -578,8 +598,10 @@ msgid "" "When using Qemu/KVM and the `fai-kvm` wrapper you can create the\n" "network using the command `fai-mk-network`. First install some packages" msgstr "" -"Quand on utilise Qemu/KVM et le script `fai-kvm` on peut créer le réseau à l'aide de\n" -"la commande `fai-mk-network`. Il faut commencer par installer quelques paquets logiciels" +"Quand on utilise Qemu/KVM et le script `fai-kvm` on peut créer le réseau à " +"l'aide de\n" +"la commande `fai-mk-network`. Il faut commencer par installer quelques " +"paquets logiciels" #: fai-guide.txt:258 msgid "" @@ -600,7 +622,8 @@ msgid "" "fai-mk-network \n" "----" msgstr "" -"La commande ci-dessous met en place un réseau privé avec un pont logiciel et plusieurs\n" +"La commande ci-dessous met en place un réseau privé avec un pont logiciel et " +"plusieurs\n" "TAPs réseau\n" "footnote:[https://fr.wikipedia.org/wiki/TAP_r%C3%A9seau]\n" "appartenant à l'utilisateur ++.\n" @@ -621,7 +644,8 @@ msgstr "" "Après cela, vous pouvez utiliser fai-kvm (-h vous aidera) pour démarrer\n" "des machines virtuelles en utilisant KVM qui sont connectés à ce réseau\n" "privé. Faites attention. Par défaut, fai-kvm créera les images de disque\n" -"pour les machines virtuelles dans `+/tmp+`, qui est un disque RAM sur la plupart des\n" +"pour les machines virtuelles dans `+/tmp+`, qui est un disque RAM sur la " +"plupart des\n" "systèmes. Il n’y a aucun problème à créer une image de disque vide de\n" "20G dans /tmp (même si cette partition est de 4 Go de taille), mais\n" "alors que la VM écrit des données sur son disque, cela commencera à\n" @@ -652,7 +676,8 @@ msgid "" "machine. During the first boot of the new system, it will\n" "automatically set up the nfsroot. This may take some minutes." msgstr "" -"Dans le menu grub; sélectionnez +faiserver, using internal DHCP and a fixed IP+.\n" +"Dans le menu grub; sélectionnez +faiserver, using internal DHCP and a fixed " +"IP+.\n" "Cela va installer\n" "un hôte appelé faiserver avec IP 192.168.33.250 qui contient tous les\n" "logiciels nécessaires pour un serveur FAI. Il configurera également un\n" @@ -756,7 +781,8 @@ msgstr "" "le système d’exploitation Linux et une collection de scripts shell et\n" "Perl pour le processus d’installation. Les modifications apportées aux\n" "fichiers de configuration du système d’exploitation peuvent être\n" -"effectuées par des scripts CFEngine, shell (bash et zsh), Perl, Python, Ruby et\n" +"effectuées par des scripts CFEngine, shell (bash et zsh), Perl, Python, Ruby " +"et\n" "expect." #: fai-guide.txt:335 @@ -770,7 +796,8 @@ msgid "" "your installation. Chapter <> has some useful hints for this\n" "topic." msgstr "" -"Les personnes intéressées par FAI sont des administrateurs système qui doivent\n" +"Les personnes intéressées par FAI sont des administrateurs système qui " +"doivent\n" "installer Linux sur une ou même des centaines d’ordinateurs. Parce qu’il\n" "s’agit d’un outil d’installation à usage général, il peut être utilisé\n" "pour l’installation d’un cluster Beowulf, d’une ferme de rendu ou\n" @@ -840,9 +867,11 @@ msgid "" " systems, user accounts, printers ..." msgstr "" "* Organisation du disque dur dans un format similaire à fstab\n" -"* Systèmes de fichiers locaux, leurs types, points de montage et options de montage\n" +"* Systèmes de fichiers locaux, leurs types, points de montage et options de " +"montage\n" "* Paquets logiciels\n" -"* Disposition du clavier, fuseau horaire, configuration Xorg, systèmes de fichiers distants, comptes utilisateurs, imprimantes …" +"* Disposition du clavier, fuseau horaire, configuration Xorg, systèmes de " +"fichiers distants, comptes utilisateurs, imprimantes …" #: fai-guide.txt:369 msgid "" @@ -856,8 +885,10 @@ msgstr "" "+\n" "Le package _fai-doc_ inclut un exemple d’espace de configuration\n" "incluant des exemples pour les hôtes utilisant l’environnement XFCE et\n" -"GNOME entre autres. En invoquant `fai-mk-configspace` on copie ces exemples vers\n" -"'/srv/fai/config'. Il est recommandé d'étudier ces fichiers de configuration et\n" +"GNOME entre autres. En invoquant `fai-mk-configspace` on copie ces exemples " +"vers\n" +"'/srv/fai/config'. Il est recommandé d'étudier ces fichiers de configuration " +"et\n" "ces scripts pour mieux comprendre comment FAI fonctionne." #: fai-guide.txt:376 @@ -886,7 +917,8 @@ msgstr "" "TFTP ::\n" "Sert aux clients le fichier initrd et le noyau utilisés pour le processus\n" "d’installation. Avec le système de fichiers servi par NFS, ces deux\n" -"composent un système d'exploitation temporaire dans lequel les installations sont\n" +"composent un système d'exploitation temporaire dans lequel les installations " +"sont\n" "réalisées." #: fai-guide.txt:387 @@ -917,7 +949,8 @@ msgstr "" "Un profil FAI est juste une liste de classes FAI assignées à un nom de\n" "profil, qui est étendu par une description de ce profil. C’est-à-dire\n" "que l’on peut avoir deux profils \"Webserver\", l’un incluant la classe\n" -"APACHE, et un autre incluant la classe NGINX, pour ensuite installer la solution\n" +"APACHE, et un autre incluant la classe NGINX, pour ensuite installer la " +"solution\n" "de serveur web correspondante." #: fai-guide.txt:399 @@ -967,18 +1000,22 @@ msgstr "" " defvar\t\t# définition de variables\n" " action\t\t# évaluer FAI_ACTION\n" " install\t\t# Démarrer l'installation\n" -" partition\t\t# partitionner les disques durs, créer les systèmes de fichiers\n" +" partition\t\t# partitionner les disques durs, créer les systèmes de " +"fichiers\n" " mountdisks\t\t# monter les systèmes de fichiers\n" " extrbase\t\t# extraire le fichier base.tar.xz\n" " debconf\t\t# pré-ensemencer le deconf de Debian\n" " repository\t\t# préparer l'accès aux dépôts de paquets\n" -" updatebase\t\t# mettre en place les outils de gestion de paquets et mettre les paquets à jour\n" +" updatebase\t\t# mettre en place les outils de gestion de paquets et mettre " +"les paquets à jour\n" " instsoft\t\t# installer les paquets logiciels\n" " configure\t\t# lancer les scripts de personnalisation\n" -" finish\t\t# faire un peu de ménage, afficher les statistiques d'installation\n" +" finish\t\t# faire un peu de ménage, afficher les statistiques d'" +"installation\n" " tests\t\t\t# appeler des tests s'il y en a\n" " chboot\t\t# lancer fai-chboot sur le serveur d'installation\n" -" savelog\t\t# enregistrer les fichiers de journalisation localement et à distance\n" +" savelog\t\t# enregistrer les fichiers de journalisation localement et à " +"distance\n" " faiend\t\t# redémarrage de l'hôte, éjection du CD si nécessaire\n" "____\n" "____" @@ -986,7 +1023,9 @@ msgstr "" #: fai-guide.txt:424 msgid "" "These are tasks, which are only executed when a different action is performed" -msgstr "Voilà des tâches qui sont exécutées seulement lorsqu’on fait une action différente" +msgstr "" +"Voilà des tâches qui sont exécutées seulement lorsqu’on fait une action " +"différente" #: fai-guide.txt:430 msgid "" @@ -1049,11 +1088,14 @@ msgstr "" "Les classes sont utilisées dans presque toutes les tâches de\n" "l’installation. Les classes déterminent quels fichiers de configuration\n" "choisir parmi une liste d’alternatives disponibles. Pour déterminer les\n" -"fichiers de configuration à utiliser, FAI recherche dans la liste des classes\n" +"fichiers de configuration à utiliser, FAI recherche dans la liste des " +"classes\n" "définies et utilise tous les fichiers de configuration correspondant à\n" -"un nom de classe footnote:[on peut aussi seulement utiliser le fichier de configuration\n" +"un nom de classe footnote:[on peut aussi seulement utiliser le fichier de " +"configuration\n" "qui a la priorité la plus élevée, comme l'ordre des classes définit une\n" -"priorité de la plus basse à la plus élevée dans la liste des classes. ]. La boucle suivante\n" +"priorité de la plus basse à la plus élevée dans la liste des classes. ]. La " +"boucle suivante\n" "implémente cette fonction en pseudo-code shell :" #: fai-guide.txt:460 @@ -1071,8 +1113,10 @@ msgid "" msgstr "" "----\n" "for class in $all_classes; do\n" -" if [ -r $config_dir/$class ]; then # s'il exite un fichier nommé $class\n" -" your_command $config_dir/$class # invoquer une commande avec ce nom de fichier\n" +" if [ -r $config_dir/$class ]; then # s'il exite un fichier nommé $" +"class\n" +" your_command $config_dir/$class # invoquer une commande avec ce " +"nom de fichier\n" " # sortir si on n'a besoin que du premier fichier qui convient\n" " fi\n" "done\n" @@ -1157,7 +1201,8 @@ msgid "" "the configuration space if the existing classes suffice for your\n" "needs." msgstr "" -"Souvent, une configuration client est juste créée en modifiant ou en ajoutant\n" +"Souvent, une configuration client est juste créée en modifiant ou en " +"ajoutant\n" "les classes auxquelles ce client appartient, ce qui rend\n" "l’installation d’un nouveau client très facile. Ainsi, aucune\n" "information supplémentaire ne doit être ajoutée à l’espace de\n" @@ -1171,7 +1216,8 @@ msgid "" msgstr "" "Comme vous pouvez le voir, les classes sont un pilier central de la\n" "personnalisation de votre espace de configuration et de celui de\n" -"de votre client d'installation. Pour définir vos propres classes, reportez-vous à\n" +"de votre client d'installation. Pour définir vos propres classes, reportez-" +"vous à\n" "<>." #: fai-guide.txt:498 @@ -1232,14 +1278,16 @@ msgid "" "----" msgstr "" "----\n" -"# wget -O /etc/apt/trusted.gpg.d/fai-project.gpg https://fai-project.org/download/2BF8D9FE074BCDE4.gpg\n" -"# echo \"deb http://fai-project.org/download bookworm koeln\" > /etc/apt/sources.list.d/fai.list\n" +"# wget -O /etc/apt/trusted.gpg.d/fai-project.gpg https://fai-project.org/" +"download/2BF8D9FE074BCDE4.gpg\n" +"# echo \"deb http://fai-project.org/download bookworm koeln\" > /etc/apt/" +"sources.list.d/fai.list\n" "----" #: fai-guide.txt:525 msgctxt "fai-guide.txt:525" -msgid "or" -msgstr "or" +msgid "or " +msgstr "ou " #: fai-guide.txt:529 msgid "" @@ -1371,9 +1419,12 @@ msgstr "" "Waiting for background jobs to finish\n" "fai-make-nfsroot finished properly.\n" "Log file written to /var/log/fai/fai-make-nfsroot.log\n" -"Adding line to /etc/exports: /srv/fai/config 192.168.33.250/24(async,ro,no_subtree_check)\n" -"Adding line to /etc/exports: /srv/fai/nfsroot 192.168.33.250/24(async,ro,no_subtree_check,no_root_squash)\n" -"Reloading nfs-kernel-server configuration (via systemctl): nfs-kernel-server.service." +"Adding line to /etc/exports: /srv/fai/config 192.168.33.250/" +"24(async,ro,no_subtree_check)\n" +"Adding line to /etc/exports: /srv/fai/nfsroot 192.168.33.250/" +"24(async,ro,no_subtree_check,no_root_squash)\n" +"Reloading nfs-kernel-server configuration (via systemctl): nfs-kernel-" +"server.service." #: fai-guide.txt:582 msgid "" @@ -1382,7 +1433,8 @@ msgid "" "your project with FAI." msgstr "" "Your initial config space is now located in /srv/fai/config\n" -"Please don't forget to fill out the FAI questionnaire after you've finished your project with FAI." +"Please don't forget to fill out the FAI questionnaire after you've finished " +"your project with FAI." #: fai-guide.txt:586 msgid "" @@ -1416,7 +1468,8 @@ msgid "" "footnote:[These files need not belong to the root account.]." msgstr "" "Installez les exemples simples dans l’espace de configuration\n" -"footnote:[Il n'est pas nécessaires que ces fichiers appartiennent au compte root.]." +"footnote:" +"[Il n'est pas nécessaires que ces fichiers appartiennent au compte root.]." #: fai-guide.txt:601 msgid "" @@ -1471,7 +1524,8 @@ msgid "" "ubuntuhost::\n" "A Ubuntu desktop will be installed, and the account demo is created." msgstr "" -"ubuntuhost::\\n\"\n" +"ubuntuhost::\\n" +"\"\n" "Un bureau Ubuntu sera installé et la démo du compte est créée." #: fai-guide.txt:623 @@ -1567,9 +1621,12 @@ msgid "" "needs." msgstr "" "Les seules informations spécifiques FAI contenues dans ce fichier de\n" -"configuration sont d'assigner +filename+ (DHCP option 67) à la valeur +fai/pxelinux.0+ et\n" -"d'assigner +next-server+ (DHCP option 66, also aussi nommée TFTP server name) et +server-name+\n" -"à la valeur du nom de votre serveur d’install . Toutes les autres informations sont uniquement des\n" +"configuration sont d'assigner +filename+ (DHCP option 67) à la valeur +fai/" +"pxelinux.0+ et\n" +"d'assigner +next-server+ (DHCP option 66, also aussi nommée TFTP server name)" +" et +server-name+\n" +"à la valeur du nom de votre serveur d’install . Toutes les autres " +"informations sont uniquement des\n" "données liées au réseau, qui sont utilisées dans presque toutes les\n" "configurations DHCP. Ajustez ces paramètres de réseau à vos besoins locaux." @@ -1659,7 +1716,8 @@ msgstr "" "L’adresse MAC est donnée par le matériel de la carte réseau. Pour chaque\n" "client d’installation, vous collectez son adresse MAC et l'associez à une\n" "adresse IP et à un nom d’hôte. Tout d’abord, nous ajoutons l’adresse IP\n" -"et le nom d’hôte à _/etc/hosts_ footnote:[On peut aussi ajouter cela dans son serveur de noms de domaine (DNS)].\n" +"et le nom d’hôte à _/etc/hosts_ footnote:" +"[On peut aussi ajouter cela dans son serveur de noms de domaine (DNS)].\n" "----\n" "192.168.33.100 demohost\n" "----" @@ -1764,7 +1822,8 @@ msgid "" msgstr "" "Booting kernel vmlinuz-4.19.0-5-amd64\n" " append initrd=initrd.img-4.19.0-5-amd64 ip=dhcp\n" -" FAI_FLAGS=verbose,sshd,createvt FAI_CONFIG_SRC=nfs://faiserver/srv/fai/config" +" FAI_FLAGS=verbose,sshd,createvt FAI_CONFIG_SRC=nfs://faiserver/srv/fai/" +"config" #: fai-guide.txt:749 msgid "" @@ -1848,7 +1907,8 @@ msgid "" "* Which remote file systems should be mounted?\n" "* How should backups be performed?" msgstr "" -"* Est-ce que je vais créer un cluster Beowulf ou dois-je installer des machines de bureau ?\n" +"* Est-ce que je vais créer un cluster Beowulf ou dois-je installer des " +"machines de bureau ?\n" "* À quoi ressemble ma topologie LAN ?\n" "* Ai-je un matériel uniforme ? Le matériel sera-t-il uniforme à l’avenir ?\n" "* Le matériel a-t-il besoin d’un noyau spécial ?\n" @@ -1857,7 +1917,8 @@ msgstr "" "* Quelles applications seront lancées par les utilisateurs ?\n" "* Les utilisateurs ont-ils besoin d’un système de mise en file d’attente ?\n" "* Quels logiciels faut-il installer ?\n" -"* Quels démons devraient être lancés, et à quoi devrait ressembler leur configuration ?\n" +"* Quels démons devraient être lancés, et à quoi devrait ressembler leur " +"configuration ?\n" "* Quels systèmes de fichiers distants doivent être montés ?\n" "* Comment effectuer les sauvegardes ?" @@ -1874,7 +1935,8 @@ msgstr "" "Vous devez également penser à des comptes d’utilisateur, des\n" "imprimantes, un système de courrier, des travaux de cron, des cartes\n" "graphiques, au double amorçage, au NIS, au NTP, au fuseau horaire,\n" -"à la disposition de clavier, à l’exportation et au montage des annuaires via\n" +"à la disposition de clavier, à l’exportation et au montage des annuaires " +"via\n" "NFS et à beaucoup d’autres choses. Donc, il ya beaucoup à faire avant de\n" "commencer une installation. Et rappelez-vous que la connaissance est le\n" "pouvoir, et c’est à vous de l’utiliser. L’installation et\n" @@ -1909,11 +1971,15 @@ msgid "" "'/var/lib/fai/config'. The main installation command `fai(8)` uses all\n" "these subdirectories in the order listed except for hooks." msgstr "" -"L'espace de configuration est la collection des informations qui disent comment exactement\n" -"configurer un client. L'espace central de configuration pour tous les clients\n" -"d'installation est situé sur le serveur d'installation dans '/srv/fai/config' et ses\n" +"L'espace de configuration est la collection des informations qui disent " +"comment exactement\n" +"configurer un client. L'espace central de configuration pour tous les " +"clients\n" +"d'installation est situé sur le serveur d'installation dans '/srv/fai/" +"config' et ses\n" "sous-répertoires. Il sera monté par les clients sous\n" -"'/var/lib/fai/config'. La commande princpale d'installation `fai(8)` utilise tous\n" +"'/var/lib/fai/config'. La commande princpale d'installation `fai(8)` utilise " +"tous\n" "ces sous-répertoires dans l'ordre listé sauf pour les hooks." #: fai-guide.txt:807 @@ -2019,7 +2085,8 @@ msgstr "" "_package_config/_::\n" "Les fichiers avec des noms de classe contiennent des listes de\n" "paquets à installer ou à désinstaller par\n" -"`install_packages(8)`. Les fichiers nommés '.gpg' sont ajoutés à la liste des clés utilisées par apt\n" +"`install_packages(8)`. Les fichiers nommés '.gpg' sont ajoutés à la " +"liste des clés utilisées par apt\n" "pour les dépôts de paquets approuvés." #: fai-guide.txt:851 @@ -2031,9 +2098,12 @@ msgid "" "package repository." msgstr "" "_pkgs/_::\n" -"Ce répertoire peut avoir des sous-répertoires nommés selon des classes. Vous pouvez\n" -"mettre des fichiers '.deb' ou '.rpm' dans ces sous-répertoires. FAI installera\n" -"ces paquets sans qu'il soit besoin de créer les métadonnées d'un dépôt de paquets." +"Ce répertoire peut avoir des sous-répertoires nommés selon des classes. Vous " +"pouvez\n" +"mettre des fichiers '.deb' ou '.rpm' dans ces sous-répertoires. FAI " +"installera\n" +"ces paquets sans qu'il soit besoin de créer les métadonnées d'un dépôt de " +"paquets." #: fai-guide.txt:854 msgid "" @@ -2104,8 +2174,10 @@ msgid "" ". Classes may be listed within a file (by default in 'class/')\n" ". Classes may be dynamically defined by scripts." msgstr "" -". Certaines classes par défaut sont définies pour chaque hôte : DEFAULT, LAST et son nom d’hôte.\n" -". Les classes peuvent être répertoriées dans un fichier (par défaut dans 'class/').\n" +". Certaines classes par défaut sont définies pour chaque hôte : DEFAULT, " +"LAST et son nom d’hôte.\n" +". Les classes peuvent être répertoriées dans un fichier (par défaut dans '" +"class/').\n" ". Les classes peuvent être dynamiquement définies par des scripts." #: fai-guide.txt:886 @@ -2144,7 +2216,8 @@ msgid "" "version) is used to define classes depending on the host name." msgstr "" "La tâche _defclass_ appelle la commande `fai-class(1)` pour définir\n" -"les classes. Tous les scripts correspondant à l'expression _^[0-9][0-9]*_ (qui\n" +"les classes. Tous les scripts correspondant à l'expression _^[0-9][0-9]*_ (" +"qui\n" "commencent avec deux chiffres) Dans le sous-repertoire _$FAI/class_ sont\n" "exécutés afin de définir les classes. Tout ce qui is affiché sur STDOUT\n" "est automatiquement defini comme une classe. Pour plus d’informations\n" @@ -2196,7 +2269,8 @@ msgid "" "hosts." msgstr "" "Les noms d’hôtes doivent rarement être utilisé pour les fichiers de\n" -"configuration dans l’espace de configuration. Au lieu de ça, une classe doit\n" +"configuration dans l’espace de configuration. Au lieu de ça, une classe " +"doit\n" "être définie et ensuite ajoutée pour un hôte donné. En effet, la plupart\n" "du temps les données de configuration ne sont pas spécifiques à un nom\n" "d'hôte, mais peuvent être partagées entre différents hôtes." @@ -2233,11 +2307,11 @@ msgid "" "The following variables are used in the examples and may also be\n" "useful for your installation:" msgstr "" -"Les variables suivantes sont utilisées dans les exemples et peuvent aussi être\n" +"Les variables suivantes sont utilisées dans les exemples et peuvent aussi " +"être\n" "utiles pour votre installation :" #: fai-guide.txt:940 -#, fuzzy msgid "" "FAI_ACTION::\n" "Set the action FAI should perform. Normally this is done by\n" @@ -2294,7 +2368,8 @@ msgstr "" "ROOTPW::\n" "Le mot de passe root chiffré pour le nouveau système. Vous pouvez\n" "utiliser\n" -"`crypt(3)`, md5 et d’autres types de hachage pour le mot de passe. Utilisez 'mkpasswd(1)+`\n" +"`crypt(3)`, md5 et d’autres types de hachage pour le mot de passe. Utilisez " +"'mkpasswd(1)+`\n" "pour créer le hachage d’un mot de passe donné. Par exemple, pour\n" "générer le hachage MD5 un mot de passe, utilisez :\n" "....\n" @@ -2379,7 +2454,8 @@ msgid "" "A base file is only needed when installing a distribution which is\n" "different from the one in the nfsroot." msgstr "" -"Un fichier de base n'est nécessaire que si on installe une distribution qui est\n" +"Un fichier de base n'est nécessaire que si on installe une distribution qui " +"est\n" "défférente de celle dans le nfsroot." #: fai-guide.txt:999 @@ -2429,7 +2505,8 @@ msgid "" "----" msgstr "" "----\n" -"faiserver$ gpg --export AB12CD34 > /srv/fai/config/package_config/MYCLASS.gpg\n" +"faiserver$ gpg --export AB12CD34 > /srv/fai/config/package_config/MYCLASS." +"gpg\n" "----" #: fai-guide.txt:1024 @@ -2497,13 +2574,16 @@ msgid "" "Supported package tools are: _apt, apt-get, aptitude, smart, yast,\n" "dnf, rpm, zypper_" msgstr "" -"Les commentaires commencent par une dièse (#) et se terminent à la fin de la\n" +"Les commentaires commencent par une dièse (#) et se terminent à la fin de " +"la\n" "ligne. Chaque commande de paquet commence par le mot _PACKAGES_ suivi\n" "par un nom de commande, qui correspond à gestionnaire de paquets\n" -"distinct comme apt-get, aptitude ou dnf par exemple. la commande définit quelle\n" +"distinct comme apt-get, aptitude ou dnf par exemple. la commande définit " +"quelle\n" "commande sera utilisé pour installer les paquets nommés après\n" "cette commande. La liste de toutes les commandes disponibles peut\n" -"être listée en utilisant _install_packages -H_. Les gestionnaires de paquets pris\n" +"être listée en utilisant _install_packages -H_. Les gestionnaires de paquets " +"pris\n" "en charges sont _aptitude, apt-get, smart, yast, dnf, rpm, zypper_" #: fai-guide.txt:1054 @@ -2592,7 +2672,8 @@ msgid "" "Download package and unpack only. Do not configure the package." msgstr "" "unpack::\n" -"Télécharger les paquets et les décompresser seulement. Ne pas configurer les\n" +"Télécharger les paquets et les décompresser seulement. Ne pas configurer " +"les\n" "paquets." #: fai-guide.txt:1094 @@ -2644,8 +2725,10 @@ msgid "" "_key=value_ after _PACKAGES _. Currently we support\n" "_release=_ which will add _-t _ when installing packages." msgstr "" -"On peut spécifier des paramètres supplémentaires pour le gestionnaire de paquets\n" -"en ajoutant des paires _cle=valeur_ après _PACKAGES _. les paires clé, valeur\n" +"On peut spécifier des paramètres supplémentaires pour le gestionnaire de " +"paquets\n" +"en ajoutant des paires _cle=valeur_ après _PACKAGES _. les paires " +"clé, valeur\n" "actuellement supportées sont _release=_ qui ajoute _-t _ durant\n" "l'installation des paquets." @@ -2672,7 +2755,8 @@ msgid "" msgstr "" "Cela installerait le paquet nvidia-smi de la distribution testing,\n" "en incluant les dépendances. N'oubliez pas d'ajouter une entrée dans\n" -"'sources.list'. Vous pouvez aussi vouloir ajuste l'épinglage apt (apt pinning)\n" +"'sources.list'. Vous pouvez aussi vouloir ajuste l'épinglage apt (apt " +"pinning)\n" "(voir 'apt_references(5)')" #: fai-guide.txt:1129 @@ -2687,7 +2771,8 @@ msgid "" msgstr "" "Une ligne qui contient la commande _PRELOADRM_, télécharge un fichier à\n" "l’aide de `wget(1)` dans un répertoire avant d’installer les paquets.\n" -"À l’aide d'une URL de type _file:_, ce fichier est copié de +$FAI_ROOT+ vers le\n" +"À l’aide d'une URL de type _file:_, ce fichier est copié de +$FAI_ROOT+ vers " +"le\n" "répertoire de téléchargement. Par exemple, le paquet `realplayer` a\n" "besoin d’une archive pour installer le logiciel, donc cette archive est\n" "téléchargée dans le répertoire '/root'. Après l’installation des\n" @@ -2701,9 +2786,11 @@ msgid "" "packages are only installed if the class XORG is defined but the class\n" "MINT is not defined." msgstr "" -"On peut ajouter une expression booléenne arbitraire qui utilise des classes FAI pour\n" +"On peut ajouter une expression booléenne arbitraire qui utilise des classes " +"FAI pour\n" "définir quand la liste des paquets devrait être installée. Ici, les\n" -"paquets seront installés seulement si la classe XORG est définie mais la classe\n" +"paquets seront installés seulement si la classe XORG est définie mais la " +"classe\n" "MINT n'est pas définie." #: fai-guide.txt:1142 @@ -2730,10 +2817,14 @@ msgid "" "one of the corresponding classes is defined (logical OR). So you can\n" "combine many small files into the file DEFAULT." msgstr "" -"L'ancienne façon d'ajouter des expressions logiques dans les lignes PACKAGES est encore valable :\n" -"Il est possible d'ajouter une liste de noms de classes après la commande pour\n" -"apt-get. Ainsi une telle commande _PACKAGES_ sera exécutée seulement au moins\n" -"une des classes correspondantes est définie (OU logique). On peut donc combiner\n" +"L'ancienne façon d'ajouter des expressions logiques dans les lignes PACKAGES " +"est encore valable :\n" +"Il est possible d'ajouter une liste de noms de classes après la commande " +"pour\n" +"apt-get. Ainsi une telle commande _PACKAGES_ sera exécutée seulement au " +"moins\n" +"une des classes correspondantes est définie (OU logique). On peut donc " +"combiner\n" "plusieurs petits fichiers dans le fichier DEFAULT." #: fai-guide.txt:1157 @@ -2773,11 +2864,14 @@ msgid "" "installation of a package, for example, to avoid installing the 'linuxlogo'\n" "package installed by class FAIBASE:" msgstr "" -"Le concept de priorité des classes permet à une classe de priorité plus élevée (qui\n" +"Le concept de priorité des classes permet à une classe de priorité plus " +"élevée (qui\n" "arrive plus tard dans la séquence des classes) d'écraser les sélections des\n" "paquets de priorité plus basse. Pour que cela fonctionne correctement,\n" -"les classes de priorité plus élevée doivent utiliser les mêmes commandes _PACKAGES_ (par exemple\n" -"_PACKAGES install-norec_ au lieu de seulement _PACKAGES install_) que celles qu'utilisent\n" +"les classes de priorité plus élevée doivent utiliser les mêmes commandes " +"_PACKAGES_ (par exemple\n" +"_PACKAGES install-norec_ au lieu de seulement _PACKAGES install_) que celles " +"qu'utilisent\n" "la classe qu'on essaie d'écraser. Cela est utile pour supprimer\n" "l'installation d'un paquet, par exemple, pour éviter d'installer le paquet\n" "'linuxlogo' installé par la classe FAIBASE :" @@ -2828,7 +2922,8 @@ msgid "" msgstr "" "La commande `fai-do-scripts(1)` est lancée pour exécuter tous les\n" "scripts dans ce répertoire. Si un répertoire avec un nom de classe\n" -"existe, tous les scripts correspondant à l'expression _^[0-9][0-9]*_ sont exécutés\n" +"existe, tous les scripts correspondant à l'expression _^[0-9][0-9]*_ sont " +"exécutés\n" "par ordre alphabétique. Il est donc possible d’utiliser des scripts de\n" "différentes langages (shell, cfengine, Perl, Python, Ruby, expect,..)\n" "pour une classe." @@ -2838,7 +2933,8 @@ msgid "" "Thoses scripts write their output to sripts.log. The file status.log\n" "contains the names of all scripts executed and their exit status." msgstr "" -"Ces scripts écrivent leur sortie standard dans scripts.log. Le fichier status.log\n" +"Ces scripts écrivent leur sortie standard dans scripts.log. Le fichier " +"status.log\n" "contient les noms de tous les scripts exécutés et leur statut de terminaison." #: fai-guide.txt:1196 @@ -2855,7 +2951,8 @@ msgid "" msgstr "" "La plupart des scripts sont des scripts Bourne shell. Les scripts shell\n" "sont utiles si la tâche de configuration n'a besoin d'appeler que\n" -"quelques commandes shell ou créer un fichier à partir de zéro. Afin d'éviter\n" +"quelques commandes shell ou créer un fichier à partir de zéro. Afin d'" +"éviter\n" "d'écrire beaucoup de scripts courts, il est possible d’utiliser la\n" "commande `ifclass` pour tester si certaines classes sont définies." @@ -2949,7 +3046,8 @@ msgid "" "default tasks as parameters. In the examples provided, the hooks of\n" "the class CENTOS skips some Debian specific tasks." msgstr "" -"Les crochets (hooks) vous permettent de spécifier des fonctions ou des programmes\n" +"Les crochets (hooks) vous permettent de spécifier des fonctions ou des " +"programmes\n" "qui sont exécutés à certaines étapes du processus d’installation. Avant\n" "qu’une tâche soit appelée, FAI recherche les crochets existants pour cette\n" "tâche et les exécute. Comme on peut s’y attendre, les classes sont\n" @@ -3021,8 +3119,10 @@ msgid "" "available, insert these lines to the default hook:" msgstr "" "Tous les hooks appelés avant la définition des classes peuvent\n" -"utiliser uniquement les classes suivantes: _DEFAULT $HOSTNAME LAST_. Si un hook\n" -"pour la classe _DEFAULT_ doit être appelé uniquement dans le cas où aucun hook pour\n" +"utiliser uniquement les classes suivantes: _DEFAULT $HOSTNAME LAST_. Si un " +"hook\n" +"pour la classe _DEFAULT_ doit être appelé uniquement dans le cas où aucun " +"hook pour\n" "la classe +$HOSTNAME+ n’est disponible, insérez ces lignes dans le hook\n" "par défaut :" @@ -3062,21 +3162,28 @@ msgstr "Quelques exemples de ce à quoi les hooks pourraient être utiles :" #: fai-guide.txt:1290 msgid "- Load kernel modules before classes are defined in '$FAI/class'." -msgstr "- Charger les modules du noyau avant que les classes soient définies dans '$FAI/class'." +msgstr "" +"- Charger les modules du noyau avant que les classes soient définies dans '$" +"FAI/class'." #: fai-guide.txt:1292 msgid "- Send an email to the administrator if the installation is finished." -msgstr "- Envoyer un courriel à l’administrateur si l’installation est terminée." +msgstr "" +"- Envoyer un courriel à l’administrateur si l’installation est terminée." #: fai-guide.txt:1294 msgid "- Install a diskless client and skip local disk partitioning." -msgstr "- Installer un client sans disque et sautez le partitionnement de disque local." +msgstr "" +"- Installer un client sans disque et sautez le partitionnement de disque " +"local." #: fai-guide.txt:1296 msgid "" "- Have a look at +hooks/debconf.IMAGE+ for how to clone a machine using a " "file system image." -msgstr "- Jeter un œil à +hooks/debconf.IMAGE+ pour savoir comment cloner une machine en utilisant une image de système de fichiers." +msgstr "" +"- Jeter un œil à +hooks/debconf.IMAGE+ pour savoir comment cloner une " +"machine en utilisant une image de système de fichiers." #: fai-guide.txt:1298 msgid "=== [[faiflags]]FAI flags" @@ -3089,7 +3196,8 @@ msgid "" "should be created by 'fai-chboot(1)'. The following flags are known:" msgstr "" "La variable +$FAI_FLAGS+ contient une liste d'options séparées par des\n" -"espaces. Les options sont normalement définies dans le fichier pxelinux.cfg qui\n" +"espaces. Les options sont normalement définies dans le fichier pxelinux.cfg " +"qui\n" "est censément créé par 'fai-chboot(1)'. Les options suivantes sont connues :" #: fai-guide.txt:1307 @@ -3101,7 +3209,8 @@ msgid "" msgstr "" "verbose::\n" "Rend l'installation verbeuse. Cela doit toujours\n" -"être la première option (le premier flag), de sorte que les définitions suivantes des\n" +"être la première option (le premier flag), de sorte que les définitions " +"suivantes des\n" "options soient affichées verbeusement." #: fai-guide.txt:1314 @@ -3148,7 +3257,8 @@ msgid "" msgstr "" "----\n" "$ ssh root@demohost\n" -"Warning: Permanently added 'demohost,192.168.33.100' to the list of known hosts.\n" +"Warning: Permanently added 'demohost,192.168.33.100' to the list of known " +"hosts.\n" "root@demohost's password:\n" "----" @@ -3203,7 +3313,8 @@ msgid "" msgstr "" "screen::\n" "Lancer FAI dans une session `screen(1)`. La session est nommée FAI.\n" -"Si on se connecte via ssh à distance on peut se rattacher à la session en utilisant :\n" +"Si on se connecte via ssh à distance on peut se rattacher à la session en " +"utilisant :\n" "----\n" "$ screen -x\n" "----" @@ -3219,7 +3330,8 @@ msgid "" msgstr "" "tmux::\n" "Lancer FAI dans une session `tmux(1)`. La session est nommée FAI.\n" -"Si on se connecte via ssh à distance on peut se rattacher à la session en utilisant :\n" +"Si on se connecte via ssh à distance on peut se rattacher à la session en " +"utilisant :\n" "----\n" "$ tmux attach\n" "----" @@ -3298,8 +3410,10 @@ msgid "" "scripts. By default the path is _/var/lib/fai/config_.]" msgstr "" "L’espace de configuration est rendu disponible via la méthode configurée\n" -"(un montage NFS par défaut) depuis le serveur d’installation vers le chemin défini\n" -"dans '$FAI' footnote:['$FAI' est une variable interne utilisée par les scripts FAI.\n" +"(un montage NFS par défaut) depuis le serveur d’installation vers le chemin " +"défini\n" +"dans '$FAI' footnote:['$FAI' est une variable interne utilisée par les " +"scripts FAI.\n" "Le chemin par défaut est _/var/lib/fai/config_.]" #: fai-guide.txt:1394 @@ -3327,9 +3441,11 @@ msgid "" "thing you see is the red FAI copyright message." msgstr "" "À ce stade, le client d’installation a réussi à recevoir la configuration\n" -"réseau via DHCP, le noyau et le fichier initrd via TFTP. Il démarre maintenant Le\n" +"réseau via DHCP, le noyau et le fichier initrd via TFTP. Il démarre " +"maintenant Le\n" "noyau Linux et met en place initrd. Si tout se passe bien, l’initrd monte\n" -"le nfsroot footnote:['/srv/fai/nfsroot' depuis le serveur d'installation via NFS]\n" +"le nfsroot footnote:" +"['/srv/fai/nfsroot' depuis le serveur d'installation via NFS]\n" "et les scripts FAI sont lancés. La première\n" "chose qu'on voit est le message de copyright en rouge de FAI." @@ -3343,7 +3459,8 @@ msgid "" "host. This list is very important for the rest of the installation." msgstr "" "On peut également voir la liste des classes FAI, qui sont définies\n" -"pour cet hôte. Cette liste est très importante pour le reste de l’installation." +"pour cet hôte. Cette liste est très importante pour le reste de " +"l’installation." #: fai-guide.txt:1414 msgid "" @@ -3353,7 +3470,8 @@ msgid "" msgstr "" "La première tâche est appelée _confdir_, qui est chargée de accès à\n" "l’espace de configuration. Ici, on utilise un montage NFS depuis\n" -"le serveur d'installation comme on peut le voir sur la console (et plus tard\n" +"le serveur d'installation comme on peut le voir sur la console (et plus " +"tard\n" "dans les journaux)." #: fai-guide.txt:1419 @@ -3366,7 +3484,8 @@ msgid "" msgstr "" "----\n" "FAI_CONFIG_SRC is set to nfs://faiserver/srv/fai/config\n" -"Configuration space faiserver:/srv/fai/config mounted to /var/lib/fai/config\n" +"Configuration space faiserver:/srv/fai/config mounted to /var/lib/fai/" +"config\n" "----" #: fai-guide.txt:1424 @@ -3407,7 +3526,8 @@ msgid "" "_fai_." msgstr "" "Si l’installation s'est bien terminée, l’ordinateur doit démarrer un petit\n" -"système Debian. Vous pouvez vous connecter en tant qu'utilisateur _demo_ ou _root_\n" +"système Debian. Vous pouvez vous connecter en tant qu'utilisateur _demo_ ou " +"_root_\n" "avec le mot de passe _fai_." #: fai-guide.txt:1438 @@ -3425,7 +3545,8 @@ msgid "" msgstr "" "Une fois le client d’installation démarré, seul le script\n" "'/usr/sbin/fai' est exécuté. Il effectuera une initialisation minimale.\n" -"La variable +$FAI_CONFIG_SRC+ footnote:[Celle-ci est définie dans la ligne de commande du noyau]\n" +"La variable +$FAI_CONFIG_SRC+ footnote:[Celle-ci est définie dans la ligne " +"de commande du noyau]\n" "est utilisée pour accéder à l’espace de configuration FAI qui est alors\n" "disponible dans le répertoire +$FAI+ footnote:[/var/lib/fai/config].\n" "FAI ne se fonctionnera pas sans l’espace de configuration." @@ -3436,14 +3557,18 @@ msgid "" "methods are: nfs:, file:, cvs:, svn: git:, hg:, http: and detect:.\n" "See `fai.conf(5)` for a detailed description of these methods." msgstr "" -"On peut accéder à l'espace de configuration à l'aide de diverses méthodes. Les\n" -"méthodes supportées sont : nfs:, file:, cvs:, svn: git:, hg:, http: et detect:.\n" +"On peut accéder à l'espace de configuration à l'aide de diverses méthodes. " +"Les\n" +"méthodes supportées sont : nfs:, file:, cvs:, svn: git:, hg:, http: et " +"detect:.\n" "Voir `fai.conf(5)` pour une description détaillée de ces méthodes." #: fai-guide.txt:1452 msgid "" "=== [[iclass]]Defining classes and variables (tasks defclass and defvar)" -msgstr "=== [[iclass]]Définition de classes et de variables (tâches defclass et defvar)" +msgstr "" +"=== [[iclass]]Définition de classes et de variables (tâches defclass et " +"defvar)" #: fai-guide.txt:1456 msgid "" @@ -3470,7 +3595,9 @@ msgstr "" msgid "" "=== [[ipartition]]Partitioning local disks, creating file systems (task " "partition)" -msgstr "=== [[ipartition]]Partitionnement des disques locaux, création des systèmes de fichiers (tâche partition)" +msgstr "" +"=== [[ipartition]]Partitionnement des disques locaux, création des systèmes " +"de fichiers (tâche partition)" #: fai-guide.txt:1466 msgid "" @@ -3482,7 +3609,8 @@ msgstr "" #: fai-guide.txt:1468 msgid "The format of the disk configuration is similar to a fstab file." -msgstr "Le format de la configuration du disque est similaire à un fichier fstab." +msgstr "" +"Le format de la configuration du disque est similaire à un fichier fstab." #: fai-guide.txt:1475 msgid "" @@ -3506,7 +3634,8 @@ msgid "" "if the file names match a class name." msgstr "" "=== [[ipreseed]]Pré-ensemencement Debconf (tâche debconf)\n" -"Les fichiers dans '$FAI/debconf' sont utilisés par le système de pré-ensemencement\n" +"Les fichiers dans '$FAI/debconf' sont utilisés par le système de pré-" +"ensemencement\n" "habituel de `debconf(7)` si les noms de fichier correspondent à un\n" "nom de classe." @@ -3521,7 +3650,8 @@ msgid "" "packages on the new file system." msgstr "" "La commande `install_packages(8)` lit les fichiers de configuration à\n" -"partir de '$FAI/package_config' d'une façon basée sur la classe et installe des paquets\n" +"partir de '$FAI/package_config' d'une façon basée sur la classe et installe " +"des paquets\n" "logiciels sur le nouveau système de fichiers." #: fai-guide.txt:1490 @@ -3531,13 +3661,16 @@ msgid "" "dependecies are also resolved by the package tools." msgstr "" "Elle installe les paquets en utilisant `apt-get(8)`, `aptitude(1)`,\n" -"`yum` ou d’autres gestionnaires de paquets sans besoin d'aucune interaction manuelle.\n" -"Les dépendances des paquets sont également résolues par les gestionnaires de paquets." +"`yum` ou d’autres gestionnaires de paquets sans besoin d'aucune interaction " +"manuelle.\n" +"Les dépendances des paquets sont également résolues par les gestionnaires de " +"paquets." #: fai-guide.txt:1492 msgid "" "The format of the configuration files is described in <>." -msgstr "Le format des fichiers de configuration est décrit dans <>." +msgstr "" +"Le format des fichiers de configuration est décrit dans <>." #: fai-guide.txt:1495 msgid "" @@ -3560,7 +3693,8 @@ msgid "" "based manner. It is possible to have several scripts of different\n" "types (shell, cfengine, ...) to be executed for one class." msgstr "" -"Souvent, les configurations par défaut des paquets logiciels ne répondent pas à\n" +"Souvent, les configurations par défaut des paquets logiciels ne répondent " +"pas à\n" "vos besoins spécifiques au site. Vous pouvez appeler des scripts\n" "arbitraires qui ajustent la configuration du système. Par conséquent, la\n" "commande `fai-do-scripts(1)` exécute des scripts dans '$FAI/scripts'\n" @@ -3579,8 +3713,10 @@ msgid "" msgstr "" "L’ensemble de scripts par défaut dans '$FAI/scripts' inclut des exemples\n" "d’installation de machines Debian et Rocky Linux. Ils définissent le mot de\n" -"passe root, ajoutent un compte utilisateur (défini par '$username', avec demo par défaut),\n" -"paramètrent le fuseau horaire, configurent le réseau avec DHCP ou en utilisant une adresse IP\n" +"passe root, ajoutent un compte utilisateur (défini par '$username', avec " +"demo par défaut),\n" +"paramètrent le fuseau horaire, configurent le réseau avec DHCP ou en " +"utilisant une adresse IP\n" "fixe, configurent grub et plus encore. Ils devraient faire un\n" "travail raisonnable pour votre installation. Vous pouvez les modifier ou\n" "ajouter de nouveaux scripts pour répondre à vos besoins locaux." @@ -3606,12 +3742,16 @@ msgid "" "+$SERVER+ which is only defined during an initial installation (by\n" "get-boot-info)." msgstr "" -"Lorsque toutes les tâches sont terminées, les fichiers journaux sont écrits dans\n" +"Lorsque toutes les tâches sont terminées, les fichiers journaux sont écrits " +"dans\n" "_/var/log/fai/$HOSTNAME/install/_\n" -"footnote:['/var/log/fai/localhost/install/' est un lien vers ce répertoire.]\n" +"footnote:['/var/log/fai/localhost/install/' est un lien vers ce répertoire.]" +"\n" "sur le nouveau système, et sur le compte sur le serveur d’installation si\n" -"+$LOGUSER+ est défini (il faut l'activer dans '/srv/fai/config/class/FAIBASE.var').\n" -"Il est également possible de spécifier un autre hôte comme destination pour cet enregistrement\n" +"+$LOGUSER+ est défini (il faut l'activer dans '/srv/fai/config/class/" +"FAIBASE.var').\n" +"Il est également possible de spécifier un autre hôte comme destination pour " +"cet enregistrement\n" "à l'aide de la variable\n" "+$LOGSERVER+. Si +$LOGSERVER+ n’est pas défini, FAI utilise la\n" "variable +$SERVER+ qui n’est définie que lors d’une installation\n" @@ -3629,11 +3769,13 @@ msgid "" "server. Here's an example of the symlink structure:" msgstr "" "De plus, deux liens symboliques seront créés pour indiquer le dernier\n" -"répertoire où on a écrit. Le lien symbolique 'last' pointe vers le répertoire\n" +"répertoire où on a écrit. Le lien symbolique 'last' pointe vers le " +"répertoire\n" "journal de la dernière action FAI exécutée. Les liens symboliques\n" "'last-install' et 'last-sysinfo' pointent vers le répertoire avec la\n" "dernière action correspondante. Par défaut, les fichiers journaux seront\n" -"copiés sur le serveur de journalisation à l’aide de scp. Vous pouvez utiliser\n" +"copiés sur le serveur de journalisation à l’aide de scp. Vous pouvez " +"utiliser\n" "la variable +$FAI_LOGPROTO+ dans le fichier 'fai.conf(5)' pour choisir\n" "une autre méthode d’enregistrement des journaux sur le serveur distant.\n" "Voici un exemple de structure de lien symbolique :" @@ -3653,18 +3795,22 @@ msgid "" "----" msgstr "" "----\n" -"lrwxrwxrwx 1 fai fai 23 Dec 2 2013 last-sysinfo -> sysinfo-20131202_161237\n" +"lrwxrwxrwx 1 fai fai 23 Dec 2 2013 last-sysinfo -> sysinfo-" +"20131202_161237\n" "drwxr-xr-x 2 fai fai 4096 Dec 2 2013 sysinfo-20131202_161237\n" "drwxr-xr-x 2 fai fai 4096 Feb 14 2014 install-20140214_142150\n" "drwxr-xr-x 2 fai fai 4096 Dec 2 11:47 install-20141202_113918\n" -"lrwxrwxrwx 1 fai fai 23 Dec 4 13:22 last-install -> install-20141204_131351\n" +"lrwxrwxrwx 1 fai fai 23 Dec 4 13:22 last-install -> install-" +"20141204_131351\n" "lrwxrwxrwx 1 fai fai 23 Dec 4 13:22 last -> install-20141204_131351\n" "drwxr-xr-x 2 fai fai 4096 Dec 4 13:22 install-20141204_131351\n" "----" #: fai-guide.txt:1549 msgid "Examples of the log files can be found at https://fai-project.org/logs." -msgstr "Vous trouverez des exemples de fichiers journaux à l’adresse https://fai-project.org/logs." +msgstr "" +"Vous trouverez des exemples de fichiers journaux à l’adresse https://fai-" +"project.org/logs." #: fai-guide.txt:1552 msgid "=== [[ireboot]]Reboot the new installed system" @@ -3733,7 +3879,8 @@ msgstr "" "démon est en cours d’exécution sur le serveur d’installation (ou sur\n" "l’ordinateur défini par la variable +$monserver+). Chaque fois qu’une\n" "tâche démarre ou se termine, un message est envoyé. Le démon du moniteur\n" -"FAI envoie ces messages dans sa sortie standard. On peut aussi utiliser une interface\n" +"FAI envoie ces messages dans sa sortie standard. On peut aussi utiliser une " +"interface\n" "graphique, appelée `fai-monitor-gui(1)`." #: fai-guide.txt:1590 @@ -3775,7 +3922,8 @@ msgid "" "following command simultaneously on the server:" msgstr "" "Pendant que les clients d’installation démarrent, ils envoient des\n" -"paquets de diffusion (broadcast) au LAN. Vous pouvez enregistrer les adresses MAC de\n" +"paquets de diffusion (broadcast) au LAN. Vous pouvez enregistrer les " +"adresses MAC de\n" "ces hôtes en exécutant simultanément la commande suivante sur le serveur :" #: fai-guide.txt:1608 @@ -3794,8 +3942,10 @@ msgid "" "by typing _ctrl-c_. You get a list of all\n" "unique MAC addresses with these commands:" msgstr "" -"Une fois que les hôtes ont envoyés quelques paquets de diffusion, arrêtez `tcpdump`\n" -"en tapant _ctrl-c_. Vous obtenez une liste de toutes les adresses MAC uniques avec ces commandes :" +"Une fois que les hôtes ont envoyés quelques paquets de diffusion, arrêtez " +"`tcpdump`\n" +"en tapant _ctrl-c_. Vous obtenez une liste de toutes les adresses MAC " +"uniques avec ces commandes :" #: fai-guide.txt:1616 msgid "" @@ -3805,7 +3955,8 @@ msgid "" "----" msgstr "" "----\n" -"faiserver$ perl -ane 'print \"\\U$F[0]\\n\"' /tmp/mac.list|sort|uniq\n" +"faiserver$ perl -ane 'print \"\\U$F[0]\\n" +"\"' /tmp/mac.list|sort|uniq\n" "----" #: fai-guide.txt:1623 @@ -3821,8 +3972,10 @@ msgstr "" "Après cela, vous n’avez qu'à assigner ces adresses MAC aux noms d’hôte\n" "et aux adresses IP ('/etc/ethers' et '/etc/hosts' ou aux associations NIS\n" "correspondantes). Avec ces informations, vous pouvez configurer votre\n" -"démon DHCP (voir la section <>). footnote:[Je recommande d'inscrire\n" -"l'adresse MAC (les trois derniers octets devraient suffire si vous avez des cartes du\n" +"démon DHCP (voir la section <>). footnote:[Je recommande d'" +"inscrire\n" +"l'adresse MAC (les trois derniers octets devraient suffire si vous avez des " +"cartes du\n" "même vendeur) et le nom d'hôte devant chaque boîtier.]" #: fai-guide.txt:1626 @@ -3838,7 +3991,8 @@ msgid "" msgstr "" "Si le client ne peut démarrer correctement à partir de la carte réseau,\n" "utilisez `tcpdump(8)` pour rechercher des paquets Ethernet entre le\n" -"serveur d’installation et le client. Recherchez également dans les entrées de\n" +"serveur d’installation et le client. Recherchez également dans les entrées " +"de\n" "plusieurs fichiers journaux venant de `tftpd(8)` et `dhcpd(8)` :" #: fai-guide.txt:1635 @@ -3901,7 +4055,9 @@ msgstr "" "* Le client d’installation obtient le binaire pxelinux.0 via TFTP\n" "* Il obtient le fichier de configuration pxelinux.cfg/C0A8210C via TFTP\n" "* C0A8210C est l’adresse IP du client en hexadécimal\n" -"* Cette configuration contient le noyau, le fichier initrd et les paramètres de ligne de commande supplémentaires du noyau, qui ont été créés par `fai-chboot`.\n" +"* Cette configuration contient le noyau, le fichier initrd et les paramètres " +"de ligne de commande supplémentaires du noyau, qui ont été créés par `fai-" +"chboot`.\n" "* Il obtient le noyau et le fichier initrd via TFTP." #: fai-guide.txt:1663 @@ -3925,7 +4081,9 @@ msgid "" msgstr "" "label fai-generated\n" "kernel vmlinuz-6.1.0-17-amd64\n" -"append initrd=initrd.img-6.1.0-17-amd64 ip=dhcp root=/srv/fai/nfsroot rootovl FAI_FLAGS=verbose,sshd,createvt FAI_CONFIG_SRC=nfs://faiserver/srv/fai/config FAI_ACTION=install\n" +"append initrd=initrd.img-6.1.0-17-amd64 ip=dhcp root=/srv/fai/nfsroot " +"rootovl FAI_FLAGS=verbose,sshd,createvt FAI_CONFIG_SRC=nfs://faiserver/srv/" +"fai/config FAI_ACTION=install\n" "----" #: fai-guide.txt:1673 @@ -3945,7 +4103,9 @@ msgstr "" msgid "" "=== [[Customizing your install server setup]]Customizing your install server " "setup" -msgstr "=== [[Customizing your install server setup]]Personnaliser la configuration de son serveur d’installation" +msgstr "" +"=== [[Customizing your install server setup]]Personnaliser la configuration " +"de son serveur d’installation" #: fai-guide.txt:1680 msgid "" @@ -4050,9 +4210,11 @@ msgstr "" "L’installation crée également le compte _fai_ (défini par +$LOGUSER+)\n" "s’il n’est pas déjà disponible. Vous pouvez donc ajouter un utilisateur\n" "avant d’appeler `fai-setup(8)` à l’aide de la commande `adduser(8)`\n" -"et l'utiliser comme compte local pour enregistrer des fichiers journaux. Les\n" +"et l'utiliser comme compte local pour enregistrer des fichiers journaux. " +"Les\n" "fichiers journaux de tous les clients d’installation sont enregistrés\n" -"dans le répertoire de personnel de ce compte. Vous devriez changer le groupe\n" +"dans le répertoire de personnel de ce compte. Vous devriez changer le " +"groupe\n" "principal de ce compte, afin que ce compte ait des droits d'écriture sur\n" "'/srv/tftp/fai' afin d'appeler fai-chboot pour créer la configuration PXE\n" "pour les hôtes." @@ -4103,7 +4265,8 @@ msgid "" "To easily create the installation CD, you can use the following command\n" "(for more tuning details see `fai-cd(8)`):" msgstr "" -"Pour créer facilement le CD d'installation, on peut utiliser la commande suivante\n" +"Pour créer facilement le CD d'installation, on peut utiliser la commande " +"suivante\n" "(Pour plus de détails de configuration voir `fai-cd(8)`) :" #: fai-guide.txt:1750 @@ -4168,7 +4331,8 @@ msgstr "" "sur une clé USB) ou une clé USB contenant une image ISO avec\n" "une partition ext4 ou exFAT et y place le label MY-DATA.\n" "Cette partition est automatiquement montée dans '/media/data' par FAI.\n" -"On peut copier ses propres paquets _.deb_ dans cette partition de données sous les\n" +"On peut copier ses propres paquets _.deb_ dans cette partition de données " +"sous les\n" "sous-répertoires 'pkgs/'. FAI installera alors ces paquets\n" "si la classe équivalente est définie." @@ -4189,8 +4353,10 @@ msgstr "" "----\n" "# mk-data-partition -s 1G -c faicd-large.iso A B\n" "----\n" -"La commande ci-desus crée la partition de données avec une taille de 1 Go dans\n" -"le fichier ISO et y copie les répertoires A et B. On peut écrire l'image ISO modifiée\n" +"La commande ci-desus crée la partition de données avec une taille de 1 Go " +"dans\n" +"le fichier ISO et y copie les répertoires A et B. On peut écrire l'image ISO " +"modifiée\n" "sur une clé USB." #: fai-guide.txt:1792 @@ -4203,7 +4369,8 @@ msgid "" "----" msgstr "" "Si l'image ISO est déjà sur la clé USB, qui est disponible sous\n" -"_dev/sdf_, on peut ajouter la partition de données de type exFAT qui utilisera\n" +"_dev/sdf_, on peut ajouter la partition de données de type exFAT qui " +"utilisera\n" "tout l'espace disponible de la clé USB en utilisant cette commande\n" " :\n" "----\n" @@ -4234,9 +4401,12 @@ msgstr "" "les tâches FAI normales sur une image de disque brut. Après\n" "l’installation, vous pouvez démarrer l’image disque et avoir un système\n" "fonctionnel. L’image disque peut également être convertie au format qcow2.\n" -"Vous n'avez pas besoin de mettre en place le nfsroot de FAI quand vous utilisez seulement\n" -"fai-diskimage. Mais vous avez besoin d'un fichier de base dans votre espace de\n" -"configuration. Le réglage de la variable +$FAI_BASEFILEURL+ permet de télécharger automatiquement\n" +"Vous n'avez pas besoin de mettre en place le nfsroot de FAI quand vous " +"utilisez seulement\n" +"fai-diskimage. Mais vous avez besoin d'un fichier de base dans votre espace " +"de\n" +"configuration. Le réglage de la variable +$FAI_BASEFILEURL+ permet de " +"télécharger automatiquement\n" "un fichier de base approprié dans votre espace de configuration." #: fai-guide.txt:1814 @@ -4249,11 +4419,13 @@ msgid "" "cDEBIAN,BOOKWORM64,AMD64,FAIBASE,GRUB_PC,DHCPC,DEMO,CLOUD,LAST disk.raw\n" "----" msgstr "" -"Voici par exemple comment créer une image de disque brute pour un hôte nommé\n" +"Voici par exemple comment créer une image de disque brute pour un hôte " +"nommé\n" "cloud3, avec un petit ensemble de paquets logiciels :\n" "----\n" "# export FAI_BASEFILEURL=https://fai-project.org/download/basefiles/\n" -"# fai-diskimage -vu cloud3 -S2G -cDEBIAN,BOOKWORM64,AMD64,FAIBASE,GRUB_PC,DHCPC,DEMO,CLOUD,LAST disk.raw\n" +"# fai-diskimage -vu cloud3 -S2G -" +"cDEBIAN,BOOKWORM64,AMD64,FAIBASE,GRUB_PC,DHCPC,DEMO,CLOUD,LAST disk.raw\n" "----" #: fai-guide.txt:1822 @@ -4267,7 +4439,8 @@ msgid "" "# fai-diskimage -Nvu foobar -S5G -c$cl ubuntu.qcow2\n" "----" msgstr "" -"Cette commande créera une image de disque nommée ubuntu.qcow2 pour une configuration de bureau Ubuntu 16.04\n" +"Cette commande créera une image de disque nommée ubuntu.qcow2 pour une " +"configuration de bureau Ubuntu 16.04\n" "avec pour nom d'hôte machin.\n" "----\n" "# export FAI_BASEFILEURL=https://fai-project.org/download/basefiles/\n" @@ -4280,7 +4453,8 @@ msgid "" "You can give disk images a try without installing FAI, if you visit\n" "https://fai-project.org/FAIme/cloud" msgstr "" -"Vous pouvez essayer quelques images de disques sans installer FAI, si vous visitez\n" +"Vous pouvez essayer quelques images de disques sans installer FAI, si vous " +"visitez\n" "https://fai-project.org/FAIme/cloud" #: fai-guide.txt:1828 @@ -4294,8 +4468,10 @@ msgid "" "dirinstall'. Don't forget to add the class +LIVEISO+.\n" "Then create the live ISO using 'fai-cd':" msgstr "" -"La création d'images ISO vives amorçables est facile avec FAI. Il suffit de deux\n" -"étapes. Premièrement, créez votre environnement vif à l'aide de la commande 'fai\n" +"La création d'images ISO vives amorçables est facile avec FAI. Il suffit de " +"deux\n" +"étapes. Premièrement, créez votre environnement vif à l'aide de la commande '" +"fai\n" "dirinstall'. N'oubliez pas d'ajouter la classe +LIVEISO+.\n" "Ensuite, créez l'image ISO vive en utilisant 'fai-cd' :" @@ -4323,11 +4499,14 @@ msgid "" "Currently there's no live ISO of the install server available." msgstr "" "Le nfsroot n'est pas nécessaire pour une image ISO vive.\n" -"Il n'y a pas actuellement d'image vive ISO disponible sur le serveur d'installation." +"Il n'y a pas actuellement d'image vive ISO disponible sur le serveur " +"d'installation." #: fai-guide.txt:1847 msgid "=== [[cross-arch]]Building cross-architecture disk images" -msgstr "=== [[cross-arch]]Construire des images disque d'architecture différente (cross-architecture)" +msgstr "" +"=== [[cross-arch]]Construire des images disque d'architecture différente " +"(cross-architecture)" #: fai-guide.txt:1852 msgid "" @@ -4338,8 +4517,10 @@ msgid "" "architecture. Here are the steps do to:" msgstr "" "À partir de FAI 5.4 il devient possible de construire une image disque pour\n" -"des architectures différentes de l'hôte qui est utilisé. Par exemple on peut\n" -"construire une image pour une architecture ARM 64-bit (aarch64) sur un hôte qui fonctionne\n" +"des architectures différentes de l'hôte qui est utilisé. Par exemple on " +"peut\n" +"construire une image pour une architecture ARM 64-bit (aarch64) sur un hôte " +"qui fonctionne\n" "sur une architecture amd64. Voici les étapes successives :" #: fai-guide.txt:1856 @@ -4350,7 +4531,8 @@ msgid "" "# fai-mk-configspace" msgstr "" "----\n" -"# apt install qemu-system-arm qemu-user-static fai-server fai-setup-storage fai-doc qemu-utils\n" +"# apt install qemu-system-arm qemu-user-static fai-server fai-setup-storage " +"fai-doc qemu-utils\n" "# fai-mk-configspace" #: fai-guide.txt:1863 @@ -4364,7 +4546,8 @@ msgid "" "----" msgstr "" "# export FAI_BASEFILEURL=https://fai-project.org/download/basefiles/\n" -"# fai-diskimage -vu armhost -S2G -cDEFAULT,DHCPC,DEBIAN,ARM64,BUSTER_ARM64,FAIBASE,DEMO,CLOUD,LAST arm64.raw\n" +"# fai-diskimage -vu armhost -S2G -" +"cDEFAULT,DHCPC,DEBIAN,ARM64,BUSTER_ARM64,FAIBASE,DEMO,CLOUD,LAST arm64.raw\n" "# chown your_user_id arm64.raw\n" "# cp /var/log/fai/armhost/last/vmlinuz* vmlinuz\n" "# cp /var/log/fai/armhost/last/initrd.img* initrd\n" @@ -4382,7 +4565,10 @@ msgid "" msgstr "" "Ensuite on peut lancer qemu en tant qu'utilisateur ordinaire :\n" "----\n" -"> qemu-system-aarch64 -m 1000 -M virt,gic_version=3 -cpu cortex-a57 -drive file=arm64.raw,if=virtio,index=1 -no-reboot -nographic -name ARM64 -net nic,name=eth0,model=virtio -net user,name=eth0,-kernel vmlinuz -initrd initrd -append \"console=ttyAMA0 rw ip=dhcp root=/dev/vda1 net.ifnames=0\"\n" +"> qemu-system-aarch64 -m 1000 -M virt,gic_version=3 -cpu cortex-a57 -drive " +"file=arm64.raw,if=virtio,index=1 -no-reboot -nographic -name ARM64 -net " +"nic,name=eth0,model=virtio -net user,name=eth0,-kernel vmlinuz -initrd " +"initrd -append \"console=ttyAMA0 rw ip=dhcp root=/dev/vda1 net.ifnames=0\"\n" "----" #: fai-guide.txt:1872 @@ -4392,7 +4578,8 @@ msgid "" "not using the virtio driver as above or tap devices." msgstr "" "Ça fonctionne de même pour d'autres architectures.\n" -"Il faut garder en tête que les réglages réseau de qemu ont des performances dégradées si\n" +"Il faut garder en tête que les réglages réseau de qemu ont des performances " +"dégradées si\n" "on n'utilise pas le pilote virtio comme ci-dessus ou des TAPs réseaux." #: fai-guide.txt:1878 @@ -4418,7 +4605,8 @@ msgid "" "hardware information.\n" "Both actions can be used for FAI as a rescue system." msgstr "" -"Si vous assignez à la variable +$FAI_ACTION+ la valeur _sysinfo_ (par exemple\n" +"Si vous assignez à la variable +$FAI_ACTION+ la valeur _sysinfo_ (par " +"exemple\n" "en utilisant fai-chboot -S), le client n’installera pas de nouveau\n" "système, mais collectera beaucoup d’informations système. Si vous\n" "assignez à +$FAI_ACTION+ la valeur _inventory_, vous ne recevrez que\n" @@ -4539,7 +4727,8 @@ msgid "" "To create an image, use fai-cd's -S argument and -M to avoid setting up\n" "a partial mirror within the image." msgstr "" -"Pour créer une image, utilisez l’argument -S de fai-cd et -M pour éviter de créer\n" +"Pour créer une image, utilisez l’argument -S de fai-cd et -M pour éviter de " +"créer\n" "un miroir partiel à l'intérieur de l'image." #: fai-guide.txt:1941 @@ -4579,7 +4768,8 @@ msgid "" "----" msgstr "" "----\n" -"root=live:http://faiserver/cskoeln/squash.img FAI_CONFIG_SRC=file:///var/lib/fai/config\n" +"root=live:http://faiserver/cskoeln/squash.img FAI_CONFIG_SRC=file:///var/lib/" +"fai/config\n" "----" #: fai-guide.txt:1955 @@ -4592,7 +4782,9 @@ msgstr "" #: fai-guide.txt:1958 msgid "=== [[otherdists]]Installing other distributions using a Debian nfsroot" -msgstr "=== [[otherdists]]Installation d’autres distributions à l’aide d’un nfsroot Debian" +msgstr "" +"=== [[otherdists]]Installation d’autres distributions à l’aide d’un nfsroot " +"Debian" #: fai-guide.txt:1967 msgid "" @@ -4690,11 +4882,13 @@ msgid "" msgstr "" "On peut utiliser cela, par exemple, pour combiner FAI avec les outils\n" "_xen-tools_, qui vous aident à construire des domaines invités Xen.\n" -"Les _xen-tools_ sont très agréables pour générer des fichiers de configuration\n" +"Les _xen-tools_ sont très agréables pour générer des fichiers de " +"configuration\n" "et bloquer des périphériques pour de nouveaux invités sur la base de\n" "commandes simples et/ou des fichiers de configuration, mais ils ne\n" "peuvent assigner qu’un seul rôle par installation pour la\n" -"personnalisation. Les utilisateurs de FAI ont besoin de plus et en veulent, car\n" +"personnalisation. Les utilisateurs de FAI ont besoin de plus et en veulent, " +"car\n" "ils ont l'habitude d'avoir le système de classes. Ils peuvent y arriver\n" "même dans les installations xen-tools, en utilisant le code suivant en\n" "tant que rôle xen-tools script :" @@ -4777,7 +4971,8 @@ msgid "" "like `clusterssh(1)` to start a softupdate via a push on a list of\n" "hosts." msgstr "" -"C’est à vous de décider, comment démarrer un softupdate sur un plus grand nombre\n" +"C’est à vous de décider, comment démarrer un softupdate sur un plus grand " +"nombre\n" "d’hôtes. Vous pouvez faire le softupdate sur régulièreent via cron\n" "ou vous pouvez utiliser des outils comme `clusterssh(1)` pour démarrer\n" "un softupdate via un push sur une liste d’hôtes." @@ -4797,7 +4992,9 @@ msgstr "" #: fai-guide.txt:2046 msgid "For example appending a line to a file must not done via this code:" -msgstr "Par exemple, l’ajout d’une ligne à un fichier ne doit pas se faire via ce code :" +msgstr "" +"Par exemple, l’ajout d’une ligne à un fichier ne doit pas se faire via ce " +"code :" #: fai-guide.txt:2052 msgid "" @@ -4810,7 +5007,8 @@ msgstr "" "----\n" "$ echo \"some strings\" >> /etc/fstab\n" "----\n" -"Au lieu de ça, utilisez la commande `ainsl(1)` dans un script shell ou utilisez la fonction\n" +"Au lieu de ça, utilisez la commande `ainsl(1)` dans un script shell ou " +"utilisez la fonction\n" "de cfengine _AppendIfNoSuchLine_." #: fai-guide.txt:2058 @@ -4859,7 +5057,8 @@ msgstr "" "+$ROOTCMD+::\n" "Dans le cas de l’installation, il s’agit d’un alias pour 'chroot $target'\n" "en cas de softupdate, c’est juste vide. Vous pouvez ajouter\n" -"ceci avant les commandes si vous avez besoin d’exécuter une commande dans le\n" +"ceci avant les commandes si vous avez besoin d’exécuter une commande dans " +"le\n" "système de fichiers cible des clients via chroot." #: fai-guide.txt:2078 @@ -4878,7 +5077,9 @@ msgstr "" #: fai-guide.txt:2080 msgid "=== [[archcross]]How to install 32-bit OS from a 64-bit OS" -msgstr "=== [[archcross]]Comment installer un système d’exploitation 32 bits à partir d’un système d’exploitation 64 bits" +msgstr "" +"=== [[archcross]]Comment installer un système d’exploitation 32 bits à " +"partir d’un système d’exploitation 64 bits" #: fai-guide.txt:2085 msgid "" @@ -4951,7 +5152,8 @@ msgid "" "a bootable CD or USB stick is also possible on a different architecture.\n" "You have to specify the architecture when calling fai-mirror." msgstr "" -"La création d’un miroir partiel utilisant `fai-mirror(1)` qui est nécessaire à\n" +"La création d’un miroir partiel utilisant `fai-mirror(1)` qui est nécessaire " +"à\n" "un CD amorçable ou une clé USB est également possible sur une\n" "architecture différente. Vous devez spécifier l’architecture lors de\n" "l’appel de fai-mirror." @@ -4964,7 +5166,8 @@ msgid "" "----" msgstr "" "----\n" -"$ fai-mirror -m800 -B -a i386 -v -cDEFAULT,DEBIAN,FAIBASE,I386 /srv/mirror-i386\n" +"$ fai-mirror -m800 -B -a i386 -v -cDEFAULT,DEBIAN,FAIBASE,I386 /srv/mirror-" +"i386\n" "----" #: fai-guide.txt:2116 @@ -4973,7 +5176,8 @@ msgstr "Et voilà !" #: fai-guide.txt:2119 msgid "=== [[error]]Aborting the installation when an error occurs" -msgstr "=== [[error]]Arrêt d'urgence de l'installation quand une erreur se produit" +msgstr "" +"=== [[error]]Arrêt d'urgence de l'installation quand une erreur se produit" #: fai-guide.txt:2127 msgid "" @@ -4986,9 +5190,12 @@ msgid "" "immediately. In a hook, just add a call like this:" msgstr "" "Chaque tâche, chaque hook peut appeler la fonction +task_error+\n" -"pour envoyer une valeur d'erreur à l'installation. Cette erreur apparaîtra dans\n" -"le fichier de journalisation et peut être visionnée dans le `fai-monitor-gui(1)`.\n" -"La valeur de l'erreur est aussi examinée en tenant compte de la variable +$STOP_ON_ERROR+\n" +"pour envoyer une valeur d'erreur à l'installation. Cette erreur apparaîtra " +"dans\n" +"le fichier de journalisation et peut être visionnée dans le `fai-monitor-" +"gui(1)`.\n" +"La valeur de l'erreur est aussi examinée en tenant compte de la variable " +"+$STOP_ON_ERROR+\n" "qui est réglée à 700 par défaut. Si la valeur d'erreur est\n" "supérieure à +$STOP_ON_ERROR+, l'installation s'arrêtera\n" "immédiatment. Dans un hook, ajoutez simplement un appel comme celui-ci :" @@ -5029,8 +5236,10 @@ msgid "" "some error. The same syntax can be used by the scripts in the class\n" "subdirectory ending in .sh." msgstr "" -"Alors, l'erreur de tâche n'est mise en place que si la commande précédente a échoué avec\n" -"une certaine erreur. La même syntaxe peut être utilisée par les scripts dans le sous-répertoire\n" +"Alors, l'erreur de tâche n'est mise en place que si la commande précédente a " +"échoué avec\n" +"une certaine erreur. La même syntaxe peut être utilisée par les scripts dans " +"le sous-répertoire\n" "de classe qui se terminent en .sh." #: fai-guide.txt:2148 @@ -5040,7 +5249,8 @@ msgid "" "third parameter. As an example you can use those two variants for\n" "setting the value to 123" msgstr "" -"Un cas particulier est celui des scripts dans le sous-répertoire class/ qui ne se termine\n" +"Un cas particulier est celui des scripts dans le sous-répertoire class/ qui " +"ne se termine\n" "pas en .sh. Dans ces scripts il faut appeler task_error avec 1 comme\n" "troisième paramètre. Par exemple on peut utiliser deux variantes pour\n" "régler la valeur à 123" @@ -5057,8 +5267,8 @@ msgstr "" #: fai-guide.txt:2154 msgctxt "fai-guide.txt:2154" -msgid "or" -msgstr "or" +msgid "or " +msgstr "ou " #: fai-guide.txt:2158 msgid "" @@ -5076,7 +5286,8 @@ msgid "" "the value of +$?+. If the error value is greater than +$STOP_ON_ERROR+,\n" "the installation will abort immediately." msgstr "" -"La dernière commande met toujours l'erreur de tâche à 123 sans tenir compte de $?.\n" +"La dernière commande met toujours l'erreur de tâche à 123 sans tenir compte " +"de $?.\n" "Si la valeur d'erreur est supérieure à +$STOP_ON_ERROR+,\n" "l'installation sera immédiatement stoppée." @@ -5102,7 +5313,8 @@ msgstr "" #: fai-guide.txt:2173 msgid "The fai-monitor-gui has 4 different icons for these error categories." -msgstr "Le fai-monitor-gui possède 4 icônes différentes pour ces catégories d'erreur." +msgstr "" +"Le fai-monitor-gui possède 4 icônes différentes pour ces catégories d'erreur." #: fai-guide.txt:2176 msgid "== [[hints]]Various hints and details" @@ -5157,8 +5369,10 @@ msgid "" msgstr "" "confdir::\n" " Les paramètres ajoutés au noyau peuvent définir des variables, le\n" -" démon syslog est démarré. Les paramètres de réseau sont récupérés d'un serveur DHCP\n" -" et sont enregistrés dans +boot.log+. La configuration pour la résolution DNS est créée.\n" +" démon syslog est démarré. Les paramètres de réseau sont récupérés d'un " +"serveur DHCP\n" +" et sont enregistrés dans +boot.log+. La configuration pour la résolution " +"DNS est créée.\n" " +\n" " L’emplacement de l’espace de configuration est défini par la variable\n" " +$FAI_CONFIG_SRC+.\n" @@ -5239,7 +5453,8 @@ msgstr "" " Appelée lorsque aucune installation n’est effectuée mais que l’action\n" " est _sysinfo_. Elle affiche des informations sur le matériel détecté et\n" " monte les disques durs locaux en lecture seule sur\n" -" '/target/+partitionname+' ou en tenant compte d’un fichier 'fstab' trouvé à\n" +" '/target/+partitionname+' ou en tenant compte d’un fichier 'fstab' trouvé " +"à\n" " l’intérieur d’une partition. Les fichiers journaux sont stockés sur le\n" " serveur d’installation." @@ -5391,7 +5606,8 @@ msgid "" "'$FAI/package_config/'." msgstr "" "instsoft::\n" -" Installe les paquets logiciels souhaités en utilisant des fichiers de classe\n" +" Installe les paquets logiciels souhaités en utilisant des fichiers de " +"classe\n" " dans '$FAI/package_config/'." #: fai-guide.txt:2301 @@ -5598,7 +5814,8 @@ msgstr "" "'/usr/share/doc/fai-doc/examples/utils/'] peut\n" "être utilisé pour créer votre propre miroir Debian local. Ce script\n" "utilise la commande `debmirror(1)`. Un miroir Debian partiel pour\n" -"l’architecture amd64 pour Debian 11 et 12 (noms de code bullseye et bookworm) sans les\n" +"l’architecture amd64 pour Debian 11 et 12 (noms de code bullseye et bookworm)" +" sans les\n" "paquets source nécessite environ 180 Go d’espace disque. L’accès au miroir\n" "via HTTP sera la méthode par défaut dans la plupart des cas. Pour\n" "afficher plus de résultats à partir du script, appelez\n" @@ -5751,6 +5968,8 @@ msgid "" "- A list of all local hard disks is\n" "stored in +$disklist+. It's defined after `set_disk_info` is called." msgstr "" +"- Une liste de tous les disques durs locaux est stockée dans\n" +"+$disklist+. Elle est définie après l’appel de `set_disk_info`." #: fai-guide.txt:2462 msgid "" @@ -5769,6 +5988,20 @@ msgid "" " * checkdisk()\n" " * disks_by_id()" msgstr "" +"- Il y a de nombreuses fonctions pour générer un liste personnalisée\n" +"de disques. Voir `fai-disk-info` pour un exemple.\n" +" * set_bootstick()\n" +" * grepv_disks()\n" +" * grep_disks()\n" +" * notmatchdisks()\n" +" * matchdisks()\n" +" * smallestdisk()\n" +" * largestdisk()\n" +" * all_disks_by_size()\n" +" * all_disks_and_size()\n" +" * once_only()\n" +" * checkdisk()\n" +" * disks_by_id()" #: fai-guide.txt:2467 msgid "" @@ -5777,6 +6010,11 @@ msgid "" "apacheconfig, which needs manual input. You can fake the configuration\n" "program so the installation can be fully automatic." msgstr "" +"- Utilisez `fai-divert -a` si un script postinst appelle un programme\n" +"de configuration, par exemple le script postinst pour le paquet apache\n" +"appelle apacheconfig, qui nécessite une entrée manuelle. Vous pouvez\n" +"contrefaire le programme de configuration pour que l’installation puisse\n" +"être entièrement automatique." #: fai-guide.txt:2475 msgid "" @@ -5788,6 +6026,13 @@ msgid "" "output from the postinst scripts on the console and get its input also\n" "from the console." msgstr "" +"- Parfois, l’installation semble s’arrêter, mais souvent il y a seulement\n" +"un script postinstall d’un logiciel qui nécessite une entrée manuelle de\n" +"la console. Passez à un autre terminal virtuel et regardez quel\n" +"processus fonctionne avec des outils comme `top(1)` et `pstree(1)`.\n" +"Vous pouvez ajouter _debug_ à _FAI_FLAGS_ pour faire en sorte que le\n" +"processus d’installation affiche toutes les sorties des scripts postinst\n" +"sur la console et obtenir son entrée aussi à partir de la console." #: fai-guide.txt:2481 msgid "" @@ -5797,6 +6042,11 @@ msgid "" "additional classes (for e.g. A,B,C) on the kernel command line add this: " "_ADDCLASSES=A,B,C_" msgstr "" +"- Comment puis-je définir des classes sur la ligne de commande du noyau ?\n" +"+\n" +"Lire la page de manuel de `fai-class(8)`. Si vous voulez définir quelques\n" +"classes supplémentaires (par exemple A; B, C) dans la commande du noyau,\n" +"ajoutez ceci : _ADDCLASSES=A,B,C_" #: fai-guide.txt:2493 msgid "" @@ -5811,6 +6061,18 @@ msgid "" "# fai-make-nfsroot -k\n" "----" msgstr "" +"- Comment utiliser un noyau personnalisé dans le nfsroot ?\n" +"+\n" +"Construisez votre noyau personnalisé en construisant un paquet kernelde " +"noyau à\n" +"l’aide de `make-kpkg(8)` et utilisez l’option `--initrd`. Copiez ce\n" +"paquet Debian dans un dépôt local et ajoutez-le à\n" +"/etc/fai/sources.list. Ajoutez le nom de votre paquet à\n" +"/etc/fai/NFSROOT. Ensuite appelez\n" +"+\n" +"----\n" +"# fai-make-nfsroot -k\n" +"----" #: fai-guide.txt:2498 msgid "" @@ -5818,6 +6080,10 @@ msgid "" "+\n" "https://wiki.fai-project.org/index.php/Use_nfsroot_for_diskless_clients" msgstr "" +"- Comment utiliser le nfsroot comme système pour les clients sans\n" +"disque ?\n" +"+\n" +"https://wiki.fai-project.org/index.php/Use_nfsroot_for_diskless_clients" #: fai-guide.txt:2506 msgid "" @@ -5828,6 +6094,14 @@ msgid "" "'/etc/fai-buster' and '/etc/fai-bookworm'. Then you need to set the\n" "+$NFSROOT+ variables to different directories and run" msgstr "" +"- Comment faire pour servir plusieurs arborescence nfsroot sur un\n" +"serveur FAI ?\n" +"+\n" +"Si vous souhaitez diffuser plusieurs répertoires nfsroot, vous devez\n" +"créer des répertoires de configuration spécifiques dans '/etc' pour FAI,\n" +"comme '/etc/fai-buster' et '/etc/fai-bookworm'. Ensuite, vous devez\n" +"définir les variables +$NFSROOT+ dans différents répertoires et\n" +"lancer" #: fai-guide.txt:2510 msgid "" @@ -5835,10 +6109,13 @@ msgid "" "faiserver#fai-make-nfsroot -C /etc/fai-buster\n" "----" msgstr "" +"----\n" +"faiserver#fai-make-nfsroot -C /etc/fai-buster\n" +"----" #: fai-guide.txt:2513 msgid "=== flag_reboot (FAI_FLAGS)" -msgstr "" +msgstr "=== flag_reboot (FAI_FLAGS)" #: fai-guide.txt:2517 msgid "" @@ -5846,10 +6123,15 @@ msgid "" "machine will reboot after the task faiend has finished. This is true\n" "for network as well as bootmedium installations." msgstr "" +"Si flag_reboot est défini, en ajoutant \"reboot\" à +$FAI_FLAGS+, votre\n" +"ordinateur client redémarrera après la fin de la tâche faiend. Ceci est " +"vrai\n" +"pour les installations par réseau ainsi que pour les installations par\n" +"media amorçable." #: fai-guide.txt:2520 msgid "=== [[logfiles]]Log files" -msgstr "" +msgstr "=== [[logfiles]]Fichiers journaux" #: fai-guide.txt:2528 msgid "" @@ -5861,12 +6143,21 @@ msgid "" "Log files are also created when doing the softupdate or dirinstall\n" "action." msgstr "" +"FAI crée plusieurs fichiers journaux. Pendant l’installation, ils sont\n" +"stockés dans '/tmp/fai' sur le client d’installation lui-même. A la fin\n" +"de l’installation, ils seront copiés sur le serveur d’installation (voir\n" +"<>). Une fois le client d’installation redémarré\n" +"dans son système nouvellement installé, vous pouvez trouver les journaux\n" +"FAI dans '/var/log/fai'. Les fichiers journaux sont également créés lors\n" +"de l’action softupdate ou dirinstall." #: fai-guide.txt:2531 msgid "" "On the faiserver, you can find the (remote) log files under the ~fai\n" "directory." msgstr "" +"Sur le faiserver, vous pouvez trouver les fichiers journaux (distants)\n" +"sous le répertoire ~fai." #: fai-guide.txt:2535 msgid "" @@ -5874,12 +6165,17 @@ msgid "" "available on https://fai-project.org/logs.\n" "These a some log files which are created by FAI." msgstr "" +"Des exemples de fichiers journaux d'ordinateurs installés avec succès\n" +"sont disponibles sur https://fai-project.org/logs. Ce sont quelques\n" +"fichiers journaux qui sont créés par FAI." #: fai-guide.txt:2538 msgid "" "FAI_CLASSES::\n" "Contains a list of all classes defined." msgstr "" +"FAI_CLASSES::\n" +" Contient une liste de toutes les classes définies." #: fai-guide.txt:2542 msgid "" @@ -5887,6 +6183,9 @@ msgid "" "Output of the `dmesg` command. Contains useful messages of the kernel\n" "ring buffer." msgstr "" +"dmesg.log::\n" +" La sortie de la commande `dmesg`. Contient des messages utiles de la\n" +" mémoire tampon du noyau." #: fai-guide.txt:2546 msgid "" @@ -5894,24 +6193,34 @@ msgid "" "The main log file. Contains all important information. You should\n" "*always* read this file." msgstr "" +"fai.log::\n" +" Le fichier journal principal. Contient toutes les informations\n" +" importantes. Vous devez *toujours* lire ce fichier." #: fai-guide.txt:2549 msgid "" "boot.log::\n" "A list of variables of network parameters, mostly defined by the DHCP daemon." msgstr "" +"boot.log::\n" +" Une liste de variables de paramètres de réseau, principalement définis\n" +" par le démon DHCP." #: fai-guide.txt:2552 msgid "" "format.log::\n" "Output of the partition tool `setup-storage(8)`." msgstr "" +"format.log::\n" +" Sortie de l’outil de partition `setup-storage(8)`." #: fai-guide.txt:2555 msgid "" "scripts.log::\n" "Output of all scripts, that are used for customization." msgstr "" +"scripts.log::\n" +"Sortie de tous les scripts, qui sont utilisés pour la personnalisation." #: fai-guide.txt:2559 msgid "" @@ -5919,12 +6228,17 @@ msgid "" "A list of all shell variables which are available during an\n" "installation." msgstr "" +"variables.log::\n" +" Une liste de toutes les variables shell qui sont disponibles au cours\n" +" d’une installation." #: fai-guide.txt:2562 msgid "" "error.log::\n" "A summary of possible errors in all log files." msgstr "" +"error.log::\n" +" Résumé des erreurs possibles dans tous les fichiers journaux." #: fai-guide.txt:2568 msgid "" @@ -5934,6 +6248,13 @@ msgid "" "devices. These information is used by some customization scripts\n" "(e.g. _GRUB_PC/10-setup_)." msgstr "" +"disk_var.sh::\n" +" Une liste des variables contenant des informations sur les\n" +" périphériques et les partitions à partir desquelles on démarre, la " +"partition\n" +" racine et une liste de périphériques de swap. Ces informations sont\n" +" utilisées par certains scripts de personnalisation (par exemple\n" +" _GRUB_PC/10-setup_)." #: fai-guide.txt:2578 msgid "" @@ -5944,10 +6265,17 @@ msgid "" "executed in a script. To be sure, you should look for more details in\n" "all log files." msgstr "" +"Si le processus d’installation se termine, le hook 'savelog.LAST.sh'\n" +"recherche dans tous les fichiers journaux les erreurs courantes et les\n" +"écrit dans le fichier 'error.log'. Donc, vous devriez d’abord regarder\n" +"dans ce fichier pour les erreurs. Le fichier 'status.log' vous donne\n" +"également le code de sortie de la dernière commande exécutée dans un\n" +"script. Pour être sûr, vous devrez rechercher plus de détails dans tous\n" +"les fichiers journaux." #: fai-guide.txt:2581 msgid "=== How to use HTTP for PXE boot" -msgstr "" +msgstr "=== Comment utiliser HTTP pour le démarrage PXE" #: fai-guide.txt:2585 msgid "" @@ -5955,6 +6283,10 @@ msgid "" "supports transfer of the kernel and initrd via http (additional to tftp).\n" "You only have to enable HTTP access to the tftp directory:" msgstr "" +"fai-make-nfsroot utilise maintenant le fichier binaire lpxelinux.0 qui\n" +"prend en charge déjà le transfert du noyau et du fichier initrd via http\n" +"(en plus de tftp). Il vous suffit d'activer un accès HTTP au répertoire tftp " +":" #: fai-guide.txt:2590 msgid "" @@ -5963,10 +6295,14 @@ msgid "" "ln -s /srv/tftp/fai\n" "----" msgstr "" +"----\n" +"cd /var/www/html\n" +"ln -s /srv/tftp/fai\n" +"----" #: fai-guide.txt:2592 msgid "Add '-U URL' to the 'fai-chboot' call. For example:" -msgstr "" +msgstr "Ajoutez '-U URL' à l’appel 'fai-chboot'. Par exemple :" #: fai-guide.txt:2596 msgid "" @@ -5974,14 +6310,17 @@ msgid "" "fai-chboot -U http://faiserver/fai -IFv .......\n" "----" msgstr "" +"----\n" +"fai-chboot -U http://faiserver/fai -IFv .......\n" +"----" #: fai-guide.txt:2598 msgid "== [[troubleshoot]]Troubleshooting" -msgstr "" +msgstr "== [[troubleshoot]]Dépannage" #: fai-guide.txt:2600 msgid "=== [[booterror]]Boot errors" -msgstr "" +msgstr "=== [[booterror]]Erreurs d’amorçage" #: fai-guide.txt:2604 msgid "" @@ -5989,6 +6328,9 @@ msgid "" "get an answer from a DHCP server. Check your cables or start the\n" "`dhcpd(8)` daemon with the debug flag enabled." msgstr "" +"Le message d’erreur suivant indique que votre client d’installation\n" +"n’obtient pas de réponse d’un serveur DHCP. Vérifiez vos câbles ou\n" +"démarrez le démon `dhcpd(8)` avec l'option debug activée." #: fai-guide.txt:2609 msgid "" @@ -5997,12 +6339,19 @@ msgid "" " Network boot aborted\n" "____" msgstr "" +"____\n" +" PXE-E51: No DHCP or BOOTP offers received\n" +" Network boot aborted\n" +"____" #: fai-guide.txt:2612 msgid "" "If you do not see the following message, the install kernel could not\n" "detect your network card, for example because of a missing driver:" msgstr "" +"Si vous ne voyez pas le message suivant, le noyau d’installation n’a pas\n" +"pu détecter votre carte réseau, par exemple en raison d’un pilote\n" +"manquant :" #: fai-guide.txt:2618 msgid "" @@ -6012,6 +6361,11 @@ msgid "" "dhcp: BOND setting eth\n" "----" msgstr "" +"----\n" +"Starting dhcp for interface eth0\n" +"dhcp: PREINIT eth0 up\n" +"dhcp: BOND setting eth\n" +"----" #: fai-guide.txt:2625 msgid "" @@ -6023,6 +6377,14 @@ msgid "" "You may also add a driver to +/srv/fai/nfsroot/etc/dracut.conf+ in\n" "the line +add_drivers+++=+." msgstr "" +"Vérifiez le fichier initrd dans le nfsroot (`lsinird`) pour voir\n" +"si le pilote du noyau de\n" +"votre carte réseau est inclus et vérifiez si vous souhaitez ajouter le\n" +"paquet 'firmware-linux-nonfree' dans +/etc/fai/NFSROOT` puis\n" +"reconstruisez le fichier initrd en appelant `fai-make-nfsroot -k`. Vous " +"pouvez\n" +"également ajouter un pilote à +/srv/fai/nfsroot/etc/dracut.conf+ dans\n" +"la ligne +add_drivers+++=+." #: fai-guide.txt:2631 msgid "" @@ -6031,6 +6393,10 @@ msgid "" "directory to the install clients, This is often caused by missing\n" "NFS permissions on the server side." msgstr "" +"Voici le message d’erreur que vous verrez, lorsque votre carte réseau\n" +"fonctionne, mais le serveur d’installation n’exporte pas le répertoire\n" +"nfsroot vers les clients d’installation. Cela est souvent dû aux\n" +"permissions NFS manquantes du côté serveur." #: fai-guide.txt:2644 msgid "" @@ -6048,6 +6414,19 @@ msgid "" "dracut:/#\n" "----" msgstr "" +"----\n" +"Starting dhcp for interface eth0\n" +"dhcp: PREINIT eth0 up\n" +"dhcp: BOND setting eth\n" +"mount.nfs: access denied by server while mounting 192.168.33.250:/srv/fai/" +"nfsroot\n" +".\n" +".\n" +"dracut Warning: Could not boot\n" +".\n" +"Dropping to debug shell\n" +"dracut:/#\n" +"----" #: fai-guide.txt:2649 msgid "" @@ -6056,6 +6435,11 @@ msgid "" "For more information about debugging the early boot process using\n" "dracut see `dracut.cmdline(7)`" msgstr "" +"Maintenant, vous êtes à l’intérieur du shell d’urgence de l’initrd qui a\n" +"été créé par 'dracut(8)'. Vous obtiendrez une invite du shell et pourrez\n" +"consulter les fichiers journaux. Pour plus d’informations sur le\n" +"débogage du processus de démarrage précoce à l’aide de dracut, consultez\n" +"`dracut.cmdline(7)`" #: fai-guide.txt:2652 msgid "" @@ -6063,6 +6447,9 @@ msgid "" "exported\n" "from the install server (named faiserver):" msgstr "" +"Utilisez la commande suivante sur le serveur d’installation pour voir\n" +"quels répertoires sont exportés à partir du serveur d’installation\n" +"(nommé faiserver) :" #: fai-guide.txt:2655 msgid "" @@ -6070,3 +6457,14 @@ msgid "" "$ showmount -e faiserver\n" "----" msgstr "" +"----\n" +"$ showmount -e faiserver\n" +"----" + +#~ msgctxt "fai-guide.txt:525" +#~ msgid "or" +#~ msgstr "or" + +#~ msgctxt "fai-guide.txt:2154" +#~ msgid "or" +#~ msgstr "or" From e579ecc889bebaf2d310277c1113b43d7bda5c02 Mon Sep 17 00:00:00 2001 From: Georges Khaznadar Date: Sat, 25 Oct 2025 14:19:14 +0200 Subject: [PATCH 8/9] ignore non-source fines --- doc/.gitignore | 8 + doc/fai-guide.html | 4319 --------------------------------------- doc/fai-guide.pdf | Bin 281933 -> 0 bytes doc/fai-guide.text | 2785 ------------------------- doc/fai-guide_fr.html | 4476 ----------------------------------------- doc/fai-guide_fr.pdf | Bin 299310 -> 0 bytes doc/fai-guide_fr.text | 3027 ---------------------------- 7 files changed, 8 insertions(+), 14607 deletions(-) create mode 100644 doc/.gitignore delete mode 100644 doc/fai-guide.html delete mode 100644 doc/fai-guide.pdf delete mode 100644 doc/fai-guide.text delete mode 100644 doc/fai-guide_fr.html delete mode 100644 doc/fai-guide_fr.pdf delete mode 100644 doc/fai-guide_fr.text diff --git a/doc/.gitignore b/doc/.gitignore new file mode 100644 index 000000000..001bf8c28 --- /dev/null +++ b/doc/.gitignore @@ -0,0 +1,8 @@ +# for emacs +*~ + +# files computed from asciidoc sources + +*.text +*.pdf +*.html diff --git a/doc/fai-guide.html b/doc/fai-guide.html deleted file mode 100644 index c257fe39d..000000000 --- a/doc/fai-guide.html +++ /dev/null @@ -1,4319 +0,0 @@ - - - - - - -FAI Guide (Fully Automatic Installation) - - - - -

    -
    -
    -
    -

    An older French version of this guide is available at https://fai-project.org/fai-guide-fr.

    -
    -
    -
    -

    Abstract

    -
    -

    FAI is a non-interactive system to install, customize and manage Linux -systems and software configurations on computers as well as virtual -machines and chroot environments, from small networks to large -infrastructures and clusters.

    -

    This manual describes the Fully Automatic Installation software. This -includes the installation of the packages, setting up the server, creating of the -configuration and how to deal with errors.

    -

    (c) 2000-2025 Thomas Lange

    -
    Copyright

    This manual is free software; you may redistribute it and/or modify it -under the terms of the GNU General Public License as published by the -Free Software Foundation; either version 2, or (at your option) any -later version.

    -

    This is distributed in the hope that it will be useful, but without -any warranty; without even the implied warranty of merchantability or -fitness for a particular purpose. See the GNU General Public License -for more details.

    -

    A copy of the GNU General Public License is available as -/usr/share/common-licenses/GPL in the Debian GNU/Linux distribution -or on the World Wide Web at the -GNU website You can also obtain it by writing to the Free Software -Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.

    -
    -
    -
    -
    -

    Introduction

    -
    -
    -

    Availability

    -
    -
    -Homepage -
    -
    -

    -https://fai-project.org -

    -
    -
    -FAI wiki -
    -
    -

    -https://wiki.fai-project.org -

    -
    -
    -Download -
    -
    -

    -https://fai-project.org/download -

    -
    -
    -Entry for sources.list -
    -
    -

    -deb https://fai-project.org/download bookworm koeln -

    -
    -
    -Manual pages -
    -
    -

    -https://fai-project.org/doc/man/ -

    -
    -
    -Mailing list -
    -
    -

    -https://lists.uni-koeln.de/mailman/listinfo/linux-fai -

    -
    -
    -Feedback -
    -
    -

    -Send feedback and comments to fai@fai-project.org or -to the mailing list. -

    -
    -
    -Bugs -
    -
    -

    -Use the Debian bug tracking system (BTS) https://bugs.debian.org/src:fai -

    -
    -
    -User visible changes -
    -
    -

    -https://fai-project.org/NEWS -

    -
    -
    -Source tree via git -
    -
    -

    -git clone git://github.com/faiproject/fai.git -

    -
    -
    -View source tree via https -
    -
    -

    -https://github.com/faiproject/fai -

    -
    -
    -

    The man pages always include up-to-date information and a lot of -details of all FAI commands. So, don’t forget to read them carefully. -Now read this manual, then enjoy the fully automatic installation and -your saved time.

    -
    -
    -

    Motivation

    -

    Have you ever performed identical installations of an operating system -several times? Would you like to be able to install a Linux cluster -with dozens of nodes single handedly?

    -

    Repeating the same task again and again is boring — and will surely -lead to errors. Also a whole lot of time could be saved if the -installations were done automatically. An installation process with -manual interaction does not scale. But clusters have the habit of -growing over the years. Think long-term rather than planning just a -few months into the future.

    -

    In 1999, I had to perform an installation of a Linux cluster with one -server and 16 clients. Since I had much experience doing automatic -installations of Solaris operating systems on SUN SPARC hardware, the -idea to build an automatic installation for Debian was born. Solaris -has an automatic installation feature called JumpStart -
    [Solaris 8 Advanced Installation Guide at -https://docs.oracle.com/cd/E19455-01/806-0957/806-0957.pdf -]
    . In conjunction with the auto-install scripts -from Casper Dik -
    [http://www.science.uva.nl/pub/solaris/auto-install]
    , I could -save a lot of time not only for every new SUN computer, but also for -re-installation of existing workstations. For example, I had to build -a temporary LAN with four SUN workstations for a conference, which -lasted only a few days. I took these workstations out of our normal -research network and set up a new installation for the conference. -When it was over, I simply integrated the workstations back into the -research network, rebooted just once, and after half an hour, -everything was up and running as before. The configuration of all -workstations was exactly the same as before the conference, because -everything was performed by the same installation process. I also used -the automatic installation for reinstalling a workstation after a -damaged hard disk had been replaced. It took two weeks until I -received the new hard disk but only a few minutes after the new disk -was installed, the workstation was running as before. And this is why -I choose to adapt this technique to a PC cluster running Linux.

    -
    -
    -

    How does FAI work

    -

    The install client which will be installed using FAI, is booted via -network card or from CD or USB stick. It gets an IP address and boots -a Linux kernel which mounts its root file system via NFS (the nfsroot) -from the -install server. After the kernel is started, the FAI startup script -performs the automatic installation which doesn’t need any -interaction. First, the hard disks will be partitioned, file systems -are created and then software packages are installed. After that, the -new installed operating system is configured to your local needs using -some scripts. Finally, the new operating system will be booted from the -local disk.

    -

    The details of how to install the computer (the configuration) are -stored in the configuration space on the install server. Configuration -files are shared among groups of computers if they are similar using -the class concept. So you need not create a configuration for every -new host. Hence, FAI is a scalable method to install a big cluster -with a great number of nodes even if their configuration is not identical.

    -

    FAI can also be used as a rescue system or for hardware inventory. You can boot your -computer, but it will not perform an installation. Instead it will run -a fully functional Debian GNU/Linux without using the local hard -disks. Then you -can do a remote login and backup or restore a disk partition, check a -file system, inspect the hardware or do any other task.

    -
    -
    -

    Features

    -
      -
    • -

      -A fully automated installation can be performed. -

      -
    • -
    • -

      -Very quick unattended installation. -

      -
    • -
    • -

      -Flexible system through easy class concept. -

      -
    • -
    • -

      -Update of running systems without re-installation. -

      -
    • -
    • -

      -Cloud images for virtualization environment. -

      -
    • -
    • -

      -Hosts can boot from network card, CD, USB stick. -

      -
    • -
    • -

      -Simple creation of an installation or live ISO. -

      -
    • -
    • -

      -PXE with DHCP boot method is supported. -

      -
    • -
    • -

      -ReiserFS, ext3/ext4, btrfs and XFS file system support. -

      -
    • -
    • -

      -Software RAID and LVM support. LUKS support. -

      -
    • -
    • -

      -Automatic hardware detection. -

      -
    • -
    • -

      -You can deploy Debian, Ubuntu, Rocky Linux, CentOS, AlmaLinux, SuSE -

      -
    • -
    • -

      -Remote login via ssh during installation process possible. -

      -
    • -
    • -

      -All similar configurations are shared among all install clients. -

      -
    • -
    • -

      -Log files for all installations are saved to the installation server. -

      -
    • -
    • -

      -Shell, Perl, Python, Ruby, expect and CFEngine scripts are supported during the customization step. -

      -
    • -
    • -

      -Support for many protocols like NFS, FTP, HTTPS, git. -

      -
    • -
    • -

      -Can be used as a rescue system and for hardware inventory. -

      -
    • -
    • -

      -Diskless client support. -

      -
    • -
    • -

      -Cross-architecture support e.g. for embedded devices. -

      -
    • -
    • -

      -Easily add your own functions via hooks or change the default behavior. -

      -
    • -
    • -

      -Cloning machines using disk images is supported. -

      -
    • -
    -
    -
    -

    Installation times

    -

    The installation time is determined by the amount of software and -the speed of the hard disk. Here are some sample -times. All install clients had a 1Gbit network card installed.

    -
    - ------ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    CPU RAM Disk Software installed time

    i7-3770T 2.50GHz

    8GB

    SSD

    6 GB software

    8.5 min

    Core-i7 3.2GHz

    6GB

    SATA disk

    4.3GB software

    7 min

    Core-i7 3.2GHz

    6GB

    SATA disk

    471 MB software

    77sec

    Intel Core2 Duo

    2GB

    SATA disk

    3 GB software

    14 min

    -
    -
    -
    -
    -
    -

    Quickstart - For the impatient user

    -
    -
    -

    My first installation

    -

    Without further ado, this section will provide a quick and easy demonstration of a fully automatic installation using the FAI CD and a virtual machine.

    -

    Just download the CD ISO image from https://fai-project.org/fai-cd and boot -your VM using this CD. You will see a grub menu where you can select -from different installation types.

    -

    This installation will run without an install server. The CD -installation is the same as when run in a network environment using -the FAI install server and can also be used from USB stick on a real -computer.

    -

    You can also create yourself a custom fully automated installation -image on the webpage https://fai-project.org/FAIme without the need of -installing FAI on your computer.

    -
    -
    -

    My first server installation

    -

    We will create a private network and start two virtual machines. One -will become your own FAI server, the other will be an install client.

    -

    If you intend to use VMware or VirtualBox, ensure that your client -uses a bridged network connection. A detailed description is in the -FAI wiki -
    [https://wiki.fai-project.org/index.php/VirtualBox_for_your_first_FAI_installation]
    . Also, -it is not possible to use -bridged network interfaces over wireless, as most WiFi network cards -do not support this feature.

    -

    When using Qemu/KVM and the fai-kvm wrapper you can create the -network using the command fai-mk-network. First install some packages

    -
    -
    -
    # apt-get install qemu-system-gui qemu-kvm qemu-utils
    -
    -

    The next command sets up a private network with a software bridge with several tap devices -that belong to the user <username>.

    -
    -
    -
    fai-mk-network <username>
    -
    -

    After that, you can use fai-kvm (-h will give you some help) for -starting virtual machines using KVM that are connected to this private -network. Be careful. By default, fai-kvm will create the disk images -for the virtual machines in /tmp, which is a RAM disk on most -systems. It’s no problem to create an empty 20G disk image in /tmp -(even if this partition is of 4GB size), but while the VM is writing -data to its disk, this will start to consume space in /tmp.

    -

    Start the first virtual host, which will become the FAI server -
    [This installation will consume about 2GB of space in -/tmp.]
    :

    -
    -
    -
    fai-kvm -Vn -s20 -u 1 cd faicd64-small.iso
    -
    -

    In the grub menu select faiserver, using internal DHCP and a fixed IP. This will install a host called -faiserver with IP 192.168.33.250 which contains all software needed -for a FAI server. It will also set up a local package cache (using -apt-cacher-ng). Once the installation is finished, reboot the -machine. During the first boot of the new system, it will -automatically set up the nfsroot. This may take some minutes.

    -

    After that you can start additional hosts using network boot. For -every new host, you have to use a different value for -u, which will be used for -generating different MAC addresses and using different disk image file -names.

    -
    -
    -
    fai-kvm -Vn -u 2 pxe
    -
    -

    Those install clients will show you a menu, where you can select which -type of installation you like to perform. If the install client does -not find the server, it is usually because fai-monitor is no longer -running on it. This can happen, if you reboot the faiserver after the -installation. To remedy this, simply run fai-monitor on the faiserver -and re-attempt the client boot.

    -

    Another client could be started with:

    -
    -
    -
    fai-kvm -Vn -u 3 pxe
    -
    -

    You can start as many machines in the network as tap devices are -available. All these machines can connect to the outside internet but are -only reachable from your host machine.

    -
    -
    -
    -
    -

    Overview and Concepts

    -
    -

    FAI is a non-interactive system to install, customize and manage Linux -systems and software configurations on computers as well as virtual -machines and chroot environments, from small networks to large -infrastructures and clusters. You can take one or more virgin PCs, -turn on the power and after a few minutes Linux is installed, -configured and running on the whole cluster, without any interaction -necessary. Thus, it’s a scalable method for installing and updating a -cluster unattended with little effort involved. FAI uses the -Linux operating system and a collection of shell and Perl scripts for -the installation process. Changes to the configuration files of the -operating system can be made by CFEngine, shell (bash and zsh), Perl, -Python, Ruby and expect scripts.

    -

    FAI’s target group are system administrators who have to install Linux -onto one or even hundreds of computers. Because it’s a general purpose -installation tool, it can be used for installing a Beowulf cluster, a -rendering farm or a Linux laboratory or a classroom. Also large-scale -Linux networks with different hardware or different installation -requirements are easy to establish using FAI. But don’t forget to plan -your installation. Chapter [plan] has some useful hints for this -topic.

    -
    -

    Important Terms

    -

    First, some terms used in this manual are described.

    -
    -
    -install server -
    -
    -

    -It provides DHCP, TFTP and NFS services and the configuration data for -all install clients. In the examples of this manual this host is -called faiserver. The host where the package fai-server is installed. -

    -
    -
    -install client -
    -
    -

    -A host which will be installed using FAI and a configuration provided -by the install server. Also called client for short. In this manual, -the example hosts are called demohost, xfcehost, gnomehost … -This computer should boot from its network interface using PXE. -

    -
    -
    -configuration space -
    -
    -

    -A subdirectory structure containg several files. Those files describe -the details of how the installation of the clients will be -performed. All configuration data is stored here. It’s also called -config space for short. It includes information about: -

    -
      -
    • -

      -Hard disk layout in a format similar to fstab -

      -
    • -
    • -

      -Local file systems, their types, mount points and mount options -

      -
    • -
    • -

      -Software packages -

      -
    • -
    • -

      -Keyboard layout, time zone, Xorg configuration, remote file - systems, user accounts, printers … -

      -
    • -
    -

    The package fai-doc includes a sample configuration space including -examples for hosts using the XFCE and GNOME environment amongst other -examples. Calling fai-mk-configspace copies these examples to -/srv/fai/config. It’s recommended to study those config files and -scripts for easier understanding how FAI works.

    -
    -
    -nfsroot, NFS-Root -
    -
    -

    -A file system located on the install server. During the installation -process it’s the complete file system for the install clients. All -clients share the same nfsroot, which they mount read only. The -nfsroot needs about 1.1GB of free disk space. -

    -
    -
    -TFTP -
    -
    -

    -Serves clients the initrd and kernel that is used for the installation process. -Along with the file system served by NFS, these two make up a temporary -OS in which the installations are performed. -

    -
    -
    -FAI classes -
    -
    -

    -Classes are names which determine which configuration file is -selected. If a client belongs to class WEBSERVER, it will be configured -as a webserver, the class DESKTOP for e.g. determines which software -packages will be installed. -

    -
    -
    -profile -
    -
    -

    -A FAI profile is just a list of FAI classes assiged to a profile name, -which is extended by a description of this profile. I.e. one could have -two "Webserver" profiles, one including the APACHE class another including the NGINX class, -to then install the respective webserver solution. -

    -
    -
    -tasks -
    -
    -

    -The installation of a client consists of several parts, which are called tasks. -Tasks are predefined subroutines which perform a certain part of the -FAI. The following FAI tasks are performed during an installation -on the install clients. -

    -
    -
    -
    -
    -
    -
    -
    confdir               # get the config space
    -setup                 # some initialization, start sshd on demand
    -defclass              # define FAI classes
    -defvar                # define variables
    -action                # evaluate FAI_ACTION
    -install               # Start the installation
    -partition             # partition the harddisks, create file systems
    -mountdisks            # mount the file systems
    -extrbase              # extract the base.tar.xz
    -debconf               # do the Debian debconf preseeding
    -repository            # prepare access to the package repository
    -updatebase            # Set up package tools and update packages
    -instsoft              # install software packages
    -configure             # call customization scripts
    -finish                # do some cleanup, show installation statistics
    -tests                 # call tests if defined
    -chboot                # call fai-chboot on the install server
    -savelog               # save log files to local and remote location
    -faiend                # reboot host, eject CD if needed
    -
    -
    -
    -
    -
    -
    -

    These are tasks, which are only executed when a different action is performed

    -
    -
    -
    dirinstall           # install a chroot environment
    -softupdate           # only do the system configuration
    -sysinfo              # print detailed system information
    -inventory            # print short hardware inventory list
    -
    -
    -
    -
    -

    For a more in-depth description of tasks , see [tasks].

    -

    Note that you are not limited to the FAI tasks. You can also define additional programs or scripts which will be run -on particular occasions. They are called hooks.

    -
    -
    -hooks -
    -
    -

    -Hooks are plugins, they can add additional functionality to the installation process -or even replace entire tasks of FAI. Hooks are explained in detail in -[hooks]. -

    -
    -
    -
    -
    -

    The class concept

    -

    Classes are used in nearly all tasks of the installation. Classes -determine which configuration files to choose from a list of available -alternatives. To determine which config files to use, FAI searches the -list of defined classes and uses all configuration files that match a -class name
    [It’s also possible to use only the configuration -file with the highest priority since the order of classes define a -priority from low to high within the list of classes. ]
    . The following loop implements -this function in pseudo shell code:

    -
    -
    -
    for class in $all_classes; do
    -   if [ -r $config_dir/$class ]; then      # if a file with name $class exists
    -      your_command $config_dir/$class      # call a command with this file name
    -      # exit if only the first matching file is needed
    -   fi
    -done
    -
    -

    The very nice feature of this is that you can add a new configuration -alternative and it will automatically be used by FAI without changing -the code, if the configuration file uses a class name.

    -

    This is because the loop automatically detects new configuration files -that should be used. -The idea of using classes in general and using certain files matching -a class name for a configuration is adopted from the installation -scripts by Casper Dik for Solaris. This technique proved to be very -useful and easy.

    -

    You can group multiple hosts that share the same configuration -files by using the same class. You can also split the whole -configuration data for all clients into several classes and use them -like lego bricks and build the entire configuration for a single -client by assembling the bricks together.

    -

    If a client belongs to class A, we say the class A -is defined for this client. A class has no value, it is just defined or -undefined.

    -

    Classes determine how the installation is performed. For example, an install -client can be configured to get the XFCE desktop by just adding the -class XFCE to it. Naturally, also more granular configurations are possible. For instance, classes can describe how the hard disk should be partitioned, they can -define which software packages will be installed, or which -customization steps are performed.

    -

    Often, a client configuration is created by only changing or appending the -classes to which this client belongs, making the installation of a new -client very easy. Thus no additional information needs to be added to -the configuration space if the existing classes suffice for your -needs.

    -

    As you can see, classes are a central pillar of customizing your configuration space and with that your client installation. On how to define your own classes, refer to [defining classes].

    -
    -
    -
    -
    -

    Setup your faiserver

    -
    -

    Here’s how to set up the install server in a few minutes. Following -steps are needed:

    -
      -
    1. -

      -Set up the install server -

      -
        -
      1. -

        -Install FAI packages -

        -
      2. -
      3. -

        -Create the nfsroot -

        -
      4. -
      5. -

        -Copy the examples to the config space -

        -
      6. -
      7. -

        -Configure network daemons -

        -
      8. -
      9. -

        -Create the PXELINUX configurations -

        -
      10. -
      -
    2. -
    3. -

      -Boot and install clients -

      -
    4. -
    -
    -

    Install the FAI packages

    -
      -
    • -

      -Install the key of the FAI project package repository. -

      -
    • -
    • -

      -Add the URL of the package repository of the FAI project. -

      -
    • -
    • -

      -Install the package fai-quickstart on your install server. -

      -
    • -
    -

    Use these commands for installing:

    -
    -
    -
    # wget -O /etc/apt/trusted.gpg.d/fai-project.gpg https://fai-project.org/download/2BF8D9FE074BCDE4.gpg
    -# echo "deb http://fai-project.org/download bookworm koeln" > /etc/apt/sources.list.d/fai.list
    -
    -

    or

    -
    -
    -
    # apt install extrepo ; extrepo enable fai
    -
    -

    and then

    -
    -
    -
    # apt-get update
    -# aptitude install fai-quickstart
    -
    -

    This will also install the packages for DHCP, TFTP and NFS server daemons.

    -
    -
    -

    Create the nfsroot

    -
      -
    • -

      -Also enable the package repository of the FAI project in a different - sources.list file which is used when building the nfsroot. Then, - enable the log user for FAI. -

      -
    • -
    -
    -
    -
    # sed -i -e 's/^#deb/deb/' /etc/fai/apt/sources.list
    -# sed -i -e 's/#LOGUSER/LOGUSER/' /etc/fai/fai.conf
    -
    -
      -
    • -

      -By default, FAI uses http://deb.debian.org as package - mirror, which should attempt to find a fast package repository for you.
      [If you want to use a faster mirror, adjust the URL - in /etc/fai/apt/sources.list and FAI_DEBOOTSTRAP in /etc/fai/nfsroot.conf before calling fai-setup.]
      -Now, we can run fai-setup(8)
      [This will call fai-make-nfsroot(8) internally.]
      -and check if everything went well. -The log file is written to /var/log/fai/fai-setup.log. -

      -
    • -
    -
    -
    -
    # fai-setup -v
    -
    -
    -
    -
    -
    FAI packages and related packages inside the nfsroot:
    -dracut             059-4
    -dracut-live        059-4
    -dracut-network     059-4
    -dracut-squash      059-4
    -fai-client         6.2
    -fai-nfsroot        6.2
    -fai-setup-storage  6.2
    -Waiting for background jobs to finish
    -fai-make-nfsroot finished properly.
    -Log file written to /var/log/fai/fai-make-nfsroot.log
    -Adding line to /etc/exports: /srv/fai/config 192.168.33.250/24(async,ro,no_subtree_check)
    -Adding line to /etc/exports: /srv/fai/nfsroot 192.168.33.250/24(async,ro,no_subtree_check,no_root_squash)
    -Reloading nfs-kernel-server configuration (via systemctl): nfs-kernel-server.service.
    -
    -Your initial config space is now located in /srv/fai/config
    -Please don't forget to fill out the FAI questionnaire after you've finished your project with FAI.
    -
    -FAI setup finished.
    -Log file written to /var/log/fai/fai-setup.log
    -
    -
      -
    • -

      -fai-setup has created the LOGUSER, the nfsroot and has added - additional lines to /etc/exports. The subdirectories added to - /etc/exports are exported via NFS v3, so all install clients in the - same subnet can mount them via NFS. -

      -
    • -
    -
    -
    -

    Creating the configuration space

    -

    Install the simple examples into the configuration space -
    [These files need not belong to the root account.]
    .

    -
    -
    -
    $ fai-mk-configspace
    -
    -

    These examples contain configuration for some sample -hosts. Depending on the host name used, your computer will be -configured as follows:

    -
    -
    -demohost -
    -
    -

    -A machine which needs only a small hard disk. This machine is -configured with network as DHCP client, and an account demo is -created. -

    -
    -
    -xfcehost -
    -
    -

    -A XFCE desktop is installed, using LVM, and the account demo is created. -

    -
    -
    -gnomehost -
    -
    -

    -A GNOME desktop is installed, and the account demo is created. -

    -
    -
    -ubuntuhost -
    -
    -

    -A Ubuntu desktop will be installed, and the account demo is created. -

    -
    -
    -other host names -
    -
    -

    -Hosts with another host name will most notably use the classes FAIBASE, -DHCPC and GRUB. -

    -
    -
    -

    All hosts will have an account called demo with password fai. The -root account also has the password fai.

    -

    If the FAI flag menu is added, instead of using the host name for -determing the type of installation, a menu is presented, and the user -can choose a profile for the installation.

    -
    -
    -

    Configure the network daemons

    -

    For booting the install client via PXE, the install server needs a DHCP and a -TFTP daemon running. The package fai-quickstart has already installed the -software packages for those daemons. Additionally the package of the NFS -server for exporting the nfsroot and the config space was installed.

    -
    -

    Configuration of the DHCP daemon

    -

    Ideally, your faiserver should also be your DHCP server. If that is -not the case, instruct the admin responsible of the DHCP server to -configure it according to this section. Optionally, it is possible to -avoid that by using the [autodiscover] feature released in FAI 5.0.

    -

    An example for dhcpd.conf(5) is provided with the fai-doc -package. Start using this example and look at all options used therein.

    -
    -
    -
    # cp /usr/share/doc/fai-doc/examples/etc/dhcpd.conf /etc/dhcp/
    -
    -

    The only FAI specific information inside this configuration file is to -set filename (DHCP option 67) to fai/pxelinux.0 and to set -next-server (DHCP option 66, also called TFTP server name) and -server-name to the name of your install server. All other -information is only network related data, which is used in almost all -DHCP configurations. Adjust these network parameters to your local -needs.

    -
    -
    -
    deny unknown-clients;
    -option dhcp-max-message-size 2048;
    -use-host-decl-names on;
    -
    -subnet 192.168.33.0 netmask 255.255.255.0 {
    -   option routers 192.168.33.250;
    -   option domain-name "my.example";
    -   option domain-name-servers 192.168.33.250;
    -   option time-servers faiserver;
    -   option ntp-servers faiserver;
    -   server-name faiserver;
    -   next-server faiserver;
    -   filename "fai/pxelinux.0";
    -}
    -
    -

    If you make any changes to the DHCP configuration, you must -restart the daemon.

    -
    -
    -
    # invoke-rc.d isc-dhcp-server restart
    -
    -

    If you have multiple network interfaces, you -can define on which interface the server will listen in -/etc/default/isc-dhcp-server. By default, the DHCP daemon writes its -log messages to /var/log/daemon.log.

    -
    -
    -

    Adding a host entry to DHCP

    -

    The MAC address is given by the hardware of the network card. For each -install client you collect its MAC address and to map it to an IP address and to a host -name. First, we add the IP address and the hostname to /etc/hosts -
    [You may also add this into your Domain Name System (DNS)]
    .

    -
    -
    -
    192.168.33.100    demohost
    -
    -

    The mapping from the MAC address to the IP address is done in the -dhcpd.conf file. Here, we add a host entry using the command dhcp-edit(8). -Here you have to replace 01:02:03:AB:CD:EF ith the MAC you have found.

    -
    -
    -
    # dhcp-edit demohost 01:02:03:AB:CD:EF
    -
    -

    After calling this command, this is what the host entry in -dhcpd.conf will look like:

    -
    -
    -
    host demohost {hardware ethernet 01:02:03:AB:CD:EF;fixed-address demohost;}
    -
    -
    -
    -

    TFTP

    -

    Normally, you do not need any changes to the TFTP dameon -configuration. The files which are provided by TFTP are located in -/srv/tftp/fai.

    -
    -
    -

    NFS

    -

    The command fai-setup has already set up the NFS daemon and added -some lines to the configuration file /etc/exports. -It exports the directories using NFS v3.

    -
    -
    -
    -

    Creating the PXELINUX configuration

    -

    The last step before booting your client for the first time -is to specify what configuration the client should boot when doing PXE -boot. We use the command fai-chboot(8) to create a pxelinux -configuration for each install client. This includes information about -the kernel, the initrd, the config space and some boot parameters. You -should read the manual page, which gives you some good examples. -Here’s the command for starting the installation for the host demohost.

    -
    -
    -
    $ fai-chboot -IFv -u nfs://faiserver/srv/fai/config demohost
    -
    -Booting kernel vmlinuz-4.19.0-5-amd64
    - append initrd=initrd.img-4.19.0-5-amd64 ip=dhcp
    -   FAI_FLAGS=verbose,sshd,createvt FAI_CONFIG_SRC=nfs://faiserver/srv/fai/config
    -
    -demohost has 192.168.33.100 in hex C0A82164
    -Writing file /srv/tftp/fai/pxelinux.cfg/C0A82164 for demohost
    -
    -

    At this point, you should have a working faiserver setup and your clients should boot into FAI and be able to install one of the examples.

    -

    In the following section, you can read about planning your installation, tailoring your configuration space to your particular needs and extending FAI using hooks.

    -
    -
    -

    Custom server

    -

    The faiserver and its setup is by no means static. It is possible to customize and extend your server. For this, please refer to the [Customizing your install server setup] section in [advanced].

    -
    -
    -
    -
    -

    Plan your installation

    -
    -

    Before starting your installation, you should invest a lot of time into -planning your installation. Once you’re happy with your installation -concept, FAI can do all the boring and repetitive tasks to turn your -plans into reality. FAI can’t do good installations if your concept is -imperfect or lacks some important details. Start planning the -installation by answering the following questions:

    -
      -
    • -

      -Will I create a Beowulf cluster, or do I have to install some desktop machines? -

      -
    • -
    • -

      -What does my LAN topology look like? -

      -
    • -
    • -

      -Do I have uniform hardware? Will the hardware stay uniform in the future? -

      -
    • -
    • -

      -Does the hardware need a special kernel? -

      -
    • -
    • -

      -How should the hosts be named? -

      -
    • -
    • -

      -How should the local hard disks be partitioned? -

      -
    • -
    • -

      -Which applications will be run by the users? -

      -
    • -
    • -

      -Do the users need a queuing system? -

      -
    • -
    • -

      -What software should be installed? -

      -
    • -
    • -

      -Which daemons should be started, and what should the configuration for these look like? -

      -
    • -
    • -

      -Which remote file systems should be mounted? -

      -
    • -
    • -

      -How should backups be performed? -

      -
    • -
    -

    You also have to think about user accounts, printers, a mail system, -cron jobs, graphic cards, dual boot, NIS, NTP, timezone, keyboard -layout, exporting and mounting directories via NFS and many other -things. So, there’s a lot to do before starting an installation. And -remember that knowledge is power, and it’s up to you to use -it. Installation and administration is a process, not a product. FAI -can’t do things you don’t tell it to do.

    -

    You don’t need to start from scratch. Look at the files and scripts in -the configuration space. There are a lot of things you can use for -your own installation. A good paper called "Bootstrapping an -Infrastructure" with more aspects of building an infrastructure is -available at http://www.infrastructures.org/papers/bootstrap/bootstrap.html

    -
    -

    The configuration space and its subdirectories

    -

    The configuration space is the collection of information about how exactly -to install a client. The central configuration space for all install -clients is located on the install server in /srv/fai/config and its -subdirectories. This will be mounted by the install clients to -/var/lib/fai/config. The main installation command fai(8) uses all -these subdirectories in the order listed except for hooks.

    -
    -
    -class/ -
    -
    -

    -Scripts and files to -define classes and variables. -

    -
    -
    -disk_config/ -
    -
    -

    -Configuration files for disk partitioning, software RAID, LVM and file system creation. -

    -
    -
    -basefiles/ -
    -
    -

    -Normally the file base.tar.xz (located inside the nfsroot) is extracted on the install -client after the new file systems are created and before package are -installed. This is a minimal base image, created right after calling -debootstrap during the creation of the nfsroot on the install -server. If you want to install another distribution than the nfsroot -is, you can put a tar file into the subdirectory basefiles/ and name -it after a class. Then the command ftar(8) is used to extract the -tar file based on the classes defined. Thus the file has to be named CLASS.tar.xz not CLASS.base.tar.xz. This is done in task -extrbase. Use this if you want to install another distribution or -version than that running during the installation. -

    -

    This basefile can also be received based on FAI classes via HTTP/HTTPS or FTP -by defining the variable FAI_BASEFILEURL. FAI will download a file -CLASSNAME.tar.xz (or tgz, or tar.gz,…) from this URL, if CLASSNAME -matches a FAI class.

    -

    Example:

    -
    -
    -
    -
    -
    FAI_BASEFILEURL=https://fai-project.org/download/basefiles/
    -
    -

    The folder must support directory listing. FAI will not probe for potentially matching files.

    -

    See chapter [otherdists] for how to install different distributions.

    -
    -
    -debconf/ -
    -
    -

    -This directory holds all debconf(7) data. The format is the same -that is used by debconf-set-selections(1). -

    -
    -
    -package_config/ -
    -
    -

    -Files with class names contain lists of software packages to be -installed or removed by install_packages(8). Files named -<CLASS>.gpg are added to the list of keys used by apt -for trusted package repositories. -

    -
    -
    -pkgs/ -
    -
    -

    -This directory can contain subdirectories named by classes. You can -put .deb or .rpm files into these subdirectories. FAI will then -install these packages without the need of creating the metadata of a -package repository. -

    -
    -
    -scripts/ -
    -
    -

    -Scripts for your local site customization. Used by fai-do-scripts(1). -

    -
    -
    -files/ -
    -
    -

    -Files used by customization scripts. Most files are located in a -subtree structure which reflects the ordinary directory tree. For -example, the templates for nsswitch.conf are located in -$FAI/files/etc/nsswitch.conf and are named according to the classes -that they should match: $FAI/files/etc/nsswitch.conf/NIS is the -version of /etc/nsswitch.conf to use for the NIS class. Note that -the contents of the files directory are not automatically copied to -the target machine, rather they must be explicitly copied by -customization scripts using the fcopy(8) command. -

    -
    -
    -hooks/ -
    -
    -

    -Hooks are user defined programs or scripts, which are called during -the installation process. They can extend or replace the default tasks. -The file name must be of format taskname.CLASSNAME[.sh]. -A hook called updatebase.DEBIAN is executed prior to the task updatebase -and only if the install client belongs to the class DEBIAN. -

    -
    -
    -
    -
    -

    Defining classes

    -

    There are different possibilities to define classes:

    -
      -
    1. -

      -Some default classes are defined for every host: DEFAULT, LAST and its host name. -

      -
    2. -
    3. -

      -Classes may be listed within a file (by default in class/<hostname>) -

      -
    4. -
    5. -

      -Classes may be dynamically defined by scripts. -

      -
    6. -
    -

    The last option is a very nice feature, since these scripts will -define classes in a very flexible way. For example, several classes -may be defined only if certain hardware is identified or a class is -defined depending on the network subnet information.

    -

    All names of classes, except the host name, are written in -uppercase. They must not contain a hyphen, a hash, a semicolon or a -dot, but may contain underscores and digits.

    -

    The task defclass calls the command fai-class(1) to define -classes. All scripts matching ^[0-9][0-9]* (they start with two -digits) in the subdirectory -$FAI/class are executed for defining classes. Everything that is printed -to STDOUT is automatically defined as a class. For more -information on defining class, read the manual pages for -fai-class(1). The script 50-host-classes (see below a stripped -version) is used to define classes depending on the host name.

    -
    -
    -
    # use a list of classes for our demo machines
    -case $HOSTNAME in
    -    demohost)
    -        echo "FAIBASE GRUB DEMO" ;;
    -    xfcehost)
    -        echo "FAIBASE GRUB DEMO XORG XFCE LVM";;
    -    faiserver)
    -        echo "FAIBASE DEBIAN DEMO FAISERVER" ;;
    -    ubuntuhost)
    -        echo "FAIBASE DEBIAN DEMO UBUNTU JAMMY JAMMY64 XORG";;
    -    *)
    -        echo "FAIBASE DEBIAN DEMO" ;;
    -esac
    -
    -

    Host names should rarely be used for the configuration files in the -configuration space. Instead, a class should be defined and then added -for a given host. This is because most of the time the configuration -data is not specific for one host, but can be shared among several -hosts.

    -

    The order of the classes is important because it defines the priority -of the classes from low to high.

    -
    -
    -

    Defining variables

    -

    The task defvar defines the variables for the install -client. Variables are defined by scripts in class/*.var. All global -variables can be set in DEFAULT.var. For groups of hosts use -a class file. For a single host use the file $HOSTNAME .var. Also -here, it’s useful to study all the examples.

    -

    The following variables are used in the examples and may also be -useful for your installation:

    -
    -
    -FAI_ACTION -
    -
    -

    -Set the action FAI should perform. Normally this is done by -fai-chboot(8). If you can’t use this command, define this variable -i.e. in the script LAST.var. -

    -
    -
    -FAI_ALLOW_UNSIGNED -
    -
    -

    -If set to 1, FAI allows the installation of packages from unsigned -repositories. -

    -
    -
    -CONSOLEFONT -
    -
    -

    -Is the font which is loaded during installation by setfont(8). -

    -
    -
    -KEYMAP -
    -
    -

    -Defines the keyboard map files in /usr/share/keymaps and -$FAI/files. You don’t need to specify the full path, since this file -will be located automatically. -

    -
    -
    -ROOTPW -
    -
    -

    -The encrypted root password for the new system. You can use -crypt(3), md5 and other hash types for the password. Use -mkpasswd(1) for creating the hash for a certain password. -For example, to generate a md5 hash for the password use -

    -
    -
    -
    -
    -
    $ echo "yoursecrectpassword" | mkpasswd -m yescrypt -s
    -
    -
    -
    -UTC -
    -
    -

    -Set hardware clock to UTC if UTC=yes. Otherwise set clock to local -time. See clock(8) for more information. -

    -
    -
    -TIMEZONE -
    -
    -

    -Is the file relative to /usr/share/zoneinfo/ which indicates your -time zone. E.g.: TIMEZONE=Europe/Berlin. -

    -
    -
    -MODULESLIST -
    -
    -

    -A list of kernel modules which are loaded during boot of the new system (written to -/etc/modules). -

    -
    -
    -
    -
    -

    Hard disk configuration

    -

    The tool setup-storage(8) reads a file in $FAI/disk_config for the -disk configuration. This file describes how -all the local disks will be partitioned, which file system types should be -created (like ext3/4, xfs, btrfs), and where they are -mounted to. You can also create software RAID and LVM setups using this -config file. It’s also possible to preserve the disk layout or to -preserve the data on certain partitions.

    -

    During the installation process all local file systems are mounted -relative to /target. For example if you specify the mount point -/home in a disk configuration file this will be the directory -/target/home during the installation process and will become /home -for the new installed system.

    -
    -
    -

    Extract base file

    -

    A base file is only needed when installing a distribution which is -different from the one in the nfsroot.

    -
    -
    -

    Debconf preseeding

    -

    You can use the format described in debconf-set-selections(1).

    -
    -
    -

    Access to the package repository

    -

    FAI supports http, https and NFS for accessing the package mirror. Set -the variable $FAI_DEBMIRROR for using NFS.

    -
    -
    -

    Software package configuration

    -

    Before installing packages, FAI will add the content of all files -named package_config/class.gpg to the list of apt keys. If your local -repository is signed by your keyid AB12CD34 you can easily add this key, -so FAI will use it during installation. Use this command for creating -the CLASS.gpg file:

    -
    -
    -
    faiserver$ gpg --export AB12CD34 > /srv/fai/config/package_config/MYCLASS.gpg
    -
    -

    The script install_packages(8) installs the selected software -packages. It reads all configuration files in $FAI/package_config -whose file name matches a defined class. The syntax is very simple.

    -
    -
    -
    # an example package class
    -
    -PACKAGES taskinst
    -german
    -
    -PACKAGES install-norec
    -adduser nmap
    -less zstd
    -
    -PACKAGES remove
    -gpm xdm
    -
    -PACKAGES install GRUB_PC
    -grub-pc
    -
    -

    Comments are starting with a hash (#) and are ending at the end of the -line. Every package command begins with the word PACKAGES followed by a -command name, which maps to a different package tool like apt-get, -aptitude or dnf for e.g. The command defines which command will be used to -install the packages named after this command. The list of all -available commands can be listed using install_packages -H. -Supported package tools are: apt, apt-get, aptitude, smart, yast, -dnf, rpm, zypper

    -
    -
    -hold -
    -
    -

    -Put a package on hold. This package will not be handled by dpkg, e.g -not upgraded. -

    -
    -
    -install -
    -
    -

    -Install all packages (using apt-get) that are specified in the following lines. If a -hyphen is appended to the package name (with no intervening space), -the package will be removed, not installed. All package names are -checked for misspellings. Any package which does not exist, will be -removed from the list of packages to install. So be careful not to -misspell any package names. -

    -
    -
    -install-norec -
    -
    -

    -Like install but without installing the recommended packages. -

    -
    -
    -remove -
    -
    -

    -Remove all packages that are specified in the following lines. Append -a + to the package name if the package should be installed. -

    -
    -
    -taskinst -
    -
    -

    -Install all packages belonging to the tasks that are specified in the -following lines using tasksel(1). You can also use aptitude for -installing tasks. -

    -
    -
    -aptitude -
    -
    -

    -Install all packages with the command aptitude. This will be the -default in the future and may replace apt-get and taskinst. Aptitude -can also install task packages. -

    -
    -
    -aptitude-r -
    -
    -

    -Same as aptitude with option --with-recommends. -

    -
    -
    -unpack -
    -
    -

    -Download package and unpack only. Do not configure the package. -

    -
    -
    -dselect-upgrade -
    -
    -

    -Set package selections using the following lines and install or remove -the packages specified. These lines are the output of the command -dpkg --get-selections. It’s not recommended to use this format, -since you are also specifying all packages which are only installed -because of a dependency or a recommends. It’s better just to specify -the pacakge you like to have, and to let FAI (and apt-get) resolve the -dependencies. -

    -
    -
    -

    Multiple lines with lists of space separated names of packages follow -the PACKAGES lines. All dependencies are resolved. Packages with -suffix - (eg. lilo-) will be removed instead of installed. The -order of the packages doesn’t matter. If you like to install -packages from another release than the default, you can append the -release name to the package name like in -openoffice.org/etch-backports. You can also specify a certain -version like apt=0.3.1. More information on these features are -described in aptitude(8).

    -

    You can specify additional parameters for the package manager adding -key=value after PACKAGES <command>. Currently we support -release=<name> which will add -t <name> when installing packages.

    -

    Example:

    -
    -
    -
    PACKAGES install-norec release=testing
    -nvidia-smi
    -
    -

    This will install the nvidia-smi package from the testing release, -including the dependencies. Don’t forget to add an entry into -sources.list. You may also want to adjust the apt pinning (see -apt_references(5)).

    -

    A line which contains the PRELOADRM commands, downloads a file using -wget(1) into a directory before installing the packages. Using the -file: URL, this file is copied from $FAI_ROOT to the download -directory. For example the package realplayer needs an archive to -install the software, so this archive is downloaded to the directory -/root. After installing the packages this file will be removed. If -the file shouldn’t be removed, use the command PRELOAD instead.

    -

    You can add an arbitrary boolean expression using FAI classes to -define when the list of packages should be installed. Here, the -packages are only installed if the class XORG is defined but the class -MINT is not defined.

    -

    Example:

    -
    -
    -
    PACKAGES install UBUNTU && XORG && ! MINT
    -ubuntu-standard
    -ubuntu-desktop
    -
    -

    The old way of adding some logic in the PACKAGES lines is still supported: -It’s possible to append a list of class names after the command for -apt-get. So this PACKAGES command will only be executed when at least -one of the corresponding classes is defined (logical OR). So you can -combine many small files into the file DEFAULT.

    -

    If you want to remove a package name from a certain class was part of -this class before, you should not remove the package name from the -class file, but instead append a dash (-) to it. This will make sure -that the package is removed during a softupdate on hosts which were -installed using the old class definition which included this package -name.

    -

    If you specify a package that does not exist this package will be -removed automatically from the installation list only if the command install is used.

    -

    The concept of classes priority allows a higher priority class (one -that comes later in the sequence of classes) to override the selection -of packages of a lower priority class. For this to work correctly, -the higher priority class must use the same PACKAGES command (e.g. -PACKAGES install-norec instead of just PACKAGES install) as the one -used by the class it is trying to override. This is useful to suppress -installation of a package, for example, to avoid installing the linuxlogo -package installed by class FAIBASE:

    -
    -
    -
    # example of how to override:
    -#
    -# On FAIBASE we have:
    -#    PACKAGES install-norec
    -#    linuxlogo
    -#
    -# We want to _not_ install linuxlogo, and it is in a
    -# install-norec section, so we must also use install-norec.
    -
    -PACKAGES install-norec
    -linuxlogo-
    -
    -
    -
    -

    Customization scripts

    -

    The command fai-do-scripts(1) is called to execute all scripts in -this directory. If a directory with a class name exists, all scripts -matching ^[0-9][0-9]* are executed in alphabetical order. So it’s -possible to use scripts of different languages (shell, cfengine, -Perl, Python, Ruby, expect,..) for one class.

    -

    Thoses scripts write their output to sripts.log. The file status.log -contains the names of all scripts executed and their exit status.

    -
    -

    Shell scripts

    -

    Most scripts are Bourne shell scripts. Shell scripts are useful if the -configuration task only needs to call some shell commands or create a -file from scratch. In order not to write many short scripts, it’s -possible to use the ifclass command for testing if certain classes -are defined.

    -
    -
    -
    ifclass -o A B C
    -
    -

    checks if one of classes A, B or C are defined. Using -a (logical -AND) checks if all classes of a list are defined. The command ifclass -C checks if only class C is defined.

    -

    For copying files with classes, use the command -fcopy(8). If you want to extract an archive using classes, use -ftar(8). For appending lines to a configuration file use ainsl(1) -instead of just echo string >> filename.

    -

    FAI also supports zsh(1) scripts during the -customization task. Within scripts, the variable $classes holds a space -separated list with the names of all defined classes.

    -
    -
    -

    Cfengine scripts

    -

    CFEngine has a rich set of functions to edit existing configuration -files, e.g LocateLineMatching, ReplaceAll, InsertLine, -AppendIfNoSuchLine, HashCommentLinesContaining. But it can’t handle -variables which are undefined. If a variable is undefined, the whole -cfengine script will abort.

    -

    More information can be found in the manual page cfengine(8) or at -the cfengine homepage https://www.cfengine.com.

    -
    -
    -
    -

    Hooks

    -

    Hooks let you specify functions or programs which are run at certain -steps of the installation process. Before a task is called, -FAI searches for existing hooks for this task and executes them. As -you might expect, classes are also used when calling hooks. Hooks are -executed for every defined class. You only have to create the hook -with the name for the desired class and it will be used. If several -hooks for a task exists, they are called in the order defined by the -classes. If debug is included in $FAI_FLAG the option -d is -passed to all hooks, so you can debug your own hooks. If some default -tasks should be skipped, use the subroutine skiptask and a list of -default tasks as parameters. In the examples provided, the hooks of -the class CENTOS skips some Debian specific tasks.

    -

    The directory $FAI/hooks/ contains all hooks. A hook is an executable -file following the naming scheme taskname.CLASSNAME[.sh] (e.g. -repository.CENTOS or 'savelog.LAST.sh). The -task name specifies which task to precede executing this hook, if the -specified class is defined for the installing client. See section -[tasks] for a complete list of default tasks that can be used.

    -

    A hook of the form hookprefix.classname can’t define variables for -the installation script, because it’s a subprocess. But you can use -any binary executable or any script you wrote. Hooks that have the -suffix .sh (e.g. partition.DEFAULT.sh) must be Bourne -shell scripts and are sourced. So it’s possible to redefine variables -for the installation scripts.

    -

    In the first part of FAI, all hooks with prefix confdir are called. -Those hooks can not be located in the config space, since it’s not yet -available. Therefore these hooks are the only hooks located in -$nfsroot/$FAI/hooks on the install server. All other hooks are -found in $FAI_CONFIGDIR/hooks on the install server.

    -

    All hooks that are called before classes are defined can only use the -following classes: DEFAULT $HOSTNAME LAST. If a hook for class -DEFAULT should only be called if no hook for class $HOSTNAME is -available, insert these lines to the default hook:

    -
    -
    -
    hookexample.DEFAULT:
    -
    -#! /bin/sh
    -
    -# skip DEFAULT hook if a hook for $HOSTNAME exists
    -scriptname=$(basename $0 .DEFAULT)
    -[-f $FAI/hooks/$scriptname.$HOSTNAME ] && exit
    -# here follows the actions for class DEFAULT
    -.
    -.
    -
    -

    Some examples for what hooks could be used:

    -
      -
    • -

      -Load kernel modules before classes are defined in $FAI/class. -

      -
    • -
    • -

      -Send an email to the administrator if the installation is finished. -

      -
    • -
    • -

      -Install a diskless client and skip local disk partitioning. -

      -
    • -
    • -

      -Have a look at hooks/debconf.IMAGE for how to clone a machine using a file system image. -

      -
    • -
    -
    -
    -

    FAI flags

    -

    The variable $FAI_FLAGS contains a space separated list of -flags. Flags are normally defined in the pxelinux.cfg file which -should be created by fai-chboot(1). The following flags are known:

    -
    -
    -verbose -
    -
    -

    -Create verbose output during installation. This should always be the -first flag, so consecutive definitions of flags will be verbosely -displayed. -

    -
    -
    -debug -
    -
    -

    -Create debug output. No unattended installation is performed. During -package installation you have to answer all questions of the -postinstall scripts on the client’s console. A lot of debug -information will be printed out. This flag is only useful for FAI -developers. -

    -
    -
    -sshd -
    -
    -

    -Start the ssh daemon to enable remote logins. -You can then log in as root to all install clients during the -installation. The default password is fai and can be changed by -setting FAI_ROOTPW in nfsroot.conf(5). To log in from your server -to the install client (named demohost in this example) use: -

    -
    -
    -
    -
    -
    $ ssh root@demohost
    -Warning: Permanently added 'demohost,192.168.33.100' to the list of known hosts.
    -root@demohost's password:
    -
    -

    This is only the root password during the -installation process, not for the new installed system. You can also -log in without a password when using $SSH_IDENTITY.

    -
    -
    -createvt -
    -
    -

    -Create two virtual terminals and execute a bash if ctrl-c is typed -in the console terminal. The additional terminals can be accessed by -typing Alt-F2 or Alt-F3. Otherwise, no terminals are available and -typing ctrl-c will reboot the install client. Setting this flag is -useful for debugging. If you want an installation which should not be -interruptible, do not set this flag. -

    -
    -
    -menu -
    -
    -

    -This enables a user menu for selecting a profile. All files -class/*.profile are read and a curses based menu will be created. -

    -
    -
    -screen -
    -
    -

    -Run FAI inside a screen(1) session. The session is called FAI. -If you log in via ssh from remote you can attach to the session using: -

    -
    -
    -
    -
    -
    $ screen -x
    -
    -
    -
    -tmux -
    -
    -

    -Run FAI inside a tmux(1) session. The session is called FAI. -If you log in via ssh from remote you can attach to the session using: -

    -
    -
    -
    -
    -
    $ tmux attach
    -
    -
    -
    -reboot -
    -
    -

    -Reboot the install client after installation is finished without -typing RETURN on the console. If this flag is not set, and error.log -contains anything, the install client will stop and wait that you -press RETURN. If no errors occurred, the client will always reboot -automatically. -

    -
    -
    -halt -
    -
    -

    -Halt the install client at the end of the installation, instead of -rebooting into the new system. -

    -
    -
    -initial -
    -
    -

    -Used by setup-storage(8). Partitions marked with preserve_reinstall -are preserved unless this flag is set. Often, this flag is set in a -file class/*.var by using setting flag_initial=1. -

    -
    -
    -
    -
    -
    -
    -

    FAI installs your plan

    -
    -
    -

    The early part of an installation

    -

    After the kernel has booted, it mounts the root file system via NFS -from the install server and starts the script -/usr/sbin/fai
    [Since the root file system on the clients is mounted via -NFS, fai is located in -/srv/fai/nfsroot/usr/sbin on the install -server.]
    . This script controls the sequence of the -installation. No other scripts in /etc/init.d/ are used.

    -

    The configuration space is made available via the configured method -(an NFS mount by default) from the install server to the path defined -in $FAI
    [$FAI is an internal variable used by the FAI -scripts. By default the path is /var/lib/fai/config.]

    -
    -
    -

    Boot messages

    -

    When booting the install client from network card with PXE you will see some -messages like this:

    -
    -
    -
    Managed PC Boot Agent (MBA) v4.00
    -Pre-boot eXecution Environment (PXE) v2.00
    -DHCP MAC ADDR: 00 A2 A3 04 05 06
    -DHCP.../
    -
    -CLIENT MAC ADDR: 00 A2 A3 04 05 06  GUID: 3D6C4552
    -CLIENT IP: 192.168.33.100 MASK: 255.255.255.0  DHCP IP: 192.168.33.250
    -GATEWAY IP: 192.168.33.1
    -
    -!PXE entry point found (we hope) at 9854:0106 via plan A
    -UNDI code segment at: 9854 len 5260
    -UNDI data segment at: 921D len 63A2
    -Getting cached packet  01 02 03
    -My Ip address seems to be C0A82164 192.168.33.100
    -ip=192.168.33.100:192.168.33.250:192.168.33.1:255.255.255.0
    -BOOTIF=01-00-A2-A3-04-05-06
    -SYSUUID=
    -TFTP prefix: fai/
    -Trying to load pxelinux.cfg/C0A82164
    -
    -Loading vmlinuz-6.1.0-17-amd64..................
    -Loading initrd.img-6.1.0-17-amd64......................ready.
    -
    -

    At this point the install client has successfully received the network -config via DHCP and the kernel and initrd via TFTP. It now boots the -Linux kernel and the initrd. If everything went right, the initrd -mounts the nfsroot
    [/srv/fai/nfsroot from the install -server via NFS]
    and the FAI scripts are started. The first -thing you see is the red FAI copyright message.

    -
    -
    -
                 -------------------------------------------------
    -                   Fully Automatic Installation  -  FAI
    -
    -                   6.2           (c) 1999-2024
    -                   Thomas Lange  <lange@cs.uni-koeln.de>
    -             -------------------------------------------------
    -
    -Calling task_confdir
    -Kernel currently running: Linux 6.1.0-17-amd64 x86_64 GNU/Linux
    -Kernel parameters: BOOT_IMAGE=vmlinuz-6.1.0-17-amd64 initrd=initrd.img-6.1.0-17-amd64 \
    -  ip=dhcp rw root=192.168.33.250:/srv/fai/nfsroot rootovl FAI_FLAGS=verbose,sshd,createvt
    -  FAI_ACTION=install FAI_CONFIG_SRC=nfs://faiserver/srv/fai/config
    -Reading /tmp/fai/boot.log
    -FAI_FLAGS: verbose sshd createvt
    -Monitoring to server faiserver enabled.
    -FAI_CONFIG_SRC is set to nfs://faiserver/srv/fai/config
    -Configuration space faiserver:/srv/fai/config mounted to /var/lib/fai/config
    -Source hook: setup.DEFAULT.sh
    -setup.DEFAULT.sh     OK.
    -Calling task_setup
    -FAI_FLAGS: verbose sshd createvt
    -Press ctrl-c to interrupt FAI and to get a shell
    -Starting FAI execution - 20240117_194012
    -Calling task_defclass
    -fai-class: Defining classes.
    -Executing /var/lib/fai/config/class/01-classes.
    -01-classes           OK.
    -Executing /var/lib/fai/config/class/10-base-classes.
    -10-base-classes      OK.
    -Executing /var/lib/fai/config/class/20-hwdetect.sh.
    -ens3             UP             52:54:00:11:23:01 <BROADCAST,MULTICAST,UP,LOWER_UP>
    -ens3             UP             192.168.33.101/24 fe80::5054:ff:fe11:2301/64
    -New disklist: vda
    -20-hwdetect.sh       OK.
    -Executing /var/lib/fai/config/class/40-parse-profiles.sh.
    -40-parse-profiles.sh OK.
    -Executing /var/lib/fai/config/class/41-warning.sh.
    -41-warning.sh        OK.
    -Executing /var/lib/fai/config/class/50-host-classes.
    -50-host-classes      OK.
    -Executing /var/lib/fai/config/class/60-misc.
    -60-misc              OK.
    -Executing /var/lib/fai/config/class/85-efi-classes.
    -85-efi-classes       OK.
    -List of all classes:  DEFAULT LINUX AMD64 DHCPC FAIBASE DEBIAN DEMO GRUB_PC demohost2 LAST
    -
    -

    You can also see the list of FAI classes, that are defined for this -host. This list is very important for the rest of the installation.

    -

    The first task is called confdir, which is responsible for getting -access to the config space. Here, we use an NFS mount from the install -server as you can see on the console (and later in the logs).

    -
    -
    -
    FAI_CONFIG_SRC is set to nfs://faiserver/srv/fai/config
    -Configuration space faiserver:/srv/fai/config mounted to /var/lib/fai/config
    -
    -

    Before the installation is started ($FAI_ACTION=install) the computer -beeps three times. So, be careful when you hear three beeps but you do -not want to perform an installation and let FAI erase all yout data on -the local disk!

    -
    -
    -

    Rebooting the computer into the new system

    -

    For rebooting the computer during or at the end of the installation you -should use the command faireboot in favour of the normal reboot command. -Use faireboot also if logged in from remote. If the installation -hasn’t finished, use faireboot -s, so the log files are also copied -to the install server.

    -

    If the installation has finished successfully, the computer should boot a -small Debian system. You can login as user demo or root with password fai.

    -
    -
    -

    Starting FAI (task confdir)

    -

    After the install client has booted only the script /usr/sbin/fai is -executed. It will do some minimal initialization. The variable -$FAI_CONFIG_SRC
    [It is defined on the kernel command line]
    -is used to get access to the FAI configuration space which is then -available in the directory $FAI
    [/var/lib/fai/config]
    . FAI -will not proceed without the config space.

    -

    You can access the config space using different methods. Supported -methods are: nfs:, file:, cvs:, svn: git:, hg:, http: and detect:. -See fai.conf(5) for a detailed description of these methods.

    -
    -
    -

    Defining classes and variables (tasks defclass and defvar)

    -

    The command fai-class(1) executes scripts in $FAI/class for defining -classes. If the scripts write a string to stdout, this will be defined -as a class. Read all the details in the man page of fai-class(1).

    -

    After defining the classes, every file matching .var with a prefix -which matches a defined class is sourced to define variables. It must -contain valid shell code.

    -
    -
    -

    Partitioning local disks, creating file systems (task partition)

    -

    For the disk partitioning exactly one disk configuration file from -$FAI/disk_config is selected using classes.

    -

    The format of the disk configuration is similar to a fstab file.

    -

    The partitioning tool setup-storage(8) performs all commands -necessary for creating the disk partition layout, software RAID, LVM -and for creating the file systems. Disks and partitions may easily be -referenced by disk1.1, disk2.4 etc. Read the manual page of -setup-storage(8) for a detailed description and some examples of the -format.

    -
    -
    -

    Debconf preseeding (task debconf)

    -

    Files in $FAI/debconf are used for the usual debconf(7) preseeding -if the file names match a class name.

    -
    -
    -

    Installing software packages (task instsoft)

    -

    The command install_packages(8) reads the config files from -$FAI/package_config in a class based manner and installs software -packages on the new file system.

    -

    It installs the packages using apt-get(8), aptitude(1), yum or other -package tools without any manual interaction needed. Package -dependecies are also resolved by the package tools.

    -

    The format of the configuration files is described in [packageconfig].

    -

    Additionaly FAI will install packages (.deb or .rpm') from the -directories $FAI/pkgs/<CLASSNAME>.

    -
    -
    -

    Site specific customization (task configure)

    -

    Often the default configurations of the software packages will not -meet your site-specific needs. You can call arbitrary scripts which -adjust the system configuration. Therefore the command -fai-do-scripts(1) executes scripts in $FAI/scripts in a class -based manner. It is possible to have several scripts of different -types (shell, cfengine, …) to be executed for one class.

    -

    The default set of scripts in $FAI/scripts include examples for -installing Debian and Rocky Linux machines. They set the root password, add -a user account (set by '$username, default to demo), set the timezone, configure the network for DHCP -or using a fixed IP address, setup grub and more. -They should do a reasonable job for your installation. You can edit -them or add new scripts to match your local needs.

    -

    More information about these scripts are described in [cscripts].

    -
    -
    -

    Saving log files (task savelog)

    -

    When all tasks are finished, the log files are written to -/var/log/fai/$HOSTNAME/install/ -
    [/var/log/fai/localhost/install/ is a link to this -directory.]
    on the new system and to the account on the install server -if $LOGUSER is defined (you have to enable this in -/srv/fai/config/class/FAIBASE.var). It is also possible to specify -another host as log saving destination through the variable -$LOGSERVER. If $LOGSERVER is not defined, FAI uses the variable -$SERVER which is only defined during an initial installation (by -get-boot-info).

    -

    Additionally, two symlinks will be created to indicated the last -directory written to. The symlink last points to the log directory -of the last FAI action performed. The symlinks last-install and -last-sysinfo point to the directory of the last corresponding -action. By default log files will be copied to the log -server using scp. You can use the variable $FAI_LOGPROTO in file -fai.conf(5) to choose another method for saving logs to the remote -server. Here’s an example of the symlink structure:

    -
    -
    -
    lrwxrwxrwx   1 fai fai   23 Dec  2  2013 last-sysinfo -> sysinfo-20131202_161237
    -drwxr-xr-x   2 fai fai 4096 Dec  2  2013 sysinfo-20131202_161237
    -drwxr-xr-x   2 fai fai 4096 Feb 14  2014 install-20140214_142150
    -drwxr-xr-x   2 fai fai 4096 Dec  2 11:47 install-20141202_113918
    -lrwxrwxrwx   1 fai fai   23 Dec  4 13:22 last-install -> install-20141204_131351
    -lrwxrwxrwx   1 fai fai   23 Dec  4 13:22 last -> install-20141204_131351
    -drwxr-xr-x   2 fai fai 4096 Dec  4 13:22 install-20141204_131351
    -
    -

    Examples of the log files can be found at https://fai-project.org/logs.

    -
    -
    -

    Reboot the new installed system

    -

    Before rebooting, the install client calls fai-chboot -d <hostname> -on the install server, to disable its own PXELINUX -configuration. Otherwise, it would restart the installation during the -next boot. Normally this should boot the new installed system from -its second boot device, the local hard disk.

    -

    At the end, the system is automatically rebooted if "reboot" was added to -$FAI_FLAGS.

    -
    -
    -
    -
    -

    Advanced FAI topics

    -
    -
    -

    Checking parameters received from DHCP servers

    -

    If the install client boots you can check -if all information from the DHCP daemon are received -correctly. The received information is written to -/tmp/fai/boot.log. An example of the result of a DHCP request can be -found in the sample log files.

    -
    -
    -

    Monitoring multiple client installations

    -

    You can monitor the installation of all install clients with the -command fai-monitor(8). All clients check if this daemon is running -on the install server (or the machine defined by the variable -$monserver). Each time a task starts or ends, a message is sent. The -FAI monitor daemon prints this messages to standard output. There’s -also a graphical frontend available, called fai-monitor-gui(1).

    -
    -
    -
    $  fai-monitor | fai-monitor-gui - &
    -
    -
    -
    -

    Collecting Ethernet addresses for multiple hosts

    -

    You have to collect all Ethernet (MAC) addresses of the install -clients and assign a host name and IP address to each client. To -collect the MAC addresses, boot your install clients. -You can already do this before any DHCP daemon is running in your -subnet. They will fail to boot (because of the missing DHCP or missing TFTP), -but you can still collect the MAC addresses.

    -

    While the install clients are booting, they send broadcast packets to the -LAN. You can log the MAC addresses of these hosts by running the -following command simultaneously on the server:

    -
    -
    -
    faiserver# tcpdump -qtel broadcast and port bootpc >/tmp/mac.list
    -
    -

    After the hosts have been sent some broadcast packets abort tcpdump -by typing ctrl-c. You get a list of all -unique MAC addresses with these commands:

    -
    -
    -
    faiserver$ perl -ane 'print "\U$F[0]\n"' /tmp/mac.list|sort|uniq
    -
    -

    After that, you only have to assign these MAC addresses to host names -and IP addresses (/etc/ethers and /etc/hosts or corresponding NIS -maps). With this information you can configure your DHCP -daemon (see the section [bootdhcp]).
    [I recommend to write the MAC -addresses (last three bytes will suffice if you have network cards -from the same vendor) and the host name in the front of each chassis.]

    -
    -

    Debugging the network traffic

    -

    If the client can’t successfully boot from the network card, use -tcpdump(8) to look for Ethernet packets between the install server -and the client. Search also for entries in several log files made by -tftpd(8) and dhcpd(8) :

    -
    -
    -
    faiserver$ egrep "tftpd|dhcpd" /var/log/*
    -
    -
    -
    -
    -

    Details of PXE booting

    -

    Here we describe the details of PXE booting, which are only needed if -you have problems when booting your install clients.

    -

    Almost all modern bootable network cards support the PXE boot environment. -PXE is the Preboot Execution Environment. -This requires the PXELINUX bootloader and a special version of the TFTP -daemon, which is available in the Debian packages pxelinux and -tftpd-hpa. PXE booting also needs a DHCP server, so that the network -card can configure its IP parameters. This is the sequence of a PXE boot:

    -
      -
    • -

      -Network card of the client sends its MAC address -

      -
    • -
    • -

      -DHCP server replies with IP configuration for the client -

      -
    • -
    • -

      -Network card configures IP -

      -
    • -
    • -

      -Install client gets the pxelinux.0 binary via TFTP -

      -
    • -
    • -

      -Get the pxelinux.cfg/C0A8210C configuration file via TFTP -

      -
    • -
    • -

      -C0A8210C is the IP address of the client in hexadecimal -

      -
    • -
    • -

      -This configuration contains kernel, initrd and additional kernel -command line parameters, which was created by fai-chboot. -

      -
    • -
    • -

      -Get the kernel and initrd via TFTP. -

      -
    • -
    -

    Example of a pxelinux.cfg file:

    -
    -
    -
    default fai-generated
    -
    -label fai-generated
    -kernel vmlinuz-6.1.0-17-amd64
    -append initrd=initrd.img-6.1.0-17-amd64 ip=dhcp root=/srv/fai/nfsroot rootovl FAI_FLAGS=verbose,sshd,createvt FAI_CONFIG_SRC=nfs://faiserver/srv/fai/config FAI_ACTION=install
    -
    -

    See /usr/share/doc/syslinux/pxelinux.doc for more detailed -information about PXELINUX. FAI uses the lpxelinux.0 binary which also -supports loading the kernel and initrd via FTP or HTTP. The command -fai-chboot(8) supports this with the option -U.

    -
    -
    -

    Customizing your install server setup

    -
      -
    • -

      -local/faster package mirror -

      -
    • -
    • -

      -different loguser -

      -
    • -
    • -

      -local root pw inside nfsroot -

      -
    • -
    -

    The configuration for the FAI package (not the configuration data for -the install clients) is defined in fai.conf(5). Definitions that are -only used for creating the nfsroot are located in -nfsroot.conf(5). Check these important variables in nfsroot.conf -before calling fai-setup or fai-make-nfsroot.

    -
    -
    -FAI_DEBOOTSTRAP -
    -
    -

    -Building the nfsroot uses the command debootstrap(8). It needs the location of a Debian mirror and the -name of the distribution (like bullsseye, bookworm, sid) for which the basic Debian -system should be built. Do not use different distributions here and in -/etc/fai/apt/sources.list. This will create a broken nfsroot. -

    -
    -
    -NFSROOT_ETC_HOSTS -
    -
    -

    -This variable is only needed if the clients do not have access to a DNS server. -This multiline variable is added to /etc/hosts inside the -nfsroot. Then the install clients can access those hosts by name -without using DNS. -

    -
    -
    -

    The content of /etc/fai/apt/sources.list is -used by the install server and also by the clients. If your install -server has multiple network cards and different host names for each -card (as for a Beowulf server), use the install server name which is -known by the install clients.

    -

    If you have problems running fai-setup, they usually stem from -fai-make-nfsroot(8) which is called by former command. Adding -v -gives you a more verbose output which helps you pinpoint the -error. The output is written to -/var/log/fai/fai-make-nfsroot.log.
    [For debugging purpose -it may help to enter the chroot environment manually using this -command. faiserver# chroot /srv/fai/nfsroot bash]

    -

    The setup also creates the account fai (defined by $LOGUSER) if -not already available. So you can add a user before calling -fai-setup(8) using the command adduser(8) and use this as your -local account for saving log files. The log files of all install -clients are saved to the home directory of this account. You should -change the primary group of this -account, so this account has write permissions to /srv/tftp/fai in -order to call fai-chboot for creating the PXE configuration for the hosts.

    -

    When you make changes to fai.conf, nfsroot.conf the -nfsroot has to be rebuilt by calling fai-make-nfsroot(8). If you -only like to install a new kernel package to the nfsroot add the flags -k or --K to fai-make-nfsroot. This will not recreate your nfsroot, but -only updates your kernel and kernel modules inside the nfsroot or add -additional packages into the nfsroot.

    -
    -
    -

    Creating a FAI CD or and USB stick

    -

    You can easily create an installation CD (or USB stick) of your -network installation setup. This will perform the same installation -and configuration from CD without the need of the install server. -Therefore you need to create a partial mirror of all Debian packages -needed for your FAI classes (using fai-mirror(1)). Then the command -fai-cd(8) will put this mirror, the nfsroot and the config space -onto a bootable CD. That’s it!

    -

    To easily create the installation CD, you can use the following command -(for more tuning details see fai-cd(8)):

    -
    -
    -
     faiserver# fai-cd -m <partialMirrorDir> fai-cd.iso
    -
    -

    This installation CD contains all data needed for the -installation. The command fai-cd(8) puts the nfsroot, the -configuration space and a subset of the Debian mirror onto a -CD-ROM. A partial package mirror is created using the command -fai-mirror(1) which contains all packages that are used by the -classes used in your configuration space. A sample ISO image is -available at https://fai-project.org/fai-cd.

    -

    Using the command dd(1) you can also create a bootable USB -stick by just writing the content of the ISO file to your USB stick -(here the stick is /dev/sdf).

    -
    -
    -
     faiserver# dd if=fai-cd.iso of=/dev/sdf bs=1M
    -
    -

    mk-data-partition is a tool that extends an ISO (that will be copied -to an USB stick) or an USB stick containing an ISO with -an ext4 or exFAT partition and sets the file system label to MY-DATA. -This partition is automatically mounted to /media/data by FAI. -You can copy your own .deb packages into this data partition und the -subdiretories pkgs/<CLASSNAME>. FAI will then install these packages -if the equivalent class is defined.

    -

    Example how to use mk-data-partition:

    -
    -
    -
    # mk-data-partition -s 1G -c faicd-large.iso A B
    -
    -

    The former command creates the data partition of size 1 Gbytes inside -the ISO file and copy directories A and B to it. You can then copy the modified ISO -onto an USB stick.

    -

    If the ISO is already on the USB stick and if it’s available as -dev/sdf, you can add a data partition of type exFAT will will use -the whole remaining part of the USB stick by using this command:

    -
    -
    -
    # mk-data-partition -F /dev/sdf
    -
    -
    -
    -

    Creating VM disk images using FAI

    -

    The command fai-diskimage(8) creates disk -images, which can be used with a virtual machine like KVM, VMware, -VirtualBox or a cloud service like OpenStack, GCE, EC2 and others. The -installation process performs the normal FAI tasks on a raw disk -image. After the installation you can boot the disk image and have a -running system. The disk image can also be converted to qcow2 format. -You do not need to setup the FAI nfsroot when only using -fai-diskimage. But you need a basefile in your configuration -space. Setting the variable $FAI_BASEFILEURL will automatically -download an appropriate base file into your config space.

    -

    Here’s an example how to create a raw disk image for a host called -cloud3, with a small set of software packages:

    -
    -
    -
    # export FAI_BASEFILEURL=https://fai-project.org/download/basefiles/
    -# fai-diskimage -vu cloud3 -S2G -cDEBIAN,BOOKWORM64,AMD64,FAIBASE,GRUB_PC,DHCPC,DEMO,CLOUD,LAST disk.raw
    -
    -

    This command will create a disk image called ubuntu.qcow2 for a Ubuntu 16.04 desktop -with hostname set to foobar.

    -
    -
    -
    # export FAI_BASEFILEURL=https://fai-project.org/download/basefiles/
    -# cl=DHCPC,UBUNTU,JAMMY,JAMMY64,AMD64,XORG,LAST
    -# fai-diskimage -Nvu foobar -S5G -c$cl ubuntu.qcow2
    -
    -

    You can give disk images a try without installing FAI, if you visit -https://fai-project.org/FAIme/cloud

    -
    -
    -

    Creating a bootable live image

    -

    Creating a bootable live ISO is easy with FAI. You only need two -steps. First, create your live environment using the command fai -dirinstall. Don’t forget to add the class LIVEISO. -Then create the live ISO using fai-cd:

    -
    -
    -
    # cl="DEBIAN,BOOKWORM64,AMD64,FAIBASE,XFCE,XORG,DHCPC,DEMO,LIVEISO,LAST"
    -# LC_ALL=C fai -v dirinstall -u xfce33 -c $cl \
    -    -s file:///srv/fai/config /srv/xfce
    -# fai-cd -s500 -MH -d none -g /etc/fai/grub.cfg.live \
    -    -n /srv/xfce live.iso
    -
    -

    The nfsroot is not needed for a live ISO. -Currently there’s no live ISO of the install server available.

    -
    -
    -

    Building cross-architecture disk images

    -

    Starting FAI 5.4 it’s now possible to build a disk image for -different architectures than the host is running. For example you can -build an image for 64-bit ARM architecture (aarch64) on a host running on amd64 -architecture. Here are the steps do to:

    -
    -
    -
    # apt install qemu-system-arm qemu-user-static fai-server fai-setup-storage fai-doc qemu-utils
    -# fai-mk-configspace
    -
    -# export FAI_BASEFILEURL=https://fai-project.org/download/basefiles/
    -# fai-diskimage -vu armhost -S2G -cDEFAULT,DHCPC,DEBIAN,ARM64,BUSTER_ARM64,FAIBASE,DEMO,CLOUD,LAST arm64.raw
    -# chown your_user_id arm64.raw
    -# cp /var/log/fai/armhost/last/vmlinuz* vmlinuz
    -# cp /var/log/fai/armhost/last/initrd.img* initrd
    -
    -

    Then you can run qemu as a normal user:

    -
    -
    -
    > qemu-system-aarch64 -m 1000 -M virt,gic_version=3 -cpu cortex-a57 -drive file=arm64.raw,if=virtio,index=1 -no-reboot -nographic -name ARM64 -net nic,name=eth0,model=virtio -net user,name=eth0,-kernel vmlinuz -initrd initrd -append "console=ttyAMA0 rw ip=dhcp root=/dev/vda1 net.ifnames=0"
    -
    -

    This works similar for other architectures. -Keep in mind, that qemu network setup will have poor performance if -not using the virtio driver as above or tap devices.

    -

    You can find the base files for many architectures at -https://fai-project.org/download/basefiles/, or use mk-basefile to -create your own.

    -
    -
    -

    FAI rescue system

    -

    If you set the variable $FAI_ACTION to sysinfo (for e.g. by using -fai-chboot -S), the client will not install a new system, but will -collect a lot of system information. -If you set $FAI_ACTION to inventory you will only get a few -hardware information. -Both actions can be used for FAI as a rescue system.

    -

    Type ctrl-c to get a shell or use Alt-F2 or Alt-F3 and you will get -another console terminal, if you have added createvt to $FAI_FLAGS.

    -

    You now have a running Linux system on the install client without -using the local hard disk. Use this as a rescue system if your local -disk is damaged or the computer can’t boot properly from hard -disk. You will get a shell and you can execute various commands -(dmesg, lsmod, df, lspci, …). Look at the log file in -/tmp/fai. There you can find much information about the boot -process.

    -

    FAI mounts all file systems it finds on the local disks read only. It -also tells you on which partition a file /etc/fstab exists. When -only one file system table is found, the partitions are mounted -according to this information. Here’s an example:

    -
    -
    -
    demohost:~# df -h
    -
    -Filesystem                Size  Used Avail Use% Mounted on
    -devtmpfs                  4.0M     0  4.0M   0% /dev
    -tmpfs                     2.0G     0  2.0G   0% /dev/shm
    -tmpfs                     783M   18M  766M   3% /run
    -tmpfs                     5.0M     0  5.0M   0% /run/lock
    -LiveOS_rootfs             783M   18M  766M   3% /
    -192.168.33.250:/srv/fai/config   59G   23G   24G  49% /var/lib/fai/config
    -/dev/mapper/vg1-root      7.3G  1.8G  5.2G  26% /target
    -/dev/vda1                 459M   53M  378M  13% /target/boot
    -/dev/mapper/vg1-home      1.4G   72K  1.3G   1% /target/home
    -
    -

    This method can be used as a rescue environment! If you need a file -system with read-write access use the rwmount command:

    -
    -
    -
    demohost# rwmount /target/home
    -
    -
    -
    -

    FAI without NFS

    -

    To boot into FAI and begin the installation sequence -without using the NFS protocol, you boot the client machine using PXE as -usual and then retrieve an image containing the nfsroot via http.

    -

    To create an image, use fai-cd’s -S argument and -M to avoid setting up -a partial mirror within the image.

    -
    -
    -
    faiserver# fai-cd -M -S squash.img
    -
    -

    Move this image to a directory from which it can be requested via http -(usually a directory served by the webserver)

    -

    To now request the squashfs image, add the following to your kernel -command line, e.g. in your pxelinux configuration file for the client -with fai-chboot.

    -
    -
    -
    root=live:http://faiserver/cskoeln/squash.img FAI_CONFIG_SRC=file:///var/lib/fai/config
    -
    -

    Replace faiserver with the domain name or IP of the machine your -squash image is served from.

    -
    -
    -

    Installing other distributions using a Debian nfsroot

    -

    You can install all sorts of Linux distributions from a single Debian -nfsroot. Therefore you have to create a base.tar.xz of the distribution -you like to install and place it into the basefiles directory. Then -name it UBUNTU2204.tar.xz for example. An install client which belongs -to the class UBUNTU2204 then extracts this base file into its empty -file system. Additionally you have to adjust the sources.list or -similar configuration files which are needed for specifying the -location of the package repository.

    -

    The tool rinse(8) is used for creating base files for distribution -like Rocky Linux, CentOS, openSUSE or Fedora. -Some basefiles can be downloaded from -https://fai-project.org/download/basefiles/.

    -

    The script mk-basefile in -/usr/share/doc/fai-doc/examples/simple/basefiles/ helps creating -this base files.

    -
    -
    -

    Creating chroot and virtualization environments

    -

    If you have to create some chroot environments, or a virtualization -environment where you neither can nor want to run a normal Debian -Installer in to get to a working system (for example, Xen guest -domains), there is the FAI action dirinstall. -By calling

    -
    -
    -
    faiserver# fai <options> dirinstall <target-directory>
    -
    -

    and using either the option -c <classes> or -N you get a FAI -installation, without the partitioning action, right into the target -directory. The host name for the target installation can be specified -using -u <host-name>

    -

    This, for example, can be used to combine FAI with the tool -xen-tools, which helps you to build Xen guest domains. xen-tools -are very nice for generating configuration files and block devices for -new guests based on simple commands and/or configuration files, but -they can only assign one role per installation for customization. -FAI-users need and want more, as they are used to have the class -system. They get them even in xen-tools installations, by using the -following code as a xen-tools role script:

    -
    -
    -
    #!/bin/sh
    -TARGET=$1
    -CMD="fai -N  -v -u ${hostname} dirinstall $TARGET"
    -echo running $CMD
    -$CMD
    -
    -

    Then, you should set the variable install=0 in the config of -xen-tools for that host.

    -
    -
    -

    Using FAI for updates

    -

    FAI can also do updates of already running systems, without a -re-installation from scratch. -This is called softupdate. A FAI softupdate skips the tasks which are -not suitable for updating a running system, like partitioning the -hard disks and creating file systems. Instead, it only executes the -tasks for updating and installing software packages and calling the -customization scripts.

    -

    To run a softupdate call:

    -
    -
    -
    # fai -v -s nfs://faiserver/srv/fai/config softupdate
    -
    -

    By default, a softupdate uses the list of classes defined during the -initial installation. Make sure to set the variable $LOGSERVER (done -in a class/*.var file) if FAI should save the log files to a remote -machine.

    -

    It’s up to you, how to start a softupdate on a bigger number of hosts. -You may do the softupdate on a regular basis via cron or you can use tools -like clusterssh(1) to start a softupdate via a push on a list of -hosts.

    -

    Keep in mind, that the customization scripts are run every time you do -a softupdate. That means, they have to be idempotent i.e. the result -of their operation should always produce the same result, even when -they run more than once.

    -

    For example appending a line to a file must not done via this code:

    -
    -
    -
    $ echo "some strings" >> /etc/fstab
    -
    -

    Instead use the command ainsl(1) in a shell script or use cfengine’s -function AppendIfNoSuchLine.

    -

    All commands in the customization script must be capable of modifying -the target file system wether it’s available in /target during the -initial installation or wether it’s the normal file system relative to -/ during softupdate.

    -

    Here are some variable that help writing these scripts:

    -
    -
    -$target -
    -
    -

    -Points to the root directory of the client, which -is /target during installation and / during a softupdate. -

    -
    -
    -$FAI_ROOT -
    -
    -

    -It’s the same value as $target. For historic reasons -we have both these variables in FAI. -

    -
    -
    -$ROOTCMD -
    -
    -

    -In case of the installation this is an alias for chroot $target in case of -softupdate it’s just empty. You can prepend this to commands if you need to run a -command inside the clients target file system via chroot. -

    -
    -
    -$FAI_ACTION -
    -
    -

    -If you need to call code depending on the FAI action performed, you -can use this variable. It contains the currently executed action: -install, softupdate, dirinstall, sysinfo, inventory or your -own defined action. -

    -
    -
    -
    -
    -

    How to install 32-bit OS from a 64-bit OS

    -

    To install a computer with a 32-bit OS, you need an i386 nfsroot. -Creating this 32-bit nfsroot on an install server running amd64 is -quite simple. Install and set up the FAI packages. Then copy your FAI -config files to a new subdirectory.

    -
    -
    -
    faiserver# cp -a /etc/fai /etc/fai-i386
    -
    -

    Edit the variable $FAI_DEBOOTSTRAP_OPTS in -/etc/fai-i386/nfsroot.conf and add the option --arch -i386. Also choose a different directory for your new nfsroot. Here -are the two lines after editing.

    -
    -
    -
    NFSROOT=/srv/fai/nfsroot-i386
    -FAI_DEBOOTSTRAP_OPTS="--arch i386 --exclude=info --include=aptitude""
    -
    -

    Now call fai-make-nfsroot which creates the 32-bit nfsroot in -/srv/fai/nfsroot-i386

    -
    -
    -
    faiserver# fai-make-nfsroot -v -C/etc/fai-i386
    -
    -

    Creating a partial mirror using fai-mirror(1) that is needed for -a bootable CD or USB stick is also possible on a different architecture. -You have to specify the architecture when calling fai-mirror.

    -
    -
    -
    $ fai-mirror -m800 -B -a i386 -v -cDEFAULT,DEBIAN,FAIBASE,I386 /srv/mirror-i386
    -
    -

    That’s all!

    -
    -
    -

    Aborting the installation when an error occurs

    -

    Every task and hook can call the function task_error -to send an error value to the installation. This error will appear in -the log file and can be shown in the fai-monitor-gui(1). -The error value is also checked against the variable $STOP_ON_ERROR -which is set to 700 by default. If the error value -is greater than $STOP_ON_ERROR the installation will stop -immediately. In a hook, just add a call like this:

    -
    -
    -
    task_error <value>
    -
    -

    It is comfortable to call task_error with $? as second parameter, for -e.g. if you want to set an error value of 123 use this

    -
    -
    -
    <some command>
    -task_error 123 $?
    -
    -

    Then the task error is only set if the preceding command failed with -some error. The same syntax can be used by the scripts in the class -subdirectory ending in .sh.

    -

    A special case are scripts inside the class/ subdirectory that does -not end in .sh. In those scripts you have to call task_error with 1 as -third parameter. As an example you can use those two variants for -setting the value to 123

    -
    -
    -
    task_error 123 $? 1
    -
    -

    or

    -
    -
    -
    task_error 123 1 1
    -
    -

    The latter command always sets the task error to 123 regardless of -the value of $?. If the error value is greater than $STOP_ON_ERROR, -the installation will abort immediately.

    -

    The error values are grouped into four categories

    -
    -
    -
    normal or info messages:       1xx, 2xx
    -warnings:                      3xx, 4xx
    -minor errors:                  5xx, 6xx
    -errors:                        7xx, 8xx
    -
    -

    The fai-monitor-gui has 4 different icons for these error categories.

    -
    -
    -
    -
    -

    Various hints and details

    -
    -
    -

    The list of tasks

    -

    Most tasks of the installation are defined as subroutines which are -defined in /usr/lib/fai/subroutines (e.g. task_instsoft). -Some are external shell scripts located in /usr/lib/fai/. -They are called via a superior subroutine called task. -This subroutine calls hooks if available and then calls the task (defined as -task_<name>). A task and its hooks can be -skipped on demand by using the command skiptask().

    -

    Now follows the description of all tasks, listed in the order -they are executed.

    -
    -
    -confdir -
    -
    -

    -The kernel appended parameters may define variables, the syslog daemon is -started. Network parameters are fetched from a DHCP -server and are stored in boot.log. The DNS resolver configuration file is created. -

    -

    The location of the configuration space is defined by the variable -$FAI_CONFIG_SRC.

    -

    After that, the file $FAI/hooks/subroutines is sourced if it -exists. Using this file, you can define your own subroutines or -override the definition of FAI’s subroutines.

    -
    -
    -setup -
    -
    -

    -This task sets the system time, all $FAI_FLAGS are defined and two -additional virtual terminals are opened on demand. A secure shell -daemon is started on demand for remote logins. -

    -
    -
    -defclass -
    -
    -

    -Calls fai-class(1) to define classes using scripts and files in -$FAI/class and classes from /tmp/fai/additional-classes and the -variable $ADDCLASSES. The list of all defined classes is stored in -the variable $classes and saved to /tmp/fai/FAI_CLASSES. -

    -
    -
    -defvar -
    -
    -

    -Sources all files $FAI/class/*.var for every defined class. If a -hook has written some variable definitions to the file -$LOGDIR/additional.var, this file is also sourced. -

    -
    -
    -action -
    -
    -

    -Depending on the value of $FAI_ACTION this subroutine decides which -action FAI should perform. The default available actions are: -sysinfo, install, inventory, dirinstall and softupdate. If $FAI_ACTION has another -value, a user defined action is called if a file -$FAI/hooks/$FAI_ACTION exists. So you can easily define your own -actions. -

    -
    -
    -sysinfo -
    -
    -

    -Called when no installation is performed but the action is -sysinfo. It shows information about the detected hardware and mounts -the local hard disks read only to /target/partitionname or with -regard to a fstab file found inside a partition. Log files are -stored to the install server. -

    -
    -
    -inventory -
    -
    -

    -A short list of system information is printed. -

    -
    -
    -install -
    -
    -

    -This task controls the installation sequence. You will hear three -beeps before the installation starts. The major work is to call other -tasks and to save the output to /tmp/fai/fai.log. If you have any -problems during installation, look at all files in /tmp/fai/. You -can find examples of the log files -at https://fai-project.org/logs/. -

    -
    -
    -dirinstall -
    -
    -

    -Install into a directory, not onto a local disk. Use this for creating -chroot environments. -

    -
    -
    -softupdate -
    -
    -

    -This task, executed inside a running system via the fai(8) command -line interface, performs a softupdate. See chapter [softupdate] for -details. -

    -
    -
    -partition -
    -
    -

    -Calls setup-storage(8) to partition the hard -disks and to create file systems. The task writes variable definitions -for the root and boot partition and device ($ROOT_PARTITION, -$BOOT_PARTITION, $BOOT_DEVICE) to /tmp/fai/disk_var.sh and creates -a fstab file for the new system. -

    -
    -
    -mountdisks -
    -
    -

    -Mounts the created partitions according to the created -/tmp/fai/fstab file relative to $FAI_ROOT. -

    -
    -
    -extrbase -
    -
    -

    -Extracts a minimal system after that a chroot can be made into it. By -default the base tar file /var/tmp/base.tar.xz will be -extracted. Also files matching a class name in $FAI/basefiles/ are used for unpacking a -different tar file depending on classes defined. This can be used for -installing different Linux distributions than the one used for -creating the nfsroot. The default file base.tar.xz is a snapshot of a -basic Debian system created by debootstrap(8). -This task uses the variable FAI_BASEFILEURL for fetching the base -file via FTP, HTTPS or HTTP if it’s defined. -

    -
    -
    -debconf -
    -
    -

    -Calls fai-debconf(1) to set the values for the debconf preseeding database. -

    -
    -
    -repository -
    -
    -

    -Prepare access to the package repository by preparing the apt -configuration. This can also add repository keys -in a class based manner from files like CLASSNAME.gpg -in the directory package_config. -

    -
    -
    -updatebase -
    -
    -

    -Updates the base packages of the new system and updates the list of -available packages. It also fakes some commands (called diversions) -inside the new installed system using dpkg-divert(8), so no daemons -will be started during the installation. -

    -
    -
    -instsoft -
    -
    -

    -Installs the desired software packages using class files in -$FAI/package_config/. -

    -
    -
    -configure -
    -
    -

    -Calls scripts in $FAI/scripts/ and its subdirectories for every -defined class. -

    -
    -
    -tests -
    -
    -

    -Calls test scripts in $FAI/tests/ and its subdirectories for every -defined class. -

    -
    -
    -finish -
    -
    -

    -Unmounts all file systems in the new installed system and removes -diversions of files using the command fai-divert. -

    -
    -
    -chboot -
    -
    -

    -Changes the PXE configuration for a host on the install server which -indicates which PXELINUX configuration to load on the next boot from network -card via TFTP. Therefore the fai-chboot(8) command is executed -remotely on the install server. -

    -
    -
    -savelog -
    -
    -

    -Saves log files to local disk and to the account $LOGUSER on -$LOGSERVER (defaults to the install server). -

    -
    -
    -faiend -
    -
    -

    -Wait for background jobs to finish (e.g. emacs compiling lisp files) -and automatically reboots the install clients or waits for manual -input before reboot. -

    -
    -
    -
    -
    -

    Automated tests

    -

    After the customization scripts are executed, FAI will execute some -tests if available. Using these test, you can check for errors of the -installation. Test scripts are called via -fai-do-scripts(1) and should append its messages to -$LOGDIR/test.log. A Perl module including some useful subroutines -can be found in Faitest.pm. A test can also define a new class for -executing another tests during next boot via the variable -$ADDCLASSES.

    -
    -
    -

    Autodiscover

    -

    In FAI 5.0 we released a feature that allows clients to search for the -faiserver in their respective subnetwork. This lifts the necessity of -having to collect every client’s MAC address and configuring the DHCP -daemon.

    -

    This is done by booting from a small FAI autodiscover bootmedium (CD, -USB, etc.), which can be created via the command:

    -
    -
    -
    faiserver# fai-cd -A autodiscover.iso
    -
    -

    The image is roughly 25MB in size and scans the subnet for -a FAI server. By default it shows a menu with all profiles available -in the configuration space in the same manner as the menu flag -does. From this menu, you can select the installation type you wish to -perform.

    -

    For the clients to find the faiserver, the faiserver must run -fai-monitor.

    -
    -
    -

    Changing the boot device

    -

    Changing the boot sequence is normally done in the BIOS setup. But you -can’t change the BIOS from a running Linux system.

    -

    So, the boot sequence of the BIOS will remain unchanged and -your computer should always boot first from its network card and the -second boot device should be the local disk. Then you can -change the boot device of the client by creating different PXELINUX -configurations. This will define if an installation -should be performed, or if the client should to boot from local -disk. This is done using fai-chboot(8).

    -
    -
    -

    How to create a local Debian mirror

    -

    The utility mkdebmirror
    [You can find the script in -/usr/share/doc/fai-doc/examples/utils/]
    can be used for creating -your own local Debian mirror. This script uses debmirror(1). A partial Debian mirror for amd64 architecture for -Debian 11 and 12 (aka bullseye and bookworm) without the source packages needs about -180GB of disk space. -Accessing the mirror via HTTP will be the -default way in most cases. To see more output from the script call -mkdebmirror -v. A root account is not necessary to create and -maintain the Debian mirror.

    -

    To use HTTP access to the local Debian mirror, install a web server -and create a symlink to the local directory where your mirror is -located:

    -
    -
    -
    faiserver# apt-get install apache2
    -faiserver# ln -s /files/scratch/debmirror /var/www/html/debmirror
    -
    -

    Create a file sources.list(5) in /etc/fai/apt which gives access -to your Debian mirror. Also add the IP-address of the -HTTP server to the variable $NFSROOT_ETC_HOSTS in -nfsroot.conf if the install clients have no DNS resolving.

    -
    -
    -

    Small hints

    -
      -
    • -

      -When using HTTP access to a Debian mirror, the local /var partition -on all install clients must be big enough to keep the downloaded -Debian packages. Do not try with less than 250 Mbytes unless you know -why. You can limit the number of packages installed at a time with the -variable $MAXPACKAGES. -

      -
    • -
    • -

      -You can remove the red logo on the install client by simply calling -reset once. If will also not appear if you create a file using this -command on the install server: -

      -
    • -
    -
    -
    -
    touch /srv/fai/nfsroot/.nocolorlogo
    -
    -
      -
    • -

      -A list of variables used by FAI can be found at -https://wiki.fai-project.org/index.php/Variables. -

      -
    • -
    • -

      -You can shorten some customization scripts by using one single fcopy -command fcopy -r /. -

      -
    • -
    • -

      -If you rebuild the nfsroot, you will create a new ssh host key inside -the nfsroot. Then logging in to an install client may fail, because -the host key changes. You can use this: -

      -
    • -
    -
    -
    -
    $ ssh -o StrictHostKeyChecking=no root@installclient
    -
    -
      -
    • -

      -You can also delete the host entry on your install client in your -~/.ssh/known_hosts file by using the ssh-keygen -R command. -

      -
    • -
    • -

      -In the tasks chboot and savelog, a connection using secure shell is -opened to the FAI server (see [isavelog]). To ensure that this works -non-interactively, a proper entry in NFSROOT/root/.ssh/known_hosts -must be created. When using fai-setup, this is done automatically, but -it may require manual editing in case the name of your FAI server was -not determined correctly. If you stumble over ssh connections that -require typing "yes" to accept the host key during installation, -please check the contents of your NFSROOT/root/.ssh/known_hosts file -

      -
    • -
    • -

      -A list of all local hard disks is -stored in $disklist. It’s defined after set_disk_info is called. -

      -
    • -
    • -

      -There are multiple functions for generating a customized disk -list. See fai-disk-info for an example. -

      -
        -
      • -

        -set_bootstick() -

        -
      • -
      • -

        -grepv_disks() -

        -
      • -
      • -

        -grep_disks() -

        -
      • -
      • -

        -notmatchdisks() -

        -
      • -
      • -

        -matchdisks() -

        -
      • -
      • -

        -smallestdisk() -

        -
      • -
      • -

        -largestdisk() -

        -
      • -
      • -

        -all_disks_by_size() -

        -
      • -
      • -

        -all_disks_and_size() -

        -
      • -
      • -

        -once_only() -

        -
      • -
      • -

        -checkdisk() -

        -
      • -
      • -

        -disks_by_id() -

        -
      • -
      -
    • -
    • -

      -Use fai-divert -a if a postinst script calls a configuration -program, e.g. the postinst script for package apache calls -apacheconfig, which needs manual input. You can fake the configuration -program so the installation can be fully automatic. -

      -
    • -
    • -

      -Sometimes the installation seems to stop, but often there’s only a -postinstall script of a software package that requires manual input -from the console. Change to another virtual terminal and look which -process is running with tools like top(1) and pstree(1). You can -add debug to FAI_FLAGS to make the installation process show all -output from the postinst scripts on the console and get its input also -from the console. -

      -
    • -
    • -

      -How can I define classes on the kernel command line? -

      -

      Read the man page of fai-class(8). If you like to define some -additional classes (for e.g. A,B,C) on the kernel command line add this: ADDCLASSES=A,B,C

      -
    • -
    • -

      -How to use a custom kernel inside the nfsroot? -

      -

      Build your customized kernel by building a kernel package using -make-kpkg(8) and use the option --initrd. Copy this Debian package -to a local repository and add it to /etc/fai/sources.list. Add the -name of your package to /etc/fai/NFSROOT. Then call

      -
      -
      -
      # fai-make-nfsroot -k
      -
      -
    • -
    • -

      -How to use the nfsroot as system for diskless clients? -

      - -
    • -
    • -

      -How to serve multiple nfsroot directories on one FAI server? -

      -

      If you want to serve multiple nfsroot directories, -you need to create specific config directories in /etc for FAI, like -/etc/fai-buster and /etc/fai-bookworm. Then you need to set the -$NFSROOT variables to different directories and run

      -
    • -
    -
    -
    -
    faiserver#fai-make-nfsroot -C /etc/fai-buster
    -
    -
    -
    -

    flag_reboot (FAI_FLAGS)

    -

    If flag_reboot is set, by adding "reboot" to $FAI_FLAGS, your client -machine will reboot after the task faiend has finished. This is true -for network as well as bootmedium installations.

    -
    -
    -

    Log files

    -

    FAI is creating several log files. During installation they are stored -in /tmp/fai on the install client itself. At the end of the -installation they will be copied to the install server (see -[isavelog]). After the install client rebooted into his newly -installed system, you can find the FAI logs in /var/log/fai. -Log files are also created when doing the softupdate or dirinstall -action.

    -

    On the faiserver, you can find the (remote) log files under the ~fai -directory.

    -

    Sample log files from successfully installed computers are -available on https://fai-project.org/logs. -These a some log files which are created by FAI.

    -
    -
    -FAI_CLASSES -
    -
    -

    -Contains a list of all classes defined. -

    -
    -
    -dmesg.log -
    -
    -

    -Output of the dmesg command. Contains useful messages of the kernel -ring buffer. -

    -
    -
    -fai.log -
    -
    -

    -The main log file. Contains all important information. You should -always read this file. -

    -
    -
    -boot.log -
    -
    -

    -A list of variables of network parameters, mostly defined by the DHCP daemon. -

    -
    -
    -format.log -
    -
    -

    -Output of the partition tool setup-storage(8). -

    -
    -
    -scripts.log -
    -
    -

    -Output of all scripts, that are used for customization. -

    -
    -
    -variables.log -
    -
    -

    -A list of all shell variables which are available during an -installation. -

    -
    -
    -error.log -
    -
    -

    -A summary of possible errors in all log files. -

    -
    -
    -disk_var.sh -
    -
    -

    -A list of variables that contain information about devices and -partitions to boot from, the root partition and a list of swap -devices. These information is used by some customization scripts -(e.g. GRUB_PC/10-setup). -

    -
    -
    -

    If the installation process finishes, the hook savelog.LAST.sh -searches all log files for common errors and writes them to the file -error.log. So, you should first look into this file for errors. Also -the file status.log give you the exit code of the last command -executed in a script. To be sure, you should look for more details in -all log files.

    -
    -
    -

    How to use HTTP for PXE boot

    -

    fai-make-nfsroot now uses the lpxelinux.0 binary which already -supports transfer of the kernel and initrd via http (additional to tftp). -You only have to enable HTTP access to the tftp directory:

    -
    -
    -
    cd /var/www/html
    -ln -s /srv/tftp/fai
    -
    -

    Add -U URL to the fai-chboot call. For example:

    -
    -
    -
    fai-chboot -U http://faiserver/fai -IFv .......
    -
    -
    -
    -
    -
    -

    Troubleshooting

    -
    -
    -

    Boot errors

    -

    The following error message indicates that your install client doesn’t -get an answer from a DHCP server. Check your cables or start the -dhcpd(8) daemon with the debug flag enabled.

    -
    -
    -
    -
    -
    PXE-E51: No DHCP or BOOTP offers received
    -Network boot aborted
    -
    -
    -
    -
    -

    If you do not see the following message, the install kernel could not -detect your network card, for example because of a missing driver:

    -
    -
    -
    Starting dhcp for interface eth0
    -dhcp: PREINIT eth0 up
    -dhcp: BOND setting eth
    -
    -

    Check the initrd in the nfsroot (lsinird) if the kernel driver of your network -card is included there and check if you like to add the package -firmware-linux-nonfree in /etc/fai/NFSROOT and rebuild the initrd -by calling fai-make-nfsroot -k. -You may also add a driver to /srv/fai/nfsroot/etc/dracut.conf in -the line add_drivers+=.

    -

    This is the error message you will see, when your network card is -working, but the install server does not export the nfsroot -directory to the install clients, This is often caused by missing -NFS permissions on the server side.

    -
    -
    -
    Starting dhcp for interface eth0
    -dhcp: PREINIT eth0 up
    -dhcp: BOND setting eth
    -mount.nfs: access denied by server while mounting 192.168.33.250:/srv/fai/nfsroot
    -.
    -.
    -dracut Warning: Could not boot
    -.
    -Dropping to debug shell
    -dracut:/#
    -
    -

    Now, you are inside the emergency shell of the initrd which was created -by dracut(8). You will get a shell prompt, and can look at the log files. -For more information about debugging the early boot process using -dracut see dracut.cmdline(7)

    -

    Use the following command on the install server to see which directories are exported -from the install server (named faiserver):

    -
    -
    -
    $ showmount -e faiserver
    -
    -
    -
    -
    -
    -

    - - - diff --git a/doc/fai-guide.pdf b/doc/fai-guide.pdf deleted file mode 100644 index dc0e13740cc658dc59fd770065f98732cb626880..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 281933 zcma&NQ?PK$(j~g|E!(zjf6KOQ+qP}nwr$(CZF}|pqdWTcjk6z4MMcap=Sx-2jK~@z zE0aV{NQ8!gmJO0*ZfST8k_De0-`2nalA9ZnPRiKE)X5B=ft3aSe-B7H5pydiV+VXX z5i5NsVIgaG@i5?CR4 zaZ2dEynZ!=l_>94Rk+=bwi(bwVs`{%Ckxd5XT}h~X3ar)A8{q73wqDO)guKtVDXtUI@5-Z7WzTM z&4|zz=(#D}Q7Cr$0z$?_4j;(i;3B(sL^%7Il{|FD!rqCoyY#5`YH=b1 z!RhPX&}BvTrvj?=N*?hY1;a1ASSQRSqE%z^N+o8IxT`qxH`APSAo*q`rQ+v3=lLBT z^cBkS60tiF032(d8i0%rI%y0YXJ1y9=Zt+8Uw;O}wKjtelMvk1Sxp4@h(7stSByWj zr@GmQhQSi`gw?zSoVs34>vZq~gzk(LH-z4r3J%zvW}n&l4ZUJrT~vklVryE@i3R>7 zopcRVsbv;kE)4ti@J`uAv92`9E+RgHd7ToG11bHh(K+wco)9R|k#kWumgcr(Ii%?pU3QPjyS*&K z%}2Os{rG~;LOdQb){Pl|DG+$GJtS>(oY#TF&uMgEzHrFUAor@ETep(BYb!Y_+mMvo znq^MLAW>o=8q&a^dAwf8D9{pzpfwIod$@f}iQ=vlxoU)*^sQlXO9Qa2Y8(87h_Dql zR+N){Ae?kQN2D@1k%lf{_BRD5@3~b0S*g-bAqgr4jVk!P=0O4Suly8Yj(Prk#$#F; zh-Mh1xfjwkrR!Hw^O!5jFx&i=Q?9%o(QYpHO@K~<0H!zxGUJ*tPT4p$lDUNiWQmHR z4xr|i$z-B?sEt<14`2pb0m_TXf=l{7p5CM_mfc~_-UY~#zTjA$R0`XZ3Y#B8L(Bl8s}x-mz{^(PKntW%`;8Lk6DL^^0YHaa^QKB z{Ggb1%_1kNsW`1uR8A=kj|e)h#^JkqUL7b4M-DpNj&J31;y08!8xzcA1IF2Ol37V^ zEM12x@my{$!OyyOayhu@A}VIhHU)t`N9|{7O1&p z`seJMy103TqS$F9`Faw+N81uU*Gaw~^JIQsW230yh5i<| z1s~yRj~;NzUf*#kAZrN|wACsdtp@;!sCwacRiVz6b)^khQ|k1`puZDL&~+qjR8BXf zmO*?vjUJN}-3(0Do|^AXFBN%Uf3Hylf<3Kaa-Cf5n0M=fV%4r{fjc*BJajX~GQo~| zyK27aW(%1!{xjGzF#YQh!~Wk#+bm7TOm_5;+i$A2DAN@k_yebO!Niuu8xzacMkec0 zLB1B2{XG=I^s8E32plU|XUPkztRSku=;*!u@26~|MK#P4dj`(*SRdY2t6A_8e<&@( z9(ruo3(%JRKUd3*QSMe=Je+u*cV}1Eqsm!v15k&Q$ zq*P{U#8=VWhN2pWwU4b|RxSIDjqNVZtVlBcmv#M0WCQ4rg(9^lg}x%Fo~z7N(_wu} ztvEyyqPe{pB2zq`mT8LUZzI;uMi%TT9DiCSTaXM{KP-(VCXssuQy##0%b-F{MuWLl znEedcZ`=&-sW|Y!N_u>#X)ED9T@ClJk4X?bFNvorpyW(V(8fZJ)-Ql)bbYq4<&XwJ zK4z9c{Tb@n!F6HHEb0mBJAIgS#X-r5FMetT1%_36;A^dzHw|m#mPTLQ4LbYhow)UZ zy#wgz-J<&0Zty+R*z|f|hw4@R7Zl0;h1?TP5j7(s2(=0doPlP2JHlXbPGaXlc_URS zmr~4l^Qb`4OeOnMDd$DpJ7_5gC9;`qvEvAARBeW3>{aEGTAVCB>9F;{sPtY^2$HHy zlG0_PD_D>3-D5(An*&m545XHlTKg{usDpovVPyLG3~G4e*|j5W34fAC*&X7wG)hE2A zHF^DIgNVtqE0l(1;ooejKU+B0`1U}{?(<0DuG%@7UDRkl2$A0541f$esOIYNHZ-(1 zTeS}E!?M~A3|JI+AYsQaF;@}p$!j%yaSH{ZAP`zj)?DvT5C#3h(x$ftgWh^6ZQ|p= zOrtz(7C|^!krJ7bSFZ!d{G~c*vRMtp>!F6YV735&EqcMHnKbGh6%RJ-`wFaHFJ}dI zhOB_!-EYJ)79K{#ej} zM<$rcW!5J=(nBMb9bQ?#T$FsDBOr_+xDJXt?D8W!pWG2I$)+9x) zQ^`&!K|f)}rMc1Z+~*(I^ExFVDRw+9<7nbpC_VHVp>Cc)FisX_h?;xG=M$euTTq$h z-cp^n^#q!GW;zEz4@14Sl%S2lp{KG>`06-u+>pI(lve>jOtwH)K&)k#NT#)YLJhf> zSM*mtbE(c;oge3L5x#OFxdK7^=Uc+6Ovzc1(T9Es12?5|dsD6g`m{U>y&3%0iAG_@ zKw4MedeLD!V}sjr@0EV9>5uaHKYkQpx+3Sy$`Q{_5ZQP?yb=;9V(+jSM_~sZ(t+2v zeRj`==k4Alt|uHU0a z`iUiP23O{ME*csyQ9y|AA}1vXS4nFCFHqvROCirp)-;1Ddzldxv0Yo*ZU>?iR}32#rp8o`CN_GN@3W8)w~sll)Y-+O{mRf*M+;cf@QPBZ!#c_ z{4||Mnb@3?4S){t#!{qmP{AkorFGnd_8^t_6j^>aVfN)Wl} z!5t0Rx@=!D`{VKEkN1#;bwN#S<=?DgP9;Pit;*ze4}R3wJ{Y>QYDHy&Z-We%wl9$u zOq)vKLqdXw>#uDFSwZb7PP9e!89t|7^6Q-lWs*hL>66!$1-!clWKX_j@4vaatO*&-HVrQiYx>S>wRTo66=AD2ypw) ztIoz7cil~JQ9iW>_mLY^0gk&ZO>+XzKZfnkkXfZ?AVwTk1;STO%$mdD%;+?qguFpd z7%;RS4PTI>>boqMAZ56WHHPq(?<>d-Pn^u44kc)&GEsF9FW+V`q0wQAb!?sPY zvLQNz;L-RKN+bbdK{Fuj{!r_taV%om3 z26*Buy|E*Np&JK&v!a?WJ<%QSKdmrp%j1cbBL!x`Zis!iDrI=khX3N!99l0VdZ%jkp!E7+Rv6sSAF1as{EJW~yF$Cm3oZ-u zq=(%hzc22wUE`P)DZj;|QW^{_UOJ2Vy!Dnv?AlKH%#a4MYhbKXlnTCRTMZnqI zr9W#x6)|m<(q-^XIoOgR`2+i7Nqu<05w(8^BMk%aAh+4RwAo@KC>Kp-jDSOi0JENw zXmt{QrX(GP3dOpEc?TSO*J_1ur6mEHnM6#e+()tiEJa|8{st7(E1v_3LoG(!hHA;` z?@o_@k^_70&DW(oV{cUW)b%_gdT9OhynnOR!uNYrWVv@whq)& z_QIa$Br|wTCJ6wh-*V&IeOZV&a&s;}d;JAUlb$1*C?6}E$QUr^Guc!9jH}sYn+S)6 zBrr+uLY6+r=0EzQokzjNbRpgNwXAAnw)JbtD``kQjfkPPIfE&VfKt<@B0m8-M;;zz zk~~b|$|g3>nD9A%9JtiO(Q)21>nBeJjRsbfX{F>m+s7ZeSe0}E;<}tG=9=ZyOj`U4 zTu}T*M~SzlD=*)jhR@I7w13;*Qm7xgC9W!Yp-E`jz&Cw{%!bZVW>JU{U8^&G`lDG-0tVy@?>Fm2-=i)~A_bI-3 zwx=a#iu&Op6O}149$0m!z{LLc#yaQmn5(hU+qa%pXD(XERDs>algT}6+kguS^hC5M zdlL;Nb6QvD3jvcv`b=7weUkPb3dBGJFTaf(Oa|N-^ue>h-8`Z+bAo697x!8|CDA)m zu6c0BbS6|G&u$(09kR@@eR>jm-C6ni22GJaEb`W)Y`pe>;1;LJ<#oo{msK~2NdJ^yk)E--iK_x zgg#$yo#{)m)aS# z@2x>&{;_vgx+Ytn*ccQdy{dC${%ycpW(&H~Kg>#WSgKGS<5w*f zE~J#^deaga*_{;TEgC2g+~>)%q&|+P;ah#r9@Zcz?PS1M=oL;_^?12G(uGS;{oh4< zv1H|slbDsTUSydw z*-c)XluomEzv(9LY zPwiz4GtZ<%?TJ(#+~-1Jo#pqAlIyNjFG5eTk8HzyUoH0BXSB|qUDw@el}wV*St{4v z3c7-`bcn9hD0Cj#=Gze~fy;B#Yyk_`NEM=aAmXM59feEzF?i|4BQ1wD0@#a?i+6 ztVpuG$b2~tAUz0noz<>LY~v_xrmbfqHhV3t%rd?@(uQ`iZsjk#?us!CSBxKDph$?* zZ0~J3Sc3cFU!yJJ$exP?;b0jZ?+}2IYp6itw^zhlZPgr!0OE)CY8^a0Pif_=L&(=W z9^CL_dr7RY38WZhqXvruyR^$m6B)^h7plq{gBhIO&ffcS7HlAJ6w^!yPiskE9g}{z zthvyoOweVg#XrbYRc0+*Vk!>t89mdCSrIpM-g?YqLnXAfvbAiu$w-h);iN(7uxWU$ zqV9I@$TY-LAU@?Pt42fgt{p#Uy5Eex_U?4$_+x>`hLzS$%rg;CD{?GzD*qY;A7T(i zYlt%(0IKY{vQ^bH>g_?MFd0nAtfzD3o}BVd;;Sni)L{qyGPNxd{!~nOpoS{;I)BF* z>i`)JC8SX{Yd$6SJ@#7{14>EE;Tu6r?O?9|tyXR*3r&E9@oZJKNq-%%vBBp$_sFK# z6I$@Yuvo?dsMN-mod4%{mqf}vV(D37*#+>!+&NpFhuA}hJcF*}htVc~VM%1u+m6}% znP%YIUyH~x^M9MmGpifoPPUG3H7LxCXAcNKi}Q?(EyPw(*DQ@y@N%~QLPA)I9 zcIIgnlf{zn8%Oiu%m)p-XDJ4^OAA~p8)eY+oG-99YtVxtR;5nl?C?OeR1mOz$z{adl6`PCr>*e{og#K^#VZbb);nLVlJEWITcc&wNb zNEarx!8*uWPsna5`wT$b(xP`;{z$d#8+=tFovT!wR}9PEq>o$RMKSU5^NH}6xs$?~ zCU;0j%^idx9UVY>$BbP4$=%g-<>4ApQ$(D}TFr!Gh`k?eA!|+r2Fr5UVu)J?wfEh} zAn$%Fe}T~tczX_#y~Y}|r1>76STtR}soG-R6qrs&YXyhqG{~&ff>1LQbSU3A0KFol z1#$r!QKV`b2e74LS{~lCiJ`TQUJY9)@@xR!FpS=^Q1yh&zfV${3+|JNEf@v7L+;lV z6rmg=1xwT9Qcw@fU4M4ZJHRY1!y16IO@7YU7EFT}iSVeiytltco)dt}%=^>PN)u|c zg)|{rIaYvK6z(sK!Yd&gCGcw7wsOLR;G#q!qfE$=R%ZQ$yaohpabg!&x)a zO=;;{g}wBpQHqzzg;;|@Pmy3v!$#;{8-?gh6Yd#pYlLNW=%ZaILXlWwc>`8c;x?e) zoJsm`AVI!>=XMJ|+LXwb7$~{K3HW=Cf} zUCqNpsCL&WI%vG>3oQEl2bX9QeX;pB2QqyIIa!`~nWpP;_sl^_-d{QF9i$78B)!lL zbxj*(ftn(JhH|+|sI<-_S~gxgpocyDnCPNQLYmB#12d*jd5^YnuQB#rm$#WXq`gwy z?kNg?pfH35B@CUQyV4JM0=9{t_9bjU73G2Qtg%HBS>Y27Q-;2R;4>0IWuQPe5?Pt| zht#~243^vR=DzcnR+dPNCWE+EDXu|WA&m>Tm`afzqD(JWgUofkZ{jmNv+U`zc@@CO zVwZZ*80iiViJsrsaq6kXo6?Z@5QAh;8F^!5q30^-B>On$<!z{V;X@9S zcFrUpf1vHlz22mL_kw@lWfzMnIn6j9ffn#zn1$OtW*g}vv|?)&=v=y~B}DwLC#NwE zIUTMMxftpWWvlOhn{{Htfy#$W7Y6y!{%GeDF=0i~r&Xzb>UUp6^{F7;a;dMES_+N0Qb_kClvJ$o=iJ`(%j7NY$1MdV~}G`!rBi+4XR;7!BW*6CQ|B;&f7~ZGte4$ z&AK(OeX>`*_&5syjlIR*;}DQV#2Nq~BFWIFVA~^SV(VUHa{ zk0DPHj>8Tm>rKF3K$@@hGuPOK+%O~+m_)^Cha;#AI1V!l<##C1`xNZ?0nF-gCr>5R zIUk#q`~d(|3h1^(UPpk|QA9PJT^4WwxN8dq{*>zD8?VAeXC-L#jI$Co!WDEeDipVX zB?E=NAYt{bkfX2nW+nElA?UY*&;cN~kTIiQ78wcQPVY_cpup0qXNw?!A5hq3lof^{*P36{-pN{gA|BNTUq z!)-e+&;0RlbFo__awQFGB(w4G@_Al#eEoiH>&?vhzPGt8(bef%zb(OoLsR{XtbC>2 z2<$u`|M}kkcsTy~8&I$P_W85?9*GCr+u7&`RWCBzjV_j>B|D4v_Urol zUhCWWnbehrcXR*@?Q8%2a{Wlhib4q9h6h~Uxc`^+Z;HEC$^Aym{o2#y z@&57RcQV)D9qwP3#m4Vj)tkZ~y4Xw`m@c2evC>d9G_WwP#x7&KJ^Sm@*qEl@p`XML z*&AMO>ZQ>B{9h-Etzx^>0c}Xv{|_t_i=`53M>tXZ|3HCugbT$+v03W>1rO;XnHDaK zi5 z@`WGfP1z?30DwHvPtn8WAu!XO8y!WtA~uoqXgrxb2N_{idOU$kLhi!|kddwpaPpFu z;IkAsK6HRW!nH~Zq3m0DSH4AIA`pRQJr`Mzh)NqhlbfGZ&i&z(@{{Z+f?FS8&Ud>k zK-371QY3cQ2{h_5Zt6o^DI2~3?$D|}0G=10jFKhFD2Qe4Ek6sAyG5a31=Uapv(dwh zwo|@z(9eu`5m3Bq0-bo%Dj47qq}uvIJ&ib12R8OPD`RPff!qRi#5zJ?Zl}tFenN3G ziDI3v>cLEk`kG-)g+9yag*^t%h=+9?3XHPtnY7@Ef?#0u(TWZoJrw^ZAsTcJ$+_*Y z;A=Y&e{UCe5!o*<$&PY&R)n-W#Kf~4rk5n<1+5kFqw8mxOg4Hi$Nn})9Xw@oCC70- zh8JJ7uk07^>R3_D%qUR^0y^N(02#FkW;(^eAZuu;L{Byd4bp60pB{y!1Q_$@Z=$ll zpAO((kNYo9_@=mK! zlR}hQgk@fot7gT*R?1$FML)7r_GZbw+#Fl_W=4L3yctQY<0dyQB%vr4av?l4X0_uc zBW{F+>t?`~d6MapvyEn`s-VDbQbsLtt;nSW$9W6eoYhV9wY{8~@_nSJ)B0(wl*GConKb;*T<_Gy>Xpir!w-eBoe9YtpE6twTetHA(uEBNkg zm>x`;@@_B$Y5TChVyRSbI@C%`jmt^X3&T=O!#~geJ!j~i5H=1Zf3rD`=@TdPO_B$t zs6x|KVVUZ&O-wkZmK@TK=c#YU%44~o6Ua4(Q zD$Pl&%uTAyORCIIs?15N%}uJ!ORB*hM!}6T{RC*Q z1Y2y1mybo>S5d@R_u`N|lru3J-VC7H*HPzG+9bC8R71VjNW)Jk$4Q1{4%(oNy#Po+ zd5u4-z0`9_-Q{$Il z+!9(pzz~IkPKYT2!XOM_i%LhSO642bIyL`2{iXW${BE|VYTFHPJ4b=2b;KjC9LxfIIb(ac*DljC5t7LpF zltt)QFvpm5-z>)fCb&3b_A#%}G8~4e`ZoEdP}YBf2TcyxuCi$WLOM4oH&Tk~ABjFb z3vy{`9f{Df#d-{5k*|gvx0Fme~gnRe~xj*bF!T59y>pCP4a2pHOp-imEGkq|~<_AM)>SX-n_o#V;f|*4!AX zP)mJXS!=Y96+f}%mN76c22;HSm!4v+bQJjnLrq^p{|DH>7;CXZ%Qe7?Em>wk^*^5? z;?@R2=Uc=ITWHke!k(PSR9W@jhfgWfI?yinFw?uT-X=l+0yXP2(1HKi6v44VLZ=hN zz#CT*n6wJYSzt9*}2&pj^JU(a(Sv?K*)6D7D5-h zWK4oV4Wf3j3T#d;Nc!9vmYS4fRf8vVvTcs%HhaVB&b@$C#n|OgCK_!&Cta7JkHphJ zm^e&?92jkx*i=bTT9mNp-LlHWZD-10L#4C*&=I`e&7PTkM$OKB+-`B1{VX@%k?Tf~ ztxl_Esy!&bB;|H)K_QD&mU3*6c1^)ppItea!g0W8TX1xBB|lH$LhjDwLgv^9)m?D2 zqrVl6Zmd2bajv(HZidkU6sPDgv(}T0ZA8d~DGi0gZK9Kc%bX}JUF6OAvij}$yuP^D z{_K@n428q{%8a!1ZS!L4=I;7Dy#9G!emdFK{M}ss-P!3h&qic}P~kEk>esd!-d~Zx z25T?;XO$98I`w6aq|;`O475`-o$Nw)_n4FCe_qbYaDO!p-%c?f@hqk!ow46+c=WMi zAX|;%ByAqg!Id=`#h$Ue4xS?)KW}N_e*K?L&|H2_KE9TJel90Hb;ofg>E#&_sT0`Q zP-|(b^Xp1QTpqIJXZn6Xe#CzJ{)P84(*Hlq_y1JmF|soK*EzRpjB%IEvHP0ZJ(@jF zR2Tz-@Inz*YiVxW;iSaz$Ekb>W^o~aj1hzAhv)L@dWb`JeFub!%72C>-9$Ey>CM&l zG8~+0ZL6g3-$>N?3C(F-*haf%HQ^sCoPO8ttiQyKbTckJuvwX%@6Bi(Go7T;%z?cf z`JL7cSLvy2($)^jr3`ep5fv)xpx}xC#|}T6gRyRzyqkU2RCu;fte3+h&-~~eV}Xg6 z(T^FtK4GFYJ3Lz6-5NmQT$(Ni?vc@WGY4N6leRb1{@r+{H-urVjbsH=ruz%pZa#@{5{hX^KEb1$EQ-gKvGQ( zH*SYTh@cjMyUmTco;8a_>3PXl7hhHq$~;W-p_#E!z7m&6f?$hDUG1M%Y@z|`0}Z1d z*Fz=jX9{QxlBk@rrOZ6{Iwchvk;EnVhx7b%EaYb%5E9^mD+Bzqf7v5X)HuRDL|EQ3 zVY(foXPIJwvYm=Cvf$zCO3MGRs|k(s=}%}GL#Or$Cliz3oNX`~22mn{Qc7nQO-TQ--ru zt#B7*%9Dc1;yzigROC4n4^K1eKXUh`GaP%Z&%}=SgdBX9Qy>O{_wqW@#P(fTF61?c z>rY%HHB>GLbAaTgunE4)cv3K2sd- z9NgcgQ9HivCuN+h4-O(OvZa)oQL3(Bwx?2VtT^;i!Zav$%6HzelGsH);3p(i;NVPb zu4k`cJkTkw@mC|u>ZY02t#Rp8YM7JX6rAX^#so;5l@EVr=8UWwj|w!iK!%C5-B7CB zFxzD%u5zu6Z@DB=h7&QPNDyddlMvuk!h`H~QDC$1Q@2L8(E)!N6>@T2(-GoJ0H! z+*c9>cn~ps)iKK2Dix74bm0hky9eXOYv;R~jQH3KC@TJ^vkm+w~G-<=%s+c^&IVH@7YP0C`{=ZgJ5#q`eYi&zgv*c5KLIk=$@IMDlVdzUsNUuA;mMeK<5KyPB?Gn7%m9)vXG}K` zkuSPUu{v~wySK+8c%UUhtB@0t8OmKFCosKahLUt1#rj5QfniP528p>?uz&en{iQVn zf8>C$%f=qWEvaol%tmw``-r}w@@BMT9=7kdchN~%RO1t!&;GS5neo*Mt zc2Lwn10s)vjcm%mfbY~YPNr=pZKvwi!SHO5&LnN$^l+8;(GR=+Pi6 z(MN+EqrZ!L?Oj6Z_iCW+Uif(akeG1u$5X2M@Ir3L@H8k|GGC=(EVti+b{7kn1KA#T z*@kYErSkcQTpA4_(RZO`DP2?a_ECc2Ej^DDcOA8JU#Q-^?D70%oO>p&t7CGPbQwa6 zER*gr?TCgZ^J5CH(czZafhozbh?e0@_PSHh%zrY;C(nk5aKfbMa%2S2JbnXg`SS;u zkpyHbbWgS9&sOEpBp&&LJ&}-h{qYN6FE=9yRRx$f<_Jv~vl+zkG`xRO9=$-`*q39^ zP)IQbL`y0mo`gn`G}b$#X6*+KhYpdhj6OI@O1P4=``nY*E>$`?Rut!3Vsc41$X8C= zr{yFL{ahNO#QjHKuQ$QT9I_Hya$L{+rxL_-XKb$S<_lO$UveLoY?*&Ck?WctNE|TY z8SyNkj0qB-!Z3F3W-0F z?gVLBXf5#ja?O=!Q$0+`Ul;ECY3krzHbq%3y(tpFrcl>q{(?9a25PCBxzHiAM3(`4 zI~SjXUpPRv6cDIw-qs411toIM)saRLDZFi$vN@g8Z)mAbyiM)Rj7g1$;bm4$ zw>kAJrc+JK!mt#Nj8MIyjOx+ZqiYWH%?^X*@nw@j1NSe{0NgkQEpD7$LP%U+5K7ei zGyT2_Gp2!pTgEBx zMT%xnJ!C z=d4!vX1*;a-Qy0+yIU-st!N$7M)@bXzH-OOZT1UE)-IkH5)YpB)Kbd&8a;C|E^1b% z;o&~Z9d*swI2PdJf-wFms;eQ2D1CTy6_Z1sdNJR67^XY-(TfX|%$}c-_Pz$Tn~ABM zxUzw0e-6b>)8D4LX*KUK9^#!RWT$(0ZybTnG0Rv@Y+G%i?9%pYK@U?mie47NH&RFF zLDIeCD)FDQ=p+NVdhCpnz2+wT8&^nK)r}WF=uINt}+4GjVr5yfFay6n#lazKOE1i_%6<3i)6IAF_XqcQh+nkvS zmt(<+b9m!2xG7_PFyp;1d1Kc1CA(`U(G}9$iR< zORz)=%dgZLda9!;v&c-03u;V?Z>vqiD1M73crs!-uB2B^-5fbtq(Wm)Ky8&e5mwSz z1a&UIQIsoOhKw)Sc~f8#Rr9^fjuCNzm33GQW!Ba9$rCT|5u?O<( zGza(|KR}IxvuubXoE}u3L}Z28AnAojEz~I61b-34fz8RU@DvF*Lwu)V7?HruE>}2D zEzLFAN5+_D61s$I8QGPtqqjvWp~@_&RiHD?yr3d&Ia`mP5=Cy(p06>^VFPEyJ+$9s zXfUC`Q)J*))TzH=2qcQ zqJ1fmQo`^!Tt!je|G?CGQ&4z>`#^XLq5yqwNi$e@$6pwCGzhdHc-XdYD3+THJ|L)P zZ5U+i*})taGuC^Ao>!?@5XSTJe-_Y;B4We`w~|Wm=St?Z+z&T9_0@Kw~!Rb z?htS{A>w|%BLsJgKg34D=t0qV6Fxj>oSeJpr=YE=IX`|>IGB8Szj9PN{F6#2=~S@J z?^iEQ9eohtUR2Nk=&B-dhfgCgDky@bem>R9$;maW61o6&EJePR@w%WRh@0U;^bKwo z4oZmJC>jrhT2sSYTm1yWU_e_G4YzP2rh9e_M0r5ljkPqa@~iss*F)5?(fZ0n#Y5^k%mdyMMDo1Sc(1oi0MAWPu`Wt{NvzHAR?x+r< zNm1SHv$vrO5ZEy!D?A}179=EI%h@+=!N>t}2b>LM8Sut_%hl(O`joL-(R$_`1dTVz z?GF<_giKJdlkqUQ8r?omo3qIF*s`rjX@; zb9Y8Qk7A`c`y(GlD`f6MvOAi4RB$gxlRI2TEls>7vD(dB#4Hpm{CcHHCcoJ>>w;8Z z23RQ{_JtomrOH(eoQoNOJXV)KYukSZ9;7sQkzr!s>RaRjZrCH^+Q*yTU^TH%3U506 z0bEcVQDA*@6rFjYiy|BNSaO`qX_iz6@7^G(Ud-CcFRjlK#h(i_71L4j?96Rf{Ux>? z=|*RzoMA^@D;x>5yVKxOl|l2WMW>WW{aza0z?f5QJyo|$C>K*25H%GjE=kj0B`}I` z$i<*p6@hozEcOG(vNI5;yXI04>#JLb$Q9$eI^UID%O*l^GLwZ(sH?ia=Ig6<=QhNC zJe!bVX&SRubrc0WAeBxS0UJBmzQs?#mpwQaFVQ?SnMfWh)>QuLWL(E$b+#{Kg4EHc*Dj@4CrL+G%`Z8q z`&w0-xs=6#iR8DM`rX|GHbYy1AmlT2(0Ud`#Q#z;XqX@2Hy zdxP|Ru=hm1@#j0>8GlI5R1vB#8|+>iqHC#oug^XkEs#=H$MxNC?S7LVI@?+6lkOfN zz1qzXdTs3l{HYJN4*TdsyQzK8Aar#okf>Q(xs0rC35fO8&?K*)vEaN?K#1hmJ;$0jFHa*EUod1_W)nd3zKr)qwd`t_b`l+KO6+ z?56k;ex~rbl4nV&^AWR{o^-={YRY?vc`tK?sj9Ds-f3M(Y}YeNKN!W8=5t>B*Ohf}zcq2}$_>?>#}ucYk3 z#->4K*sq8Mg*i!rT*>0jVhQd9BaCFue)&`#?0x1gBN>jjo4P9LN$kAdU#;FfF? zACTSw^TGIK!0@$jD&tXCNduVf z>15cMv!tG64@b~TL5ZpFXtdM{>CG(Qlu?~}Y2t1T1p4VhJB+R$jH{WBzp$5(Z<%r( zaX73KCi!-5u3KWVVkZ*(BoN+=CSknr160(VGOn=k;LzjvYcxEs zXOK{0Kn|y~j#rQ1eoqY?teo6M;(V$Dul%{q`bHZKe&jBy3Sc^o;JN(k8NxQW_q*=~ z9zt7(AiVp{$@p2GnO+y^BRi2CsgH)WBs1=c#holYmhbQSB5aA_) zKU-5R3Lxg}*S7jsT}#22GCbEuzf%3ov;fZ%BgJH?|L;{FNDEul?={xT8H{Ce*FvuH zg*F5e{Z$oGq2OtuYn?5OuO~!fOzYbVm{;~-|JA6qnkT--L!Zz7 zXY?GRgF#p4kBQm(sV|{MPSur0-gTcW9U(Pyu;LnTEco`-J@~;)&eq>=e1oq#V4Nu5 zYRHd!xzPvoa6$%rg{sUPK)yQd*Gk-Hi0IViI8-YjM5ufLVfq2~GD#wKDv|FZx9>bF zqzg5<658o-I7e(x;)rRE#hiQwDzZ)31#_NddJ$B($j6`cqsc1r-aU+?NX`V6XSBp? zU-iF!HrnOVxeuRp4|*x8UgN*Mpnv64{)MfxF#ac7XJTPx{%`9emNm8$w_0F)dwUIb z3$pJi3y3cYZCj8!Q%R#Uw~RLIAM-TrZCO@S$;VG8b#?s!o}D)$waL<7j8g-|;6eEJ zz~pvrY)-Frbi3QyKOU07540~z;_R$j-PMmP=m1K51gQ+9iH z?w$WhVA!JU!j0B^Q6*RcVuJ<%>|=!uGB17LQE&qt(?AfYkc zFetl%g%0%U6>EW}kTHUU zOEkmF{c9uXOzjBI4znS>$ECdZEOd_Bp`(m*F%Fe|`4iclBqQ2=5%SU0(N3c*Jd_h& z=;CKGg-kn|@SewOvo$YBs? zaFxzY`=9QNX!K=Np_%KQ*R1?fnY=*-Yl;XLxU4V+%{R8I{a+n4tB<=lQ*RNPLa3`1 zM_#QfCLdQ^utZ`0N$mV%Ircx>a`#QznKkMnjq0<7aL-=b z49*S8ZtQ{PcZhtlBXg*hZOWq~6I>0NZ5J};8$#CD6z+1~qcu;Vt5*PqY+>GqG2e1+ z3SruNB7`lp=^+V=T6D}#!i27&>c72mzH1WL0lu}WxZHMzbX&sW7bA>9a4}94gsW)# zGp>uo+vd$&)7mcqo2<|GAod3%U02>=+_&Wjyvw=ld5_()*bG+B zXlS3AtD{~FX9m1-vkb8VvU2jOfM@Eju5_<-9VQeLws_fUKxPrVr)OTws1bX+9krHD z&*oz@q{%bcxHjQR?D$zG^xji43lWa>9 z7g<hu^ZZ~U#DWL_^1?}N{Cfd(CpuT7`4IahvwWzSLO_7+mNFnk;Msu1DwJ%9{A>bj zd{bw(4=?Oah!AmuVMJA4E+JJ{m|S^eErOkU8myv7fqO7P{jNbMaz+5MTS9SsT&?*T zRo8GOwIgc2Ww-QSnKTf;rFxUs znP3;6D^AD&ZBT9>_Pu1PBiX9??E(Z17WS}@>WXlE*YA#mX&F(N==(xZNpKbl#lW!$ zpOEB}PGAQxju1|8JXYIN!cp8!lE7#3n7~LR86=sygGloZMgENgwNjqp=2Vk2xLT8$ z5QWb$vZ5Rq@X~%<0g5{=%33Qukl#cn19TTzT_(PvARTtimVDyv` zIuVB)qPrZXMst--!sD{Y);9<8*XQ5(^By@8^+l^%>J&j46`1*>u3~GO8O-#NM3WjE zO12m4!S79*w}s1uXI?dbHPCCdYzDK2ag30FT7K=kN91ucibqp87LK7XL6Lrf?6>d> zD*Nx=;=1vs2VAkGRDAuS zPiuN4QIbpW4H*wy9E^BjX25xWkh?<%!PT-x69&<$b?EG1VPnV{GoA065(&AA9xg4S z6m6s6#4jQjMYHzO*}^>KIAgPml{Bp4Hy`(bo$OSH*#&nOZ4;64C%tEFKKCjZ>Fjr$ zSN1MR@a5u=D+pI*MOfVKys1*Q*uxM9-OeX>kQYs;NN+F{Fh&nzK7_$P?;(&c&tKjy z;ULt_Ft5jXc4ZTLLPw^ce{HthwKKtG_Q~rchE{)T0ll*+P9wrc1dMl8B8u^DHtOrZ z9Y{|JSK1o&@nbMDOocW;3qy8V+*ccwky!}aGms|#Hu%t%z~i66cB`J7o&r^h^RPer z>mJMoTt`wBImmb8vns??m6>C^i@sCcxU{tRqjD&BvR$EsF^Xn5m*w=dq9YJe#<07B zUc{`^gsBNT5Twki=4@sjXwHlQ{bO48O6({zWnv{jp6l9+ANN&&{+e4xFPPuJFoIQ> zL$JM~#n+VQ^n}*h6!}|*P#&e+Dn?cqR?Uc%5fVFZuZN`pNDePzs3q*@0#~s3H&|81 zFUctQG183@{sDF4uGnU!&H(%kpaxBb$l8c0YQn*m11kMlmZ1jOzc=%;ld@{~fy1=X zKotua$@t@Q$LIToJV0T-G44_OO^BtSx1M3-dwb7;@~zV(~DTrj!*&XwTfK;`RJiAZ|-F_lDf*7J{Ql9?;As%&!WTY~KX5x<$Nd%bqX z?vTZ{Gcf+6n0GbgKp4*ru0^GuQ1^j4o<~?wIu8o@HVuYHXEb2T0I{C}&z{*07g2dP zj8iTvOs9{lHpXAi4L6;c9p-px39?HB5I`F;vIIlRSmy}m(3~8a{fS|}h?0D8|6XwspD5kBou$eL%xQfwp=E$)H$_F>X9+hs~erpSj$ z%hS_X&1ApB>Ui<1nq3=a>OZ!ds?`@BiQyoAS6|cbW}-^w?SS)PN7zV*sPhQXN6yz%uRVxYhcU|zaBGeS zYCFFqwt&~ccD8&_EgX+WDl2_5d#XayTLHKNed6+)VKMsFEdX|mX0&M;p3I!y=t!#} z1jYknvtM@O`fLQMee97k{2oxj2{a-tEM-sCXjm9wbJx5l6lX+rq}t;^=8l*z9Um`G z;aexlh12`{-xDb`LJw-JzVm`q&TU6p9X`##-xue?Umob6%%nrsbz)gwJs5X-=Q5Q| zCac<7Ko-*3D|Z4MwgYB2tl2H4vS~u=1tvKNaclX#ucH+k9U>wJA%G#l0Ok1ROrH01WKV=xy4N?@{bN=nBU zhbRAv^RQ7Txv0~ggsB2MnoVqP2_RcK-&=BddHATqVdIG-b9RG|zi2?FtZ7QtL;~`{ zb=SA_9Tv$Q*I@2>MAdRE4ErTA>2inI8)Rt{P{ z1c{x^Xbrtbdu5`5M~&`H6d=MFNpNejsR|y$uM>+JaX?yz=?wJKHe|p9Nd<$7yj_32 zALr}SF?yb%ZK$>f5ZCkvAe!k7eCb_!Rbuo9;zFq|${cOfe!+48AJ9SXFd#Q0_FaV= zTE?7IFVh9QGUDR0OM-ewHgUNYv(EJ^YWt`_LXAUM@A=?SY+CAm@7pCA0D`+Wwa0aR z=bbej3vbKx-u8UBJ_)WdtoQyy^2o;V|0a)2ENuU^T1%^zrt=XSir;I!f+;~-70x8- z@5>GL_;I(KD=#wRRkJFxO4^7J(h;;mpc39Z{d~Iu&!{HKQEe~6i0b-!!~iF6K;Bk2 zr*}UGcmIpn@~#g@{#){{(JCz2@TAX5_S^yIvsZM*>uTqX{P^6ct^Yn`opW+z#MY_3 z-M*f=2eUplvCY8{KSN3_zD5J{+n3>nt9wt9gtD-%`3K>ZWTb^t5&=9#cP+l?%!JqLkyoY3*k^Li$elg8vzT)n*G{J(JkWm zZVCIHK{;WAw(h{;{l?-Z6G~KgrONzDautmX^XN5of=s5w+8YK(*6Y`R=aqNhFnaVg znhE8p*9Jk%c4qU2#H=;w%kM)j6(dREi?A&`5`?XB7V)|(XOhGjW!uXQWOP)uGsu$^ z1`Hla%XV^P)Ntuyf(2PwaPB%aC0oys9Pa=uW;~WZRi_c9Gi@PcqrpoaCR@MiIBcD> zzncjHs;+>dTT65UUwypf3atc}!NMx+NmRA2BtnuI=7{Sa*^m2%h_t6@zSQBNDVh+8 zy_u;W?E45-$bIm@>Hwb;XpR`rUk2KY-eF%(S|UaJC{U=yM$|@PI_0DQ7@F4YqY+pb zQUasnJth;!oB0TQ;)fdLzSY}^sj%pr{l~bo9qr8DBP((+u%O4BkuPH>2&-lC2X}gP zOXYkTp_E1lHLn9}p96Ng(_3FL5@+WM^U|6cgO_}m>Nb%}?wJmkpCAJFW^-NWjV$8# zwK9LL|IDzEn>I0spr3$pgG(Jptw3o!RUtZ21lLujItJQtJd|~cQH;d}OVPYrk=0~i zi7?Fs-?`WeLA&}Gzh!V_*}5|(ZagYpk&08XGX%ow$Abbh?$S8Iu6YJlIB@Vn)T7n(GkM6@n?95>X;tYztuURB#PPoY?_ zX3XYFLm^KDs!B6dRfDe;?6x6-BKiGZ6WzC0B$|Ogk;5`9gjZptV4qwn;4z@U;$FYJ z$F0c2M6Qm_6aK_3tpEK-C@E2UK`Lc@fJg0|B|6V}ysguiUMMZIZH!L2hJGclQ& z)=9)%Ku(ZGiUvidgw6@JXT=KoXjO^#+>kkY?ct$7qI}^j*=17dmwyV=>z{7G$Dp|f zFC{Z55Nx>U{;%*+xBU?$BIROXEQUgUacVXS@g=4@3e{rO0kLnNQ=f^HRnh4to=kyx zxyb};*$kEHs6bhjgsG1Vbq+!CXnH&0)5g6zt9k02wPr;ksR+3$HzL!Kqn*z0V)h3=1eZkou%=x4JfRz5FS zK8hxqI`n*au_Yhd-xGEGRThf`iI)XLD2Z7;ptb<51rGuJeX0WspuO--vb`f0Ekw)U zQ!UW-_L@OxFDSV(v8RE$B>^OeJdrNT8oB^57g$0;e_->XZl5;!yB7CRjIP#|X6$T` zxirlS3Xv7c#4IsWli>sk4fy)g*=-Ky3G%$`f5QW z$5-y~*{3lAkHf29^RO}31pKVbvktO}MGHB*!I6AA^nWUe5uK*F^5lkQ=FEtgW+^Mp zaa5X!djifd!ot*zEj+#x4JCtV%?KJNxMe=A?NBi|Mt*BWw=%-_U~Q#;u$&VqEpjl| zD_DiXYR{B-ssi(pQKWQlDxbv(XdBY)9DAdIEv7XObmBd%nUF5hi_w+!(!|*~55MDXQ(Rw24K%+$05=sGVhgc1oC8^n{7}bV_`_%#FX@L(=BRvh*wDcNFzyT?R=95! z;K53)dPEN9IgE%P)h}%>4LS@Gg0ayg5|%85FG1TAs=Hewi)W{*RVNEYo)is#sjYBV zV~VrQ)Jd6bmE!!3ti_C%%Hx@73G?zLl8LEv-Pxk{ylSY-cVE87yY*(1pvcV>XeD;D zkS`lO-KA~Ng4zjJ zH{S!KLR&S|T#asUdTM@!X-N&q8Symv(r5J4A_)jJnEJ4|)7T6uk>9+LL^E?>yQ@9? z(9vPG6Wqp`Fd!+PPdK0q z5%pDHs}tXFB-2U7heUL0S)dv*TqF5kkB)3vJ^#=${-jm?Uj9s3h_D_6>}ecg*yS7u ziWL+niqCw%e4S@>kA(P3EkqpuvOWdXhgsv4zj^fKARUMdc#OEIk6(y8xLpW%w~66JoR0dYFE_li(RNpaTEu* zRO~s470+cBK1=TcGSQM5^d56izW-cCVp=__zOP_kjZ2}XoRJ2qo0qSE8=7kl$&@>7 zxp{EV@cG_y%HdOJh3@94+)dS)U3i(m7|$j325(lIm&W>deK<96gqI4H6Z5FmQm$9> zU4(4nk$kWqNcUZ4E!`nGUv1KF(`4sAa2Zu}H&ByhbztGv32Je?Z;c-s%j4l8kFAoZ zi-)Pq;(OApm#fHhwEQxc1)*P?x7T4EIgO{Y&%QkW!Oy)QaJHBUrbO)-loJ zJ9qgE(RF>gDk!cDLc;&!`$k+xmV>ee16GGt29^C849OTH%FryyuCI_E`5-0x_Qvkp z`3N-P?9KcEgdIIGnZRzh_caG(%+G~~eMaeQQ2;+@;&oeKWT7rc-|pM*=su5^dG`j_ z>T}qM2!({Mr0*BEB*iubbVQ3#dls8XMAJr&d%NS6XEwjXEiQZ9@ZHi%^?(zeMxT9l znLcFoC1RKDWpGt~?mlOG->sRV%*Rbu6F(m8X7&80yK=BoO;Llz+TgQyD?)?!rI)M5 z=W@5(cexI1XS&TJrBh(#rg3kVVF=EVxG{b?sg6Y=0Zyr&dd64YvO(W0cU>rKjMmhl!%aaYoJg#|B%s8a~%MQ%<v@3KxJS)@^ob0IqpA|cd!fn#5G8Ezk>jygJPfTkbM&cxnKjW!WekyeO7%c>=0 zp$(vzE0Tj@sd$GdClP)q5YFRN0_#mT?=q*)bv{`E*&$95>}sL7C(uhEr1LTZD}`{V z+7`){Z~roCP|LN(WKLtCq4jsROt4w{)BK-Py2u1~zQpv+)7t?3b+O>sS}khPb)F~R z?XDP_v|4N8+=0NS-;qt31ju$#k*G?P+Xgr8zVjrZ%ooai@B`+O$Ju{vE^&3HljJy!n`$r{Vu+tbIMRIKA@a%BA9gg1gsW**o!izJuGvuZLBP4pmSdwh_WJ%zU5r$Vi z7(PJcs@@B%!OfaR%;RWFuwh8H1C8ZPE;y`068jG0r0KTK`??GH_xolMJQq3-D4H+8 z=&+jJGt~+qTLZ6oIi5_c{VK`5(7_FxH z*JO^g<~G6Rv~cUduoikpQIrhkfZK7qeaJWmWBx+);&`v>h393cm;*TehgP%arphXa z(B}#Oo~x>?v&k=BT6-k3IAqbrHHoNa_CeW7AQz zBNCH~2v>cGWAF&(Mcizh=n7$Pj$%vp(KPrDtoB8v_ zrqwKzv2J5F=n6fe*Dr)weA>Y!0e*QwmTApo!bKe)Du%3HhIoC@7o6-hn{_(#=jUr*4?9dVeK~^iC%sBICTh1B9tsT>;R%uucsIPRUXEqp)@|GA?Msym8+GbA zHJ94A+PNFuoqZk2&!y5U*4~Ht3RsaaZ$9}N8u^rZt#pcmoG#?wii4777$-EjJkxit zWz~LRtZTm2wxXHXz5+|xh5m&mJ*i8aVX4AQFgdK?z~7YE7`Px?dk?1$12acIcGT7` zeE!c?+vQhoy@%Py$EmY7OBs3U?+mWS2mYM3`G@|6fBI84;w?PEJR9>9)A);x_I1_N zYS*~-pI28_RhN|7cciFf`{MsTQCA;nf!C)}oq{i%p{tYH!3BL7MRAY*2#xwOHs&Wm zhcaxQj=n2z;*8iGM$?b4QGR1KJ&%s~O?e7?)SWq=)LLB1zq9~cP<{py`OhO@Bz7OoZ!gP>Z@ zegc?jRS$V*`K3Sv=_0~soggM^3?N}@kTd^k>|kFc;XBv1P)S|QCFeqtR@kkK3L{cF z4izdyr1bwt8!OXRjbi4Y*ULTcWBot zZo`Vup`7#qKRFuZakjx~LS;j#mwDCduW-yw4ogE1BcilMbZgzFuPw2~vqdm@_9h~@ z&Z`6l?zYZcN_z(?&+i(PI2-I9Gfbc*JR6(;AT6$QAl63=3*6Fl(5(bK^5J(RmnMAO zfuN#sEvFQjiFn#o2K~PdC*#r&?5c5J;mDa#;f@8w47CY8rRWli1@)B)>RD0ow}n<@ zn3k?ZQ88*r4QsTBK`3w>lVg#cKrM8O*jw9<{y*<7%8kayueEaorxrJjQ@%^8jD*Eu zy-d()Z~Qx`$p|_9L%7ZAYh2#1;M`o>>gjwggi95da)Schv32LWh$l0~aTrRf%C}vW zbBN?4C*E!B)9yA`O9Yuia(uJCA7=%n42zrA#mp53HtGCJLxaTEVN=-z&*ZH*IC>geq)8t$<g*Db%M9PTj*1Ym^xT}E*?sLjA|b>D^Cd##0QWH;d?4UD8 zoyfnaJA0Tk?ZB;p3!1GQxjusF%mRm`scBjkU&2HOz#k&x6Z8+XCe1=UzCo($WR(1R z3R(w4YD0&q<^b1_n}mA88#IbBM|LT<2ihQ<_=yZ;!tL5epqt%BW*Y|+PzGn!^(hJ9 zi#9{s93347J_yau$8L0Ght+AN9GFm*(U4#UC>p5Zh0m#_R^g#U#`9koJPGR!XXJSv zH$GLZ#uH;E&Ht@dWAs|Z@hAkCe&1EOa%_v+rIC^)k@f+i7w(5wVuKu93hn53o5296 zr6m7aRdTilWSO&dp8ZEgrb8^Uu^=^>z~C;+Ijoi!XT0#4Tg)@0e*<+KT)_g-d_Lxw zG_QB}GBu)m#n;+tJxW0J6E4qSTWJ(o!jh2Kq_McQk(}d3@)oC{yE6$+le1f>o<04> zW{UvJtz3PM0rCqG1QdT`Gs7vJu{jTWSpB&<93K4r8w!;DacJIi^OGMMiY4|xqzsJg z|Eo~^|5It<_$S!%Kbs{u+5h`lR!v=d+;#-tJ^jM*(?J}?A__`|C;;iKZNL_B#PaSI zMp&a>eRAjK4A#eD$xmOnaea4ff6Fd76aFksI2SSHgF>Ou7&g_e!b}Gws>H1g2jIg( z1mwo3Y5mMZifo%mxX>Vgnu7@+({Y02mJmaEqp88 zn0-k}|3T0+mMEmzA+G3q(L~R4T1E3A@zQgehA3&OWEmhDxF%@eFra@5PDip1WD-MX z0T@nmBsIinxlB+H!}OC4pu|MmqR(c-CDLJz8Ac2Z7}c@7EKTO;Aqh@DU$KoTW2 zpd0$@R|lQvqOnwD5U${#D8XEiX`}Cq+;G^~8V1u744vV?MsR+|fwW>9xYBV&YpBm1 ze{id#B!dO`rG~fPC@N>cQPEr(%h1aKG6pKHLN)w@E-8VCawxiq;y_V- zFI@HtymtX`5z1o)6$~uRIM^>pb2vx~xV$XJ&nUoyN3{`MP>$3^iiLAXt&}n3lAw&j z&PtHRt4XXcK%z}uV1pE*!zj{HaTYEf99FwOj-0HsitEqQijPJ4`SNG|oL55bOFnx& zmU@T4*%u}&J=t<;r|nlY0-`iVcnS(~X{%szHj~&!93B%l4MjpjveZ9UmM8v+aGwI12sy&Lg) z_9Z{p<;Ka_u}c4Ad1sS>=gK9z!%yP(zFs}tT{dPFscUYm;+M`E%!mF>+_g-{S2J^8 z@KeuOXUu}Wbg$WmLEk{g3=iWtOyCcemyl}H7E}zd6=DTsZxDAy#?2fQTE@vf-hTVq zXQ`iN-_pPPMP8Jp^T=(QkogcxL-I`9_T$U*RulX%eWm*i9b(nNDo)JVTDaNHxI#dXZ;3yn0ioRFX@MdbFR4tdZ9wDRz5h-ZZV8r zga`+8uogMCPA;gcuYu-#d?fj2=Y4HIgl|f}zNsEqnYx{9p{20rOFwY+E!Ez9p3Kii z*FP#;$4K=nKx4w@bD)&lptWmflL##Yxr{sr#6YOvYjvvb+@ z@RIUkJ!$}^hA^grXL9c!Q|pE?VEDx)C&llbLT%cJZB%L_p(ZZ_Fo8`vBWbc03!Y2$%%?GR*F*WL^+Ml?d#2Js zCg+Xm>F2Y})#tTn#AlNhJPyo;z_gk0A`OQ+6JMgft>=c@FBOf4Gj0UQDmG=lU~FCj zq}+fxasG18hGG#QwjJDM3$_0PW-nYyii7^5+N6j`&!Ijg*6>$_Jo=EdQwt5eSxODD z4u!YKJvXlLOR0t#6rfmK?HnTh$0ZU!O}AW#MW9Y0SC49c>~rFen{@yi(}Zv&glPJM z-H66Rtq4hzF(|1etWYCm51mnv?Kom|(I5ttm$p=8V$2eQ zlqy#uZ*TqL1+uoDmCJj{OuJM$Y4uOMG7~qRf!KL zS)Hi0EeZ2c<=f1(! z+z{}*Ir?PdBwAq(PT_#Jo;62%L(E=~hB>fIvc}THx2aANzj?M^+&J9$)fGch`0Y1_ ztDhP@TI|J3AMJvTaWB)WNA8JChry6Q1|%ugFYljNtvDUNszar2+!yX66PRH|glOi~ z$E%1qb&}FNeX*Hu4kpkb+IGx2QNEo;JJ0tOR}0nmWn?%4vZtkx za?4!fIp(^H7tKLI7;?)r4+1tpounZeoN3~VgBsK5OA_T&TH%Asxh*#>(>puNfq9p2 z@Bz!iI^7L2wzdHb>=8Hg(>yVPNHTY=BYDl2`nGmiDzVCp8TzhFOU1tppp8gPfY*32 z73rXbRv=hqR*CQ25bTXfZbIV3iKSfd`dwZc9je76cf&FyRKuccSf(x$5+U+bM2C?; zbcDunL=kXZ!$DF($yG<{PD;&6ia>MR*?<%%`?w-x2oPHDKDWZ@fiXus$ejQ*k6|GT z$OM3vJ%786H0(runvx9(v0zD@dZv|$;`u>V3vpSCXVi%`AjZR|2uB{l=p^O(O5)8^MkMN!+3MbnC^R6torf&3u zc~P+V1DEmNLKA9pA9HU$%66QwBmQZPYg&VeD7JRQhC2K5KP3EBphp4gM_Nm%2m?ge z7Qp^9?PMwTIs;D7UUj@9JhjCT_I16iAfyA0K0S80)o7j>nlZ!TrxV7ian6Ut;S8_{ z68sHJhO_STi#TmBi(lXr5+mhiz@Zru=Y?;plRE?UMge@(SBFl5nn4F6RY<{rfbeS( ztQf`PjJr$k+L(v*9nH)6a4A|{h3V&9imXej@$uZ{D|g$wWIGSV860K=!SL!ssB>a! zqL_#*W`)<7?$sUSg+=6+fJ(MPM2SU@ku&Ap&hl5$#;NQGeVIO@3rjcm5W-@YT$&{Z z{g=2GUk4N0RK5F8Y-XFj_ip`20FGYXi-KH0!?4_$z~vhxSHj@P&1BzbsfPfkh;R&7 z1WK-|j?Ulupla!>#_05Vx=kc>KQHNs_=aiu_TR3bpzS6UjgUTEA*CtHdVIPwg!9(- zi+gwsoQ_+2?Vrm!(&WwUmhTO6&8Gb4;VLvqWVCy+RrWtPzSGJ~;Q@r3)aJA*qGw9tK)L3n znzLPH#2~{dxpY^B^+1ac7jhNQABGbg8JkyVQQf!>z!O(t)=f3)0%=2Uz^Hzx%=uPa zUw$43qqdnFDEYy)&{ME2S2zCq6zK8W&3YrnCCQ}~U~i>~@KydDC;f;dOg>{t`H)D$ zT;5#gpQW+Z|16D}9-JsX)*N%?IJ7$b$+ehPC8e$rw_umK=T|s4tCUV+gZnnUvr7l?CXz)bM^&yl>2Tx@vXT|x!O$S9T3ZFR~62p z*fjV3y*x|56%RrB5P#)P7HI7i=Qk z?m_l4i~Z4=oIsp8U~>Z@A;#KXn+X=1#pP3Db@re-H)uDbE4PFB3G8DE8C2*MyVu!; zniC}x8ws-?q2r=DV2~tZB)Qy7m>@*0yjdTle6jJIHulii8*lb*wJOD7P&p-5BC+;d zQvI~X^%zlPfVpd z;nAM-#LuJe&*eNSYYN7BR91ic$fA?l7eBg)mqv9svUzzm7t0+YOW8j^GmuRT_%7c+ z%rlgMw*6C;0>rbY6T~Tu)nV^#mvvFOUN1DWWD-~t)v33-fBHHeF5eRuHoeB+#f8(E z*bIX>xH@m1A*I1WDMS&h?z8m;Vsfm+dQqI>(>&g)N6s4hsWSUBW=ix^YWwYDheHQp z1-!X6d*~9uo0bfH=61kBq&ub!;tmvCFciWAoxWOjMyxn!pc!>it%O$IStrg8b%cA-z%7U@7K zo%CqJa^tIHcarU!2pzHkQ6{$;Z_89u)CU^_*YgMR)u7T;?f~{DC6poj0b5_bae@RiZ{rNNE>FW2j zr=E^^yDMv7MliSMZg3&3kxI%$mn>q^^T@}A)A3RZgu1t(y1Lp-&0kEV4YtLL2k3Qb zf2OS8OKbZLVAh?oz>H@(HGLx-<07x#bV)BTxJ_1QL%wZI$5Zlv2uCuTw*>ws;KPF3 z{|^|6^*?DVurdADYPQ$7n@(FC4?FsURk@H=R6)QX`-$zOsNPJ;oNV_qH)>3&MHCW; z8N}%LZlABw(M=L~5b(>|+N|E`wIb93}a2suz9eP`V2u;K3m z@eQaVpV)+FRyRIQ^kl$}`n}mQyf8b{WVy_$pKz2t7EM=jy?s`fMtJL%MS6QDs(9wu z^%PFKsIuQZ?}{^Fxe4>9#*Dw9L6L-J5))BFeN2$L&MpHhv7BCBF0TOChq?v9H;az~ z5tYd`{}2*%E~ov+Vqkzsp)<929bOdSUBmoz=HvZUzPUm@c2GoAk%!KW&=_IB2s8x< zGID?@t0>rk^x;GPaxHU&04sZ@#Zbg_^SSa$#KP_fZn(THU|PIwQal#Peb@aXj)Bq%lCpe@G}_HXkkgV^iwytwyN|a}AHjN-0DZYNJ}~ zs4y-y>s^%7PHU80-9?Kp?UrejRne^lSF0prkI-rI?TM&b$y^|h+Lr92bxED5$>hLX4aXd(yO{v`)k+wzUtVGjJ8PVaky&xYXUNlx+&%QkQ z`&VdxN^vh`RG+3&P*G0doNm6^NYnP$mMiTC43NrbaMC3t(cOi|%gie%UGC9lGrkYE zw^{sE-aUui!Dj#>LQ813f{+VH0-I7cN9XB~O6GH1Cq9lV4fbBdrVkwMQV$A#prU@E zh8W(Xs49l&PWpR#nbN!`l7T%><<(Goij=iUxI`%;@KcJy+%$*fJ4+q}Q8|CfVoC-| zwgM8E2al2afi}t(&L+_ana}jgBD7V$lT_1F*mI^Z1T!Qm5-}IPbJrbhrg7{Q(&;`@ zL2{Kt6enl3ee^@uJONzz!}u^^$+ySn#ZdckJZqEi+YvYr@~6bNihg#7)^+1J!4&=o zVwNHUzW2XFHvjJ-FAnM`p(2gu8_=|qN@=&(+$j#b4zDXI%n96w9Juk!x^HPYjbd(4 z=7ivR9M5oPGluQb*IcJHg^3S7<3_TGeR$SaiFgAzIFS|NcUWtcTk)~Ts_w>=F-j)VFP#*+7EgdqAOepK6yI%=90uPy3OKr^-zpxB z-hZ1i7C7tqRAy=FGQIrPY%C%0aNMGwA;SqRG=$?MoD@)d^ ziOTmM*-^do+bX`DMBLVx`GkQs)@@tSzCF7NL_lfzAx80q=|8vVX^~hLr2~)ShWa!i zDU=8o=Ew?V_2I@iAT$L_fRl(7yJPnK?yXJ4GlEnEqF8O5MWmrNa#o&5^$igBoSn)s z4IUCWfoFyzs>to7JVCD!UOQ`P?36Ta_N?lzG6R&%AwVBZFS~o^rYIarWyH9~$oXJ9Nf>VvC>&fQ#a&|@=uf$Y)N(b3W$xG}(lz_a zzHAN_mqVpt3M0K8yze+MV}DlCDd^6)IUgsl4Uq)J5l``j2xL#G)J74P2#FBLr-1m1 z|Fnh<_SBJ&z4g%+0z#Z~EgQlLz2?^n^7D*>XLOn0;V;!O_JuyS8WaR!{PI$wD-Xr& zchbYG3qrS@2FAk;_c1ng{rM}GU4F31c`JD*7~;Svr&u$>f00ic!rBBXCrG-FCd4J; zm%Ua!4*d;eAE$thh#iahFXDT!;5B98iVzBmk^hBM64u%T!e%!G2$2Y={ripo0)g39 z*aV~6+2*3gdZ_&**T2_mh!a3UxxJmYn}6TD-q%ed|B4c00M;qUV-*Y+@T&;^z5vUW zGa5IE`nyF{Cj#6lIe9E8u{MQ^rugx_KE21^_jOmKz5|hJS~~%n(29dmpE;jdcQmTP z;qtjpk?pb+Z=r)9GGueIK(*0i8=>)Y`kfw%j(%h(7Y`Md7mSF2?>O?AWdgoJx7KUE<&UX*iNOA~Qj{M8T- zdOe06(q_dgE;Ns>1w0T)?kvoU=xhs*JCn=bKZ|&cYUhpzR*>M-wDZcoL%^ud4>x?@ zRKjpL;dzw%?tOR7X5eiCX)}NY9zci({W0h8f#)`U3PmfZcZu&oFJWp*sXwC;)ojS8@ikf>t z8U8jeHVR24H`G+pq!bEL*rZGXsuBO`3(?+hdH7_F%zaScFFZ=C4u7)9jUFTvy+mnk zFImrv`haASeEUkYiCTHkVUYTEgdZ~clRh!scPNSe119D8PeUM_%>VWJyxCv6 z&RZS-+5v@}eGAQPuz>o@<@=6vPR+8)VhR3Co&*vRWwVN2N>IgZUHISrt29YOHH|Vz zeH0*f0AWOb4S{IfjqU`|@8*2@c)PihY&#$~b0iENx^>=xVvO7n#~kpZMQ_>MFLrVw z@}9k4|1Ev$d^AfokBaJd%-^$#I*jD2XSZ#Y`omK?-)_20CJG!-6_R%NxqMyEk<}ex z&@wQ(*h680>>h~4s{qG4JkeRizdlZ9-oKsq{$QKTgQ5un zcfU*F<8^OgYh9IF$e$7mDsEopqcyioS>S-ck91-aMv4Hl`>o&mFG9=_m@X@D1^tdU zWbP2Tw=d&C@2OPmkRFh&p28H#G|HRcX(Z&3zABPp=&9H~%f~0W@o@^#Ia;ZcQv+$L zvY|4qReG6ngLTRuEo{G|xo*#Yzyp&W@vghL7qPhjTC7zz@U;sKGj1Z9yMb=+eD`+C z6@M->7JHuhs&J}f#jISxZBjx5mvFm`u9GTETUt>}s&xXOL;Y(0!hm(qMT1C!dCUM> zA^TwGIv-(dbEmsyYbPQsX(&>vd_}4&FCjrppey`0W1x{ClJT8`2i^%7Scvtw@&&yk zzwQjph_7YNNobu!wP#876>A70@*6!+Ia6*Sr*JyuqsY@6%AQt7Q0 z9>_oMuHgouFSvM}L)cfFR$p>fqN?Cj;a9Cy3-Prok<5<4m+yBLI_H{jSIHJ{`op*7 z6oeOXkSwe~&vs@Zg@wZpG#c@giJkymRg!aUuMyZO(`8395)^pPaYy%}Fj-#9 z%pj?;nge!~LZC=AFzxU2Bd{0+vr#U(A0c(DSh|0*29ee7*p#z218)n6rRP1X*eYs3 zwv+P|c9#u-*k4!6CMs;Uxl{P4-}hYER}A9uAoj*ng~u2@tpevL1ofgLJ~0HOW_=8E z$?D zy1umouAqMTj)|{dT3_Kv8fQ&f)tcjW{;?Qex3I|FDF?&^N~B>?zV8q^G?;*r%_^RQ zMW^MFh-6~N8iEu`Xz|5%$dZC@o2iwCi*0b}A=QtQoCUkpbPY*?Bw+bsWmEmdte~vA z91MU1(Gmetu*|ij(SrGYae3BTrD}(z8&C{-do@D>bkQ8+gEcWABOBF3JLrSSz}ORM z;*LgZ(Wd3@x5eAycJTv2(w~jH0SVD`gv}1iJ3a&T!_UNH7e-SXG{&5vO5gX}yAkP; zf4_#BAf+TGd^fO4*uf|L3Wgh)E(a9e6FprTkSm0FEgW^O&GORCjJLCU`I}gymb+`~ z`_XSl$&_U-mF6-9xKRziTse5V@S~ct<`#g?>bKe6G<&33B7P&@+Vw)^bYmvEDKp>* zd8l3Pcw@P_=>yrVQO!CM$yPGa4=&cX0m}whbK`-A6h3DH$-WvB^d=Y6N?5#bZ!{g~qT`%NM+7U>v$-{Z8iQHDr~~S&CZ=cA$KoTJpQ-jA zG~|KXS0T#-Vx^v2dq*ZjSC5(n;JP&pFu7rCpo3sz{CQD(h$vbQcvwnpA(0m&OC5C# zelY@BC!PkAqPV7qW5;4WnK&+SML_~x$FTNF2Pv>bB6Zi|XugXLO)uoM?jL~E#i(3S z`sS{^e}!4SetQ!%Juz0t+aCcxkO_8>czl9tAsAprT4(Mt|me+RzwuHYPi{ z5CWGMlYuxiDI5a&=}|D`YxKVPcDUOgJY9G-LUAaYD&I|VV2ImDK{S2Vkkg2}_&kLHCsbGS0lc}@A{PCFeAvp#lb|_7Xsd>ewH=RniDdI>C zCPa}bSIT?7>V^P=R2KMRyXlwAuRCYh_m_qZoX#oefknvrc>huWb7b!r0O4*m(FtI* z_npU<`dT)wYG1t#gcZDNN1$;Zyj(dk-%n;!mfv17LHVGKe6tTxFH?Sv z*?49-2pPx4gz@@uX^Hzl^~jeJ|2A+nVQWx!8G6~{f89MBYZ9#Fb9v448(8fB7*{C> z_bUaPB6W=d@}P?zu;~1aYOwLd8|wKJEv4%3j6p>S!Jpau@oFCB{ririYaqWn*zC1N z-JhQ*Z4nv>d3O`WK7Qq`|4g?Xr3TJboZ5>g&#-B}LQoDH2zjyr{*Mgg44GRLNT@+h z_5(;aZH7%KzeEUADQ$m+2uB~ke8|IZQ=u8m7a2XBml-ReZXPG%kEz(=p8AdGhPQdf zrWlJC2PVhoyIGV|9V2*r)iDY)9wu?rAI>aK0?%*bT3b^B4V1Us6wOYGq5&$;KJQXp zq{iD^@@)956t4U_@4;r-*rtvcZ+30;LBumZ=*2KqVH$%oik?A(J{xppDw|ItV&ec>>2C}HaZun2R zpHck9sW*Yz7O|{XAtRjIse!+{x_@#x)ia`UD=tIHkV$8+p`r~FUiV$-P_p$(tuO^j z?f^3F5JB~zYbkm-D{y}LZn}#LkW_|Rql4=l(Pd(H$Ghxq*KM&ce@ryN%up7_?|Az=Ia@MqNDKK#*$6n9Brf#h&y3sKImCQs z|2CN~FPH$7FN5pq3pYF%KrK>DVc_og%jgNH*~bDm;44X}xQ8kV6{|whW7A?$v%;V1 zq94^pyv6SBYx?2m?Gf!_8}2_nI?t6aMT29LWgs{Y^`~TY*j2;vR?)TvEA%nO+4~SD z>yy%1F=&#r#Usw?lBPl@VM>>k&<$zOd<&+55ZA$Vg--6SQ^r6<`IB-V#)mM3hM`ZN zi^G^guK|}X>Hff<4+p*o$=<|Gwh@v+`2W_;OeovcJ%ix$mO-wi{Haj7d#uie>}4> zJw5Lp%S-QXWRyRkR4Bw{?`|1?v-d4YTe4H~y3?nwi{84cJw_ z)2B!x>Ofr2svk66%O#O0Z@eT%pIE%+Kr^R)rYc$M)`kvPoUr}3pqx*o@E}wFBje-- ziU4&)b(z1eN>fZw8#~!(ExJEEjDV`aI2L6?C)Qnx!GK^utP&+lhLRi|se(CDKqd}p zkD;v;g0mk0cyv^1Pf$iCAqT*ImR#r>KqD0tXz-B2XyGaZ=^s^nPr$PhBj`+tc(k9c zWC*i|k}3y6kDwzgLdOU*t}#@kF;YN@#tk9JU>m_IX$;DEgsLHOu}rjv z>?ei#O%j$9^}~d=T&Xc1tYEW}JcexaWU6GNYF@clN;fFO8d)?_euD)9UGXdVqZ`90 z*JfTKbrq)csDWC7AcrPV4`c|e4tpTZW!Yu`Ud^J5jRTHRVRxWV4dsmEfDNL;*|(iI z;Mj+OM3x&s9ssN#f$#TGYk~x0s^}^NZ0hV1V6x^xl|aj(G8`!4Iz-?AUq(-A%F-s_ zWY6jY3KxY6J5mZ(_Eg>0tru2xKO|*$WtR)yw6JwTTG}oGhE)P77ip<$L~geS5+}G2 zk7pqdDh~BalEg(~C_gGFLm7fM%#Fztx!oUYK(38b*@nFQb1nyafc0>+XRy%o^U>(O zz3;V%zT;xwm5zVFk?C^tzL@%vQ2vTDeyrou zCl*18zkjb2WnTl}eg+4p<9^kNAN~@2snd}jSoJeP{7pLDg zY`%;>uEuZ(I2B~s6Z7h_&f<%pA_X#I)~^|&X=^%FNUD;PVNcGstK%!xO|;VmAWnC? zEQ8DBw4M;@43@k}K48J(GkmJk%)3mh8SR~e!NHE<|88Aau}`)gUnaZS-o5WVTRJ}r zFK6E4@&2y6{0kp`Tl6&*u5Y2=JGEv7#aUjkWyP18^vs7T8Ark{I|DU^u;QtkM~UQ( z+QN-W;eOMIp4NWj@TS$fnH(sKXZy&61y|(QtQ7YC1@SIxkv&3V!8js=YMb-`Wd(%h?gK&t z5@h6{PfSd@d_c(R*Gb#jDxP?c6ytT#<@w5q@e}e~s(*Xfp%+J=?qhkmWYopJItQxq zipy{8cB4q;PIc2tE!pi!>WL0rZ#1TaeI4NDV8B)bCEgMn(x(3e%ODpO8h0#$w%j#( zx;2K5fdm_c1;4eKPrG4EX`YImu&HUfN3%)N6r1f#(F9qIMft>NQ0*SYM!e9cTE9z1 zBP5fNs72eP5f@YniGKb>FLF3~ZHroBrLm-GD{Og&DS5hQgEr0LA=oW?*ll2gX2rlc za|J6jR%0v5C`LjG6V{r|sH#l2)%S23%{QTWH|$BTvRk^1J@)$Ncd&so&FP%@B9is9;C2zdn+X45R9Ou7&Li`znp&1#O<2?Vy~}Hr{#Bj22^#)yo`A_0 zRP37E#!!)Es)qZmao1#g3r~@HH*Bxv(hz$ES+(Cost}tEkqQ;Oup*|3i5JDB4H6aX zn#oWlP~g;B^D*!a8x3*5;I-WoKEyh~+yD1>$innroH3a=82)EmYa7ej{&3{3%Re*# zjRT5fktAInT-1=e;gX<7$C-|9_!wdCXo5(_5i{wYSoFu++$}6gLXoS23sscg5x=Ra z>0x6XQ>!>Uk+qYvqnn$vt5uXCYHG~=bAH?8=&ck#QW2q_yE_c)BjX! zoH`5vr~TM+nxS>{bM*9kx_)zCWyxVx)?+d43*G9ipA?ynURr{(>ME801V5Q3JLW2a+O zkmlCMPMpSEVp|%mGfVsE@F0es?pxUkpzqrS&S2qt3ZTEDt)N1E3pc-++f$A2Nj9Mp z{m*D&EDDA;P+Ir{lS%n8+ABk6a`W5c!#8h4cD8vu-VpjzW4H~)V_DFA!>i18Mn$Ce zF6Wrja3a;~NbQ*e%${`C-38tcLOee16!)_a)Y&!e1lQ{o{sAr=xvTU&`zsV5q!hgR zS7>k6^phC+cee-Mi5tO)vwq|SvY%UZ+9;;O zcUHjstP`iD9d0P@kyd387P4`!roB(&B$aENg$~a|Ha84CaWf>0EaY~WxdKWrSh4$< zXNnqk-Z;Q46b0{)WjG_|-ZP6-d8f@NpixPpAGsSZ291} zCj=9$)exE)YRs}Rw)O}E#Ml9)FWU{?M3HR?Ej9g@nc~o@)~ncm082HcncrZ83pm?t=a|+FIGDW$r^@lV4yh& zbVmX(y{Fd}oSCSa$|c+LCAi9UbWhrvhvKURqs{yRFf z*4<8zNow!)5V^|XGP3}V(}&%|j|7=yodjSr-wCm}@w?luH?lK3P+IU(B{*x=_=vMo z?cQomVD=+;2`dj+HP5%sdHL7`Rh62a_G8bP^;3FJYB1gO8|@~mp8=O3W)>f#-hk}^ zjE_OZJpjLZ#2XMt?h20{V6{P}yS};e%dxFKSvU%pSj$O3Sn)GWv~5-1yEfxS%$u=d zRp_g!iT2JrXSvZUXw}1hIgJ&;`x=n9Z<==Q6>Am`&I9ktAU4fBOwonM`22u>P9si? zhVl2HLH0L(IGXN#P{Wa-!n++7F|_pX_Hr*txG^{7KGE(x*C5{v!|Aj4#6|~Mxx8$r z)%}s?X`2^SKLjYl3}1dt_Y+*|!@$TLvF#>9Eg%KF^e~*{UptLy;y*G$sGfJA&qcEi zSbBywnhaha(yuj-Femu;)y50%a$N$oDq?;8>&{nrm9F5(ZP9BW8gruKUdoNi%i-&~ zReqfhj&VPu1;>+S zfxV{@tUY+&z|#j7Lrly(o6R-EBZR*_WI8l3dWjU_Sw%?{mNViw*fxpJkihXUSxYqD z@UwsdEURxtSER)3`mI+?+54z3iCnI}gwfOU9K{#o>Ar!V{?mLOUOl6B@6X97)h4e} zu1N>ZLVVqc2qV8gOTKomL$BS70#zo@RYQM$shvq_W!$?3DiMS2>`z_F1t<}E4s%Ce zjygs&>FXT3R4VGUb|scVD_rU35J9WA|6-qn40S$ZbVa53#NYl`5b!gm)j3q+MNlNI z3TBVO*$M}oA{^_UUV2kTL<|TOme$Wq+ejD!(*EHWPUW=$`o@m6`5!aFoUCSm|5^a;#P~Cakc(VY80!f6@ShnrLUcm^9HS^R_lv%?IN5-CB zseb4WSe{z+qxGr$U~18fO2w$xu2USp&P?Vi?00v#YBtsrG)f%sXs(r4AaD5}1{v^R zu~JvYdNiwOV^&|+dF0;Eq8phJQ2D@sfZ&W_I2@Wt*Ok=DT4p7=GuCdd`S5YS^yb~5 zAX4j!S)&2jG!gH-?`b-OJ~s?Sm_WB!ETjO#Q>I!>cT)0e!Od;WH~BI82J5C4>&x-a zMO5U@1PbNmsb*(3ztl23=UZp}1eRnP=ZENWlUM|xZiC8l(;YZ|0RBBcxjv zI_c&#^$WhsAA0mxuxS15&S<(Cvc{#CX!IJdhy-0imdAMbTT@=B4J=s*bpUUU9MW0j zgZ!e#z&;C2>jPECFAZdgL5ytAVee)vY>OENj9qFh^BnWoZ(86QsR&l3-I(h+3pGeM zwAAX_QkZnmy9q}$zYRz283XZz;(&e|wFxVr5kcMIde5A*VnCABc?dOCSsex&synGU zSC&aOzJl-hp^1`%X7}F=id0k?%NsELz1gPf74=7Z&WsORxQ$42z8fqwtuS*jw5|tz z9P{aW9)|At@}p?|`_~f->dv*eb7xA+T~9v43>+P#c1(?#AC%Uo9u?OF+wcAM%MP^V zag~+$SgH!<=w!-o?YmRBJK?|0U3-paupKw}*FRuiSrq@}dYFZU^Z$h^{ok?GvYlxxUxTq*tFmd^i>IE-RXyd4A$;`rm1vq^&{W~cJ4b`}>VMEQ z7!|TXC1_)O$)Al3#E|cK0CGp4Q^E*@GLqFNlmE)|a2#sw1o8vG5K*t^Z}~XXuwH#x zb;z|x)NuPc*^A~~zV^eMWV-s^-yo-ly5*zs-RFo((0uKG421$V+078Gw(Q=B$U4=g zR$H{1i|XX*&;L;iomfgsXD+exOxuy;Sxx)7GIpzBw%?yRjaUBGZ1A&Oi;TS4z$e!; zd1ztr>{LA7u}Qz=CLxm|a7XLA`XX_;W|_Nk0 z)+d%MUk8K>rMO1TJf-Gz@0N_mEo-4@W?9Ia61ms-VmO%&uJ(4~Gi<3eR*z_A(B_#> z`s#?=ecgz$S@xPPZ>zU#`IqdCxKg)NfRpWZAQF2@1zv3~ccVG&T6x4E%~4u+@R>F^ z@APsr@R%_`j;OEhvX%4-K1-^$j#9np0xO6YA%RqG+U&h&UhT{fC;d}RUftacRU_)K zjVjC@LlQ<`6hiVl3ISYvy%_@LEe9ha7Ew%8jWYWxkD_M1S?Xf>dwfW}yu>2fbv#TW zxK7nRL=bUZBqKPN#CK{j;bB3)5M%a-k}oI4!?*o2T?;ee*ODHWOjSpofCyvhQj8%f zRf#pfx3itEWVq^B8)2sDtx4|Xo*5)sxfl#SNe3knYYa78~KHRV8EMs z<4c7Cg6k|e@G?2@K+re48%Lm;%2cU}X?QLU8eds3xoUM)SR&E7^0A~(LprM{t1Xq8 z6WYANw0L=2{vmvYzf2w^z+j;HiQjrA+Hv6iNraEu=1_n;KMrsaGXLsyG*YMuN>y zOoJh@m}84UZei5W3}qlk1wtv$R-3~Sql-EGh9UG2W6M|^o$LEr<15RpQR0dVGK~;o zvMEBwpZ52FGz62aq~L&^wduE@zn7&nfR6!@>c_XZqpNXe*`$`L2MB1vPE}@3LK#5? z+a#M_fxj)~?JmaC&Lk29w?RNPs?x}mA+eGpToTyQGJB?%A@3ZkygV3o@p5-(&lGK4 zEYsjDkgspJR-rD*s*QnzV>Va6Y0@iVB7R2i1@#@{(K-VI_J9X6M{_bp<=kQD_oOpv zFKHz|3&7hzrm^xaqRb?fQL0hevQgW9o#a(-8}Em~;Noi%_%kpJL8-y=$3SY{xWBa) zu#Y8aP}4WlgJINXQ*gi%sjQ35br9SXC2^@UP-JPsV2*8KPKH+6)DCDj&{Bh1^qB{8 zj&(#Rrxe7`f#4F`3-#tUqQtXi8&J*ys$K%>uFGbSY6)0{HwBDyR}{nb-+>sgT-E)d z3-LllqQTXM9Sc^c!>$eozzh9W;Zf@rW?Dx=_BFaS8S{mWlBz8zX~R`qNJ(M^r{1> z;z~aoXdyR^9ESAbnTQVw^(R+8pgy)N{Q}!$XMl{jBTE8yU51O~{Ra?J{ed=efqI2Q!BtFv&5b0G(2omN#`VrIi}y90ZWVal9QkPcwKj=cVy1Q_${=IQJ6 z;~uh*S-Ij5K3o-8wkeg+s9GJVaYmO-f~Tkp1Yr^K%r%Pe2U^eb@TjqT*;%D|nP(Na zFrT%<*KSOIgcHf1a=WR@6#=W4c#SRraj~gfgS|1#UOX3a*ymero-Nbnzw?$eHjhQ# zi4$5$DG=DtyYjxTe8(euRW6EqKyPW3X3$1VJ^=#CqXxImqGJ^{sD94Dt8%=VcKC1) z^RL2aF`eDh7Wb4T)@V;g>}rX{Rw}c_b~TLrF1*vphfDQ3dOH2D?|=7euJNx%H?SwS zT7OT>_?3%(Ja%Z!nq&24gU0xNu2b0@VV({4uj{<75AU8IEO$YsEY|>-9}PvKR__$wWWErMv?vdHt&f1;_W$XYovsKG^2p7A{=|(NuEW?^c4WXu!gZfCwLi^w0W-LQY)`%v%pSZ6@_@n)j(FVN)A*$bPZsB!H9_);Mg3-g) z459HoD)-;e7tb9bEJ(snXXEneq@K`I5QHI4IYOw~1{dQUn$)glXTkf++a#GaaRWU! zF1|YASa%JcX1_bOoloTu!nR*1wpUGUlY8u`9)LBJ_v8`CG&2`!Y=;RE;(3+uflO*I zo+Z6W!D&qjtXTUc}-cX+iK?@d%`53#Mv5CJbCkmz->R)ew0HTn(SU#f8_4?@#5A?{|h|K`d?{} z|NCv|GPbq-rr3Y#+WAZH3xs(e{)M7|q_v9RwfYI?G&NM8|F!bIz<^+#g zZ+SZMteUxca>e=C#RpX+CfrX6_q%C}9{>JjHC2V$t+^dR-^d z;0Czp>Q$dQ9_W#nBaALHE&7P{@$(hFITvG1TZa1-*+Zb&YwH1L7}}Zy(yi6mg>Onp zw6kFB)(&cprB&-bl``-%7o1&QT@p|zA~|RD1P!@jO{1#}H33mlj4|t+Z@;Zf&J^f1 ztLfRbaF}ViY$+N7w|=4@nkL+PUjxaXlxWd*L#Ik;6;zs$`L9Lx$ZWLgkiXV@@GQCx zTCsv!sx{O@X+WhdzgZC^ly-v=mwSXdjk`p4(w!YVLg;juj*VtHyql`{$xflg7Px3E znL#`j5aB6?Ne7c$lu}uaqM*RO7a2?nj@|44NPEQl)wU_dv0;MpZ-hL^yOzql9$lr%-H z3HLYDjsp%16oE%^<}j**7{J{&D%0d)T)8u`F3d0hU;eh35J-l$8iH)lY2cUTAnys1 zCE^MH()7Tjk|ilo3TsvuL9HuttHZpV)KYQ1r88NOEbSF%2;fU5;r7B(3E^{W_ij0X zy|db96a`}jOC{d&Q*($Lz-Gk3!`eh3=lD%Y!QI<#B7OYiL)D2`|!Ox+STVNo!(jE?|b2`$>*VnlR z7-zM^BomwDADDKV*6WWsCv=+(IK-F&dIJ@r3)9INEENTmLv}QwjxD?K6K^YVc+Jz| zz~P242k5BqgGT{ASYPf?VWuvA2#$YTVkl9*XrdH~>YzY!(m9}p=Lzyg5LWg$azGIW z97!dGi(|On(*~S3o}TYQxF2BB>iK6r)9@&q$^EyZ^V)pQ$yd=(l4%Ga*lk_6 zNT9dgErz4eNJYAS7^b5Nic29R0S!{bVf8%(KoqNSIa@{qZ8u@K$UedGqjb!P29*td zktm8S9s6y-!dxo&6CTV`jmU)}I|AVYN+Y__Hb`@!Zv&_gf?Fmep~=T}Jfcz-qb4b( zE8;v@J`5n^rnTS%R7Z6#&Ub!rf{-yB2)Xx~t} z?IK}a1Y`U@qqy1$1v91tu+D>5$U(BWOay|1(a54Kjb00Xp`lMopj?Jwp0{St|MqTU0+a@f6mIY^Sl38!pLvp*tcs#p!cEX2JpS*z(=Dh3YG zBfvox<$xU-;;rd2nqI5nolEBySdp10=n`9;WZQ2u_{j=d6rl?qy0oXu!bcziezRzT>640c6H-{Yqkoo5I{L7K>&Sp zt!XnIH=KiW_BeD%YxI?Zd!+49lo{7xWblSzPgsZ%)AK%-aVw z2*_-P{DxTK*j(3y$>un3#bEFbT$~www0*XZ%>cQjU{|Xe(;#*tiR}}-t3*LIQzql{ zA66B` z5P7H4czYQrn&t!yYpHXpfGb32zcgq3g_H+SD8n@A3zRZ-6t~eq=U8%Rnfk}yaM>a1 zsZa`}4DYGrMwB+#yf|EZ8MRH?N#Z;R!MfX>a`Ns@v!f%^5Ks5P!$iQlAW%0ObsAD2 zVIp!Gwd>5FK!4NA7&!5deG4xcq8TYD&leu+G4A*cCAW}UlB|(AC4n}TQ3FhzLz7Gi z{p&G5y5kjzx$TG}Cw;Ag#K$u8wOL^?!Ez9}HBr+`1=ye$IG~#cb+`!DYy?W~wiRr2 zbF}J0(hfmplC!l#$4y*{ZUUw3uy4_PF#TbEe|&-gSP=>PW)z*=x#$GnIaua^MCQjz zl{2AwD!bj=qPfJL*zIm{Z>-K{XDr`yXD>jPB^yp(R%{w$zA(Wp8fAcPM`BBji_n<( z?8|0_DX|mxT(XaE###8*J_DQ-p(6RA)}CHb|=br+e-<8ufKF2 zZAv^fzRzkl0$BArZ%037UIe5cT(G%T1(tBTgDWUK@6DL9qUrr`rgJ3H&6)zFz~?0dWmsCBGWB)!>lJ^5ExGM0pNrFSl7Un z?7Bg3FXDX4_+eGq9^zZJ6i03+?=ZW;MEE94bMtk?;AnLdrs>s{Y{L-W;cLJMYlS`PE;5RElh5!R4tv7i zNS?KG;OYf=(j~TcM@=JFy-^^SihVZ@no+dSUrFculuwj zh+<;<4IgP}Apa@w;2CH6dNzW^>-10bk{_UkvHZ^eas=RD_%F~lD?7*k3T@Y5TK*mZ zo_~)34G;=ehRWTPXlLN8X~?d&Rk5jP+ct;_M-oI+!lV`LT37Km-VbITnU9HAfQy!;Y-0Z78$hb>WO=l6>B-Sci>q$p z9EU7k@weye;v}7l&ObGdEft0dWz#h^K_!8pJ;BIh$MG-o5wc6B0J5zK*}ToHn2o`P z97MuE)q66zO5%_Aa+`+VuV$HnXU?ML=fKfv#UU4)cW%TAJ)zGC^h-3_@c(IXEk zzFBfKf;U(~tShg6wEq$P4t>Bz10x{H`lHj=o@;Lz`Y;XdIAKwx=S2dg6B9&rW;Avm z1$G=5%D4mJ{pU0@03t;WriE)Xv%-$7v=(ppm|={h-=%A7&=`J#QsTiz+zUQtd4VD* z1WggIL~Zwx1^+5wSLY^_^;mQWig9b9Ey??nR*~NUY0}BJXy?VHd_q4i|hJ{)g@ZkX`e-pLdMss5dm4-WOnX}HP zlfgw-oj!6cLmKJo2bxbzVW{8C2*9a8ygi|H8pvjGg=W<>h#2hxo< zVe(m80j59LclB%xHV{z-UeYPzkI277seV0D#nGcT3nVhe$uTsYr`1S9jNA{rsiBrM z(E}IfqAw=@ULxx-HEpE9(jgpu2<(e@Gh_pb#5Wa zB#^`QZT!s^cqYgog0?_35xkOB_GojK!uZpMHG^dmV?`a~!4{ic%veBnbS?%1@mzQ6 zKFbwf_PAH%C#J!in@6UjUpFWD_55~ty?wuZeQ>{w)vz@IQ*aR`ahTJaE5enqvK&8c zJN$3NT;lCt@b+Q5&(wrRy5s}(8X^55)InGMEjrW?Dcw%3-HqC6bk*|p`xDaHL*ulm z*L{8bpf7u%i1=vHGgCY$L**NZ?a+Po#$PSw@0Qmuv+sv0Q-^gaTpRV$+BmOx zNtlAh#ybybNUe5q~d5d!d74JNMZ;UwM z2KpQc+AKox2ZYI2vS6{Ka6!^kssvQZm%7?wzfevef%#fBWD4LF{-0+n+X9OVV^b8g zGT_9ME~~@`Bv3ZEgle8W;u9TmgV3N{dQ(tp%;ZRRnF(YSZxr6GXXQT7N(~>qz_?+k za+pMfW_0TP-GJJ6H%=5h7A6J`q5=4_N) zS63Qfr24~L^^zeB{vmp4FuXa!L`XNDrGrRT_@q>o(N60JffQOrL0{PGkT8_Ah|9ul!O1uHWjY7gPv435xvu13%;xFf3Qt z55CUsB!WF@_Y_+Iu`Hv_61U@`Gi=OI&_uV?O|y0SWrVT%Lx_g2e@N*tE-*S6RTZm{ zi3ZX>9r$UF08O$x=SZde%sn!K%m{aU&Qh&CS>mZ!)~$hX7ji?5)bez1c6YOUeXzNxnrIop zg2g;nnyx-+{s`%nx$a-+AUsk!SOhS9O){*BVtk?We5o@J8j1*n0^cy_w(&BUve%k2 z1`izo)S=>Mu!ygjxa4`vZZb+l->IqV*R8juOMj!MPc{`AH*C60>p+o7%akSo8yV+1 zTR>X9p*12E0b8Oj+%rv; z<=G2v%NXb;1zgnLjZP_3H~+OTQx?50kr$&uc@;E|506fo60RW0XI_)QBus^x3c^t! zZ%b0kt5@Eqr>sn%olh!mTs}05Gy~XhAmQ1kB#&nS7DxF*>k=`r0^)|mCS!AbS<8Cg z2OS0$PRp|`FcUh)2_d|KSzFF*aEySW8k53c6OmD?T19TdHiQuy)^D0gcG!3Y-k)J` zkg0_sSU)bH$SlZh6y4s3TEURkMVU-6>=h^zNXu4iVM?9?I^$(_ILNuA% zl+_>AxS*El(rSzZXjIJHG+aeG8LC~ingp|ti}1Jm#?|MpFyPMjOIh5A^1qW^el3XX zwtuwTwe+%9i+Ve4vWjt&;5>gV%T^_`?h6e_skz{E-$4tl&s2bJdr{}f_dZ$uDQ!bxAi0WM_?i23x*kwYjyj`!{w$sQu zg^;DWhOq6ypDlckJy;c-|hsgJ9XvG?Y zKuUh<=7=3bjC(wKB^h@^zVIpQUr>g(VOhPHSGk2PWcy~anS()O6%&;|zl^ct7=s!x z$w~W)cH_W#AGH^TgNOW9|2+7?<{6SR{VydZ=YK6RS^sAeau3#e(l2|$w>L<299Y$~ zpQn!+UYj)k(x&n9Nd`|zZeo~_Fw!(iMZzl1=gX}aFzQI5)k5oofjDP7ws+2;&C~{F z(!=}d;N;>BdlNP$LbUe~o85ZwArrqt458oN0GqwyZvIzk(B9$IrookG+RJNFQE-Bv zX5Pbj^hWHe9$vcjfANoX71HzT9YzD)J<*;;Z?zjo3 z+O*ai@z1_+>{ZOuRZ(qjdG?kTK&k3}d1C(I6PW6nKATx6FL@HDqwEBJ@D@Lh7f;dp zyS}gWduea^@Wo2!i=G?{5aAhA^$scqtH+%k@l|zF6oPdYoY}&pyhoTwUWC6Ht+-&m zgWfw*^+&>XJB%{!R}LP=zs9};2S@R# zpaOt@Za6PC`J8O*IB21Xijc zs1(b$WgY<5Wj^$^t*`|h;zPeZe6o~wc4FInE?9BAhb&`Yn`A>`r?h>ucpldMmA1zI zXHe!26Y3Q9ris@S#JR$bXA$4cn!>BI+hp<_*IENfV;HN@HVyrh_p`12ByxLb8RPIWUw86 zxPvXkv$k&jIHL})OIzN1`@@#=xwX$*N7TSE*+z8Rp9?}q`>Z^J&Ms=!&P79wA5Hdi z&R=qCpO=j4Nvoo1n-Bd;CVbWx9OsWOXZY+s?I=ye}r{||9Pp$Q#C-ZK(QmRs1CiZ(e@@T%#%*G7aD-=x* zwg=&-%AE)+_D3H5(;8F;xbPkf`;S}m`)8veB<8I#a~=q~kr=>FUgD-coV;t0@p z;|Z2x^}9ocf8PU>r4-bOGE2tnj~VVhuYUgXPy4ed+crjJ5p*z`78UN6Ii=tp8F}O# zM(8(XQG^8)=SD_nza0U|z)*h&Ruq*-p6D0MTsKtPjjW8Cq@3c!DEYWQn=8%xK19cz-fxGh}X2Y}|CsypNus?&RoQzt`*G zvKRU?ss>TVso|rQaDHXG|H!i0Hx1KjJJwXfHz6CI{hSJHJ!zVM_;=fL6Pg&53NI&} z+K@p{mUUOvcQXqCz0?(3VZC28n^d9C%&}Lk0Qg;h2>4wWc}}jq5=0VP9qQ)*{m-4- zu=hw}4TM^l53@bhAX+uN{49F;{Kkhf*-Ybe+0-L)wKF@n0+wOM?fNI`&P`dfSn-a` zcj<{Hb!c@aL6UXb^D3s?j=cHWrd=~nNzuT!CgWdfsgYY>sWnHsQabOWUzjbtbXNQJ zD0pD3tPC$YwlCqLjSzIgq1(HsDpJj&Y72=(~ zokY9sL`n$8P~5;NPsDxXO&xr4J4bbu77a*N9)~iv3p(RyR$Xz)<6C z7d_=b-VyI;OOhWynN>q$FbLa-0fF_TM}qkdI!;Obhl^J_{Y~KTjJ~3D5UONybSe+| zO@${I;oQ9Ic50Lt6;rE{PYkI&99!ft;fYHZM?6#Oh-0J~`Aq;l6c`Q|Va-hPx*Fg| z$X#AgO!CDQ>ac8cqX!uAa?8y z6$K=NvF{kT%0*8WEDKf@bG(JnEU1K*nKzusi=&KjHs%}$aC`K^LYY)Wdt$Q9AjNGT%vE4 zm#Tb)o|!c#S+*2k!A;n%2M$Y;G7nfuxx}G^=?sieXK)JVVtl6r9(@DLt$HT^hhXx* z?ZUza_+Kt8tZe`7qq$bS;NIu)OJ4Sc%^ky7g=%PRrzt@21rKlIbW%9I)rE%(*xDb#H3-uMtlhX9bRP9Gd zY1%kU743&fb=1R1CN*!!2KI=7QCGCV*i=u!v`{q=UHr;Pdz7YgjO`#gJbp8gj_$qmc2Fz^+Bgv-`N1*hbFw3M}dBETk=0f)BC3 zsfW;A00u#UK4j;(I$-JbX9aNm=mNm3gtA;?lEqa!5j-%e7-hf>o^+IL6@~e+IFXAW z<4B?4MP)(;ApM;BC|#<@LvUjz%-F`srw>5XvN$=B71b9DHi`3yY)C4))b{8HS)w}1 zL~UopA*sH!SB!=>_6*wJ6SckV$v&zO(C=V&^wV;3aUEiDwnL(K&<_9u&KKk0&?7*ZO+PXF z3tU)QUGodbR%RX9I|zA39p@`ZYkHkT*Ze~8pA)P4c4E<|80#kyus2iXfWKk-&LU8J z;Zx{Y#FJ8@)_2xHiZ=4gN37#>PIVg5Z5|{uR1meNd!p9JKl-7B*8SsEN2ZQ$-erCg zQcL4u3v~PfD>bJB)hU@&xjw={z5Nv(?|`na(xtl>eXPy=b3f0w$w!7T#KO+4v%}Fw zU;@+Huo}NWo3P+qG+DoX; zDOIHW*JqHPUUgccTYKu5ibPe>U;GRD11_Kauayp-Uj{udjpqamY7~Q(YgBlT+s`xa z6k#m9WwxUnXyFM8f}H+E5);~8c>UK!Fqd+nJocY%6RA>=>^$y{J@~11$9_|owSI^w ze0#xM)0pQDu0N;H9_u{WtLRPlUsr{i_toZ7kl&z#I~CRT$wIsfI~tSR8i#M~8_L1| z7V(a>;l z{Y!3Lu_x4gnyL7xJQPZ%47R^2-{)gJ7b=23ZpfX9VFqKEjLV~OSin^X&uY-j1?a#) z#cc`e7aU*A#UbcZ#VHNci_n}%0 z)_y_}=%_`Nt3SMZc`YD(e%*5D(Z2{w3-|36XEDGw$)v%qhiez5rS~abyXZsnHp%Q+%&1*81=z2h zU#pT^Q}sx+7yu00F>o=AR+c2M28dIF6s#Ac?VP|J9&kp;X{ljZ3uyvFvp0Ajt&5VY zo$oEEJKT_K4QL*dJ!ck`)_ze>lE0jd_{$>@ZAEuW^I~5vro{A;V$!LV7!Fv9X}NvO z-jUI6mt2cR?r6%G8Oit=H)21DQQrHh9f6_6dnr`gC{=GoSVoK=D_343sMOeIRvT|T zy0zEXb{6K1+h7#-0#i>{b^V{K5i2v(|5-f)F#q)aj|RgaYGLhc;z-CKYHi?bB5Y!0 zXKVt)#|Pu&>}XI zb$zv##{6l*<=3+q0;gy7#mMSWk9eVnJqKynJ&D*q!`3f} z<@J!`OkYxr-(c5$y4n;`aU)SCJ2wSD<{M?wS=Xzw&fD=2-jjrXwr?}bI}zLl z>eufFjJrFbUK`6SP4U^b2@Ug}E85QM(M}{l$A~*^rg~XN(bA;Enr)Q4##S`2q&Bx} zx4Y_VrxZ`3mPnF*ji5zBlbMEc9o`01E?k!TKK7UcN_ti2fybi3;uFdK4rPtol76aC z@RSWw$MR}ZVWuZlaatmIfRQb_VG7@z z7Xz0Tu({4=Gu)j(rNS}fwx~JA9L3(zZmr5a7VHkJ1b_A!=n9OgclL+!SAvc}z-57& zQLPZQ1(R=o?9zaiidp3YZ#$lG-O+QnpZsx-q)5c*c$P>~dX4G|raDl)#3FlJ-&-2j zOv@^p*lSjIm)QaAT~&BeLYhZ4=Q6X0ra8iB}ve{u5PTk zUjPKEJ-6dR)taN)uwETtyD)|;0gD!qFPzdGUImx);!7Fz7A~ZGFqrz1F<%@cFu!|F zu-Z}lrlw@{BL1fDdhjLSctl81xGvpxNR29e$aVxOR9kf(I)6~79t)<0nm+L~WyusFzx&WiDp8k|D zutGD%0iC^!#rk&<$C))^oWaSgot0(rAR^8doq>}Mz0SnTEy3C2-RnEBn)`exA%;tr z;Gw;buz&^{8+@=JqZ9R;+sZ$OLru?S^@?>m$1wce=hx53Zq@rTs7!eS6pEGf`+ZP? z-yW)y3yk9JLum9EQsHDbyiZopDtj#nOn!N@E@b=GthWL)4+h_*L=TK=+|_1H)jS;BMs!WRg@KZm{HY|?ZN7?+94 zCqX^HR$KiCpOuwIeqQHaXh+89}}j$-r7feALUbmjH->#FQJ zE-W2~g>trb5EW?!dT0jnlt3xv)f3RAB>#>WRT}DMR!1dx!<|A7ne{f;GbTY-7 zzay#${{k~b@3(Bt8~8K5<&h=r3|TIz9Gu^+1yAobX<`WZez2Sw7zmOk=$Marnr?!S?X{%czK9*ugTC+VXagw(xo z=6ENUdIzuK>LD?2nP9)R!+dG3F`%8PhSOnD0~Igt&VE05wK_1{0}#8v7rZ}azyaYN zESJJE(`f`TCqZ|3n*r|nT7YsQV)n_EiEFuCncz_z@ap(sI$hNKc z;6)5uLrHCQQi>#+7-(k;(}ZEIH$j)LWR8RX8B{DsS1JZZ!`~Exm|Tw%;3cRUpu3*r zp~@Rh$EV%xTXb4R>PYArAV9Zd08=il5)XfANisbF<@xnEd|0_%v(?khN1W^LiiT1E z1xcN#z@@n4j8Yg)LjMLn0uydo9~7wr1uYY9QOY#9ODb4pob^Y;dl~p2l{hR2Nh-=E zc$DS#e&^bSl5yLFH<-5(D%_rwO8fD@juo~h9U5nO*%KT~%t}5B-hy)yoz#=JP+Po6 zaS_7JtRM@|@+muule;#}4#MHR;OpPPJ;fKwNYV9Fa;^gc&HEBomqvfnMqWJVTtF<6 z74&Dq0zUuxz(>rI>0Q^yDR~WXUU+6?ab+V8Qx>~1jqY+&@Qu_=w-XGWN-;7VkPI0q z4Y)PSW>Tw;LV4FjflM=ANn_{=Dof5Wxz46rQXCm4_ zLE`0Oh~za`DJxP__8B6Gj{PFS+rLhXUW>ZI4&yh&tM4J)*{~u2a>;*O z1Y&FBp#D0)T#~v{IoBqkON6Xt@|a^ArRwr{ynjp+bPJnH$XGf{Pe?WDU%5F4*L6ip zOEL0eb?43hW_16wH=Xfcjx|Xii2SPRJ2yW@%>1^10bvXM> zT^RfWor?*wl5eNkbN^UnBK;lk?@r%zrVfKUS~~w)Y1wA0>3GNxK8w`hPgZ42AHYV+ zo7X1#lwThAzh;yTSUwf;JM2=z-?tK~@y6!eG`5$cZ!vdkA!lPT!LZT9S^eMNbnSSH zn-0})n-V7;Y~9-P$0u?6BW-JKxCX zi_%VgemBFoOb2moXUp*t^nXsf>q6A{y6IeW28Vk83a1=ux4)po%mOrz@Sf-_&4B_FYNj@VXyeo0KZW__lfw4M4-6;h+N*Uuvbg1JUU`yiWY#8qXsRk1 zhHcL$-xo7&YeRf$iFE!1qyjkgAZm2rkS>L-JjYxh+c74?nBYA&CCU=-8<_Q(y&l#q z_Rx21X6PHVwN>WVf5>tG|2tIif6CuE*Z}|CENANfk-wYO{0P5^Lm6)75VPxjB&KZ^ zq>Q#7gfdQN(a7!u6Q~IkHud~ES3;!6i)6y)rhJeI?dv;NFfr8A)}HtkW(;~- zv9%$hC#yNGjsJqp-17@xiJE$fH>;Wu-_Ap>&yLliis__3WiqQ#&b~}x?p-pE-5#F1 zY{qRCjhQ~Xsn5vAovf;8W0|64_5Brt*XY~~Kp|YHw z&WSfQys^M7keIvop=-je66QrI>WI zB+e0kDjy9`p`?0gv@TXWyQTK5eZ&fpSvx7e&}>jZ%;(GUcU96C7ilE%B{5QFzbDT` z`%ND~(NcP5?y`VvJ&Gh-$YejG`Nty5X?}|-K5;bFj8_XzDK*A^SdjA1GQhGj?Yr!; zAhC&?TLhp56EY1Qy5geK{L7}{5_~6Yo>WeD{3HP)luzPpa%o^jAoV5z6N)FbB^`7H zYKr7oWql|W?zxbUyDzIL<}k2VGcozY>h^&6Hw9Mf#On)3A;~n8rQF=rFK|dihh?)t zf1rwUY#_xvgbOOR4y;ZTd=&NUAdU^#6jI|)i|h><=!R8YMbR^*H7H7L5>JGLS&Nax zL5mR$clmoE@}~(WVK2&4o#hARDzksdX&?nCDp^nhGBFf$B*}Y-$-uE3Pkj}&J~-_# z>KiN`Dk%tF;pnMQi&!$ zz$J4b%^BGI+_kkbF@q>pC`pPBOpo|&;va(OF<42DXw+~mnn>X#y;?35|8%2_KDzI? z_3#A}ay#{yB$uHb2SMK&e}7Eh7yDt|1Go1hl)N&A;u?pv;FaX~xlJKv+0BoPa(irQ zD)_pM$>9FTywVA7+nII734R^cp>oi{z$4VAJ;NsWcbQ5=%hiRAkM&?7BDBD{It>4A zGm<;K=bFm<$x;nZhydmvvtU<_OqI2F@KQosv+L(P^mtxzna>zyk_a{27_RH>tN?WP zl5z^;K)9iY5&!-MivHq5UmSfUS<;Vmw@i8#THA)r_7>pu{?m(sAG)%^q{$QVgnh^^ zr@;(!4n~d9pf#n3`ke_wX8<_%IvZa_e>QfL`vf#jvD~(xnB7s16*>Sd@SyH4%yRzm5>- z7NMc%oux{~KMdrbpZSC=qS>jxbX&i#^)3}%?f?fr+&1B9qU;gK&!^GZF`jH-4CZmklE&bD z0EjT9E6Q3An#RcDus?*XzEdk9$B|r>8#%JnnsylFlChFWU^}AhSL|Ah8bD80J@U-m; zKYGvghm^Z6wnCL~W(%ALsH)JqojNrd2NqnlRoKIMj9|rCCN}ML0Q3DWgGauZ*Fy%s z6~57bn%Io`>5x)2@nBJzNZUl+h>AwTm+)DFHT}}<7 z?fGi{ge~Dv8i%SW%FXO1QXk6vFMq(oHyUWfFQ3PPnK<}D2 zgc;g@_&aI>=OtT`eRfxIQ$L|8Sw%j$Ll667RZU~CF_UEsZKP$j86Gi}M`oIt&=yNL zcSGdgtqk`uU+`vhp3M%0(sS0YjKqhgu!y6pviK8uR_b8MO;C~05AO} z?R9>6guvglyZNf2pVl&T(AZo|d|8Z_GFs*KQ0^IJU&6WN;c?x>5~|VZAB4#Pk(|`6 zla66BvGI@b2~v%4!T4$t!n>1&@+4Pu;BOBHK>P#qjP^SjbaK7aC)^(OVDU4A_R($k zMN9OI;$wb&&}Uz<`e#j58K8#A*c}QdPaAp<8{0-hg6+L0%J2BWeu$(#l=JW+40Giq z`+`!sqDhPJ=n@7jT8K+8dqsk7r)`ansEVAN4y@`ko)+_&m4T9(?c@hBzyS093nC2e_HL9z#Kn zukrDEYxCD>dfB8GRL}5h`H%Z0DTrJGr5D%HIQ^Rs@McUnB?T{uyaSV)-hC6PQN%~T z<%9Mc3v7ibE#3>KEVsUc``qt-MB1HmBr`N6pVEnhDQhmS!eTX5NBy*Pe>dGBz*pB9 zB_+*%648MpsbhW>+WHHdRrMY0qi}6lkp5YInX@>*^`rCdjqP9X61NxG!0o6$pi3Cm z&)tVbhd=QL6GVF5K#ohWgwGMQn+^{ya0;9AZf<4e`YgYfUmcR9Gl6Tp8z?k>vyr5q zaMJTTI&#jKS5O`yD)ifck1>>lJsgBUtiRPwV!2jLCxWJe?JPVz2zg-at@`S+yVvbeA?wMCHRXeW3I-DwQu_yNMH^%DsIWY;+^_LFS}W< z_ow8PQ+-L?M<*%9i=K&tWH*;Z8HpMM(s@ff=08?=spCL4jj{dkbxv8cycv+f`A`9T zuAE9dIm?aa$000kdCh!@TKxp5uVZf>2UaGv~Z% zCVAShhS#N~x8u7Gvc*jeq@-``AEAM;0SDZE>YF0|lYPi@Dv%J9)CuODGc*&|K3i<0 z9VSK^`|vm#NGBZcO}W(xEBvL>d`Kai#7UEgT_zYY+N^~U@4(=Y$IPkpADa6S{N<~D zjYSPFpSt?NbQR8^hWitYAJb-!51aD&*DC+}{uWf1{c!G9xO#dmmkkw)prF)#h!s(3 zn=l4gG0^h8=Ud*8k3VvY3Qoe+y+>#Wp^-<}L2M7Zt^H==TuO$Lv)Z#|f8XTJXsfBz?$J^;YP_}`7co3*s;_FGVVXKHWy zHJX^?DHnA#cX*5$R!dfF9Wowv33bpKq}K<=6KTdWkG6BMr{&qDYFce|4I}Xq2h-yK zLXO0y=jmxaZSME>4n9_#{j@(th9@(`%JiQi!@*=AlrN~&Q(YD>PV0RitL@d1S_?%q z;=40d`Ag=_&?VnQ&gs3W9_D(REb3d=L?zcWa~Y*$Uei%7f$z|2mIhSgE5h_qXbZL` z5n~~F1IP(Z@CfTC2mVvL`?vk=Xb3oqp=tBSZ?Vx#vh}FZ8N-&~76P*Y=R*6ZBFa|4 z3`)u6i~O|dPmQ4)smpv$uZtJ7qc6&{@|hOk7(p@96l^H;oXM-JAqce}R`8;DD&itS zX{y#@#nmGQinRHM1cW4s6~lYKeML#8IZ2|!vm|bbPflJF9T}ZW<$ByuXG9Bs-y(?| zmpEKX!sU>!RB&>iqM>R(nWj?ns?Djs;K_54cOf=0WA%qDbo4O}A95>N1Cs$>LK4VT z(_?RD$`XKlaED?N5Y;N+p5q3TJzHk1O^&NEw+yo!2F}^avp>^RvEVJkii@HVSFu&3 zEdr-cHJ!RibQ352)SLsX+8*Mtc2<;P(jVQR<>JY*=8{dd{s1YwC=0b8;`V!Lji8 zN5Md_&4-<>#(;b!*Z}cN+XQ*edSF<-uFG#a395ZfMU7p-1khaJr{sT`zm4$iJfcI# zN^Gbqn=Y6}DyKYjEUHJRm@72?G9Bc_8_2k#;kfy0;$qcy6odmR7S#iY9Y90Ue6c7k z$KdK=RIJw{^~wZy)#)oidZ5RYM=lFRSM7}y=*i?}Re-$db0CYN^HThnQEQf&P~&*! zLC_oZ;xtf*C1|GP6E9O)N~10m5N9|~ZqJ^MuAbN9*a=D?MO4L#bT5+0u*}%)qbm=G z;uVCwL8cIvW3?gJ0^rUJi>)asU33zC)ZU@P&6Na=P>z+&iwmG7Eh&+J(-H^gyEDfr=;U=L9z(ijCle7{TQ}k65JAhz0B4tQDTwq&fK<%8WRULRk zlo|ht#9q}GpIYss)gPuh+>)owtc(Wd%sy)LHCbJpW{rMUwM#&oylVJGgy|7Uhrbku@5((;o4~` zlqFUN(>3YhqUKxS9A{#0d7sL-WXWm%k=wud0|PNeAQK9rt^JX$k8?eUeWH}N%=`Vd zJa;RbtDBDgvI$Iikl6XeIxxLr0Rq{;3+28-ek#fCdfbfzT4`u1A+V&?N5ZpXw~X$- zM&coK53N99Lbyj9!j?|W1vXTphsP4dj3eG|LgWFuPJ zz7>9U3~cgZjjFXKA5RgSCf$y;-We^;_OZnv&f99suIv6 z?}_4=%n@UlePWuZlczMMcb|bqrdVN1Z>BRm305S!6a`tFouI$s`bLSfjgnRFj?>Ef zJz;tvd@8}-_CQXOu>1#u+qy4NOf|MHt^Qe$zJf=)6q*`C1Zd*EA zmk9ntuae!{3Kh!LZhQn|^d2#iV6z)p?HTa|)crm9N*xV=R~Ya6;60{0nsmCzYK>6D z%!0k8vj}wPS~7+-3mdlv;s`4nBc-jfm_C#)1Ei-6_5*rZQij^VJPrIZ*l_z$WN98L zbgTZHf+_zsNx&io^Hs-5mn0u533i>lLp^l%!(41ec_^Zx4s&NCWnNnJalnmAPsMm3 z2cLY9122?!EXR4*Xi9a0D4ue|LF1phuQpw*WX=8+fzm{%OpVaeb<@GBNS`fgD-<61 z{odZsANlfTn44QKo({-ct+#ihIm4Qspj+q4MHyQ4f-W=1iNKA&_5vi`0QCA`UXZQ7 zOYGwb;{*KfRv~sYdqGhEn)>U``ri%iHBio7M&Y7cqeCg>U5zHuR~LD|2b|dXDmCg(FdwGoZ{V1L<*rp995K#i6H2sPjk%g)Fbx7|(a?T{nqr-X+5QCvyR@%Ugn z#^$1;q2wzt?7hC;SWg@pufFDQE>>3--Kks-m4(i@&cB2(JPXlSQ*vd9DQ4~Li#$BFox2UuNSk5!{Ia&1CE^2_qhq^ zLjJGx0glvF5-gXzaagRvBy*+N;q^hjqY}!|s#DVXSi`RjW}R$N%K=(jp<(T=!=6 z3K!4CNs%w%Yl+1@uFquSj&U@X>gnaGa~}eKQsJ|DL|p#lM^bhk=SM#Bvqb?l5^NWF zL&_e>u2kBQO-qwgu@L@R`~r6UcZ}w{>eve5!4JUoB2~nhU=kYpZYYi$?T0@pnOEpv5`v0|^?0^o5+ zL^^vh12Vnpa+!~@tWzu9y#ZFsJ?^$y{RbJ7 zkOZ&eF2x~{zJy7^K&|GGrU`>+fMdP(My+UXw>*`vJduqK1OnB1X8 z#`QN#(o#pdcsb-mvJ&$fskiwyCBLE?pIl~&N|r7e$D^qN8f(sNmF?Dj{~&C45F3N( zryC(ia^cWiql=#7bbuFca54=SV5J0C!=D-oQ}F3jZ|pDq&7n*92)z^AL-R+E{?-}k z+}|bWG+5967@oqFW$r&WKrs_O60qT2Ij@4?od{KG8jOV2!tlXqfxrl2-3dHS?}26{ zMpz!%W;SJHtJ;cR_2VSLl6^+SihgS>3TNYa61UlLca`Ytl~?N8V;1E@eNcj2QOgV} z`rob^A3Q9>LNVH`j+ZO_x^Kr8IJb~E$hHhRD0~tGe?XN1ie;S`eac+7=C=cT~kC`B=GfsI-Xnu4qiJs)=m@Jt@ zfo5J-MoMG~2PRSif|{2MV-Et+JwfgzGt?2A%cJwhsbkG-as0TDT*KIGl)%Wm&G!Uq}dKcr7TFoXZ)3H3kA7o33qABVK0oYpx|dfwG;;z3!_ z`++2G>Q%Iw(>FQxIZ0R5m6VjmlwlGnGg;A2cL!s?{!46O@dy=I-Q zcnh2QQ80D?>$Arq)3GwcTBJ8sWV4JXEV98r$METRPc3W8%`lDb!J&olNuBnG-z!II zh=ntJ#p&Z6VKlu(KmEmrIvd7a@N+=xZC=A>hVOeUo3-il%pQZZ-l^8h_7@e${Rh%` zyOYb)Hoz8R>KTLJW_J&je6KH}NMAyLcIk0S)5#z#2K>l_7AYTq$tWs`(a&n% z+Wy-h1RA9vqgk@m#6VNZQW~~-QmLXcubt_zt7|$kW9o>{`OSzN%xxkiL$xBWo>6G- zu|&|6TG=KT|1a=p?qi)LhIlJ2ZYSNGZyX2tQM_c%f;9GJSvvpBd_nnC#u_zE4Yw~X zW;aM08Eqc?5$Nx$F{^A_(>j)=BT80&2Rjv=Z6g(p>Uwh5#`0o;>zHwJRbWt+dh!fX zMoL;G;`R=OVHZoyRPMKb77IIy;W-Zkvp@Kx*T;o0#HhGlxv7Z244mAy;gTAG3u_e& zToyvkrWjsDdYG87D?^MR!f@U-!{jiH$r9>T~h73un=~o#WyL;tY3AGlNH^c^l9UvJf{vTBEWn*~I zs>9Cw{ai`CZe+X%u{}@9P=r$Pw5j=!*CN6)UmBrw9vR#Pn6SG3_3=DKDNBLfuURGl zoJ9y>$N?l{CA8`?0y>{Y97PN$0>l-cG{})e9NNKBPOq2vkAC|=o4cuytDxh%QYojK zNbXD+%W1^p#Zjw8?mJ!U$=XzIwPD2!-}^D;v!-Iey*d_48FwOcEiKNXSp__eJ8MVm zvPiRb;n5sr^Cskd?m+vhzdP)08AR3rd1UfAedj}g*b~QIN9=ZWmg(Mkln2-9KzYW| zNxQc<@~(%Yh9aCM(cTnFGQUzjAcnCA`9PLB@rBh7xPG*})fIPkx3tJz^cpT0% z5q68lEIZb$k?^kNhS`YfA$9fn^3Cz9?Qc>eHzn1=IT5b=A}_lYV#V_Gnyn?74sdC- zA8mMuLt3coirArx1Q~pCI8jC0Oh#q{E1*)S&m4>kxN8Ho=^vvh4w~S7Wo4yakM7s; z<@@mAUK|x8dnEA_F(MQ($}W&^Xc;-VtLl>UkZlD{OyyNZQenKGnkS?F?W~Qt!3$_p zLxqKkt>zBWUl=63W@PP9PeCUf(Hc!DQH9dt0)2Al#wjq`uoe}i!}}#LNeF5jc4ElR z^+jpPfT$)WuvyBej>!cdRbzANmiD#LuNrtY|;Xg~LMxPdw1YuW@@d7TnOH?b-m|pq-QO3dIeqUu(FhE?Vn>i2l zgbnTLWr?>Tr`+|DkEla#@Qri1PasC(X25S_N*Snrg!Gj^5jCO-gP7AkCYCn8zz{P3 zfsw5#$U`*@g|sXqVdxc>36wLiFSaZsFlkoDlGz{?Ms`zK!}w zf-5p&dIyo$5cnFfl6oZhKKB@2{4n{{=?}9Db4h@pbD8tRv82{E^Y36>Xk|*q(Oio&)5z_ z>B31*>4qjP3ah%xVreoWA3E6@?|UKdS#wF`Lwf~7Ou(q{;J6w}_@I6;$`Cp$_K+Jk zn>%v>4aF<)_dKN31h>hPAd>fZ0qJW!Vl`BNd?zlEAbdDimJPDUzgD7~W&LUWxgB0F ze9LAh&IMOJ#~ybj7{Is7Qm1vz5;#Or%2dV%`1jB(YxFm9whw}O)^0~lix&f`%qsM> z@-vh?))y4^fW6N6a|9n;@ViZVpZ%dj^8RzqcTmoooaffjcQB5LYOgzO8*9!lXWN~x zk>UlOKZQ1)qCEx@f;D@c_>gnT-~}1W;ow{ES11D~Z2N6aFl)*Y{xM6dfq&Nw39i2w zZ~Q2M7pA{Sv&DSm70FXV6TZpStI3+!Vz>y$a0=!&C;{Q|h-kJn_F~GUV~lTegfy{~Z$bGP zZVUC=!2hb}ANitwsX?mRx(}sMip7RkXGf@Zv>~it%G3-@Y|3|R2L#zE`*z5F72F-I ztW&XGrDKo>(y)hFn8)~Rswto`VF@swfG9(KjJTQT1WJy2lashKST_(`F|PzG4d3H} zv*bZftm4V`MVJGv^~0^LbDkI$*W9wjj>hQ%Adr;(gqzh=3YDl>Wg1nM^vcM}my8)t zP9+p#7S8BDHH%%B$>~!`P$wRPoD0S#=P^9Y5a9(NBdzzh?&`C!F${_!mEZ~b3|6On zc@}0vuAU^7TztCe@qQgkH!&Ngy`y$2Eh+B}m3k|t3N+obE{tJKkVbyKRn8^*MUo^% z_8dcT_yornc>_ziA54CRLmS-n>|zPSdRsXJq)u`jM0ZSD$@pMp(j($Yfpg(rS52AM_8tnBSYHj<}Ni@;`$f7To-R&nxazsrr;Nw9#(8w6=&RzH8X5P*l`QdMcrmJiKWG!(k;;eRA<9 zeda`0P*QsMFt#U%o&7-*l%_hC9Ff7<9N3F1Lq6HWlR&(ByW(hs+?JKCNlpTPJyH!5 zV6S%)6}zy;p}&FHG>?NwF$8tD@I1@S+)wm&bo=rvo!?#T$RUjod6T>0%2URSk#*l- z5{#0YuK?;9ZuBlgSo{(jtG|3~}(7GhMZ>&W4WA$f1>F~vOznU;2z9+L>B z)X|Nmpp1dglKtjE@^+2S=7ybaxW88F#`5k1iHQJPTkT%US-Z-}*qYK2grN(I?#&Uh z;xH%NowY9mFC}B7z_Z!`5r$5LTMDGyUkQ3(HU}Xs&5IBe<&nWl#*Ia3GR$(MRJLD~ zkKC0k3zcA9v|iRK+pKw>B}J6XQ*q!|IDx}+I05HK6oBTZHi1I}AcvFJDFsuEv-u4I zeV}(qB*JsZ%eu&qTx!JN+P0c0ja*tzVz*W*9OIN>xqT=x-EAbm8p*NE;-f(qs4|x8 zM{d34C4!>Pmla^K45}Z2%`k}nQUh)68wmbAn&*#2eiUt{c5@V=ZVDHzp3?W?BM){M zp)Pt5frT<6T19j-M6=#EpTQ&~r9{+j5@cBN4_S>#2~t93a?uJGtx-bIv`;1RP?Zcy z!!|*ch=e3KAYl$ixGJUMH?w2O-@vjI{{jh#&_M>W^St32{|pT6YN&j0z*1x;jH$VJ zfuO{^eTjJBgRwqTWn}=9$~8pjWFl6Z(X8<-Oak(FA-W2AmJ43OqlBS;$Z<7FgMX~T zL|`-(N^av}hv2?tKtHJ(jkL&)s>Q4+NUJa#^DqhcR8xeoB`PWdv0O!qbVh?XoOPr* zL=8C;rKGhy+y<=&kF^c_{(W6;!akboz{@*<-=2qIe@A6{fk52E3;{nroLtUEBv~Z( zhV3w0EIHYZ(Xiv~5S@&nprp3?l!CZ7o^au+KMnn{xzt#Y$gAPr#h(9wSSXCP18i)3 z2J8e?%SH4A-jqMjingQlTDE#jd=6q%M>)G~%86G4EuPd#x7g;J3KXZ0&JaBpJi=zygxrgu%0pWmUj)e zy8Za+ZU%SXhZ*@m!-gGwBFThY-x;rHWz}-!Vlhe=TDW!IY;K=kZcfjvR^;0BP5pHc zFJXuOAu_J-LJI=vQoKA%tCQF#MC6v~%cxp07-nePr}kk+o+MPf)Y0`zWv$E`m9K^z zF6QqX4I1{=`TWIXCnD(K$*YYhcvhQnQ`sQTB~Xd}%Q_788E!aodFU7t{;s5FmRvK* z^T`)2r$%9iNul)DneoRlG-k$LFaRNX2zkYfcKcryiN8ohvmRO}YmDU{W#6UmmsL#K ze(mT4;{MaWe=LJ-K23bObfcTMQ`0o>eh<%{pQjJU4j*@iQanFwmmYpy`n|cc+|iw8 z1)5!%fWns+T|1N)@)vJZdb$F5S3|3&(Akh-1+RO9#%bGuMs;^xhtQBi6>@?UEN+f@=i>O-w>nC#SW9d|XMjXOvV5`<0QS3Tm(jF7*4kk#tPr2&#gpnwvIyvpnA?qqfr%=Q22OELk=Fw-)-JYTnS;##_eIgAlBg6V ziJ{5^XX?@(pgzJ4wW+cPNT^>-%N}Qv>U{Ea*?x{(k3QMGMt}UFdxUW*@D>{DC4Y&D z1@?=)7l`~rO7KBhNE_}^Dxg;}`*nKQxnvo0ijgp1!o(XrrtvQMRLn~Lju$CX#P|bD zv^wrgn^lSWc?BEGY^Fx%pwmf1g^~2-Jx=RW&IUk@4`81YQ0ZhED%rqQe*$CLlRjkt z?(KCYYn}eaf|!Es@EXhGU+N;C#e889H0U>i<9P5NRu)e7|8sW;!2Hwu-&{E^b!_bR z*-*Z6^zz@2fLI6Bx@l{|?vJW%lQz3!Fm3A9XwkG>gPToqjVUtUAH^b^4aXW}Ob2x5 zI)MVn(s5!<@e#~INpQSS5xr8y>>$M`FoVH$gNbwBw)8Kc30{%!1I2wIhH#_1X0oI9 z{oOo2_vz8woZ2PDBDg*%FkTE!|+!@h0j;|vE(#cvTT;jvZTXo44aDJ zQrXZ2ma&vG_pBMSGfJrxM3dV4k4jsNV-lB#c>3$bxiG!yrT%^I<}X{B7I9~@VegW- z3bFLR6lK#Tr^^jN##36FT?z#P36#YOzS?YygYy3EnDIcb!6|1{wXnp+;%#CIXrj6~ z?)x%6i)GDvn^!7|Dbk)RMTdpqqP2b2B8<82XFK~iU4n6B zJrO#zzegYccEd0p$FNse%==4@7bq%vV?c_Ntkr6ZH~z zE3(KZGjh$IE%;_k83t4>kS^;*fLCBRVHTwiA+%iH1grznoBLItO$d3QW2%2>QL1s6!u^?Q{-GX7eG@=$qQqp@2cX zdqb*@14qn8lqdTfI&&pCX7kC9Pp2&n#MjtTT5zI@{@i2zJWEIcM!caG&)t2N+l%|L z3a^ZdE@%=oA@|w%E30AC=`!7KJjC4I)7{}`O^-<|B<1#$bb3bn&;UlFk=w)RrFMVYZ;b}sZQbaKHG!0z!KaR=S zs&yR~@Y8-*pKpvaAMR-MU(Nk->iGis}U`Cxp+C;x6wVMh40;k1qnD^R}RNRfJoqMz-n212xj_5R(@!~f9bO0+N2YfxD%5ELxWrkCJ`dspBdIu<|@Jg5ixq@ z-^L}wgKBq4Oxeq4z%Edx%c7;e{_c5d6t%FpCEo+HXn#dL6j4f4Nz*Y|b*87*x3H!I zOWV*D_a9g{=F!;khco2^Qkc4y&VcX0Oqapz?v)U-O{CDL+V?*?+IAL^0WwPuWu$2L z>kQdN7V~k-;=wCG$19>$+xP`fy%#oKZot2yXr}b%huW;T=dSgrH^-G+JJQ_hPqAvV zAxeNm%_^!Ez|WB;tD+e(#fYGi8SQ+#-xd=lzqXafl|c!ni?mDOlNf*ZltL+V8Cp3g zD!`z`DW2@$aib-yi_INt#Nq*Np_wi~#d=rT?^mdzKYtY7Wxyhi59_0$WO~FI zFVnMYC&414xrdsPOb8vSr{{BTLpi}@K49{)S(ja(T!Iktcr%xVz z-=yYW5nzEZLJB-raRJXo|Q)B|N1? zPQKH^Wf?8wtQU!-8ce3xN|0StYbcb#myqmTP|ReoDwf%25-bWsz+|%(j|>q7ixev! zdVE8zbsgX2Ei0q=`~cC{zF- z5}?giq~w4KdP@CEv_0j_A$>xqf+Vyc7Tj}Tvt9K)K3VtkP=tAKt~X_xc0rCP@lO9+ zF-KS)f^?O&D8kp~6_ z5yUIKZf`16VoP+$5Pv^{fmnsh^t2zd_I|Yx#bdg*8;$O#x$wLN93qI`-D6@rAV?^a z&gEAvfM4cp_NyHrI3e+!MW#W&W=-DoWj7m?kSO2XH@5NupLPnPWm)TV(GSIiqGWRs zjR#p;fwYU(yQ?9kpweT#R;h zQTt$=p&^fNqw@4Qg`zaS6AR=uadgvdT~ zUXO*zE}dw5aM_Qkv}(Kyk|`R@yr=+C%_vU*pA~F(GUIPR!?JWzVJZP$T{a89*XL@Im_Wqn9bvsUJF;}jvwE=dS{W7NY z#bZDnD3jG5;T(aWVRzgk!_G!bwl{?78(1e zHw%PjB~(UtE`wFOz;W%uwN4pzTFqxFtzN6&hcu?jr-PV{*DQcjV*i@J1`&Vnk_Vp^ zr?c0Y2esNct8}qv6@ztVxrSHQjK8{?N`fBA3-+N=SRMq_c~$FqfvF!Tp);iVVI%ci zhs?g%CT|_`A3KkZY2&W!K@Puv>XBdN^PdEP8s!Yp9&=3|InFFVjdD-phfxdZ<%3Id zWza*FOz+`b#fS>S9r{=`b(dM#;9I>dpp4(QcK@~cVd!ZZnR_A}P)()oOnOH`2e25& zdNjC_97`_pLX!Xn?(_6nu&|3H7OwKhViVAan1>le#PD52^# z?dNxCDrY2#;$8!l4%_LVGpyON=t^2aTw`j@ylvqiKW2WUd^W}Z=qC()Bic9tqJY8Z zk90j3q;l}N^xCgoHwj8_R&XV^E7`X|H&~zn2%Ye@R0v`5-h!Y>jxo)tMUy)4Zr!7W zSUYvW%uX9FDf#H!{4+)JV{rRHiQoqI&FMq%`m3@2J9Im3>K{2rok+tEF$_fsb~aq* z7j&JTm7>xdq$I06zCCf`Ep=P?VGyY8oD1H+9?Zk944LVOf*o!Z!;F&thAp&NP{CgW zspZEoxh#$XHv^h1iDGgKr(H-JNKyCL>8{NW7_1ypW0t1B`HGvsOWYae=9ZHWr%(T? zk0dygRiO(S0nT~TdV52{@5Y1M21_IjRI;22>OaGm%B`Gihns{nqu2zjGdoS2WW zbDagvjjPb!AQG^!i1sv!QYpML%&&xr1we={@H^jo<7cnNdZw~%4~Xis1prw=D_`d@ zoqyjo8^YKLUY15I>0DoD_0>d1_OedklYa%iL3DO@SNG;+V}02wviNBag)XNuta9UJVzg)x8NB5OP+X*p z@xLP`R+j(3hRejj^j|}4U1{6c{npd}Ct?DI%7SHX5|8kNyoR&i?%1|U?EcrkmETE@ zk{J^+o*A zgk#h}UlxS3!>En#t79#FGCb1%G}{b*Fm{_H?{sU6Je^McZLRp=i7cXbbl{#yR!IPF zcJF{>=7At0AODNr9M&uCcUY(q3SP*8hClTTabE{M5FQW?siR{@pTLK9CLiWSe z&u@g~PKEE>RK}o{?fp5#d_4PHXh5{_@)up8ospasu^xw9Z1`)eS62FIp7frA?mpMe zWE#y;X2aeFo+HVAx+{lZ=K*%I+=tj?xFC6<@-z8RX@t4oyP;tk>zxPuw-uN7oZOq+-xDzy zTz)3O9g!Dzo)D_RIxHux^hzg%&MBo)L-!_Rz0-ICZ9np@LP-#C#j#)d`OaVKXa~8i zJA?DmuS**3Jz(z0c6T{L8Jj2jCIF5RL){$!{ zJn8rg&Jkd_WIwsvN3>^zTYda=ZqEJPb_2RvqcChAJk#7l`iV|01!u1uaFy>`?CB;# zL#J4?Hp-uz&H&o|@+f&8i2sfQ>m7Z)};M;TpSU2aV;?v{t<>zzy z|0D2LpO7tJr4iA8cgc;M6)qWtRJFMe`HaBa8JLxyUK#bRbz!ggvvDE4ow-mvTbX<$ zofcbXRK!g+L$$;!31=sBasRVQ`|m12N|^*vlzDg?ywS9y=a@eT>3MilaVp|!Fv_S~iV(au85uTJ#=E6j)_RaAGpJQ-y#Pc<0NMbm~C*ap)eyUgSx z9mlnGb>Q)J<+@@Yd>tO|@okBZ;L|<<9#|En@@aoM&qY6aa&zGC=(!wvx$t7{I2V7} zZ$#g3Z4JJa*4$68QSNbopOx*rqXyC+1kw z-qk z)HtdAjO<<91`83Laz(lSS+oEcE&JX0h zG8y;!l+mO6-H2De9^6?ITZO~4*UaGH7As=0y{9Yz`+oPwqlrIB=;MG$@L0wO!&-T~ zN31CD-V&=~8EEK&m9RH#5hoqMIWa}KZ**oM|AV3-T>p333{;wJ)lO(60L zK!_CuP>nNw<@yQOLH4DmihAn6iv}8_3v9%=#!ICHtOjt~^&=z-3S}4N{dslG*nUt( z`9X{VlkWVlMEDK08q=yWc>oOI(bQq*az=TH;eI}Nn06!2E=|xO^Q*VaJ4KQIXgnjk ziZ(+avxNkTz>iWgeDXvyaG};1*Muu_VKNND8&Ifh$4e*(A^KuR+03(GEbYgveycb2 zFOxqcna*nKjG;?59T>BuGP21H#u^c%iU6GMajCIb!9~xNf#Q^sUK{L_si(e=>WwNU3Qw&{65=n>Gc` zp5z*NI55&!ES|wP{tBKDknXkCRbXDTdgc7NkSFU{2VHEO&VGdWS4o2So{Vg2U?L|I*+*sR^jj`B(z2983WAH zoWrkOLZ-E=x-Z=dYgVf)Qc->YHnl|^uIzPK3i>>c#o|f=>}(c{Ztm~eI*JG6L-GBz zKni4Uc2TuNS2_BR&TXFUb&|Q8C0oaWm%4%g4uIsIVr^IsMK&Mzt%&LsHv}1#E6TXu z2g{r6Q^i5ZeMFC|qAz6VEq#l765h93UVGIa&SdbKN9CX7L`U-5h#TEUO0R zINqT9VhIOD7?un*l-@t>G(eK}s0IT`S;w_cBukB~_`tSk0 zrIwgo#wEcZWYE^+P{17}3wxjD@}Ck0%%i=G$S3;Pr^BfBQOAha<$1Dj&K?6oa4KMZ zD{x{H8T+O-6#IrN!X+ZoNP57O7!b=GVQT=?p&oeUb5RpqZ77^PRXd~g39Rl{|Lp+E7 zHIb0{%pAo95!&5G!&OP`;yM+$gJlawqxBFcIfY=2Bb{!r5b zLL1*JBbP+BS*-~UekCod=^``Ag7f*FTDV;35L`5f1<@HF3bz*MR-S|3Eayo$R5=cL zID)J@e$Tpahfb&K6T4Ydphz?zGX-9)hp*;(e@k66AL$WD-j7m!#7uGj6<8g8`Nz35 z9N|(8-awm&$*zqZK}uN9!B`nPfE}I~M#f88sxtMqXho`*n|i%_@INc3uLe{J-FbTS zr_JQCV{RIDhY^a4WBMTvFbQrC(m8OyyG-lf^j4S_RxVO)#NdVSrAEhsf2z^rC# z<67r|Hn<#hz%w7@@+d;^=xIqYs2H_54u{79c-Z1XycHm7e z4W9N$!QyLDs|kjnI#Q7N#4bqu%4l9IAUQD7=%)x&GlY=wZ-g8xkjVs&O3wTezkUE) zNP%JHA9NViGd+5Q1<{h&D8GJr>v#FX2Y5<>+!(TJEd#;$t9VE4f)(8zmijzl)>zTk z7X~P_#C1$<*k>+mxZHL>Ba6w%m!xem+_NETu1nQEC6*fCgM|BppAK(glR^a)-WcO? zoS4X=rjEJQ8na9SJ>6*TM?RfTu(&c+>;D~(uyFj}@Ff4Q-T*fC|GzhYnc=_g|E*S^ zh|y+2*xISRMM8V+$Z087DB@-Yfh-~)1Hv#tOaK!RUNC2jAJ}m^XJoP@l_>$z*lgMG zvF(;^*S5uOY!YOQw5(qn$H0J~`Wp}JLKhllvEPXvkI`I)JY3Hc%%Y}YZHUwDZdEKb zC|>L~G-@JWC4~tly}-!uVrpVp<&{2rR*i0Hn8t5@;dI9ejR-7BpMawtX!94I3}XcB zj3liOhAf0)JWbvGFwLD1Rw^%>S(;Fs6)S2GpAkHbkb~Mj)L1QTB<>PfGC!?@pF+qH zUw%A}`*sgzY!Db`ED;E1Y~g*M8=9@{T7FUn5N!Y?z!fA}0$_M>kx-+F-pL;pIV>bl z9~x*^e$ucG;jm6x59c>fXbTE+0jP?zp1ristaiGUXa97)9mAUo1>Gdxgc{@7j}G$! z(I)f=r`cnTg{u>||Lc!UG6TU*9ftq~pgk`O&y zHCpEQ{e888KGE%^2Xmo_&3aE(uXB;|UA+|0G@(znWZL>K=X!>2VoX9q4pK3WZbPax z{_epuri}o*ruUyK*2)ewE9g#Fa6$bPp|_7?z2B3yo5u9``{A60M(z!-b_#a)%+IG$ z7{2azi`H^joq?P08{AquW_OjG+s*S0o$l4P4P+6@38NJpGJu~##(5K6{ zm6yBlN^12HYMOx9N~mA?OvS9oppsspTE!LY@*8c+%;d}U$6JqoNG;ZH>xM4hMlGT@ zW)`O|c(c>s4Evt4th6w8U7n4%;1R()nR2UKROg$-)n28@hfSY_49x&F1t-OHsYqS4 z&T*90fU3BTS1dcoX*FP#6j!Lde99>&|6OHZEo~q}MRCSJMS;~5j!H4z>24?>;wv!- z$uS^7IS(u1sEl4&IGuwMMoaLISO|x!>5PKGZxiBCo#hfWIummBoM~|#HA}jQsP=)j zlmYhAGzX<~%Q}x(h#`EY64Jz~jRf_4mB+kp5oU8%HxjsA18;tFzwJbE48hdw*HInD zno~Kkc;o3GCH10obK8-^td+xjB5|f<9Mn^$`VB{A`uRz6G0+U1%N88e%few#D68&{ z!!rG$RVU@Vt6FwQCv{cpR-B}wn3N5H%{I6xg@6yaXjZlmT=r%TF;H3q7td+71`VwV z1%XH>t>0(js~udV3@}ez8I6ODI(GzyTuQ4~QNA9yt}?;i3zy&XuD)ZZT(qg}SXOMm zoHDF_HvEH*IcZ}J6gP2u^%HTe4~YH}%~tM86A0-HCv!kSV02baqzux2{AdIsDIdi6 z+C;SHGixp*buZnFRDa~{l#chm_C9|60PH+|tR65$@ND1UhYZskiyJwhP{D?Ap47Er zHxWk@jI2^#D~J)b~~0Snv{*MPl?fhwMhJ8hRFxkd)G zP?L?XT8Z8o!J$13I+%qy6Gdt~3}sbp66_|5jJPcA-f3Z{;{AIsRsT~T-2N^4jSHgk z|F-$89IXGLYR|;T{9jk?wQOPwMUlRFdjsLAK&7mt7xeXABALf}j2$yKy0hD}WE0Ip z@_9&u`T@Hdr)zsFYHVRJye?fxJCum3mt}gDSG4$4mgrj?%vOgpqwH*HNoz4*qGzE> zrx)AOv9}j9LN{-PUZ2t(5;0njFXC@9Qq>CU57v$|T{0jnzm2_~FI-Y=PVXFb&?m}d zjXb-?D>=s*PsttA#zgscerL5Di2b)paNL}LN1)UJCP$-jz@)zVvS#65?5Bn*Go$qA zFed9^TaMt-9B0B)(Oda8M1hQUuv?Bo1MUdSXkla5QU*(Br~h6=`RT4ons-ul8TE1R zKy%G|O+xAHLwb^+d!{>ZnYP$u-iU3o79z1XPjQM6E_}wkPDiqjm!%gi`8;KrXR7`?Hp>OYTHSw+K{V zlaepC8#$w(ZDoY^HeG@7(wg1rLSa+k!yf^7<)J~1>Q=L|f2|tB3tXe0I8h0i@L5(4 z8zBTeA33T@gzP|rN7 zZW_OACeRyS0I$nyb+He?wbxYZd0HMtq$GLkt_GP8Kd^GK)K(G2*nxbC)z6FH_UFAo zID)DG_QZ~4?B9?h=267?v(1{pTrufV(w+)*<4K#R3xcjpbW$W)vxyfh;ahe{TR}B6!U|n;#nvQ zDzpYP@?uRR}{i-O1Rvt2{ zhhHw`xI&`fO@hrgLyP|qperLl|I>U%Zuh5_6QJlm5Kfp1gXrrtZ^wyI90+H|d-aJu zaHn714YWTcY&!+@M!=<0x(H9 z$UdxDS^yAiH+KGn<$bH&j;^lWkI~`l@ezD& z51#7-aec1EB|Lcj4`;Q@Rs)ck(A7xAfQC>-gS6j5$#(xoHCs5bRJz-P=3$zT1w?=- z(J|7$Wepiz9CLf(05>%s9VIG+eGb<8kZ7 z-wcAkN#C~Bkap4qSbUg}*7STw(pxJDd1Hg+X&)c8BFsrvyJ^xV(0MUy1PJVafn{qm z00$*G(CeKwxE$qSs|bZ>6ujtfycs+1p!gTnFN{H%Ht$lQK&q>zST|ncPpMJGfPWd&unNrBc04bk5nkn~@K&@yqJ zV%bw{!VUT~{&g@V6PtY2O14VY1ZC)WlNnUiX%XMlV?iFERO^#4f8h3&&neDyufh-C z$aR!QMGhT%XD$)T8-D|_KgvQ-Xf4v`qj}BXCHj}*iAd?}T4a$Sy0}0*6`a;c&?@*H z>Ow^dvPKo}50mgB-nE9*ygf1xPiB_1h3av8g}!~Y#Uh3?hk8C*-t<6AkB-2kH(TF3T9 zuBV=bUhE1*a)5cfaHjC38jb#}i*E0ZXfI0!d0`f$3>}`h>G6?sa+XUhdwN2cGXb={ zYnPxR7;5*F1I|Mk<)HMD@CT)lX`@(HmEx~pj&?iWqT$^bxJaRtm>^hPASS*+ z6@KDuo&S+)xZJ*Ui|S~kw%(DT{9#?Msp}ty|3)C9$<|6Bg|+xNI(d&3(r^G+?L5n$ zyQpeY;vSgNL!GqN@|O_UVgf#7`fxsLzS;(sFHxgdl7N!IUsMLm-7*rDigB=g2{Hnt zF^nk!!sfHw#bLc22bUU?N|RXsIv-`AS-VCt+>eev$UaM6CyXN?;*fHQEcswI#{*4$nrTu@cyk^Qcd~e#m2*8 za7`vxFTAwqp|#WUc;RJKO&qt-&C?M$mZ=un%B+_c@@S>rxE0{d5U61q1rzvjs{a6? zE6oTWNdq>M!}o!UKeI}S*O2ha>gXT~^-44Esclb7)flv?M$L0e7;RNAkYR*1$}6ST zSh7Xh24%2!^WVH^CkG-S%MTLZd&S^Q#y5qz;M=p)TIj0j&|1mlc;kzC0w0GuX{w(?to91<_&vK$2IWi}W>E74gGF^YpL^di|4x z*Ss3Bz7hG(Mef`?a8eOvRBdTH!;{a6d!A3b;s6Ue0X=TU&n#_mdm?k=1YrBtVpTWW zESS4@0Ws@tvBL>Z>mt|$n7)a;Iqc#u`UxYS&VOg z4}32JIH_KVXA?62`7w8Tu=8=|@wPFYXK1k9$fM=uZ_nQq zUn>WxXR^POb-mvRUk|d^8nZ0ir+Id7^&nwCBa~0I1a=eMx;Q_FydO%cANGu@?8MBb z!ji1M1bmC?gFw32oG)(Pk3I`()Rv;gf^8QT?kcE#5glw$kHSHZw}f>M@VssK9^F(3 z8`}my{8Wdu{8T|zgB+7t{8X37M;irqQlT=y(1M(h`Cakqo--{vZk`ParVfQCo_LHd z)dk8LUbEE>?;jw%-PSyKYIZ`b1Y3=+L8qu#pY}eUc|E-1x4Lj`w;iRsb2Q<~M?mEo zw&>m}8-IXM2%RDScQD2FpIA&7IoKKh+hFP!-`DP7_^#6r)PaXt8F6m&sFNIsee7+2 z*RlH;ha|*_+}!aGqF6jcixx7(?v)I_sxuD6$m zqbF_GsALvNQoc)jUEnMv@=PSsYizJfx|Z7W8}rrW-dA_xDM;pC@hpL$N^vJoS@nM10>Qq9Y#EXYG`%If3V~q6BeK?JCixXHq>LCg>5{v! zW!h(FBASzpsP%XQtj8Q*KQ=0@I>|LlY)Uxu>m5XnO41~*l^NKZ-Ik_3R@lB)?=w-X z-Lz8;HGhPkqz5cinBT8k)$C}uzwfc>0z2!>l3O9bS=P*lq7O`YJA3ZOC;Cg8@0)Fzw^!UV3=;-{IwfOq#XXk<6sa=| z84CQ+nZJTQJr);(iRECM$K_cVgtn)in4$l0`Z+zne-+KHPv;yrbV!jQ66tq8^kLlj z7D}-2P2AnvnIffCFcwanG_L+h3}4r?i>%5fYHp+!hoWUQO~m3@5IyQl9*P^zVUm##@)bH2UfqrZhZEgZ~|l_PKdi!Bk7mz zcUV-%v_2SW2657|^Wd#+1MGYipE4BS=Se8g%v+8d-vbz98K7T^d-1R4RHHc?`hHzznJuMRP8CPtc{+hqyVBmB~u;rlG;#*RgTauyMutL#ZRTOYG5Qgq` zFy%t8xH%yN`kYChE!k-kbfvK(;=bxuM{5q!n)SO`Anmf2V##j!a*-!Qc!= zt0P3X@{S?Yu2nDFsG>j-IEpGMU2KCqsk0L^yORf2B9k8!a25nqmRbi|1nW!|3l0w# zI~seb#-DA0Vnv$37-sPiUo!i1u`r0s^s_sq>1<|TzPnOkvrwGj_;0<@Yjo!5ZG{s0WAgvAxk{tE~DI;Ky+QesCL^m^UB|{uqOj_9evkY zvxP-L%0hpwC{raLm&digOI5!eLoM=M#7#cQ9b8WdCE*UlKikjp#ZJ&BfO>5-z|K-EV@Gy8v^P#y#J5vljTd zJi=7{Q2{7XuG)3Q1SlIq!;1-_yjc~Ui5LaCoPOg&( zDwj`StN9k16jXS|LYE0)2E^^4m#ZkZt{8E6w*8IBE_peaY$fVTDQV>Mv*6`RZQ;07 zC@m*An{7&$cbkI3gdB-`;cx*rA^Og0DCB}x&QF=p6##z}SU`DAR?1%r2N5f##kLiTDw1E06*SstuX zYpg?F9(-|=`AYHV-pYf_@(vz&tFjvRaD6lZe6-fzaOhWLn4tJd9)f92-)o5JDC zUK3k2!h{@Q`P09R*Xy0fqa^btP7D*{Z8>yPgO00Lq^D7m(*3IA{(a}t+r^Eq)kgI) zxMfvw7m1$1CUgBW^f<73hk{M5_JCo(_#uYniuo>^^!kH5Nb55bL2NhEpk$ip%ISB{ z5ffJ5LCH~$`KJ^@&*|O-NjN%4df7J+?Ru@PUs0CC00db=HjZ3Agdtl3u8|9C*x7Wx zWTUiVVz+fbFosKKwEbK{I+YZlci53Rhzx`!H=VYmDYIkzB+&#B*}u2jeWqNw!(ytE z`u3G7XRdEIlXG16$&9mcJ=s$QejbMo@Vv^_lTUq)`YCV< z9Z1I@DY>>`>h}|8b4t;XrQ#1n5_(+Y%24W$IP!M^goBAcIH>C`dlJ(!i=D(pKiMz! zd}5Lid)1P9XkFgQ{k}21OJ;paQgdRt7mA>{pDt@gvhCGKl1jA6z+D7zf~`I+NeweQ zuUIGe|Dk^-L!iT1#6YhLNoUX*yw0CuRdIOP8XKkX(SU{r2$ptMQf36JDySi|1ieTMrh{);_?MD0Wz>86!s?d)78`ODIG)R z=*|>>cL?4gw3Bl{G!}fZiKGcFD9$IE2Gd1F?=P*iW(Vw<8Dm(tLNh0C2Xa08SEP7fGY-#qZWIkmmAOANrR2{uhZ_V*lOmkZSw~2uM!&KTzqiF|+*d z8VVx|6YGEP_HWo8wA}OP<%?mePjpDp+T%5}+eET&;%t`yc|uO2UPN^u12T=n&6pS&Tn$gRkz)R9V+dFVuj9&tD;|Cw|a^_%h) zvCKgPZk`pg^u5%qM+W{S^tkAsCub#lyaUp9a%A9o`}h~Y(Xwa#8Wf_dPck&t+G|Z5 zQm+TQabH@0M{b5Dy1SZk5dv^Bd^P4LXWeYk+3T_5@1a0{b;WC6RW8RZl0w%$JMq`f zXr#sFA&ZTA0@Oj1=Jexe1{&yCWy$y`d)rBEpoPKJX95~{;3r~5GAs5x(=mQ=O}jb6 zWTP5VPzWiQ4iSVO@iR}JrqNh}VBxe-YOHGn2dgDKt*TD zNf#nIBb6uN>Rr=-q+5x2j7gVuKu}xwv{Z6wr`obA@Gyl;k9|Hd2hJFv9Ki@5n<3CA9t|R#P|2GNtqdkz z1riN~qn1?QxAfhV=rjsMC!nBdN@C>UUq>NrpcC($J(8tf!!e%DpfBXBzTX6xnt5d| z_ssay43D*EPSOMb9+oxQ6eTX5nzem5r02^ezX!bZP8uW8w1@}-=kHX)Bgc>Pa|l7d z)gSLBfTR@kbWeju79^(v(x7|BjqOiCN?jGiWLzmo!J7JRA39l42^!LWNX|RSyuUv-AWODoyRuV>BrS z2bU{tg{M1lP!(uxirNT_@Wir}x%N${Vc?B>qYXY4lv9kW5~}=7 zzOYV*Q`64;NEOJoAio}R>@bKJ*$e~P8m)Z-i@5?j`3wSNkwqxR?WcW7jIIbFR*V?H zqPQZeNGA;QKge|u0ufPM1a{J^bc+pIsqYVi0 zv!+EgfIrcZsN#-s~y1*e)y9D&`^n(VP1xmKUBE8u3@yzK5Ct zC%aE*AHZZy+9Pb*R#GC#y#r?~NF>2t3wWy{J;_Z+5P6B;DwUpqe@gO|FP12$phGhr+Rf8AnxIH?1ik;Yz zt+fR=fjCA3!*wcT*|FJKE_85PgcQPU&vi59YAPW2sgt=)3Uv^V;Idi&H05FRe$P?VFC5aWHjs`7m|#v=qBhYesj=RkwS!)+-J70d6X{ zOLyl^=OG6l{If0M>edw}J7c<%Yp08%PGNIDKs*;px4Mu0y%tJ^0(^uCe?e*>?CLS` zQtT-Jkl0*CW;k{pkDl(GpgJbZ4f*E8Ime+2?HTq^HSJu{pzB{zW~@2CTnwQh7zd6n zP2n5~#<|+1$wu6+UfM!~wWgeqSC7WnZF1q~3~+x%jk0gvDBnVB4MVb~GLOdOqYN!S zhBaB#DiW!73`CF0@Appm^J1|~3Qn#uYZ|CLZ>)|RAnCe`W-Ba-DZWp0ILZVt2(ge>73$MTM`5BE=M1TRCX$ zhPR&XRyC*}F6UU4q}T*e;^9+0O<{A$@^rQk6j8&zMdsazBx(wBi&F3^g%5gwsGJoK z0(P}_UBIyVxT2cdH^F)mi#0x=BJ&aAAD{{VNvcvvLBhT8wtwV;7ojw2iU#Q+3iui@ z&+pKlMhG3p9E2$zvJ5Cx$}Xf($_^+b1(AibpzG3*1%2TD+^NYrmDz@^%aZuWl+APG z&o+{D_;0&JDo%&TU8`&}DctR3hkfDl!i_*dAXKPK%2}06Rg)1X?00VLm@%TaMn=4ASvG6P?7MpruC?5l`tH+#GEQCdfELt|kqdbTj#X#CFkm7S{CZFAYBZS14) zPtfuC{D$`zE?u9W9w++a4uSBE0MDkcrXCju`SFmq#v9%-|v*N}X zfAdByoZjZ*WcJz*9STY1!E1%2GD%r$`H>9IjPIifHWGDE$;^MnNTzqJBT=C$&<1To ze}O504%TpXP*3OEWopIl|1wAN=<7I&=0Fohk;#1m7r51vd(>K*gk0WBheuNutX9yT zG`9jrRQ};L1JWyUzaI--$Lh0(v~iuX;QYxlWy^M|xcfOPK%hdVPFzb@l4vdb(KCU4*t+EzBYA z3y0d8UFfk2(0!{JT98AOS9XR|u+vm1T_kn2?)D5IOd(Oe6C$zXEIfXjs-}FgiyRl= zkA)gYIa#G%_DEDXySznHuXx>#OE}k6Ex_dN???@L{$8P!w$Pz!$fkc}6kEwz+H_rU z)cLb0X&5{y%tw^4U0YjlKM)(;Y;LzfP||Y;!*e*m-F(%1jJxs!ke;VM@*ncW|8W3} zg^lCCbsU#|`6w=15Pe^2SBXF?K&Ku5oZ}S%dfN_5IA*ZA&VrG7#Hp?8EOl6uTsds& z?ff4;isz0P;75!9nf`JNWx@~BcBRvuE}~>@&}aF60P62|)Fywk*wV)RF_QlFTBIWt3>V?p944{us&74BAQ1`1 z=UupYPmR;M@|8%WO*UoP9X;>jY`*N`QI#@lkoY?!ejzHijqmEjLtJf6EJU&hxy>z44Iod|CoMouO zM}tjRMc6}8>8PcuEKWF+rVbxt}HXKxCa9@rZE*iMA02`cFv-=dU2g1Ow3=dykq$iAW zAP`zoU2=h-z3farc|{{(Wla^2;jus%at7et!=*?PRzxhwzb;b~& z%}HKT1n72>2b?OYJmhZGew$Y0oNjX7&(ev7LY+-&0jEW_!cd6}XJ1RW?|p-0**{Z9 zon>tWyv)J+{03IE-8#7jA(>{HMj=g{@g{x41_W{v6;Rfz4zQV{NUTf1i=^}|RSV$j z2#ur%CSAXn3K!LVuq_I@5XlTpad{l1`1_O?D}NwRw=7m1lOD6foJ!n}Gkn_BiT8o$ zV#ntm6yC@B5HkZ&bj&O1*tXNLZQHhO+jhsc{pNYU>^;VFk3H@mP*n?6wQAOy=P|8c=FH~J z8mMB#SoS;ofY1$x+4GR5IOM$9Wz{J?0;$&zP?iy_eZH>VBM2CFJ{h~zEO02>ouqrj z)=t!YZ*K8?W=$ZaBj;)Tt)r(k*N4gE6E{JoIjLKJjjb@Ep1((m`IVFn)e_R4WdQ{f`6tTL<6m7th{D9q#rY|T(ie$c z6Xkfs;37na8e5!*Z@5<)i*u&xSTR)vj|F8*I`fjJc{d~Q$X!%UGWzg72|^P?3|36t z+V3HHtSHCQdEWU>SCz017$`H$8oc49flgsa@W_d5%ulji?QLpck!*itHNlx7rrTJ6 zo5qSSN}Kg^oX|#lHGfTpwWHdMjYfFGV0onh+E5sc*cSVj&0K|Fn(fny@fZklt{}4$ z*|<2s6tDODtHyORx^_9S!?1|(s?=3F=Eekdm#k_+;5lr){U@DQ?%cC1y%Df5vYD=j zQyB0BNjXbwMjM7|!? zdL!r1!KQSv_jeK2#PD~A`|z-zo-@ln43ZuI;o;q-IA>u)xqxlNd!H>w+hRnxrF5&; zx;&+FHUa#*koYE%fDj?d!#~7LOxK92^HWV(fg9fd`tW7$5zh>y`_znSE;i+sY2j0- z@3O9GD?KYcu|Ut;eiL13a~0{{FsTK$i3h6z<(V-`t5@jbsCa`egZCo|(IAv}TY_IwR8uKA*{;O@x83ZV3smfqf&`~k{A;`b^(O$i1K zZHOQ^dVHx|lCa=yrMgPZ#=X(QgWZrAU;a^o>Tp(Q%vT ztwKl?$yC|4B5a#8E}Y6sJT|Dij^>cj0t==LevluM^;uodrIWuik_ujaxg?26PRSW7 z6Jp?qOH|94Gq!BCkm-4|tmE7m6o_K;N-=yVJzpR}25q_J*$E8}p&94pl{G&NHBsDZ zy6eNL|HOV!D=&D|vN0zx8dCUh$LtTUba#eDGM+R zB#%(WxIs7RF?71ncensXfoDFQ=Yl$?4x!dBK!z5ck@f`2KN@tUK%v&s_@U+$L0pH7 z>MjA_a~KZT2cW^9REguelFh@=9y#x9X5pL^3Sq1-_6iLed-juJ_y|s;B_}=UC8h)) zifs`sr(J8FpZN`^#zt32CC*&A{Q8!y(KnMfT$+XtJUM=@K-g}6H7tCI&=0?>$4qVl z=u)#{=JSg+!mSkGMw#-Ja5_A*fNs3tal9GzV5^s4$a3C3NA56s4;y1aG6`cB1N=Vm zL0o7XDwh59nORnL5oHvWXKO_=fTc_86JE3lYJf=;lfqvWR%q!AXC82$R6HUOaty}lI{KDj=feu0LrC(Nd1DdFpYmg)@g#Ke(-E6 z6@&yrV^9UW4jeu!L&P3A9SrJeTc$Efp*T1XWMn?wO$n!T^X>m?w@nxMJan&8CJZV6 zaIH57Gn;{C6suGwS(rACWc4=cN?#wAy^ezeOSJz;#g>Kh_De_3Qut@Z5S=^6uskmh znHnpI$6Kp`$6G2_hFt#THRwS>t4|$1v=Tf2;DO;oUbOC>aGw+ofH?$fYbw-T=7(X- zlSKc$PaOD8!nsr+aSmCpU)Nss+F8Ayb`W*=H!@3JM3{Z>YqmuP9%?O`K}Nb86B+x~ z2OrtJyH;LMxY-i=-HnqH-)2R<-HFHKW5sRq=68P_m*2!YNX_xu@YpfaE9hdUD?Y|v zdpAWO+sxBGieK_2XMf_;HGCsP_8(hhbC`((T!43jaBriMy>^Kh`TQCG4$qs@#?^k5 zVVb?9n7ow|{3(ZB*4Z6F`eNE#Nog_k$sM=*^rj#mdCaY=GQN^Cj=$Tn!)RcF<}zW@ zf%LS$Ik)t}*m4|oH#CHu>J;`b_T56Jx`CB$&%SYG$Cq-95Z1>)Dwz64TA1i9r=AUZ z3YM@kpnsM4Td!w?`RUgu*?8(A5`Ru*+Ba2t2z-))60Y0y{ktzkE#8^agCn%;^tT+RmOXO| zgXidQ|6Izro@QY9ZWaxEzTH}BpmG+4+5)9HnR*u*OZ}#YsV!0kd*0PFQT@l<0`MC)%6}#N4;fxY8k(chEp73lE6{YhO@u88093Q&%^Lb ztq|oG&tI-y=Dly;-a9LOihp6rD1wC}ruV<~B)spzdULzR!VW+i+=Ssvvh#fiJ#~5G zzK>X8f%VS#h24Fv(N#JQ$Pkxa&5deuLJbP{p*gp|iB5^B@OEG7pBW`wVg>+&M=i!nq7LfD1nX`Bcwmz&5HZo z3<=hEjmMoVH_(H! z4aOV|tn|U_iSq+tX=FwEt-9-q&uNa(_j$U^e)X>CrW2!6xQ-Xb`x7H#faGf?VqgZ{ zg&$rso1}mCvj=YQy5vOnit)R3x83ii>Yr<*+S_w?7+1EPP+CC`-D+14ox}o?iCL46 zrddG_jquJN_;DC8Mh!I=N>8eHdGp7Fjad#lF{s@+?aIPm!kXVHpqsJX!BMYC%Qh=q zv4+l+kAB3)y79j+C~mOs5l;uGh_M9RHZD3QY<~&BcQ;jz6Whw;{!@KXe>I%`?WEJ0 zu~d>|ou(ar0dwWYvT=TFHE~r(*zNMuCBqqvrFSHt{GBqN3{E|m;`^SDwSyiXh$`s+ zpd~r}Qy~W{*MD7{cZvJsJz~G}@D7@#Q8pL$IrtWVfE*Jgi$W&;$#Y*=Qe) zulQZxrt2dTS5K#&Jfwo!7(y&asyMJ4%Yr*CJv0d8>sB^+vOb;NA?dc=G6R}S+GcK0hgc*6CzVy#bxRBix`J`PFKQ4*UmGmZ(n$G zJ_7ey@!rfc|95Z_Q|G%-->4nlVViFzO>r>N99=6yQbw20r9P9nRu-=!&@}tj_=PN7 z8$`*NxQme3n(V7*sea_reqjG%J{85|0$ERVz(d>)xTCG^0Ci``H|t@PTlfi3DKKlM9754qr z=r{>{Z~B=rZqiZ-CA}q`UTnl3&P};O+JDmf>VP5IQACLaz37lyqA1dr90MXfD^gzGLOB&ys`QLMBH&yamd&;KL z}5XUT}lHve{kO5%@?M?)D<*qe|(AFmnKApD5>9 z<9-(@K!^ae*gb^Y5;(i?o?^-2rOmzI)(`}cym zsj<`7p|Pz;v4(j4*cl;Ahe;hb@xObkc36;@75R)$!<|DYf$lJ?iZFyE1s~uU{5_g< zAZF{oIG5^S|F*$?NKW=#=#yYf7v_)rPM`g;CblWVk3s2kgAQIqaOei^9c0+2zk;Tq z&;rU%#uz51#_+@!b&r64WatB;b|_!zXU=|j_usx@%aW&!C3 zM(phb&h>r8m-X9L!`u&moCkQT4@#;s$u#$~TP?6zihK1qlR76GM>N8Je|ETTc=*05 zh6rrJ!)?3^EY6(q%|7AVGgpbUD6m8aX`F5cm8D7|&O1rxY;6Qlp^jk7rB}RoNIB{n zX#NxxhOW9(m?tNsAGWEtOkkBKd&|4EeD)_*k>24rkgpAV+c`M#zm@Ud23+z*S66#~ zJTE;K8A~`}YkSA~Lt6JG28qTroOcww``}AIyxiQX!G9gxNr8O4?44bSknoOD|5c$; zKa_bx!)f(Auk2asCE~hhzpjg7tP9zAR{7w2_OdnLSnd)+Srz2sd`2f+X4{q1jkK}p zupa2wI`d{G-F8H?g^b4fbuLFRP|Q_0izv^8hi9Iy!u=qmfn9vxX2)_nFJ;q6iW4>B zjKbuj*R6(c%vJtZAcOp93prk3ptFuhJnz&Ho#D)doJESnR?d>$#Qa5W@1;*Vbt{tF z27Mv;kTGi4N@{^v!ZDP2(s|cW3`F5_37k6F}E8scX-H9e-p6oCZMaGBk60Kz0py$48&9)(hzF#Gv?O+ zGv>>)aq1BF--y|>^4i)&_Vv>3!o`g=57yQ#He{4Olo!cY<9Jp?wE?8ye_D|2w?`Sl z4%&?!chwMN4e?=3ITn1=9F0@E`mkkap0txYD`8tXF^1D6fI{^c=t)+Ii!np(cBQ#q zlw%bv*?2AU`!WP2v-NH4Z!bB2$4{Vtt0N?rf{b#Z@I3FNDGpMBahxNE3ECVrrDr4NP<&=g_xl&e6ZSFX zeQh|Kg&G_`=S1h*KAj|@<|Vcbhtn*(D9$t+b7)wo7z9u9&vfHWbcJns)8Y&Y6~8t$ zA8=UDm4C;yZqJmAPz+!tf{p;K0Qy!mT4$eRS7a;t+UmyRy1uf@_paMY-jFxyOIUHz zs+Y}`wQ+Z1=#7XWNARqd;ZWR74RS379X{<6dUxhlznE{!=rdezI(EO7ZAst$$a1uY zb1ui(U=D=+Me~tIx|X(5X5H`$NCmRUZJC^JW+cC)tP+yI$=9cwD`a(x59MRyOr)Fj z#+CIqPblof7Lpk!`()Z8lW+}&IaTXMEn@ZhkFT2~$6d}gLrQdTeBbzNbN zQq(8W*TT2eJZv`5;VNwt5(%S>o0w@MZ^ciQx4=3alK9cG-B=|j@}(=2sg_Eu^mY@N zxisYc*xg@=1?@5^prY#Q%d?igRKr0E{+br%(spZ#qe*or9>}98wrI=)Q0MC7CkTz| z$N;;8S3qeSn1npz0d}3Rv9C}#WO554HLdsRqUPvEi!*nDSJXN?c(fg3orRU8O%+K~ z}UZR!@DAc2Y;QssJKxV)R<*FeRu0jCMe54+HS-&p`}v9*3e2{SDD#wBLwkiLg{pu zNsPsCl>$HanC({B#>K2~PM_?A=s_U;^UMRXG}t~q<*I(>i32O_uz%^&h}k_NdhDB= z;V;e2wNtjVTKNi{UbZ1d+e|5@j{L|Idt&DiqfwDh86v<%~0)4`-4UMp%(96mYF!IZGug6CFLeV0GelcI}Y90NYF=8%d z6}^o7Xk7NS;^jtO!&9O+q^@yyy!C(HWdHx_q0SN;5hbt-NvB7Qq4N*NbIyUgy`vS6 z6^1rVlR&a~Ddx(?M!x#mxMR$8rRAt0gw=>iJoyy1CFy7Vu{qox9LKCz`&~^061mYs zaHfH?QIEngbfzL;F^79~gD|v*{pC%2C41pwUDXDgu~pS+3Nd2A0a4%I?tzZoiZJYh znYz!)YY=1$dum+I!{dsy_< zr-JVn#0&;*u?SpR@-Ol)FC6&fGN4yAA@;lr!XaT2vt)IU4HM0fMJu~!O zQLPH08jY!ulW^BeB_qOS->qEv2j6yBfq<^jyCvXOn4FAK`P^BmkbTzQatX&rWDuiI zG>9xQAgT&D1V(VWuT;hs2cQLK?am8h18WWYE-U^#^+oePmnag}Gj`U;`z+8dgU#;U zg_4ofb=(GX2^2{8x(<`#9*6%I&sUWnY%=bX1($BZdih`u6w$dl+e{6*VUNG+q2?glSi4niUvjJeJ*EXD0<6!i{8+iayjD7mABw+5zc)%D90l{RRGt&v05wS z#FJspK7hP>e485VRaCk^4qHaYxO(&k-_Rqc?#0pEvjZSnVrn^!y;2Ke$1kt9u*Tu`UN$M<>H$o&qW(EM0r2R#aTNbH~-mXi&~y};I+Tw5^cAfvZNyY6y{Ly&zj3As) zn_y;s#BzSk;_%TwTh&@sL^OhL*Y75W2x~fPk%#zT_O1jWG54}Z`Sh){XQ|rNdlJ9C z`-aM2C`PFE1-Qr1zQ@dKpUXC!)?LTQB#57F;V+`aTP0H0?iAN zZ1W2wumS>wAYvN|P%&*8`Rx0E{sHy_R|CmGK?lfSStasssW6R(faY2B6&dqs)ld

    {%L7X&LWE7Fk!rt(p!K~`5CD&My?GB>tWW3j+ra?RQC18Y7LnQ z$^{vt!j#0G4T=^jz~X8X%Pbjzf^(9k5M!k>Axg;Y31Y$KbtkU&h6}M_1F`s~Lqli~ zwzZS4W->3w!;1BVQ;8HnCsV=nuF5GbAY3G=X5JR}!$Y5zh0BKY`mrSTf|^>TMKu^m z^V&f~OA=wRa`qEKbKwqMP~Grw{>pemUY^^P?Q?+$B2Q4pmCg%WOPX4wUbFA>hc=DZ z)A8j%o$Z{<>vS*}9;ui%Gv^ewwVT?7S8gHpBKT-9*w%4hRQ z$$LW)kKLB7?UUBC{*%{fb@JQI^%^Vze2i(r6wV4b+nOmW3qhZ` z^Uc}C$>F8^`wAXJM*@w2t)u@y`ZIJ19s_arE_||ZBWuP(f)_JBQn8-2;VlN^yW(=o zfORs%>3xTvF63BO?nswntHRr!RTGvbBxY;lO8fcEHyCoCdx+dHy1SoY7qZ(3Cj1QQ zrwEtt0($c*cg<_%bJOPp@8a&_!tM|NIhas+xzOo4-cbwSr+)czGl#Gu2cIyDL0f{=a^X_^3|D|)XZ zb8o(&=yk|Y6a5`t1{JY>L08hKFdADC+D+aT#>*xwatBV;73AMrLkrb1il#ykm!VM$ zTd7iv4i8%)S>UdYn3yMv07bq3h6p)`(H{mj%Wf+;vkzk-3WJ^%wxWSk_sg2fS}m2X zd0YidX=8adglMBt9n(7SSiB-H&|^9ZSLtE&>)DW@+?I@h^y}|!7j>Xk^Xgnu#GPPB@st$MPXf@f27owg3xd+7Y2j+)d+Dh z+Lqp(?spK;8l{1&wXEwK+c7OyD z9aid|T`vm^I1V?FXa~$BElAL#C8Aa%H&Zuq<8#3+2I{lo4RO%RI+NMiR@a&p%+q=9jpr#6eO;EGu7VB;aFv^2I5W=!O?#Eqn8%vFmPVkH~57(rOlqLjqB8i{Nk? zwnQ5ZsxZt3;@9#WNK`$OAZt^CFq=akk=Bm8BO5N!s-CZru8|~C5_}Cz&N};IJ&i~dyv!%J^xZjNA^Q@aEmjT7*SPbQ#!?6HKfuft$Aw9pE*6cWCM2Q@) zb}ur5z;h+?{d8p@B=y59q6y#k~a`KwBa3ycJnr1tWj)I0fCwhlj&j zHWZF6n#Ce*Sp5Myyt_>0JU4$lhPbLsoxI${%3USAe4Da(k2Fv9T+ar3eLu4g=)op| zL(5te7`Ipmz5LH@{8vL~KDslODNT6*R_>~hcna)+-UeytNULvBVNp~#CWUYS8UQ2l z%qPy!c_K6_a={193gAQ3F+v1gj5V?3H4DeJEN}#S9C7cOiVi_Z0r@z^*bqt`C#|jq zRT8d0AiM~pyr#Aom)tRx^c`Wlus15jpK!)goJkmrwK@rW!4~=;X6TG-vt7u&_g!R3 zy8S})MMV`0z@aD=t*8PV{f46s%_$A}BfPT2a;9HVYcs>Cu7+$020U`{3Ios0gy6`TNI(#^%8fgeA zc-5Daqu2YyBNVEsV)c}6{-UA8+2t_05xrPm@IQP z=!e@nGJsr*!J&~2QqLuQ>LUj9Mg~;6~MslS*Ad8sybbHxr|Qk+m}p z83JXHXCR2>ZuN}!YXcvJbQq5~79qW$DeL(oYmy}gZ(RT+f{?AF8_9+t2VEY$fKAc#sYJi#UXmg1azTmqen5zZ0 zS>-62?ExT>J~Y*F&H*{Qm$={P5gk3y={eS~CLaAOFY3~v>W<@jn^z)m~uPf2I7208xNNx zYJlX@!HXjFhJ!uo?$=YJ#rSAOSdEqfWc+|#m#-3Vb}#d(uR_peoweBY1!X;iI>0pz zc`C@UDHmbd0J306f%-b4&~|X^*b>xmmo~Y=(HB@gQ zue%UH-`fxD2U@OhmL@pKHfiKGqjlRR(KgJMCTHEpGtf+$S696}i@}!95VfAwnzeL_ zposdxRVDK!vOY21j_x<{NG|4F?Y3_@e(I97YEz{*hK^eL6$>bq$F2Q$c&puI4e1hv zuiOk3U(5H8K3}EfZ-GL6_J4$XJ33|(Jdy&k8l6i%&EfhQ@Mq)i>GV>*2Elo88l*7k z7py1va~RtnD4-3Q8w?xQnw)CFOl|i>tq@S7XF;7G6?L!od?FTP)1YL1sHxHgwo$`$ z1R(71>Wc-E@@?I8aa%f`p$BwD`Dcc)vkXs~k2B?Ge$IBbW@IvQk~ZKx(}ca~8JKFV zensHyM(8Zf0YC8X-J2kK#Bew>(Ms!2Z~>O?EYsZ5ZglUJ8egsF7Sq=KsZh$7C|~O2 z1twpuAHQhF8G6 zJPm&yI^K#;VEHkLvjCbj;hb3)aI-M3vRJ?ub$Uk6lhf=pDi265tBjsQgU|AMF05Y7 zxiY+HcuDPszzxAz{U;Eqf+@a{++Z&A(~6|DpH^fs!EOD+Kb`D&QS|hAmX14K>b`2- zzJ@fBqY2bMueQyWC;I6!^&r3`hPG$-JotR!j%8;tZT~d$yx6*v|7bUY>DHG!+f)CX zaVGiJ!Y;|$$I8m^ZjP^#iO*>BGDp01Bo{Nl?sl&Q_1fHVm)|;Z#+aV(ZDG=wxglgK z=skN{#`)uMZSRnE)oKv)^RHH&_c=+3>91oCIql&{Zi0$)ndf1bI%h{Kj0G-hMHPig zQ8v{WzV*-?*_e)>xw!pl*h$?n$b3eQdJI8LQuRdh5f<~OMr z4}GxM&bCf&3OycdrYyt%9C`RZM;4u*6!-b)zO+v(Glka3vkj*Hz9m0F0Ihf_tuhctb49wJGCYeWdL!xNnx-y9RBq!4bxju8O#! zgzcWxds0o%!XMk)^|IiPY2E^HLP~$*37ilPY6+W41+ zdU#CJXg}8ifcRbSXfqii!E+*AHtvsGDg|?vRuQesn$?K4@_lY5#4h(VYF!qv_sctn zb@rB^u(bA%*>OQ8K}oruoUDo3psovUR+co3sZ8#$`$!#aaE)D{Xv}6T*?7)`if@>D z3C-~efuf~+6FupvTi~FAy-T%dsdVy_ab4E6t<&<(+z8(%tDJT?D@>>R+GL@WRO)5S zaH$YgWof#6+X>ml_(+bViK!S%bw++$v@4=!Uz2sh$ga?> zBmylJ7bR(wzRU=-tL7|UHmk|S!Hv%C*`W8fsea?A1&4b3`UTak>A0vC z&Z5-uJ+gL6=J)Z}t6s-%A8admQx`BRmW35O`M#%K;L4|C!;5OIa+MJ+um=_k^HT%IG#u!zu(t_({TMm zc1F9fif!DWH+@huNPkN7ZkNd(=BmJZDCGmlm8Sd~U5lQdARjv~oHuOPtqhNm%jbK$ z<*hfZcB1k)E_KxK+F@<{ZY1&zul>I~R!w^EkEk=>8<+!S;-I`I_jE*vK!>-aVC*ut642cyS2Gd!2s zI}geN^do+f5oA9FHRnfM>ZX<^&MS7RWl9YvCrNx}XI)I~T^@Ha44Z@NZB2u(0{brH zmM2ZB%}n7E{-WDK1)+wfi%fz)Z|p&yY2L zv2e(iZcJh{n_Duu7-S?TBPxp?1{SG^ss9nBVSo7KAIpdVaQD+KuO^C#qY)DmK9}V- z8sJ96+3RWKFzCHDS*n58QAt(*B}AvQ#@GdFaa>qxEu~L=RT6DFfolq<&RbFBa@Cgo ze(^|gmJV5|X2@8MVW%EzcI&*UYXc8k@pZl|jTB5x3~jk%+uwQ+zf@bsQ>G zMJo#{2!?!Zb@|OtV8mwRnNXOIjY6cNPEizkp3gf;1R7z|!A`Fsw|}6>j`{itbMXEd zvvN&0Vdq}qzob`Imfc(QiD~=}u&bH5-{y8}lpCQ6seLjhzDu8X?I7J&bRe52-ce1A zLm9c2D-~B9GWI%Jcjqb!EozV4(|Bx><_w|{E6af!km8z}h@@H)HF|%u(`euZG>s~p zUMP5U>rhbMhej$&xO3!_deJq?B$z<%n0;C*FUeSnU9@_=3hAq`9&SE0sR7)fxjBf; zX%-8OYQ^Ho%m>pjtMc@%GnftNz=>rm^CROynN^rm+7K=4iXVzET^aU_90?2httLb@ z2D7H^cOJr@6+Ka`xs=1b6v=*j0V0mhiBc`v%vM%sT|m?-i1AjuXz7F+z}^CLEw4Tk z+)II9tf@1Reo}j^C`gqFj{}U9kYt+97s~J=Fa8$db8sJRqu;_wy$h-r`_nP8 zKuk;pBAfo_j^<#)#)SG2?+vrEq2k=@amb;q4@zvzKo`Bo|8mxkk7c%b!lq{e9%sUD z06TQ)EEFxIY>#^%g$-kR^`V)=2Sp!)lK z|L?z6!^G+8$E|~%A{xIzYyS+iREvDpSM5tFN+6t5%zDg?Lo7-|=bRnW^G^tlh6(Q_ zhpap?$2A?1u)7M03g}bS*mjyQ>D*@Cn-}@A@J5E4s8aOA=eCf1A?fnJA=NqKX?!@a zfBIWTo0f*{8awsIvlgw+e7l$xCdjYtftDI5@isi@e7Qm7uw|%8%S42Bs!HDjL;2%> zkecR?A-oevd+}Y)QPm+{Qi(n=_(mI{<*FHc5xvOyaGvF;@hd~Ki6+Yy*N?SqFOpij zV_smhLT=Y})TCLKS&DmA z(41P)KACczyZtLSYqSBzm7;Di7QBpmIV}3C43r^|;!x{wQE2f!nO5NZG5@~wGEJXj z7XI`@!a|OsJ^#~d9C8XEQNlmIiBVaHau#r6P&~cOwI?-jsS-r+e8Qdo*f1#-=9i%s z2{mu~WD+9A+__cj4lUbGL3WHdTMHCmC0ozDIvNRc@h&B9jD;m7Cw^-zhGLPVNdG-* z9E={{FmsyF;L7i|}t*WgAwrU>P2S<#fl(6v27Lm)Z%2H^uS^*+e zgmO@A+@a;DnFWX^Y`>AbH$!wSlmOL%Bux(cR7_;4TQnMdbg}`eXB*Nm%&A9cR15NG zc1IA22~sS+t=9lH3iWgeB$A*#u#u&>jXh z)Z!r(A}f^-Q%l7X%Hg-`^{omcHHu3EbtD6Io$H9#5iFm@pt=i>1PIXF(M1{hH)aZU zv){%FHwGppemVQC?I^W z!ch4$&<8~IoaF!A?vItlIQs-_K*G;Hpczsxx-(}U`IK~sHd4i1=Z<~zQ>AB^n0sP) zx>TDo32!x5jx5}Ge`8p@3{CQj4#-MBN5-;h4R-ADx+ThHx0v$!PE~`_ zf0}{dJou#b(wjaJfw0JIIlhK}B&aSgS?|0`!&B(t;t6VdT;;Gl9T;l#h9HiW;O?m6 z#Y%^12IeZJiBR zA;3bX5jDhx+t{8;k4MPFNI$E<=u&Ued9k zrs{3#?YB95d>CZhjY3pJhzSsi5bGXnFhhr){e{enI>){n^*cF>fE>P)gFi>lNPpQs zn+dBvVs~ipv=Zi+Uy>z`0p*PWhi~LAw@EFAhv!Wp;mkb*-*NvVt0e85aPSnb=^|eb z;vhQc5*I5T5%_i))FtiXYR9@{Xo-<@TsEfaHg0Ek68CH1g)!G7F1GgR_!>-iE=2CF{9dmd`SVGnPqj>xXT zZFbxmvU&4G@&sQ4UXF_4q&%qmK(ldzH1IL$SUfu^7yWDY`O+=VU47C_I}(@7IZXOi zTrt&s*3kxXennQ?`^t24wKcsMv~_ZTVfHAuF$B}w5-7YonO{}F+1MszLalRap6COC zK4o0J9O;5E($Xv@p?TUXK;}Q#iIgYJ0u)x9~H})f7ejP5Yt_Tls>}!Jy|c^H*j+bMTH8;eQq8> z!esTN18&Op{9ZVBW!U*TKipt}FT3@2lRd7$`->_YK-&g8;d9cW$OYWs`6wsV-Jj>p zL6S1XH_Gu>bk-iiyzY`O53@^zK}?krB}eR*er)I@A%Wv@=k_+eljNo^V>jgw?wzl= zqM|TDZWcGwHEICZM7ji$a(g(K+i6wwP=!%P(($6;c!rgjc@6-&`xoJydO*TyXUSkZ zEw_S!HX{O${c>!P)7eIFwg>o~r@-#%Hn|oRy$Vfx0}i!V#P~)>sd$&+Dd8UahD`TH zn6lkLeq}jcc^cOzbp?%L)A#~^=8-+^4#$$5eufUP?H+vXF&e>K8J1P^3bk$+ePoeW7e3wj=9g&~qds5uMUR zY|W*5v1`FnVJkj(EPzT**FP`V$It5kbb0ogCU;Pg2A%|b90xhZmzx9d4RgYyk}&@XfR zACwjQf7n`L=H&eEsXm(4jz7xk>q@t8!tJOqEtLG%kE_4BfYjwo&hpsmaX@x`te2E@ zmpG1AcdxytJAxy;kW#%df6|M%2@JjWYHv-O)(8t`fO$KoD=kY~i|7I;56ivTbn+

    ()_b>x;hk@m7KNnY1EwYrdYp7-@MVC4+y2 zBxzFsXcmWuN?oF-?y~V}RZ~N7CIn)j{qY7v;6drkH!bURqRgasinON|MLGqU#zmg; z_tT>JT(ao2dEb~FSEaFyZb_nACl-t&Ti90V#;jpA#~i0#Xi;%I8ed?%?i3u%Tv%Z2 zLfu&YcY%OnPX|m7_s^h@A&kBpVctDQ6<^s}fgmJ_cpZ2j-2v0rr(B-cNZ!iD7^mv= zBBl(1I-|K=op{ek|2cnZ@*a)ks&{nx+?FO!pTb$PKgzUCr7sN3%~f+Lb(j9xsu_N3 z@N2iW7@mNO7<5CUD7^#xJbQgV@V07HRjosVE4l%FC>kvFQ-X}DdDX`3b~6?BCM`#) zdCw{=bEsb(ipc-2xeg~^xqIxKEotOjGe*UF$_zNns!Ak|jgy873%gwIK&O_}M0-$A zHM%6*j%CKRtHUToAn#`q!5k0)BA)AaMR;gCP@%IP*yI-*QBWJczeZE_j3E3n=eSC3 ziI$cxmNbgtwqjRQ_d*iMj1?!Us{DCnmpToT7fNLu!NWHFH~!Wcuu|z(6w#?S0@~@G zO849%0)llknKsCq{K`@)G9E0vN?s_MNc~J`B(rs8YXr8owx{7&{7PzDeLztQtraVz zHni$+QgB>mL)`S3(O>vhY1}F3e`*w~voz%-hlHWwQfp2Q2r9z$MMgq82O^UiiuXf@>68BF zhtPlXH>K#UJ516~ir6^)hNyrGb31()*C?)PWJxLr1B+Kkxk!PKt)-Bv$xFL@tVnV! zpmq7Bw`$x`At=-<5AE>iBV_eeQDwe$hW~)JX9Gzi7rWt|>GaX&#s>3qw)$U<4)2+A zU%VT4D}j{`WF&In$kxHMui8HSiF{X)mSl{@#9(5EM}A9U;$^bA;f615ud9ghMl_ZN z{~+ipEH7IA3%P^lmY%1P`tnIgV#U2;F>ya&w=9V49>wFXSL)T*>^(M%7y01#r7psLGH68@`ac&+lMop(FV%Cp!GJa#SZc! zZE<9T=OMRKtq*{W7{P3>AXJZTz#M$vE!X^ z0*yKD%)BC=X^aD9vcU`#my2>^8MC%OFR?-R7g%ii?hZ7DdAmGvm*VCe(jzyEfR#5k z0Xl-}9W(|V{MsMO;QA)os{)BCw=ddj?GW_ver6Q=%@Cy9i2YmSNCiTnqd3OX94Ms@ zs0WA&;FqFGzmel4NQ3mdtHTpC@9p!#=52T3GGy%&9s_fgCx(c#0!CpNJoIlrxNDz~ zTF^Xs?tEuXiQzjmksol_{xtS{rM<->%lla10k7_%YW~tv1`ijy-a)wp*@jtKG5951 zsM9p>@lVJ)zQSYi-2J6qZcr&)4S4RBg?8FtNB=i&%0D>@`RWI;Xn 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 diff --git a/doc/fai-guide.text b/doc/fai-guide.text deleted file mode 100644 index e8cce4ed8..000000000 --- a/doc/fai-guide.text +++ /dev/null @@ -1,2785 +0,0 @@ - ---------------------------------------------------------------------- - -FAI Guide (Fully Automatic Installation) - ---------------------------------------------------------------------- - -Thomas Lange - - - -Revision History -Revision 6.4 10 Apr 2025 TL - ---------------------------------------------------------------------- - -Table of Contents - -1. Introduction - 1.1. Availability - 1.2. Motivation - 1.3. How does FAI work - 1.4. Features - 1.5. Installation times -2. Quickstart - For the impatient user - 2.1. My first installation - 2.2. My first server installation -3. Overview and Concepts - 3.1. Important Terms - 3.2. The class concept -4. Setup your faiserver - 4.1. Install the FAI packages - 4.2. Create the nfsroot - 4.3. Creating the configuration space - 4.4. Configure the network daemons - 4.5. Creating the PXELINUX configuration - 4.6. Custom server -5. Plan your installation - 5.1. The configuration space and its subdirectories - 5.2. Defining classes - 5.3. Defining variables - 5.4. Hard disk configuration - 5.5. Extract base file - 5.6. Debconf preseeding - 5.7. Access to the package repository - 5.8. Software package configuration - 5.9. Customization scripts - 5.10. Hooks - 5.11. FAI flags -6. FAI installs your plan - 6.1. The early part of an installation - 6.2. Boot messages - 6.3. Rebooting the computer into the new system - 6.4. Starting FAI (task confdir) - 6.5. Defining classes and variables (tasks defclass and defvar) - 6.6. Partitioning local disks, creating file systems (task - partition) - 6.7. Debconf preseeding (task debconf) - 6.8. Installing software packages (task instsoft) - 6.9. Site specific customization (task configure) - 6.10. Saving log files (task savelog) - 6.11. Reboot the new installed system -7. Advanced FAI topics - 7.1. Checking parameters received from DHCP servers - 7.2. Monitoring multiple client installations - 7.3. Collecting Ethernet addresses for multiple hosts - 7.4. Details of PXE booting - 7.5. Customizing your install server setup - 7.6. Creating a FAI CD or and USB stick - 7.7. Creating VM disk images using FAI - 7.8. Creating a bootable live image - 7.9. Building cross-architecture disk images - 7.10. FAI rescue system - 7.11. FAI without NFS - 7.12. Installing other distributions using a Debian nfsroot - 7.13. Creating chroot and virtualization environments - 7.14. Using FAI for updates - 7.15. How to install 32-bit OS from a 64-bit OS - 7.16. Aborting the installation when an error occurs -8. Various hints and details - 8.1. The list of tasks - 8.2. Automated tests - 8.3. Autodiscover - 8.4. Changing the boot device - 8.5. How to create a local Debian mirror - 8.6. Small hints - 8.7. flag_reboot (FAI_FLAGS) - 8.8. Log files - 8.9. How to use HTTP for PXE boot -9. Troubleshooting - 9.1. Boot errors - -An older French version of this guide is available at https:// -fai-project.org/fai-guide-fr. - -Abstract - -FAI is a non-interactive system to install, customize and manage -Linux systems and software configurations on computers as well as -virtual machines and chroot environments, from small networks to -large infrastructures and clusters. - -This manual describes the Fully Automatic Installation software. This -includes the installation of the packages, setting up the server, -creating of the configuration and how to deal with errors. - -(c) 2000-2025 Thomas Lange - -Copyright. This manual is free software; you may redistribute it and/ -or modify it under the terms of the GNU General Public License as -published by the Free Software Foundation; either version 2, or (at -your option) any later version. - -This is distributed in the hope that it will be useful, but without -any warranty; without even the implied warranty of merchantability or -fitness for a particular purpose. See the GNU General Public License -for more details. - -A copy of the GNU General Public License is available as /usr/share/ -common-licenses/GPL in the Debian GNU/Linux distribution or on the -World Wide Web at the GNU website You can also obtain it by writing -to the Free Software Foundation, Inc., 51 Franklin Street, Fifth -Floor, Boston, MA 02110-1301, USA. - - ---------------------------------------------------------------------- - -1. Introduction - ---------------------------------------------------------------------- - - -1.1. Availability - --------------- - -Homepage - https://fai-project.org -FAI wiki - https://wiki.fai-project.org -Download - https://fai-project.org/download -Entry for sources.list - deb https://fai-project.org/download bookworm koeln -Manual pages - https://fai-project.org/doc/man/ -Mailing list - https://lists.uni-koeln.de/mailman/listinfo/linux-fai -Feedback - Send feedback and comments to fai@fai-project.org or to the - mailing list. -Bugs - Use the Debian bug tracking system (BTS) https://bugs.debian.org/ - src:fai -User visible changes - https://fai-project.org/NEWS -Source tree via git - git clone git://github.com/faiproject/fai.git -View source tree via https - https://github.com/faiproject/fai - -The man pages always include up-to-date information and a lot of -details of all FAI commands. So, don’t forget to read them carefully. -Now read this manual, then enjoy the fully automatic installation and -your saved time. - - -1.2. Motivation - --------------- - -Have you ever performed identical installations of an operating -system several times? Would you like to be able to install a Linux -cluster with dozens of nodes single handedly? - -Repeating the same task again and again is boring — and will surely -lead to errors. Also a whole lot of time could be saved if the -installations were done automatically. An installation process with -manual interaction does not scale. But clusters have the habit of -growing over the years. Think long-term rather than planning just a -few months into the future. - -In 1999, I had to perform an installation of a Linux cluster with one -server and 16 clients. Since I had much experience doing automatic -installations of Solaris operating systems on SUN SPARC hardware, the -idea to build an automatic installation for Debian was born. Solaris -has an automatic installation feature called JumpStart ^[1]. In -conjunction with the auto-install scripts from Casper Dik ^[2], I -could save a lot of time not only for every new SUN computer, but -also for re-installation of existing workstations. For example, I had -to build a temporary LAN with four SUN workstations for a conference, -which lasted only a few days. I took these workstations out of our -normal research network and set up a new installation for the -conference. When it was over, I simply integrated the workstations -back into the research network, rebooted just once, and after half an -hour, everything was up and running as before. The configuration of -all workstations was exactly the same as before the conference, -because everything was performed by the same installation process. I -also used the automatic installation for reinstalling a workstation -after a damaged hard disk had been replaced. It took two weeks until -I received the new hard disk but only a few minutes after the new -disk was installed, the workstation was running as before. And this -is why I choose to adapt this technique to a PC cluster running -Linux. - - -1.3. How does FAI work - --------------- - -The install client which will be installed using FAI, is booted via -network card or from CD or USB stick. It gets an IP address and boots -a Linux kernel which mounts its root file system via NFS (the -nfsroot) from the install server. After the kernel is started, the -FAI startup script performs the automatic installation which doesn’t -need any interaction. First, the hard disks will be partitioned, file -systems are created and then software packages are installed. After -that, the new installed operating system is configured to your local -needs using some scripts. Finally, the new operating system will be -booted from the local disk. - -The details of how to install the computer (the configuration) are -stored in the configuration space on the install server. -Configuration files are shared among groups of computers if they are -similar using the class concept. So you need not create a -configuration for every new host. Hence, FAI is a scalable method to -install a big cluster with a great number of nodes even if their -configuration is not identical. - -FAI can also be used as a rescue system or for hardware inventory. -You can boot your computer, but it will not perform an installation. -Instead it will run a fully functional Debian GNU/Linux without using -the local hard disks. Then you can do a remote login and backup or -restore a disk partition, check a file system, inspect the hardware -or do any other task. - - -1.4. Features - --------------- - - * A fully automated installation can be performed. - * Very quick unattended installation. - * Flexible system through easy class concept. - * Update of running systems without re-installation. - * Cloud images for virtualization environment. - * Hosts can boot from network card, CD, USB stick. - * Simple creation of an installation or live ISO. - * PXE with DHCP boot method is supported. - * ReiserFS, ext3/ext4, btrfs and XFS file system support. - * Software RAID and LVM support. LUKS support. - * Automatic hardware detection. - * You can deploy Debian, Ubuntu, Rocky Linux, CentOS, AlmaLinux, - SuSE - * Remote login via ssh during installation process possible. - * All similar configurations are shared among all install clients. - * Log files for all installations are saved to the installation - server. - * Shell, Perl, Python, Ruby, expect and CFEngine scripts are - supported during the customization step. - * Support for many protocols like NFS, FTP, HTTPS, git. - * Can be used as a rescue system and for hardware inventory. - * Diskless client support. - * Cross-architecture support e.g. for embedded devices. - * Easily add your own functions via hooks or change the default - behavior. - * Cloning machines using disk images is supported. - - -1.5. Installation times - --------------- - -The installation time is determined by the amount of software and the -speed of the hard disk. Here are some sample times. All install -clients had a 1Gbit network card installed. - -+-----------------------------------------------------+ -|CPU |RAM|Disk | Software| time| -| | | | installed| | -|---------------+---+--------+-----------------+------| -|i7-3770T |8GB|SSD | 6 GB software| 8.5| -|2.50GHz | | | | min| -|---------------+---+--------+-----------------+------| -|Core-i7 3.2GHz |6GB|SATA | 4.3GB software| 7 min| -| | |disk | | | -|---------------+---+--------+-----------------+------| -|Core-i7 3.2GHz |6GB|SATA | 471 MB software| 77sec| -| | |disk | | | -|---------------+---+--------+-----------------+------| -|Intel Core2 Duo|2GB|SATA | 3 GB software|14 min| -| | |disk | | | -+-----------------------------------------------------+ - ---------------------------------------------------------------------- - -2. Quickstart - For the impatient user - ---------------------------------------------------------------------- - - -2.1. My first installation - --------------- - -Without further ado, this section will provide a quick and easy -demonstration of a fully automatic installation using the FAI CD and -a virtual machine. - -Just download the CD ISO image from https://fai-project.org/fai-cd -and boot your VM using this CD. You will see a grub menu where you -can select from different installation types. - -This installation will run without an install server. The CD -installation is the same as when run in a network environment using -the FAI install server and can also be used from USB stick on a real -computer. - -You can also create yourself a custom fully automated installation -image on the webpage https://fai-project.org/FAIme without the need -of installing FAI on your computer. - - -2.2. My first server installation - --------------- - -We will create a private network and start two virtual machines. One -will become your own FAI server, the other will be an install client. - -If you intend to use VMware or VirtualBox, ensure that your client -uses a bridged network connection. A detailed description is in the -FAI wiki ^[3]. Also, it is not possible to use bridged network -interfaces over wireless, as most WiFi network cards do not support -this feature. - -When using Qemu/KVM and the fai-kvm wrapper you can create the -network using the command fai-mk-network. First install some packages - -# apt-get install qemu-system-gui qemu-kvm qemu-utils - -The next command sets up a private network with a software bridge -with several tap devices that belong to the user . - -fai-mk-network - -After that, you can use fai-kvm (-h will give you some help) for -starting virtual machines using KVM that are connected to this -private network. Be careful. By default, fai-kvm will create the disk -images for the virtual machines in /tmp, which is a RAM disk on most -systems. It’s no problem to create an empty 20G disk image in /tmp -(even if this partition is of 4GB size), but while the VM is writing -data to its disk, this will start to consume space in /tmp. - -Start the first virtual host, which will become the FAI server ^[4]: - -fai-kvm -Vn -s20 -u 1 cd faicd64-small.iso - -In the grub menu select faiserver, using internal DHCP and a fixed -IP. This will install a host called faiserver with IP 192.168.33.250 -which contains all software needed for a FAI server. It will also set -up a local package cache (using apt-cacher-ng). Once the installation -is finished, reboot the machine. During the first boot of the new -system, it will automatically set up the nfsroot. This may take some -minutes. - -After that you can start additional hosts using network boot. For -every new host, you have to use a different value for -u, which will -be used for generating different MAC addresses and using different -disk image file names. - -fai-kvm -Vn -u 2 pxe - -Those install clients will show you a menu, where you can select -which type of installation you like to perform. If the install client -does not find the server, it is usually because fai-monitor is no -longer running on it. This can happen, if you reboot the faiserver -after the installation. To remedy this, simply run fai-monitor on the -faiserver and re-attempt the client boot. - -Another client could be started with: - -fai-kvm -Vn -u 3 pxe - -You can start as many machines in the network as tap devices are -available. All these machines can connect to the outside internet but -are only reachable from your host machine. - - ---------------------------------------------------------------------- - -3. Overview and Concepts - ---------------------------------------------------------------------- - -FAI is a non-interactive system to install, customize and manage -Linux systems and software configurations on computers as well as -virtual machines and chroot environments, from small networks to -large infrastructures and clusters. You can take one or more virgin -PCs, turn on the power and after a few minutes Linux is installed, -configured and running on the whole cluster, without any interaction -necessary. Thus, it’s a scalable method for installing and updating a -cluster unattended with little effort involved. FAI uses the Linux -operating system and a collection of shell and Perl scripts for the -installation process. Changes to the configuration files of the -operating system can be made by CFEngine, shell (bash and zsh), Perl, -Python, Ruby and expect scripts. - -FAI’s target group are system administrators who have to install -Linux onto one or even hundreds of computers. Because it’s a general -purpose installation tool, it can be used for installing a Beowulf -cluster, a rendering farm or a Linux laboratory or a classroom. Also -large-scale Linux networks with different hardware or different -installation requirements are easy to establish using FAI. But don’t -forget to plan your installation. Chapter [plan] has some useful -hints for this topic. - - -3.1.  Important Terms - --------------- - -First, some terms used in this manual are described. - -install server - It provides DHCP, TFTP and NFS services and the configuration - data for all install clients. In the examples of this manual this - host is called faiserver. The host where the package fai-server - is installed. -install client - A host which will be installed using FAI and a configuration - provided by the install server. Also called client for short. In - this manual, the example hosts are called demohost, xfcehost, - gnomehost … This computer should boot from its network interface - using PXE. -configuration space - - A subdirectory structure containg several files. Those files - describe the details of how the installation of the clients will - be performed. All configuration data is stored here. It’s also - called config space for short. It includes information about: - - o Hard disk layout in a format similar to fstab - o Local file systems, their types, mount points and mount - options - o Software packages - o Keyboard layout, time zone, Xorg configuration, remote file - systems, user accounts, printers … - - The package fai-doc includes a sample configuration space - including examples for hosts using the XFCE and GNOME environment - amongst other examples. Calling fai-mk-configspace copies these - examples to /srv/fai/config. It’s recommended to study those - config files and scripts for easier understanding how FAI works. - -nfsroot, NFS-Root - A file system located on the install server. During the - installation process it’s the complete file system for the - install clients. All clients share the same nfsroot, which they - mount read only. The nfsroot needs about 1.1GB of free disk - space. -TFTP - Serves clients the initrd and kernel that is used for the - installation process. Along with the file system served by NFS, - these two make up a temporary OS in which the installations are - performed. -FAI classes - Classes are names which determine which configuration file is - selected. If a client belongs to class WEBSERVER, it will be - configured as a webserver, the class DESKTOP for e.g. determines - which software packages will be installed. -profile - A FAI profile is just a list of FAI classes assiged to a profile - name, which is extended by a description of this profile. I.e. - one could have two "Webserver" profiles, one including the APACHE - class another including the NGINX class, to then install the - respective webserver solution. -tasks - The installation of a client consists of several parts, which are - called tasks. Tasks are predefined subroutines which perform a - certain part of the FAI. The following FAI tasks are performed - during an installation on the install clients. - - confdir # get the config space - setup # some initialization, start sshd on demand - defclass # define FAI classes - defvar # define variables - action # evaluate FAI_ACTION - install # Start the installation - partition # partition the harddisks, create file systems - mountdisks # mount the file systems - extrbase # extract the base.tar.xz - debconf # do the Debian debconf preseeding - repository # prepare access to the package repository - updatebase # Set up package tools and update packages - instsoft # install software packages - configure # call customization scripts - finish # do some cleanup, show installation statistics - tests # call tests if defined - chboot # call fai-chboot on the install server - savelog # save log files to local and remote location - faiend # reboot host, eject CD if needed - - These are tasks, which are only executed when a different action - is performed - - dirinstall # install a chroot environment - softupdate # only do the system configuration - sysinfo # print detailed system information - inventory # print short hardware inventory list - -For a more in-depth description of tasks , see [tasks]. - -Note that you are not limited to the FAI tasks. You can also define -additional programs or scripts which will be run on particular -occasions. They are called hooks. - -hooks - Hooks are plugins, they can add additional functionality to the - installation process or even replace entire tasks of FAI. Hooks - are explained in detail in [hooks]. - - -3.2. The class concept - --------------- - -Classes are used in nearly all tasks of the installation. Classes -determine which configuration files to choose from a list of -available alternatives. To determine which config files to use, FAI -searches the list of defined classes and uses all configuration files -that match a class name ^[5]. The following loop implements this -function in pseudo shell code: - -for class in $all_classes; do - if [ -r $config_dir/$class ]; then # if a file with name $class exists - your_command $config_dir/$class # call a command with this file name - # exit if only the first matching file is needed - fi -done - -The very nice feature of this is that you can add a new configuration -alternative and it will automatically be used by FAI without changing -the code, if the configuration file uses a class name. - -This is because the loop automatically detects new configuration -files that should be used. The idea of using classes in general and -using certain files matching a class name for a configuration is -adopted from the installation scripts by Casper Dik for Solaris. This -technique proved to be very useful and easy. - -You can group multiple hosts that share the same configuration files -by using the same class. You can also split the whole configuration -data for all clients into several classes and use them like lego -bricks and build the entire configuration for a single client by -assembling the bricks together. - -If a client belongs to class A, we say the class A is defined for -this client. A class has no value, it is just defined or undefined. - -Classes determine how the installation is performed. For example, an -install client can be configured to get the XFCE desktop by just -adding the class XFCE to it. Naturally, also more granular -configurations are possible. For instance, classes can describe how -the hard disk should be partitioned, they can define which software -packages will be installed, or which customization steps are -performed. - -Often, a client configuration is created by only changing or -appending the classes to which this client belongs, making the -installation of a new client very easy. Thus no additional -information needs to be added to the configuration space if the -existing classes suffice for your needs. - -As you can see, classes are a central pillar of customizing your -configuration space and with that your client installation. On how to -define your own classes, refer to [defining classes]. - - ---------------------------------------------------------------------- - -4. Setup your faiserver - ---------------------------------------------------------------------- - -Here’s how to set up the install server in a few minutes. Following -steps are needed: - - 1. Set up the install server - - a. Install FAI packages - b. Create the nfsroot - c. Copy the examples to the config space - d. Configure network daemons - e. Create the PXELINUX configurations - 2. Boot and install clients - - -4.1. Install the FAI packages - --------------- - - * Install the key of the FAI project package repository. - * Add the URL of the package repository of the FAI project. - * Install the package fai-quickstart on your install server. - -Use these commands for installing: - -# wget -O /etc/apt/trusted.gpg.d/fai-project.gpg https://fai-project.org/download/2BF8D9FE074BCDE4.gpg -# echo "deb http://fai-project.org/download bookworm koeln" > /etc/apt/sources.list.d/fai.list - -or - -# apt install extrepo ; extrepo enable fai - -and then - -# apt-get update -# aptitude install fai-quickstart - -This will also install the packages for DHCP, TFTP and NFS server -daemons. - - -4.2. Create the nfsroot - --------------- - - * Also enable the package repository of the FAI project in a - different sources.list file which is used when building the - nfsroot. Then, enable the log user for FAI. - -# sed -i -e 's/^#deb/deb/' /etc/fai/apt/sources.list -# sed -i -e 's/#LOGUSER/LOGUSER/' /etc/fai/fai.conf - - * By default, FAI uses http://deb.debian.org as package mirror, - which should attempt to find a fast package repository for you. ^ - [6] Now, we can run fai-setup(8) ^[7] and check if everything - went well. The log file is written to /var/log/fai/fai-setup.log. - -# fai-setup -v - - * These are some of the lines you will see at the end of fai-setup. - A complete example of fai-setup.log is available on the FAI web - page at https://fai-project.org/logs/fai-setup.log. - -FAI packages and related packages inside the nfsroot: -dracut 059-4 -dracut-live 059-4 -dracut-network 059-4 -dracut-squash 059-4 -fai-client 6.2 -fai-nfsroot 6.2 -fai-setup-storage 6.2 -Waiting for background jobs to finish -fai-make-nfsroot finished properly. -Log file written to /var/log/fai/fai-make-nfsroot.log -Adding line to /etc/exports: /srv/fai/config 192.168.33.250/24(async,ro,no_subtree_check) -Adding line to /etc/exports: /srv/fai/nfsroot 192.168.33.250/24(async,ro,no_subtree_check,no_root_squash) -Reloading nfs-kernel-server configuration (via systemctl): nfs-kernel-server.service. - -Your initial config space is now located in /srv/fai/config -Please don't forget to fill out the FAI questionnaire after you've finished your project with FAI. - -FAI setup finished. -Log file written to /var/log/fai/fai-setup.log - - * fai-setup has created the LOGUSER, the nfsroot and has added - additional lines to /etc/exports. The subdirectories added to / - etc/exports are exported via NFS v3, so all install clients in - the same subnet can mount them via NFS. - - -4.3. Creating the configuration space - --------------- - -Install the simple examples into the configuration space ^[8]. - -$ fai-mk-configspace - -These examples contain configuration for some sample hosts. Depending -on the host name used, your computer will be configured as follows: - -demohost - A machine which needs only a small hard disk. This machine is - configured with network as DHCP client, and an account demo is - created. -xfcehost - A XFCE desktop is installed, using LVM, and the account demo is - created. -gnomehost - A GNOME desktop is installed, and the account demo is created. -ubuntuhost - A Ubuntu desktop will be installed, and the account demo is - created. -other host names - Hosts with another host name will most notably use the classes - FAIBASE, DHCPC and GRUB. - -All hosts will have an account called demo with password fai. The -root account also has the password fai. - -If the FAI flag menu is added, instead of using the host name for -determing the type of installation, a menu is presented, and the user -can choose a profile for the installation. - - -4.4. Configure the network daemons - --------------- - -For booting the install client via PXE, the install server needs a -DHCP and a TFTP daemon running. The package fai-quickstart has -already installed the software packages for those daemons. -Additionally the package of the NFS server for exporting the nfsroot -and the config space was installed. - -4.4.1. Configuration of the DHCP daemon - -Ideally, your faiserver should also be your DHCP server. If that is -not the case, instruct the admin responsible of the DHCP server to -configure it according to this section. Optionally, it is possible to -avoid that by using the [autodiscover] feature released in FAI 5.0. - -An example for dhcpd.conf(5) is provided with the fai-doc package. -Start using this example and look at all options used therein. - -# cp /usr/share/doc/fai-doc/examples/etc/dhcpd.conf /etc/dhcp/ - -The only FAI specific information inside this configuration file is -to set filename (DHCP option 67) to fai/pxelinux.0 and to set -next-server (DHCP option 66, also called TFTP server name) and -server-name to the name of your install server. All other information -is only network related data, which is used in almost all DHCP -configurations. Adjust these network parameters to your local needs. - -deny unknown-clients; -option dhcp-max-message-size 2048; -use-host-decl-names on; - -subnet 192.168.33.0 netmask 255.255.255.0 { - option routers 192.168.33.250; - option domain-name "my.example"; - option domain-name-servers 192.168.33.250; - option time-servers faiserver; - option ntp-servers faiserver; - server-name faiserver; - next-server faiserver; - filename "fai/pxelinux.0"; -} - -If you make any changes to the DHCP configuration, you must restart -the daemon. - -# invoke-rc.d isc-dhcp-server restart - -If you have multiple network interfaces, you can define on which -interface the server will listen in /etc/default/isc-dhcp-server. By -default, the DHCP daemon writes its log messages to /var/log/ -daemon.log. - -4.4.2. Adding a host entry to DHCP - -The MAC address is given by the hardware of the network card. For -each install client you collect its MAC address and to map it to an -IP address and to a host name. First, we add the IP address and the -hostname to /etc/hosts ^[9]. - -192.168.33.100 demohost - -The mapping from the MAC address to the IP address is done in the -dhcpd.conf file. Here, we add a host entry using the command -dhcp-edit(8). Here you have to replace 01:02:03:AB:CD:EF ith the MAC -you have found. - -# dhcp-edit demohost 01:02:03:AB:CD:EF - -After calling this command, this is what the host entry in dhcpd.conf -will look like: - -host demohost {hardware ethernet 01:02:03:AB:CD:EF;fixed-address demohost;} - -4.4.3. TFTP - -Normally, you do not need any changes to the TFTP dameon -configuration. The files which are provided by TFTP are located in / -srv/tftp/fai. - -4.4.4. NFS - -The command fai-setup has already set up the NFS daemon and added -some lines to the configuration file /etc/exports. It exports the -directories using NFS v3. - - -4.5. Creating the PXELINUX configuration - --------------- - -The last step before booting your client for the first time is to -specify what configuration the client should boot when doing PXE -boot. We use the command fai-chboot(8) to create a pxelinux -configuration for each install client. This includes information -about the kernel, the initrd, the config space and some boot -parameters. You should read the manual page, which gives you some -good examples. Here’s the command for starting the installation for -the host demohost. - -$ fai-chboot -IFv -u nfs://faiserver/srv/fai/config demohost - -Booting kernel vmlinuz-4.19.0-5-amd64 - append initrd=initrd.img-4.19.0-5-amd64 ip=dhcp - FAI_FLAGS=verbose,sshd,createvt FAI_CONFIG_SRC=nfs://faiserver/srv/fai/config - -demohost has 192.168.33.100 in hex C0A82164 -Writing file /srv/tftp/fai/pxelinux.cfg/C0A82164 for demohost - -At this point, you should have a working faiserver setup and your -clients should boot into FAI and be able to install one of the -examples. - -In the following section, you can read about planning your -installation, tailoring your configuration space to your particular -needs and extending FAI using hooks. - - -4.6. Custom server - --------------- - -The faiserver and its setup is by no means static. It is possible to -customize and extend your server. For this, please refer to the -[Customizing your install server setup] section in [advanced]. - - ---------------------------------------------------------------------- - -5. Plan your installation - ---------------------------------------------------------------------- - -Before starting your installation, you should invest a lot of time -into planning your installation. Once you’re happy with your -installation concept, FAI can do all the boring and repetitive tasks -to turn your plans into reality. FAI can’t do good installations if -your concept is imperfect or lacks some important details. Start -planning the installation by answering the following questions: - - * Will I create a Beowulf cluster, or do I have to install some - desktop machines? - * What does my LAN topology look like? - * Do I have uniform hardware? Will the hardware stay uniform in the - future? - * Does the hardware need a special kernel? - * How should the hosts be named? - * How should the local hard disks be partitioned? - * Which applications will be run by the users? - * Do the users need a queuing system? - * What software should be installed? - * Which daemons should be started, and what should the - configuration for these look like? - * Which remote file systems should be mounted? - * How should backups be performed? - -You also have to think about user accounts, printers, a mail system, -cron jobs, graphic cards, dual boot, NIS, NTP, timezone, keyboard -layout, exporting and mounting directories via NFS and many other -things. So, there’s a lot to do before starting an installation. And -remember that knowledge is power, and it’s up to you to use it. -Installation and administration is a process, not a product. FAI -can’t do things you don’t tell it to do. - -You don’t need to start from scratch. Look at the files and scripts -in the configuration space. There are a lot of things you can use for -your own installation. A good paper called "Bootstrapping an -Infrastructure" with more aspects of building an infrastructure is -available at http://www.infrastructures.org/papers/bootstrap/ -bootstrap.html - - -5.1. The configuration space and its subdirectories - --------------- - -The configuration space is the collection of information about how -exactly to install a client. The central configuration space for all -install clients is located on the install server in /srv/fai/config -and its subdirectories. This will be mounted by the install clients -to /var/lib/fai/config. The main installation command fai(8) uses all -these subdirectories in the order listed except for hooks. - -class/ - Scripts and files to define classes and variables. -disk_config/ - Configuration files for disk partitioning, software RAID, LVM and - file system creation. -basefiles/ - - Normally the file base.tar.xz (located inside the nfsroot) is - extracted on the install client after the new file systems are - created and before package are installed. This is a minimal base - image, created right after calling debootstrap during the - creation of the nfsroot on the install server. If you want to - install another distribution than the nfsroot is, you can put a - tar file into the subdirectory basefiles/ and name it after a - class. Then the command ftar(8) is used to extract the tar file - based on the classes defined. Thus the file has to be named - CLASS.tar.xz not CLASS.base.tar.xz. This is done in task extrbase - . Use this if you want to install another distribution or version - than that running during the installation. - - This basefile can also be received based on FAI classes via HTTP/ - HTTPS or FTP by defining the variable FAI_BASEFILEURL. FAI will - download a file CLASSNAME.tar.xz (or tgz, or tar.gz,…) from this - URL, if CLASSNAME matches a FAI class. - - Example: - -FAI_BASEFILEURL=https://fai-project.org/download/basefiles/ - -The folder must support directory listing. FAI will not probe for -potentially matching files. - -See chapter [otherdists] for how to install different distributions. - -debconf/ - This directory holds all debconf(7) data. The format is the same - that is used by debconf-set-selections(1). -package_config/ - Files with class names contain lists of software packages to be - installed or removed by install_packages(8). Files named - .gpg are added to the list of keys used by apt for trusted - package repositories. -pkgs/ - This directory can contain subdirectories named by classes. You - can put .deb or .rpm files into these subdirectories. FAI will - then install these packages without the need of creating the - metadata of a package repository. -scripts/ - Scripts for your local site customization. Used by fai-do-scripts - (1). -files/ - Files used by customization scripts. Most files are located in a - subtree structure which reflects the ordinary directory tree. For - example, the templates for nsswitch.conf are located in $FAI/ - files/etc/nsswitch.conf and are named according to the classes - that they should match: $FAI/files/etc/nsswitch.conf/NIS is the - version of /etc/nsswitch.conf to use for the NIS class. Note that - the contents of the files directory are not automatically copied - to the target machine, rather they must be explicitly copied by - customization scripts using the fcopy(8) command. -hooks/ - Hooks are user defined programs or scripts, which are called - during the installation process. They can extend or replace the - default tasks. The file name must be of format taskname.CLASSNAME - [.sh]. A hook called updatebase.DEBIAN is executed prior to the - task updatebase and only if the install client belongs to the - class DEBIAN. - - -5.2. Defining classes - --------------- - -There are different possibilities to define classes: - - 1. Some default classes are defined for every host: DEFAULT, LAST - and its host name. - 2. Classes may be listed within a file (by default in class/ - ) - 3. Classes may be dynamically defined by scripts. - -The last option is a very nice feature, since these scripts will -define classes in a very flexible way. For example, several classes -may be defined only if certain hardware is identified or a class is -defined depending on the network subnet information. - -All names of classes, except the host name, are written in uppercase. -They must not contain a hyphen, a hash, a semicolon or a dot, but may -contain underscores and digits. - -The task defclass calls the command fai-class(1) to define classes. -All scripts matching ^[0-9][0-9]* (they start with two digits) in the -subdirectory $FAI/class are executed for defining classes. Everything -that is printed to STDOUT is automatically defined as a class. For -more information on defining class, read the manual pages for -fai-class(1). The script 50-host-classes (see below a stripped -version) is used to define classes depending on the host name. - -# use a list of classes for our demo machines -case $HOSTNAME in - demohost) - echo "FAIBASE GRUB DEMO" ;; - xfcehost) - echo "FAIBASE GRUB DEMO XORG XFCE LVM";; - faiserver) - echo "FAIBASE DEBIAN DEMO FAISERVER" ;; - ubuntuhost) - echo "FAIBASE DEBIAN DEMO UBUNTU JAMMY JAMMY64 XORG";; - *) - echo "FAIBASE DEBIAN DEMO" ;; -esac - -Host names should rarely be used for the configuration files in the -configuration space. Instead, a class should be defined and then -added for a given host. This is because most of the time the -configuration data is not specific for one host, but can be shared -among several hosts. - -The order of the classes is important because it defines the priority -of the classes from low to high. - - -5.3. Defining variables - --------------- - -The task defvar defines the variables for the install client. -Variables are defined by scripts in class/*.var. All global variables -can be set in DEFAULT.var. For groups of hosts use a class file. For -a single host use the file $HOSTNAME .var. Also here, it’s useful to -study all the examples. - -The following variables are used in the examples and may also be -useful for your installation: - -FAI_ACTION - Set the action FAI should perform. Normally this is done by - fai-chboot(8). If you can’t use this command, define this - variable i.e. in the script LAST.var. -FAI_ALLOW_UNSIGNED - If set to 1, FAI allows the installation of packages from - unsigned repositories. -CONSOLEFONT - Is the font which is loaded during installation by setfont(8). -KEYMAP - Defines the keyboard map files in /usr/share/keymaps and $FAI/ - files. You don’t need to specify the full path, since this file - will be located automatically. -ROOTPW - The encrypted root password for the new system. You can use crypt - (3), md5 and other hash types for the password. Use mkpasswd(1) - for creating the hash for a certain password. For example, to - generate a md5 hash for the password use - -$ echo "yoursecrectpassword" | mkpasswd -m yescrypt -s - -UTC - Set hardware clock to UTC if UTC=yes. Otherwise set clock to - local time. See clock(8) for more information. -TIMEZONE - Is the file relative to /usr/share/zoneinfo/ which indicates your - time zone. E.g.: TIMEZONE=Europe/Berlin. -MODULESLIST - A list of kernel modules which are loaded during boot of the new - system (written to /etc/modules). - - -5.4. Hard disk configuration - --------------- - -The tool setup-storage(8) reads a file in $FAI/disk_config for the -disk configuration. This file describes how all the local disks will -be partitioned, which file system types should be created (like ext3/ -4, xfs, btrfs), and where they are mounted to. You can also create -software RAID and LVM setups using this config file. It’s also -possible to preserve the disk layout or to preserve the data on -certain partitions. - -During the installation process all local file systems are mounted -relative to /target. For example if you specify the mount point /home -in a disk configuration file this will be the directory /target/home -during the installation process and will become /home for the new -installed system. - - -5.5. Extract base file - --------------- - -A base file is only needed when installing a distribution which is -different from the one in the nfsroot. - - -5.6. Debconf preseeding - --------------- - -You can use the format described in debconf-set-selections(1). - - -5.7. Access to the package repository - --------------- - -FAI supports http, https and NFS for accessing the package mirror. -Set the variable $FAI_DEBMIRROR for using NFS. - - -5.8. Software package configuration - --------------- - -Before installing packages, FAI will add the content of all files -named package_config/class.gpg to the list of apt keys. If your local -repository is signed by your keyid AB12CD34 you can easily add this -key, so FAI will use it during installation. Use this command for -creating the CLASS.gpg file: - -faiserver$ gpg --export AB12CD34 > /srv/fai/config/package_config/MYCLASS.gpg - -The script install_packages(8) installs the selected software -packages. It reads all configuration files in $FAI/package_config -whose file name matches a defined class. The syntax is very simple. - -# an example package class - -PACKAGES taskinst -german - -PACKAGES install-norec -adduser nmap -less zstd - -PACKAGES remove -gpm xdm - -PACKAGES install GRUB_PC -grub-pc - -Comments are starting with a hash (#) and are ending at the end of -the line. Every package command begins with the word PACKAGES -followed by a command name, which maps to a different package tool -like apt-get, aptitude or dnf for e.g. The command defines which -command will be used to install the packages named after this -command. The list of all available commands can be listed using -install_packages -H. Supported package tools are: apt, apt-get, -aptitude, smart, yast, dnf, rpm, zypper - -hold - Put a package on hold. This package will not be handled by dpkg, - e.g not upgraded. -install - Install all packages (using apt-get) that are specified in the - following lines. If a hyphen is appended to the package name - (with no intervening space), the package will be removed, not - installed. All package names are checked for misspellings. Any - package which does not exist, will be removed from the list of - packages to install. So be careful not to misspell any package - names. -install-norec - Like install but without installing the recommended packages. -remove - Remove all packages that are specified in the following lines. - Append a + to the package name if the package should be - installed. -taskinst - Install all packages belonging to the tasks that are specified in - the following lines using tasksel(1). You can also use aptitude - for installing tasks. -aptitude - Install all packages with the command aptitude. This will be the - default in the future and may replace apt-get and taskinst. - Aptitude can also install task packages. -aptitude-r - Same as aptitude with option --with-recommends. -unpack - Download package and unpack only. Do not configure the package. -dselect-upgrade - Set package selections using the following lines and install or - remove the packages specified. These lines are the output of the - command dpkg --get-selections. It’s not recommended to use this - format, since you are also specifying all packages which are only - installed because of a dependency or a recommends. It’s better - just to specify the pacakge you like to have, and to let FAI (and - apt-get) resolve the dependencies. - -Multiple lines with lists of space separated names of packages follow -the PACKAGES lines. All dependencies are resolved. Packages with -suffix - (eg. lilo-) will be removed instead of installed. The order -of the packages doesn’t matter. If you like to install packages from -another release than the default, you can append the release name to -the package name like in openoffice.org/etch-backports. You can also -specify a certain version like apt=0.3.1. More information on these -features are described in aptitude(8). - -You can specify additional parameters for the package manager adding -key=value after PACKAGES . Currently we support release= - which will add -t when installing packages. - -Example: - -PACKAGES install-norec release=testing -nvidia-smi - -This will install the nvidia-smi package from the testing release, -including the dependencies. Don’t forget to add an entry into -sources.list. You may also want to adjust the apt pinning (see -apt_references(5)). - -A line which contains the PRELOADRM commands, downloads a file using -wget(1) into a directory before installing the packages. Using the -file: URL, this file is copied from $FAI_ROOT to the download -directory. For example the package realplayer needs an archive to -install the software, so this archive is downloaded to the directory -/root. After installing the packages this file will be removed. If -the file shouldn’t be removed, use the command PRELOAD instead. - -You can add an arbitrary boolean expression using FAI classes to -define when the list of packages should be installed. Here, the -packages are only installed if the class XORG is defined but the -class MINT is not defined. - -Example: - -PACKAGES install UBUNTU && XORG && ! MINT -ubuntu-standard -ubuntu-desktop - -The old way of adding some logic in the PACKAGES lines is still -supported: It’s possible to append a list of class names after the -command for apt-get. So this PACKAGES command will only be executed -when at least one of the corresponding classes is defined (logical -OR). So you can combine many small files into the file DEFAULT. - -If you want to remove a package name from a certain class was part of -this class before, you should not remove the package name from the -class file, but instead append a dash (-) to it. This will make sure -that the package is removed during a softupdate on hosts which were -installed using the old class definition which included this package -name. - -If you specify a package that does not exist this package will be -removed automatically from the installation list only if the command -install is used. - -The concept of classes priority allows a higher priority class (one -that comes later in the sequence of classes) to override the -selection of packages of a lower priority class. For this to work -correctly, the higher priority class must use the same PACKAGES -command (e.g. PACKAGES install-norec instead of just PACKAGES install -) as the one used by the class it is trying to override. This is -useful to suppress installation of a package, for example, to avoid -installing the linuxlogo package installed by class FAIBASE: - -# example of how to override: -# -# On FAIBASE we have: -# PACKAGES install-norec -# linuxlogo -# -# We want to _not_ install linuxlogo, and it is in a -# install-norec section, so we must also use install-norec. - -PACKAGES install-norec -linuxlogo- - - -5.9.  Customization scripts - --------------- - -The command fai-do-scripts(1) is called to execute all scripts in -this directory. If a directory with a class name exists, all scripts -matching ^[0-9][0-9]* are executed in alphabetical order. So it’s -possible to use scripts of different languages (shell, cfengine, -Perl, Python, Ruby, expect,..) for one class. - -Thoses scripts write their output to sripts.log. The file status.log -contains the names of all scripts executed and their exit status. - -5.9.1. Shell scripts - -Most scripts are Bourne shell scripts. Shell scripts are useful if -the configuration task only needs to call some shell commands or -create a file from scratch. In order not to write many short scripts, -it’s possible to use the ifclass command for testing if certain -classes are defined. - -ifclass -o A B C - -checks if one of classes A, B or C are defined. Using -a (logical -AND) checks if all classes of a list are defined. The command ifclass -C checks if only class C is defined. - -For copying files with classes, use the command fcopy(8). If you want -to extract an archive using classes, use ftar(8). For appending lines -to a configuration file use ainsl(1) instead of just echo string >> -filename. - -FAI also supports zsh(1) scripts during the customization task. -Within scripts, the variable $classes holds a space separated list -with the names of all defined classes. - -5.9.2. Cfengine scripts - -CFEngine has a rich set of functions to edit existing configuration -files, e.g LocateLineMatching, ReplaceAll, InsertLine, -AppendIfNoSuchLine, HashCommentLinesContaining. But it can’t handle -variables which are undefined. If a variable is undefined, the whole -cfengine script will abort. - -More information can be found in the manual page cfengine(8) or at -the cfengine homepage https://www.cfengine.com. - - -5.10. Hooks - --------------- - -Hooks let you specify functions or programs which are run at certain -steps of the installation process. Before a task is called, FAI -searches for existing hooks for this task and executes them. As you -might expect, classes are also used when calling hooks. Hooks are -executed for every defined class. You only have to create the hook -with the name for the desired class and it will be used. If several -hooks for a task exists, they are called in the order defined by the -classes. If debug is included in $FAI_FLAG the option -d is passed to -all hooks, so you can debug your own hooks. If some default tasks -should be skipped, use the subroutine skiptask and a list of default -tasks as parameters. In the examples provided, the hooks of the class -CENTOS skips some Debian specific tasks. - -The directory $FAI/hooks/ contains all hooks. A hook is an executable -file following the naming scheme taskname.CLASSNAME[.sh] (e.g. -repository.CENTOS or 'savelog.LAST.sh). The task name specifies which -task to precede executing this hook, if the specified class is -defined for the installing client. See section [tasks] for a complete -list of default tasks that can be used. - -A hook of the form hookprefix.classname can’t define variables for -the installation script, because it’s a subprocess. But you can use -any binary executable or any script you wrote. Hooks that have the -suffix .sh (e.g. partition.DEFAULT.sh) must be Bourne shell scripts -and are sourced. So it’s possible to redefine variables for the -installation scripts. - -In the first part of FAI, all hooks with prefix confdir are called. -Those hooks can not be located in the config space, since it’s not -yet available. Therefore these hooks are the only hooks located in -$nfsroot/$FAI/hooks on the install server. All other hooks are found -in $FAI_CONFIGDIR/hooks on the install server. - -All hooks that are called before classes are defined can only use the -following classes: DEFAULT $HOSTNAME LAST. If a hook for class -DEFAULT should only be called if no hook for class $HOSTNAME is -available, insert these lines to the default hook: - -hookexample.DEFAULT: - -#! /bin/sh - -# skip DEFAULT hook if a hook for $HOSTNAME exists -scriptname=$(basename $0 .DEFAULT) -[-f $FAI/hooks/$scriptname.$HOSTNAME ] && exit -# here follows the actions for class DEFAULT -. -. - -Some examples for what hooks could be used: - - * Load kernel modules before classes are defined in $FAI/class. - * Send an email to the administrator if the installation is - finished. - * Install a diskless client and skip local disk partitioning. - * Have a look at hooks/debconf.IMAGE for how to clone a machine - using a file system image. - - -5.11. FAI flags - --------------- - -The variable $FAI_FLAGS contains a space separated list of flags. -Flags are normally defined in the pxelinux.cfg file which should be -created by fai-chboot(1). The following flags are known: - -verbose - Create verbose output during installation. This should always be - the first flag, so consecutive definitions of flags will be - verbosely displayed. -debug - Create debug output. No unattended installation is performed. - During package installation you have to answer all questions of - the postinstall scripts on the client’s console. A lot of debug - information will be printed out. This flag is only useful for FAI - developers. -sshd - Start the ssh daemon to enable remote logins. You can then log in - as root to all install clients during the installation. The - default password is fai and can be changed by setting FAI_ROOTPW - in nfsroot.conf(5). To log in from your server to the install - client (named demohost in this example) use: - -$ ssh root@demohost -Warning: Permanently added 'demohost,192.168.33.100' to the list of known hosts. -root@demohost's password: - -This is only the root password during the installation process, not -for the new installed system. You can also log in without a password -when using $SSH_IDENTITY. - -createvt - Create two virtual terminals and execute a bash if ctrl-c is - typed in the console terminal. The additional terminals can be - accessed by typing Alt-F2 or Alt-F3. Otherwise, no terminals are - available and typing ctrl-c will reboot the install client. - Setting this flag is useful for debugging. If you want an - installation which should not be interruptible, do not set this - flag. -menu - This enables a user menu for selecting a profile. All files class - /*.profile are read and a curses based menu will be created. -screen - Run FAI inside a screen(1) session. The session is called FAI. If - you log in via ssh from remote you can attach to the session - using: - -$ screen -x - -tmux - Run FAI inside a tmux(1) session. The session is called FAI. If - you log in via ssh from remote you can attach to the session - using: - -$ tmux attach - -reboot - Reboot the install client after installation is finished without - typing RETURN on the console. If this flag is not set, and - error.log contains anything, the install client will stop and - wait that you press RETURN. If no errors occurred, the client - will always reboot automatically. -halt - Halt the install client at the end of the installation, instead - of rebooting into the new system. -initial - Used by setup-storage(8). Partitions marked with - preserve_reinstall are preserved unless this flag is set. Often, - this flag is set in a file class/*.var by using setting - flag_initial=1. - - ---------------------------------------------------------------------- - -6.  FAI installs your plan - ---------------------------------------------------------------------- - - -6.1. The early part of an installation - --------------- - -After the kernel has booted, it mounts the root file system via NFS -from the install server and starts the script /usr/sbin/fai ^[10]. -This script controls the sequence of the installation. No other -scripts in /etc/init.d/ are used. - -The configuration space is made available via the configured method -(an NFS mount by default) from the install server to the path defined -in $FAI ^[11] - - -6.2. Boot messages - --------------- - -When booting the install client from network card with PXE you will -see some messages like this: - -Managed PC Boot Agent (MBA) v4.00 -Pre-boot eXecution Environment (PXE) v2.00 -DHCP MAC ADDR: 00 A2 A3 04 05 06 -DHCP.../ - -CLIENT MAC ADDR: 00 A2 A3 04 05 06 GUID: 3D6C4552 -CLIENT IP: 192.168.33.100 MASK: 255.255.255.0 DHCP IP: 192.168.33.250 -GATEWAY IP: 192.168.33.1 - -!PXE entry point found (we hope) at 9854:0106 via plan A -UNDI code segment at: 9854 len 5260 -UNDI data segment at: 921D len 63A2 -Getting cached packet 01 02 03 -My Ip address seems to be C0A82164 192.168.33.100 -ip=192.168.33.100:192.168.33.250:192.168.33.1:255.255.255.0 -BOOTIF=01-00-A2-A3-04-05-06 -SYSUUID= -TFTP prefix: fai/ -Trying to load pxelinux.cfg/C0A82164 - -Loading vmlinuz-6.1.0-17-amd64.................. -Loading initrd.img-6.1.0-17-amd64......................ready. - -At this point the install client has successfully received the -network config via DHCP and the kernel and initrd via TFTP. It now -boots the Linux kernel and the initrd. If everything went right, the -initrd mounts the nfsroot ^[12] and the FAI scripts are started. The -first thing you see is the red FAI copyright message. - - ------------------------------------------------- - Fully Automatic Installation - FAI - - 6.2 (c) 1999-2024 - Thomas Lange - ------------------------------------------------- - -Calling task_confdir -Kernel currently running: Linux 6.1.0-17-amd64 x86_64 GNU/Linux -Kernel parameters: BOOT_IMAGE=vmlinuz-6.1.0-17-amd64 initrd=initrd.img-6.1.0-17-amd64 \ - ip=dhcp rw root=192.168.33.250:/srv/fai/nfsroot rootovl FAI_FLAGS=verbose,sshd,createvt - FAI_ACTION=install FAI_CONFIG_SRC=nfs://faiserver/srv/fai/config -Reading /tmp/fai/boot.log -FAI_FLAGS: verbose sshd createvt -Monitoring to server faiserver enabled. -FAI_CONFIG_SRC is set to nfs://faiserver/srv/fai/config -Configuration space faiserver:/srv/fai/config mounted to /var/lib/fai/config -Source hook: setup.DEFAULT.sh -setup.DEFAULT.sh OK. -Calling task_setup -FAI_FLAGS: verbose sshd createvt -Press ctrl-c to interrupt FAI and to get a shell -Starting FAI execution - 20240117_194012 -Calling task_defclass -fai-class: Defining classes. -Executing /var/lib/fai/config/class/01-classes. -01-classes OK. -Executing /var/lib/fai/config/class/10-base-classes. -10-base-classes OK. -Executing /var/lib/fai/config/class/20-hwdetect.sh. -ens3 UP 52:54:00:11:23:01 -ens3 UP 192.168.33.101/24 fe80::5054:ff:fe11:2301/64 -New disklist: vda -20-hwdetect.sh OK. -Executing /var/lib/fai/config/class/40-parse-profiles.sh. -40-parse-profiles.sh OK. -Executing /var/lib/fai/config/class/41-warning.sh. -41-warning.sh OK. -Executing /var/lib/fai/config/class/50-host-classes. -50-host-classes OK. -Executing /var/lib/fai/config/class/60-misc. -60-misc OK. -Executing /var/lib/fai/config/class/85-efi-classes. -85-efi-classes OK. -List of all classes: DEFAULT LINUX AMD64 DHCPC FAIBASE DEBIAN DEMO GRUB_PC demohost2 LAST - -You can also see the list of FAI classes, that are defined for this -host. This list is very important for the rest of the installation. - -The first task is called confdir, which is responsible for getting -access to the config space. Here, we use an NFS mount from the -install server as you can see on the console (and later in the logs). - -FAI_CONFIG_SRC is set to nfs://faiserver/srv/fai/config -Configuration space faiserver:/srv/fai/config mounted to /var/lib/fai/config - -Before the installation is started ($FAI_ACTION=install) the computer -beeps three times. So, be careful when you hear three beeps but you -do not want to perform an installation and let FAI erase all yout -data on the local disk! - - -6.3. Rebooting the computer into the new system - --------------- - -For rebooting the computer during or at the end of the installation -you should use the command faireboot in favour of the normal reboot -command. Use faireboot also if logged in from remote. If the -installation hasn’t finished, use faireboot -s, so the log files are -also copied to the install server. - -If the installation has finished successfully, the computer should -boot a small Debian system. You can login as user demo or root with -password fai. - - -6.4. Starting FAI (task confdir) - --------------- - -After the install client has booted only the script /usr/sbin/fai is -executed. It will do some minimal initialization. The variable -$FAI_CONFIG_SRC ^[13] is used to get access to the FAI configuration -space which is then available in the directory $FAI ^[14]. FAI will -not proceed without the config space. - -You can access the config space using different methods. Supported -methods are: nfs:, file:, cvs:, svn: git:, hg:, http: and detect:. -See fai.conf(5) for a detailed description of these methods. - - -6.5. Defining classes and variables (tasks defclass and defvar) - --------------- - -The command fai-class(1) executes scripts in $FAI/class for defining -classes. If the scripts write a string to stdout, this will be -defined as a class. Read all the details in the man page of fai-class -(1). - -After defining the classes, every file matching .var with a prefix -which matches a defined class is sourced to define variables. It must -contain valid shell code. - - -6.6. Partitioning local disks, creating file systems (task partition) - --------------- - -For the disk partitioning exactly one disk configuration file from -$FAI/disk_config is selected using classes. - -The format of the disk configuration is similar to a fstab file. - -The partitioning tool setup-storage(8) performs all commands -necessary for creating the disk partition layout, software RAID, LVM -and for creating the file systems. Disks and partitions may easily be -referenced by disk1.1, disk2.4 etc. Read the manual page of -setup-storage(8) for a detailed description and some examples of the -format. - - -6.7. Debconf preseeding (task debconf) - --------------- - -Files in $FAI/debconf are used for the usual debconf(7) preseeding if -the file names match a class name. - - -6.8. Installing software packages (task instsoft) - --------------- - -The command install_packages(8) reads the config files from $FAI/ -package_config in a class based manner and installs software packages -on the new file system. - -It installs the packages using apt-get(8), aptitude(1), yum or other -package tools without any manual interaction needed. Package -dependecies are also resolved by the package tools. - -The format of the configuration files is described in [packageconfig] -. - -Additionaly FAI will install packages (.deb or .rpm') from the -directories $FAI/pkgs/. - - -6.9. Site specific customization (task configure) - --------------- - -Often the default configurations of the software packages will not -meet your site-specific needs. You can call arbitrary scripts which -adjust the system configuration. Therefore the command fai-do-scripts -(1) executes scripts in $FAI/scripts in a class based manner. It is -possible to have several scripts of different types (shell, cfengine, -…) to be executed for one class. - -The default set of scripts in $FAI/scripts include examples for -installing Debian and Rocky Linux machines. They set the root -password, add a user account (set by '$username, default to demo), -set the timezone, configure the network for DHCP or using a fixed IP -address, setup grub and more. They should do a reasonable job for -your installation. You can edit them or add new scripts to match your -local needs. - -More information about these scripts are described in [cscripts]. - - -6.10. Saving log files (task savelog) - --------------- - -When all tasks are finished, the log files are written to /var/log/ -fai/$HOSTNAME/install/ ^[15] on the new system and to the account on -the install server if $LOGUSER is defined (you have to enable this in -/srv/fai/config/class/FAIBASE.var). It is also possible to specify -another host as log saving destination through the variable -$LOGSERVER. If $LOGSERVER is not defined, FAI uses the variable -$SERVER which is only defined during an initial installation (by -get-boot-info). - -Additionally, two symlinks will be created to indicated the last -directory written to. The symlink last points to the log directory of -the last FAI action performed. The symlinks last-install and -last-sysinfo point to the directory of the last corresponding action. -By default log files will be copied to the log server using scp. You -can use the variable $FAI_LOGPROTO in file fai.conf(5) to choose -another method for saving logs to the remote server. Here’s an -example of the symlink structure: - -lrwxrwxrwx 1 fai fai 23 Dec 2 2013 last-sysinfo -> sysinfo-20131202_161237 -drwxr-xr-x 2 fai fai 4096 Dec 2 2013 sysinfo-20131202_161237 -drwxr-xr-x 2 fai fai 4096 Feb 14 2014 install-20140214_142150 -drwxr-xr-x 2 fai fai 4096 Dec 2 11:47 install-20141202_113918 -lrwxrwxrwx 1 fai fai 23 Dec 4 13:22 last-install -> install-20141204_131351 -lrwxrwxrwx 1 fai fai 23 Dec 4 13:22 last -> install-20141204_131351 -drwxr-xr-x 2 fai fai 4096 Dec 4 13:22 install-20141204_131351 - -Examples of the log files can be found at https://fai-project.org/ -logs. - - -6.11. Reboot the new installed system - --------------- - -Before rebooting, the install client calls fai-chboot -d -on the install server, to disable its own PXELINUX configuration. -Otherwise, it would restart the installation during the next boot. -Normally this should boot the new installed system from its second -boot device, the local hard disk. - -At the end, the system is automatically rebooted if "reboot" was -added to $FAI_FLAGS. - - ---------------------------------------------------------------------- - -7. Advanced FAI topics - ---------------------------------------------------------------------- - - -7.1. Checking parameters received from DHCP servers - --------------- - -If the install client boots you can check if all information from the -DHCP daemon are received correctly. The received information is -written to /tmp/fai/boot.log. An example of the result of a DHCP -request can be found in the sample log files. - - -7.2. Monitoring multiple client installations - --------------- - -You can monitor the installation of all install clients with the -command fai-monitor(8). All clients check if this daemon is running -on the install server (or the machine defined by the variable -$monserver). Each time a task starts or ends, a message is sent. The -FAI monitor daemon prints this messages to standard output. There’s -also a graphical frontend available, called fai-monitor-gui(1). - -$ fai-monitor | fai-monitor-gui - & - - -7.3. Collecting Ethernet addresses for multiple hosts - --------------- - -You have to collect all Ethernet (MAC) addresses of the install -clients and assign a host name and IP address to each client. To -collect the MAC addresses, boot your install clients. You can already -do this before any DHCP daemon is running in your subnet. They will -fail to boot (because of the missing DHCP or missing TFTP), but you -can still collect the MAC addresses. - -While the install clients are booting, they send broadcast packets to -the LAN. You can log the MAC addresses of these hosts by running the -following command simultaneously on the server: - -faiserver# tcpdump -qtel broadcast and port bootpc >/tmp/mac.list - -After the hosts have been sent some broadcast packets abort tcpdump -by typing ctrl-c. You get a list of all unique MAC addresses with -these commands: - -faiserver$ perl -ane 'print "\U$F[0]\n"' /tmp/mac.list|sort|uniq - -After that, you only have to assign these MAC addresses to host names -and IP addresses (/etc/ethers and /etc/hosts or corresponding NIS -maps). With this information you can configure your DHCP daemon (see -the section [bootdhcp]). ^[16] - -7.3.1. Debugging the network traffic - -If the client can’t successfully boot from the network card, use -tcpdump(8) to look for Ethernet packets between the install server -and the client. Search also for entries in several log files made by -tftpd(8) and dhcpd(8) : - -faiserver$ egrep "tftpd|dhcpd" /var/log/* - - -7.4. Details of PXE booting - --------------- - -Here we describe the details of PXE booting, which are only needed if -you have problems when booting your install clients. - -Almost all modern bootable network cards support the PXE boot -environment. PXE is the Preboot Execution Environment. This requires -the PXELINUX bootloader and a special version of the TFTP daemon, -which is available in the Debian packages pxelinux and tftpd-hpa. PXE -booting also needs a DHCP server, so that the network card can -configure its IP parameters. This is the sequence of a PXE boot: - - * Network card of the client sends its MAC address - * DHCP server replies with IP configuration for the client - * Network card configures IP - * Install client gets the pxelinux.0 binary via TFTP - * Get the pxelinux.cfg/C0A8210C configuration file via TFTP - * C0A8210C is the IP address of the client in hexadecimal - * This configuration contains kernel, initrd and additional kernel - command line parameters, which was created by fai-chboot. - * Get the kernel and initrd via TFTP. - -Example of a pxelinux.cfg file: - -default fai-generated - -label fai-generated -kernel vmlinuz-6.1.0-17-amd64 -append initrd=initrd.img-6.1.0-17-amd64 ip=dhcp root=/srv/fai/nfsroot rootovl FAI_FLAGS=verbose,sshd,createvt FAI_CONFIG_SRC=nfs://faiserver/srv/fai/config FAI_ACTION=install - -See /usr/share/doc/syslinux/pxelinux.doc for more detailed -information about PXELINUX. FAI uses the lpxelinux.0 binary which -also supports loading the kernel and initrd via FTP or HTTP. The -command fai-chboot(8) supports this with the option -U. - - -7.5. Customizing your install server setup - --------------- - - * local/faster package mirror - * different loguser - * local root pw inside nfsroot - -The configuration for the FAI package (not the configuration data for -the install clients) is defined in fai.conf(5). Definitions that are -only used for creating the nfsroot are located in nfsroot.conf(5). -Check these important variables in nfsroot.conf before calling -fai-setup or fai-make-nfsroot. - -FAI_DEBOOTSTRAP - Building the nfsroot uses the command debootstrap(8). It needs - the location of a Debian mirror and the name of the distribution - (like bullsseye, bookworm, sid) for which the basic Debian system - should be built. Do not use different distributions here and in / - etc/fai/apt/sources.list. This will create a broken nfsroot. -NFSROOT_ETC_HOSTS - This variable is only needed if the clients do not have access to - a DNS server. This multiline variable is added to /etc/hosts - inside the nfsroot. Then the install clients can access those - hosts by name without using DNS. - -The content of /etc/fai/apt/sources.list is used by the install -server and also by the clients. If your install server has multiple -network cards and different host names for each card (as for a -Beowulf server), use the install server name which is known by the -install clients. - -If you have problems running fai-setup, they usually stem from -fai-make-nfsroot(8) which is called by former command. Adding -v -gives you a more verbose output which helps you pinpoint the error. -The output is written to /var/log/fai/fai-make-nfsroot.log. ^[17] - -The setup also creates the account fai (defined by $LOGUSER) if not -already available. So you can add a user before calling fai-setup(8) -using the command adduser(8) and use this as your local account for -saving log files. The log files of all install clients are saved to -the home directory of this account. You should change the primary -group of this account, so this account has write permissions to /srv/ -tftp/fai in order to call fai-chboot for creating the PXE -configuration for the hosts. - -When you make changes to fai.conf, nfsroot.conf the nfsroot has to be -rebuilt by calling fai-make-nfsroot(8). If you only like to install a -new kernel package to the nfsroot add the flags -k or -K to -fai-make-nfsroot. This will not recreate your nfsroot, but only -updates your kernel and kernel modules inside the nfsroot or add -additional packages into the nfsroot. - - -7.6. Creating a FAI CD or and USB stick - --------------- - -You can easily create an installation CD (or USB stick) of your -network installation setup. This will perform the same installation -and configuration from CD without the need of the install server. -Therefore you need to create a partial mirror of all Debian packages -needed for your FAI classes (using fai-mirror(1)). Then the command -fai-cd(8) will put this mirror, the nfsroot and the config space onto -a bootable CD. That’s it! - -To easily create the installation CD, you can use the following -command (for more tuning details see fai-cd(8)): - - faiserver# fai-cd -m fai-cd.iso - -This installation CD contains all data needed for the installation. -The command fai-cd(8) puts the nfsroot, the configuration space and a -subset of the Debian mirror onto a CD-ROM. A partial package mirror -is created using the command fai-mirror(1) which contains all -packages that are used by the classes used in your configuration -space. A sample ISO image is available at https://fai-project.org/ -fai-cd. - -Using the command dd(1) you can also create a bootable USB stick by -just writing the content of the ISO file to your USB stick (here the -stick is /dev/sdf). - - faiserver# dd if=fai-cd.iso of=/dev/sdf bs=1M - -mk-data-partition is a tool that extends an ISO (that will be copied -to an USB stick) or an USB stick containing an ISO with an ext4 or -exFAT partition and sets the file system label to MY-DATA. This -partition is automatically mounted to /media/data by FAI. You can -copy your own .deb packages into this data partition und the -subdiretories pkgs/. FAI will then install these packages -if the equivalent class is defined. - -Example how to use mk-data-partition: - -# mk-data-partition -s 1G -c faicd-large.iso A B - -The former command creates the data partition of size 1 Gbytes inside -the ISO file and copy directories A and B to it. You can then copy -the modified ISO onto an USB stick. - -If the ISO is already on the USB stick and if it’s available as dev/ -sdf, you can add a data partition of type exFAT will will use the -whole remaining part of the USB stick by using this command: - -# mk-data-partition -F /dev/sdf - - -7.7. Creating VM disk images using FAI - --------------- - -The command fai-diskimage(8) creates disk images, which can be used -with a virtual machine like KVM, VMware, VirtualBox or a cloud -service like OpenStack, GCE, EC2 and others. The installation process -performs the normal FAI tasks on a raw disk image. After the -installation you can boot the disk image and have a running system. -The disk image can also be converted to qcow2 format. You do not need -to setup the FAI nfsroot when only using fai-diskimage. But you need -a basefile in your configuration space. Setting the variable -$FAI_BASEFILEURL will automatically download an appropriate base file -into your config space. - -Here’s an example how to create a raw disk image for a host called -cloud3, with a small set of software packages: - -# export FAI_BASEFILEURL=https://fai-project.org/download/basefiles/ -# fai-diskimage -vu cloud3 -S2G -cDEBIAN,BOOKWORM64,AMD64,FAIBASE,GRUB_PC,DHCPC,DEMO,CLOUD,LAST disk.raw - -This command will create a disk image called ubuntu.qcow2 for a -Ubuntu 16.04 desktop with hostname set to foobar. - -# export FAI_BASEFILEURL=https://fai-project.org/download/basefiles/ -# cl=DHCPC,UBUNTU,JAMMY,JAMMY64,AMD64,XORG,LAST -# fai-diskimage -Nvu foobar -S5G -c$cl ubuntu.qcow2 - -You can give disk images a try without installing FAI, if you visit -https://fai-project.org/FAIme/cloud - - -7.8. Creating a bootable live image - --------------- - -Creating a bootable live ISO is easy with FAI. You only need two -steps. First, create your live environment using the command fai -dirinstall. Don’t forget to add the class LIVEISO. Then create the -live ISO using fai-cd: - -# cl="DEBIAN,BOOKWORM64,AMD64,FAIBASE,XFCE,XORG,DHCPC,DEMO,LIVEISO,LAST" -# LC_ALL=C fai -v dirinstall -u xfce33 -c $cl \ - -s file:///srv/fai/config /srv/xfce -# fai-cd -s500 -MH -d none -g /etc/fai/grub.cfg.live \ - -n /srv/xfce live.iso - -The nfsroot is not needed for a live ISO. Currently there’s no live -ISO of the install server available. - - -7.9. Building cross-architecture disk images - --------------- - -Starting FAI 5.4 it’s now possible to build a disk image for -different architectures than the host is running. For example you can -build an image for 64-bit ARM architecture (aarch64) on a host -running on amd64 architecture. Here are the steps do to: - -# apt install qemu-system-arm qemu-user-static fai-server fai-setup-storage fai-doc qemu-utils -# fai-mk-configspace - -# export FAI_BASEFILEURL=https://fai-project.org/download/basefiles/ -# fai-diskimage -vu armhost -S2G -cDEFAULT,DHCPC,DEBIAN,ARM64,BUSTER_ARM64,FAIBASE,DEMO,CLOUD,LAST arm64.raw -# chown your_user_id arm64.raw -# cp /var/log/fai/armhost/last/vmlinuz* vmlinuz -# cp /var/log/fai/armhost/last/initrd.img* initrd - -Then you can run qemu as a normal user: - -> qemu-system-aarch64 -m 1000 -M virt,gic_version=3 -cpu cortex-a57 -drive file=arm64.raw,if=virtio,index=1 -no-reboot -nographic -name ARM64 -net nic,name=eth0,model=virtio -net user,name=eth0,-kernel vmlinuz -initrd initrd -append "console=ttyAMA0 rw ip=dhcp root=/dev/vda1 net.ifnames=0" - -This works similar for other architectures. Keep in mind, that qemu -network setup will have poor performance if not using the virtio -driver as above or tap devices. - -You can find the base files for many architectures at https:// -fai-project.org/download/basefiles/, or use mk-basefile to create -your own. - - -7.10. FAI rescue system - --------------- - -If you set the variable $FAI_ACTION to sysinfo (for e.g. by using -fai-chboot -S), the client will not install a new system, but will -collect a lot of system information. If you set $FAI_ACTION to -inventory you will only get a few hardware information. Both actions -can be used for FAI as a rescue system. - -Type ctrl-c to get a shell or use Alt-F2 or Alt-F3 and you will get -another console terminal, if you have added createvt to $FAI_FLAGS. - -You now have a running Linux system on the install client without -using the local hard disk. Use this as a rescue system if your local -disk is damaged or the computer can’t boot properly from hard disk. -You will get a shell and you can execute various commands (dmesg, -lsmod, df, lspci, …). Look at the log file in /tmp/fai. There you can -find much information about the boot process. - -FAI mounts all file systems it finds on the local disks read only. It -also tells you on which partition a file /etc/fstab exists. When only -one file system table is found, the partitions are mounted according -to this information. Here’s an example: - -demohost:~# df -h - -Filesystem Size Used Avail Use% Mounted on -devtmpfs 4.0M 0 4.0M 0% /dev -tmpfs 2.0G 0 2.0G 0% /dev/shm -tmpfs 783M 18M 766M 3% /run -tmpfs 5.0M 0 5.0M 0% /run/lock -LiveOS_rootfs 783M 18M 766M 3% / -192.168.33.250:/srv/fai/config 59G 23G 24G 49% /var/lib/fai/config -/dev/mapper/vg1-root 7.3G 1.8G 5.2G 26% /target -/dev/vda1 459M 53M 378M 13% /target/boot -/dev/mapper/vg1-home 1.4G 72K 1.3G 1% /target/home - -This method can be used as a rescue environment! If you need a file -system with read-write access use the rwmount command: - -demohost# rwmount /target/home - - -7.11. FAI without NFS - --------------- - -To boot into FAI and begin the installation sequence without using -the NFS protocol, you boot the client machine using PXE as usual and -then retrieve an image containing the nfsroot via http. - -To create an image, use fai-cd’s -S argument and -M to avoid setting -up a partial mirror within the image. - -faiserver# fai-cd -M -S squash.img - -Move this image to a directory from which it can be requested via -http (usually a directory served by the webserver) - -To now request the squashfs image, add the following to your kernel -command line, e.g. in your pxelinux configuration file for the client -with fai-chboot. - -root=live:http://faiserver/cskoeln/squash.img FAI_CONFIG_SRC=file:///var/lib/fai/config - -Replace faiserver with the domain name or IP of the machine your -squash image is served from. - - -7.12. Installing other distributions using a Debian nfsroot - --------------- - -You can install all sorts of Linux distributions from a single Debian -nfsroot. Therefore you have to create a base.tar.xz of the -distribution you like to install and place it into the basefiles -directory. Then name it UBUNTU2204.tar.xz for example. An install -client which belongs to the class UBUNTU2204 then extracts this base -file into its empty file system. Additionally you have to adjust the -sources.list or similar configuration files which are needed for -specifying the location of the package repository. - -The tool rinse(8) is used for creating base files for distribution -like Rocky Linux, CentOS, openSUSE or Fedora. Some basefiles can be -downloaded from https://fai-project.org/download/basefiles/. - -The script mk-basefile in /usr/share/doc/fai-doc/examples/simple/ -basefiles/ helps creating this base files. - - -7.13. Creating chroot and virtualization environments - --------------- - -If you have to create some chroot environments, or a virtualization -environment where you neither can nor want to run a normal Debian -Installer in to get to a working system (for example, Xen guest -domains), there is the FAI action dirinstall. By calling - -faiserver# fai dirinstall - -and using either the option -c or -N you get a FAI -installation, without the partitioning action, right into the target -directory. The host name for the target installation can be specified -using -u - -This, for example, can be used to combine FAI with the tool xen-tools -, which helps you to build Xen guest domains. xen-tools are very nice -for generating configuration files and block devices for new guests -based on simple commands and/or configuration files, but they can -only assign one role per installation for customization. FAI-users -need and want more, as they are used to have the class system. They -get them even in xen-tools installations, by using the following code -as a xen-tools role script: - -#!/bin/sh -TARGET=$1 -CMD="fai -N -v -u ${hostname} dirinstall $TARGET" -echo running $CMD -$CMD - -Then, you should set the variable install=0 in the config of -xen-tools for that host. - - -7.14. Using FAI for updates - --------------- - -FAI can also do updates of already running systems, without a -re-installation from scratch. This is called softupdate. A FAI -softupdate skips the tasks which are not suitable for updating a -running system, like partitioning the hard disks and creating file -systems. Instead, it only executes the tasks for updating and -installing software packages and calling the customization scripts. - -To run a softupdate call: - -# fai -v -s nfs://faiserver/srv/fai/config softupdate - -By default, a softupdate uses the list of classes defined during the -initial installation. Make sure to set the variable $LOGSERVER (done -in a class/*.var file) if FAI should save the log files to a remote -machine. - -It’s up to you, how to start a softupdate on a bigger number of -hosts. You may do the softupdate on a regular basis via cron or you -can use tools like clusterssh(1) to start a softupdate via a push on -a list of hosts. - -Keep in mind, that the customization scripts are run every time you -do a softupdate. That means, they have to be idempotent i.e. the -result of their operation should always produce the same result, even -when they run more than once. - -For example appending a line to a file must not done via this code: - -$ echo "some strings" >> /etc/fstab - -Instead use the command ainsl(1) in a shell script or use cfengine’s -function AppendIfNoSuchLine. - -All commands in the customization script must be capable of modifying -the target file system wether it’s available in /target during the -initial installation or wether it’s the normal file system relative -to / during softupdate. - -Here are some variable that help writing these scripts: - -$target - Points to the root directory of the client, which is /target - during installation and / during a softupdate. -$FAI_ROOT - It’s the same value as $target. For historic reasons we have both - these variables in FAI. -$ROOTCMD - In case of the installation this is an alias for chroot $target - in case of softupdate it’s just empty. You can prepend this to - commands if you need to run a command inside the clients target - file system via chroot. -$FAI_ACTION - If you need to call code depending on the FAI action performed, - you can use this variable. It contains the currently executed - action: install, softupdate, dirinstall, sysinfo, inventory or - your own defined action. - - -7.15. How to install 32-bit OS from a 64-bit OS - --------------- - -To install a computer with a 32-bit OS, you need an i386 nfsroot. -Creating this 32-bit nfsroot on an install server running amd64 is -quite simple. Install and set up the FAI packages. Then copy your FAI -config files to a new subdirectory. - -faiserver# cp -a /etc/fai /etc/fai-i386 - -Edit the variable $FAI_DEBOOTSTRAP_OPTS in /etc/fai-i386/nfsroot.conf -and add the option --arch i386. Also choose a different directory for -your new nfsroot. Here are the two lines after editing. - -NFSROOT=/srv/fai/nfsroot-i386 -FAI_DEBOOTSTRAP_OPTS="--arch i386 --exclude=info --include=aptitude"" - -Now call fai-make-nfsroot which creates the 32-bit nfsroot in /srv/ -fai/nfsroot-i386 - -faiserver# fai-make-nfsroot -v -C/etc/fai-i386 - -Creating a partial mirror using fai-mirror(1) that is needed for a -bootable CD or USB stick is also possible on a different -architecture. You have to specify the architecture when calling -fai-mirror. - -$ fai-mirror -m800 -B -a i386 -v -cDEFAULT,DEBIAN,FAIBASE,I386 /srv/mirror-i386 - -That’s all! - - -7.16. Aborting the installation when an error occurs - --------------- - -Every task and hook can call the function task_error to send an error -value to the installation. This error will appear in the log file and -can be shown in the fai-monitor-gui(1). The error value is also -checked against the variable $STOP_ON_ERROR which is set to 700 by -default. If the error value is greater than $STOP_ON_ERROR the -installation will stop immediately. In a hook, just add a call like -this: - -task_error - -It is comfortable to call task_error with $? as second parameter, for -e.g. if you want to set an error value of 123 use this - - -task_error 123 $? - -Then the task error is only set if the preceding command failed with -some error. The same syntax can be used by the scripts in the class -subdirectory ending in .sh. - -A special case are scripts inside the class/ subdirectory that does -not end in .sh. In those scripts you have to call task_error with 1 -as third parameter. As an example you can use those two variants for -setting the value to 123 - -task_error 123 $? 1 - -or - -task_error 123 1 1 - -The latter command always sets the task error to 123 regardless of -the value of $?. If the error value is greater than $STOP_ON_ERROR, -the installation will abort immediately. - -The error values are grouped into four categories - -normal or info messages: 1xx, 2xx -warnings: 3xx, 4xx -minor errors: 5xx, 6xx -errors: 7xx, 8xx - -The fai-monitor-gui has 4 different icons for these error categories. - - ---------------------------------------------------------------------- - -8. Various hints and details - ---------------------------------------------------------------------- - - -8.1. The list of tasks - --------------- - -Most tasks of the installation are defined as subroutines which are -defined in /usr/lib/fai/subroutines (e.g. task_instsoft). Some are -external shell scripts located in /usr/lib/fai/. They are called via -a superior subroutine called task. This subroutine calls hooks if -available and then calls the task (defined as task_). A task -and its hooks can be skipped on demand by using the command skiptask -(). - -Now follows the description of all tasks, listed in the order they -are executed. - -confdir - - The kernel appended parameters may define variables, the syslog - daemon is started. Network parameters are fetched from a DHCP - server and are stored in boot.log. The DNS resolver configuration - file is created. - - The location of the configuration space is defined by the - variable $FAI_CONFIG_SRC. - - After that, the file $FAI/hooks/subroutines is sourced if it - exists. Using this file, you can define your own subroutines or - override the definition of FAI’s subroutines. - -setup - This task sets the system time, all $FAI_FLAGS are defined and - two additional virtual terminals are opened on demand. A secure - shell daemon is started on demand for remote logins. -defclass - Calls fai-class(1) to define classes using scripts and files in - $FAI/class and classes from /tmp/fai/additional-classes and the - variable $ADDCLASSES. The list of all defined classes is stored - in the variable $classes and saved to /tmp/fai/FAI_CLASSES. -defvar - Sources all files $FAI/class/*.var for every defined class. If a - hook has written some variable definitions to the file $LOGDIR/ - additional.var, this file is also sourced. -action - Depending on the value of $FAI_ACTION this subroutine decides - which action FAI should perform. The default available actions - are: sysinfo, install, inventory, dirinstall and softupdate. If - $FAI_ACTION has another value, a user defined action is called if - a file $FAI/hooks/$FAI_ACTION exists. So you can easily define - your own actions. -sysinfo - Called when no installation is performed but the action is - sysinfo. It shows information about the detected hardware and - mounts the local hard disks read only to /target/partitionname or - with regard to a fstab file found inside a partition. Log files - are stored to the install server. -inventory - A short list of system information is printed. -install - This task controls the installation sequence. You will hear three - beeps before the installation starts. The major work is to call - other tasks and to save the output to /tmp/fai/fai.log. If you - have any problems during installation, look at all files in /tmp/ - fai/. You can find examples of the log files at https:// - fai-project.org/logs/. -dirinstall - Install into a directory, not onto a local disk. Use this for - creating chroot environments. -softupdate - This task, executed inside a running system via the fai(8) - command line interface, performs a softupdate. See chapter - [softupdate] for details. -partition - Calls setup-storage(8) to partition the hard disks and to create - file systems. The task writes variable definitions for the root - and boot partition and device ($ROOT_PARTITION, $BOOT_PARTITION, - $BOOT_DEVICE) to /tmp/fai/disk_var.sh and creates a fstab file - for the new system. -mountdisks - Mounts the created partitions according to the created /tmp/fai/ - fstab file relative to $FAI_ROOT. -extrbase - Extracts a minimal system after that a chroot can be made into - it. By default the base tar file /var/tmp/base.tar.xz will be - extracted. Also files matching a class name in $FAI/basefiles/ - are used for unpacking a different tar file depending on classes - defined. This can be used for installing different Linux - distributions than the one used for creating the nfsroot. The - default file base.tar.xz is a snapshot of a basic Debian system - created by debootstrap(8). This task uses the variable - FAI_BASEFILEURL for fetching the base file via FTP, HTTPS or HTTP - if it’s defined. -debconf - Calls fai-debconf(1) to set the values for the debconf preseeding - database. -repository - Prepare access to the package repository by preparing the apt - configuration. This can also add repository keys in a class based - manner from files like CLASSNAME.gpg in the directory - package_config. -updatebase - Updates the base packages of the new system and updates the list - of available packages. It also fakes some commands (called - diversions) inside the new installed system using dpkg-divert(8), - so no daemons will be started during the installation. -instsoft - Installs the desired software packages using class files in $FAI/ - package_config/. -configure - Calls scripts in $FAI/scripts/ and its subdirectories for every - defined class. -tests - Calls test scripts in $FAI/tests/ and its subdirectories for - every defined class. -finish - Unmounts all file systems in the new installed system and removes - diversions of files using the command fai-divert. -chboot - Changes the PXE configuration for a host on the install server - which indicates which PXELINUX configuration to load on the next - boot from network card via TFTP. Therefore the fai-chboot(8) - command is executed remotely on the install server. -savelog - Saves log files to local disk and to the account $LOGUSER on - $LOGSERVER (defaults to the install server). -faiend - Wait for background jobs to finish (e.g. emacs compiling lisp - files) and automatically reboots the install clients or waits for - manual input before reboot. - - -8.2. Automated tests - --------------- - -After the customization scripts are executed, FAI will execute some -tests if available. Using these test, you can check for errors of the -installation. Test scripts are called via fai-do-scripts(1) and -should append its messages to $LOGDIR/test.log. A Perl module -including some useful subroutines can be found in Faitest.pm. A test -can also define a new class for executing another tests during next -boot via the variable $ADDCLASSES. - - -8.3.  Autodiscover - --------------- - -In FAI 5.0 we released a feature that allows clients to search for -the faiserver in their respective subnetwork. This lifts the -necessity of having to collect every client’s MAC address and -configuring the DHCP daemon. - -This is done by booting from a small FAI autodiscover bootmedium (CD, -USB, etc.), which can be created via the command: - -faiserver# fai-cd -A autodiscover.iso - -The image is roughly 25MB in size and scans the subnet for a FAI -server. By default it shows a menu with all profiles available in the -configuration space in the same manner as the menu flag does. From -this menu, you can select the installation type you wish to perform. - -For the clients to find the faiserver, the faiserver must run -fai-monitor. - - -8.4. Changing the boot device - --------------- - -Changing the boot sequence is normally done in the BIOS setup. But -you can’t change the BIOS from a running Linux system. - -So, the boot sequence of the BIOS will remain unchanged and your -computer should always boot first from its network card and the -second boot device should be the local disk. Then you can change the -boot device of the client by creating different PXELINUX -configurations. This will define if an installation should be -performed, or if the client should to boot from local disk. This is -done using fai-chboot(8). - - -8.5. How to create a local Debian mirror - --------------- - -The utility mkdebmirror ^[18] can be used for creating your own local -Debian mirror. This script uses debmirror(1). A partial Debian mirror -for amd64 architecture for Debian 11 and 12 (aka bullseye and -bookworm) without the source packages needs about 180GB of disk -space. Accessing the mirror via HTTP will be the default way in most -cases. To see more output from the script call mkdebmirror -v. A root -account is not necessary to create and maintain the Debian mirror. - -To use HTTP access to the local Debian mirror, install a web server -and create a symlink to the local directory where your mirror is -located: - -faiserver# apt-get install apache2 -faiserver# ln -s /files/scratch/debmirror /var/www/html/debmirror - -Create a file sources.list(5) in /etc/fai/apt which gives access to -your Debian mirror. Also add the IP-address of the HTTP server to the -variable $NFSROOT_ETC_HOSTS in nfsroot.conf if the install clients -have no DNS resolving. - - -8.6. Small hints - --------------- - - * When using HTTP access to a Debian mirror, the local /var - partition on all install clients must be big enough to keep the - downloaded Debian packages. Do not try with less than 250 Mbytes - unless you know why. You can limit the number of packages - installed at a time with the variable $MAXPACKAGES. - * You can remove the red logo on the install client by simply - calling reset once. If will also not appear if you create a file - using this command on the install server: - -touch /srv/fai/nfsroot/.nocolorlogo - - * A list of variables used by FAI can be found at https:// - wiki.fai-project.org/index.php/Variables. - * You can shorten some customization scripts by using one single - fcopy command fcopy -r /. - * If you rebuild the nfsroot, you will create a new ssh host key - inside the nfsroot. Then logging in to an install client may - fail, because the host key changes. You can use this: - -$ ssh -o StrictHostKeyChecking=no root@installclient - - * You can also delete the host entry on your install client in your - ~/.ssh/known_hosts file by using the ssh-keygen -R command. - * In the tasks chboot and savelog, a connection using secure shell - is opened to the FAI server (see [isavelog]). To ensure that this - works non-interactively, a proper entry in NFSROOT/root/.ssh/ - known_hosts must be created. When using fai-setup, this is done - automatically, but it may require manual editing in case the name - of your FAI server was not determined correctly. If you stumble - over ssh connections that require typing "yes" to accept the host - key during installation, please check the contents of your - NFSROOT/root/.ssh/known_hosts file - * A list of all local hard disks is stored in $disklist. It’s - defined after set_disk_info is called. - * There are multiple functions for generating a customized disk - list. See fai-disk-info for an example. - - + set_bootstick() - + grepv_disks() - + grep_disks() - + notmatchdisks() - + matchdisks() - + smallestdisk() - + largestdisk() - + all_disks_by_size() - + all_disks_and_size() - + once_only() - + checkdisk() - + disks_by_id() - * Use fai-divert -a if a postinst script calls a configuration - program, e.g. the postinst script for package apache calls - apacheconfig, which needs manual input. You can fake the - configuration program so the installation can be fully automatic. - * Sometimes the installation seems to stop, but often there’s only - a postinstall script of a software package that requires manual - input from the console. Change to another virtual terminal and - look which process is running with tools like top(1) and pstree - (1). You can add debug to FAI_FLAGS to make the installation - process show all output from the postinst scripts on the console - and get its input also from the console. - * How can I define classes on the kernel command line? - - Read the man page of fai-class(8). If you like to define some - additional classes (for e.g. A,B,C) on the kernel command line - add this: ADDCLASSES=A,B,C - - * How to use a custom kernel inside the nfsroot? - - Build your customized kernel by building a kernel package using - make-kpkg(8) and use the option --initrd. Copy this Debian - package to a local repository and add it to /etc/fai/ - sources.list. Add the name of your package to /etc/fai/NFSROOT. - Then call - - # fai-make-nfsroot -k - - * How to use the nfsroot as system for diskless clients? - - https://wiki.fai-project.org/index.php/ - Use_nfsroot_for_diskless_clients - - * How to serve multiple nfsroot directories on one FAI server? - - If you want to serve multiple nfsroot directories, you need to - create specific config directories in /etc for FAI, like /etc/ - fai-buster and /etc/fai-bookworm. Then you need to set the - $NFSROOT variables to different directories and run - -faiserver#fai-make-nfsroot -C /etc/fai-buster - - -8.7. flag_reboot (FAI_FLAGS) - --------------- - -If flag_reboot is set, by adding "reboot" to $FAI_FLAGS, your client -machine will reboot after the task faiend has finished. This is true -for network as well as bootmedium installations. - - -8.8. Log files - --------------- - -FAI is creating several log files. During installation they are -stored in /tmp/fai on the install client itself. At the end of the -installation they will be copied to the install server (see -[isavelog]). After the install client rebooted into his newly -installed system, you can find the FAI logs in /var/log/fai. Log -files are also created when doing the softupdate or dirinstall -action. - -On the faiserver, you can find the (remote) log files under the ~fai -directory. - -Sample log files from successfully installed computers are available -on https://fai-project.org/logs. These a some log files which are -created by FAI. - -FAI_CLASSES - Contains a list of all classes defined. -dmesg.log - Output of the dmesg command. Contains useful messages of the - kernel ring buffer. -fai.log - The main log file. Contains all important information. You should - always read this file. -boot.log - A list of variables of network parameters, mostly defined by the - DHCP daemon. -format.log - Output of the partition tool setup-storage(8). -scripts.log - Output of all scripts, that are used for customization. -variables.log - A list of all shell variables which are available during an - installation. -error.log - A summary of possible errors in all log files. -disk_var.sh - A list of variables that contain information about devices and - partitions to boot from, the root partition and a list of swap - devices. These information is used by some customization scripts - (e.g. GRUB_PC/10-setup). - -If the installation process finishes, the hook savelog.LAST.sh -searches all log files for common errors and writes them to the file -error.log. So, you should first look into this file for errors. Also -the file status.log give you the exit code of the last command -executed in a script. To be sure, you should look for more details in -all log files. - - -8.9. How to use HTTP for PXE boot - --------------- - -fai-make-nfsroot now uses the lpxelinux.0 binary which already -supports transfer of the kernel and initrd via http (additional to -tftp). You only have to enable HTTP access to the tftp directory: - -cd /var/www/html -ln -s /srv/tftp/fai - -Add -U URL to the fai-chboot call. For example: - -fai-chboot -U http://faiserver/fai -IFv ....... - - ---------------------------------------------------------------------- - -9. Troubleshooting - ---------------------------------------------------------------------- - - -9.1. Boot errors - --------------- - -The following error message indicates that your install client -doesn’t get an answer from a DHCP server. Check your cables or start -the dhcpd(8) daemon with the debug flag enabled. - - PXE-E51: No DHCP or BOOTP offers received - Network boot aborted - -If you do not see the following message, the install kernel could not -detect your network card, for example because of a missing driver: - -Starting dhcp for interface eth0 -dhcp: PREINIT eth0 up -dhcp: BOND setting eth - -Check the initrd in the nfsroot (lsinird) if the kernel driver of -your network card is included there and check if you like to add the -package firmware-linux-nonfree in /etc/fai/NFSROOT and rebuild the -initrd by calling fai-make-nfsroot -k. You may also add a driver to / -srv/fai/nfsroot/etc/dracut.conf in the line add_drivers+=. - -This is the error message you will see, when your network card is -working, but the install server does not export the nfsroot directory -to the install clients, This is often caused by missing NFS -permissions on the server side. - -Starting dhcp for interface eth0 -dhcp: PREINIT eth0 up -dhcp: BOND setting eth -mount.nfs: access denied by server while mounting 192.168.33.250:/srv/fai/nfsroot -. -. -dracut Warning: Could not boot -. -Dropping to debug shell -dracut:/# - -Now, you are inside the emergency shell of the initrd which was -created by dracut(8). You will get a shell prompt, and can look at -the log files. For more information about debugging the early boot -process using dracut see dracut.cmdline(7) - -Use the following command on the install server to see which -directories are exported from the install server (named faiserver): - -$ showmount -e faiserver - - ---------------------------------------------------------------------- - -^[1] Solaris 8 Advanced Installation Guide at https://docs.oracle.com -/cd/E19455-01/806-0957/806-0957.pdf - -^[2] http://www.science.uva.nl/pub/solaris/auto-install - -^[3] https://wiki.fai-project.org/index.php/ -VirtualBox_for_your_first_FAI_installation - -^[4] This installation will consume about 2GB of space in /tmp. - -^[5] It’s also possible to use only the configuration file with the -highest priority since the order of classes define a priority from -low to high within the list of classes. - -^[6] If you want to use a faster mirror, adjust the URL in /etc/fai/ -apt/sources.list and FAI_DEBOOTSTRAP in /etc/fai/nfsroot.conf before -calling fai-setup. - -^[7] This will call fai-make-nfsroot(8) internally. - -^[8] These files need not belong to the root account. - -^[9] You may also add this into your Domain Name System (DNS) - -^[10] Since the root file system on the clients is mounted via NFS, -fai is located in /srv/fai/nfsroot/usr/sbin on the install server. - -^[11] $FAI is an internal variable used by the FAI scripts. By -default the path is /var/lib/fai/config. - -^[12] /srv/fai/nfsroot from the install server via NFS - -^[13] It is defined on the kernel command line - -^[14] /var/lib/fai/config - -^[15] /var/log/fai/localhost/install/ is a link to this directory. - -^[16] I recommend to write the MAC addresses (last three bytes will -suffice if you have network cards from the same vendor) and the host -name in the front of each chassis. - -^[17] For debugging purpose it may help to enter the chroot -environment manually using this command. faiserver# chroot /srv/fai/ -nfsroot bash - -^[18] You can find the script in /usr/share/doc/fai-doc/examples/ -utils/ - diff --git a/doc/fai-guide_fr.html b/doc/fai-guide_fr.html deleted file mode 100644 index 917409f5c..000000000 --- a/doc/fai-guide_fr.html +++ /dev/null @@ -1,4476 +0,0 @@ - - - - - - -FAI Guide (Fully Automatic Installation) - - - - -

    -
    -
    -
    -

    Une version plus ancienne de ce guide en français est disponible à -https://fai-project.org/fai-guide-fr.

    -
    -
    -
    -

    Résumé

    -
    -

    FAI est un système non-interactif pour installer, configurer et gérer des -systèmes Linux et les configurations de logiciels sur des ordinateurs comme sur des machines -virtuelles et des environnements chroot, depuis des petits réseaux jusqu’à de -grandes infrastructures et de grands clusters.

    -

    Ce manuel décrit le logiciel Fully Automatic Installation (installation entièrement automatique). -Cela inclut l’installation des paquets, la configuration du serveur, la -création de la configuration et la gestion des erreurs.

    -

    (c) 2000-2025 Thomas Lange

    -

    Ce manuel est un logiciel libre; Vous pouvez le redistribuer et / ou le -modifier selon les termes de la Licence Publique Générale GNU publiée -par la Free Software Foundation; Soit la version 2, soit (à votre choix) -toute version ultérieure.

    -

    Ceci est distribué dans l’espoir qu’il sera utile, mais sans aucune -garantie ; Sans même la garantie implicite de qualité marchande ou -d’adaptation à un usage particulier. Pour plus de détails, consultez la -License Générale Publique GNU.

    -

    Une copie de la Licence Générale Publique GNU est disponible sous la forme -/usr/share/common-licenses/GPL dans la distribution Debian GNU/Linux ou -sur le World Wide Web sur le site GNU Vous pouvez également l’obtenir en -écrivant à la Free Software Foundation , Inc., 59 Temple Place - Suite -330, Boston, MA 02111-1307, États-Unis.

    -
    -
    -
    -
    -

    Introduction

    -
    -
    -

    Disponibilité

    -
    -
    -Page d’accueil -
    -
    -

    -https://fai-project.org -

    -
    -
    -Wiki FAI -
    -
    -

    -https://wiki.fai-project.org -

    -
    -
    -Téléchargement -
    -
    -

    -https://fai-project.org/download -

    -
    -
    -Entrée pour sources.list -
    -
    -

    -deb https://fai-project.org/download bookworm koeln -

    -
    -
    -Pages de manuel -
    -
    -

    -https://fai-project.org/doc/man/ -

    -
    -
    -Listes de diffusion -
    -
    -

    -https://lists.uni-koeln.de/mailman/listinfo/linux-fai -

    -
    -
    -Retour d’information -
    -
    -

    -Envoyez vos réflexions et vos commentaires à fai@fai-project.org ou -à la liste de diffusion. -

    -
    -
    -Boguess -
    -
    -

    -Utiliser le système de suivi des bogues Debian (BTS) https://bugs.debian.org/src:fai -

    -
    -
    -Changements visibles par l’utilisateur -
    -
    -

    -http://fai-project.org/NEWS -

    -
    -
    -Arbre source via git -
    -
    -

    -git clone git://github.com/faiproject/fai.git -

    -
    -
    -Voir l’arbre source avec https -
    -
    -

    - https://github.com/faiproject/fai -

    -
    -
    -

    Les pages man incluent toujours des informations à jour et beaucoup de -détails sur toutes les commandes FAI. Alors, n’oubliez pas de les lire -attentivement. Lisez maintenant ce manuel, puis profitez de -l’installation entièrement automatique et de votre temps économisé.

    -
    -
    -

    Motivation

    -

    Avez-vous déjà effectué des installations identiques d’un système -d’exploitation à plusieurs reprises? Souhaitez-vous être en mesure -d’installer un cluster Linux avec des dizaines de nœuds d’un seul coup?

    -

    Répéter la même tâche encore et encore est ennuyeux — et conduira -certainement à des erreurs. Aussi beaucoup de temps pourrait être sauvé -si les installations étaient faites automatiquement. Un processus -d’installation avec interaction manuelle ne peut pas passer à l’échelle. Mais les -grappes (clusters) ont l’habitude de croître au fil des ans. Pensez à long terme -plutôt que de planifier seulement quelques mois dans l’avenir.

    -

    En 1999, j’ai dû effectuer une installation d’un cluster Linux avec un -serveur et 16 clients. Puisque j’ai eu beaucoup d’expérience en faisant -des installations automatiques des systèmes d’exploitation de Solaris -sur le matériel de SUN SPARC, l’idée de construire une installation -automatique pour Debian est née. Solaris dispose d’une fonctionnalité -d’installation automatique appelée JumpStart -
    [Solaris 8 Advanced Installation Guide at "https://docs.oracle.com/cd/E19455-01/806-0957/806-0957.pdf]
    . -En conjonction avec les scripts d’auto-installation de Casper Dik -
    [http://www.science.uva.nl/pub/solaris/auto-install]
    , -Je pouvais épargner beaucoup de temps non seulement pour chaque nouvel -ordinateur de SUN, mais aussi pour la réinstallation des postes de -travail existants. Par exemple, j’ai dû construire un LAN temporaire -avec quatre stations de travail SUN pour une conférence, qui a duré -seulement quelques jours. J’ai retiré ces postes de travail de notre -réseau de recherche habituel et mis en place une nouvelle installation -pour la conférence. Quand elle a été terminée, j’ai simplement réintégré les -postes de travail dans le réseau de recherche, redémarré une seule fois, -et après une demi-heure, tout était opérationnel comme avant. La -configuration de tous les postes de travail était exactement la même -qu’avant la conférence, car tout était effectué par le même processus -d’installation. J’ai également utilisé l’installation automatique pour -réinstaller un poste de travail après qu’un disque dur endommagé ait été -remplacé. Il m’a fallu deux semaines pour recevoir le nouveau disque -dur, mais seulement quelques minutes après l’installation du nouveau -disque, le poste de travail fonctionnait comme avant. Et c’est pourquoi -j’ai choisi d’adapter cette technique à un cluster de PC sous Linux.

    -
    -
    -

    Comment fonctionne FAI

    -

    Le client d’installation qui sera installé à l’aide de FAI, est démarré -via une carte réseau ou à partir d’un CD ou d’une clé USB. Il obtient -une adresse IP et démarre un noyau Linux qui monte son système de -fichiers racine via NFS (nfsroot) du serveur d’installation. Une fois le -noyau démarré, le script de démarrage FAI exécute l’installation -automatique qui n’a pas besoin d’interaction. Tout d’abord, les disques -durs seront partitionnés, les systèmes de fichiers seront créés et des -paquets logiciels seront ensuite installés. Après cela, le nouveau système -d’exploitation installé est configuré selon vos besoins locaux en -utilisant quelques scripts. Enfin, le nouveau système d’exploitation -sera démarré à partir du disque local.

    -

    Les détails sur la façon d’installer l’ordinateur (la configuration) -sont stockés dans l’espace de configuration sur le serveur d’installation. -Les fichiers de configuration sont répartis entre des groupes -d’ordinateurs s’ils sont similaires, en utilisant le concept de classe. -Vous n’avez donc pas besoin de créer une configuration pour chaque -nouvel hôte. Ainsi, FAI est une méthode évolutive pour -installer un gros cluster avec un grand nombre de nœuds même si leur -configuration n’est pas identique.

    -

    FAI peut également être utilisé comme un système de sauvetage ou pour -l’inventaire matériel. Vous pouvez démarrer votre ordinateur, mais il -n’effectuera pas une installation. Au lieu de cela, il exécutera un -Debian GNU / Linux entièrement fonctionnel sans utiliser les disques -durs locaux. Ensuite, vous pouvez effectuer une connexion à distance et -sauvegarder ou restaurer une partition de disque, vérifier un système de -fichiers, inspecter le matériel ou effectuer toute autre tâche.

    -
    -
    -

    Caractéristiques

    -
      -
    • -

      -On peut faire une installation entièrement automatisée. -

      -
    • -
    • -

      -Installation très rapide sans surveillance. -

      -
    • -
    • -

      -Système flexible grâce à un concept de classe simple. -

      -
    • -
    • -

      -Mise à jour des systèmes en cours d’exécution sans réinstallation. -

      -
    • -
    • -

      -Images « Cloud » pour un environnement de virtualisation. -

      -
    • -
    • -

      -Les hôtes peuvent démarrer à partir d’une carte réseau, d’un CD, d’une clé USB. -

      -
    • -
    • -

      -Création simple d’une image ISO vive ou pour l’installation. -

      -
    • -
    • -

      -Prise en charge de PXE avec la méthode de démarrage DHCP. -

      -
    • -
    • -

      -Support des systèmes de fichiers ReiserFS, ext3/ext4, btrfs et XFS. -

      -
    • -
    • -

      -Support logiciel RAID et LVM. Support LUKS. -

      -
    • -
    • -

      -Détection automatique du matériel. -

      -
    • -
    • -

      -On peut déployer Debian, Ubuntu, Rocky Linux, CentOS, AlmaLinux, SuSE -

      -
    • -
    • -

      -Possibilité de connexion à distance via ssh lors du processus d’installation. -

      -
    • -
    • -

      -Toutes les configurations similaires sont partagées entre tous les les clients d’installation. -

      -
    • -
    • -

      -Les fichiers journaux de toutes les installations sont enregistrés sur le serveur d’installation. -

      -
    • -
    • -

      -Prise en charge des scripts Shell, Perl, Python, Ruby, expect et CFEngine lors de l’étape de personnalisation. -

      -
    • -
    • -

      -Prise en charge de nombreux protocoles comme NFS, FTP, HTTP, git. -

      -
    • -
    • -

      -Peut être utilisé comme un système de sauvetage et pour l’inventaire matériel. -

      -
    • -
    • -

      -Prise en charge de clients sans disque. -

      -
    • -
    • -

      -Prise en charge trans-architecture, par exemple pour des appareils embarqués (embedded devices). -

      -
    • -
    • -

      -Ajoutez facilement vos propres fonctions via des hooks ou modifiez le comportement par défaut. -

      -
    • -
    • -

      -Prise en charge du clonage de machines utilisant des images de disque. -

      -
    • -
    -
    -
    -

    La durée d’installation

    -

    La durée d’installation est déterminée par la quantité de logiciel et la -vitesse du disque dur. Voici quelques exemples de durée. Tous les -clients d’installation avaient une carte réseau 1Gbit installée.

    -
    - ------ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    CPU RAM Disque Logiciels installés durée

    i7-3770T 2.50GHz

    8GB

    SSD

    6 GB logiciel

    8.5 min

    Core-i7 3.2GHz

    6GB

    SATA disk

    4.3GB logiciel

    7 min

    Core-i7 3.2GHz

    6GB

    SATA disk

    471 MB logiciel

    77sec

    Intel Core2 Duo

    2GB

    SATA disk

    3 GB logiciel

    14 min

    -
    -
    -
    -
    -
    -

    Quickstart - Pour l’utilisateur impatient

    -
    -
    -

    Ma première installation

    -

    Sans plus tarder, cette section fournira une démonstration rapide et -facile d’une installation entièrement automatique à l’aide du CD FAI et -d’une machine virtuelle.

    -

    Il suffit de télécharger l' image ISO du CD à partir de -https://fai-project.org/fai-cd et de démarrer votre VM à l’aide de ce CD. -Vous verrez un menu grub où vous pouvez choisir parmi différents types -d’installation.

    -

    Cette installation s’exécutera sans serveur d’installation. -L’installation à partir du CD est identique à celle exécutée dans un -environnement réseau à l’aide du serveur d’installation FAI, et peut être aussi -effectuée à l’aide d’une clé USB sur un ordinateur physique.

    -

    On peut aussi créer soi-même une image FAI (installation entièrement automatique) -à la page web https://fai-project.org/FAIme sans avoir besoin d’installer -FAI sur son ordinateur.

    -
    -
    -

    Ma première installation à l’aide d’un serveur

    -

    Nous allons créer un réseau privé et lancer deux machines vituelles. L’une -deviendra votre propre serveur FAI, l’autre sera un client d’installation.

    -

    Si vous avez l’intention d’utiliser VMware ou VirtualBox, assurez-vous -que votre client utilise une connexion réseau pontée (bridged network). -On trouve une description détaillée dans le wiki FAI -
    [https://wiki.fai-project.org/index.php/VirtualBox_for_your_first_FAI_installation]
    . -on ne peut pas utiliser des interfaces réseau pontées via le réseau sans -fil, car la plupart des cartes réseau WiFi ne prennent pas en charge -cette fonctionnalité.

    -

    Quand on utilise Qemu/KVM et le script fai-kvm on peut créer le réseau à l’aide de -la commande fai-mk-network. Il faut commencer par installer quelques paquets logiciels

    -
    -
    -
    # apt-get install qemu-system-gui qemu-kvm qemu-utils
    -
    -

    La commande ci-dessous met en place un réseau privé avec un pont logiciel et plusieurs -TAPs réseau -
    [https://fr.wikipedia.org/wiki/TAP_r%C3%A9seau]
    -appartenant à l’utilisateur <nom_d_utilisateur>.

    -
    -
    -
    fai-mk-network <nom_d_utilisateur>
    -
    -

    Après cela, vous pouvez utiliser fai-kvm (-h vous aidera) pour démarrer -des machines virtuelles en utilisant KVM qui sont connectés à ce réseau -privé. Faites attention. Par défaut, fai-kvm créera les images de disque -pour les machines virtuelles dans +/tmp+, qui est un disque RAM sur la plupart des -systèmes. Il n’y a aucun problème à créer une image de disque vide de -20G dans /tmp (même si cette partition est de 4 Go de taille), mais -alors que la VM écrit des données sur son disque, cela commencera à -consommer de l’espace dans +/tmp+.

    -

    Démarrez le premier hôte virtuel, qui deviendra le serveur FAI -
    [Cette installation utilisera environ 2GB d’espace dans /tmp.]
     :

    -
    -
    -
    fai-kvm -Vn -s20 -u 1 cd faicd64-small.iso
    -
    -

    Dans le menu grub; sélectionnez faiserver, using internal DHCP and a fixed IP. -Cela va installer -un hôte appelé faiserver avec IP 192.168.33.250 qui contient tous les -logiciels nécessaires pour un serveur FAI. Il configurera également un -cache de paquets local (en utilisant apt-cacher-ng). Une fois -l’installation terminée, redémarrez la machine. Lors du premier -démarrage du nouveau système, il configurera automatiquement le nfsroot. -Cela peut prendre quelques minutes.

    -

    Après cela, vous pouvez démarrer des hôtes supplémentaires en utilisant -un démarrage réseau. Pour chaque nouvel hôte, vous devez utiliser une -valeur différente pour +-u+, qui sera utilisée pour générer des -adresses MAC différentes et utiliser des noms de fichier d’image de -disque différents.

    -
    -
    -
    fai-kvm -Vn -u 2 pxe
    -
    -

    Ces clients d’installation vous montreront un menu, où vous pouvez -sélectionner le type d’installation que vous souhaitez effectuer. Si le -client d’installation ne trouve pas le serveur, c’est généralement parce -que fai-monitor n’y fonctionne plus. Cela peut se produire si vous -redémarrez le faiserver après l’installation. Pour remédier à cela, -exécutez simplement fai-monitor sur le faiserver et relancez le -démarrage du client.

    -

    Un autre client pourrait être lancé avec:

    -
    -
    -
    fai-kvm -Vn -u 3 pxe
    -
    -

    Vous pouvez démarrer autant de machines dans le réseau que de TAPs réseau -disponibles. Toutes ces machines peuvent se -connecter à l’Internet extérieur, mais sont seulement accessibles à -partir de votre machine hôte.

    -
    -
    -
    -
    -

    Vue d’ensemble et Concepts

    -
    -

    FAI est un système non interactif permettant d’installer, de -personnaliser et de gérer les configurations de systèmes et de logiciels -Linux sur les ordinateurs ainsi que sur les machines virtuelles et les -environnements chroot, des petits réseaux aux grandes infrastructures et -clusters. Vous pouvez prendre un ou plusieurs PC vierges, mettre sous -tension et après quelques minutes, Linux est installé, configuré et -fonctionnel sur l’ensemble du cluster, sans aucune interaction nécessaire. -Ainsi, il s’agit d’une méthode évolutive pour installer et mettre à jour -un cluster sans surveillance impliquant peu d’efforts. FAI utilise -le système d’exploitation Linux et une collection de scripts shell et -Perl pour le processus d’installation. Les modifications apportées aux -fichiers de configuration du système d’exploitation peuvent être -effectuées par des scripts CFEngine, shell (bash et zsh), Perl, Python, Ruby et -expect.

    -

    Les personnes intéressées par FAI sont des administrateurs système qui doivent -installer Linux sur une ou même des centaines d’ordinateurs. Parce qu’il -s’agit d’un outil d’installation à usage général, il peut être utilisé -pour l’installation d’un cluster Beowulf, d’une ferme de rendu ou -d’un laboratoire Linux ou d’une salle de classe. De plus, des réseaux -Linux de grande envergure avec différents matériels ou différentes -exigences d’installation sont faciles à établir à l’aide de FAI. Mais -n’oubliez pas de planifier votre installation. Le chapitre -[plan] contient quelques conseils utiles à ce sujet.

    -
    -

    Terminologie

    -

    Commençons par décrire quelques termes utilisés dans ce manuel.

    -
    -
    -Le serveur d’installation  -
    -
    -

    -Il fournit les services DHCP, TFTP et NFS ainsi que les données de -configuration pour tous les clients d’installation. Dans les exemples -de ce manuel, cet hôte s’appelle faiserver. C’est l’hôte où le paquet -faiserver est installé. -

    -
    -
    -Le client d’installation  -
    -
    -

    -Un hôte qui sera installé à l’aide de FAI et une configuration fournie -par le serveur d’installation. Aussi appelé client pour faire court. Dans -ce manuel, les hôtes d’exemple sont appelés demohost, xfcehost, -gnomehost … Cet ordinateur doit démarrer à partir de son interface -réseau à l’aide de PXE. -

    -
    -
    -Espace de configuration -
    -
    -

    -Une structure de sous-répertoire contenant plusieurs fichiers. Ces -fichiers décrivent les détails de la manière dont l’installation des -clients sera effectuée. Toutes les données de configuration sont -stockées là. Il est également appelé config space pour faire court. Il -comprend des informations sur : -

    -
      -
    • -

      -Organisation du disque dur dans un format similaire à fstab -

      -
    • -
    • -

      -Systèmes de fichiers locaux, leurs types, points de montage et options de montage -

      -
    • -
    • -

      -Paquets logiciels -

      -
    • -
    • -

      -Disposition du clavier, fuseau horaire, configuration Xorg, systèmes de fichiers distants, comptes utilisateurs, imprimantes … -

      -
    • -
    -

    Le package fai-doc inclut un exemple d’espace de configuration -incluant des exemples pour les hôtes utilisant l’environnement XFCE et -GNOME entre autres. En invoquant fai-mk-configspace on copie ces exemples vers -/srv/fai/config. Il est recommandé d’étudier ces fichiers de configuration et -ces scripts pour mieux comprendre comment FAI fonctionne.

    -
    -
    -nfsroot, NFS-Root  -
    -
    -

    -Un système de fichiers situé sur le serveur d’installation. Pendant le -processus d’installation, c’est le système de fichiers complet pour -les clients d’installation. Tous les clients partagent le même -nfsroot, qu’ils montent en lecture seule. Le nfsroot a besoin -d’environ 1.1Go d’espace disque libre. -

    -
    -
    -TFTP  -
    -
    -

    -Sert aux clients le fichier initrd et le noyau utilisés pour le processus -d’installation. Avec le système de fichiers servi par NFS, ces deux -composent un système d’exploitation temporaire dans lequel les installations sont -réalisées. -

    -
    -
    -Classes FAI  -
    -
    -

    -Les classes sont des noms qui déterminent quel fichier de -configuration est sélectionné. Si un client appartient à la classe -WEBSERVER, il sera configuré en tant que serveur Web, la classe -DESKTOP pour, par exemple, déterminer les paquets logiciels qui seront -installés. -

    -
    -
    -profil  -
    -
    -

    -Un profil FAI est juste une liste de classes FAI assignées à un nom de -profil, qui est étendu par une description de ce profil. C’est-à-dire -que l’on peut avoir deux profils "Webserver", l’un incluant la classe -APACHE, et un autre incluant la classe NGINX, pour ensuite installer la solution -de serveur web correspondante. -

    -
    -
    -les tâches  -
    -
    -

    -L’installation d’un client se compose de plusieurs parties, appelées -tâches. Les tâches sont des sous-programmes prédéfinis qui effectuent -une certaine partie de la FAI. Les tâches FAI suivantes sont exécutées -au cours d’une installation sur les clients d’installation. -

    -
    -
    -
    -
    -
    -
    -
    confdir               # trouver l'espace de configuration
    -setup                 # quelques initialisations, lancement de sshd à la demande
    -defclass              # définition des classes FAI
    -defvar                # définition de variables
    -action                # évaluer FAI_ACTION
    -install               # Démarrer l'installation
    -partition             # partitionner les disques durs, créer les systèmes de fichiers
    -mountdisks            # monter les systèmes de fichiers
    -extrbase              # extraire le fichier base.tar.xz
    -debconf               # pré-ensemencer le deconf de Debian
    -repository            # préparer l'accès aux dépôts de paquets
    -updatebase            # mettre en place les outils de gestion de paquets et mettre les paquets à jour
    -instsoft              # installer les paquets logiciels
    -configure             # lancer les scripts de personnalisation
    -finish                # faire un peu de ménage, afficher les statistiques d'installation
    -tests                 # appeler des tests s'il y en a
    -chboot                # lancer fai-chboot sur le serveur d'installation
    -savelog               # enregistrer les fichiers de journalisation localement et à distance
    -faiend                # redémarrage de l'hôte, éjection du CD si nécessaire
    -
    -
    -
    -
    -
    -
    -

    Voilà des tâches qui sont exécutées seulement lorsqu’on fait une action différente

    -
    -
    -
    dirinstall           # installer un environnement chroot
    -softupdate           # ne faire que la configuration du système
    -sysinfo              # imprimer une information système détaillée
    -inventory            # imprimer un inventaire court du matériel
    -
    -
    -
    -
    -

    Pour une description plus détaillée des tâches , voir [tasks].

    -

    Notez que vous n’êtes pas limité aux tâches FAI. Vous pouvez également -définir des programmes ou des scripts supplémentaires qui seront -exécutés à certaines occasions. On les appelle des hooks.

    -
    -
    -hooks -
    -
    -

    -Les Hooks sont des plugins, ils peuvent ajouter des fonctionnalités -supplémentaires au processus d’installation ou même remplacer des -tâches entières de FAI. Les Hooks sont expliqués en détail dans -[hooks]. -

    -
    -
    -
    -
    -

    Le concept de classe

    -

    Les classes sont utilisées dans presque toutes les tâches de -l’installation. Les classes déterminent quels fichiers de configuration -choisir parmi une liste d’alternatives disponibles. Pour déterminer les -fichiers de configuration à utiliser, FAI recherche dans la liste des classes -définies et utilise tous les fichiers de configuration correspondant à -un nom de classe
    [on peut aussi seulement utiliser le fichier de configuration -qui a la priorité la plus élevée, comme l’ordre des classes définit une -priorité de la plus basse à la plus élevée dans la liste des classes. ]
    . La boucle suivante -implémente cette fonction en pseudo-code shell :

    -
    -
    -
    for class in $all_classes; do
    -   if [ -r $config_dir/$class ]; then      # s'il exite un fichier nommé $class
    -      your_command $config_dir/$class      # invoquer une commande avec ce nom de fichier
    -      # sortir si on n'a besoin que du premier fichier qui convient
    -   fi
    -done
    -
    -

    La beauté de ceci c’est qu’on peut ajouter -une nouvelle alternative de configuration et qu’elle sera automatiquement -utilisée par FAI sans modifier le code, si le fichier de configuration -utilise un nom de classe.

    -

    C’est parce que la boucle détecte automatiquement les nouveaux fichiers -de configuration qui doivent être utilisés. L’idée d’utiliser des -classes en général et d’utiliser certains fichiers correspondant à un -nom de classe pour une configuration est adoptée à partir des scripts -d’installation par Casper Dik pour Solaris. Cette technique s’est avérée -très utile et facile.

    -

    Vous pouvez regrouper plusieurs hôtes partageant les mêmes fichiers de -configuration en utilisant la même classe. Vous pouvez également diviser -l’ensemble des données de configuration pour tous les clients en -plusieurs classes et les utiliser comme des briques de lego et -construire la configuration entière pour un seul client en assemblant -les briques.

    -

    Si un client appartient à la classe A, on dit que la classe A -est définie pour ce client. Une classe n’a pas de valeur, elle est juste -définie ou indéfinie.

    -

    Les classes déterminent comment l’installation est effectuée. Par -exemple, un client d’installation peut être configuré pour obtenir le -bureau XFCE en y ajoutant simplement la classe XFCE . Naturellement, -des configurations plus granulaires sont également possibles. Par -exemple, les classes peuvent décrire comment le disque dur doit être -partitionné, elles peuvent définir quels paquets logiciels seront -installés, ou quelles étapes de personnalisation seront exécutées.

    -

    Souvent, une configuration client est juste créée en modifiant ou en ajoutant -les classes auxquelles ce client appartient, ce qui rend -l’installation d’un nouveau client très facile. Ainsi, aucune -information supplémentaire ne doit être ajoutée à l’espace de -configuration si les classes existantes suffisent à vos besoins.

    -

    Comme vous pouvez le voir, les classes sont un pilier central de la -personnalisation de votre espace de configuration et de celui de -de votre client d’installation. Pour définir vos propres classes, reportez-vous à -[defining classes].

    -
    -
    -
    -
    -

    Configurer votre faiserver

    -
    -

    Voici comment configurer le serveur d’installation en quelques minutes. -Les étapes suivantes sont nécessaires :

    -
      -
    1. -

      -Configurer le serveur d’installation -

      -
        -
      1. -

        -Installer les paquets de FAI -

        -
      2. -
      3. -

        -Créer le nfsroot -

        -
      4. -
      5. -

        -Copier les exemples dans l’espace de configuration -

        -
      6. -
      7. -

        -Configurer les démons réseau -

        -
      8. -
      9. -

        -Créer les configurations PXELINUX -

        -
      10. -
      -
    2. -
    3. -

      -Démarrage et installation des clients -

      -
    4. -
    -
    -

    Installer les paquets FAI

    -
      -
    • -

      -Installer la clé du dépôt de paquets du projet FAI. -

      -
    • -
    • -

      -Ajouter l’URL du dépôt de paquets du projet FAI. -

      -
    • -
    • -

      -Installer le paquet fai-quickstart sur le serveur d’installation. -

      -
    • -
    -

    Utilisez ces commandes pour l’installation :

    -
    -
    -
    # wget -O /etc/apt/trusted.gpg.d/fai-project.gpg https://fai-project.org/download/2BF8D9FE074BCDE4.gpg
    -# echo "deb http://fai-project.org/download bookworm koeln" > /etc/apt/sources.list.d/fai.list
    -
    -

    ou

    -
    -
    -
    # apt install extrepo ; extrepo enable fai
    -
    -

    et ensuite :

    -
    -
    -
    # apt-get update
    -# aptitude install fai-quickstart
    -
    -

    Cela installera également les paquets pour les démons de serveur DHCP, -TFTP et NFS.

    -
    -
    -

    Créer le nfsroot

    -
      -
    • -

      -Activez également le dépôt de paquets du projet FAI dans un -autre fichier sources.list qui est utilisé lors de la construction du -nfsroot. Ensuite, activez l’utilisateur de journal pour FAI. -

      -
    • -
    -
    -
    -
    # sed -i -e 's/^#deb/deb/' /etc/fai/apt/sources.list
    -# sed -i -e 's/#LOGUSER/LOGUSER/' /etc/fai/fai.conf
    -
    -
      -
    • -

      -Par défaut, FAI utilise -http://httpredir.debian.org/ comme miroir -de paquets, qui va tenter de trouver un dépôt de paquets -rapide pour vous. -
      [Si vous voulez un miroir plus rapide, ajustez l’URL dans -/etc/fai/apt/sources.list et FAI_DEBOOTSTRAP dans -/etc/fai/nfsroot.conf avant de lancer fai-setup.]
      -Ensuite, on peut lancer fai-setup(8) -
      [Cela invoque fai-make-nfsroot(8) en interne.]
      -Et vérifiez si tout s’est bien passé. Le fichier de journal est écrit dans -/var/log/fai/fai-setup.log. -

      -
    • -
    -
    -
    -
    # fai-setup -v
    -
    -
    -
    -
    -
    FAI packages and related packages inside the nfsroot:
    -dracut             059-4
    -dracut-live        059-4
    -dracut-network     059-4
    -dracut-squash      059-4
    -fai-client         6.2
    -fai-nfsroot        6.2
    -fai-setup-storage  6.2
    -Waiting for background jobs to finish
    -fai-make-nfsroot finished properly.
    -Log file written to /var/log/fai/fai-make-nfsroot.log
    -Adding line to /etc/exports: /srv/fai/config 192.168.33.250/24(async,ro,no_subtree_check)
    -Adding line to /etc/exports: /srv/fai/nfsroot 192.168.33.250/24(async,ro,no_subtree_check,no_root_squash)
    -Reloading nfs-kernel-server configuration (via systemctl): nfs-kernel-server.service.
    -
    -Your initial config space is now located in /srv/fai/config
    -Please don't forget to fill out the FAI questionnaire after you've finished your project with FAI.
    -
    -FAI setup finished.
    -Log file written to /var/log/fai/fai-setup.log
    -
    -
      -
    • -

      -fai-setup a créé le LOGUSER, le nfsroot et a ajouté des lignes -supplémentaires à /etc/exports. Les sous-répertoires ajoutés à -/etc/exports sont exportés via NFS v3, de sorte que tous les clients -d’installation dans le même sous-réseau peuvent les monter via NFS. -

      -
    • -
    -
    -
    -

    Création de l’espace de configuration

    -

    Installez les exemples simples dans l’espace de configuration -
    [Il n’est pas nécessaires que ces fichiers appartiennent au compte root.]
    .

    -
    -
    -
    $ fai-mk-configspace
    -
    -

    Ces exemples contiennent la configuration pour certains hôtes d’exemple. -Selon le nom d’hôte utilisé, votre ordinateur sera configuré comme suit :

    -
    -
    -demohost -
    -
    -

    -Une machine qui n’a besoin que d’un petit disque dur. Cette machine -est configurée avec le réseau en tant que client DHCP, et une démo de -compte est créée. -

    -
    -
    -xfcehost -
    -
    -

    -Un bureau XFCE est installé, utilisant LVM, et la démo du compte est -créée. -

    -
    -
    -gnomehost -
    -
    -

    - Un bureau GNOME est installé et la démo du compte est créée. -

    -
    -
    -

    ubuntuhost::\n" -Un bureau Ubuntu sera installé et la démo du compte est créée.

    -
    -
    -autres noms d’hôtes -
    -
    -

    -Les hôtes disposant d’un autre nom d’hôte utiliseront notamment les -classes FAIBASE, DHCPC et GRUB. -

    -
    -
    -

    Tous les hôtes auront un compte appelé demo avec mot de passe fai. Le -compte root a également le mot de passe fai.

    -

    Si l’indicateur FAI menu est ajouté, au lieu d’utiliser le nom -d’hôte pour déterminer le type d’installation, un menu est présenté et -l’utilisateur peut choisir un profil pour l’installation.

    -
    -
    -

    Configurer les démons réseau

    -

    Pour démarrer le client d’installation via PXE, le serveur -d’installation a besoin d’un démon DHCP et d’un démon TFTP fonctionnels. -Le paquet fai-quickstart a déjà installé les paquets logiciels -pour ces démons. En outre, le paquet du serveur NFS pour -l’exportation du nfsroot et de l’espace de configuration a été installé.

    -
    -

    Configuration du démon DHCP

    -

    Idéalement, votre faiserver doit également être votre serveur DHCP. Si ce -n’est pas le cas, demandez à l’administrateur responsable du serveur -DHCP de le configurer conformément à cette section. Il est -possible d’éviter cela optionnellement en utilisant la fonctionnalité -[autodiscover] diffusée dans FAI 5.0.

    -

    Un exemple pour dhcpd.conf(5) est fourni avec le paquet fai-doc. -Commencez à utiliser cet exemple et regardez toutes les options qui y -sont utilisées.

    -
    -
    -
    # cp /usr/share/doc/fai-doc/examples/etc/dhcpd.conf /etc/dhcp/
    -
    -

    Les seules informations spécifiques FAI contenues dans ce fichier de -configuration sont d’assigner filename (DHCP option 67) à la valeur fai/pxelinux.0 et -d’assigner next-server (DHCP option 66, also aussi nommée TFTP server name) et server-name -à la valeur du nom de votre serveur d’install . Toutes les autres informations sont uniquement des -données liées au réseau, qui sont utilisées dans presque toutes les -configurations DHCP. Ajustez ces paramètres de réseau à vos besoins locaux.

    -
    -
    -
    deny unknown-clients;
    -option dhcp-max-message-size 2048;
    -use-host-decl-names on;
    -
    -subnet 192.168.33.0 netmask 255.255.255.0 {
    -   option routers 192.168.33.250;
    -   option domain-name "my.example";
    -   option domain-name-servers 192.168.33.250;
    -   option time-servers faiserver;
    -   option ntp-servers faiserver;
    -   server-name faiserver;
    -   next-server faiserver;
    -   filename "fai/pxelinux.0";
    -}
    -
    -

    Si vous apportez des modifications à la configuration DHCP, vous devez -redémarrer le démon.

    -
    -
    -
    # invoke-rc.d isc-dhcp-server restart
    -
    -

    Si vous disposez de plusieurs interfaces réseau, vous pouvez définir -l’interface que le serveur écoutera dans /etc/default/isc-dhcp-server. -Par défaut, le démon DHCP écrit ses messages de journalisation dans -/var/log/daemon.log.

    -
    -
    -

    Ajout d’une entrée d’hôte au DHCP

    -

    L’adresse MAC est donnée par le matériel de la carte réseau. Pour chaque -client d’installation, vous collectez son adresse MAC et l’associez à une -adresse IP et à un nom d’hôte. Tout d’abord, nous ajoutons l’adresse IP -et le nom d’hôte à /etc/hosts
    [On peut aussi ajouter cela dans son serveur de noms de domaine (DNS)]
    .

    -
    -
    -
    192.168.33.100    demohost
    -
    -

    L’association de l’adresse MAC à l’adresse IP est effectuée dans le fichier -dhcpd.conf. Ici, nous ajoutons une entrée d’hôte en utilisant la -commande +dhcp-edit(8)+ . Ici, vous devez remplacer 01:02:03:AB:CD:EF -avec l’adresse MAC que vous avez trouvé.

    -
    -
    -
    # dhcp-edit demohost 01:02:03:AB:CD:EF
    -
    -

    Après l’invocation de cette commande, voici à quoi l’entrée d’hôte dans -dhcpd.conf ressemblera :

    -
    -
    -
    host demohost {hardware ethernet 01:02:03:AB:CD:EF;fixed-address demohost;}
    -
    -
    -
    -

    TFTP

    -

    Normalement, vous n’avez pas besoin d’apporter de modifications à la -configuration démon TFTP. Les fichiers fournis par TFTP sont situés -dans /srv/tftp/fai.

    -
    -
    -

    NFS

    -

    La commande fai-setup a déjà configuré le démon NFS et ajouté -quelques lignes au fichier de configuration /etc/exports. Il exporte -les répertoires en utilisant NFS v3.

    -
    -
    -
    -

    Création de la configuration PXELINUX

    -

    La dernière étape avant de démarrer votre client pour la première fois -est de spécifier quelle configuration le client doit démarrer lors de -l’amorçage PXE. Nous utilisons la commande fai-chboot(8) pour -créer une configuration pxelinux pour chaque client d’installation. Cela -comprend des informations sur le noyau, le fichier initrd, l’espace de -configuration et certains paramètres d’amorçage. Vous devriez lire la -page de manuel, qui vous donne quelques bons exemples. Voici la commande -pour démarrer l’installation de l’hôte demohost.

    -
    -
    -
    $ fai-chboot -IFv -u nfs://faiserver/srv/fai/config demohost
    -
    -Booting kernel vmlinuz-4.19.0-5-amd64
    - append initrd=initrd.img-4.19.0-5-amd64 ip=dhcp
    -   FAI_FLAGS=verbose,sshd,createvt FAI_CONFIG_SRC=nfs://faiserver/srv/fai/config
    -
    -demohost has 192.168.33.100 in hex C0A82164
    -Writing file /srv/tftp/fai/pxelinux.cfg/C0A82164 for demohost
    -
    -

    À ce stade, vous devriez avoir une configuration faiserver de travail et -vos clients devraient démarrer dans FAI et être en mesure d’installer -l’un des exemples.

    -

    Dans la section suivante, vous pouvez lire la planification de votre -installation, adapter votre espace de configuration à vos besoins -particuliers et étendre FAI à l’aide de hooks.

    -
    -
    -

    Serveur personnalisé

    -

    Le faiserver et sa configuration n’est nullement statique. Il est possible -de personnaliser et d’étendre votre serveur. Pour cela, reportez-vous à -la section[Customizing your install server setup] dans [advanced]."

    -
    -
    -
    -
    -

    Planifiez votre installation

    -
    -

    Avant de commencer votre installation, vous devriez investir beaucoup de -temps dans la planification de votre installation. Une fois que vous -êtes satisfait de votre concept d’installation, FAI peut faire toutes -les tâches ennuyeuses et répétitives pour transformer vos plans en -réalité. FAI ne peut pas faire de bonnes installations si votre concept -est imparfait ou qu’il y manque quelques détails importants. Commencez à -planifier l’installation en répondant aux questions suivantes :

    -
      -
    • -

      -Est-ce que je vais créer un cluster Beowulf ou dois-je installer des machines de bureau ? -

      -
    • -
    • -

      -À quoi ressemble ma topologie LAN ? -

      -
    • -
    • -

      -Ai-je un matériel uniforme ? Le matériel sera-t-il uniforme à l’avenir ? -

      -
    • -
    • -

      -Le matériel a-t-il besoin d’un noyau spécial ? -

      -
    • -
    • -

      -Comment nommer les hôtes ? -

      -
    • -
    • -

      -Comment les disques durs locaux doivent-ils être partitionnés ? -

      -
    • -
    • -

      -Quelles applications seront lancées par les utilisateurs ? -

      -
    • -
    • -

      -Les utilisateurs ont-ils besoin d’un système de mise en file d’attente ? -

      -
    • -
    • -

      -Quels logiciels faut-il installer ? -

      -
    • -
    • -

      -Quels démons devraient être lancés, et à quoi devrait ressembler leur configuration ? -

      -
    • -
    • -

      -Quels systèmes de fichiers distants doivent être montés ? -

      -
    • -
    • -

      -Comment effectuer les sauvegardes ? -

      -
    • -
    -

    Vous devez également penser à des comptes d’utilisateur, des -imprimantes, un système de courrier, des travaux de cron, des cartes -graphiques, au double amorçage, au NIS, au NTP, au fuseau horaire, -à la disposition de clavier, à l’exportation et au montage des annuaires via -NFS et à beaucoup d’autres choses. Donc, il ya beaucoup à faire avant de -commencer une installation. Et rappelez-vous que la connaissance est le -pouvoir, et c’est à vous de l’utiliser. L’installation et -l’administration sont un processus et non un produit. FAI ne peut pas -faire les choses que vous ne lui dites pas de faire.

    -

    Mais vous ne devez pas commencer à partir de zéro. Examinez les fichiers -et les scripts dans l’espace de configuration. Il ya beaucoup de choses -que vous pouvez utiliser pour votre propre installation. Un bon article -intitulé « Bootstrapping an Infrastructure » avec d’autres aspects de la -construction d’une infrastructure est disponible sur -http://www.infrastructures.org/papers/bootstrap/bootstrap.html

    -
    -

    L’espace de configuration et ses sous-répertoires

    -

    L’espace de configuration est la collection des informations qui disent comment exactement -configurer un client. L’espace central de configuration pour tous les clients -d’installation est situé sur le serveur d’installation dans /srv/fai/config et ses -sous-répertoires. Il sera monté par les clients sous -/var/lib/fai/config. La commande princpale d’installation fai(8) utilise tous -ces sous-répertoires dans l’ordre listé sauf pour les hooks.

    -
    -
    -class/ -
    -
    -

    -Scripts et fichiers pour définir des classes et des variables. -

    -
    -
    -disk_config/ -
    -
    -

    -Fichiers de configuration pour le partitionnement de disque, RAID -logiciel, LVM et création de système de fichiers. -

    -
    -
    -basefiles/ -
    -
    -

    -Normalement , le fichier base.tar.xz (situé à l’intérieur du -nfsroot) est extrait sur le client d’installation après la création -des nouveaux systèmes de fichiers et avant l’installation des paquets. -Il s’agit d’une image de base minimale, créée juste après avoir appelé -debootstrap lors de la création du nfsroot sur le serveur -d’installation. Si vous voulez installer une autre distribution que celle -du nfsroot, vous pouvez mettre un fichier tar dans le sous-répertoire -basefiles/ et le nommer selon une classe. Ensuite, la commande -ftar(8) est utilisée pour extraire le fichier tar en fonction des -classes définies. Ainsi, le fichier doit être nommé CLASS.tar.xz -et non CLASS.base.tar.xz. Cela se fait dans la tâche extrbase. -Utilisez cette option si vous souhaitez installer une autre -distribution ou une version différente de celle exécutée pendant -l’installation. -

    -

    Ce fichier de base peut également être reçu en fonction des classes -FAI via HTTP/HTTPS ou FTP en définissant la variable FAI_BASEFILEURL. FAI -téléchargera un fichier CLASSNAME.tar.xz (ou tgz, ou tar.gz, …) à -partir de cette URL, si CLASSNAME correspond à une classe FAI.

    -

    Exemple :

    -
    -
    -
    -
    -
    FAI_BASEFILEURL=https://fai-project.org/download/basefiles/
    -
    -

    Le dossier doit prendre en charge la liste des répertoires. FAI ne -recherchera pas de fichiers potentiellement correspondants.

    -

    Voir le chapitre [otherdists] pour savoir comment -installer différentes distributions.

    -
    -
    -debconf/ -
    -
    -

    -Ce répertoire contient toutes les données debconf(7). Le format -est le même que celui utilisé par debconf-set-selections(1). -

    -
    -
    -package_config/ -
    -
    -

    -Les fichiers avec des noms de classe contiennent des listes de -paquets à installer ou à désinstaller par -install_packages(8). Les fichiers nommés <CLASS>.gpg sont ajoutés à la liste des clés utilisées par apt -pour les dépôts de paquets approuvés. -

    -
    -
    -pkgs/ -
    -
    -

    -Ce répertoire peut avoir des sous-répertoires nommés selon des classes. Vous pouvez -mettre des fichiers .deb ou .rpm dans ces sous-répertoires. FAI installera -ces paquets sans qu’il soit besoin de créer les métadonnées d’un dépôt de paquets. -

    -
    -
    -scripts/ -
    -
    -

    -Scripts pour la personnalisation de votre site local. Utilisé par -fai-do-scripts(1). -

    -
    -
    -files/ -
    -
    -

    -Les Fichiers utilisés par les scripts de personnalisation. La plupart -des fichiers se trouvent dans un sous-répertoire qui -reflète l’arborescence de répertoires ordinaire. Par exemple, les -modèles de _nsswitch.conf_ se trouvent dans -$FAI/files/etc/nsswitch.conf et sont nommés en fonction des classes -auxquelles ils doivent correspondre : -$FAI/files/etc/nsswitch.conf/NIS est la version de -/etc/nsswitch.conf à utiliser pour la classe NIS. Notez que le -contenu du répertoire n’est pas automatiquement copié sur la machine -cible, mais qu’il doit être explicitement copié par des scripts de -personnalisation à l’aide de la commande fcopy(8). -

    -
    -
    -hooks/ -
    -
    -

    -Les hooks sont des programmes ou des scripts définis par -l’utilisateur, qui sont lancés pendant le processus d’installation. -Ils peuvent étendre ou remplacer les tâches par défaut. Le nom du -fichier doit être de format taskname.CLASSNAME[.sh]. Un hook appelé -updatebase.DEBIAN est exécuté avant la tâche -updatebase et seulement si l’installation du client fait partie de -la classe DEBIAN. -

    -
    -
    -
    -
    -

    Définition des classes

    -

    Il existe différentes possibilités pour définir des classes :

    -
      -
    1. -

      -Certaines classes par défaut sont définies pour chaque hôte : DEFAULT, LAST et son nom d’hôte. -

      -
    2. -
    3. -

      -Les classes peuvent être répertoriées dans un fichier (par défaut dans class/<hostname>). -

      -
    4. -
    5. -

      -Les classes peuvent être dynamiquement définies par des scripts. -

      -
    6. -
    -

    La dernière option est une fonctionnalité très intéressante, puisque ces -scripts définiront des classes d’une façon très souple. Par exemple, -plusieurs classes peuvent être définies uniquement si certains matériels -sont identifiés ou si une classe est définie en fonction des -informations du sous-réseau.

    -

    Tous les noms de classes, sauf le nom d’hôte, sont écrits en -majuscules. Ils ne doivent pas contenir de trait d’union, de dièse, de -point-virgule ni de point, mais peuvent contenir des caractères de -soulignement et des chiffres.

    -

    La tâche defclass appelle la commande fai-class(1) pour définir -les classes. Tous les scripts correspondant à l’expression ^[0-9][0-9]* (qui -commencent avec deux chiffres) Dans le sous-repertoire $FAI/class sont -exécutés afin de définir les classes. Tout ce qui is affiché sur STDOUT -est automatiquement defini comme une classe. Pour plus d’informations -sur Les définitions de classe , lire les pages de manuel de -fai-class(1). Le script 50-host-classes (voir ci - dessous la -version allégée) est utilisé pour les définir des classes en fonction du -nom d’hôte.

    -
    -
    -
    # use a list of classes for our demo machines
    -case $HOSTNAME in
    -    demohost)
    -        echo "FAIBASE GRUB DEMO" ;;
    -    xfcehost)
    -        echo "FAIBASE GRUB DEMO XORG XFCE LVM";;
    -    faiserver)
    -        echo "FAIBASE DEBIAN DEMO FAISERVER" ;;
    -    ubuntuhost)
    -        echo "FAIBASE DEBIAN DEMO UBUNTU JAMMY JAMMY64 XORG";;
    -    *)
    -        echo "FAIBASE DEBIAN DEMO" ;;
    -esac
    -
    -

    Les noms d’hôtes doivent rarement être utilisé pour les fichiers de -configuration dans l’espace de configuration. Au lieu de ça, une classe doit -être définie et ensuite ajoutée pour un hôte donné. En effet, la plupart -du temps les données de configuration ne sont pas spécifiques à un nom -d’hôte, mais peuvent être partagées entre différents hôtes.

    -

    L’ordre des classes est important car celui-ci définit la priorité des -classes de faible à élevée.

    -
    -
    -

    Définition des Variables

    -

    La tâche defvar definit les variables pour le client d’installation. -Les variables sont définies par les scripts dans class/*.var. -Toutes les variables globales peuvent être définies dans DEFAULT.var. -Pour un groupe d’hôtes utiliser un fichier de classe. Pour un -hôte seul, utiliser le Fichier $HOSTNAME .var. Ici aussi, il est -utile d’étudier tous les exemples.

    -

    Les variables suivantes sont utilisées dans les exemples et peuvent aussi être -utiles pour votre installation :

    -
    -
    -FAI_ACTION -
    -
    -

    -Configure les actions que doit effectuer FAI. Normalement, ceci se fait -par fai-chboot(8). Si vous ne pouvez pas utiliser cette commande, -définissez cette variable dans le script LAST.var. -

    -
    -
    -FAI_ALLOW_UNSIGNED -
    -
    -

    -Si cette variable vaut 1, FAI permet l’installation de paquets à partir de -dépôts non signés. -

    -
    -
    -CONSOLEFONT -
    -
    -

    -La police de caractères qui est chargée lors de l’installation par -setfont(8). -

    -
    -
    -KEYMAP -
    -
    -

    -Définit les fichiers de disposition du clavier dans /usr/share/keymaps -et $FAI/files. Vous n’avez pas besoin de spécifier le chemin complet, -car ce fichier sera localisé automatiquement. -

    -
    -
    -ROOTPW -
    -
    -

    -Le mot de passe root chiffré pour le nouveau système. Vous pouvez -utiliser -crypt(3), md5 et d’autres types de hachage pour le mot de passe. Utilisez 'mkpasswd(1)+` -pour créer le hachage d’un mot de passe donné. Par exemple, pour -générer le hachage MD5 un mot de passe, utilisez : -

    -
    -
    -
    -
    -
    $ echo "votre_mot_secret" | mkpasswd -m yescrypt -s
    -
    -
    -
    -UTC -
    -
    -

    -Règle l’horloge matérielle à UTC si UTC=yes. Sinon, règle -l’horloge à l’heure locale. Voir clock(8) pour plus -d’informations. -

    -
    -
    -TIMEZONE -
    -
    -

    -C’est le fichier sous /usr/share/zoneinfo/ qui indique votre -fuseau horaire. Par exemple : TIMEZONE=Europe/Berlin. -

    -
    -
    -MODULESLIST -
    -
    -

    -Une liste des modules du noyau qui sont chargés pendant le démarrage -du nouveau système (écrits dans /etc/modules). -

    -
    -
    -
    -
    -

    Configuration du disque dur

    -

    L’outil setup-storage(8) lit un fichier dans $FAI/disk_config pour -la configuration du disque. Ce fichier décrit comment tous les disques -Locaux seront partitionnés, quels types de systèmes de fichiers -doivent etre créés (comme ext3/4, xfs, btrfs), et où ils seront montés. -Vous pouvez aussi créer des configurations RAID logiciel et LVM en -utilisant ce fichier de configuration. Il est aussi possible de préserver -le partitionnement du disque ou de préserver les -données sur certaines partitions.

    -

    Pendant le processus d’installation, tous les systèmes de fichiers -locaux sont montés sous le répertoire /target. Par exemple, si vous -spécifiez le point de montage /home dans un fichier de configuration -de disque, ce sera le répertoire /target/home pendant le processus -d’installation et ça deviendra /home pour le nouveau système installé.

    -
    -
    -

    Extraction du fichier de base

    -

    Un fichier de base n’est nécessaire que si on installe une distribution qui est -défférente de celle dans le nfsroot.

    -
    -
    -

    Pré-ensemencement Debconf

    -

    On peut utiliser le fomat décrit dans debconf-set-selections(1).

    -
    -
    -

    Accès au dépôt de paquets

    -

    FAI supporte http, https, et NFS pour l’accès au miroir de paquets. Réglez -la variable $FAI_DEBMIRROR pour l’utilisation de NFS.

    -
    -
    -

    Configuration des paquets logiciels

    -

    Avant l’installation de paquets, FAI va ajouter le contenu de tous -les fichiers nommés package_config/class.gpg à la liste des clés apt. -Si votre dépôt local est signé par votre keyid AB12CD34 vous pouvez -facilement ajouter cette clé, ainsi FAI l’utilisera pendant -l’installation. Utilisez cette commande pour créer le fichier -CLASS.gpg :

    -
    -
    -
    faiserver$ gpg --export AB12CD34 > /srv/fai/config/package_config/MYCLASS.gpg
    -
    -

    Le script install_packages(8) installe les logiciels sélectionnés. -Il lira tous les fichiers de configuration Dans $FAI/package_config -dont le nom correspond à une classe définie. La syntaxe est très simple.

    -
    -
    -
    # an example package class
    -
    -PACKAGES taskinst
    -german
    -
    -PACKAGES install-norec
    -adduser nmap
    -less zstd
    -
    -PACKAGES remove
    -gpm xdm
    -
    -PACKAGES install GRUB_PC
    -grub-pc
    -
    -

    Les commentaires commencent par une dièse (#) et se terminent à la fin de la -ligne. Chaque commande de paquet commence par le mot PACKAGES suivi -par un nom de commande, qui correspond à gestionnaire de paquets -distinct comme apt-get, aptitude ou dnf par exemple. la commande définit quelle -commande sera utilisé pour installer les paquets nommés après -cette commande. La liste de toutes les commandes disponibles peut -être listée en utilisant install_packages -H. Les gestionnaires de paquets pris -en charges sont aptitude, apt-get, smart, yast, dnf, rpm, zypper

    -
    -
    -hold -
    -
    -

    -Mettre un paquet en attente. Ce paquet ne sera pas pris en charge par -dpkg, pas exemple il ne sera pas mis à niveau. -

    -
    -
    -install -
    -
    -

    -Pour installer tous les paquets (en utilisant apt-get) qui sont précisés -dans les lignes suivantes. Si un tiret est ajouté au nom du paquet -(sans espace intermédiaire), le paquet sera supprimé, pas installé. -Tous les noms de paquets sont vérifiées pour les fautes de frappe. -Tout paquet qui n’existe pas, sera retiré de la liste des paquets à -installer. Soyez donc attentif à ne pas mal orthographier les -noms de paquets. -

    -
    -
    -install-norec -
    -
    -

    -Comme install, mais sans installer les paquets recommandés. -

    -
    -
    -remove -
    -
    -

    -Supprimer tous les paquets qui sont pécisés dans les lignes suivantes. -Si on ajoute un + au nom du paquet, le paquet doit être installé. -

    -
    -
    -taskinst -
    -
    -

    -Installer tous les paquets appartenant aux tâches qui sont spécifiées -dans les lignes suivantes à l’aide de tasksel(1). Vous pouvez -aussi utiliser aptitude pour installer les tâches. -

    -
    -
    -aptitude -
    -
    -

    -Installer tous les paquets avec la commande aptitude. Ce sera la -valeur par défaut à l’avenir et pourra remplacer apt-get et taskinst. -Aptitude peut aussi installer les tâches de paquets. -

    -
    -
    -aptitude-r -
    -
    -

    -Idem aptitude avec l’option --with-recommends. -

    -
    -
    -unpack -
    -
    -

    -Télécharger les paquets et les décompresser seulement. Ne pas configurer les -paquets. -

    -
    -
    -dselect-upgrade -
    -
    -

    -Definir des sélections des paquets en utilisant les lignes suivantes puis -installer ou supprimer les paquets précisés. Ces lignes sont le résultat -de la commande dpkg --get-selections. Il est recommandé de ne pas -utiliser ce format, puisque cela spécifie aussi tous les -paquets qui sont installés seulement en raison d’une dépendance ou -d’une recommandation. Il vaut mieux juste spécifier le paquet que vous -voulez avoir, et de laisser FAI (et apt-get) résoudre les dépendances. -

    -
    -
    -

    Plusieurs lignes avec des listes de noms de paquets séparés par des -espaces suivent les directive PACKAGES. Toutes les dépendances sont -résolues. Les paquets avec suffixe - (par exemple, lilo-) seront -supprimés au lieu d’être installés. L’ordre des paquet n’a pas -d’importance. Si vous souhaitez installer des paquets d’une autre -version que la valeur par défaut, vous pouvez ajouter le nom de la -version au nom du paquet comme dans openoffice.org/etch-backports. -Vous pouvez également spécifier une certaine version comme apt=0.3.1. -Plus d’informations sur ces fonctionnalités sont décrites dans -aptitude(8).

    -

    On peut spécifier des paramètres supplémentaires pour le gestionnaire de paquets -en ajoutant des paires cle=valeur après PACKAGES <commande>. les paires clé, valeur -actuellement supportées sont release=<nom> qui ajoute -t <nom> durant -l’installation des paquets.

    -

    Exemple:

    -
    -
    -
    PACKAGES install-norec release=testing
    -nvidia-smi
    -
    -

    Cela installerait le paquet nvidia-smi de la distribution testing, -en incluant les dépendances. N’oubliez pas d’ajouter une entrée dans -sources.list. Vous pouvez aussi vouloir ajuste l’épinglage apt (apt pinning) -(voir apt_references(5))

    -

    Une ligne qui contient la commande PRELOADRM, télécharge un fichier à -l’aide de wget(1) dans un répertoire avant d’installer les paquets. -À l’aide d’une URL de type file:, ce fichier est copié de $FAI_ROOT vers le -répertoire de téléchargement. Par exemple, le paquet realplayer a -besoin d’une archive pour installer le logiciel, donc cette archive est -téléchargée dans le répertoire /root. Après l’installation des -paquets, ce fichier sera supprimé. Si le fichier ne doit pas être -supprimé, utilisez plutôt la commande PRELOAD.

    -

    On peut ajouter une expression booléenne arbitraire qui utilise des classes FAI pour -définir quand la liste des paquets devrait être installée. Ici, les -paquets seront installés seulement si la classe XORG est définie mais la classe -MINT n’est pas définie.

    -

    Exemple:

    -
    -
    -
    PACKAGES install UBUNTU && XORG && ! MINT
    -ubuntu-standard
    -ubuntu-desktop
    -
    -

    L’ancienne façon d’ajouter des expressions logiques dans les lignes PACKAGES est encore valable : -Il est possible d’ajouter une liste de noms de classes après la commande pour -apt-get. Ainsi une telle commande PACKAGES sera exécutée seulement au moins -une des classes correspondantes est définie (OU logique). On peut donc combiner -plusieurs petits fichiers dans le fichier DEFAULT.

    -

    Si vous souhaitez supprimer un nom de paquet d’une certaine classe -faisait partie de cette classe précédemment, vous ne devez pas supprimer le -nom du paquet classe, mais plutôt de lui ajouter un tiret (-). Cela -garantira que le paquet soit enlevé pendant une mise a jour sur des hôtes -qui étaient installés en utilisant l’ancienne définition de classe qui -comprenait ce nom de paquet.

    -

    Si vous spécifiez un paquet qui n’existe pas, ce paquet sera supprimé -automatiquement de la liste d’installation uniquement si la commande -install est utilisée.

    -

    Le concept de priorité des classes permet à une classe de priorité plus élevée (qui -arrive plus tard dans la séquence des classes) d’écraser les sélections des -paquets de priorité plus basse. Pour que cela fonctionne correctement, -les classes de priorité plus élevée doivent utiliser les mêmes commandes PACKAGES (par exemple -PACKAGES install-norec au lieu de seulement PACKAGES install) que celles qu’utilisent -la classe qu’on essaie d’écraser. Cela est utile pour supprimer -l’installation d’un paquet, par exemple, pour éviter d’installer le paquet -linuxlogo installé par la classe FAIBASE :

    -
    -
    -
    # exemple montrant comment écraser :
    -#
    -# Dans FAIBASE il y a :
    -#    PACKAGES install-norec
    -#    linuxlogo
    -#
    -# On veut _ne pas_ installer linuxlogo, et il se trouve dans
    -# une section install-norec, donc il faut aussi utiliser install-norec.
    -
    -PACKAGES install-norec
    -linuxlogo-
    -
    -
    -
    -

    Scripts de personnalisation

    -

    La commande fai-do-scripts(1) est lancée pour exécuter tous les -scripts dans ce répertoire. Si un répertoire avec un nom de classe -existe, tous les scripts correspondant à l’expression ^[0-9][0-9]* sont exécutés -par ordre alphabétique. Il est donc possible d’utiliser des scripts de -différentes langages (shell, cfengine, Perl, Python, Ruby, expect,..) -pour une classe.

    -

    Ces scripts écrivent leur sortie standard dans scripts.log. Le fichier status.log -contient les noms de tous les scripts exécutés et leur statut de terminaison.

    -
    -

    Scripts shell

    -

    La plupart des scripts sont des scripts Bourne shell. Les scripts shell -sont utiles si la tâche de configuration n’a besoin d’appeler que -quelques commandes shell ou créer un fichier à partir de zéro. Afin d’éviter -d’écrire beaucoup de scripts courts, il est possible d’utiliser la -commande ifclass pour tester si certaines classes sont définies.

    -
    -
    -
    ifclass -o A B C
    -
    -

    Vérifie si l’une des classes A, B ou C est définie. L’utilisation de -a -(ET, AND logique) vérifie si toutes les classes d’une liste sont définies. -La commande ifclass C vérifie si seule la classe C est définie.

    -

    Pour copier des fichiers avec des classes, utilisez la commande -fcopy(8). Si vous voulez extraire une archive à l’aide de classes, -utilisez ftar(8). Pour ajouter des lignes à un fichier de -configuration, utilisez ainsl(1) au lieu de simplement -echo string >> filename.

    -

    FAI prend également en charge les scripts zsh(1) pendant la tâche de -personnalisation. Dans les scripts, la variable $classes contient -une liste séparée par des espaces avec les noms de toutes les classes -définies.

    -
    -
    -

    Scripts cfengine

    -

    CFEngine dispose d’un riche ensemble de fonctions pour modifier les -fichiers de configuration existants, par exemple LocateLineMatching, -ReplaceAll, InsertLine, AppendIfNoSuchLine, HashCommentLinesContaining. -Mais il ne peut pas traiter les variables qui sont indéfinies. Si une -variable n’est pas définie, l’ensemble du script cfengine s’arrêtera.

    -

    On peut trouver plus d’informations dans la page de manuel -cfengine(8) ou sur la page d’accueil de cfengine -https://www.cfengine.com.

    -
    -
    -
    -

    Les hooks, les « crochets »

    -

    Les crochets (hooks) vous permettent de spécifier des fonctions ou des programmes -qui sont exécutés à certaines étapes du processus d’installation. Avant -qu’une tâche soit appelée, FAI recherche les crochets existants pour cette -tâche et les exécute. Comme on peut s’y attendre, les classes sont -également utilisées lors de l’appel de hooks. Les hooks sont exécutés -pour chaque classe définie. Il vous suffit de créer le hook avec le nom -de la classe désirée et il sera utilisé. Si plusieurs hooks pour une -tâche existent, ils sont appelés dans l’ordre défini par les classes. Si -debug est inclus dans $FAI_FLAG l’option -d est passée à tous -les hooks, donc vous pouvez déboguer vos propres hooks. Si certaines -tâches par défaut doivent être ignorées, utilisez la sous-routine -skiptask et une liste de tâches par défaut comme paramètres. Dans les -exemples fournis, les hooks de la classe CENTOS ignorent certaines -tâches spécifiques de Debian.

    -

    Le répertoire $FAI/hooks/ contient tous les hooks. Un hook est un -fichier exécutable qui est nommé selon la tâche : taskname.CLASSNAME[.sh] -(par exemple, repository.CENTOS ou savelog.LAST.sh). Le nom de tâche -spécifie quelle tâche précède l’exécution de ce hook, si la -classe spécifiée est définie pour le client d’installation. -Voir la section [tasks] pour une liste complète des tâches -par défaut qu’on peut utiliser.

    -

    Un hook du formulaire hookprefix.classname ne peut pas définir de -variables pour le script d’installation, car il s’agit d’un -sous-processus. Mais vous pouvez utiliser n’importe quel exécutable -binaire ou n’importe quel script que vous avez écrit. Les hooks qui ont -le suffixe .sh (par exemple, partition.DEFAULT.sh) doivent être des -scripts Bourne shell et sont sourcé. Il est donc possible de redéfinir -des variables pour les scripts d’installation.

    -

    Dans la première partie de FAI, tous les hooks avec le préfixe confdir -sont appelés. Ces hooks ne peuvent pas être localisés dans l’espace de -configuration, car il n’est pas encore disponible. Par conséquent, ces -hooks sont les seuls hooks situés dans $nfsroot/$FAI/hooks sur le -serveur d’installation. Tous les autres hooks se trouvent dans -$FAI_CONFIGDIR/hooks sur le serveur d’installation.

    -

    Tous les hooks appelés avant la définition des classes peuvent -utiliser uniquement les classes suivantes: DEFAULT $HOSTNAME LAST. Si un hook -pour la classe DEFAULT doit être appelé uniquement dans le cas où aucun hook pour -la classe $HOSTNAME n’est disponible, insérez ces lignes dans le hook -par défaut :

    -
    -
    -
    hookexample.DEFAULT:
    -
    -#! /bin/sh
    -
    -# sauter le hook DEFAULT s'il existe un hook pour $HOSTNAME
    -scriptname=$(basename $0 .DEFAULT)
    -[-f $FAI/hooks/$scriptname.$HOSTNAME ] && exit
    -# suivent alors les actions pour la classe DEFAULT
    -.
    -.
    -
    -

    Quelques exemples de ce à quoi les hooks pourraient être utiles :

    -
      -
    • -

      -Charger les modules du noyau avant que les classes soient définies dans $FAI/class. -

      -
    • -
    • -

      -Envoyer un courriel à l’administrateur si l’installation est terminée. -

      -
    • -
    • -

      -Installer un client sans disque et sautez le partitionnement de disque local. -

      -
    • -
    • -

      -Jeter un œil à hooks/debconf.IMAGE pour savoir comment cloner une machine en utilisant une image de système de fichiers. -

      -
    • -
    -
    -
    -

    Options (flags) de FAI

    -

    La variable $FAI_FLAGS contient une liste d’options séparées par des -espaces. Les options sont normalement définies dans le fichier pxelinux.cfg qui -est censément créé par fai-chboot(1). Les options suivantes sont connues :

    -
    -
    -verbose -
    -
    -

    -Rend l’installation verbeuse. Cela doit toujours -être la première option (le premier flag), de sorte que les définitions suivantes des -options soient affichées verbeusement. -

    -
    -
    -debug -
    -
    -

    -Afficher des informations de débogage. Aucune installation sans assistance -n’est effectuée. Pendant l’installation du paquet, vous devez répondre -à toutes les questions des scripts postinstall sur la console du -client. Beaucoup d’informations de débogage seront affichées. Cette option -n’est utile que pour les développeurs FAI. -

    -
    -
    -sshd -
    -
    -

    -Démarrer le démon ssh pour activer les connexions à distance. Vous -pouvez ensuite vous connecter en tant que root à tous les clients -d’installation pendant l’installation. Le mot de passe par défaut est -fai et peut être modifié en définissant FAI_ROOTPW dans -nfsroot.conf(5). Pour vous connecter à partir de votre serveur vers le -client d’installation (nommé demohost dans cet exemple), utilisez : -

    -
    -
    -
    -
    -
    $ ssh root@demohost
    -Warning: Permanently added 'demohost,192.168.33.100' to the list of known hosts.
    -root@demohost's password:
    -
    -

    Ce n’est le mot de passe root que pendant le processus d’installation, -pas pour le nouveau système installé. Vous pouvez également vous -connecter sans mot de passe lorsque vous utilisez $SSH_IDENTITY.

    -
    -
    -createvt -
    -
    -

    -Créez deux terminaux virtuels et exécutez un bash si ctrl-c est tapé -dans le terminal de console. Vous pouvez accéder aux terminaux -supplémentaires en tapant Alt-F2 ou Alt-F3. Sinon, aucun terminal -n’est disponible et la saisie ctrl-c va redémarrer le client -d’installation. La définition de cette option est utile pour le débogage. -Si vous voulez une installation qui ne soit pas interruptible, -ne définissez pas cette option. -

    -
    -
    -menu -
    -
    -

    -Cela active un menu utilisateur pour sélectionner un profil. Tous les -fichiers class/*.profile sont lus et un menu basé sur curses -sera créé. -

    -
    -
    -screen -
    -
    -

    -Lancer FAI dans une session screen(1). La session est nommée FAI. -Si on se connecte via ssh à distance on peut se rattacher à la session en utilisant : -

    -
    -
    -
    -
    -
    $ screen -x
    -
    -
    -
    -tmux -
    -
    -

    -Lancer FAI dans une session tmux(1). La session est nommée FAI. -Si on se connecte via ssh à distance on peut se rattacher à la session en utilisant : -

    -
    -
    -
    -
    -
    $ tmux attach
    -
    -
    -
    -reboot -
    -
    -

    -Redémarrer le client d’installation une fois l’installation terminée -sans taper Entrée sur la console. Si cette option n’est pas définie, et -que error.log contient quelque chose, le client d’installation -s’arrêtera et attendra que vous appuyez sur Entrée. Si aucune erreur -ne s’est produite, le client redémarrera toujours -automatiquement. -

    -
    -
    -halt -
    -
    -

    -Arrêter le client d’installation à la fin de l’installation, au lieu -de redémarrer dans le nouveau système. -

    -
    -
    -initial -
    -
    -

    -Utilisé par setup-storage(8). Les partitions marquées avec -preserve_reinstall sont préservées à moins que cette option ne soit -définie. Souvent, cette option est définie dans un fichier class/*.var en -utilisant le paramètre flag_initial=1. -

    -
    -
    -
    -
    -
    -
    -

    FAI installe votre planification

    -
    -
    -

    La première phase d’une installation

    -

    Après le démarrage du noyau, on monte le système de fichiers racine via -NFS à partir du serveur d’installation et on démarre le script -/usr/sbin/fai
    [Comme le système de fichiers racine des clients -est monté via NFS, fai se situe dans /srv/fai/nfsroot/usr/sbin sur le -serveur d’installation.]
    . Ce script contrôle la séquence de -l’installation. Aucun autre script dans /etc/init.d/ n’est utilisé.

    -

    L’espace de configuration est rendu disponible via la méthode configurée -(un montage NFS par défaut) depuis le serveur d’installation vers le chemin défini -dans $FAI
    [$FAI est une variable interne utilisée par les scripts FAI. -Le chemin par défaut est /var/lib/fai/config.]

    -
    -
    -

    Messages de démarrage

    -

    Lorsqu’on démarre le client d’installation à partir de la carte -réseau avec PXE, on voit des messages comme ceci :

    -
    -
    -
    Managed PC Boot Agent (MBA) v4.00
    -Pre-boot eXecution Environment (PXE) v2.00
    -DHCP MAC ADDR: 00 A2 A3 04 05 06
    -DHCP.../
    -
    -CLIENT MAC ADDR: 00 A2 A3 04 05 06  GUID: 3D6C4552
    -CLIENT IP: 192.168.33.100 MASK: 255.255.255.0  DHCP IP: 192.168.33.250
    -GATEWAY IP: 192.168.33.1
    -
    -!PXE entry point found (we hope) at 9854:0106 via plan A
    -UNDI code segment at: 9854 len 5260
    -UNDI data segment at: 921D len 63A2
    -Getting cached packet  01 02 03
    -My Ip address seems to be C0A82164 192.168.33.100
    -ip=192.168.33.100:192.168.33.250:192.168.33.1:255.255.255.0
    -BOOTIF=01-00-A2-A3-04-05-06
    -SYSUUID=
    -TFTP prefix: fai/
    -Trying to load pxelinux.cfg/C0A82164
    -
    -Loading vmlinuz-6.1.0-17-amd64..................
    -Loading initrd.img-6.1.0-17-amd64......................ready.
    -
    -

    À ce stade, le client d’installation a réussi à recevoir la configuration -réseau via DHCP, le noyau et le fichier initrd via TFTP. Il démarre maintenant Le -noyau Linux et met en place initrd. Si tout se passe bien, l’initrd monte -le nfsroot
    [/srv/fai/nfsroot depuis le serveur d’installation via NFS]
    -et les scripts FAI sont lancés. La première -chose qu’on voit est le message de copyright en rouge de FAI.

    -
    -
    -
                 -------------------------------------------------
    -                   Fully Automatic Installation  -  FAI
    -
    -                   6.2           (c) 1999-2024
    -                   Thomas Lange  <lange@cs.uni-koeln.de>
    -             -------------------------------------------------
    -
    -Calling task_confdir
    -Kernel currently running: Linux 6.1.0-17-amd64 x86_64 GNU/Linux
    -Kernel parameters: BOOT_IMAGE=vmlinuz-6.1.0-17-amd64 initrd=initrd.img-6.1.0-17-amd64 \
    -  ip=dhcp rw root=192.168.33.250:/srv/fai/nfsroot rootovl FAI_FLAGS=verbose,sshd,createvt
    -  FAI_ACTION=install FAI_CONFIG_SRC=nfs://faiserver/srv/fai/config
    -Reading /tmp/fai/boot.log
    -FAI_FLAGS: verbose sshd createvt
    -Monitoring to server faiserver enabled.
    -FAI_CONFIG_SRC is set to nfs://faiserver/srv/fai/config
    -Configuration space faiserver:/srv/fai/config mounted to /var/lib/fai/config
    -Source hook: setup.DEFAULT.sh
    -setup.DEFAULT.sh     OK.
    -Calling task_setup
    -FAI_FLAGS: verbose sshd createvt
    -Press ctrl-c to interrupt FAI and to get a shell
    -Starting FAI execution - 20240117_194012
    -Calling task_defclass
    -fai-class: Defining classes.
    -Executing /var/lib/fai/config/class/01-classes.
    -01-classes           OK.
    -Executing /var/lib/fai/config/class/10-base-classes.
    -10-base-classes      OK.
    -Executing /var/lib/fai/config/class/20-hwdetect.sh.
    -ens3             UP             52:54:00:11:23:01 <BROADCAST,MULTICAST,UP,LOWER_UP>
    -ens3             UP             192.168.33.101/24 fe80::5054:ff:fe11:2301/64
    -New disklist: vda
    -20-hwdetect.sh       OK.
    -Executing /var/lib/fai/config/class/40-parse-profiles.sh.
    -40-parse-profiles.sh OK.
    -Executing /var/lib/fai/config/class/41-warning.sh.
    -41-warning.sh        OK.
    -Executing /var/lib/fai/config/class/50-host-classes.
    -50-host-classes      OK.
    -Executing /var/lib/fai/config/class/60-misc.
    -60-misc              OK.
    -Executing /var/lib/fai/config/class/85-efi-classes.
    -85-efi-classes       OK.
    -List of all classes:  DEFAULT LINUX AMD64 DHCPC FAIBASE DEBIAN DEMO GRUB_PC demohost2 LAST
    -
    -

    On peut également voir la liste des classes FAI, qui sont définies -pour cet hôte. Cette liste est très importante pour le reste de l’installation.

    -

    La première tâche est appelée confdir, qui est chargée de accès à -l’espace de configuration. Ici, on utilise un montage NFS depuis -le serveur d’installation comme on peut le voir sur la console (et plus tard -dans les journaux).

    -
    -
    -
    FAI_CONFIG_SRC is set to nfs://faiserver/srv/fai/config
    -Configuration space faiserver:/srv/fai/config mounted to /var/lib/fai/config
    -
    -

    Avant de lancer l’installation ($FAI_ACTION=install), l’ordinateur -émet trois bips. Donc, faites attention quand vous entendez trois bips -et que vous ne voulez pas effectuer une installation, ni laisser FAI -effacer toutes vos données sur Le disque local !

    -
    -
    -

    Redémarrage de l’ordinateur dans le nouveau système

    -

    Pour redémarrer l’ordinateur pendant ou à la fin de l’installation, vous -devez utiliser la commande faireboot de préférence à la commande de -redémarrage normal. Utilisez aussi faireboot si vous êtes connecté -à distance. Si l’installation n’est pas terminée, utilisez -faireboot -s, afin que les fichiers journaux soient aussi copiés sur le -serveur d’installation.

    -

    Si l’installation s’est bien terminée, l’ordinateur doit démarrer un petit -système Debian. Vous pouvez vous connecter en tant qu’utilisateur demo ou root -avec le mot de passe fai.

    -
    -
    -

    Démarrage de FAI (tâche confdir)

    -

    Une fois le client d’installation démarré, seul le script -/usr/sbin/fai est exécuté. Il effectuera une initialisation minimale. -La variable $FAI_CONFIG_SRC
    [Celle-ci est définie dans la ligne de commande du noyau]
    -est utilisée pour accéder à l’espace de configuration FAI qui est alors -disponible dans le répertoire $FAI
    [/var/lib/fai/config]
    . -FAI ne se fonctionnera pas sans l’espace de configuration.

    -

    On peut accéder à l’espace de configuration à l’aide de diverses méthodes. Les -méthodes supportées sont : nfs:, file:, cvs:, svn: git:, hg:, http: et detect:. -Voir fai.conf(5) pour une description détaillée de ces méthodes.

    -
    -
    -

    Définition de classes et de variables (tâches defclass et defvar)

    -

    La commande fai-class(1) exécute des scripts dans $FAI/class pour -définir des classes. Si les scripts écrivent une chaîne dans stdout, cela -sera défini comme une classe. Lisez tous les détails dans la page de -manuel de fai-class(1).

    -

    Après avoir défini les classes, chaque fichier correspondant à .var -avec un préfixe qui correspond à une classe définie est pris en compte pour -définir des variables. Il doit contenir du code shell valide.

    -
    -
    -

    Partitionnement des disques locaux, création des systèmes de fichiers (tâche partition)

    -

    Pour le partitionnement du disque, un fichier de configuration de disque -de $FAI/disk_config est sélectionné à l’aide de classes, et un seul.

    -

    Le format de la configuration du disque est similaire à un fichier fstab.

    -

    L’outil de partitionnement setup-storage(8) exécute toutes les -commandes nécessaires pour créer l’organisation des partitions du -disque, du RAID logiciel, du LVM et pour créer les systèmes de -fichiers. Lisez la page de manuel de setup-storage(8) pour une -description détaillée et quelques exemples du format.

    -
    -
    -

    Pré-ensemencement Debconf (tâche debconf)

    -

    Les fichiers dans $FAI/debconf sont utilisés par le système de pré-ensemencement -habituel de debconf(7) si les noms de fichier correspondent à un -nom de classe.

    -
    -
    -

    Installation de paquets logiciels (tâche instsoft)

    -

    La commande install_packages(8) lit les fichiers de configuration à -partir de $FAI/package_config d’une façon basée sur la classe et installe des paquets -logiciels sur le nouveau système de fichiers.

    -

    Elle installe les paquets en utilisant apt-get(8), aptitude(1), -yum ou d’autres gestionnaires de paquets sans besoin d’aucune interaction manuelle. -Les dépendances des paquets sont également résolues par les gestionnaires de paquets.

    -

    Le format des fichiers de configuration est décrit dans [packageconfig].

    -

    De plus, FAI installera les paquets (.deb or .rpm') depuis les -répertoires $FAI/pkgs/<CLASSNAME>.

    -
    -
    -

    Personnalisation spécifique au site (tâche configure)

    -

    Souvent, les configurations par défaut des paquets logiciels ne répondent pas à -vos besoins spécifiques au site. Vous pouvez appeler des scripts -arbitraires qui ajustent la configuration du système. Par conséquent, la -commande fai-do-scripts(1) exécute des scripts dans $FAI/scripts -d’une manière basée sur la classe. Il est possible d’avoir plusieurs -scripts de différents types (shell, cfengine, …) à exécuter pour une classe.

    -

    L’ensemble de scripts par défaut dans $FAI/scripts inclut des exemples -d’installation de machines Debian et Rocky Linux. Ils définissent le mot de -passe root, ajoutent un compte utilisateur (défini par $username, avec demo par défaut), -paramètrent le fuseau horaire, configurent le réseau avec DHCP ou en utilisant une adresse IP -fixe, configurent grub et plus encore. Ils devraient faire un -travail raisonnable pour votre installation. Vous pouvez les modifier ou -ajouter de nouveaux scripts pour répondre à vos besoins locaux.

    -

    Plus d’information sur ces scripts est disponible dans [cscripts].

    -
    -
    -

    Enregistrement des fichiers journaux (tâche savelog)

    -

    Lorsque toutes les tâches sont terminées, les fichiers journaux sont écrits dans -/var/log/fai/$HOSTNAME/install/ -
    [/var/log/fai/localhost/install/ est un lien vers ce répertoire.]
    -sur le nouveau système, et sur le compte sur le serveur d’installation si -$LOGUSER est défini (il faut l’activer dans /srv/fai/config/class/FAIBASE.var). -Il est également possible de spécifier un autre hôte comme destination pour cet enregistrement -à l’aide de la variable -$LOGSERVER. Si $LOGSERVER n’est pas défini, FAI utilise la -variable $SERVER qui n’est définie que lors d’une installation -initiale (par get-boot-info).

    -

    De plus, deux liens symboliques seront créés pour indiquer le dernier -répertoire où on a écrit. Le lien symbolique last pointe vers le répertoire -journal de la dernière action FAI exécutée. Les liens symboliques -last-install et last-sysinfo pointent vers le répertoire avec la -dernière action correspondante. Par défaut, les fichiers journaux seront -copiés sur le serveur de journalisation à l’aide de scp. Vous pouvez utiliser -la variable $FAI_LOGPROTO dans le fichier fai.conf(5) pour choisir -une autre méthode d’enregistrement des journaux sur le serveur distant. -Voici un exemple de structure de lien symbolique :

    -
    -
    -
    lrwxrwxrwx   1 fai fai   23 Dec  2  2013 last-sysinfo -> sysinfo-20131202_161237
    -drwxr-xr-x   2 fai fai 4096 Dec  2  2013 sysinfo-20131202_161237
    -drwxr-xr-x   2 fai fai 4096 Feb 14  2014 install-20140214_142150
    -drwxr-xr-x   2 fai fai 4096 Dec  2 11:47 install-20141202_113918
    -lrwxrwxrwx   1 fai fai   23 Dec  4 13:22 last-install -> install-20141204_131351
    -lrwxrwxrwx   1 fai fai   23 Dec  4 13:22 last -> install-20141204_131351
    -drwxr-xr-x   2 fai fai 4096 Dec  4 13:22 install-20141204_131351
    -
    -

    Vous trouverez des exemples de fichiers journaux à l’adresse https://fai-project.org/logs.

    -
    -
    -

    Redémarrage du nouveau système installé

    -

    Avant de redémarrer, le client d’installation appelle -fai-chboot -d <hostname> sur le serveur d’installation, pour -désactiver sa propre configuration PXELINUX. Sinon, il redémarrerait -l’installation lors de la prochaine initialisation. Normalement, cela -devrait démarrer le nouveau système installé à partir de son second -périphérique d’amorçage, le disque dur local.

    -

    À la fin, le système est automatiquement redémarré si "reboot" a été -ajouté à $FAI_FLAGS.

    -
    -
    -
    -
    -

    Sujets avancés pour FAI

    -
    -
    -

    Vérification des paramètres reçus des serveurs DHCP

    -

    Si le client d’installation démarre, vous pouvez vérifier si toutes les -informations provenant du démon DHCP sont correctement reçues. Les -informations reçues sont écrites dans /tmp/fai/boot.log. Un exemple de -résultat d’une requête DHCP peut être trouvé dans les fichiers journaux -d’exemple.

    -
    -
    -

    Surveillance de plusieurs clients d’installation

    -

    Vous pouvez surveiller l’installation de tous les clients d’installation -avec la commande fai-monitor(8). Tous les clients vérifient si ce -démon est en cours d’exécution sur le serveur d’installation (ou sur -l’ordinateur défini par la variable $monserver). Chaque fois qu’une -tâche démarre ou se termine, un message est envoyé. Le démon du moniteur -FAI envoie ces messages dans sa sortie standard. On peut aussi utiliser une interface -graphique, appelée fai-monitor-gui(1).

    -
    -
    -
    $  fai-monitor | fai-monitor-gui - &
    -
    -
    -
    -

    Collecte d’adresses Ethernet pour plusieurs hôtes

    -

    Vous devez collecter toutes les adresses Ethernet (MAC) des clients -d’installation et affecter un nom d’hôte et une adresse IP à chaque -client. Pour collecter les adresses MAC, démarrez vos clients -d’installation. Vous pouvez déjà le faire avant que n’importe quel démon -DHCP s’exécute dans votre sous-réseau. Ils échoueront à démarrer (en -raison de l’absence de DHCP ou de TFTP), mais vous pouvez toujours -collecter les adresses MAC.

    -

    Pendant que les clients d’installation démarrent, ils envoient des -paquets de diffusion (broadcast) au LAN. Vous pouvez enregistrer les adresses MAC de -ces hôtes en exécutant simultanément la commande suivante sur le serveur :

    -
    -
    -
    faiserver# tcpdump -qtel broadcast and port bootpc >/tmp/mac.list
    -
    -

    Une fois que les hôtes ont envoyés quelques paquets de diffusion, arrêtez tcpdump -en tapant ctrl-c. Vous obtenez une liste de toutes les adresses MAC uniques avec ces commandes :

    -
    -
    -
    faiserver$ perl -ane 'print "\U$F[0]\n"' /tmp/mac.list|sort|uniq
    -
    -

    Après cela, vous n’avez qu’à assigner ces adresses MAC aux noms d’hôte -et aux adresses IP (/etc/ethers et /etc/hosts ou aux associations NIS -correspondantes). Avec ces informations, vous pouvez configurer votre -démon DHCP (voir la section [bootdhcp]).
    [Je recommande d’inscrire -l’adresse MAC (les trois derniers octets devraient suffire si vous avez des cartes du -même vendeur) et le nom d’hôte devant chaque boîtier.]

    -
    -

    Débogage du trafic réseau

    -

    Si le client ne peut démarrer correctement à partir de la carte réseau, -utilisez tcpdump(8) pour rechercher des paquets Ethernet entre le -serveur d’installation et le client. Recherchez également dans les entrées de -plusieurs fichiers journaux venant de tftpd(8) et dhcpd(8) :

    -
    -
    -
    faiserver$ egrep "tftpd|dhcpd" /var/log/*
    -
    -
    -
    -
    -

    Détails du démarrage PXE

    -

    Ici, nous décrivons les détails du démarrage PXE, qui sont -nécessaires seulement si vous avez des problèmes lors du démarrage de vos -clients d’installation.

    -

    Presque toutes les cartes réseau modernes prennent en charge -l’environnement de démarrage PXE. PXE est l’environnement d’exécution de -pré-lancement. Cela nécessite le chargeur de démarrage PXELINUX et une -version spéciale du démon TFTP, disponibles dans les paquets Debian -pxelinux et tftpd-hpa. Le démarrage PXE nécessite également un -serveur DHCP, afin que la carte réseau puisse configurer ses paramètres -IP. Voici la séquence d’une amorce PXE :

    -
      -
    • -

      -La carte réseau du client envoie son adresse MAC -

      -
    • -
    • -

      -Le serveur DHCP répond par la configuration IP du client -

      -
    • -
    • -

      -La carte réseau configure son IP -

      -
    • -
    • -

      -Le client d’installation obtient le binaire pxelinux.0 via TFTP -

      -
    • -
    • -

      -Il obtient le fichier de configuration pxelinux.cfg/C0A8210C via TFTP -

      -
    • -
    • -

      -C0A8210C est l’adresse IP du client en hexadécimal -

      -
    • -
    • -

      -Cette configuration contient le noyau, le fichier initrd et les paramètres de ligne de commande supplémentaires du noyau, qui ont été créés par fai-chboot. -

      -
    • -
    • -

      -Il obtient le noyau et le fichier initrd via TFTP. -

      -
    • -
    -

    Exemple d’un fichier pxelinux.cfg :

    -
    -
    -
    default fai-generated
    -
    -label fai-generated
    -kernel vmlinuz-6.1.0-17-amd64
    -append initrd=initrd.img-6.1.0-17-amd64 ip=dhcp root=/srv/fai/nfsroot rootovl FAI_FLAGS=verbose,sshd,createvt FAI_CONFIG_SRC=nfs://faiserver/srv/fai/config FAI_ACTION=install
    -
    -

    Voir /usr/share/doc/syslinux/pxelinux.doc pour des informations plus -détaillées sur PXELINUX. FAI utilise le fichier binaire lpxelinux.0 qui -s’occupe du chargement du noyau et du fichier initrd via FTP -ou HTTP. La commande fai-chboot(8) prend cela en charge avec -l’option -U.

    -
    -
    -

    Personnaliser la configuration de son serveur d’installation

    -
      -
    • -

      -Miroir de paquets logiciels local/plus rapide -

      -
    • -
    • -

      -Loguser différent -

      -
    • -
    • -

      -Mot de passe root local dans nfsroot -

      -
    • -
    -

    La configuration du paquet FAI (et non les données de configuration pour -les clients d’installation) est définie dans fai.conf(5). Les -définitions qui sont utilisées uniquement pour créer le nfsroot sont -situées dans nfsroot.conf(5). Vérifiez ces variables importantes dans -nfsroot.conf avant d’appeler fai-setup ou fai-make-nfsroot.

    -
    -
    -FAI_DEBOOTSTRAP -
    -
    -

    -La construction du nfsroot utilise la commande debootstrap(8). Elle -a besoin de l’emplacement d’un miroir Debian et du nom de la -distribution (comme bullsseye, bookworm, sid) pour laquelle le système -Debian de base devrait être construit. N’utilisez pas de distributions -différentes ici et dans /etc/fai/apt/sources.list. Cela créerait un -nfsroot dysfonctionnel. -

    -
    -
    -NFSROOT_ETC_HOSTS -
    -
    -

    -Cette variable est nécessaire seulement si les clients n’ont pas accès à -un serveur DNS. Cette variable multiligne est ajoutée à /etc/hosts -dans le nfsroot. Ensuite, les clients d’installation peuvent accéder à -ces hôtes par leur nom sans utiliser DNS. -

    -
    -
    -

    Le contenu de /etc/fai/apt/sources.list est utilisé par le serveur -d’installation et aussi par les clients. Si votre serveur d’installation a -plusieurs cartes réseau et différents noms d’hôte pour chaque carte -(comme pour un serveur Beowulf), utilisez le nom du serveur -d’installation qui est connu des clients d’installation.

    -

    Si vous avez des problèmes lors de l’exécution de fai-setup, ils -proviennent habituellement de fai-make-nfsroot(8) qui est appelé par -la commande précédente. L’ajout de -v vous donne une sortie plus -détaillée qui vous aide à repérer l’erreur. La sortie est écrite dans -/var/log/fai/fai-make-nfsroot.log.
    [À des fins de débogage, -il peut être utile d’entrer dans l’environnement chroot à la main à l’aide -de cette commande : faiserver# chroot /srv/fai/nfsroot bash]

    -

    L’installation crée également le compte fai (défini par $LOGUSER) -s’il n’est pas déjà disponible. Vous pouvez donc ajouter un utilisateur -avant d’appeler fai-setup(8) à l’aide de la commande adduser(8) -et l’utiliser comme compte local pour enregistrer des fichiers journaux. Les -fichiers journaux de tous les clients d’installation sont enregistrés -dans le répertoire de personnel de ce compte. Vous devriez changer le groupe -principal de ce compte, afin que ce compte ait des droits d’écriture sur -/srv/tftp/fai afin d’appeler fai-chboot pour créer la configuration PXE -pour les hôtes.

    -

    Lorsque vous apportez des modifications à fai.conf, nfsroot.conf, le -nfsroot doit être reconstruit en appelant fai-make-nfsroot(8). Si -vous souhaitez uniquement installer un nouveau paquet de noyau sur -nfsroot, ajoutez les options -k ou -K à fai-make-nfsroot. Cela ne -recréera pas votre nfsroot, mais mettra à jour seulement vos noyaux et les -modules du noyau dans le nfsroot ou ajoutera des paquets supplémentaires -dans le nfsroot.

    -
    -
    -

    Création d’un CD ou d’une clé USB FAI

    -

    Vous pouvez facilement créer un CD d’installation (ou une clé USB) de -votre installation réseau. Cela permettra d’effectuer la même -installation et la même configuration à partir du CD sans avoir besoin -du serveur d’installation. Par conséquent, vous devez créer un miroir -partiel de tous les paquets Debian nécessaires à vos classes FAI (à -l’aide de fai-mirror(1)). Ensuite, la commande fai-cd(8) écrira -ce miroir, le nfsroot et l’espace de configuration sur un CD amorçable. -Et voilà !

    -

    Pour créer facilement le CD d’installation, on peut utiliser la commande suivante -(Pour plus de détails de configuration voir fai-cd(8)) :

    -
    -
    -
     faiserver# fai-cd -m <partialMirrorDir> fai-cd.iso
    -
    -

    Ce CD d’installation contient toutes les données nécessaires à -l’installation. La commande fai-cd(8) écrit le nfsroot, l’espace de -configuration et un sous-ensemble du miroir Debian sur un CD-ROM. Un -miroir de paquets partiel est créé à l’aide de la commande -fai-mirror(1) qui contient tous les paquetages utilisés par les -classes utilisées dans votre espace de configuration. Un échantillon -d’image ISO est disponible à l’adresse https://fai-project.org/fai-cd.

    -

    Avec la commande dd(1), vous pouvez également créer une clé USB -amorçable en écrivant simplement le contenu du fichier ISO sur votre clé -USB (ici la clé est /dev/sdf).

    -
    -
    -
     faiserver# dd if=fai-cd.iso of=/dev/sdf bs=1M
    -
    -

    mk-data-partition est un outil qui étend une image ISO (qui sera copiée -sur une clé USB) ou une clé USB contenant une image ISO avec -une partition ext4 ou exFAT et y place le label MY-DATA. -Cette partition est automatiquement montée dans /media/data par FAI. -On peut copier ses propres paquets .deb dans cette partition de données sous les -sous-répertoires pkgs/<CLASSNAME>. FAI installera alors ces paquets -si la classe équivalente est définie.

    -

    exemple d’usage de mk-data-partition:

    -
    -
    -
    # mk-data-partition -s 1G -c faicd-large.iso A B
    -
    -

    La commande ci-desus crée la partition de données avec une taille de 1 Go dans -le fichier ISO et y copie les répertoires A et B. On peut écrire l’image ISO modifiée -sur une clé USB.

    -

    Si l’image ISO est déjà sur la clé USB, qui est disponible sous -dev/sdf, on peut ajouter la partition de données de type exFAT qui utilisera -tout l’espace disponible de la clé USB en utilisant cette commande - :

    -
    -
    -
    # mk-data-partition -F /dev/sdf
    -
    -
    -
    -

    Création d’images de disque VM à l’aide de FAI

    -

    En utilisant la commande fai-diskimage(8), vous pouvez créer des -images de disques qui peuvent être utilisées avec une -machine virtuelle comme KVM, VMware, VirtualBox ou un service cloud -comme OpenStack, GCE, EC2 et autres. Le processus d’installation exécute -les tâches FAI normales sur une image de disque brut. Après -l’installation, vous pouvez démarrer l’image disque et avoir un système -fonctionnel. L’image disque peut également être convertie au format qcow2. -Vous n’avez pas besoin de mettre en place le nfsroot de FAI quand vous utilisez seulement -fai-diskimage. Mais vous avez besoin d’un fichier de base dans votre espace de -configuration. Le réglage de la variable $FAI_BASEFILEURL permet de télécharger automatiquement -un fichier de base approprié dans votre espace de configuration.

    -

    Voici par exemple comment créer une image de disque brute pour un hôte nommé -cloud3, avec un petit ensemble de paquets logiciels :

    -
    -
    -
    # export FAI_BASEFILEURL=https://fai-project.org/download/basefiles/
    -# fai-diskimage -vu cloud3 -S2G -cDEBIAN,BOOKWORM64,AMD64,FAIBASE,GRUB_PC,DHCPC,DEMO,CLOUD,LAST disk.raw
    -
    -

    Cette commande créera une image de disque nommée ubuntu.qcow2 pour une configuration de bureau Ubuntu 16.04 -avec pour nom d’hôte machin.

    -
    -
    -
    # export FAI_BASEFILEURL=https://fai-project.org/download/basefiles/
    -# cl=DHCPC,UBUNTU,JAMMY,JAMMY64,AMD64,XORG,LAST
    -# fai-diskimage -Nvu machin -S5G -c$cl ubuntu.qcow2
    -
    -

    Vous pouvez essayer quelques images de disques sans installer FAI, si vous visitez -https://fai-project.org/FAIme/cloud

    -
    -
    -

    Création d’une image vive amorçable

    -

    La création d’images ISO vives amorçables est facile avec FAI. Il suffit de deux -étapes. Premièrement, créez votre environnement vif à l’aide de la commande fai -dirinstall. N’oubliez pas d’ajouter la classe LIVEISO. -Ensuite, créez l’image ISO vive en utilisant fai-cd :

    -
    -
    -
    # cl="DEBIAN,BOOKWORM64,AMD64,FAIBASE,XFCE,XORG,DHCPC,DEMO,LIVEISO,LAST"
    -# LC_ALL=C fai -v dirinstall -u xfce33 -c $cl \
    -    -s file:///srv/fai/config /srv/xfce
    -# fai-cd -s500 -MH -d none -g /etc/fai/grub.cfg.live \
    -    -n /srv/xfce live.iso
    -
    -

    Le nfsroot n’est pas nécessaire pour une image ISO vive. -Il n’y a pas actuellement d’image vive ISO disponible sur le serveur d’installation.

    -
    -
    -

    Construire des images disque d’architecture différente (cross-architecture)

    -

    À partir de FAI 5.4 il devient possible de construire une image disque pour -des architectures différentes de l’hôte qui est utilisé. Par exemple on peut -construire une image pour une architecture ARM 64-bit (aarch64) sur un hôte qui fonctionne -sur une architecture amd64. Voici les étapes successives :

    -
    -
    -
    # apt install qemu-system-arm qemu-user-static fai-server fai-setup-storage fai-doc qemu-utils
    -# fai-mk-configspace
    -
    -# export FAI_BASEFILEURL=https://fai-project.org/download/basefiles/
    -# fai-diskimage -vu armhost -S2G -cDEFAULT,DHCPC,DEBIAN,ARM64,BUSTER_ARM64,FAIBASE,DEMO,CLOUD,LAST arm64.raw
    -# chown your_user_id arm64.raw
    -# cp /var/log/fai/armhost/last/vmlinuz* vmlinuz
    -# cp /var/log/fai/armhost/last/initrd.img* initrd
    -
    -

    Ensuite on peut lancer qemu en tant qu’utilisateur ordinaire :

    -
    -
    -
    > qemu-system-aarch64 -m 1000 -M virt,gic_version=3 -cpu cortex-a57 -drive file=arm64.raw,if=virtio,index=1 -no-reboot -nographic -name ARM64 -net nic,name=eth0,model=virtio -net user,name=eth0,-kernel vmlinuz -initrd initrd -append "console=ttyAMA0 rw ip=dhcp root=/dev/vda1 net.ifnames=0"
    -
    -

    Ça fonctionne de même pour d’autres architectures. -Il faut garder en tête que les réglages réseau de qemu ont des performances dégradées si -on n’utilise pas le pilote virtio comme ci-dessus ou des TAPs réseaux.

    -

    On peut trouver les fichiers de base pour plusieurs architectures à -https://fai-project.org/download/basefiles/, ou utiliser mk-basefile pour -créer son fichier propre.

    -
    -
    -

    Système de sauvetage FAI

    -

    Si vous assignez à la variable $FAI_ACTION la valeur sysinfo (par exemple -en utilisant fai-chboot -S), le client n’installera pas de nouveau -système, mais collectera beaucoup d’informations système. Si vous -assignez à $FAI_ACTION la valeur inventory, vous ne recevrez que -quelques informations sur le matériel. Les deux actions peuvent être -utilisées pour FAI comme un système de sauvetage.

    -

    Tapez ctrl-c pour obtenir un shell ou utilisez Alt-F2 ou Alt-F3 et -vous obtiendrez une autre console de terminal, si vous avez ajouté -createvt à $FAI_FLAGS.

    -

    Vous voilà maintenant avec un système Linux qui fonctionne sur le client -d’installation sans utiliser le disque dur local. Utilisez-le comme -système de secours si votre disque local est endommagé ou si -l’ordinateur ne peut pas démarrer correctement à partir du disque dur. -Vous obtiendrez un shell et vous pouvez exécuter diverses commandes -(dmesg, lsmod, df, lspci, …). Regardez le fichier -journal dans /tmp/fai. Vous y trouverez de nombreuses informations -sur le processus d’amorçage.

    -

    FAI monte tous les systèmes de fichiers qu’il trouve sur les disques -locaux en lecture seule. Il vous indique également sur quelle partition -un fichier /etc/fstab existe. Lorsqu’une seule table de système de -fichiers est trouvée, les partitions sont montées selon ces -informations. Voici un exemple :

    -
    -
    -
    demohost:~# df -h
    -
    -Filesystem                Size  Used Avail Use% Mounted on
    -devtmpfs                  4.0M     0  4.0M   0% /dev
    -tmpfs                     2.0G     0  2.0G   0% /dev/shm
    -tmpfs                     783M   18M  766M   3% /run
    -tmpfs                     5.0M     0  5.0M   0% /run/lock
    -LiveOS_rootfs             783M   18M  766M   3% /
    -192.168.33.250:/srv/fai/config   59G   23G   24G  49% /var/lib/fai/config
    -/dev/mapper/vg1-root      7.3G  1.8G  5.2G  26% /target
    -/dev/vda1                 459M   53M  378M  13% /target/boot
    -/dev/mapper/vg1-home      1.4G   72K  1.3G   1% /target/home
    -
    -

    Cette méthode peut être utilisée comme un environnement de sauvetage ! Si -vous avez besoin d’un système de fichiers avec accès en -lecture/écriture, utilisez la commande rwmount :

    -
    -
    -
    demohost# rwmount /target/home
    -
    -
    -
    -

    FAI sans NFS

    -

    Pour démarrer dans FAI et commencer la séquence d’installation sans -utiliser le protocole NFS, vous démarrez la machine cliente en utilisant -PXE comme d’habitude, puis récupérez une image contenant le nfsroot via -http.

    -

    Pour créer une image, utilisez l’argument -S de fai-cd et -M pour éviter de créer -un miroir partiel à l’intérieur de l’image.

    -
    -
    -
    faiserver# fai-cd -M -S squash.img
    -
    -

    Déplacez cette image vers un répertoire à partir duquel elle peut être -demandée via http (généralement un répertoire accessible par le serveur -web)

    -

    Pour demander alors l’image squashfs, ajoutez ce qui suit à votre -ligne de commande du noyau, par exemple dans votre fichier de configuration -pxelinux pour le client avec fai-chboot.

    -
    -
    -
    root=live:http://faiserver/cskoeln/squash.img FAI_CONFIG_SRC=file:///var/lib/fai/config
    -
    -

    Remplacez faiserver par le nom de domaine ou l’IP de la machine de laquelle -votre image de squash est servie.

    -
    -
    -

    Installation d’autres distributions à l’aide d’un nfsroot Debian

    -

    Vous pouvez installer toutes sortes de distributions Linux à partir d’un -seul nfsroot Debian. Par conséquent, vous devez créer un fichier -base.tar.xz de la distribution que vous souhaitez installer et le placer -dans le répertoire basefiles. Puis nommez-le UBUNTU2204.tar.xz par -exemple. Un client d’installation appartenant à la classe UBUNTU2204 -extrait ensuite ce fichier de base dans son système de fichiers vide. De -plus, vous devez ajuster les sources.list ou les fichiers de -configuration similaires nécessaires pour spécifier l’emplacement du -dépôt de paquets.

    -

    L’outils rinse(8) est utilisé pour créer des fichiers de base pour -des distributions comme Rocky Linux, CentOS, openSUSE, ou Fedora. -Certains fichiers de base peuvent être téléchargés à partir de -https://fai-project.org/download/basefiles/.

    -

    Le script mk-basefile dans -/usr/share/doc/fai-doc/examples/simple/basefiles/ aide à créer ces -fichiers de base.

    -
    -
    -

    Création d’environnements chroot et de virtualisation

    -

    Si vous devez créer certains environnements chroot, ou un environnement -de virtualisation où vous ne pouvez ni ne voulez exécuter un programme -d’installation Debian normal pour accéder à un système opérationnel (par -exemple, les domaines hôtes Xen), il y a l’action FAI dirinstall. En -appelant :

    -
    -
    -
    faiserver# fai <options> dirinstall <target-directory>
    -
    -

    et en utilisant l’option -c <classes> ou -N vous obtenez une -installation FAI, sans l’action de partitionnement, directement dans le -répertoire cible. Le nom d’hôte de la cible d’installation peut être -spécifié à l’aide de -u <nom-d-hote>

    -

    On peut utiliser cela, par exemple, pour combiner FAI avec les outils -xen-tools, qui vous aident à construire des domaines invités Xen. -Les xen-tools sont très agréables pour générer des fichiers de configuration -et bloquer des périphériques pour de nouveaux invités sur la base de -commandes simples et/ou des fichiers de configuration, mais ils ne -peuvent assigner qu’un seul rôle par installation pour la -personnalisation. Les utilisateurs de FAI ont besoin de plus et en veulent, car -ils ont l’habitude d’avoir le système de classes. Ils peuvent y arriver -même dans les installations xen-tools, en utilisant le code suivant en -tant que rôle xen-tools script :

    -
    -
    -
    #!/bin/sh
    -TARGET=$1
    -CMD="fai -N  -v -u ${hostname} dirinstall $TARGET"
    -echo running $CMD
    -$CMD
    -
    -

    Ensuite, il faut définir la variable install=0 dans la configuration -xen-tools pour cet hôte.

    -
    -
    -

    Utilisation de FAI pour les mises à jour

    -

    FAI peut également effectuer des mises à jour de systèmes déjà en cours -d’exécution, sans réinstallation à partir de zéro. C’est ce qu’on -appelle softupdate. Un FAI softupdate ignore les tâches qui ne sont pas -adaptées à la mise à jour d’un système en cours d’exécution, comme le -partitionnement des disques durs et la création de systèmes de fichiers. -Au lieu de cela, il exécute uniquement les tâches de mise à jour et -d’installation des paquets logiciels et l’appel des scripts de -personnalisation.

    -

    Pour lancer un softupdate :

    -
    -
    -
    # fai -v -s nfs://faiserver/srv/fai/config softupdate
    -
    -

    Par défaut, un softupdate utilise la liste des classes définies lors de -l’installation initiale. Assurez-vous de définir la variable -$LOGSERVER (ça se fait dans un fichier class/*.var) si FAI doit -enregistrer les fichiers journaux sur une machine distante.

    -

    C’est à vous de décider, comment démarrer un softupdate sur un plus grand nombre -d’hôtes. Vous pouvez faire le softupdate sur régulièreent via cron -ou vous pouvez utiliser des outils comme clusterssh(1) pour démarrer -un softupdate via un push sur une liste d’hôtes.

    -

    Gardez à l’esprit que les scripts de personnalisation sont exécutés -chaque fois que vous faites un softupdate. Cela signifie qu’ils doivent -être idempotents, c’est-à-dire que le résultat de leur fonctionnement -doit toujours produire le même résultat, même lorsqu’ils fonctionnent -plus d’une fois.

    -

    Par exemple, l’ajout d’une ligne à un fichier ne doit pas se faire via ce code :

    -
    -
    -
    $ echo "some strings" >> /etc/fstab
    -
    -

    Au lieu de ça, utilisez la commande ainsl(1) dans un script shell ou utilisez la fonction -de cfengine AppendIfNoSuchLine.

    -

    Toutes les commandes du script de personnalisation doivent être capables -de modifier le système de fichiers cible qui’il soit disponible dans -/target lors de l’installation initiale ou qu’il soit le système de -fichiers normal relatif à / pendant le softtupdate.

    -

    Voici quelques variables qui aident à écrire ces scripts :

    -
    -
    -$target -
    -
    -

    -Pointe vers le répertoire racine du client, qui est /target pendant -l’installation et / pendant un softupdate. -

    -
    -
    -$FAI_ROOT -
    -
    -

    -C’est la même valeur que $target. Pour des raisons historiques, -on a ces deux variables dans FAI. -

    -
    -
    -$ROOTCMD -
    -
    -

    -Dans le cas de l’installation, il s’agit d’un alias pour chroot $target -en cas de softupdate, c’est juste vide. Vous pouvez ajouter -ceci avant les commandes si vous avez besoin d’exécuter une commande dans le -système de fichiers cible des clients via chroot. -

    -
    -
    -$FAI_ACTION -
    -
    -

    -Si vous devez appeler le code en fonction de l’action FAI effectuée, -vous pouvez utiliser cette variable. Elle contient l’action actuellement -exécutée: install, softupdate, dirinstall, sysinfo, -inventory ou votre propre action définie. -

    -
    -
    -
    -
    -

    Comment installer un système d’exploitation 32 bits à partir d’un système d’exploitation 64 bits

    -

    Pour installer un ordinateur avec un système d’exploitation 32 bits, -vous avez besoin d’un nfsroot i386. La création de ce nfsroot 32 bits -sur un serveur d’installation qui fonctionne sous amd64 est simple. -Installez et configurez les paquets FAI. Copiez ensuite vos fichiers de -configuration FAI dans un nouveau sous-répertoire.

    -
    -
    -
    faiserver# cp -a /etc/fai /etc/fai-i386
    -
    -

    Modifiez la variable $FAI_DEBOOTSTRAP_OPTS dans -/etc/fai-i386/nfsroot.conf et ajoutez l’option --arch i386. -Choisissez également un répertoire différent pour votre nouveau nfsroot. -Voici les deux lignes après l’édition.

    -
    -
    -
    NFSROOT=/srv/fai/nfsroot-i386
    -FAI_DEBOOTSTRAP_OPTS="--arch i386 --exclude=info --include=aptitude""
    -
    -

    Appelez maintenant fai-make-nfsroot qui crée le nfsroot 32 bits dans -/srv/fai/nfsroot-i386

    -
    -
    -
    faiserver# fai-make-nfsroot -v -C/etc/fai-i386
    -
    -

    La création d’un miroir partiel utilisant fai-mirror(1) qui est nécessaire à -un CD amorçable ou une clé USB est également possible sur une -architecture différente. Vous devez spécifier l’architecture lors de -l’appel de fai-mirror.

    -
    -
    -
    $ fai-mirror -m800 -B -a i386 -v -cDEFAULT,DEBIAN,FAIBASE,I386 /srv/mirror-i386
    -
    -

    Et voilà !

    -
    -
    -

    Arrêt d’urgence de l’installation quand une erreur se produit

    -

    Chaque tâche, chaque hook peut appeler la fonction task_error -pour envoyer une valeur d’erreur à l’installation. Cette erreur apparaîtra dans -le fichier de journalisation et peut être visionnée dans le fai-monitor-gui(1). -La valeur de l’erreur est aussi examinée en tenant compte de la variable $STOP_ON_ERROR -qui est réglée à 700 par défaut. Si la valeur d’erreur est -supérieure à $STOP_ON_ERROR, l’installation s’arrêtera -immédiatment. Dans un hook, ajoutez simplement un appel comme celui-ci :

    -
    -
    -
    task_error <valeur>
    -
    -

    C’est commode d’appeler task_error avec $? comme deuxième paramètre, par -exemple si on veut émettre une valeur d’erreur de 123 on peut faire ainsi

    -
    -
    -
    <some command>
    -task_error 123 $?
    -
    -

    Alors, l’erreur de tâche n’est mise en place que si la commande précédente a échoué avec -une certaine erreur. La même syntaxe peut être utilisée par les scripts dans le sous-répertoire -de classe qui se terminent en .sh.

    -

    Un cas particulier est celui des scripts dans le sous-répertoire class/ qui ne se termine -pas en .sh. Dans ces scripts il faut appeler task_error avec 1 comme -troisième paramètre. Par exemple on peut utiliser deux variantes pour -régler la valeur à 123

    -
    -
    -
    task_error 123 $? 1
    -
    -

    ou

    -
    -
    -
    task_error 123 1 1
    -
    -

    La dernière commande met toujours l’erreur de tâche à 123 sans tenir compte de $?. -Si la valeur d’erreur est supérieure à $STOP_ON_ERROR, -l’installation sera immédiatement stoppée.

    -

    Les valeurs d’erreur sont regroupées dans quatre catégories

    -
    -
    -
    normale ou messages d'information :   1xx, 2xx
    -avertissements :                      3xx, 4xx
    -erreurs mineures :                    5xx, 6xx
    -erreurs :                             7xx, 8xx
    -
    -

    Le fai-monitor-gui possède 4 icônes différentes pour ces catégories d’erreur.

    -
    -
    -
    -
    -

    Divers conseils et détails

    -
    -
    -

    La liste des tâches

    -

    La plupart des tâches de l’installation sont définies comme des -sous-routines qui sont définies dans /usr/lib/fai/subroutines (par -exemple task_instsoft). Certaines sont des scripts shell externes -situés dans /usr/lib/fai/. Elles sont appelées via un sous-programme -supérieur nommé task. Ce sous-programme appelle les hooks si -disponibles, puis appelle la tâche (définie comme task<nom>_). Une -tâche et ses hooks peuvent être ignorés à la demande en utilisant la -commande skiptask().

    -

    Voici maintenant la description de toutes les tâches, énumérées dans -l’ordre dans lequel elles sont exécutées.

    -
    -
    -confdir -
    -
    -

    - Les paramètres ajoutés au noyau peuvent définir des variables, le - démon syslog est démarré. Les paramètres de réseau sont récupérés d’un serveur DHCP - et sont enregistrés dans boot.log. La configuration pour la résolution DNS est créée. -
    - L’emplacement de l’espace de configuration est défini par la variable - $FAI_CONFIG_SRC. -
    - Ensuite, le fichier $FAI/hooks/subroutines est sourcé s’il existe. - En utilisant ce fichier, vous pouvez définir vos propres - sous-programmes ou remplacer la définition des sous-programmes de FAI. -

    -
    -
    -setup -
    -
    -

    - Cette tâche définit l’heure du système, tous les $FAI_FLAGS sont - définis et deux terminaux virtuels supplémentaires sont ouverts à la - demande. Un démon ssh est lancé à la demande pour les - connexions à distance. -

    -
    -
    -defclass -
    -
    -

    - Appels de fai-class(1) pour définir des classes à l’aide de scripts - et de fichiers dans $FAI/class et classes de - /tmp/fai/additional-classes et la variable $ADDCLASSES. La liste - de toutes les classes définies est stockée dans la variable - $classes et enregistrée dans /tmp/fai/FAI_CLASSES. -

    -
    -
    -defvar -
    -
    -

    - Source tous les fichiers $FAI/class/*.var pour chaque classe - définie. Si un hook a écrit quelques définitions de variables dans le - fichier $LOGDIR/additional.var, ce fichier est également sourcé. -

    -
    -
    -action -
    -
    -

    - En fonction de la valeur de $FAI_ACTION, ce sous-programme décide - de l’action FAI à exécuter. Les actions disponibles par défaut sont : - sysinfo, install, inventory, dirinstall et softupdate. Si - $FAI_ACTION a une autre valeur, une action définie par - l’utilisateur est appelée si un fichier $FAI/hooks/$FAI_ACTION - existe. Ainsi, vous pouvez facilement définir vos propres actions. -

    -
    -
    -sysinfo -
    -
    -

    - Appelée lorsque aucune installation n’est effectuée mais que l’action - est sysinfo. Elle affiche des informations sur le matériel détecté et - monte les disques durs locaux en lecture seule sur - /target/partitionname ou en tenant compte d’un fichier fstab trouvé à - l’intérieur d’une partition. Les fichiers journaux sont stockés sur le - serveur d’installation. -

    -
    -
    -inventory -
    -
    -

    - Une courte liste des informations système est imprimée. -

    -
    -
    -install -
    -
    -

    - Cette tâche contrôle la séquence d’installation. Vous entendrez trois - bips avant le début de l’installation. Le travail principal consiste à - appeler d’autres tâches et à enregistrer la sortie dans - /tmp/fai/fai.log. Si vous avez des problèmes pendant l’installation, - regardez tous les fichiers dans /tmp/fai/. Vous trouverez des - exemples de fichiers journaux à l’adresse - https://fai-project.org/logs/. -

    -
    -
    -dirinstall -
    -
    -

    - Installe dans un répertoire, et non pas sur un disque local. - Utilisez-le pour créer des environnements chroot. -

    -
    -
    -softupdate -
    -
    -

    - Cette tâche, exécutée à l’intérieur d’un système en cours d’exécution - via la commande en ligne fai(8), effectue un - softupdate. Voir le chapitre [softupdate] pour plus - de détails. -

    -
    -
    -partition -
    -
    -

    - Appelle setup-storage(8) pour partitionner les disques durs et - créer des systèmes de fichiers. La tâche écrit des définitions de - variables pour les partitions et périphériques racine et de démarrage - ($ROOT_PARTITION, $BOOT_PARTITION, $BOOT_DEVICE) dans - /tmp/fai/disk_var.sh et crée un fichier fstab pour le nouveau - système. -

    -
    -
    -mountdisks -
    -
    -

    - Monte les partitions créées en fonction du fichier /tmp/fai/fstab - créé par rapport à $FAI_ROOT. -

    -
    -
    -extrbase -
    -
    -

    - Extrait un système minimal après lequel un chroot puisse y être - introduit. Par défaut, le fichier tar de base /var/tmp/base.tar.xz sera - extrait. Les fichiers correspondant à un nom de classe dans - $FAI/basefiles/ sont également utilisés pour décompresser un autre - fichier tar selon les classes définies. Cela peut être utilisé pour - installer des distributions Linux différentes de celles utilisées pour - créer le nfsroot. Le fichier par défaut base.tar.xz est un - instantané d’un système Debian de base créé par debootstrap(8) - Cette tâche utilise la variable FAI_BASEFILEURL pour récupérer le - fichier de base via FTP, HTTPS ou HTTP si celle-ci est définie. -

    -
    -
    -debconf -
    -
    -

    - Appelle fai-debconf(1) pour définir les valeurs de la base de - données de pré-ensemencement de debconf. -

    -
    -
    -repository -
    -
    -

    - Prépare l’accès au dépôt de paquets en préparant la - configuration apt. Cela peut également ajouter des clés de dépôts - en tenant compte des classes à partir de fichiers comme - CLASSNAME.gpg dans le répertoire package_config. -

    -
    -
    -updatebase -
    -
    -

    - Met à jour les paquets de base du nouveau système et met à jour la - liste des paquets disponibles. Il contrefait également certaines - commandes (appelées diversions) à l’intérieur du nouveau système - installé à l’aide de dpkg-divert(8), de sorte qu’aucun démon ne - soit démarré pendant l’installation. -

    -
    -
    -instsoft -
    -
    -

    - Installe les paquets logiciels souhaités en utilisant des fichiers de classe - dans $FAI/package_config/. -

    -
    -
    -configure -
    -
    -

    - Appelle les scripts dans $FAI/scripts/ et ses sous-répertoires pour - chaque classe définie. -

    -
    -
    -tests -
    -
    -

    - Appelle les scripts de test dans $FAI/tests/ et ses sous-répertoires - pour chaque classe définie. -

    -
    -
    -finish -
    -
    -

    - Démonte tous les systèmes de fichiers dans le nouveau système installé - et supprime les diversions de fichiers à l’aide de la commande - fai-divert. -

    -
    -
    -chboot -
    -
    -

    - Modifie la configuration PXE d’un hôte sur le serveur d’installation, - qui indique quelle configuration PXELINUX doit être chargée lors de la - prochaine initialisation à partir de la carte réseau via TFTP. Par - conséquent, la commande fai-chboot(8) est exécutée à distance sur - le serveur d’installation. -

    -
    -
    -savelog -
    -
    -

    - Enregistre les fichiers journaux sur le disque local et sur le compte - $LOGUSER sur $LOGSERVER (par défaut sur le serveur - d’installation). -

    -
    -
    -faiend -
    -
    -

    - Attend que les travaux en arrière-plan se terminent (par exemple, - qu’emacs compile des fichiers lisp) puis redémarre automatiquement les - clients d’installation ou attend la saisie manuelle avant le - redémarrage. -

    -
    -
    -
    -
    -

    Tests automatisés

    -

    Après l’exécution des scripts de personnalisation, FAI exécutera -certains tests si disponibles. En utilisant ces tests, vous pouvez -vérifier les erreurs de l’installation. Les scripts de test sont appelés -via fai-do-scripts(1) et doivent ajouter leurs messages à -$LOGDIR/test.log. Un module Perl comprenant des sous-routines utiles -peut être trouvé dans Faitest.pm. Un test peut également définir une -nouvelle classe pour exécuter d’autres tests lors du prochain démarrage -via la variable $ADDCLASSES.

    -
    -
    -

    Découvrir automatiquement

    -

    Dans FAI 5.0, nous avons publié une fonctionnalité qui permet aux -clients de rechercher le faiserver dans leur sous-réseau respectif. Cela -soulève la nécessité de récupérer l’adresse MAC de chaque client et de -configurer le démon DHCP.

    -

    Cela se fait en démarrant à partir d’une petit media vif autodiscover FAI -(CD, USB, etc.), qui peut être créé via la commande :

    -
    -
    -
    faiserver# fai-cd -A autodiscover.iso
    -
    -

    L’image a une taille d’environ 25 Mo et analyse le sous-réseau d’un -serveur FAI. Par défaut, il affiche un menu avec tous les profils -disponibles dans l’espace de configuration de la même manière que -le fait l’option menu. Dans ce menu, vous pouvez sélectionner le type -d’installation que vous souhaitez effectuer.

    -

    Pour que les clients puissent trouver le faiserver, le faiserver doit -lancer fai-monitor.

    -
    -
    -

    Modification du périphérique d’amorçage

    -

    La modification de la séquence d’amorçage s’effectue normalement dans la -configuration du BIOS. Mais vous ne pouvez pas changer le BIOS d’un -système Linux en cours d’exécution.

    -

    Ainsi, la séquence d’amorçage du BIOS restera inchangée et votre -ordinateur devrait toujours démarrer en premier à partir de sa carte -réseau et le deuxième périphérique d’amorçage devrait être le disque -local. Ensuite, vous pouvez changer le périphérique d’amorçage du client -en créant différentes configurations PXELINUX. Cela définira si une -installation doit être effectuée, ou si le client doit démarrer à partir -du disque local. Cela se fait à l’aide de fai-chboot(8).

    -
    -
    -

    Comment créer un miroir Debian local

    -

    Le script utilitaire mkdebmirror
    [On peut trouver ce script dans -/usr/share/doc/fai-doc/examples/utils/]
    peut -être utilisé pour créer votre propre miroir Debian local. Ce script -utilise la commande debmirror(1). Un miroir Debian partiel pour -l’architecture amd64 pour Debian 11 et 12 (noms de code bullseye et bookworm) sans les -paquets source nécessite environ 180 Go d’espace disque. L’accès au miroir -via HTTP sera la méthode par défaut dans la plupart des cas. Pour -afficher plus de résultats à partir du script, appelez -mkdebmirror -v. Un compte root n’est pas nécessaire pour créer et -maintenir le miroir Debian.

    -

    Pour utiliser l’accès HTTP au miroir Debian local, installez un serveur -web et créez un lien symbolique vers le répertoire local où se trouve -votre miroir :

    -
    -
    -
    faiserver# apt-get install apache2
    -faiserver# ln -s /files/scratch/debmirror /var/www/html/debmirror
    -
    -

    Créez un fichier sources.list(5) dans /etc/fai/apt qui donne accès -à votre miroir Debian. Ajoutez également l’adresse IP du serveur HTTP à -la variable $NFSROOT_ETC_HOSTS dans nfsroot.conf si les clients -d’installation n’ont pas de résolution DNS.

    -
    -
    -

    Petits conseils

    -
      -
    • -

      -Lorsque vous utilisez l’accès HTTP à un miroir Debian, la partition -locale /var sur tous les clients d’installation doit être suffisamment -grande pour conserver les paquets Debian téléchargés. N’essayez pas avec -moins de 250 Moctets à moins que vous sachiez pourquoi. Vous pouvez -limiter le nombre de paquets installés à la fois avec la variable -$MAXPACKAGES. -

      -
    • -
    • -

      -Vous pouvez supprimer le logo rouge sur le client d’installation en -appelant simplement une fois reset. Il ne s’affichera pas si vous -créez un fichier à l’aide de cette commande sur le serveur -d’installation : -

      -
    • -
    -
    -
    -
    touch /srv/fai/nfsroot/.nocolorlogo
    -
    -
      -
    • -

      -Une liste des variables utilisées par FAI peut être trouvée à -https://wiki.fai-project.org/index.php/Variables. -

      -
    • -
    • -

      -Vous pouvez raccourcir certains scripts de personnalisation en -utilisant une seule commande fcopy fcopy -r /. -

      -
    • -
    • -

      -Si vous reconstruisez le nfsroot, vous allez créer une nouvelle clé -hôte ssh dans le nfsroot. La connexion à un client d’installation peut -échouer, car la clé hôte change. Vous pouvez utiliser ceci : -

      -
    • -
    -
    -
    -
    $ ssh -o StrictHostKeyChecking=no root@installclient
    -
    -
      -
    • -

      -Vous pouvez également supprimer l’entrée hôte de votre client -d’installation dans votre fichier ~/.ssh/known_hosts à l’aide de la -commande ssh-keygen -R. -

      -
    • -
    • -

      -Dans les tâches chboot et savelog, une connexion utilisant un shell -sécurisé est ouverte vers le serveur FAI (voir [isavelog]). -Pour garantir que cela fonctionne de manière non interactive, une entrée -appropriée dans NFSROOT/root/.ssh/known_hosts doit être créée. Lors de -l’utilisation de fai-setup, cela se fait automatiquement, mais il peut -s’avérer nécessaire de l’éditer manuellement si le nom de votre serveur -FAI n’a pas été correctement déterminé. Si vous trébuchez sur des -connexions ssh qui nécessitent de taper "yes" pour accepter la clé hôte -pendant l’installation, vérifiez le contenu de votre fichier -NFSROOT/root/.ssh/known_hosts -

      -
    • -
    • -

      -Une liste de tous les disques durs locaux est stockée dans -$disklist. Elle est définie après l’appel de set_disk_info. -

      -
    • -
    • -

      -Il y a de nombreuses fonctions pour générer un liste personnalisée -de disques. Voir fai-disk-info pour un exemple. -

      -
        -
      • -

        -set_bootstick() -

        -
      • -
      • -

        -grepv_disks() -

        -
      • -
      • -

        -grep_disks() -

        -
      • -
      • -

        -notmatchdisks() -

        -
      • -
      • -

        -matchdisks() -

        -
      • -
      • -

        -smallestdisk() -

        -
      • -
      • -

        -largestdisk() -

        -
      • -
      • -

        -all_disks_by_size() -

        -
      • -
      • -

        -all_disks_and_size() -

        -
      • -
      • -

        -once_only() -

        -
      • -
      • -

        -checkdisk() -

        -
      • -
      • -

        -disks_by_id() -

        -
      • -
      -
    • -
    • -

      -Utilisez fai-divert -a si un script postinst appelle un programme -de configuration, par exemple le script postinst pour le paquet apache -appelle apacheconfig, qui nécessite une entrée manuelle. Vous pouvez -contrefaire le programme de configuration pour que l’installation puisse -être entièrement automatique. -

      -
    • -
    • -

      -Parfois, l’installation semble s’arrêter, mais souvent il y a seulement -un script postinstall d’un logiciel qui nécessite une entrée manuelle de -la console. Passez à un autre terminal virtuel et regardez quel -processus fonctionne avec des outils comme top(1) et pstree(1). -Vous pouvez ajouter debug à FAI_FLAGS pour faire en sorte que le -processus d’installation affiche toutes les sorties des scripts postinst -sur la console et obtenir son entrée aussi à partir de la console. -

      -
    • -
    • -

      -Comment puis-je définir des classes sur la ligne de commande du noyau ? -

      -

      Lire la page de manuel de fai-class(8). Si vous voulez définir quelques -classes supplémentaires (par exemple A; B, C) dans la commande du noyau, -ajoutez ceci : ADDCLASSES=A,B,C

      -
    • -
    • -

      -Comment utiliser un noyau personnalisé dans le nfsroot ? -

      -

      Construisez votre noyau personnalisé en construisant un paquet kernelde noyau à -l’aide de make-kpkg(8) et utilisez l’option --initrd. Copiez ce -paquet Debian dans un dépôt local et ajoutez-le à -/etc/fai/sources.list. Ajoutez le nom de votre paquet à -/etc/fai/NFSROOT. Ensuite appelez

      -
      -
      -
      # fai-make-nfsroot -k
      -
      -
    • -
    • -

      -Comment utiliser le nfsroot comme système pour les clients sans -disque ? -

      - -
    • -
    • -

      -Comment faire pour servir plusieurs arborescence nfsroot sur un -serveur FAI ? -

      -

      Si vous souhaitez diffuser plusieurs répertoires nfsroot, vous devez -créer des répertoires de configuration spécifiques dans /etc pour FAI, -comme /etc/fai-buster et /etc/fai-bookworm. Ensuite, vous devez -définir les variables $NFSROOT dans différents répertoires et -lancer

      -
    • -
    -
    -
    -
    faiserver#fai-make-nfsroot -C /etc/fai-buster
    -
    -
    -
    -

    flag_reboot (FAI_FLAGS)

    -

    Si flag_reboot est défini, en ajoutant "reboot" à $FAI_FLAGS, votre -ordinateur client redémarrera après la fin de la tâche faiend. Ceci est vrai -pour les installations par réseau ainsi que pour les installations par -media amorçable.

    -
    -
    -

    Fichiers journaux

    -

    FAI crée plusieurs fichiers journaux. Pendant l’installation, ils sont -stockés dans /tmp/fai sur le client d’installation lui-même. A la fin -de l’installation, ils seront copiés sur le serveur d’installation (voir -[isavelog]). Une fois le client d’installation redémarré -dans son système nouvellement installé, vous pouvez trouver les journaux -FAI dans /var/log/fai. Les fichiers journaux sont également créés lors -de l’action softupdate ou dirinstall.

    -

    Sur le faiserver, vous pouvez trouver les fichiers journaux (distants) -sous le répertoire ~fai.

    -

    Des exemples de fichiers journaux d’ordinateurs installés avec succès -sont disponibles sur https://fai-project.org/logs. Ce sont quelques -fichiers journaux qui sont créés par FAI.

    -
    -
    -FAI_CLASSES -
    -
    -

    - Contient une liste de toutes les classes définies. -

    -
    -
    -dmesg.log -
    -
    -

    - La sortie de la commande dmesg. Contient des messages utiles de la - mémoire tampon du noyau. -

    -
    -
    -fai.log -
    -
    -

    - Le fichier journal principal. Contient toutes les informations - importantes. Vous devez toujours lire ce fichier. -

    -
    -
    -boot.log -
    -
    -

    - Une liste de variables de paramètres de réseau, principalement définis - par le démon DHCP. -

    -
    -
    -format.log -
    -
    -

    - Sortie de l’outil de partition setup-storage(8). -

    -
    -
    -scripts.log -
    -
    -

    -Sortie de tous les scripts, qui sont utilisés pour la personnalisation. -

    -
    -
    -variables.log -
    -
    -

    - Une liste de toutes les variables shell qui sont disponibles au cours - d’une installation. -

    -
    -
    -error.log -
    -
    -

    - Résumé des erreurs possibles dans tous les fichiers journaux. -

    -
    -
    -disk_var.sh -
    -
    -

    - Une liste des variables contenant des informations sur les - périphériques et les partitions à partir desquelles on démarre, la partition - racine et une liste de périphériques de swap. Ces informations sont - utilisées par certains scripts de personnalisation (par exemple - GRUB_PC/10-setup). -

    -
    -
    -

    Si le processus d’installation se termine, le hook savelog.LAST.sh -recherche dans tous les fichiers journaux les erreurs courantes et les -écrit dans le fichier error.log. Donc, vous devriez d’abord regarder -dans ce fichier pour les erreurs. Le fichier status.log vous donne -également le code de sortie de la dernière commande exécutée dans un -script. Pour être sûr, vous devrez rechercher plus de détails dans tous -les fichiers journaux.

    -
    -
    -

    Comment utiliser HTTP pour le démarrage PXE

    -

    fai-make-nfsroot utilise maintenant le fichier binaire lpxelinux.0 qui -prend en charge déjà le transfert du noyau et du fichier initrd via http -(en plus de tftp). Il vous suffit d’activer un accès HTTP au répertoire tftp :

    -
    -
    -
    cd /var/www/html
    -ln -s /srv/tftp/fai
    -
    -

    Ajoutez -U URL à l’appel fai-chboot. Par exemple :

    -
    -
    -
    fai-chboot -U http://faiserver/fai -IFv .......
    -
    -
    -
    -
    -
    -

    Dépannage

    -
    -
    -

    Erreurs d’amorçage

    -

    Le message d’erreur suivant indique que votre client d’installation -n’obtient pas de réponse d’un serveur DHCP. Vérifiez vos câbles ou -démarrez le démon dhcpd(8) avec l’option debug activée.

    -
    -
    -
    -
    -
    PXE-E51: No DHCP or BOOTP offers received
    -Network boot aborted
    -
    -
    -
    -
    -

    Si vous ne voyez pas le message suivant, le noyau d’installation n’a pas -pu détecter votre carte réseau, par exemple en raison d’un pilote -manquant :

    -
    -
    -
    Starting dhcp for interface eth0
    -dhcp: PREINIT eth0 up
    -dhcp: BOND setting eth
    -
    -

    Vérifiez le fichier initrd dans le nfsroot (lsinird) pour voir -si le pilote du noyau de -votre carte réseau est inclus et vérifiez si vous souhaitez ajouter le -paquet firmware-linux-nonfree dans /etc/fai/NFSROOT` puis -reconstruisez le fichier initrd en appelant fai-make-nfsroot -k. Vous pouvez -également ajouter un pilote à +/srv/fai/nfsroot/etc/dracut.conf dans -la ligne add_drivers+=.

    -

    Voici le message d’erreur que vous verrez, lorsque votre carte réseau -fonctionne, mais le serveur d’installation n’exporte pas le répertoire -nfsroot vers les clients d’installation. Cela est souvent dû aux -permissions NFS manquantes du côté serveur.

    -
    -
    -
    Starting dhcp for interface eth0
    -dhcp: PREINIT eth0 up
    -dhcp: BOND setting eth
    -mount.nfs: access denied by server while mounting 192.168.33.250:/srv/fai/nfsroot
    -.
    -.
    -dracut Warning: Could not boot
    -.
    -Dropping to debug shell
    -dracut:/#
    -
    -

    Maintenant, vous êtes à l’intérieur du shell d’urgence de l’initrd qui a -été créé par dracut(8). Vous obtiendrez une invite du shell et pourrez -consulter les fichiers journaux. Pour plus d’informations sur le -débogage du processus de démarrage précoce à l’aide de dracut, consultez -dracut.cmdline(7)

    -

    Utilisez la commande suivante sur le serveur d’installation pour voir -quels répertoires sont exportés à partir du serveur d’installation -(nommé faiserver) :

    -
    -
    -
    $ showmount -e faiserver
    -
    -
    -
    -
    -
    -

    - - - diff --git a/doc/fai-guide_fr.pdf b/doc/fai-guide_fr.pdf deleted file mode 100644 index 7368cfe3804743db7261f52f3af0c74f2eb611a2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 299310 zcma&MQ?M}G(k-}b+qP}nw!UTCwr$(CZF_yowr$^iqW|c=9d}3EQ!yX%p`u1*&C1L% zM<%I)h!`y+9Xk~1{NIr^C{_Xn0y{%XC>|atdKnX2GiP%GMmAQ0|L20D7qhT-HgP1N z7qd2SHW4u~vNJY;;^TvIa&|N^uz_;l2#ITe3uHhMb?ZHdxfbxLD=EQcL=1GeDuok4 zkfeg?-`j;g2WRNXO4{;zK=2eON8)KW%gdHhLK=s_qcHqH)GO;!OpZER8`j4-yjQ`>^GZW{3 z>-2S&v|APjM(FDg>XjiHLuXKG#ugc`h5UxQr>EQ^=m5tu3>diJ>BFVCP~h6A!+|6Y zJ8Tw$K{Uu**=v^s*lY}NcG5sy(E$Az0yx|&r|>kUEY76&Xalmn3rs#U7I)f^5j(-q zxALkm3XD7zqug|#x_{symFzF$%y;Eh=W=RECg4u=CnJ;e7QjY<-N)MyX zD_D9Qg=$a*H}TX2OO5V&q^ga=`n9CxnvFR1K>kENUNUrmEv9}e9oLhzuzpc)oPZI z5r0@Y?|=P-a~sjoZ`m;w--LJO8juL?PX``(q0L8b%$PmImi?&_@g^VARBw2dG1L*& z&rk=oB=uUU6r#sOm2{GvK8xa4vp*G!1vt9N$cOUADxAeGuodcaTLU;7X-t(2892DH zrv+_nU>Cs6)MG+B;D)$Uq>xz+hdjTg`}f52uxHYjF6p2P`dnf2V37dR)DCrLB{@)| z+xp_*2lGbmgEc2!+1DeLG0 z6+KYG(kci!SaI)1k_gB9O>c_gJ+r=)L9U32>t|6F|Hq4bb zr=r3u(1u|MTRI3v<+!_K8umvNI)=oivkvCjCVox=7kvx;>si1)^szt)zzO2zQ)6kvSbrNoE{Q8Sk!%_a* z&Sk(>(4v_1oo34UQUFp*n@VD<6i!qpN zgii~*B|And17!oFyCTX2)?ddie|6Dd%-7_{(!|%f=E(;6>WES5cDUn>9UR*rpBOsS z0%nVopp_ScHurI0XxhIyRvCHhi7e&D+*VuCAr$A%P~^x-hl=wx74^K$6~E5u3#pShf9wUQjFP?zh_lm<0?Uu*NM00H=W(zM4qe!MCaiT(55OHv>&oc!694c&IgJc)vkZhqS*e0<~g;t@s_Yv!|W{U=#hx z9$Q&Ix`kAz)7%cL`wP1Z*URB*{f9+=u0go%BGxXfse@S0(G$&~b*AZJ0oxe$YOn;@V>nu_eP_N7HLIBRJ zAx;mJpOgfrR zWc}~}Ufn`jhe2;DDjKe-=)}1znlAvDlB4!r3*wEWGD{{L2ij-ig~|jGsVo(yy6|g|i6#A7%#%&Jqg~56 zm*MbvIzg65x#%73Flfl!74^2gm2Si5C=HiUVwc5&@?Ttqe`$jEq z_&~-jr91zizmTHi?ilnkM1)h(XDJ8lHNjd_Sjvcc6Roq(qQ1dO!|U^a&Ylf z$C}S*^~6*k6mt8xy(K|Kwk)34K3 zue18^9H*`l$R*qM~7?wA@)JJJ2L`olxgoNI$Y<^kf27>ohFWC8X;m!QR9Qq zqZZ@?HW^w&!@*al3z^46h!oRtYf6E-sp~BgQ&`W_;bod^c0b1D0wY0Xm)b5o+je{esePm@D^>?ukoR% z=K(Hlz)F9g2SRkj_0t?-^UZCyaMTFI0?4MK%Pe}jCnXkFiO&WMu?!JzaEozN7%}3} zSu#456zqGj1y(^Y%faWdrmbP7U?RxTFIj2EK}+>IZQl&c>|a46OVZtkLfUX zTzuJknr_){wrEwk&RoTj1HQ$V>ck!?)8L>^PI#waH>o$Yhr>5RvKz0R1QSE>Jf3+c zJ1Bq7U{|zr>7Y`7zj6X!5ozL=0u*t>eooJXxIu1Szh>_JBvMc3{-px4|H~PKo#B59 zAi@9r;B}q;M>(4Tp?~)s#pCi`AhR!+XX8Q>m)nRMKIa|>yyHm*9BwASrq2f$(voxY zzIy3WMNdP5>58t8rVASc4ItoqPZp~?*O1CTn2C&0f*%-fNJELBI0Y!k8BUITNuhpX zRuBU*mh3Yom)eb67)Lg%@a+cAEwhuVN$d3HUcaNVsjwb+d9ikQU(<8VvWTEz!*Ihw z7$q`Y!-z}tqf{5=s${^$|C#{kZI%ECc~Vdhtjr8z`g)5{AbtYG`&up4-v|UU=Gq5P zE)X8@L9g>QJ;ZN+Y{xDX?=H)TBBMzx6j2O9*3~6^;i$BSqRDagc-gVUc|T9(`p8?1 zv$n~#`?-j{zte&ix!Enrke|2N3WC@WGAvmF!2q!2+i{jITzjgzw`lsD_Nnqk=45hH zWsZXQy#y=W5lazMULQj<>&I%Kcq{j1fV^$<8}6fytt17G`J53sjuSRy+o)An%d}hhDf`-fH!aoarM#RAa`lA@@jD0#C8cuk#7+z zuI6v)MUkDl?%8x4x@s<}uoK3@^ znYCXoi*`1)i=ygtPwwC|_UTelPW*c8VX+OYEeEQ9YMb^Rmff@}Uov-=)}~t1T+Z#{(;7NATH9ROg&w(%>1ea69J}L}gf-yIU&86%9E)*B>Jgso`A5?iXN?Rml2(i3bjje_@0yOlHSncYh9eyS{Z7rK1nX#&MD54+1R#$TgNevXw6tm91_R-eg+j-Om)kVEF)Li1CIyb z15!b=DWvJl?QYMSu6<~X&1}|0i8`~zRgH39NLJkL*En6!MfVA>OZ3F!_e+t9qKc}k zIcv}2GgfsqDfznL%hP7QN=K~u^j@|aDh3&t2WFDz+vyqIo-~K-qLtdR>8)NeQ5!Tc zFT!EDG~sa))-0MlYU`Rfm4u6@nT#8wUNq4Zy|#VWH$ro%f8m;3^k|CiMRG(}^+-iK z20CHt%=u!R@V#+LDVy2KIqH4o^Oby{I*|%Oma9)w>%zR$9{2=+5w!Sj=NygjT5d7? z7UrzWxI=4a)6+cro{vg_NuWK&SZ7FgoY)*6iX?9$L$Pa=^r5(X0 zjt8!)42c4`)?s;cSI9Zb*jG!)2fE~T##vQJBg4}j;Z8kr=tA{D@J5`}pfh0z3*%h? zm=x3jU;_|z>t@GWvt4Guh*nnv^t206=g796i-9l~eLsdV3e1;R^J_&Hk?YIBW*4w# zVR&hG#EZhysEcW=31|k{$y(wT{_w2{`2>|*Js;4@VJj)ymyULA2=;&4EuD5t9friE^y31~yA6w{DbUMCBfn7ZiNm=AnJNzAR z9ajag**l1(367=;(c#NtfiacF_0I=YiM2>TP5JEJ6#D8;!CtX@i->qge>GIZdC;Sg z`okj_4hk}6GXT^^I01l8U94M&FqrdNtwqe=Y z$rutvkQy|;t#VJ4fi?jBwtOPD*F~rz-_R;OzJN|}W`COtO1 z?bWR5D%Sv(ZI^eXO7o+1sl6uC)Hz`9a6&DgVFL=$*#zqsfH3HA44uYYokC2z8axDd zsBW%Wjkzb}l6j~Wb`Isdd%5Y-jUDb#6MQ8Ic5L>%KUdWdE#)-Kbw7slrf1({S*Nzskvwx{9vRDN`+>*ygweS>uR?jf6?5Mm z)B7PgGrx0jQ+-1TmHGc?if8)Y61<9sy$J!myrHGCvkerz904N(!+$7`qmwfM2P@Z5x>IXKV&KAt-Z_dXiU|ZcGze@9K&WsW^(O_D_cDPL8BDie zMHeK5YFPK!Na?_pw%B!ExFOLA3Ctja$+YfOhDccq$15%z9V#UK1<2?EzES3wZI6q= z#gtRfFw&~`_$EU)g3(K8F zC&y#v-(v#!Sb)lp$!|~V!I~hPaxP@C> zC7kcJ^+XB4i-*Stv(&`!ef;)?Q98CCq94f%yOcDQg|8QC*EjM#^z_wtOE>tmRMmza zcK&&|JTtO9^O?VM$H3d;?)PQ?{c*s1V$gTj7R8=c*USBbr$?eQUzz|tN~>IbeGI5n zd(XkLsy#>lcG&a#_MW#7sEP8FpNfTC{d6&8*VpsqsN7<18!UzhcJDAnE`ZhTB@a=m zdFqQurh9p6&i3u>Hdk#n}?^Xi%WPD(nS*n z%zPcTz&&}Gf2e<`Flz7=BF4@UGZa543uJ}or~6~h;N!;q`{bbWlD;R~H{Cb8*H7>}jQWceObV44t}W5B z+NX3-O@BJXa=2TtNqiqU>F0tMubW3t^kZYpTN*`8*_w}hz3|r(C{}h9obT^DiSOcQF z$~`7c`an5=;|qhktF^ONNW9n_2X;2fWa-sH9Ze_Vwt;yu;gM%&O*)$%w5L|Q1?J=n zA~-6JDP1HVOau%43PPH)c4%YIALPSYShDl;hJJnR1``TwIiq$J(S5>sFpr3<3IHbO z0K&4b-|r1^^H!F0WV|)1B11!CNs8C_10t>^DUNPl9I0@xn_~t?IfQ13lGTKgjoG|U8`+n76$3UT~|zrO&kc@g)K>uxND#} zdcNJz`9hZTR931LV~2J+ zFS5ypL>8Y}38?HL;6lL^o@M@pF?W^FfyPmLED1gdt?1nWLa(I0zY?f7C`6Ix^DftS zCLQo-MqLP5e9=%yC;xL(g{jI2UPao9%9!S=AIzM*?G3q5QM|FPNpKG4+eY> z5i}F%e~BUp8;PPtLQlLNfTTvQpinAJL)Oa`9T=6Ga0X{gLr6SDSd=MfSQ@!Fcfo|T z84xuSG%-NIDAXjSC(N6QOV(Jb81A)yS@jt#!ZN{>*vWeeo~Jb(*uRTz%+}$7+Z|ne zEig7{>~jgCV=ac4Lah^3?cXSTG!a?MTQ4b7ziy3VrNtQM2Emg7z90tbfGMdZ#zY@8 z2bPOl4Z^paAudVrMn%R9;|lty@tPmHufqMP5g!}jQu&7S=nicHZiykTvLBGpmC~CB zju>wKPcXsc_18429|-lFAgAAOjW*mg-h|Ynmo!OkmBkzLPI2r6uJfTlSuanB?V~k~ ziO^Y%k9G>vBp*fTN+6(UiAPXYh*nHVxaz;}=`1U!Y!tQ{405KKP;8C~g}Slg=o9`e zVy4M_U`o91$)>-5^W_g<@{U3u0=Lp-%xi-Wy|S`fzl8llyU}5=j7NoY`_vx~PF#O2 zCZuRwo`oPrsp)ToC%yU%Dt_e1F`{+}c`VDJ*w6Hmnf8goqk2Wfi~VQ!SW9i|!+~af zGe^a!aiFgUAdAfFe88zAp9dh@R6W-NP+wfyuBrmk$N#oTj}}ww@UN5OP|RdqrLr^C z5(?hRd#BF1Qh(GgeA=jIV-9=#63$>FM96<)n1MO$1W7!SiR_+p#g_5LFejNaGh4XC z`2<4c9d+3xpkaR*YYvQA-n?J;eg}V0!%J2ZL6Yf)i*cJP9IZP*`dkkw+cqxQq zGW+V~OSPs7S$kP8W?_o3Y4lZ_AZ)^EmIDetuz-h7l^?>aBLDN*I)_~4jK6xpcZx() z^f^jX(+bw$HaSU&FmD`q+R$K3fHCQX*8{XeQX>7}{UM9*X2Hnkwo(hM^TMdA|Gv_H zAa%2vaa?A8N7+cjyKT%>Ji79Ru1oz+4=3e5el{%Gk`$im{FKZ{p&>?4`(TYvrB-FU z!XFti-WLhzUHb-fUu5`ylBSgT1NN$RFa%;WW-S%!szu38<%o89pnMX@#o_T?*`?#T z{}hf%ob8ec$i>ZTxXc zh{MX`!wC4jqc2-&X5AHvwY;69H^{?(`~?iOE^+=B4$JT_^Ab$VjQ=%D?a`EW+T=j` zN2aKMF|4Etgt#M}HCd6&u9)DV!sg}5vzwu_HltXH@!hSt*CPAu&xGgsx%;?7F3Gw^Ye=}7Y$sRgEs2E**K%g z1SN>!g#eKI(WKqp&mmSjR&Fki566KZ0;m^NzTPAoZ29Btdsk6mXycN=P_hB$hW40C z!edw@d!QY1HulE}C1G}<_J(LL5H-6@`8X*M&YT+Qzps$fE;kraj(m`n?P}Q+8rfT z{V4mRy_$+xwP^^dx{udWdL_JsP@IWQyRh&%UoyRqjl^iD*#bGl6Iq*zM);i0tO{tN_ff^3qY@M%|Hi z^Zrw0F4y>4bbCewYo|?CePy?HkP?KEN&s-l%`_iJwiKwhtqMzxx5YIP?T@`E zt$LFO7-6rXwK%0pcyfbERc%+#ZD@;E=e6+?UnVp-@RV6lsWSoXs)^OnFDbb|g(ct^ zZ7(mUFSyYywL;aDbkQs0sh5jDo2981YoDmi{84o(L9e9(sE*pT33$-T7c+TGpKe2& zU+}xaZ(p`FhPj~IS z`iYcqJW-zP?0Lb*c~{Znh|4+`3%S8)K1zC+}P+w2~J7SEPi5a9KmE>nO}|% z_f8%R_0*UbBr^gY^?6EhdzaGT5^%6gsF%(Ti!L?0w*dNE4;!_N0vPA9D)G!0F}M9m z8tMnVbts4uwp((XmBvQ-Ff!?LIa{```Gjv`XBP(pIwW-=&X02I5u{*WOe;>&%yNBo z|Hko&iZ&})7VIa8f+uh$5-$lMd`nr^Q@#{)FcU+k0|1OQ>AmK}qDsy=yZ4o4Og$vW z8UnaYTZfT2z2;$w=o-!D2LIwrKu1|pDfSaH4!MEXR)%U3K*a#s8ln7BKD~iowmmh- zkM@r%fcur$F-IUMN(T$9P4A%Kxsv|&Fp|Hq!hjY5&4R|8jwFAa4*&$RndBO_=+}Uv z0@3hUn;nQhQA^KkJ0}m`zMX&3zzM^YuoqN&daV#X%yrr!9lyGjn8JzwN0H8JRv|E~ z>8h($iNkoW_d@u((wo=l{?ruycKOwNmSq?IUP8CZ28tA~)hbNTL=tOA1^U(lEs3 zrd1;DL!A&}D{9?0DmTXubjt>k9H15bD^nxO4; zf7x&)VNDxJ90As1Vd>u<7UCSGi#Y-EXN!r_5*dKrEm>5|z~%;oef*NeW(o^?)?}Ys z{Cdiw_?1@XrluU$h+}u%+P~&H^JFO978-#5qZVN9XIFWJEj(iqEV-F-l-jZn-3c|W zKA*9Bx?aa(1Y?=AfjnUVvq(rIfmdo^I`rBhWfS}H5e#t@6pR`AUXKP#X|>$P$aPQX zAm%i!Kb8gC03~Y$Pu!xrfTZ-1K$qF$gIR}49g_Z&JfVd2r4$xEAwAX4^=l&%8)pat zGK6B*gkn7Y7#st){u=g=p|0zOaYUxMq@f)yK*^!(3J^J*1`#6S9x+)N&Jcz`;~3h& z^%Zbx%n^kGP|8Ra+L0kM7S~{(m=MZIFiT#4H#_&#;ZVQ?(*u6Zbd}*IZ(BqC1%<2Z zp(b{(Y`k8{VRxnxGIx62#kk{CuXnR#&H%qoz=v#bqOY|?kdm^JjCW`1o0pjPL~glQ z2zGQ*^;ZHJ;k2lOT((ri3F_`e3(4p(cv-ryw4fPm&UYEO9uCPNg2v}LYT);-t(tD; zMjh{Dd0u9RPC4f3l5pNm|bpBXE;b}w(*fsw!b6ff|U;UfN2Zjw_`Jft6Yq+3$- zDhXf79#VMIZm%Q2x`kt*wJI`bUr4(#TjvB%kOpz{BwzM2k;- z!^7Pl1qFp8p`m&|4j4Q-keZ0*YLlP#lgI@U84!Gs-1t19cnl}dnNA?x2H7u{Og7Hg zm5WP%>?m>90J>d<<>}yg*HBjMd{6yRy{uiV4k`uq1nRC*dp<};m&}|c?$r=m=b>8k zX4d!d=}2*@TFMTd5zuJBKF{lt4h;LF>_^ZDt-b%j5M5Fma)YXWX0OZ!Z8I10jiew%)6q;LA%|* zoRwu2t)A-DYhJB%t;M0U!$(o*jdkfatPi*y(%LSLh@X15K;|SxEmQM5=CtXiTH@_= zBzWx{zcb6rceYZgWRddpP-Lkca{^Q%G4w3sv-1c()je)uN~TUy+=1diyC)Y^+g!s z_@jgW?Rn(;Ih)Y76EZ!KC!GR_-c^&d1B!iQ)#i{0RjcBrS>sVb{qE)Q5R0g#dsU_N z3}JcPHG7(Z&dFskUMAOKiaH$BXyI;0HQ$=5>w8pAW48BPqp+r~YZE>Nws)~l7v8Ov z7Qv_21GR-4KLG>o9Z@TWQc%_9eazW8Z(`NH$oa)eVTZ6t4G)4SN(7m|R;^xFsJr(i zqXaoPUg458ksye{1^G|kx7Sh&Pu!U}7gtBzGf$2eqAj706dKzf7MQ0|$h{Og(y4k_^S|ww!lz>4T zoKFgmKYTMXU%zMBB_V}_Tvaqc1FMitvtdq@I$Zi;Tx#RnJQ&uU6A}Zgryh_KwJ~gP zR8*DCl-|!qQ@hJc6WXao4zWRjbtw-KVsn3#v?+04IE8hLBU(ZbLdlC~z{Y*WPRb>r z2WZ(7&i;Utb))3Ux=QXP5k{4)$x{A-JSW8*973kDFrK*PGmX}q0${C#$s8e4=eMCs z^mrQBFCf2O9O>mymwq2{BOqvlW&@XOyw6%aF|6T<=mjyR6RKN5z-Qreqo{w&T5jzQLda3lL zu0W%~nWO~65uSR#`_3-2eJ9&g(}`7U68#w5*{z|tBwB!buzxwcM}q^zMgiz3BZr|Z zBSp%s3`vYNHwa3+JGt{x^|@qeXd#_41I@EJ3D{Kw5AkM01Utkxf+K=J;yMR9XB~?4 z2sfS@o`zYjn^U2L%PXi29S}d2idrLR=*bIXs1Ag=eaf7B1yz+t4hndckF{{xXvhyA z<1V=~u5-2fW&gb+M@KaU^!x{lKomk57u%0J2^$I5GWNn=3nXy@15tCpcE%L;vFL%x zLUx)chWcdiR&EOdtS|n|8?VG?jG*>~SSZE3yl%?9%mYs$kKlZwL#Il`Mw_uwd$IPA z9yDMh%H}W>1%xhM0w$sD4(qp=Q%05Y4;zkwzBAWI${TdK7TZGXBocxW zLUo%4WkLLx3&Y?aZ|~!d+RN-h2#F8{X5M&*@MM;uS#@pnDfWuKt4VN)w|%Z~QTQ}t zdWEy242%)egJ+n-2OzMRT2yMa_+dhQNfF>89OLZCi4$tlW5ziR&UT(jHs`xjnR~2L zm?OF68kicE(51?(#ZZ9N#;QG82}%2t^K}e-^^Yoe_4b}03tqF@vvt8{m&(u7V-ykY z3MPQcMXbP5)3Xs&;0n2j)*;ZA^^v>A!M!_~cZ^bFylBBjF%89(nk!4H^%Wj=jG!$c z^RhsHNji^7=WT{=wST6xu^>?bZfEN}{9U}?=l`lMD;3C@SJVShnfirdFrl}VN)ql2 z&(bbzys1F!jUNsI6TFBTa4B(U2%mukUU14PnSH9=J%Rk;g(|j_vmdNLb4aX34YsHk zTBDdCpiO0Z2wT7c_gcQ&(_>dvnsxI=VnqiD5spP7Vb2iwZdEtyG>~h(~O< z7iI_%VLrFS3@EQsa!uS%L{ExXg52B>7Q6@19~%rwI3YJ9BQfEM1Kg;$h~1{%t4fj7 z<298meOzzt&%P9f&7Ufr8Yd;3&bL=im91_aowy`OiU z$lN|vUC9&xaX%~%s#YL@yq2=luy(d(b40SiNMohBI#w;DKwTQa2&lrS9ycX1Fp-71 zH*SuZ;2#$8n6~OD4!U=7Nb=b}qh1x|foltAgiJ2d`3ue~f`a73>F?c-`bgMlv(iPt z014pI_xR>bf#;M7Y;qB)4_KuLV$TT7!hWROZeo#Q8lFf$@YJN#vSB?cU<8+*e1PN* zP+{ODT4C9S>sei8TL((m5=?$Mlelbpbu** zz4X2T%_0Ak+f8=#6#ea8OAwOqX`8dFmfPpl?mR%}X~AptrT#KN$N|M+O(ZdR@}`jp ztSZiMn2jCEtgE?(-rN3Fyyh%U%ai2Q34Kt{nw{%^!4yf`@N5ohj)X>&35xlqoH7dq ziq0u=L?BYznQ);X^e}EKR!xM!vOb+0lysWE0Ol#Ux2LeRnq=7C{TNg)eLP(tJ`^9H zv1aJbl}whakJ>La8&FtXjKYBp721szq{eE(f`RMo0rWJI+i?t>m0TMqpj5JCIkBsF zj5GxeGMGZqehdRoP`wxq>6;mVSn6zTj?rZOJ_4&wP@x^_!YAo<*2-!6DR$>SDt6X2OR@+;$5;4(q_T%=R2FFc zK&D{KwNt#s=saG&=T&;ktjct<>DC70J>x{lfEXy|pII(Tex@CR_O`C`a4K+>i6GqQ zL`*5aHBV)~HIBm3F4uwjc_<6gkx&U1t+}H%yaRb4A^p$HjWUID%(>DNg(d=y`?iD< z;lixIASo$S8h+8;CN}1e@QO~^iB2OMdLFKUnfm6DsZ@Wj3^w=G{Nvyevo;CWF^d8Y z$}w%Z zm4RtR!P+8DHutJuB+IQge`YTBK*O!54o>J9ssCi$^j07*l_NQPCrLzw$K!X!R~Z6p z2bTo~$5TG^@b(x!R`L&b9MZ%*)bh*-{FJj|4QT>AdpjCn{Aj_3 zKYnFrOT8wp*)Ot&1FL6gjBnB_I0!#Y@|hNYs5fO{E+-kp35V!HNXKDI?CF(1RTYTN zY36q88=`=aVsSi9#R22w9xJ6`?U7|3{Z_FtONy#THCWa%5~yjKa|X4p?A|^@W$0m@ zlpa`mq|<3Q&S9c={YvOHUigf5l%r|xd5_)ukp#1G@olHWZic#3zV3SDB1*T9;`eb8 zrl6=G&eBFMU&U&d7N>{%1V!H;e%oTII@!;5MDkR60=u6%BDU1~`rfq~(y9u4lNOz_ zS;XwHAvix*&zC13c}_zd3O8@7I=@p_amjFV{pQox=juf7uflBZw7?4bZ#O>%-s3_tv`kA=t^$&5Wqh;(>Ke+y1QZ;9mE1f4@R&au8pi88eLE(<7F;oxp zh_MFP@bx5N#+wew4*z`d6=l`4@_qtlnJ7;%yEM^El_R9;X8+)xfHtAmb6d63BPpn= zv}p7y|J)e({)Azo8y&qjqZnQD7{SjxnV{&7`xuR>`IAq9;~hrt7v%LQU{=k~9wfQ@ z_h~^Q)9Nw!PpdG?@t@GpC)Q-uZ)rbYiEzDDzay!8x6;rGaHCn;ch;#N3zM4{Hgs_H zWs{i_CW`u0a7;?G(dY8-)`vKYtFFS^w|7~ZFUivmjn9*LP#qqXFw+BRO;Y3F~Gk#dMSX?H4-pz;}~+6K9OjuSr!ZQr7Jdh4;eAyV)0yRhDB4t7Sl5U1aCP z0}j_DkXYh+9y-6J?XaDV(fG4{QA zeEqm~wcO4(rl<7VW}F_z9m_r6Ke0ehWFVjkbG^mQ@8N}{l{56+DNZ86DfN`QI4-eY z>T!Fbi1A@ZrMjsa5BfvLXS^Iu@)L9IR;7|$RVCHxcevU~mF1{-(%9NGxjYH?bv*L^ zy5{L{Zz=|He|-v%K6Hz{3?f`0WGA;s5PODKVY0baV}xi!HPvpTQfqleq|MZ#*74!A z-S2PDs#H6>(S;e|y>2XLXQ5d=)jFv5BZA6|_rcL<&UDNX)M4J5lK8G}>HNk=;|SVq zMeb&xEv@QjeawEiqtb7Ys~QDgnGjW4Q@lOwVyZ5Fq58f_Gh>-Eb$>vcQ(|nDPNZtf ze|$kz#nCMe;nS+}m%Enf!3Wlx2(K27aL~dSIt2Hp}$>B8l!@{5l4D6$_2jwmSx4PSsDreE2PkBK+!3xw$pwtwX?UY|GWYrH0J z#Lt9NI)!KK9?XQxRL`Lw!GXlYaE44LK|#%_4rCJq>da1uBODEf{$V)G?XXW_jZ62m zo|~8P8W^QH`PFoj>(B*E9ZLu$z34AWtk|!C=Z`#w5Jb+PZwz+;5bw@#3mFf9MdD%n z_8+|X|KLgd2QU6VcoO~F$xTKf@GOu*93s6yB(a2I;7C4V`7m>Qu7E&A)waL~J4KgfLkRYJqCFV?4lA%Dy_gF`x< zm;M3bq%%W--$;WYBvMe`M%se9sF7Z2KOL)~f;FGr6t4b1PvWXSgBErR9Qg;X{y%UU zIKs&{FAL})yl*cKFpB;FSJq4@A$PzBk>E~w05IQOS)+h+p77*MQmKmY62-wHJ=U13 z^5Q%$+RV>1->s_9-$0()>?eX8PuSiWxrcMuIXHvC;NHjbSC1aVx@lT9O{3k}H$J4~ zC-#B{KunagR-aP6wMSCt#cC$_lkh%dZgc^h#p&;tTiuXjf5Ac18W%s#Smbd&q1V&L zbTL57B7KlTYde;v-koOGh|l}h`F4*&3K0Q-;=5j+pNp<2J?8^GA4a3*Gzu0DYCl5r+!srsUN#v z+vx&1S_!HU*zmCaTmJSlWBY&|%qFMKH{VvPdIdmd& z!scXFND{DCUZm&Oej>R=syp{RZN~N}-fo{-GIDD>KV# z0i;Y-tB*iPtMC7!uK!|^xe1hA z3m%eP)?0Vp@;WhON}fj4Ok+Fz94VQQQmv|#o~TLY#+~NV%lf(@<6ZRDo0^cBNS5Uh zJ~i+@%9n|40KXRC<2Mpq(bIY5@4)@J2QNG|{h9jSilRv1lI_^R06@ zo1w5%fF!6zKN=wbP(YegG5vp(zc|7p65*z;dT+yw=So1YRD+1XdX2+Z=~&M;3>XJ;i<* zB&`*}TEht9;c)m^sh2lAgyLF2$^;>icf$(bJB0iZr7y%9BU|lKurayI%cLSgFOIRq&5 zFBH~e<^ik)x|8bK)=#P_qDrS!V$);}M^sBv*-OR9_k9Vmi)1yo4P$1rhj^#-(Y{(L zwj82%+s`}qgjS-YYIG?>V{o!$*0BJ&p?I;iIqHZJ2J z((_A|;w~b)!aZriC3#S`Dw_ZJsFxa;t*;|IU)JlZ92!+}UPyNS zu8OyN8UT}^qXwA;irPeGUTm94+z2gD*HJa%SXq{K-`HfKZu~9pPbs?}t#>)q?y!{i zW7;SCn&?M*%1jBcV_|}hyr4&QX-N7J z2H#fEU#t3L`dSHz%+KkT?_C>j>&&qt2L{hVQQjnl#?%vdLeZ9BgLLm?S_E?K1F~_Z zd4Y!LiYqlu_ zcXOkb&+-Csh#^Vz`^=ItyHZ}t`q`46wQbbF$_iAlFa-?XclWPRZZ*UXg5UOB2At4D{jI5Y{=JJ)O9yZ~xG4UMfZiDsOLVBtAHL$#-sy z#Z5j|t;8BE7>M?Zl3H=kUCgLD`eTyK-F~u|ac=Us#qzYJvCgt!QIox{h(HB|bc_Do zb4d7nPbd5z+#EKR|C!ZbVf)E-{J+QlxvqIhbIWOy9l`Heug8N|lzn;E>|=0+C42N5l1?{cMxZTq0192ns|X5GC_K%sMC6=l<>T z!b~^LnwbOe>3;v_h&p7O1)fP3#CpqKgP7Se-JpZQ9jkZwa`Vst$*;~UZh1d@bmP>jl{9GP>|N_;bx=YEVlgd%@}wxcXCoI1 z)S2$~@p<~145BbRh`xNa#SzKecYb=Jtm6{ga>LyV)o6d6YUH&ck#F@y67Jsouz$*B z>9fMH#W27~JXwebia~=Xa!*%i#zUZr@|m33Ef{d9+H1Cf^E@nQayRR5#Zlw z*6%3tm;2K*b~yRcw_?L2)`u?mK9+Xs)N_RT2}NyH>7&(R2RweZ!v|=jEzac2yaiG8Q2WMvZ;?-p)y1#toKbmty&XGUPzNb$Vr1=wUYteJ+KA%){~ zB9BWeTV=1~>z8G=T`u<6b>jO^g>ddyR10cpC8R-u?_amHkD`)Y;l1xT(e+JuQs>r(mZite{f}%s zZO(rmhwjs*hR7&Mr@L<65n!Sm-6`Z4E9_ct`NV0K({6*pxFcy2$@pN$T&9HVy10`8^ux-j-(v4hbW-ZWSbn)L9}OxN@^9bK{uuI zBg17eGqi^M^_M@}SS9bc8jqs`8U!(CxP%^^-k+-F4~Iuz@doRCRauub@s@#WZ50sX zncM4-xWZy8(s_Ao7YJu7bq6UdDu`OAlT^awX~Q z&p8{9bP<6|*4-z-kCn^_!x4b%6)_~JG*YikTTpM_klXmZVfL2I`LIb8*^O5p0lEjF z@i7!PW%v+{+ z40?+e#@QJb{s3)@J@IsXb(LIwQu*;UcZ^ zo%do(F)TrjC1IYlXc)1qp&pROEm^VVaw(#3!NA`Ik#O6~RAKAh)_N>RJX`^helj-g zS}=Cf$2$$?h){=vTnc4y5^SP(ak}gw1qPIGGhf94k1Pi0-27d{{ujv=D4kXoTdq*Q z$eQMm7_!K%R%O$VL|3$=&;1NzVA&Nok(JD<9)M}INBEwSN2t8_ZvYwf<=kaNx9?=8(8dFI@xeScSzoWt-05k!+1E_2}>&GCXGPz zWf+3@-I{RnBoO2F_#nu^2FF>6^}@OPG?ZD;RiW@yW|MTOjm>4jRiSLdYlp)YQex1k zeX2!8Ea;@#JtE`e%urtXjM|f!1ukgNO?p@FJPd442oVbwf8qiN3wIK!Wv;^)BRS2> z2yLJikMhtpH|8rwI*`y#F_zgLlkIOWsCY2@8O>F4ZBa?X4ucUPf1;QhdpRrx*S9&O zw)O>EGr@`RsqJOY;Gib)5}VG06@J`V+EL$(oUit#H^7vntM0$xzQp$qX*eHlAi|~~ zJ>(@YB4%X|dLR-)EOt$a2^%RXu)xJjsE|4A_iF6{0RpfULT6xtpw=QbfvO7EZRjA} ztceDvi#LIT9cvspVTXCHG0&PLIKfaB&vo%FEG7tFve(XAdIll@%DB{bHc}^Or6)!` zG~!{{!pT?QXp@w=!|*$42qnP|CcZ^nEd&=Gt5lH(ik16-5-6BU3aQciY(r^>1Zz_d zde!~-^+3w}CKA&lcihW>^Yau-S=O<|WpwETaVjsHlo2FXQKZYy1*DgvMvDvK8cl|D zcX@93a6^lTNPlI=FgAru5>8yf-|d6Cqa@+MpLN&-MsnLiYuoJ2Twq?Glj4}DT!e6u zS3DD;s-?p)4*k<2`m2BSL`^WLtLTA86Ab>q(kTxyqdD;uk;-a@$O))|+BdXX&GLX5 z6UDQuY4-ICu%+v;~ZmeoRf@vpiusus%!tkP4g*GUdp6=JrWRo*gfO}$dU#i>X@UN=>DAOpI$k4+sr85)Zb{tCuVtBe1=5m}uDi7K z7+HvCvobR8*z9J^N3}W~?akmQQH{Qy*o353jeTBN*QBL?cXYg&goR^BGohno{sjR5 z;^s>0>%JW~jkkFg<6Yb7l^o~Y)V#k$?Nz+DNSa z?l#WQ;3<;tO&%{%U>pXrD@@y&02Roq!_tnhE!gMAc}PWJ@8JK$__lsTykEl>%$V& zRIExZKNr{?AQ$M|&7|n@c$3>AP&OgRVp}?_6%=)G{_Q`!<-I|l##i(P2wUu}<*;I) zO~POmrWatU4uKd#7ZaG|anRSZ07Wt?wFc~A`RYGi{)w^CHHb|HuQ;!ta#?u-qSW$2 zASdhr*~Pr9;~VNRat}R)#egdbZ8XjFmyoMF%ya(=p0^T_&^^a17So0n16LVECyo`B@Ud>KD0W@j}z3!i$7%XSHY2+NzY1tSnCd1 zR-}&js({CnjSCoPBn)A&YQ1_; z-2*^d@Aj1Uh|*^$_D%>1tE@&d;6BzKi6#_u=NXgmB$Z5;@L#*ZKiQ--&Edir-Ssi=R? zK_eZEVP2!D7k~(bm?;cuZS^wWhyl-SSYAOy_~i}zF;(d)TFWr6kSn8nocO&+8%`{p zX;&t3UIAENkYG8f((WR*+fJ7^g6-d;uJ;=g>ovW) zX@Z^yYPSyuiyVuj($fO^JzpW9UKM^${~Z= zI^Jr5u^Mi_QYGP{T`)hObpU3D+UNHb?NiqFsrJ{wHKF!(!8)Ynwk7Np-%r+>SQ}XM zMcg;<>lY?m9qE5?2-&&*r$flh!Nu{vbqJd@HJlbD{wwcwn&wl>-M@8euJb;Om1z(P z{_E))DS(naSlPyMZtnD7Z_iGr6n$C97N=5LEZv1h{pP;F^Ze%XSJ)hUD+?-lxFPg3> zP≤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�g2 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 - -Revision History -Revision 6.4 Mer. 10 Avr 2025 TL - ---------------------------------------------------------------------- - -Table of Contents - -1. Résumé -2. Introduction - 2.1. Disponibilité - 2.2. Motivation - 2.3. Comment fonctionne FAI - 2.4. Caractéristiques - 2.5. La durée d’installation -3. Quickstart - Pour l’utilisateur impatient - 3.1. Ma première installation - 3.2. Ma première installation à l’aide d’un serveur -4. Vue d’ensemble et Concepts - 4.1. Terminologie - 4.2. Le concept de classe -5. Configurer votre faiserver - 5.1. Installer les paquets FAI - 5.2. Créer le nfsroot - 5.3. Création de l’espace de configuration - 5.4. Configurer les démons réseau - 5.5. Création de la configuration PXELINUX - 5.6. Serveur personnalisé -6. Planifiez votre installation - 6.1. L’espace de configuration et ses sous-répertoires - 6.2. Définition des classes - 6.3. Définition des Variables - 6.4. Configuration du disque dur - 6.5. Extraction du fichier de base - 6.6. Pré-ensemencement Debconf - 6.7. Accès au dépôt de paquets - 6.8. Configuration des paquets logiciels - 6.9. Scripts de personnalisation - 6.10. Les hooks, les « crochets » - 6.11. Options (flags) de FAI -7. FAI installe votre planification - 7.1. La première phase d’une installation - 7.2. Messages de démarrage - 7.3. Redémarrage de l’ordinateur dans le nouveau système - 7.4. Démarrage de FAI (tâche confdir) - 7.5. Définition de classes et de variables (tâches defclass et - defvar) - 7.6. Partitionnement des disques locaux, création des systèmes de - fichiers (tâche partition) - 7.7. Pré-ensemencement Debconf (tâche debconf) - 7.8. Installation de paquets logiciels (tâche instsoft) - 7.9. Personnalisation spécifique au site (tâche configure) - 7.10. Enregistrement des fichiers journaux (tâche savelog) - 7.11. Redémarrage du nouveau système installé -8. Sujets avancés pour FAI - 8.1. Vérification des paramètres reçus des serveurs DHCP - 8.2. Surveillance de plusieurs clients d’installation - 8.3. Collecte d’adresses Ethernet pour plusieurs hôtes - 8.4. Détails du démarrage PXE - 8.5. Personnaliser la configuration de son serveur d’installation - 8.6. Création d’un CD ou d’une clé USB FAI - 8.7. Création d’images de disque VM à l’aide de FAI - 8.8. Création d’une image vive amorçable - 8.9. Construire des images disque d’architecture différente - (cross-architecture) - 8.10. Système de sauvetage FAI - 8.11. FAI sans NFS - 8.12. Installation d’autres distributions à l’aide d’un nfsroot - Debian - 8.13. Création d’environnements chroot et de virtualisation - 8.14. Utilisation de FAI pour les mises à jour - 8.15. Comment installer un système d’exploitation 32 bits à - partir d’un système d’exploitation 64 bits - 8.16. Arrêt d’urgence de l’installation quand une erreur se - produit -9. Divers conseils et détails - 9.1. La liste des tâches - 9.2. Tests automatisés - 9.3. Découvrir automatiquement - 9.4. Modification du périphérique d’amorçage - 9.5. Comment créer un miroir Debian local - 9.6. Petits conseils - 9.7. flag_reboot (FAI_FLAGS) - 9.8. Fichiers journaux - 9.9. Comment utiliser HTTP pour le démarrage PXE -10. Dépannage - 10.1. Erreurs d’amorçage - -Une version plus ancienne de ce guide en français est disponible à -https://fai-project.org/fai-guide-fr. - - ---------------------------------------------------------------------- - -1. Résumé - ---------------------------------------------------------------------- - -FAI est un système non-interactif pour installer, configurer et gérer -des systèmes Linux et les configurations de logiciels sur des -ordinateurs comme sur des machines virtuelles et des environnements -chroot, depuis des petits réseaux jusqu’à de grandes infrastructures -et de grands clusters. - -Ce manuel décrit le logiciel Fully Automatic Installation -(installation entièrement automatique). Cela inclut l’installation -des paquets, la configuration du serveur, la création de la -configuration et la gestion des erreurs. - -(c) 2000-2025 Thomas Lange - -Ce manuel est un logiciel libre; Vous pouvez le redistribuer et / ou -le modifier selon les termes de la Licence Publique Générale GNU -publiée par la Free Software Foundation; Soit la version 2, soit (à -votre choix) toute version ultérieure. - -Ceci est distribué dans l’espoir qu’il sera utile, mais sans aucune -garantie ; Sans même la garantie implicite de qualité marchande ou -d’adaptation à un usage particulier. Pour plus de détails, consultez -la License Générale Publique GNU. - -Une copie de la Licence Générale Publique GNU est disponible sous la -forme /usr/share/common-licenses/GPL dans la distribution Debian GNU/ -Linux ou sur le World Wide Web sur le site GNU Vous pouvez également -l’obtenir en écrivant à la Free Software Foundation , Inc., 59 Temple -Place - Suite 330, Boston, MA 02111-1307, États-Unis. - - ---------------------------------------------------------------------- - -2. Introduction - ---------------------------------------------------------------------- - - -2.1. Disponibilité - --------------- - -Page d’accueil - https://fai-project.org -Wiki FAI - https://wiki.fai-project.org -Téléchargement - https://fai-project.org/download -Entrée pour sources.list - deb https://fai-project.org/download bookworm koeln -Pages de manuel - https://fai-project.org/doc/man/ -Listes de diffusion - https://lists.uni-koeln.de/mailman/listinfo/linux-fai -Retour d’information - Envoyez vos réflexions et vos commentaires à fai@fai-project.org - ou à la liste de diffusion. -Boguess - Utiliser le système de suivi des bogues Debian (BTS) https:// - bugs.debian.org/src:fai -Changements visibles par l’utilisateur - http://fai-project.org/NEWS -Arbre source via git - git clone git://github.com/faiproject/fai.git -Voir l’arbre source avec https - https://github.com/faiproject/fai - -Les pages man incluent toujours des informations à jour et beaucoup -de détails sur toutes les commandes FAI. Alors, n’oubliez pas de les -lire attentivement. Lisez maintenant ce manuel, puis profitez de -l’installation entièrement automatique et de votre temps économisé. - - -2.2. Motivation - --------------- - -Avez-vous déjà effectué des installations identiques d’un système -d’exploitation à plusieurs reprises? Souhaitez-vous être en mesure -d’installer un cluster Linux avec des dizaines de nœuds d’un seul -coup? - -Répéter la même tâche encore et encore est ennuyeux — et conduira -certainement à des erreurs. Aussi beaucoup de temps pourrait être -sauvé si les installations étaient faites automatiquement. Un -processus d’installation avec interaction manuelle ne peut pas passer -à l’échelle. Mais les grappes (clusters) ont l’habitude de croître au -fil des ans. Pensez à long terme plutôt que de planifier seulement -quelques mois dans l’avenir. - -En 1999, j’ai dû effectuer une installation d’un cluster Linux avec -un serveur et 16 clients. Puisque j’ai eu beaucoup d’expérience en -faisant des installations automatiques des systèmes d’exploitation de -Solaris sur le matériel de SUN SPARC, l’idée de construire une -installation automatique pour Debian est née. Solaris dispose d’une -fonctionnalité d’installation automatique appelée JumpStart ^[1]. En -conjonction avec les scripts d’auto-installation de Casper Dik ^[2], -Je pouvais épargner beaucoup de temps non seulement pour chaque -nouvel ordinateur de SUN, mais aussi pour la réinstallation des -postes de travail existants. Par exemple, j’ai dû construire un LAN -temporaire avec quatre stations de travail SUN pour une conférence, -qui a duré seulement quelques jours. J’ai retiré ces postes de -travail de notre réseau de recherche habituel et mis en place une -nouvelle installation pour la conférence. Quand elle a été terminée, -j’ai simplement réintégré les postes de travail dans le réseau de -recherche, redémarré une seule fois, et après une demi-heure, tout -était opérationnel comme avant. La configuration de tous les postes -de travail était exactement la même qu’avant la conférence, car tout -était effectué par le même processus d’installation. J’ai également -utilisé l’installation automatique pour réinstaller un poste de -travail après qu’un disque dur endommagé ait été remplacé. Il m’a -fallu deux semaines pour recevoir le nouveau disque dur, mais -seulement quelques minutes après l’installation du nouveau disque, le -poste de travail fonctionnait comme avant. Et c’est pourquoi j’ai -choisi d’adapter cette technique à un cluster de PC sous Linux. - - -2.3. Comment fonctionne FAI - --------------- - -Le client d’installation qui sera installé à l’aide de FAI, est -démarré via une carte réseau ou à partir d’un CD ou d’une clé USB. Il -obtient une adresse IP et démarre un noyau Linux qui monte son -système de fichiers racine via NFS (nfsroot) du serveur -d’installation. Une fois le noyau démarré, le script de démarrage FAI -exécute l’installation automatique qui n’a pas besoin d’interaction. -Tout d’abord, les disques durs seront partitionnés, les systèmes de -fichiers seront créés et des paquets logiciels seront ensuite -installés. Après cela, le nouveau système d’exploitation installé est -configuré selon vos besoins locaux en utilisant quelques scripts. -Enfin, le nouveau système d’exploitation sera démarré à partir du -disque local. - -Les détails sur la façon d’installer l’ordinateur (la configuration) -sont stockés dans l’espace de configuration sur le serveur -d’installation. Les fichiers de configuration sont répartis entre des -groupes d’ordinateurs s’ils sont similaires, en utilisant le concept -de classe. Vous n’avez donc pas besoin de créer une configuration -pour chaque nouvel hôte. Ainsi, FAI est une méthode évolutive pour -installer un gros cluster avec un grand nombre de nœuds même si leur -configuration n’est pas identique. - -FAI peut également être utilisé comme un système de sauvetage ou pour -l’inventaire matériel. Vous pouvez démarrer votre ordinateur, mais il -n’effectuera pas une installation. Au lieu de cela, il exécutera un -Debian GNU / Linux entièrement fonctionnel sans utiliser les disques -durs locaux. Ensuite, vous pouvez effectuer une connexion à distance -et sauvegarder ou restaurer une partition de disque, vérifier un -système de fichiers, inspecter le matériel ou effectuer toute autre -tâche. - - -2.4. Caractéristiques - --------------- - - * On peut faire une installation entièrement automatisée. - * Installation très rapide sans surveillance. - * Système flexible grâce à un concept de classe simple. - * Mise à jour des systèmes en cours d’exécution sans - réinstallation. - * Images « Cloud » pour un environnement de virtualisation. - * Les hôtes peuvent démarrer à partir d’une carte réseau, d’un CD, - d’une clé USB. - * Création simple d’une image ISO vive ou pour l’installation. - * Prise en charge de PXE avec la méthode de démarrage DHCP. - * Support des systèmes de fichiers ReiserFS, ext3/ext4, btrfs et - XFS. - * Support logiciel RAID et LVM. Support LUKS. - * Détection automatique du matériel. - * On peut déployer Debian, Ubuntu, Rocky Linux, CentOS, AlmaLinux, - SuSE - * Possibilité de connexion à distance via ssh lors du processus - d’installation. - * Toutes les configurations similaires sont partagées entre tous - les les clients d’installation. - * Les fichiers journaux de toutes les installations sont - enregistrés sur le serveur d’installation. - * Prise en charge des scripts Shell, Perl, Python, Ruby, expect et - CFEngine lors de l’étape de personnalisation. - * Prise en charge de nombreux protocoles comme NFS, FTP, HTTP, git. - * Peut être utilisé comme un système de sauvetage et pour - l’inventaire matériel. - * Prise en charge de clients sans disque. - * Prise en charge trans-architecture, par exemple pour des - appareils embarqués (embedded devices). - * Ajoutez facilement vos propres fonctions via des hooks ou - modifiez le comportement par défaut. - * Prise en charge du clonage de machines utilisant des images de - disque. - - -2.5. La durée d’installation - --------------- - -La durée d’installation est déterminée par la quantité de logiciel et -la vitesse du disque dur. Voici quelques exemples de durée. Tous les -clients d’installation avaient une carte réseau 1Gbit installée. - -+-----------------------------------------------------+ -|CPU |RAM|Disque | Logiciels| durée| -| | | | installés| | -|---------------+---+--------+-----------------+------| -|i7-3770T |8GB|SSD | 6 GB logiciel| 8.5| -|2.50GHz | | | | min| -|---------------+---+--------+-----------------+------| -|Core-i7 3.2GHz |6GB|SATA | 4.3GB logiciel| 7 min| -| | |disk | | | -|---------------+---+--------+-----------------+------| -|Core-i7 3.2GHz |6GB|SATA | 471 MB logiciel| 77sec| -| | |disk | | | -|---------------+---+--------+-----------------+------| -|Intel Core2 Duo|2GB|SATA | 3 GB logiciel|14 min| -| | |disk | | | -+-----------------------------------------------------+ - ---------------------------------------------------------------------- - -3. Quickstart - Pour l’utilisateur impatient - ---------------------------------------------------------------------- - - -3.1. Ma première installation - --------------- - -Sans plus tarder, cette section fournira une démonstration rapide et -facile d’une installation entièrement automatique à l’aide du CD FAI -et d’une machine virtuelle. - -Il suffit de télécharger l' image ISO du CD à partir de https:// -fai-project.org/fai-cd et de démarrer votre VM à l’aide de ce CD. -Vous verrez un menu grub où vous pouvez choisir parmi différents -types d’installation. - -Cette installation s’exécutera sans serveur d’installation. -L’installation à partir du CD est identique à celle exécutée dans un -environnement réseau à l’aide du serveur d’installation FAI, et peut -être aussi effectuée à l’aide d’une clé USB sur un ordinateur -physique. - -On peut aussi créer soi-même une image FAI (installation entièrement -automatique) à la page web https://fai-project.org/FAIme sans avoir -besoin d’installer FAI sur son ordinateur. - - -3.2. Ma première installation à l’aide d’un serveur - --------------- - -Nous allons créer un réseau privé et lancer deux machines vituelles. -L’une deviendra votre propre serveur FAI, l’autre sera un client -d’installation. - -Si vous avez l’intention d’utiliser VMware ou VirtualBox, -assurez-vous que votre client utilise une connexion réseau pontée -(bridged network). On trouve une description détaillée dans le wiki -FAI ^[3]. on ne peut pas utiliser des interfaces réseau pontées via -le réseau sans fil, car la plupart des cartes réseau WiFi ne prennent -pas en charge cette fonctionnalité. - -Quand on utilise Qemu/KVM et le script fai-kvm on peut créer le -réseau à l’aide de la commande fai-mk-network. Il faut commencer par -installer quelques paquets logiciels - -# apt-get install qemu-system-gui qemu-kvm qemu-utils - -La commande ci-dessous met en place un réseau privé avec un pont -logiciel et plusieurs TAPs réseau ^[4] appartenant à l’utilisateur -. - -fai-mk-network - -Après cela, vous pouvez utiliser fai-kvm (-h vous aidera) pour -démarrer des machines virtuelles en utilisant KVM qui sont connectés -à ce réseau privé. Faites attention. Par défaut, fai-kvm créera les -images de disque pour les machines virtuelles dans +/tmp+, qui est un -disque RAM sur la plupart des systèmes. Il n’y a aucun problème à -créer une image de disque vide de 20G dans /tmp (même si cette -partition est de 4 Go de taille), mais alors que la VM écrit des -données sur son disque, cela commencera à consommer de l’espace dans -+/tmp+. - -Démarrez le premier hôte virtuel, qui deviendra le serveur FAI ^[5] : - -fai-kvm -Vn -s20 -u 1 cd faicd64-small.iso - -Dans le menu grub; sélectionnez faiserver, using internal DHCP and a -fixed IP. Cela va installer un hôte appelé faiserver avec IP -192.168.33.250 qui contient tous les logiciels nécessaires pour un -serveur FAI. Il configurera également un cache de paquets local (en -utilisant apt-cacher-ng). Une fois l’installation terminée, -redémarrez la machine. Lors du premier démarrage du nouveau système, -il configurera automatiquement le nfsroot. Cela peut prendre quelques -minutes. - -Après cela, vous pouvez démarrer des hôtes supplémentaires en -utilisant un démarrage réseau. Pour chaque nouvel hôte, vous devez -utiliser une valeur différente pour +-u+, qui sera utilisée pour -générer des adresses MAC différentes et utiliser des noms de fichier -d’image de disque différents. - -fai-kvm -Vn -u 2 pxe - -Ces clients d’installation vous montreront un menu, où vous pouvez -sélectionner le type d’installation que vous souhaitez effectuer. Si -le client d’installation ne trouve pas le serveur, c’est généralement -parce que fai-monitor n’y fonctionne plus. Cela peut se produire si -vous redémarrez le faiserver après l’installation. Pour remédier à -cela, exécutez simplement fai-monitor sur le faiserver et relancez le -démarrage du client. - -Un autre client pourrait être lancé avec: - -fai-kvm -Vn -u 3 pxe - -Vous pouvez démarrer autant de machines dans le réseau que de TAPs -réseau disponibles. Toutes ces machines peuvent se connecter à -l’Internet extérieur, mais sont seulement accessibles à partir de -votre machine hôte. - - ---------------------------------------------------------------------- - -4. Vue d’ensemble et Concepts - ---------------------------------------------------------------------- - -FAI est un système non interactif permettant d’installer, de -personnaliser et de gérer les configurations de systèmes et de -logiciels Linux sur les ordinateurs ainsi que sur les machines -virtuelles et les environnements chroot, des petits réseaux aux -grandes infrastructures et clusters. Vous pouvez prendre un ou -plusieurs PC vierges, mettre sous tension et après quelques minutes, -Linux est installé, configuré et fonctionnel sur l’ensemble du -cluster, sans aucune interaction nécessaire. Ainsi, il s’agit d’une -méthode évolutive pour installer et mettre à jour un cluster sans -surveillance impliquant peu d’efforts. FAI utilise le système -d’exploitation Linux et une collection de scripts shell et Perl pour -le processus d’installation. Les modifications apportées aux fichiers -de configuration du système d’exploitation peuvent être effectuées -par des scripts CFEngine, shell (bash et zsh), Perl, Python, Ruby et -expect. - -Les personnes intéressées par FAI sont des administrateurs système -qui doivent installer Linux sur une ou même des centaines -d’ordinateurs. Parce qu’il s’agit d’un outil d’installation à usage -général, il peut être utilisé pour l’installation d’un cluster -Beowulf, d’une ferme de rendu ou d’un laboratoire Linux ou d’une -salle de classe. De plus, des réseaux Linux de grande envergure avec -différents matériels ou différentes exigences d’installation sont -faciles à établir à l’aide de FAI. Mais n’oubliez pas de planifier -votre installation. Le chapitre [plan] contient quelques conseils -utiles à ce sujet. - - -4.1.  Terminologie - --------------- - -Commençons par décrire quelques termes utilisés dans ce manuel. - -Le serveur d’installation  - Il fournit les services DHCP, TFTP et NFS ainsi que les données - de configuration pour tous les clients d’installation. Dans les - exemples de ce manuel, cet hôte s’appelle faiserver. C’est l’hôte - où le paquet faiserver est installé. -Le client d’installation  - Un hôte qui sera installé à l’aide de FAI et une configuration - fournie par le serveur d’installation. Aussi appelé client pour - faire court. Dans ce manuel, les hôtes d’exemple sont appelés - demohost, xfcehost, gnomehost … Cet ordinateur doit démarrer à - partir de son interface réseau à l’aide de PXE. -Espace de configuration - - Une structure de sous-répertoire contenant plusieurs fichiers. - Ces fichiers décrivent les détails de la manière dont - l’installation des clients sera effectuée. Toutes les données de - configuration sont stockées là. Il est également appelé config - space pour faire court. Il comprend des informations sur : - - o Organisation du disque dur dans un format similaire à fstab - o Systèmes de fichiers locaux, leurs types, points de montage - et options de montage - o Paquets logiciels - o Disposition du clavier, fuseau horaire, configuration Xorg, - systèmes de fichiers distants, comptes utilisateurs, - imprimantes … - - Le package fai-doc inclut un exemple d’espace de configuration - incluant des exemples pour les hôtes utilisant l’environnement - XFCE et GNOME entre autres. En invoquant fai-mk-configspace on - copie ces exemples vers /srv/fai/config. Il est recommandé - d’étudier ces fichiers de configuration et ces scripts pour mieux - comprendre comment FAI fonctionne. - -nfsroot, NFS-Root  - Un système de fichiers situé sur le serveur d’installation. - Pendant le processus d’installation, c’est le système de fichiers - complet pour les clients d’installation. Tous les clients - partagent le même nfsroot, qu’ils montent en lecture seule. Le - nfsroot a besoin d’environ 1.1Go d’espace disque libre. -TFTP  - Sert aux clients le fichier initrd et le noyau utilisés pour le - processus d’installation. Avec le système de fichiers servi par - NFS, ces deux composent un système d’exploitation temporaire dans - lequel les installations sont réalisées. -Classes FAI  - Les classes sont des noms qui déterminent quel fichier de - configuration est sélectionné. Si un client appartient à la - classe WEBSERVER, il sera configuré en tant que serveur Web, la - classe DESKTOP pour, par exemple, déterminer les paquets - logiciels qui seront installés. -profil  - Un profil FAI est juste une liste de classes FAI assignées à un - nom de profil, qui est étendu par une description de ce profil. - C’est-à-dire que l’on peut avoir deux profils "Webserver", l’un - incluant la classe APACHE, et un autre incluant la classe NGINX, - pour ensuite installer la solution de serveur web correspondante. -les tâches  - L’installation d’un client se compose de plusieurs parties, - appelées tâches. Les tâches sont des sous-programmes prédéfinis - qui effectuent une certaine partie de la FAI. Les tâches FAI - suivantes sont exécutées au cours d’une installation sur les - clients d’installation. - - confdir # trouver l'espace de configuration - setup # quelques initialisations, lancement de sshd à la demande - defclass # définition des classes FAI - defvar # définition de variables - action # évaluer FAI_ACTION - install # Démarrer l'installation - partition # partitionner les disques durs, créer les systèmes de fichiers - mountdisks # monter les systèmes de fichiers - extrbase # extraire le fichier base.tar.xz - debconf # pré-ensemencer le deconf de Debian - repository # préparer l'accès aux dépôts de paquets - updatebase # mettre en place les outils de gestion de paquets et mettre les paquets à jour - instsoft # installer les paquets logiciels - configure # lancer les scripts de personnalisation - finish # faire un peu de ménage, afficher les statistiques d'installation - tests # appeler des tests s'il y en a - chboot # lancer fai-chboot sur le serveur d'installation - savelog # enregistrer les fichiers de journalisation localement et à distance - faiend # redémarrage de l'hôte, éjection du CD si nécessaire - - Voilà des tâches qui sont exécutées seulement lorsqu’on fait une - action différente - - dirinstall # installer un environnement chroot - softupdate # ne faire que la configuration du système - sysinfo # imprimer une information système détaillée - inventory # imprimer un inventaire court du matériel - -Pour une description plus détaillée des tâches , voir [tasks]. - -Notez que vous n’êtes pas limité aux tâches FAI. Vous pouvez -également définir des programmes ou des scripts supplémentaires qui -seront exécutés à certaines occasions. On les appelle des hooks. - -hooks - Les Hooks sont des plugins, ils peuvent ajouter des - fonctionnalités supplémentaires au processus d’installation ou - même remplacer des tâches entières de FAI. Les Hooks sont - expliqués en détail dans [hooks]. - - -4.2. Le concept de classe - --------------- - -Les classes sont utilisées dans presque toutes les tâches de -l’installation. Les classes déterminent quels fichiers de -configuration choisir parmi une liste d’alternatives disponibles. -Pour déterminer les fichiers de configuration à utiliser, FAI -recherche dans la liste des classes définies et utilise tous les -fichiers de configuration correspondant à un nom de classe ^[6]. La -boucle suivante implémente cette fonction en pseudo-code shell : - -for class in $all_classes; do - if [ -r $config_dir/$class ]; then # s'il exite un fichier nommé $class - your_command $config_dir/$class # invoquer une commande avec ce nom de fichier - # sortir si on n'a besoin que du premier fichier qui convient - fi -done - -La beauté de ceci c’est qu’on peut ajouter une nouvelle alternative -de configuration et qu’elle sera automatiquement utilisée par FAI -sans modifier le code, si le fichier de configuration utilise un nom -de classe. - -C’est parce que la boucle détecte automatiquement les nouveaux -fichiers de configuration qui doivent être utilisés. L’idée -d’utiliser des classes en général et d’utiliser certains fichiers -correspondant à un nom de classe pour une configuration est adoptée à -partir des scripts d’installation par Casper Dik pour Solaris. Cette -technique s’est avérée très utile et facile. - -Vous pouvez regrouper plusieurs hôtes partageant les mêmes fichiers -de configuration en utilisant la même classe. Vous pouvez également -diviser l’ensemble des données de configuration pour tous les clients -en plusieurs classes et les utiliser comme des briques de lego et -construire la configuration entière pour un seul client en assemblant -les briques. - -Si un client appartient à la classe A, on dit que la classe A est -définie pour ce client. Une classe n’a pas de valeur, elle est juste -définie ou indéfinie. - -Les classes déterminent comment l’installation est effectuée. Par -exemple, un client d’installation peut être configuré pour obtenir le -bureau XFCE en y ajoutant simplement la classe XFCE . Naturellement, -des configurations plus granulaires sont également possibles. Par -exemple, les classes peuvent décrire comment le disque dur doit être -partitionné, elles peuvent définir quels paquets logiciels seront -installés, ou quelles étapes de personnalisation seront exécutées. - -Souvent, une configuration client est juste créée en modifiant ou en -ajoutant les classes auxquelles ce client appartient, ce qui rend -l’installation d’un nouveau client très facile. Ainsi, aucune -information supplémentaire ne doit être ajoutée à l’espace de -configuration si les classes existantes suffisent à vos besoins. - -Comme vous pouvez le voir, les classes sont un pilier central de la -personnalisation de votre espace de configuration et de celui de de -votre client d’installation. Pour définir vos propres classes, -reportez-vous à [defining classes]. - - ---------------------------------------------------------------------- - -5. Configurer votre faiserver - ---------------------------------------------------------------------- - -Voici comment configurer le serveur d’installation en quelques -minutes. Les étapes suivantes sont nécessaires : - - 1. Configurer le serveur d’installation - - a. Installer les paquets de FAI - b. Créer le nfsroot - c. Copier les exemples dans l’espace de configuration - d. Configurer les démons réseau - e. Créer les configurations PXELINUX - 2. Démarrage et installation des clients - - -5.1. Installer les paquets FAI - --------------- - - * Installer la clé du dépôt de paquets du projet FAI. - * Ajouter l’URL du dépôt de paquets du projet FAI. - * Installer le paquet fai-quickstart sur le serveur d’installation. - -Utilisez ces commandes pour l’installation : - -# wget -O /etc/apt/trusted.gpg.d/fai-project.gpg https://fai-project.org/download/2BF8D9FE074BCDE4.gpg -# echo "deb http://fai-project.org/download bookworm koeln" > /etc/apt/sources.list.d/fai.list - -ou - -# apt install extrepo ; extrepo enable fai - -et ensuite : - -# apt-get update -# aptitude install fai-quickstart - -Cela installera également les paquets pour les démons de serveur -DHCP, TFTP et NFS. - - -5.2. Créer le nfsroot - --------------- - - * Activez également le dépôt de paquets du projet FAI dans un autre - fichier sources.list qui est utilisé lors de la construction du - nfsroot. Ensuite, activez l’utilisateur de journal pour FAI. - -# sed -i -e 's/^#deb/deb/' /etc/fai/apt/sources.list -# sed -i -e 's/#LOGUSER/LOGUSER/' /etc/fai/fai.conf - - * Par défaut, FAI utilise http://httpredir.debian.org/ comme miroir - de paquets, qui va tenter de trouver un dépôt de paquets rapide - pour vous. ^[7] Ensuite, on peut lancer fai-setup(8) ^[8] Et - vérifiez si tout s’est bien passé. Le fichier de journal est - écrit dans /var/log/fai/fai-setup.log. - -# fai-setup -v - - * Voilà quelques-unes des lignes que vous verrez à la fin de - fai-setup. Un exemple complet de fai-setup.log est disponible sur - la page web FAI à https://fai-project.org/logs/fai-setup.log. - -FAI packages and related packages inside the nfsroot: -dracut 059-4 -dracut-live 059-4 -dracut-network 059-4 -dracut-squash 059-4 -fai-client 6.2 -fai-nfsroot 6.2 -fai-setup-storage 6.2 -Waiting for background jobs to finish -fai-make-nfsroot finished properly. -Log file written to /var/log/fai/fai-make-nfsroot.log -Adding line to /etc/exports: /srv/fai/config 192.168.33.250/24(async,ro,no_subtree_check) -Adding line to /etc/exports: /srv/fai/nfsroot 192.168.33.250/24(async,ro,no_subtree_check,no_root_squash) -Reloading nfs-kernel-server configuration (via systemctl): nfs-kernel-server.service. - -Your initial config space is now located in /srv/fai/config -Please don't forget to fill out the FAI questionnaire after you've finished your project with FAI. - -FAI setup finished. -Log file written to /var/log/fai/fai-setup.log - - * fai-setup a créé le LOGUSER, le nfsroot et a ajouté des lignes - supplémentaires à /etc/exports. Les sous-répertoires ajoutés à / - etc/exports sont exportés via NFS v3, de sorte que tous les - clients d’installation dans le même sous-réseau peuvent les - monter via NFS. - - -5.3. Création de l’espace de configuration - --------------- - -Installez les exemples simples dans l’espace de configuration ^[9]. - -$ fai-mk-configspace - -Ces exemples contiennent la configuration pour certains hôtes -d’exemple. Selon le nom d’hôte utilisé, votre ordinateur sera -configuré comme suit : - -demohost - Une machine qui n’a besoin que d’un petit disque dur. Cette - machine est configurée avec le réseau en tant que client DHCP, et - une démo de compte est créée. -xfcehost - Un bureau XFCE est installé, utilisant LVM, et la démo du compte - est créée. -gnomehost - Un bureau GNOME est installé et la démo du compte est créée. - -ubuntuhost::\n" Un bureau Ubuntu sera installé et la démo du compte -est créée. - -autres noms d’hôtes - Les hôtes disposant d’un autre nom d’hôte utiliseront notamment - les classes FAIBASE, DHCPC et GRUB. - -Tous les hôtes auront un compte appelé demo avec mot de passe fai. Le -compte root a également le mot de passe fai. - -Si l’indicateur FAI menu est ajouté, au lieu d’utiliser le nom d’hôte -pour déterminer le type d’installation, un menu est présenté et -l’utilisateur peut choisir un profil pour l’installation. - - -5.4. Configurer les démons réseau - --------------- - -Pour démarrer le client d’installation via PXE, le serveur -d’installation a besoin d’un démon DHCP et d’un démon TFTP -fonctionnels. Le paquet fai-quickstart a déjà installé les paquets -logiciels pour ces démons. En outre, le paquet du serveur NFS pour -l’exportation du nfsroot et de l’espace de configuration a été -installé. - -5.4.1. Configuration du démon DHCP - -Idéalement, votre faiserver doit également être votre serveur DHCP. -Si ce n’est pas le cas, demandez à l’administrateur responsable du -serveur DHCP de le configurer conformément à cette section. Il est -possible d’éviter cela optionnellement en utilisant la fonctionnalité -[autodiscover] diffusée dans FAI 5.0. - -Un exemple pour dhcpd.conf(5) est fourni avec le paquet fai-doc. -Commencez à utiliser cet exemple et regardez toutes les options qui y -sont utilisées. - -# cp /usr/share/doc/fai-doc/examples/etc/dhcpd.conf /etc/dhcp/ - -Les seules informations spécifiques FAI contenues dans ce fichier de -configuration sont d’assigner filename (DHCP option 67) à la valeur -fai/pxelinux.0 et d’assigner next-server (DHCP option 66, also aussi -nommée TFTP server name) et server-name à la valeur du nom de votre -serveur d’install . Toutes les autres informations sont uniquement -des données liées au réseau, qui sont utilisées dans presque toutes -les configurations DHCP. Ajustez ces paramètres de réseau à vos -besoins locaux. - -deny unknown-clients; -option dhcp-max-message-size 2048; -use-host-decl-names on; - -subnet 192.168.33.0 netmask 255.255.255.0 { - option routers 192.168.33.250; - option domain-name "my.example"; - option domain-name-servers 192.168.33.250; - option time-servers faiserver; - option ntp-servers faiserver; - server-name faiserver; - next-server faiserver; - filename "fai/pxelinux.0"; -} - -Si vous apportez des modifications à la configuration DHCP, vous -devez redémarrer le démon. - -# invoke-rc.d isc-dhcp-server restart - -Si vous disposez de plusieurs interfaces réseau, vous pouvez définir -l’interface que le serveur écoutera dans /etc/default/isc-dhcp-server -. Par défaut, le démon DHCP écrit ses messages de journalisation dans -/var/log/daemon.log. - -5.4.2. Ajout d’une entrée d’hôte au DHCP - -L’adresse MAC est donnée par le matériel de la carte réseau. Pour -chaque client d’installation, vous collectez son adresse MAC et -l’associez à une adresse IP et à un nom d’hôte. Tout d’abord, nous -ajoutons l’adresse IP et le nom d’hôte à /etc/hosts ^[10]. - -192.168.33.100 demohost - -L’association de l’adresse MAC à l’adresse IP est effectuée dans le -fichier dhcpd.conf. Ici, nous ajoutons une entrée d’hôte en utilisant -la commande +dhcp-edit(8)+ . Ici, vous devez remplacer -01:02:03:AB:CD:EF avec l’adresse MAC que vous avez trouvé. - -# dhcp-edit demohost 01:02:03:AB:CD:EF - -Après l’invocation de cette commande, voici à quoi l’entrée d’hôte -dans dhcpd.conf ressemblera : - -host demohost {hardware ethernet 01:02:03:AB:CD:EF;fixed-address demohost;} - -5.4.3. TFTP - -Normalement, vous n’avez pas besoin d’apporter de modifications à la -configuration démon TFTP. Les fichiers fournis par TFTP sont situés -dans /srv/tftp/fai. - -5.4.4. NFS - -La commande fai-setup a déjà configuré le démon NFS et ajouté -quelques lignes au fichier de configuration /etc/exports. Il exporte -les répertoires en utilisant NFS v3. - - -5.5. Création de la configuration PXELINUX - --------------- - -La dernière étape avant de démarrer votre client pour la première -fois est de spécifier quelle configuration le client doit démarrer -lors de l’amorçage PXE. Nous utilisons la commande fai-chboot(8) pour -créer une configuration pxelinux pour chaque client d’installation. -Cela comprend des informations sur le noyau, le fichier initrd, -l’espace de configuration et certains paramètres d’amorçage. Vous -devriez lire la page de manuel, qui vous donne quelques bons -exemples. Voici la commande pour démarrer l’installation de l’hôte -demohost. - -$ fai-chboot -IFv -u nfs://faiserver/srv/fai/config demohost - -Booting kernel vmlinuz-4.19.0-5-amd64 - append initrd=initrd.img-4.19.0-5-amd64 ip=dhcp - FAI_FLAGS=verbose,sshd,createvt FAI_CONFIG_SRC=nfs://faiserver/srv/fai/config - -demohost has 192.168.33.100 in hex C0A82164 -Writing file /srv/tftp/fai/pxelinux.cfg/C0A82164 for demohost - -À ce stade, vous devriez avoir une configuration faiserver de travail -et vos clients devraient démarrer dans FAI et être en mesure -d’installer l’un des exemples. - -Dans la section suivante, vous pouvez lire la planification de votre -installation, adapter votre espace de configuration à vos besoins -particuliers et étendre FAI à l’aide de hooks. - - -5.6. Serveur personnalisé - --------------- - -Le faiserver et sa configuration n’est nullement statique. Il est -possible de personnaliser et d’étendre votre serveur. Pour cela, -reportez-vous à la section[Customizing your install server setup] -dans [advanced]." - - ---------------------------------------------------------------------- - -6. Planifiez votre installation - ---------------------------------------------------------------------- - -Avant de commencer votre installation, vous devriez investir beaucoup -de temps dans la planification de votre installation. Une fois que -vous êtes satisfait de votre concept d’installation, FAI peut faire -toutes les tâches ennuyeuses et répétitives pour transformer vos -plans en réalité. FAI ne peut pas faire de bonnes installations si -votre concept est imparfait ou qu’il y manque quelques détails -importants. Commencez à planifier l’installation en répondant aux -questions suivantes : - - * Est-ce que je vais créer un cluster Beowulf ou dois-je installer - des machines de bureau ? - * À quoi ressemble ma topologie LAN ? - * Ai-je un matériel uniforme ? Le matériel sera-t-il uniforme à - l’avenir ? - * Le matériel a-t-il besoin d’un noyau spécial ? - * Comment nommer les hôtes ? - * Comment les disques durs locaux doivent-ils être partitionnés ? - * Quelles applications seront lancées par les utilisateurs ? - * Les utilisateurs ont-ils besoin d’un système de mise en file - d’attente ? - * Quels logiciels faut-il installer ? - * Quels démons devraient être lancés, et à quoi devrait ressembler - leur configuration ? - * Quels systèmes de fichiers distants doivent être montés ? - * Comment effectuer les sauvegardes ? - -Vous devez également penser à des comptes d’utilisateur, des -imprimantes, un système de courrier, des travaux de cron, des cartes -graphiques, au double amorçage, au NIS, au NTP, au fuseau horaire, à -la disposition de clavier, à l’exportation et au montage des -annuaires via NFS et à beaucoup d’autres choses. Donc, il ya beaucoup -à faire avant de commencer une installation. Et rappelez-vous que la -connaissance est le pouvoir, et c’est à vous de l’utiliser. -L’installation et l’administration sont un processus et non un -produit. FAI ne peut pas faire les choses que vous ne lui dites pas -de faire. - -Mais vous ne devez pas commencer à partir de zéro. Examinez les -fichiers et les scripts dans l’espace de configuration. Il ya -beaucoup de choses que vous pouvez utiliser pour votre propre -installation. Un bon article intitulé « Bootstrapping an -Infrastructure » avec d’autres aspects de la construction d’une -infrastructure est disponible sur http://www.infrastructures.org/ -papers/bootstrap/bootstrap.html - - -6.1. L’espace de configuration et ses sous-répertoires - --------------- - -L’espace de configuration est la collection des informations qui -disent comment exactement configurer un client. L’espace central de -configuration pour tous les clients d’installation est situé sur le -serveur d’installation dans /srv/fai/config et ses sous-répertoires. -Il sera monté par les clients sous /var/lib/fai/config. La commande -princpale d’installation fai(8) utilise tous ces sous-répertoires -dans l’ordre listé sauf pour les hooks. - -class/ - Scripts et fichiers pour définir des classes et des variables. -disk_config/ - Fichiers de configuration pour le partitionnement de disque, RAID - logiciel, LVM et création de système de fichiers. -basefiles/ - - Normalement , le fichier base.tar.xz (situé à l’intérieur du - nfsroot) est extrait sur le client d’installation après la - création des nouveaux systèmes de fichiers et avant - l’installation des paquets. Il s’agit d’une image de base - minimale, créée juste après avoir appelé debootstrap lors de la - création du nfsroot sur le serveur d’installation. Si vous voulez - installer une autre distribution que celle du nfsroot, vous - pouvez mettre un fichier tar dans le sous-répertoire basefiles/ - et le nommer selon une classe. Ensuite, la commande ftar(8) est - utilisée pour extraire le fichier tar en fonction des classes - définies. Ainsi, le fichier doit être nommé CLASS.tar.xz et non - CLASS.base.tar.xz. Cela se fait dans la tâche extrbase. Utilisez - cette option si vous souhaitez installer une autre distribution - ou une version différente de celle exécutée pendant - l’installation. - - Ce fichier de base peut également être reçu en fonction des - classes FAI via HTTP/HTTPS ou FTP en définissant la variable - FAI_BASEFILEURL. FAI téléchargera un fichier CLASSNAME.tar.xz (ou - tgz, ou tar.gz, …) à partir de cette URL, si CLASSNAME correspond - à une classe FAI. - - Exemple : - -FAI_BASEFILEURL=https://fai-project.org/download/basefiles/ - -Le dossier doit prendre en charge la liste des répertoires. FAI ne -recherchera pas de fichiers potentiellement correspondants. - -Voir le chapitre [otherdists] pour savoir comment installer -différentes distributions. - -debconf/ - Ce répertoire contient toutes les données debconf(7). Le format - est le même que celui utilisé par debconf-set-selections(1). -package_config/ - Les fichiers avec des noms de classe contiennent des listes de - paquets à installer ou à désinstaller par install_packages(8). - Les fichiers nommés .gpg sont ajoutés à la liste des clés - utilisées par apt pour les dépôts de paquets approuvés. -pkgs/ - Ce répertoire peut avoir des sous-répertoires nommés selon des - classes. Vous pouvez mettre des fichiers .deb ou .rpm dans ces - sous-répertoires. FAI installera ces paquets sans qu’il soit - besoin de créer les métadonnées d’un dépôt de paquets. -scripts/ - Scripts pour la personnalisation de votre site local. Utilisé par - fai-do-scripts(1). -files/ - Les Fichiers utilisés par les scripts de personnalisation. La - plupart des fichiers se trouvent dans un sous-répertoire qui - reflète l’arborescence de répertoires ordinaire. Par exemple, les - modèles de _nsswitch.conf_ se trouvent dans $FAI/files/etc/ - nsswitch.conf et sont nommés en fonction des classes auxquelles - ils doivent correspondre : $FAI/files/etc/nsswitch.conf/NIS est - la version de /etc/nsswitch.conf à utiliser pour la classe NIS. - Notez que le contenu du répertoire n’est pas automatiquement - copié sur la machine cible, mais qu’il doit être explicitement - copié par des scripts de personnalisation à l’aide de la commande - fcopy(8). -hooks/ - Les hooks sont des programmes ou des scripts définis par - l’utilisateur, qui sont lancés pendant le processus - d’installation. Ils peuvent étendre ou remplacer les tâches par - défaut. Le nom du fichier doit être de format taskname.CLASSNAME - [.sh]. Un hook appelé updatebase.DEBIAN est exécuté avant la - tâche updatebase et seulement si l’installation du client fait - partie de la classe DEBIAN. - - -6.2. Définition des classes - --------------- - -Il existe différentes possibilités pour définir des classes : - - 1. Certaines classes par défaut sont définies pour chaque hôte : - DEFAULT, LAST et son nom d’hôte. - 2. Les classes peuvent être répertoriées dans un fichier (par défaut - dans class/). - 3. Les classes peuvent être dynamiquement définies par des scripts. - -La dernière option est une fonctionnalité très intéressante, puisque -ces scripts définiront des classes d’une façon très souple. Par -exemple, plusieurs classes peuvent être définies uniquement si -certains matériels sont identifiés ou si une classe est définie en -fonction des informations du sous-réseau. - -Tous les noms de classes, sauf le nom d’hôte, sont écrits en -majuscules. Ils ne doivent pas contenir de trait d’union, de dièse, -de point-virgule ni de point, mais peuvent contenir des caractères de -soulignement et des chiffres. - -La tâche defclass appelle la commande fai-class(1) pour définir les -classes. Tous les scripts correspondant à l’expression ^[0-9][0-9]* -(qui commencent avec deux chiffres) Dans le sous-repertoire $FAI/ -class sont exécutés afin de définir les classes. Tout ce qui is -affiché sur STDOUT est automatiquement defini comme une classe. Pour -plus d’informations sur Les définitions de classe , lire les pages de -manuel de fai-class(1). Le script 50-host-classes (voir ci - dessous -la version allégée) est utilisé pour les définir des classes en -fonction du nom d’hôte. - -# use a list of classes for our demo machines -case $HOSTNAME in - demohost) - echo "FAIBASE GRUB DEMO" ;; - xfcehost) - echo "FAIBASE GRUB DEMO XORG XFCE LVM";; - faiserver) - echo "FAIBASE DEBIAN DEMO FAISERVER" ;; - ubuntuhost) - echo "FAIBASE DEBIAN DEMO UBUNTU JAMMY JAMMY64 XORG";; - *) - echo "FAIBASE DEBIAN DEMO" ;; -esac - -Les noms d’hôtes doivent rarement être utilisé pour les fichiers de -configuration dans l’espace de configuration. Au lieu de ça, une -classe doit être définie et ensuite ajoutée pour un hôte donné. En -effet, la plupart du temps les données de configuration ne sont pas -spécifiques à un nom d’hôte, mais peuvent être partagées entre -différents hôtes. - -L’ordre des classes est important car celui-ci définit la priorité -des classes de faible à élevée. - - -6.3. Définition des Variables - --------------- - -La tâche defvar definit les variables pour le client d’installation. -Les variables sont définies par les scripts dans class/*.var. Toutes -les variables globales peuvent être définies dans DEFAULT.var. Pour -un groupe d’hôtes utiliser un fichier de classe. Pour un hôte seul, -utiliser le Fichier $HOSTNAME .var. Ici aussi, il est utile d’étudier -tous les exemples. - -Les variables suivantes sont utilisées dans les exemples et peuvent -aussi être utiles pour votre installation : - -FAI_ACTION - Configure les actions que doit effectuer FAI. Normalement, ceci - se fait par fai-chboot(8). Si vous ne pouvez pas utiliser cette - commande, définissez cette variable dans le script LAST.var. -FAI_ALLOW_UNSIGNED - Si cette variable vaut 1, FAI permet l’installation de paquets à - partir de dépôts non signés. -CONSOLEFONT - La police de caractères qui est chargée lors de l’installation - par setfont(8). -KEYMAP - Définit les fichiers de disposition du clavier dans /usr/share/ - keymaps et $FAI/files. Vous n’avez pas besoin de spécifier le - chemin complet, car ce fichier sera localisé automatiquement. -ROOTPW - Le mot de passe root chiffré pour le nouveau système. Vous pouvez - utiliser crypt(3), md5 et d’autres types de hachage pour le mot - de passe. Utilisez 'mkpasswd(1)+` pour créer le hachage d’un mot - de passe donné. Par exemple, pour générer le hachage MD5 un mot - de passe, utilisez : - -$ echo "votre_mot_secret" | mkpasswd -m yescrypt -s - -UTC - Règle l’horloge matérielle à UTC si UTC=yes. Sinon, règle - l’horloge à l’heure locale. Voir clock(8) pour plus - d’informations. -TIMEZONE - C’est le fichier sous /usr/share/zoneinfo/ qui indique votre - fuseau horaire. Par exemple : TIMEZONE=Europe/Berlin. -MODULESLIST - Une liste des modules du noyau qui sont chargés pendant le - démarrage du nouveau système (écrits dans /etc/modules). - - -6.4. Configuration du disque dur - --------------- - -L’outil setup-storage(8) lit un fichier dans $FAI/disk_config pour la -configuration du disque. Ce fichier décrit comment tous les disques -Locaux seront partitionnés, quels types de systèmes de fichiers -doivent etre créés (comme ext3/4, xfs, btrfs), et où ils seront -montés. Vous pouvez aussi créer des configurations RAID logiciel et -LVM en utilisant ce fichier de configuration. Il est aussi possible -de préserver le partitionnement du disque ou de préserver les données -sur certaines partitions. - -Pendant le processus d’installation, tous les systèmes de fichiers -locaux sont montés sous le répertoire /target. Par exemple, si vous -spécifiez le point de montage /home dans un fichier de configuration -de disque, ce sera le répertoire /target/home pendant le processus -d’installation et ça deviendra /home pour le nouveau système -installé. - - -6.5. Extraction du fichier de base - --------------- - -Un fichier de base n’est nécessaire que si on installe une -distribution qui est défférente de celle dans le nfsroot. - - -6.6. Pré-ensemencement Debconf - --------------- - -On peut utiliser le fomat décrit dans debconf-set-selections(1). - - -6.7. Accès au dépôt de paquets - --------------- - -FAI supporte http, https, et NFS pour l’accès au miroir de paquets. -Réglez la variable $FAI_DEBMIRROR pour l’utilisation de NFS. - - -6.8. Configuration des paquets logiciels - --------------- - -Avant l’installation de paquets, FAI va ajouter le contenu de tous -les fichiers nommés package_config/class.gpg à la liste des clés apt. -Si votre dépôt local est signé par votre keyid AB12CD34 vous pouvez -facilement ajouter cette clé, ainsi FAI l’utilisera pendant -l’installation. Utilisez cette commande pour créer le fichier -CLASS.gpg : - -faiserver$ gpg --export AB12CD34 > /srv/fai/config/package_config/MYCLASS.gpg - -Le script install_packages(8) installe les logiciels sélectionnés. Il -lira tous les fichiers de configuration Dans $FAI/package_config dont -le nom correspond à une classe définie. La syntaxe est très simple. - -# an example package class - -PACKAGES taskinst -german - -PACKAGES install-norec -adduser nmap -less zstd - -PACKAGES remove -gpm xdm - -PACKAGES install GRUB_PC -grub-pc - -Les commentaires commencent par une dièse (#) et se terminent à la -fin de la ligne. Chaque commande de paquet commence par le mot -PACKAGES suivi par un nom de commande, qui correspond à gestionnaire -de paquets distinct comme apt-get, aptitude ou dnf par exemple. la -commande définit quelle commande sera utilisé pour installer les -paquets nommés après cette commande. La liste de toutes les commandes -disponibles peut être listée en utilisant install_packages -H. Les -gestionnaires de paquets pris en charges sont aptitude, apt-get, -smart, yast, dnf, rpm, zypper - -hold - Mettre un paquet en attente. Ce paquet ne sera pas pris en charge - par dpkg, pas exemple il ne sera pas mis à niveau. -install - Pour installer tous les paquets (en utilisant apt-get) qui sont - précisés dans les lignes suivantes. Si un tiret est ajouté au nom - du paquet (sans espace intermédiaire), le paquet sera supprimé, - pas installé. Tous les noms de paquets sont vérifiées pour les - fautes de frappe. Tout paquet qui n’existe pas, sera retiré de la - liste des paquets à installer. Soyez donc attentif à ne pas mal - orthographier les noms de paquets. -install-norec - Comme install, mais sans installer les paquets recommandés. -remove - Supprimer tous les paquets qui sont pécisés dans les lignes - suivantes. Si on ajoute un + au nom du paquet, le paquet doit - être installé. -taskinst - Installer tous les paquets appartenant aux tâches qui sont - spécifiées dans les lignes suivantes à l’aide de tasksel(1). Vous - pouvez aussi utiliser aptitude pour installer les tâches. -aptitude - Installer tous les paquets avec la commande aptitude. Ce sera la - valeur par défaut à l’avenir et pourra remplacer apt-get et - taskinst. Aptitude peut aussi installer les tâches de paquets. -aptitude-r - Idem aptitude avec l’option --with-recommends. -unpack - Télécharger les paquets et les décompresser seulement. Ne pas - configurer les paquets. -dselect-upgrade - Definir des sélections des paquets en utilisant les lignes - suivantes puis installer ou supprimer les paquets précisés. Ces - lignes sont le résultat de la commande dpkg --get-selections. Il - est recommandé de ne pas utiliser ce format, puisque cela - spécifie aussi tous les paquets qui sont installés seulement en - raison d’une dépendance ou d’une recommandation. Il vaut mieux - juste spécifier le paquet que vous voulez avoir, et de laisser - FAI (et apt-get) résoudre les dépendances. - -Plusieurs lignes avec des listes de noms de paquets séparés par des -espaces suivent les directive PACKAGES. Toutes les dépendances sont -résolues. Les paquets avec suffixe - (par exemple, lilo-) seront -supprimés au lieu d’être installés. L’ordre des paquet n’a pas -d’importance. Si vous souhaitez installer des paquets d’une autre -version que la valeur par défaut, vous pouvez ajouter le nom de la -version au nom du paquet comme dans openoffice.org/etch-backports. -Vous pouvez également spécifier une certaine version comme apt=0.3.1. -Plus d’informations sur ces fonctionnalités sont décrites dans -aptitude(8). - -On peut spécifier des paramètres supplémentaires pour le gestionnaire -de paquets en ajoutant des paires cle=valeur après PACKAGES -. les paires clé, valeur actuellement supportées sont -release= qui ajoute -t durant l’installation des paquets. - -Exemple: - -PACKAGES install-norec release=testing -nvidia-smi - -Cela installerait le paquet nvidia-smi de la distribution testing, en -incluant les dépendances. N’oubliez pas d’ajouter une entrée dans -sources.list. Vous pouvez aussi vouloir ajuste l’épinglage apt (apt -pinning) (voir apt_references(5)) - -Une ligne qui contient la commande PRELOADRM, télécharge un fichier à -l’aide de wget(1) dans un répertoire avant d’installer les paquets. À -l’aide d’une URL de type file:, ce fichier est copié de $FAI_ROOT -vers le répertoire de téléchargement. Par exemple, le paquet -realplayer a besoin d’une archive pour installer le logiciel, donc -cette archive est téléchargée dans le répertoire /root. Après -l’installation des paquets, ce fichier sera supprimé. Si le fichier -ne doit pas être supprimé, utilisez plutôt la commande PRELOAD. - -On peut ajouter une expression booléenne arbitraire qui utilise des -classes FAI pour définir quand la liste des paquets devrait être -installée. Ici, les paquets seront installés seulement si la classe -XORG est définie mais la classe MINT n’est pas définie. - -Exemple: - -PACKAGES install UBUNTU && XORG && ! MINT -ubuntu-standard -ubuntu-desktop - -L’ancienne façon d’ajouter des expressions logiques dans les lignes -PACKAGES est encore valable : Il est possible d’ajouter une liste de -noms de classes après la commande pour apt-get. Ainsi une telle -commande PACKAGES sera exécutée seulement au moins une des classes -correspondantes est définie (OU logique). On peut donc combiner -plusieurs petits fichiers dans le fichier DEFAULT. - -Si vous souhaitez supprimer un nom de paquet d’une certaine classe -faisait partie de cette classe précédemment, vous ne devez pas -supprimer le nom du paquet classe, mais plutôt de lui ajouter un -tiret (-). Cela garantira que le paquet soit enlevé pendant une mise -a jour sur des hôtes qui étaient installés en utilisant l’ancienne -définition de classe qui comprenait ce nom de paquet. - -Si vous spécifiez un paquet qui n’existe pas, ce paquet sera supprimé -automatiquement de la liste d’installation uniquement si la commande -install est utilisée. - -Le concept de priorité des classes permet à une classe de priorité -plus élevée (qui arrive plus tard dans la séquence des classes) -d’écraser les sélections des paquets de priorité plus basse. Pour que -cela fonctionne correctement, les classes de priorité plus élevée -doivent utiliser les mêmes commandes PACKAGES (par exemple PACKAGES -install-norec au lieu de seulement PACKAGES install) que celles -qu’utilisent la classe qu’on essaie d’écraser. Cela est utile pour -supprimer l’installation d’un paquet, par exemple, pour éviter -d’installer le paquet linuxlogo installé par la classe FAIBASE : - -# exemple montrant comment écraser : -# -# Dans FAIBASE il y a : -# PACKAGES install-norec -# linuxlogo -# -# On veut _ne pas_ installer linuxlogo, et il se trouve dans -# une section install-norec, donc il faut aussi utiliser install-norec. - -PACKAGES install-norec -linuxlogo- - - -6.9. Scripts de personnalisation - --------------- - -La commande fai-do-scripts(1) est lancée pour exécuter tous les -scripts dans ce répertoire. Si un répertoire avec un nom de classe -existe, tous les scripts correspondant à l’expression ^[0-9][0-9]* -sont exécutés par ordre alphabétique. Il est donc possible d’utiliser -des scripts de différentes langages (shell, cfengine, Perl, Python, -Ruby, expect,..) pour une classe. - -Ces scripts écrivent leur sortie standard dans scripts.log. Le -fichier status.log contient les noms de tous les scripts exécutés et -leur statut de terminaison. - -6.9.1. Scripts shell - -La plupart des scripts sont des scripts Bourne shell. Les scripts -shell sont utiles si la tâche de configuration n’a besoin d’appeler -que quelques commandes shell ou créer un fichier à partir de zéro. -Afin d’éviter d’écrire beaucoup de scripts courts, il est possible -d’utiliser la commande ifclass pour tester si certaines classes sont -définies. - -ifclass -o A B C - -Vérifie si l’une des classes A, B ou C est définie. L’utilisation de --a (ET, AND logique) vérifie si toutes les classes d’une liste sont -définies. La commande ifclass C vérifie si seule la classe C est -définie. - -Pour copier des fichiers avec des classes, utilisez la commande fcopy -(8). Si vous voulez extraire une archive à l’aide de classes, -utilisez ftar(8). Pour ajouter des lignes à un fichier de -configuration, utilisez ainsl(1) au lieu de simplement echo string >> -filename. - -FAI prend également en charge les scripts zsh(1) pendant la tâche de -personnalisation. Dans les scripts, la variable $classes contient une -liste séparée par des espaces avec les noms de toutes les classes -définies. - -6.9.2. Scripts cfengine - -CFEngine dispose d’un riche ensemble de fonctions pour modifier les -fichiers de configuration existants, par exemple LocateLineMatching, -ReplaceAll, InsertLine, AppendIfNoSuchLine, -HashCommentLinesContaining. Mais il ne peut pas traiter les variables -qui sont indéfinies. Si une variable n’est pas définie, l’ensemble du -script cfengine s’arrêtera. - -On peut trouver plus d’informations dans la page de manuel cfengine -(8) ou sur la page d’accueil de cfengine https://www.cfengine.com. - - -6.10. Les hooks, les « crochets » - --------------- - -Les crochets (hooks) vous permettent de spécifier des fonctions ou -des programmes qui sont exécutés à certaines étapes du processus -d’installation. Avant qu’une tâche soit appelée, FAI recherche les -crochets existants pour cette tâche et les exécute. Comme on peut s’y -attendre, les classes sont également utilisées lors de l’appel de -hooks. Les hooks sont exécutés pour chaque classe définie. Il vous -suffit de créer le hook avec le nom de la classe désirée et il sera -utilisé. Si plusieurs hooks pour une tâche existent, ils sont appelés -dans l’ordre défini par les classes. Si debug est inclus dans -$FAI_FLAG l’option -d est passée à tous les hooks, donc vous pouvez -déboguer vos propres hooks. Si certaines tâches par défaut doivent -être ignorées, utilisez la sous-routine skiptask et une liste de -tâches par défaut comme paramètres. Dans les exemples fournis, les -hooks de la classe CENTOS ignorent certaines tâches spécifiques de -Debian. - -Le répertoire $FAI/hooks/ contient tous les hooks. Un hook est un -fichier exécutable qui est nommé selon la tâche : taskname.CLASSNAME -[.sh] (par exemple, repository.CENTOS ou savelog.LAST.sh). Le nom de -tâche spécifie quelle tâche précède l’exécution de ce hook, si la -classe spécifiée est définie pour le client d’installation. Voir la -section [tasks] pour une liste complète des tâches par défaut qu’on -peut utiliser. - -Un hook du formulaire hookprefix.classname ne peut pas définir de -variables pour le script d’installation, car il s’agit d’un -sous-processus. Mais vous pouvez utiliser n’importe quel exécutable -binaire ou n’importe quel script que vous avez écrit. Les hooks qui -ont le suffixe .sh (par exemple, partition.DEFAULT.sh) doivent être -des scripts Bourne shell et sont sourcé. Il est donc possible de -redéfinir des variables pour les scripts d’installation. - -Dans la première partie de FAI, tous les hooks avec le préfixe -confdir sont appelés. Ces hooks ne peuvent pas être localisés dans -l’espace de configuration, car il n’est pas encore disponible. Par -conséquent, ces hooks sont les seuls hooks situés dans $nfsroot/$FAI/ -hooks sur le serveur d’installation. Tous les autres hooks se -trouvent dans $FAI_CONFIGDIR/hooks sur le serveur d’installation. - -Tous les hooks appelés avant la définition des classes peuvent -utiliser uniquement les classes suivantes: DEFAULT $HOSTNAME LAST. Si -un hook pour la classe DEFAULT doit être appelé uniquement dans le -cas où aucun hook pour la classe $HOSTNAME n’est disponible, insérez -ces lignes dans le hook par défaut : - -hookexample.DEFAULT: - -#! /bin/sh - -# sauter le hook DEFAULT s'il existe un hook pour $HOSTNAME -scriptname=$(basename $0 .DEFAULT) -[-f $FAI/hooks/$scriptname.$HOSTNAME ] && exit -# suivent alors les actions pour la classe DEFAULT -. -. - -Quelques exemples de ce à quoi les hooks pourraient être utiles : - - * Charger les modules du noyau avant que les classes soient - définies dans $FAI/class. - * Envoyer un courriel à l’administrateur si l’installation est - terminée. - * Installer un client sans disque et sautez le partitionnement de - disque local. - * Jeter un œil à hooks/debconf.IMAGE pour savoir comment cloner une - machine en utilisant une image de système de fichiers. - - -6.11. Options (flags) de FAI - --------------- - -La variable $FAI_FLAGS contient une liste d’options séparées par des -espaces. Les options sont normalement définies dans le fichier -pxelinux.cfg qui est censément créé par fai-chboot(1). Les options -suivantes sont connues : - -verbose - Rend l’installation verbeuse. Cela doit toujours être la première - option (le premier flag), de sorte que les définitions suivantes - des options soient affichées verbeusement. -debug - Afficher des informations de débogage. Aucune installation sans - assistance n’est effectuée. Pendant l’installation du paquet, - vous devez répondre à toutes les questions des scripts - postinstall sur la console du client. Beaucoup d’informations de - débogage seront affichées. Cette option n’est utile que pour les - développeurs FAI. -sshd - Démarrer le démon ssh pour activer les connexions à distance. - Vous pouvez ensuite vous connecter en tant que root à tous les - clients d’installation pendant l’installation. Le mot de passe - par défaut est fai et peut être modifié en définissant FAI_ROOTPW - dans nfsroot.conf(5). Pour vous connecter à partir de votre - serveur vers le client d’installation (nommé demohost dans cet - exemple), utilisez : - -$ ssh root@demohost -Warning: Permanently added 'demohost,192.168.33.100' to the list of known hosts. -root@demohost's password: - -Ce n’est le mot de passe root que pendant le processus -d’installation, pas pour le nouveau système installé. Vous pouvez -également vous connecter sans mot de passe lorsque vous utilisez -$SSH_IDENTITY. - -createvt - Créez deux terminaux virtuels et exécutez un bash si ctrl-c est - tapé dans le terminal de console. Vous pouvez accéder aux - terminaux supplémentaires en tapant Alt-F2 ou Alt-F3. Sinon, - aucun terminal n’est disponible et la saisie ctrl-c va redémarrer - le client d’installation. La définition de cette option est utile - pour le débogage. Si vous voulez une installation qui ne soit pas - interruptible, ne définissez pas cette option. -menu - Cela active un menu utilisateur pour sélectionner un profil. Tous - les fichiers class/*.profile sont lus et un menu basé sur curses - sera créé. -screen - Lancer FAI dans une session screen(1). La session est nommée FAI. - Si on se connecte via ssh à distance on peut se rattacher à la - session en utilisant : - -$ screen -x - -tmux - Lancer FAI dans une session tmux(1). La session est nommée FAI. - Si on se connecte via ssh à distance on peut se rattacher à la - session en utilisant : - -$ tmux attach - -reboot - Redémarrer le client d’installation une fois l’installation - terminée sans taper Entrée sur la console. Si cette option n’est - pas définie, et que error.log contient quelque chose, le client - d’installation s’arrêtera et attendra que vous appuyez sur - Entrée. Si aucune erreur ne s’est produite, le client redémarrera - toujours automatiquement. -halt - Arrêter le client d’installation à la fin de l’installation, au - lieu de redémarrer dans le nouveau système. -initial - Utilisé par setup-storage(8). Les partitions marquées avec - preserve_reinstall sont préservées à moins que cette option ne - soit définie. Souvent, cette option est définie dans un fichier - class/*.var en utilisant le paramètre flag_initial=1. - - ---------------------------------------------------------------------- - -7.  FAI installe votre planification - ---------------------------------------------------------------------- - - -7.1. La première phase d’une installation - --------------- - -Après le démarrage du noyau, on monte le système de fichiers racine -via NFS à partir du serveur d’installation et on démarre le script / -usr/sbin/fai ^[11]. Ce script contrôle la séquence de l’installation. -Aucun autre script dans /etc/init.d/ n’est utilisé. - -L’espace de configuration est rendu disponible via la méthode -configurée (un montage NFS par défaut) depuis le serveur -d’installation vers le chemin défini dans $FAI ^[12] - - -7.2. Messages de démarrage - --------------- - -Lorsqu’on démarre le client d’installation à partir de la carte -réseau avec PXE, on voit des messages comme ceci : - -Managed PC Boot Agent (MBA) v4.00 -Pre-boot eXecution Environment (PXE) v2.00 -DHCP MAC ADDR: 00 A2 A3 04 05 06 -DHCP.../ - -CLIENT MAC ADDR: 00 A2 A3 04 05 06 GUID: 3D6C4552 -CLIENT IP: 192.168.33.100 MASK: 255.255.255.0 DHCP IP: 192.168.33.250 -GATEWAY IP: 192.168.33.1 - -!PXE entry point found (we hope) at 9854:0106 via plan A -UNDI code segment at: 9854 len 5260 -UNDI data segment at: 921D len 63A2 -Getting cached packet 01 02 03 -My Ip address seems to be C0A82164 192.168.33.100 -ip=192.168.33.100:192.168.33.250:192.168.33.1:255.255.255.0 -BOOTIF=01-00-A2-A3-04-05-06 -SYSUUID= -TFTP prefix: fai/ -Trying to load pxelinux.cfg/C0A82164 - -Loading vmlinuz-6.1.0-17-amd64.................. -Loading initrd.img-6.1.0-17-amd64......................ready. - -À ce stade, le client d’installation a réussi à recevoir la -configuration réseau via DHCP, le noyau et le fichier initrd via -TFTP. Il démarre maintenant Le noyau Linux et met en place initrd. Si -tout se passe bien, l’initrd monte le nfsroot ^[13] et les scripts -FAI sont lancés. La première chose qu’on voit est le message de -copyright en rouge de FAI. - - ------------------------------------------------- - Fully Automatic Installation - FAI - - 6.2 (c) 1999-2024 - Thomas Lange - ------------------------------------------------- - -Calling task_confdir -Kernel currently running: Linux 6.1.0-17-amd64 x86_64 GNU/Linux -Kernel parameters: BOOT_IMAGE=vmlinuz-6.1.0-17-amd64 initrd=initrd.img-6.1.0-17-amd64 \ - ip=dhcp rw root=192.168.33.250:/srv/fai/nfsroot rootovl FAI_FLAGS=verbose,sshd,createvt - FAI_ACTION=install FAI_CONFIG_SRC=nfs://faiserver/srv/fai/config -Reading /tmp/fai/boot.log -FAI_FLAGS: verbose sshd createvt -Monitoring to server faiserver enabled. -FAI_CONFIG_SRC is set to nfs://faiserver/srv/fai/config -Configuration space faiserver:/srv/fai/config mounted to /var/lib/fai/config -Source hook: setup.DEFAULT.sh -setup.DEFAULT.sh OK. -Calling task_setup -FAI_FLAGS: verbose sshd createvt -Press ctrl-c to interrupt FAI and to get a shell -Starting FAI execution - 20240117_194012 -Calling task_defclass -fai-class: Defining classes. -Executing /var/lib/fai/config/class/01-classes. -01-classes OK. -Executing /var/lib/fai/config/class/10-base-classes. -10-base-classes OK. -Executing /var/lib/fai/config/class/20-hwdetect.sh. -ens3 UP 52:54:00:11:23:01 -ens3 UP 192.168.33.101/24 fe80::5054:ff:fe11:2301/64 -New disklist: vda -20-hwdetect.sh OK. -Executing /var/lib/fai/config/class/40-parse-profiles.sh. -40-parse-profiles.sh OK. -Executing /var/lib/fai/config/class/41-warning.sh. -41-warning.sh OK. -Executing /var/lib/fai/config/class/50-host-classes. -50-host-classes OK. -Executing /var/lib/fai/config/class/60-misc. -60-misc OK. -Executing /var/lib/fai/config/class/85-efi-classes. -85-efi-classes OK. -List of all classes: DEFAULT LINUX AMD64 DHCPC FAIBASE DEBIAN DEMO GRUB_PC demohost2 LAST - -On peut également voir la liste des classes FAI, qui sont définies -pour cet hôte. Cette liste est très importante pour le reste de -l’installation. - -La première tâche est appelée confdir, qui est chargée de accès à -l’espace de configuration. Ici, on utilise un montage NFS depuis le -serveur d’installation comme on peut le voir sur la console (et plus -tard dans les journaux). - -FAI_CONFIG_SRC is set to nfs://faiserver/srv/fai/config -Configuration space faiserver:/srv/fai/config mounted to /var/lib/fai/config - -Avant de lancer l’installation ($FAI_ACTION=install), l’ordinateur -émet trois bips. Donc, faites attention quand vous entendez trois -bips et que vous ne voulez pas effectuer une installation, ni laisser -FAI effacer toutes vos données sur Le disque local ! - - -7.3. Redémarrage de l’ordinateur dans le nouveau système - --------------- - -Pour redémarrer l’ordinateur pendant ou à la fin de l’installation, -vous devez utiliser la commande faireboot de préférence à la commande -de redémarrage normal. Utilisez aussi faireboot si vous êtes connecté -à distance. Si l’installation n’est pas terminée, utilisez faireboot --s, afin que les fichiers journaux soient aussi copiés sur le serveur -d’installation. - -Si l’installation s’est bien terminée, l’ordinateur doit démarrer un -petit système Debian. Vous pouvez vous connecter en tant -qu’utilisateur demo ou root avec le mot de passe fai. - - -7.4. Démarrage de FAI (tâche confdir) - --------------- - -Une fois le client d’installation démarré, seul le script /usr/sbin/ -fai est exécuté. Il effectuera une initialisation minimale. La -variable $FAI_CONFIG_SRC ^[14] est utilisée pour accéder à l’espace -de configuration FAI qui est alors disponible dans le répertoire $FAI -^[15]. FAI ne se fonctionnera pas sans l’espace de configuration. - -On peut accéder à l’espace de configuration à l’aide de diverses -méthodes. Les méthodes supportées sont : nfs:, file:, cvs:, svn: -git:, hg:, http: et detect:. Voir fai.conf(5) pour une description -détaillée de ces méthodes. - - -7.5. Définition de classes et de variables (tâches defclass et -defvar) - --------------- - -La commande fai-class(1) exécute des scripts dans $FAI/class pour -définir des classes. Si les scripts écrivent une chaîne dans stdout, -cela sera défini comme une classe. Lisez tous les détails dans la -page de manuel de fai-class(1). - -Après avoir défini les classes, chaque fichier correspondant à .var -avec un préfixe qui correspond à une classe définie est pris en -compte pour définir des variables. Il doit contenir du code shell -valide. - - -7.6. Partitionnement des disques locaux, création des systèmes de -fichiers (tâche partition) - --------------- - -Pour le partitionnement du disque, un fichier de configuration de -disque de $FAI/disk_config est sélectionné à l’aide de classes, et un -seul. - -Le format de la configuration du disque est similaire à un fichier -fstab. - -L’outil de partitionnement setup-storage(8) exécute toutes les -commandes nécessaires pour créer l’organisation des partitions du -disque, du RAID logiciel, du LVM et pour créer les systèmes de -fichiers. Lisez la page de manuel de setup-storage(8) pour une -description détaillée et quelques exemples du format. - - -7.7. Pré-ensemencement Debconf (tâche debconf) - --------------- - -Les fichiers dans $FAI/debconf sont utilisés par le système de -pré-ensemencement habituel de debconf(7) si les noms de fichier -correspondent à un nom de classe. - - -7.8. Installation de paquets logiciels (tâche instsoft) - --------------- - -La commande install_packages(8) lit les fichiers de configuration à -partir de $FAI/package_config d’une façon basée sur la classe et -installe des paquets logiciels sur le nouveau système de fichiers. - -Elle installe les paquets en utilisant apt-get(8), aptitude(1), yum -ou d’autres gestionnaires de paquets sans besoin d’aucune interaction -manuelle. Les dépendances des paquets sont également résolues par les -gestionnaires de paquets. - -Le format des fichiers de configuration est décrit dans -[packageconfig]. - -De plus, FAI installera les paquets (.deb or .rpm') depuis les -répertoires $FAI/pkgs/. - - -7.9. Personnalisation spécifique au site (tâche configure) - --------------- - -Souvent, les configurations par défaut des paquets logiciels ne -répondent pas à vos besoins spécifiques au site. Vous pouvez appeler -des scripts arbitraires qui ajustent la configuration du système. Par -conséquent, la commande fai-do-scripts(1) exécute des scripts dans -$FAI/scripts d’une manière basée sur la classe. Il est possible -d’avoir plusieurs scripts de différents types (shell, cfengine, …) à -exécuter pour une classe. - -L’ensemble de scripts par défaut dans $FAI/scripts inclut des -exemples d’installation de machines Debian et Rocky Linux. Ils -définissent le mot de passe root, ajoutent un compte utilisateur -(défini par $username, avec demo par défaut), paramètrent le fuseau -horaire, configurent le réseau avec DHCP ou en utilisant une adresse -IP fixe, configurent grub et plus encore. Ils devraient faire un -travail raisonnable pour votre installation. Vous pouvez les modifier -ou ajouter de nouveaux scripts pour répondre à vos besoins locaux. - -Plus d’information sur ces scripts est disponible dans [cscripts]. - - -7.10. Enregistrement des fichiers journaux (tâche savelog) - --------------- - -Lorsque toutes les tâches sont terminées, les fichiers journaux sont -écrits dans /var/log/fai/$HOSTNAME/install/ ^[16] sur le nouveau -système, et sur le compte sur le serveur d’installation si $LOGUSER -est défini (il faut l’activer dans /srv/fai/config/class/FAIBASE.var -). Il est également possible de spécifier un autre hôte comme -destination pour cet enregistrement à l’aide de la variable -$LOGSERVER. Si $LOGSERVER n’est pas défini, FAI utilise la variable -$SERVER qui n’est définie que lors d’une installation initiale (par -get-boot-info). - -De plus, deux liens symboliques seront créés pour indiquer le dernier -répertoire où on a écrit. Le lien symbolique last pointe vers le -répertoire journal de la dernière action FAI exécutée. Les liens -symboliques last-install et last-sysinfo pointent vers le répertoire -avec la dernière action correspondante. Par défaut, les fichiers -journaux seront copiés sur le serveur de journalisation à l’aide de -scp. Vous pouvez utiliser la variable $FAI_LOGPROTO dans le fichier -fai.conf(5) pour choisir une autre méthode d’enregistrement des -journaux sur le serveur distant. Voici un exemple de structure de -lien symbolique : - -lrwxrwxrwx 1 fai fai 23 Dec 2 2013 last-sysinfo -> sysinfo-20131202_161237 -drwxr-xr-x 2 fai fai 4096 Dec 2 2013 sysinfo-20131202_161237 -drwxr-xr-x 2 fai fai 4096 Feb 14 2014 install-20140214_142150 -drwxr-xr-x 2 fai fai 4096 Dec 2 11:47 install-20141202_113918 -lrwxrwxrwx 1 fai fai 23 Dec 4 13:22 last-install -> install-20141204_131351 -lrwxrwxrwx 1 fai fai 23 Dec 4 13:22 last -> install-20141204_131351 -drwxr-xr-x 2 fai fai 4096 Dec 4 13:22 install-20141204_131351 - -Vous trouverez des exemples de fichiers journaux à l’adresse https:// -fai-project.org/logs. - - -7.11. Redémarrage du nouveau système installé - --------------- - -Avant de redémarrer, le client d’installation appelle fai-chboot -d - sur le serveur d’installation, pour désactiver sa propre -configuration PXELINUX. Sinon, il redémarrerait l’installation lors -de la prochaine initialisation. Normalement, cela devrait démarrer le -nouveau système installé à partir de son second périphérique -d’amorçage, le disque dur local. - -À la fin, le système est automatiquement redémarré si "reboot" a été -ajouté à $FAI_FLAGS. - - ---------------------------------------------------------------------- - -8. Sujets avancés pour FAI - ---------------------------------------------------------------------- - - -8.1. Vérification des paramètres reçus des serveurs DHCP - --------------- - -Si le client d’installation démarre, vous pouvez vérifier si toutes -les informations provenant du démon DHCP sont correctement reçues. -Les informations reçues sont écrites dans /tmp/fai/boot.log. Un -exemple de résultat d’une requête DHCP peut être trouvé dans les -fichiers journaux d’exemple. - - -8.2. Surveillance de plusieurs clients d’installation - --------------- - -Vous pouvez surveiller l’installation de tous les clients -d’installation avec la commande fai-monitor(8). Tous les clients -vérifient si ce démon est en cours d’exécution sur le serveur -d’installation (ou sur l’ordinateur défini par la variable -$monserver). Chaque fois qu’une tâche démarre ou se termine, un -message est envoyé. Le démon du moniteur FAI envoie ces messages dans -sa sortie standard. On peut aussi utiliser une interface graphique, -appelée fai-monitor-gui(1). - -$ fai-monitor | fai-monitor-gui - & - - -8.3. Collecte d’adresses Ethernet pour plusieurs hôtes - --------------- - -Vous devez collecter toutes les adresses Ethernet (MAC) des clients -d’installation et affecter un nom d’hôte et une adresse IP à chaque -client. Pour collecter les adresses MAC, démarrez vos clients -d’installation. Vous pouvez déjà le faire avant que n’importe quel -démon DHCP s’exécute dans votre sous-réseau. Ils échoueront à -démarrer (en raison de l’absence de DHCP ou de TFTP), mais vous -pouvez toujours collecter les adresses MAC. - -Pendant que les clients d’installation démarrent, ils envoient des -paquets de diffusion (broadcast) au LAN. Vous pouvez enregistrer les -adresses MAC de ces hôtes en exécutant simultanément la commande -suivante sur le serveur : - -faiserver# tcpdump -qtel broadcast and port bootpc >/tmp/mac.list - -Une fois que les hôtes ont envoyés quelques paquets de diffusion, -arrêtez tcpdump en tapant ctrl-c. Vous obtenez une liste de toutes -les adresses MAC uniques avec ces commandes : - -faiserver$ perl -ane 'print "\U$F[0]\n"' /tmp/mac.list|sort|uniq - -Après cela, vous n’avez qu’à assigner ces adresses MAC aux noms -d’hôte et aux adresses IP (/etc/ethers et /etc/hosts ou aux -associations NIS correspondantes). Avec ces informations, vous pouvez -configurer votre démon DHCP (voir la section [bootdhcp]). ^[17] - -8.3.1. Débogage du trafic réseau - -Si le client ne peut démarrer correctement à partir de la carte -réseau, utilisez tcpdump(8) pour rechercher des paquets Ethernet -entre le serveur d’installation et le client. Recherchez également -dans les entrées de plusieurs fichiers journaux venant de tftpd(8) et -dhcpd(8) : - -faiserver$ egrep "tftpd|dhcpd" /var/log/* - - -8.4. Détails du démarrage PXE - --------------- - -Ici, nous décrivons les détails du démarrage PXE, qui sont -nécessaires seulement si vous avez des problèmes lors du démarrage de -vos clients d’installation. - -Presque toutes les cartes réseau modernes prennent en charge -l’environnement de démarrage PXE. PXE est l’environnement d’exécution -de pré-lancement. Cela nécessite le chargeur de démarrage PXELINUX et -une version spéciale du démon TFTP, disponibles dans les paquets -Debian pxelinux et tftpd-hpa. Le démarrage PXE nécessite également un -serveur DHCP, afin que la carte réseau puisse configurer ses -paramètres IP. Voici la séquence d’une amorce PXE : - - * La carte réseau du client envoie son adresse MAC - * Le serveur DHCP répond par la configuration IP du client - * La carte réseau configure son IP - * Le client d’installation obtient le binaire pxelinux.0 via TFTP - * Il obtient le fichier de configuration pxelinux.cfg/C0A8210C via - TFTP - * C0A8210C est l’adresse IP du client en hexadécimal - * Cette configuration contient le noyau, le fichier initrd et les - paramètres de ligne de commande supplémentaires du noyau, qui ont - été créés par fai-chboot. - * Il obtient le noyau et le fichier initrd via TFTP. - -Exemple d’un fichier pxelinux.cfg : - -default fai-generated - -label fai-generated -kernel vmlinuz-6.1.0-17-amd64 -append initrd=initrd.img-6.1.0-17-amd64 ip=dhcp root=/srv/fai/nfsroot rootovl FAI_FLAGS=verbose,sshd,createvt FAI_CONFIG_SRC=nfs://faiserver/srv/fai/config FAI_ACTION=install - -Voir /usr/share/doc/syslinux/pxelinux.doc pour des informations plus -détaillées sur PXELINUX. FAI utilise le fichier binaire lpxelinux.0 -qui s’occupe du chargement du noyau et du fichier initrd via FTP ou -HTTP. La commande fai-chboot(8) prend cela en charge avec l’option -U -. - - -8.5. Personnaliser la configuration de son serveur d’installation - --------------- - - * Miroir de paquets logiciels local/plus rapide - * Loguser différent - * Mot de passe root local dans nfsroot - -La configuration du paquet FAI (et non les données de configuration -pour les clients d’installation) est définie dans fai.conf(5). Les -définitions qui sont utilisées uniquement pour créer le nfsroot sont -situées dans nfsroot.conf(5). Vérifiez ces variables importantes dans -nfsroot.conf avant d’appeler fai-setup ou fai-make-nfsroot. - -FAI_DEBOOTSTRAP - La construction du nfsroot utilise la commande debootstrap(8). - Elle a besoin de l’emplacement d’un miroir Debian et du nom de la - distribution (comme bullsseye, bookworm, sid) pour laquelle le - système Debian de base devrait être construit. N’utilisez pas de - distributions différentes ici et dans /etc/fai/apt/sources.list. - Cela créerait un nfsroot dysfonctionnel. -NFSROOT_ETC_HOSTS - Cette variable est nécessaire seulement si les clients n’ont pas - accès à un serveur DNS. Cette variable multiligne est ajoutée à / - etc/hosts dans le nfsroot. Ensuite, les clients d’installation - peuvent accéder à ces hôtes par leur nom sans utiliser DNS. - -Le contenu de /etc/fai/apt/sources.list est utilisé par le serveur -d’installation et aussi par les clients. Si votre serveur -d’installation a plusieurs cartes réseau et différents noms d’hôte -pour chaque carte (comme pour un serveur Beowulf), utilisez le nom du -serveur d’installation qui est connu des clients d’installation. - -Si vous avez des problèmes lors de l’exécution de fai-setup, ils -proviennent habituellement de fai-make-nfsroot(8) qui est appelé par -la commande précédente. L’ajout de -v vous donne une sortie plus -détaillée qui vous aide à repérer l’erreur. La sortie est écrite dans -/var/log/fai/fai-make-nfsroot.log. ^[18] - -L’installation crée également le compte fai (défini par $LOGUSER) -s’il n’est pas déjà disponible. Vous pouvez donc ajouter un -utilisateur avant d’appeler fai-setup(8) à l’aide de la commande -adduser(8) et l’utiliser comme compte local pour enregistrer des -fichiers journaux. Les fichiers journaux de tous les clients -d’installation sont enregistrés dans le répertoire de personnel de ce -compte. Vous devriez changer le groupe principal de ce compte, afin -que ce compte ait des droits d’écriture sur /srv/tftp/fai afin -d’appeler fai-chboot pour créer la configuration PXE pour les hôtes. - -Lorsque vous apportez des modifications à fai.conf, nfsroot.conf, le -nfsroot doit être reconstruit en appelant fai-make-nfsroot(8). Si -vous souhaitez uniquement installer un nouveau paquet de noyau sur -nfsroot, ajoutez les options -k ou -K à fai-make-nfsroot. Cela ne -recréera pas votre nfsroot, mais mettra à jour seulement vos noyaux -et les modules du noyau dans le nfsroot ou ajoutera des paquets -supplémentaires dans le nfsroot. - - -8.6. Création d’un CD ou d’une clé USB FAI - --------------- - -Vous pouvez facilement créer un CD d’installation (ou une clé USB) de -votre installation réseau. Cela permettra d’effectuer la même -installation et la même configuration à partir du CD sans avoir -besoin du serveur d’installation. Par conséquent, vous devez créer un -miroir partiel de tous les paquets Debian nécessaires à vos classes -FAI (à l’aide de fai-mirror(1)). Ensuite, la commande fai-cd(8) -écrira ce miroir, le nfsroot et l’espace de configuration sur un CD -amorçable. Et voilà ! - -Pour créer facilement le CD d’installation, on peut utiliser la -commande suivante (Pour plus de détails de configuration voir fai-cd -(8)) : - - faiserver# fai-cd -m fai-cd.iso - -Ce CD d’installation contient toutes les données nécessaires à -l’installation. La commande fai-cd(8) écrit le nfsroot, l’espace de -configuration et un sous-ensemble du miroir Debian sur un CD-ROM. Un -miroir de paquets partiel est créé à l’aide de la commande fai-mirror -(1) qui contient tous les paquetages utilisés par les classes -utilisées dans votre espace de configuration. Un échantillon d’image -ISO est disponible à l’adresse https://fai-project.org/fai-cd. - -Avec la commande dd(1), vous pouvez également créer une clé USB -amorçable en écrivant simplement le contenu du fichier ISO sur votre -clé USB (ici la clé est /dev/sdf). - - faiserver# dd if=fai-cd.iso of=/dev/sdf bs=1M - -mk-data-partition est un outil qui étend une image ISO (qui sera -copiée sur une clé USB) ou une clé USB contenant une image ISO avec -une partition ext4 ou exFAT et y place le label MY-DATA. Cette -partition est automatiquement montée dans /media/data par FAI. On -peut copier ses propres paquets .deb dans cette partition de données -sous les sous-répertoires pkgs/. FAI installera alors ces -paquets si la classe équivalente est définie. - -exemple d’usage de mk-data-partition: - -# mk-data-partition -s 1G -c faicd-large.iso A B - -La commande ci-desus crée la partition de données avec une taille de -1 Go dans le fichier ISO et y copie les répertoires A et B. On peut -écrire l’image ISO modifiée sur une clé USB. - -Si l’image ISO est déjà sur la clé USB, qui est disponible sous dev/ -sdf, on peut ajouter la partition de données de type exFAT qui -utilisera tout l’espace disponible de la clé USB en utilisant cette -commande  : - -# mk-data-partition -F /dev/sdf - - -8.7. Création d’images de disque VM à l’aide de FAI - --------------- - -En utilisant la commande fai-diskimage(8), vous pouvez créer des -images de disques qui peuvent être utilisées avec une machine -virtuelle comme KVM, VMware, VirtualBox ou un service cloud comme -OpenStack, GCE, EC2 et autres. Le processus d’installation exécute -les tâches FAI normales sur une image de disque brut. Après -l’installation, vous pouvez démarrer l’image disque et avoir un -système fonctionnel. L’image disque peut également être convertie au -format qcow2. Vous n’avez pas besoin de mettre en place le nfsroot de -FAI quand vous utilisez seulement fai-diskimage. Mais vous avez -besoin d’un fichier de base dans votre espace de configuration. Le -réglage de la variable $FAI_BASEFILEURL permet de télécharger -automatiquement un fichier de base approprié dans votre espace de -configuration. - -Voici par exemple comment créer une image de disque brute pour un -hôte nommé cloud3, avec un petit ensemble de paquets logiciels : - -# export FAI_BASEFILEURL=https://fai-project.org/download/basefiles/ -# fai-diskimage -vu cloud3 -S2G -cDEBIAN,BOOKWORM64,AMD64,FAIBASE,GRUB_PC,DHCPC,DEMO,CLOUD,LAST disk.raw - -Cette commande créera une image de disque nommée ubuntu.qcow2 pour -une configuration de bureau Ubuntu 16.04 avec pour nom d’hôte machin. - -# export FAI_BASEFILEURL=https://fai-project.org/download/basefiles/ -# cl=DHCPC,UBUNTU,JAMMY,JAMMY64,AMD64,XORG,LAST -# fai-diskimage -Nvu machin -S5G -c$cl ubuntu.qcow2 - -Vous pouvez essayer quelques images de disques sans installer FAI, si -vous visitez https://fai-project.org/FAIme/cloud - - -8.8. Création d’une image vive amorçable - --------------- - -La création d’images ISO vives amorçables est facile avec FAI. Il -suffit de deux étapes. Premièrement, créez votre environnement vif à -l’aide de la commande fai dirinstall. N’oubliez pas d’ajouter la -classe LIVEISO. Ensuite, créez l’image ISO vive en utilisant fai-cd : - -# cl="DEBIAN,BOOKWORM64,AMD64,FAIBASE,XFCE,XORG,DHCPC,DEMO,LIVEISO,LAST" -# LC_ALL=C fai -v dirinstall -u xfce33 -c $cl \ - -s file:///srv/fai/config /srv/xfce -# fai-cd -s500 -MH -d none -g /etc/fai/grub.cfg.live \ - -n /srv/xfce live.iso - -Le nfsroot n’est pas nécessaire pour une image ISO vive. Il n’y a pas -actuellement d’image vive ISO disponible sur le serveur -d’installation. - - -8.9. Construire des images disque d’architecture différente -(cross-architecture) - --------------- - -À partir de FAI 5.4 il devient possible de construire une image -disque pour des architectures différentes de l’hôte qui est utilisé. -Par exemple on peut construire une image pour une architecture ARM -64-bit (aarch64) sur un hôte qui fonctionne sur une architecture -amd64. Voici les étapes successives : - -# apt install qemu-system-arm qemu-user-static fai-server fai-setup-storage fai-doc qemu-utils -# fai-mk-configspace - -# export FAI_BASEFILEURL=https://fai-project.org/download/basefiles/ -# fai-diskimage -vu armhost -S2G -cDEFAULT,DHCPC,DEBIAN,ARM64,BUSTER_ARM64,FAIBASE,DEMO,CLOUD,LAST arm64.raw -# chown your_user_id arm64.raw -# cp /var/log/fai/armhost/last/vmlinuz* vmlinuz -# cp /var/log/fai/armhost/last/initrd.img* initrd - -Ensuite on peut lancer qemu en tant qu’utilisateur ordinaire : - -> qemu-system-aarch64 -m 1000 -M virt,gic_version=3 -cpu cortex-a57 -drive file=arm64.raw,if=virtio,index=1 -no-reboot -nographic -name ARM64 -net nic,name=eth0,model=virtio -net user,name=eth0,-kernel vmlinuz -initrd initrd -append "console=ttyAMA0 rw ip=dhcp root=/dev/vda1 net.ifnames=0" - -Ça fonctionne de même pour d’autres architectures. Il faut garder en -tête que les réglages réseau de qemu ont des performances dégradées -si on n’utilise pas le pilote virtio comme ci-dessus ou des TAPs -réseaux. - -On peut trouver les fichiers de base pour plusieurs architectures à -https://fai-project.org/download/basefiles/, ou utiliser mk-basefile -pour créer son fichier propre. - - -8.10. Système de sauvetage FAI - --------------- - -Si vous assignez à la variable $FAI_ACTION la valeur sysinfo (par -exemple en utilisant fai-chboot -S), le client n’installera pas de -nouveau système, mais collectera beaucoup d’informations système. Si -vous assignez à $FAI_ACTION la valeur inventory, vous ne recevrez que -quelques informations sur le matériel. Les deux actions peuvent être -utilisées pour FAI comme un système de sauvetage. - -Tapez ctrl-c pour obtenir un shell ou utilisez Alt-F2 ou Alt-F3 et -vous obtiendrez une autre console de terminal, si vous avez ajouté -createvt à $FAI_FLAGS. - -Vous voilà maintenant avec un système Linux qui fonctionne sur le -client d’installation sans utiliser le disque dur local. Utilisez-le -comme système de secours si votre disque local est endommagé ou si -l’ordinateur ne peut pas démarrer correctement à partir du disque -dur. Vous obtiendrez un shell et vous pouvez exécuter diverses -commandes (dmesg, lsmod, df, lspci, …). Regardez le fichier journal -dans /tmp/fai. Vous y trouverez de nombreuses informations sur le -processus d’amorçage. - -FAI monte tous les systèmes de fichiers qu’il trouve sur les disques -locaux en lecture seule. Il vous indique également sur quelle -partition un fichier /etc/fstab existe. Lorsqu’une seule table de -système de fichiers est trouvée, les partitions sont montées selon -ces informations. Voici un exemple : - -demohost:~# df -h - -Filesystem Size Used Avail Use% Mounted on -devtmpfs 4.0M 0 4.0M 0% /dev -tmpfs 2.0G 0 2.0G 0% /dev/shm -tmpfs 783M 18M 766M 3% /run -tmpfs 5.0M 0 5.0M 0% /run/lock -LiveOS_rootfs 783M 18M 766M 3% / -192.168.33.250:/srv/fai/config 59G 23G 24G 49% /var/lib/fai/config -/dev/mapper/vg1-root 7.3G 1.8G 5.2G 26% /target -/dev/vda1 459M 53M 378M 13% /target/boot -/dev/mapper/vg1-home 1.4G 72K 1.3G 1% /target/home - -Cette méthode peut être utilisée comme un environnement de -sauvetage ! Si vous avez besoin d’un système de fichiers avec accès -en lecture/écriture, utilisez la commande rwmount : - -demohost# rwmount /target/home - - -8.11. FAI sans NFS - --------------- - -Pour démarrer dans FAI et commencer la séquence d’installation sans -utiliser le protocole NFS, vous démarrez la machine cliente en -utilisant PXE comme d’habitude, puis récupérez une image contenant le -nfsroot via http. - -Pour créer une image, utilisez l’argument -S de fai-cd et -M pour -éviter de créer un miroir partiel à l’intérieur de l’image. - -faiserver# fai-cd -M -S squash.img - -Déplacez cette image vers un répertoire à partir duquel elle peut -être demandée via http (généralement un répertoire accessible par le -serveur web) - -Pour demander alors l’image squashfs, ajoutez ce qui suit à votre -ligne de commande du noyau, par exemple dans votre fichier de -configuration pxelinux pour le client avec fai-chboot. - -root=live:http://faiserver/cskoeln/squash.img FAI_CONFIG_SRC=file:///var/lib/fai/config - -Remplacez faiserver par le nom de domaine ou l’IP de la machine de -laquelle votre image de squash est servie. - - -8.12. Installation d’autres distributions à l’aide d’un nfsroot -Debian - --------------- - -Vous pouvez installer toutes sortes de distributions Linux à partir -d’un seul nfsroot Debian. Par conséquent, vous devez créer un fichier -base.tar.xz de la distribution que vous souhaitez installer et le -placer dans le répertoire basefiles. Puis nommez-le UBUNTU2204.tar.xz -par exemple. Un client d’installation appartenant à la classe -UBUNTU2204 extrait ensuite ce fichier de base dans son système de -fichiers vide. De plus, vous devez ajuster les sources.list ou les -fichiers de configuration similaires nécessaires pour spécifier -l’emplacement du dépôt de paquets. - -L’outils rinse(8) est utilisé pour créer des fichiers de base pour -des distributions comme Rocky Linux, CentOS, openSUSE, ou Fedora. -Certains fichiers de base peuvent être téléchargés à partir de https: -//fai-project.org/download/basefiles/. - -Le script mk-basefile dans /usr/share/doc/fai-doc/examples/simple/ -basefiles/ aide à créer ces fichiers de base. - - -8.13. Création d’environnements chroot et de virtualisation - --------------- - -Si vous devez créer certains environnements chroot, ou un -environnement de virtualisation où vous ne pouvez ni ne voulez -exécuter un programme d’installation Debian normal pour accéder à un -système opérationnel (par exemple, les domaines hôtes Xen), il y a -l’action FAI dirinstall. En appelant : - -faiserver# fai dirinstall - -et en utilisant l’option -c ou -N vous obtenez une -installation FAI, sans l’action de partitionnement, directement dans -le répertoire cible. Le nom d’hôte de la cible d’installation peut -être spécifié à l’aide de -u - -On peut utiliser cela, par exemple, pour combiner FAI avec les outils -xen-tools, qui vous aident à construire des domaines invités Xen. Les -xen-tools sont très agréables pour générer des fichiers de -configuration et bloquer des périphériques pour de nouveaux invités -sur la base de commandes simples et/ou des fichiers de configuration, -mais ils ne peuvent assigner qu’un seul rôle par installation pour la -personnalisation. Les utilisateurs de FAI ont besoin de plus et en -veulent, car ils ont l’habitude d’avoir le système de classes. Ils -peuvent y arriver même dans les installations xen-tools, en utilisant -le code suivant en tant que rôle xen-tools script : - -#!/bin/sh -TARGET=$1 -CMD="fai -N -v -u ${hostname} dirinstall $TARGET" -echo running $CMD -$CMD - -Ensuite, il faut définir la variable install=0 dans la configuration -xen-tools pour cet hôte. - - -8.14. Utilisation de FAI pour les mises à jour - --------------- - -FAI peut également effectuer des mises à jour de systèmes déjà en -cours d’exécution, sans réinstallation à partir de zéro. C’est ce -qu’on appelle softupdate. Un FAI softupdate ignore les tâches qui ne -sont pas adaptées à la mise à jour d’un système en cours d’exécution, -comme le partitionnement des disques durs et la création de systèmes -de fichiers. Au lieu de cela, il exécute uniquement les tâches de -mise à jour et d’installation des paquets logiciels et l’appel des -scripts de personnalisation. - -Pour lancer un softupdate : - -# fai -v -s nfs://faiserver/srv/fai/config softupdate - -Par défaut, un softupdate utilise la liste des classes définies lors -de l’installation initiale. Assurez-vous de définir la variable -$LOGSERVER (ça se fait dans un fichier class/*.var) si FAI doit -enregistrer les fichiers journaux sur une machine distante. - -C’est à vous de décider, comment démarrer un softupdate sur un plus -grand nombre d’hôtes. Vous pouvez faire le softupdate sur -régulièreent via cron ou vous pouvez utiliser des outils comme -clusterssh(1) pour démarrer un softupdate via un push sur une liste -d’hôtes. - -Gardez à l’esprit que les scripts de personnalisation sont exécutés -chaque fois que vous faites un softupdate. Cela signifie qu’ils -doivent être idempotents, c’est-à-dire que le résultat de leur -fonctionnement doit toujours produire le même résultat, même -lorsqu’ils fonctionnent plus d’une fois. - -Par exemple, l’ajout d’une ligne à un fichier ne doit pas se faire -via ce code : - -$ echo "some strings" >> /etc/fstab - -Au lieu de ça, utilisez la commande ainsl(1) dans un script shell ou -utilisez la fonction de cfengine AppendIfNoSuchLine. - -Toutes les commandes du script de personnalisation doivent être -capables de modifier le système de fichiers cible qui’il soit -disponible dans /target lors de l’installation initiale ou qu’il soit -le système de fichiers normal relatif à / pendant le softtupdate. - -Voici quelques variables qui aident à écrire ces scripts : - -$target - Pointe vers le répertoire racine du client, qui est /target - pendant l’installation et / pendant un softupdate. -$FAI_ROOT - C’est la même valeur que $target. Pour des raisons historiques, - on a ces deux variables dans FAI. -$ROOTCMD - Dans le cas de l’installation, il s’agit d’un alias pour chroot - $target en cas de softupdate, c’est juste vide. Vous pouvez - ajouter ceci avant les commandes si vous avez besoin d’exécuter - une commande dans le système de fichiers cible des clients via - chroot. -$FAI_ACTION - Si vous devez appeler le code en fonction de l’action FAI - effectuée, vous pouvez utiliser cette variable. Elle contient - l’action actuellement exécutée: install, softupdate, dirinstall, - sysinfo, inventory ou votre propre action définie. - - -8.15. Comment installer un système d’exploitation 32 bits à partir -d’un système d’exploitation 64 bits - --------------- - -Pour installer un ordinateur avec un système d’exploitation 32 bits, -vous avez besoin d’un nfsroot i386. La création de ce nfsroot 32 bits -sur un serveur d’installation qui fonctionne sous amd64 est simple. -Installez et configurez les paquets FAI. Copiez ensuite vos fichiers -de configuration FAI dans un nouveau sous-répertoire. - -faiserver# cp -a /etc/fai /etc/fai-i386 - -Modifiez la variable $FAI_DEBOOTSTRAP_OPTS dans /etc/fai-i386/ -nfsroot.conf et ajoutez l’option --arch i386. Choisissez également un -répertoire différent pour votre nouveau nfsroot. Voici les deux -lignes après l’édition. - -NFSROOT=/srv/fai/nfsroot-i386 -FAI_DEBOOTSTRAP_OPTS="--arch i386 --exclude=info --include=aptitude"" - -Appelez maintenant fai-make-nfsroot qui crée le nfsroot 32 bits dans -/srv/fai/nfsroot-i386 - -faiserver# fai-make-nfsroot -v -C/etc/fai-i386 - -La création d’un miroir partiel utilisant fai-mirror(1) qui est -nécessaire à un CD amorçable ou une clé USB est également possible -sur une architecture différente. Vous devez spécifier l’architecture -lors de l’appel de fai-mirror. - -$ fai-mirror -m800 -B -a i386 -v -cDEFAULT,DEBIAN,FAIBASE,I386 /srv/mirror-i386 - -Et voilà ! - - -8.16. Arrêt d’urgence de l’installation quand une erreur se produit - --------------- - -Chaque tâche, chaque hook peut appeler la fonction task_error pour -envoyer une valeur d’erreur à l’installation. Cette erreur apparaîtra -dans le fichier de journalisation et peut être visionnée dans le -fai-monitor-gui(1). La valeur de l’erreur est aussi examinée en -tenant compte de la variable $STOP_ON_ERROR qui est réglée à 700 par -défaut. Si la valeur d’erreur est supérieure à $STOP_ON_ERROR, -l’installation s’arrêtera immédiatment. Dans un hook, ajoutez -simplement un appel comme celui-ci : - -task_error - -C’est commode d’appeler task_error avec $? comme deuxième paramètre, -par exemple si on veut émettre une valeur d’erreur de 123 on peut -faire ainsi - - -task_error 123 $? - -Alors, l’erreur de tâche n’est mise en place que si la commande -précédente a échoué avec une certaine erreur. La même syntaxe peut -être utilisée par les scripts dans le sous-répertoire de classe qui -se terminent en .sh. - -Un cas particulier est celui des scripts dans le sous-répertoire -class/ qui ne se termine pas en .sh. Dans ces scripts il faut appeler -task_error avec 1 comme troisième paramètre. Par exemple on peut -utiliser deux variantes pour régler la valeur à 123 - -task_error 123 $? 1 - -ou - -task_error 123 1 1 - -La dernière commande met toujours l’erreur de tâche à 123 sans tenir -compte de $?. Si la valeur d’erreur est supérieure à $STOP_ON_ERROR, -l’installation sera immédiatement stoppée. - -Les valeurs d’erreur sont regroupées dans quatre catégories - -normale ou messages d'information : 1xx, 2xx -avertissements : 3xx, 4xx -erreurs mineures : 5xx, 6xx -erreurs : 7xx, 8xx - -Le fai-monitor-gui possède 4 icônes différentes pour ces catégories -d’erreur. - - ---------------------------------------------------------------------- - -9. Divers conseils et détails - ---------------------------------------------------------------------- - - -9.1. La liste des tâches - --------------- - -La plupart des tâches de l’installation sont définies comme des -sous-routines qui sont définies dans /usr/lib/fai/subroutines (par -exemple task_instsoft). Certaines sont des scripts shell externes -situés dans /usr/lib/fai/. Elles sont appelées via un sous-programme -supérieur nommé task. Ce sous-programme appelle les hooks si -disponibles, puis appelle la tâche (définie comme task_). Une -tâche et ses hooks peuvent être ignorés à la demande en utilisant la -commande skiptask(). - -Voici maintenant la description de toutes les tâches, énumérées dans -l’ordre dans lequel elles sont exécutées. - -confdir - Les paramètres ajoutés au noyau peuvent définir des variables, le - démon syslog est démarré. Les paramètres de réseau sont récupérés - d’un serveur DHCP et sont enregistrés dans boot.log. La - configuration pour la résolution DNS est créée. L’emplacement de - l’espace de configuration est défini par la variable - $FAI_CONFIG_SRC. Ensuite, le fichier $FAI/hooks/subroutines est - sourcé s’il existe. En utilisant ce fichier, vous pouvez définir - vos propres sous-programmes ou remplacer la définition des - sous-programmes de FAI. -setup - Cette tâche définit l’heure du système, tous les $FAI_FLAGS sont - définis et deux terminaux virtuels supplémentaires sont ouverts à - la demande. Un démon ssh est lancé à la demande pour les - connexions à distance. -defclass - Appels de fai-class(1) pour définir des classes à l’aide de - scripts et de fichiers dans $FAI/class et classes de /tmp/fai/ - additional-classes et la variable $ADDCLASSES. La liste de toutes - les classes définies est stockée dans la variable $classes et - enregistrée dans /tmp/fai/FAI_CLASSES. -defvar - Source tous les fichiers $FAI/class/*.var pour chaque classe - définie. Si un hook a écrit quelques définitions de variables - dans le fichier $LOGDIR/additional.var, ce fichier est également - sourcé. -action - En fonction de la valeur de $FAI_ACTION, ce sous-programme décide - de l’action FAI à exécuter. Les actions disponibles par défaut - sont : sysinfo, install, inventory, dirinstall et softupdate. Si - $FAI_ACTION a une autre valeur, une action définie par - l’utilisateur est appelée si un fichier $FAI/hooks/$FAI_ACTION - existe. Ainsi, vous pouvez facilement définir vos propres - actions. -sysinfo - Appelée lorsque aucune installation n’est effectuée mais que - l’action est sysinfo. Elle affiche des informations sur le - matériel détecté et monte les disques durs locaux en lecture - seule sur /target/partitionname ou en tenant compte d’un fichier - fstab trouvé à l’intérieur d’une partition. Les fichiers journaux - sont stockés sur le serveur d’installation. -inventory - Une courte liste des informations système est imprimée. -install - Cette tâche contrôle la séquence d’installation. Vous entendrez - trois bips avant le début de l’installation. Le travail principal - consiste à appeler d’autres tâches et à enregistrer la sortie - dans /tmp/fai/fai.log. Si vous avez des problèmes pendant - l’installation, regardez tous les fichiers dans /tmp/fai/. Vous - trouverez des exemples de fichiers journaux à l’adresse https:// - fai-project.org/logs/. -dirinstall - Installe dans un répertoire, et non pas sur un disque local. - Utilisez-le pour créer des environnements chroot. -softupdate - Cette tâche, exécutée à l’intérieur d’un système en cours - d’exécution via la commande en ligne fai(8), effectue un - softupdate. Voir le chapitre [softupdate] pour plus de détails. -partition - Appelle setup-storage(8) pour partitionner les disques durs et - créer des systèmes de fichiers. La tâche écrit des définitions de - variables pour les partitions et périphériques racine et de - démarrage ($ROOT_PARTITION, $BOOT_PARTITION, $BOOT_DEVICE) dans / - tmp/fai/disk_var.sh et crée un fichier fstab pour le nouveau - système. -mountdisks - Monte les partitions créées en fonction du fichier /tmp/fai/fstab - créé par rapport à $FAI_ROOT. -extrbase - Extrait un système minimal après lequel un chroot puisse y être - introduit. Par défaut, le fichier tar de base /var/tmp/ - base.tar.xz sera extrait. Les fichiers correspondant à un nom de - classe dans $FAI/basefiles/ sont également utilisés pour - décompresser un autre fichier tar selon les classes définies. - Cela peut être utilisé pour installer des distributions Linux - différentes de celles utilisées pour créer le nfsroot. Le fichier - par défaut base.tar.xz est un instantané d’un système Debian de - base créé par debootstrap(8) Cette tâche utilise la variable - FAI_BASEFILEURL pour récupérer le fichier de base via FTP, HTTPS - ou HTTP si celle-ci est définie. -debconf - Appelle fai-debconf(1) pour définir les valeurs de la base de - données de pré-ensemencement de debconf. -repository - Prépare l’accès au dépôt de paquets en préparant la configuration - apt. Cela peut également ajouter des clés de dépôts en tenant - compte des classes à partir de fichiers comme CLASSNAME.gpg dans - le répertoire package_config. -updatebase - Met à jour les paquets de base du nouveau système et met à jour - la liste des paquets disponibles. Il contrefait également - certaines commandes (appelées diversions) à l’intérieur du - nouveau système installé à l’aide de dpkg-divert(8), de sorte - qu’aucun démon ne soit démarré pendant l’installation. -instsoft - Installe les paquets logiciels souhaités en utilisant des - fichiers de classe dans $FAI/package_config/. -configure - Appelle les scripts dans $FAI/scripts/ et ses sous-répertoires - pour chaque classe définie. -tests - Appelle les scripts de test dans $FAI/tests/ et ses - sous-répertoires pour chaque classe définie. -finish - Démonte tous les systèmes de fichiers dans le nouveau système - installé et supprime les diversions de fichiers à l’aide de la - commande fai-divert. -chboot - Modifie la configuration PXE d’un hôte sur le serveur - d’installation, qui indique quelle configuration PXELINUX doit - être chargée lors de la prochaine initialisation à partir de la - carte réseau via TFTP. Par conséquent, la commande fai-chboot(8) - est exécutée à distance sur le serveur d’installation. -savelog - Enregistre les fichiers journaux sur le disque local et sur le - compte $LOGUSER sur $LOGSERVER (par défaut sur le serveur - d’installation). -faiend - Attend que les travaux en arrière-plan se terminent (par exemple, - qu’emacs compile des fichiers lisp) puis redémarre - automatiquement les clients d’installation ou attend la saisie - manuelle avant le redémarrage. - - -9.2. Tests automatisés - --------------- - -Après l’exécution des scripts de personnalisation, FAI exécutera -certains tests si disponibles. En utilisant ces tests, vous pouvez -vérifier les erreurs de l’installation. Les scripts de test sont -appelés via fai-do-scripts(1) et doivent ajouter leurs messages à -$LOGDIR/test.log. Un module Perl comprenant des sous-routines utiles -peut être trouvé dans Faitest.pm. Un test peut également définir une -nouvelle classe pour exécuter d’autres tests lors du prochain -démarrage via la variable $ADDCLASSES. - - -9.3. Découvrir automatiquement - --------------- - -Dans FAI 5.0, nous avons publié une fonctionnalité qui permet aux -clients de rechercher le faiserver dans leur sous-réseau respectif. -Cela soulève la nécessité de récupérer l’adresse MAC de chaque client -et de configurer le démon DHCP. - -Cela se fait en démarrant à partir d’une petit media vif autodiscover -FAI (CD, USB, etc.), qui peut être créé via la commande : - -faiserver# fai-cd -A autodiscover.iso - -L’image a une taille d’environ 25 Mo et analyse le sous-réseau d’un -serveur FAI. Par défaut, il affiche un menu avec tous les profils -disponibles dans l’espace de configuration de la même manière que le -fait l’option menu. Dans ce menu, vous pouvez sélectionner le type -d’installation que vous souhaitez effectuer. - -Pour que les clients puissent trouver le faiserver, le faiserver doit -lancer fai-monitor. - - -9.4. Modification du périphérique d’amorçage - --------------- - -La modification de la séquence d’amorçage s’effectue normalement dans -la configuration du BIOS. Mais vous ne pouvez pas changer le BIOS -d’un système Linux en cours d’exécution. - -Ainsi, la séquence d’amorçage du BIOS restera inchangée et votre -ordinateur devrait toujours démarrer en premier à partir de sa carte -réseau et le deuxième périphérique d’amorçage devrait être le disque -local. Ensuite, vous pouvez changer le périphérique d’amorçage du -client en créant différentes configurations PXELINUX. Cela définira -si une installation doit être effectuée, ou si le client doit -démarrer à partir du disque local. Cela se fait à l’aide de -fai-chboot(8). - - -9.5. Comment créer un miroir Debian local - --------------- - -Le script utilitaire mkdebmirror ^[19] peut être utilisé pour créer -votre propre miroir Debian local. Ce script utilise la commande -debmirror(1). Un miroir Debian partiel pour l’architecture amd64 pour -Debian 11 et 12 (noms de code bullseye et bookworm) sans les paquets -source nécessite environ 180 Go d’espace disque. L’accès au miroir -via HTTP sera la méthode par défaut dans la plupart des cas. Pour -afficher plus de résultats à partir du script, appelez mkdebmirror --v. Un compte root n’est pas nécessaire pour créer et maintenir le -miroir Debian. - -Pour utiliser l’accès HTTP au miroir Debian local, installez un -serveur web et créez un lien symbolique vers le répertoire local où -se trouve votre miroir : - -faiserver# apt-get install apache2 -faiserver# ln -s /files/scratch/debmirror /var/www/html/debmirror - -Créez un fichier sources.list(5) dans /etc/fai/apt qui donne accès à -votre miroir Debian. Ajoutez également l’adresse IP du serveur HTTP à -la variable $NFSROOT_ETC_HOSTS dans nfsroot.conf si les clients -d’installation n’ont pas de résolution DNS. - - -9.6. Petits conseils - --------------- - - * Lorsque vous utilisez l’accès HTTP à un miroir Debian, la - partition locale /var sur tous les clients d’installation doit - être suffisamment grande pour conserver les paquets Debian - téléchargés. N’essayez pas avec moins de 250 Moctets à moins que - vous sachiez pourquoi. Vous pouvez limiter le nombre de paquets - installés à la fois avec la variable $MAXPACKAGES. - * Vous pouvez supprimer le logo rouge sur le client d’installation - en appelant simplement une fois reset. Il ne s’affichera pas si - vous créez un fichier à l’aide de cette commande sur le serveur - d’installation : - -touch /srv/fai/nfsroot/.nocolorlogo - - * Une liste des variables utilisées par FAI peut être trouvée à - https://wiki.fai-project.org/index.php/Variables. - * Vous pouvez raccourcir certains scripts de personnalisation en - utilisant une seule commande fcopy fcopy -r /. - * Si vous reconstruisez le nfsroot, vous allez créer une nouvelle - clé hôte ssh dans le nfsroot. La connexion à un client - d’installation peut échouer, car la clé hôte change. Vous pouvez - utiliser ceci : - -$ ssh -o StrictHostKeyChecking=no root@installclient - - * Vous pouvez également supprimer l’entrée hôte de votre client - d’installation dans votre fichier ~/.ssh/known_hosts à l’aide de - la commande ssh-keygen -R. - * Dans les tâches chboot et savelog, une connexion utilisant un - shell sécurisé est ouverte vers le serveur FAI (voir [isavelog]). - Pour garantir que cela fonctionne de manière non interactive, une - entrée appropriée dans NFSROOT/root/.ssh/known_hosts doit être - créée. Lors de l’utilisation de fai-setup, cela se fait - automatiquement, mais il peut s’avérer nécessaire de l’éditer - manuellement si le nom de votre serveur FAI n’a pas été - correctement déterminé. Si vous trébuchez sur des connexions ssh - qui nécessitent de taper "yes" pour accepter la clé hôte pendant - l’installation, vérifiez le contenu de votre fichier NFSROOT/root - /.ssh/known_hosts - * Une liste de tous les disques durs locaux est stockée dans - $disklist. Elle est définie après l’appel de set_disk_info. - * Il y a de nombreuses fonctions pour générer un liste - personnalisée de disques. Voir fai-disk-info pour un exemple. - - + set_bootstick() - + grepv_disks() - + grep_disks() - + notmatchdisks() - + matchdisks() - + smallestdisk() - + largestdisk() - + all_disks_by_size() - + all_disks_and_size() - + once_only() - + checkdisk() - + disks_by_id() - * Utilisez fai-divert -a si un script postinst appelle un programme - de configuration, par exemple le script postinst pour le paquet - apache appelle apacheconfig, qui nécessite une entrée manuelle. - Vous pouvez contrefaire le programme de configuration pour que - l’installation puisse être entièrement automatique. - * Parfois, l’installation semble s’arrêter, mais souvent il y a - seulement un script postinstall d’un logiciel qui nécessite une - entrée manuelle de la console. Passez à un autre terminal virtuel - et regardez quel processus fonctionne avec des outils comme top - (1) et pstree(1). Vous pouvez ajouter debug à FAI_FLAGS pour - faire en sorte que le processus d’installation affiche toutes les - sorties des scripts postinst sur la console et obtenir son entrée - aussi à partir de la console. - * Comment puis-je définir des classes sur la ligne de commande du - noyau ? - - Lire la page de manuel de fai-class(8). Si vous voulez définir - quelques classes supplémentaires (par exemple A; B, C) dans la - commande du noyau, ajoutez ceci : ADDCLASSES=A,B,C - - * Comment utiliser un noyau personnalisé dans le nfsroot ? - - Construisez votre noyau personnalisé en construisant un paquet - kernelde noyau à l’aide de make-kpkg(8) et utilisez l’option - --initrd. Copiez ce paquet Debian dans un dépôt local et - ajoutez-le à /etc/fai/sources.list. Ajoutez le nom de votre - paquet à /etc/fai/NFSROOT. Ensuite appelez - - # fai-make-nfsroot -k - - * Comment utiliser le nfsroot comme système pour les clients sans - disque ? - - https://wiki.fai-project.org/index.php/ - Use_nfsroot_for_diskless_clients - - * Comment faire pour servir plusieurs arborescence nfsroot sur un - serveur FAI ? - - Si vous souhaitez diffuser plusieurs répertoires nfsroot, vous - devez créer des répertoires de configuration spécifiques dans / - etc pour FAI, comme /etc/fai-buster et /etc/fai-bookworm. - Ensuite, vous devez définir les variables $NFSROOT dans - différents répertoires et lancer - -faiserver#fai-make-nfsroot -C /etc/fai-buster - - -9.7. flag_reboot (FAI_FLAGS) - --------------- - -Si flag_reboot est défini, en ajoutant "reboot" à $FAI_FLAGS, votre -ordinateur client redémarrera après la fin de la tâche faiend. Ceci -est vrai pour les installations par réseau ainsi que pour les -installations par media amorçable. - - -9.8. Fichiers journaux - --------------- - -FAI crée plusieurs fichiers journaux. Pendant l’installation, ils -sont stockés dans /tmp/fai sur le client d’installation lui-même. A -la fin de l’installation, ils seront copiés sur le serveur -d’installation (voir [isavelog]). Une fois le client d’installation -redémarré dans son système nouvellement installé, vous pouvez trouver -les journaux FAI dans /var/log/fai. Les fichiers journaux sont -également créés lors de l’action softupdate ou dirinstall. - -Sur le faiserver, vous pouvez trouver les fichiers journaux -(distants) sous le répertoire ~fai. - -Des exemples de fichiers journaux d’ordinateurs installés avec succès -sont disponibles sur https://fai-project.org/logs. Ce sont quelques -fichiers journaux qui sont créés par FAI. - -FAI_CLASSES - Contient une liste de toutes les classes définies. -dmesg.log - La sortie de la commande dmesg. Contient des messages utiles de - la mémoire tampon du noyau. -fai.log - Le fichier journal principal. Contient toutes les informations - importantes. Vous devez toujours lire ce fichier. -boot.log - Une liste de variables de paramètres de réseau, principalement - définis par le démon DHCP. -format.log - Sortie de l’outil de partition setup-storage(8). -scripts.log - Sortie de tous les scripts, qui sont utilisés pour la - personnalisation. -variables.log - Une liste de toutes les variables shell qui sont disponibles au - cours d’une installation. -error.log - Résumé des erreurs possibles dans tous les fichiers journaux. -disk_var.sh - Une liste des variables contenant des informations sur les - périphériques et les partitions à partir desquelles on démarre, - la partition racine et une liste de périphériques de swap. Ces - informations sont utilisées par certains scripts de - personnalisation (par exemple GRUB_PC/10-setup). - -Si le processus d’installation se termine, le hook savelog.LAST.sh -recherche dans tous les fichiers journaux les erreurs courantes et -les écrit dans le fichier error.log. Donc, vous devriez d’abord -regarder dans ce fichier pour les erreurs. Le fichier status.log vous -donne également le code de sortie de la dernière commande exécutée -dans un script. Pour être sûr, vous devrez rechercher plus de détails -dans tous les fichiers journaux. - - -9.9. Comment utiliser HTTP pour le démarrage PXE - --------------- - -fai-make-nfsroot utilise maintenant le fichier binaire lpxelinux.0 -qui prend en charge déjà le transfert du noyau et du fichier initrd -via http (en plus de tftp). Il vous suffit d’activer un accès HTTP au -répertoire tftp : - -cd /var/www/html -ln -s /srv/tftp/fai - -Ajoutez -U URL à l’appel fai-chboot. Par exemple : - -fai-chboot -U http://faiserver/fai -IFv ....... - - ---------------------------------------------------------------------- - -10. Dépannage - ---------------------------------------------------------------------- - - -10.1. Erreurs d’amorçage - --------------- - -Le message d’erreur suivant indique que votre client d’installation -n’obtient pas de réponse d’un serveur DHCP. Vérifiez vos câbles ou -démarrez le démon dhcpd(8) avec l’option debug activée. - - PXE-E51: No DHCP or BOOTP offers received - Network boot aborted - -Si vous ne voyez pas le message suivant, le noyau d’installation n’a -pas pu détecter votre carte réseau, par exemple en raison d’un pilote -manquant : - -Starting dhcp for interface eth0 -dhcp: PREINIT eth0 up -dhcp: BOND setting eth - -Vérifiez le fichier initrd dans le nfsroot (lsinird) pour voir si le -pilote du noyau de votre carte réseau est inclus et vérifiez si vous -souhaitez ajouter le paquet firmware-linux-nonfree dans /etc/fai/ -NFSROOT` puis reconstruisez le fichier initrd en appelant -fai-make-nfsroot -k. Vous pouvez également ajouter un pilote à +/srv/ -fai/nfsroot/etc/dracut.conf dans la ligne add_drivers+=. - -Voici le message d’erreur que vous verrez, lorsque votre carte réseau -fonctionne, mais le serveur d’installation n’exporte pas le -répertoire nfsroot vers les clients d’installation. Cela est souvent -dû aux permissions NFS manquantes du côté serveur. - -Starting dhcp for interface eth0 -dhcp: PREINIT eth0 up -dhcp: BOND setting eth -mount.nfs: access denied by server while mounting 192.168.33.250:/srv/fai/nfsroot -. -. -dracut Warning: Could not boot -. -Dropping to debug shell -dracut:/# - -Maintenant, vous êtes à l’intérieur du shell d’urgence de l’initrd -qui a été créé par dracut(8). Vous obtiendrez une invite du shell et -pourrez consulter les fichiers journaux. Pour plus d’informations sur -le débogage du processus de démarrage précoce à l’aide de dracut, -consultez dracut.cmdline(7) - -Utilisez la commande suivante sur le serveur d’installation pour voir -quels répertoires sont exportés à partir du serveur d’installation -(nommé faiserver) : - -$ showmount -e faiserver - - ---------------------------------------------------------------------- - -^[1] Solaris 8 Advanced Installation Guide at "https:// -docs.oracle.com/cd/E19455-01/806-0957/806-0957.pdf - -^[2] http://www.science.uva.nl/pub/solaris/auto-install - -^[3] https://wiki.fai-project.org/index.php/ -VirtualBox_for_your_first_FAI_installation - -^[4] https://fr.wikipedia.org/wiki/TAP_r%C3%A9seau - -^[5] Cette installation utilisera environ 2GB d’espace dans /tmp. - -^[6] on peut aussi seulement utiliser le fichier de configuration qui -a la priorité la plus élevée, comme l’ordre des classes définit une -priorité de la plus basse à la plus élevée dans la liste des classes. - -^[7] Si vous voulez un miroir plus rapide, ajustez l’URL dans /etc/ -fai/apt/sources.list et FAI_DEBOOTSTRAP dans /etc/fai/nfsroot.conf -avant de lancer fai-setup. - -^[8] Cela invoque fai-make-nfsroot(8) en interne. - -^[9] Il n’est pas nécessaires que ces fichiers appartiennent au -compte root. - -^[10] On peut aussi ajouter cela dans son serveur de noms de domaine -(DNS) - -^[11] Comme le système de fichiers racine des clients est monté via -NFS, fai se situe dans /srv/fai/nfsroot/usr/sbin sur le serveur -d’installation. - -^[12] $FAI est une variable interne utilisée par les scripts FAI. Le -chemin par défaut est /var/lib/fai/config. - -^[13] /srv/fai/nfsroot depuis le serveur d’installation via NFS - -^[14] Celle-ci est définie dans la ligne de commande du noyau - -^[15] /var/lib/fai/config - -^[16] /var/log/fai/localhost/install/ est un lien vers ce répertoire. - -^[17] Je recommande d’inscrire l’adresse MAC (les trois derniers -octets devraient suffire si vous avez des cartes du même vendeur) et -le nom d’hôte devant chaque boîtier. - -^[18] À des fins de débogage, il peut être utile d’entrer dans -l’environnement chroot à la main à l’aide de cette commande : -faiserver# chroot /srv/fai/nfsroot bash - -^[19] On peut trouver ce script dans /usr/share/doc/fai-doc/examples/ -utils/ - From 9a606a4da9c8c8676459074fb8a0db0c5f8509fd Mon Sep 17 00:00:00 2001 From: Georges Khaznadar Date: Sat, 25 Oct 2025 14:20:05 +0200 Subject: [PATCH 9/9] removed the olf French translation used as template --- ... Guide (Fully Automatic Installation).html | 3844 ----------------- doc/fr-old/fai_guide.txt | 2830 ------------ 2 files changed, 6674 deletions(-) delete mode 100644 doc/fr-old/FAI Guide (Fully Automatic Installation).html delete mode 100644 doc/fr-old/fai_guide.txt diff --git a/doc/fr-old/FAI Guide (Fully Automatic Installation).html b/doc/fr-old/FAI Guide (Fully Automatic Installation).html deleted file mode 100644 index 149715b8f..000000000 --- a/doc/fr-old/FAI Guide (Fully Automatic Installation).html +++ /dev/null @@ -1,3844 +0,0 @@ - - - - -FAI Guide (Fully Automatic Installation) - - - - -

    -
    -
    -

    Abstrait

    -
    -

    FAI est un système non interactif permettant -d’installer, de personnaliser et de gérer les configurations de systèmes - et de logiciels Linux sur les ordinateurs ainsi que sur les machines -virtuelles et les environnements chroot, des petits réseaux aux grandes -infrastructures et clusters.

    -

    Ce manuel décrit le logiciel d’installation -entièrement automatique. Cela inclut l’installation des paquets, la -configuration du serveur, la création de la configuration et la gestion -des erreurs.

    -
    -
    -
         +-----------------------------------------------------------------------+
    -     | This manual describes FAI 5.3 but most things are also valid for 4.x. |
    -     +-----------------------------------------------------------------------+
    -
    -

    (c) 2000-2017 Thomas Lange

    -
    Copyright

    Ce manuel -est un logiciel libre; Vous pouvez le redistribuer et / ou le modifier -selon les termes de la Licence Publique Générale GNU publiée par la Free - Software Foundation; Soit la version 2, soit (à votre choix) toute -version ultérieure.

    -

    Ceci est distribué dans l’espoir qu’il sera -utile, mais sans aucune garantie ; Sans même la garantie implicite de -qualité marchande ou d’adaptation à un usage particulier. Pour plus de -détails, consultez la GNU General Public License.<

    -

    Une copie de la GNU General Public License est - disponible sous la forme /usr/share/common-licenses/GPL dans la -distribution Debian GNU/Linux ou sur le World Wide Web sur le site GNU -Vous pouvez également l’obtenir en écrivant à la Free Software -Foundation , Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, -États-Unis.

    -
    -
    -
    -
    -

    Introduction

    -
    -
    -

    Disponibilité

    -
    -
    -Page d’accueil -
    -
    -

    -http://fai-project.org -

    -
    -
    -FAI wiki -
    -
    -

    -http://wiki.fai-project.org -

    -
    -
    -Téléchargement -
    -
    -

    -http://fai-project.org/download -

    -
    -
    -Entrée pour sources.list -
    -
    -

    -deb http://fai-project.org/download jessie koeln -

    -
    -
    -Pages du manuel -
    -
    -

    -http://fai-project.org/doc/man/ -

    -
    -
    -Liste de diffusion -
    -
    -

    -https://lists.uni-koeln.de/mailman/listinfo/linux-fai -

    -
    -
    -Retour d’information -
    -
    -

    -Envoyez vos commentaires et vos commentaires à fai@fai-project.orgou à la liste de diffusion . -

    -
    -
    -Bogues -
    -
    -

    -Utiliser le système de suivi des bogues Debian (BTS) http://bugs.debian.org -

    -
    -
    -Changements visibles par l’utilisateur -
    -
    -

    -http://fai-project.org/NEWS -

    -
    -
    -Arbre source via git -
    -
    -

    -git clone git://github.com/faiproject/fai.git -

    -
    -
    -Voir l’arbre source avec http -
    -
    -

    -https://github.com/faiproject/fai -

    -
    -
    -

    Les pages man incluent toujours des -informations à jour et beaucoup de détails sur toutes les commandes FAI. - Alors, n’oubliez pas de les lire attentivement. Lisez maintenant ce -manuel, puis profitez de l’installation entièrement automatique et de -votre temps économisé.

    -
    -
    -

    Motivation

    -

    Avez-vous déjà effectué des installations -identiques d’un système d’exploitation à plusieurs reprises? -Souhaitez-vous être en mesure d’installer un cluster Linux avec des -dizaines de nœuds à lui seul?

    -

    Répéter la même tâche encore et encore est -ennuyeux - et conduira certainement à des erreurs. Aussi beaucoup de -temps pourrait être sauvé si les installations ont été faites -automatiquement. Un processus d’installation avec interaction manuelle -n’est pas à l'échelle. Mais les grappes ont l’habitude de croître au fil - des ans. Pensez à long terme plutôt que de planifier quelques mois dans - l’avenir.

    -

    En 1999, j’ai dû effectuer une installation -d’un cluster Linux avec un serveur et 16 clients. Puisque j’ai eu -beaucoup d’expérience en faisant des installations automatiques des -systèmes d’exploitation de Solaris sur le matériel de SUN SPARC, l’idée -de construire une installation automatique pour Debian est née. Solaris -dispose d’une fonctionnalité d’installation automatique appelée -JumpStart [1]. En conjonction avec les scripts d’auto-installation de Casper Dik [2], - Je pourrais sauver beaucoup de temps non seulement pour chaque nouvel -ordinateur de SUN, mais aussi pour la réinstallation des postes de -travail existants. Par exemple, j’ai dû construire un LAN temporaire -avec quatre stations de travail SUN pour une conférence, qui a duré -seulement quelques jours. J’ai retiré ces postes de travail de notre -réseau de recherche habituel et mis en place une nouvelle installation -pour la conférence. Quand il était terminé, j’ai simplement intégré les -postes de travail dans le réseau de recherche, redémarré une seule fois, - et après une demi-heure, tout était opérationnel comme avant. La -configuration de tous les postes de travail était exactement la même -qu’avant la conférence, car tout était effectué par le même processus -d’installation. J’ai également utilisé l’installation automatique pour -réinstaller un poste de travail après un disque dur endommagé avait été -remplacé. Il m’a fallu deux semaines pour recevoir le nouveau disque -dur, mais seulement quelques minutes après l’installation du nouveau -disque, le poste de travail fonctionnait comme avant. Et c’est pourquoi -j’ai choisi d’adapter cette technique à un cluster de PC sous Linux.

    -
    -
    -

    Comment fonctionne FAI

    -

    Le client d’installation qui sera installé à -l’aide de FAI, est démarré via une carte réseau ou à partir d’un CD ou -d’une clé USB. Il obtient une adresse IP et démarre un noyau Linux qui -monte son système de fichiers racine via NFS (nfsroot) du serveur -d’installation. Une fois le noyau démarré, le script de démarrage FAI -exécute l’installation automatique qui n’a pas besoin d’interaction. -Tout d’abord, les disques durs seront partitionnés, les systèmes de -fichiers seront créés et des progiciels seront ensuite installés. Après -cela, le nouveau système d’exploitation installé est configuré selon vos - besoins locaux en utilisant quelques scripts. Enfin, le nouveau système - d’exploitation sera démarré à partir du disque local.

    -

    Les détails sur la façon d’installer -l’ordinateur (la configuration) sont stockés dans l’espace de -configuration du serveur d’installation. Les fichiers de configuration -sont partagés entre des groupes d’ordinateurs s’ils sont similaires en -utilisant le concept de classe. Vous n’avez donc pas besoin de créer une - configuration pour chaque nouvel hôte. Par conséquent, FAI est une -méthode évolutive pour installer un gros cluster avec un grand nombre de - nœuds même si leur configuration n’est pas identique.

    -

    FAI peut également être utilisé comme un -système de sauvetage ou pour l’inventaire matériel. Vous pouvez démarrer - votre ordinateur, mais il n’effectuera pas une installation. Au lieu de - cela, il exécutera un Debian GNU / Linux entièrement fonctionnel sans -utiliser les disques durs locaux. Ensuite, vous pouvez effectuer une -connexion à distance et sauvegarder ou restaurer une partition de -disque, vérifier un système de fichiers, inspecter le matériel ou -effectuer toute autre tâche.

    -
    -
    -

    Caractéristiques

    -
      -
    • -

      -Une installation entièrement automatisée peut être effectuée. -

      -
    • -
    • -

      -Très rapide installation sans surveillance. -

      -
    • -
    • -

      -Système flexible grâce à un concept de classe simple. -

      -
    • -
    • -

      -Mise à jour des systèmes en cours d’exécution sans réinstallation. -

      -
    • -
    • -

      -Création facile d’un environnement de virtualisation ou d’un chroot -

      -
    • -
    • -

      -Les hôtes peuvent démarrer à partir d’une carte réseau, d’un CD, d’une clé USB. -

      -
    • -
    • -

      -Création simple d’un CD d’installation ou d’une clé USB. -

      -
    • -
    • -

      -PXE avec la méthode de démarrage DHCP est pris en charge. -

      -
    • -
    • -

      -ReiserFS, ext3 / ext4, btrfs et support de système de fichiers XFS. -

      -
    • -
    • -

      -Support logiciel RAID et LVM. -

      -
    • -
    • -

      -Détection automatique du matériel. -

      -
    • -
    • -

      -Vous pouvez déployer Debian, Ubuntu, CentOS, SuSE, Scientific Linux -

      -
    • -
    • -

      -Connexion à distance via ssh lors du processus d’installation possible. -

      -
    • -
    • -

      -Toutes les configurations similaires sont partagées entre tous les clients d’installation. -

      -
    • -
    • -

      -Les fichiers journaux de toutes les installations sont enregistrés sur le serveur d’installation. -

      -
    • -
    • -

      -Les scripts Shell, Perl, Python, Ruby, expect et CFEngine sont pris en charge lors de l'étape de personnalisation. -

      -
    • -
    • -

      -Prise en charge de nombreux protocoles comme NFS, FTP, HTTP, git -

      -
    • -
    • -

      -Peut être utilisé comme un système de sauvetage et pour l’inventaire matériel. -

      -
    • -
    • -

      -Prise en charge du client sans disque. -

      -
    • -
    • -

      -Ajoutez facilement vos propres fonctions via des hooks ou modifiez le comportement par défaut. -

      -
    • -
    • -

      -Clonage de machines utilisant des images de disque est pris en charge -

      -
    • -
    -
    -
    -

    Le temps de l’installation

    -

    Le temps d’installation est déterminé par la -quantité de logiciel et la vitesse du disque dur. Voici quelques -exemples de temps. Tous les clients d’installation avaient une carte -réseau 1Gbit installée.

    -
    - ------ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    CPU RAM Disk Software installed time

    i7-3770T 2.50GHz

    8GB

    SSD

    6 GB software

    8.5 min

    Core-i7 3.2GHz

    6GB

    SATA disk

    4.3GB software

    7 min

    Core-i7 3.2GHz

    6GB

    SATA disk

    471 MB software

    77sec

    Intel Core2 Duo

    2GB

    SATA disk

    3 GB software

    14 min

    -
    -
    -
    -
    -
    -

    Quickstart - Pour l’utilisateur impatient

    -
    -
    -

    Ma première installation

    -

    Sans plus tarder, cette section fournira une -démonstration rapide et facile d’une installation entièrement -automatique à l’aide du CD FAI et d’une machine virtuelle.

    -

    Il suffit de télécharger l' image ISO du CD à partir de http://fai-project.org/fai-cd - et de démarrer votre VM à l’aide de ce CD. Vous verrez un menu grub où -vous pouvez choisir parmi différents types d’installation.

    -

    Cette installation s’exécutera sans serveur -d’installation. L’installation du CD est identique à celle exécutée dans - un environnement réseau à l’aide du serveur d’installation FAI.

    -
    -
    -

    Mon premier serveur d’installation

    -

    S’il vous plaît noter, si vous avez -l’intention d’utiliser QEMU/KVM, vous devez avoir qemu-kvm qemu-utils -bridge-utils installés sur la machine à utiliser fai-mk-network et -fai-kvm [3].

    -

    Vous pouvez le faire via

    -
    -
    -
    # apt-get install qemu-kvm qemu-utils bridge-utils
    -
    -

    Si vous avez l’intention d’utiliser VMware ou -VirtualBox, assurez-vous que votre client utilise une connexion réseau -pontée. En outre, il n’est pas possible d’utiliser des interfaces réseau - pontées via le réseau sans fil, car la plupart des cartes réseau WiFi -ne prennent pas en charge cette fonctionnalité.

    -

    our configurer votre propre serveur FAI, nous -vous recommandons de créer un réseau de test sur votre ordinateur et -d’utiliser KVM. Pour créer ce réseau privé, il ya le script -fai-mk-network (dans le paquet fai-server). Il configure un pont -logiciel avec plusieurs dispositifs de dérivation qui appartiennent à -l’utilisateur<username>.

    -
    -
    -
    fai-mk-network <username>
    -
    -

    Après cela, vous pouvez utiliser fai-kvm (-h -vous aidera) pour démarrer des machines virtuelles en utilisant KVM qui -sont connectés à ce réseau privé. Fais attention. Par défaut, fai-kvm -créera les images de disque pour les machines /tmp, qui est - un disque RAM sur la plupart des systèmes. Il n’y a aucun problème à -créer une image de disque vide de 20G dans /tmp (même si cette partition - est de 4 Go de taille), mais alors que la VM écrit des données sur son -disque, cela commencera à consommer de l’espace dans /tmp.

    -

    Démarrez le premier hôte virtuel, qui deviendra le serveur FAI [4]:

    -
    -
    -
    fai-kvm -Vn -s20 -u 1 cd fai-cd.iso
    -
    -

    Dans le menu grub faiserver,faiserver, fixed IP. - Cela va installer un hôte appelé faiserver avec IP 192.168.33.250 qui -contient tous les logiciels nécessaires pour un serveur FAI. Il -configurera également un cache de paquets local (en utilisant -apt-cacher-ng). Une fois l’installation terminée, redémarrez la machine. - Lors du premier démarrage du nouveau système, il configurera -automatiquement le nfsroot. Cela peut prendre quelques minutes.

    -

    Après cela, vous pouvez démarrer des hôtes -supplémentaires en utilisant le démarrage réseau. Pour chaque nouvel -hôte, vous devez utiliser une valeur différente pour -u, qui sera utilisée pour générer des adresses MAC différentes et utiliser des noms de fichier d’image de disque différents.

    -
    -
    -
    fai-kvm -Vn -u 2 pxe
    -
    -

    Ces clients d’installation vous montreront un -menu, où vous pouvez sélectionner le type d’installation que vous -souhaitez effectuer. Si le client d’installation ne trouve pas le -serveur, c’est généralement parce que fai-monitor ne fonctionne plus. -Cela peut se produire si vous redémarrez le faiserver après -l’installation. Pour remédier à cela, exécutez simplement fai-monitor -sur le faiserver et relancez le démarrage du client.

    -

    Un autre client pourrait être lancé avec:

    -
    -
    -
    fai-kvm -Vn -u 3 pxe
    -
    -

    Vous pouvez démarrer autant de machines dans -le réseau que les périphériques de prise sont disponibles. Toutes ces -machines peuvent se connecter à l’Internet extérieur, mais sont -seulement accessibles à partir de votre machine hôte.

    -
    -
    -
    -
    -

    Vue d’ensemble et concepts

    -
    -

    FAI est un système non interactif permettant -d’installer, de personnaliser et de gérer les configurations de systèmes - et de logiciels Linux sur les ordinateurs ainsi que sur les machines -virtuelles et les environnements chroot, des petits réseaux aux grandes -infrastructures et clusters. Vous pouvez prendre un ou plusieurs PC -vierges, mettre sous tension et après quelques minutes, Linux est -installé, configuré et exécuté sur l’ensemble du cluster, sans aucune -interaction nécessaire. Ainsi, il s’agit d’une méthode évolutive pour -installer et mettre à jour un cluster sans surveillance avec peu -d’efforts impliqués. FAI utilise le système d’exploitation Linux et une -collection de scripts shell et Perl pour le processus d’installation. -Les modifications apportées aux fichiers de configuration du système -d’exploitation peuvent être effectuées par CFEngine, shell (bash et -zsh), Perl, Python, Ruby et attendent des scripts.

    -

    Le groupe cible de FAI sont des -administrateurs système qui doivent installer Linux sur une ou même des -centaines d’ordinateurs. Parce qu’il s’agit d’un outil d’installation à -usage général, il peut être utilisé pour l’installation d’un cluster -Beowulf, d’une batterie de rendu ou d’un laboratoire Linux ou d’une -salle de classe. De plus, des réseaux Linux de grande envergure avec -différents matériels ou différentes exigences d’installation sont -faciles à établir à l’aide de FAI. Mais n’oubliez pas de planifier votre - installation. Le chapitre [plan] contient quelques conseils utiles pour ce sujet.

    -
    -

    Conditions Générales

    -

    Premièrement, certains termes utilisés dans ce manuel sont décrits.

    -
    -
    -Installer le serveur -
    -
    -

    -Il fournit les services DHCP, TFTP et NFS ainsi que les données de -configuration pour tous les clients d’installation. Dans les exemples de - ce manuel, cet hôte s’appelle faiserver. L’hôte où le package fai-server est installé. -

    -
    -
    -Installer le client -
    -
    -

    -Un hôte qui sera installé à l’aide de FAI et une configuration fournie -par le serveur d’installation. Aussi appelé client pour courte. Dans ce -manuel, les hôtes d’exemple sont appelés demohost, xfcehost, gnomehost … - Cet ordinateur doit démarrer à partir de son interface réseau à l’aide -de PXE. -

    -
    -
    -Espace de configuration -
    -
    -

    -Une structure de sous-répertoire contenant plusieurs fichiers. Ces -fichiers décrivent les détails de la manière dont l’installation des -clients sera effectuée. Toutes les données de configuration sont -stockées ici. Il est également appelé config space pour le court. Il -comprend des informations sur: -

    -
      -
    • -

      -Disposition du disque dur dans un format similaire à fstab -

      -
    • -
    • -

      -Systèmes de fichiers locaux, leurs types, points de montage et options de montage -

      -
    • -
    • -

      -Logiciels -

      -
    • -
    • -

      -Disposition du clavier, fuseau horaire, configuration Xorg, systèmes de fichiers distants, -comptes utilisateurs, imprimantes … -

      -
    • -
    -

    Le package fai-doc inclut un exemple -d’espace de configuration incluant des exemples pour les hôtes utilisant - l’environnement XFCE et GNOME parmi d’autres exemples.

    -
    -
    -nfsroot, NFS-Root -
    -
    -

    -Un système de fichiers situé sur le serveur d’installation. Pendant le -processus d’installation, c’est le système de fichiers complet pour les -clients d’installation. Tous les clients partagent le même nfsroot, -qu’ils montent en lecture seule. Le nfsroot a besoin d’environ 690 Mo -d’espace disque libre. -

    -
    -
    -TFTP -
    -
    -

    -Sert aux clients l’initrd et le noyau utilisés pour le processus -d’installation. Avec le système de fichiers servi par NFS, ces deux -composent un OS temporaire dans lequel les installations sont exécutées. -

    -
    -
    -Classes FAI -
    -
    -

    -Les classes sont des noms qui déterminent quel fichier de configuration -est sélectionné. Si un client appartient à la classe WEBSERVER, il sera -configuré en tant que serveur Web, la classe DESKTOP pour, par exemple, -détermine les progiciels qui seront installés. -

    -
    -
    -profil -
    -
    -

    -Un profil FAI est juste une liste de classes FAI assiged à un nom de -profil, qui est étendu par une description de ce profil. C’est-à-dire -que l’on peut avoir deux profils "Webserver", l’un incluant la classe -APACHE, y compris la classe NGINX, pour ensuite installer la solution -webserver respective. -

    -
    -
    -les tâches -
    -
    -

    -L’installation d’un client se compose de plusieurs parties, appelées -tâches. Les tâches sont des sous-programmes prédéfinis qui effectuent -une certaine partie de la FAI. Les tâches FAI suivantes sont exécutées -au cours d’une installation sur les clients d’installation. -

    -
    -
    -
    -
    -

    confdir # get the config space -setup # some initialization, start sshd on demand -defclass # define FAI classes -defvar # define variables -action # evaluate FAI_ACTION -install # Start the installation -partition # partition the harddisks, create file systems -mountdisks # mount the file systems -extrbase # extract the base.tar.xz -debconf # do the Debian debconf preseeding -repository # prepare access to the package repository -updatebase # Set up package tools and update packages -instsoft # install software packages -configure # call customization scripts -finish # do some cleanup, show installation statistics -tests # call tests if defined -chboot # call fai-chboot on the install server -savelog # save log files to local and remote location -faiend # reboot host, eject CD if needed

    -
    -
    -
    -
    -
    -

    Il s’agit de tâches qui ne sont exécutées que lorsqu’une action différente est exécutée

    -

    dirinstall # install a chroot environment -softupdate # only do the system configuration -sysinfo # print detailed system information -inventory # print short hardware inventory list

    -
    -
    -
    -

    Pour une description plus détaillée des tâches , voir [tasks].

    -

    Notez que vous n'êtes pas limité aux tâches -FAI. Vous pouvez également définir des programmes ou des scripts -supplémentaires qui seront exécutés à certaines occasions. On les -appelle des hooks.

    -
    -
    -hooks -
    -
    -

    -Les Hooks sont des plugins, ils peuvent ajouter des fonctionnalités -supplémentaires au processus d’installation ou même remplacer des tâches - entières de FAI. Les Hooks sont expliqués en détail dans [hooks]. -

    -
    -
    -
    -
    -

    Le concept de classe

    -

    Les classes sont utilisées dans presque toutes - les tâches de l’installation. Les classes déterminent quels fichiers de - configuration choisir parmi une liste d’alternatives disponibles. Pour -déterminer les fichiers de configuration à utiliser, FAI recherche la -liste des classes définies et utilise tous les fichiers de configuration - correspondant à un nom de classe [5]. La boucle suivante implémente cette fonction en pseudo code shell:

    -
    -
    -
    for class in $all_classes; do
    -   if [ -r $config_dir/$class ]; then      # if a file with name $class exists
    -      your_command $config_dir/$class      # call a command with this file name
    -      # exit if only the first matching file is needed
    -   fi
    -done
    -
    -

    La caractéristique très intéressante de ceci -est que vous pouvez ajouter une nouvelle alternative de configuration et - elle sera automatiquement utilisée par FAI sans changer le code, si le -fichier de configuration utilise un nom de classe.

    -

    C’est parce que la boucle détecte -automatiquement les nouveaux fichiers de configuration qui doivent être -utilisés. L’idée d’utiliser des classes en général et d’utiliser -certains fichiers correspondant à un nom de classe pour une -configuration est adoptée à partir des scripts d’installation par Casper - Dik pour Solaris. Cette technique s’est avérée très utile et facile.

    -

    Vous pouvez regrouper plusieurs hôtes -partageant les mêmes fichiers de configuration en utilisant la même -classe. Vous pouvez également diviser l’ensemble des données de -configuration pour tous les clients en plusieurs classes et les utiliser - comme des briques de lego et construire la configuration entière pour -un seul client en assemblant les briques ensemble.

    -

    Si un client appartient à la classe A, nous disons que la classe A est définie pour ce client. Une classe n’a pas de valeur, elle est juste définie ou non définie.

    -

    Les classes déterminent comment l’installation - est effectuée. Par exemple, un client d’installation peut être -configuré pour obtenir le bureau XFCE en y ajoutant simplement la classe - XFCE . Naturellement, des configurations plus granulaires sont - également possibles. Par exemple, les classes peuvent décrire comment -le disque dur doit être partitionné, ils peuvent définir quels paquets -logiciels seront installés ou quelles étapes de personnalisation seront -exécutées.

    -

    Souvent, une configuration client est créée en - modifiant ou en ajoutant uniquement les classes auxquelles ce client -appartient, ce qui rend l’installation d’un nouveau client très facile. -Ainsi, aucune information supplémentaire ne doit être ajoutée à l’espace - de configuration si les classes existantes suffisent à vos besoins.

    -

    Comme vous pouvez le voir, les classes sont un - pilier central de la personnalisation de votre espace de configuration -et de l’installation de votre client. Pour définir vos propres classes, -reportez-vous à [defining classes].

    -
    -
    -
    -
    -

    Configurer votre faiserver

    -
    -

    Voici comment configurer le serveur d’installation en quelques minutes. Les étapes suivantes sont nécessaires:

    -
      -
    1. -

      -Configurer le serveur d’installation -

      -
        -
      1. -

        -Installer des packages FAI -

        -
      2. -
      3. -

        -Créez le nfsroot -

        -
      4. -
      5. -

        -Copiez les exemples dans l’espace de configuration -

        -
      6. -
      7. -

        -Configurer les démons réseau -

        -
      8. -
      9. -

        -Créer les configurations PXELINUX -

        -
      10. -
      -
    2. -
    3. -

      -Démarrage et installation des clients -

      -
    4. -
    -
    -

    Installer les paquetages FAI

    -
      -
    • -

      -Installez la clé du référentiel de package de projet FAI: -

      -
    • -
    • -

      -Ajoutez l’URL du référentiel de packages du projet FAI. -

      -
    • -
    • -

      -Installez le paquet fai-quickstart sur votre serveur d' installation . -

      -
    • -
    -
    -
    -
    # wget -O - http://fai-project.org/download/074BCDE4.asc | apt-key add -
    -# echo "deb http://fai-project.org/download jessie koeln" > /etc/apt/sources.list.d/fai.list
    -# apt-get update
    -# aptitude install fai-quickstart
    -
    -

    Cela installera également les paquets pour les démons de serveur DHCP, TFTP et NFS.

    -
    -
    -

    Créez le nfsroot

    -
      -
    • -

      -Activez également le référentiel de package du projet FAI dans un autre fichier sources.list qui est utilisé lors de la construction du nfsroot. Ensuite, activez l’utilisateur de journal pour FAI. -

      -
    • -
    -
    -
    -
    # sed -i -e 's/^#deb/deb/' /etc/fai/apt/sources.list
    -# sed -i -e 's/#LOGUSER/LOGUSER/' /etc/fai/fai.conf
    -
    -
      -
    • -

      -Par défaut, FAI utilise http://httpredir.debian.org comme mirror de paquets, qui devrait tenter de trouver un référentiel de paquets rapide pour vous. [6] -Maintenant, nous pouvons exécuter fai-setup(8) [7] Et vérifier si tout s’est bien passé. Le fichier journal est écrit dans /var/log/fai/fai-setup.log. -

      -
    • -
    -
    -
    -
    # fai-setup -v
    -
    -
      -
    • -

      -Ce sont quelques-unes des lignes que vous verrez à la fin de fai-setup . - Un exemple complet de fai-setup.log est disponible sur la page Web FAI à - l’adresse http://fai-project.org/logs/fai-setup.log. -

      -
    • -
    -
    -
    -
    FAI packages and related packages inside the nfsroot:
    -dracut             044+189-2
    -dracut-network     044+189-2
    -fai-client         5.3.3~bpo8+2
    -fai-nfsroot        5.3.3~bpo8+2
    -fai-setup-storage  5.3.3~bpo8+2
    -Waiting for background jobs to finish
    -fai-make-nfsroot finished properly.
    -Log file written to /var/log/fai/fai-make-nfsroot.log
    -Adding line to /etc/exports: /srv/fai/config 192.168.33.250/25(async,ro,no_subtree_check)
    -Adding line to /etc/exports: /srv/fai/nfsroot 192.168.33.250/25(async,ro,no_subtree_check,no_root_squash)
    -Reloading nfs-kernel-server configuration (via systemctl): nfs-kernel-server.service.
    -
    -   You have no FAI configuration space yet. Copy the simple examples with:
    -   cp -a /usr/share/doc/fai-doc/examples/simple/* /srv/fai/config
    -   Then change the configuration files to meet your local needs.
    -Please don't forget to fill out the FAI questionnaire after you've finished your project with FAI.
    -
    -FAI setup finished.
    -Log file written to /var/log/fai/fai-setup.log
    -
    -
      -
    • -

      -Fai-setup a créé le LOGUSER, le nfsroot et a ajouté des lignes supplémentaires à /etc/exports. Les sous-répertoires ajoutés à /etc/exports sont exportés via NFS v3, de sorte que tous les clients d’installation dans le même sous-réseau peuvent les monter via NFS. -

      -
    • -
    -
    -
    -

    Création de l’espace de configuration

    -

    Installez les exemples simples dans l’espace de configuration [8].

    -
    -
    -
    $ cp -a /usr/share/doc/fai-doc/examples/simple/* /srv/fai/config/
    -
    -

    Ces exemples contiennent la configuration pour - certains hôtes d’exemple. Selon le nom d’hôte utilisé, votre ordinateur - sera configuré comme suit:

    -
    -
    -demohost -
    -
    -

    -Une machine qui n’a besoin que d’un petit disque dur. Cette machine est -configurée avec le réseau en tant que client DHCP, et une démo de compte - est créée. -

    -
    -
    -xfcehost -
    -
    -

    -Un bureau XFCE est installé, utilisant LVM, et la démo du compte est créée. -

    -
    -
    -gnomehost -
    -
    -

    -Un bureau GNOME est installé et la démo du compte est créée. -

    -
    -
    -other host names -
    -
    -

    -Les hôtes disposant d’un autre nom d’hôte utiliseront notamment les classes FAIBASE, DHCPC et GRUB. -

    -
    -
    -

    Tous les hôtes auront un compte appelé demo avec mot de passe fai. Le compte root a également le mot de passe fai.

    -

    Si l’indicateur FAI menu est -ajouté, au lieu d’utiliser le nom d’hôte pour déterminer le type -d’installation, un menu est présenté et l’utilisateur peut choisir un -profil pour l’installation.

    -
    -
    -

    Configurer les démons réseau

    -

    Pour démarrer le client d’installation via -PXE, le serveur d’installation a besoin d’un DHCP et d’un démon TFTP en -cours d’exécution. Le paquet fai-quickstart a déjà installé les - progiciels pour ces daemons. En outre, le paquetage du serveur NFS pour - l’exportation du nfsroot et de l’espace de configuration a été -installé.

    -
    -

    Configuration du démon DHCP

    -

    déalement, votre faiserver doit également être - votre serveur DHCP. Si ce n’est pas le cas, demandez à l’administrateur - responsable du serveur DHCP de le configurer conformément à cette -section. En option, il est possible d'éviter cela en utilisant la -fonctionnalité [autodiscover] diffusée dans FAI 5.0.

    -

    n exemple pour dhcpd.conf(5) est fourni avec le paquet fai-doc. Commencez à utiliser cet exemple et regardez toutes les options qui y sont utilisées.

    -
    -
    -
    # cp /usr/share/doc/fai-doc/examples/etc/dhcpd.conf /etc/dhcp/
    -
    -

    Les seules informations spécifiques FAI contenues dans ce fichier de configuration sont de définir le filename de fai/pxelinux.0 et de définir next-server et server-name - sur le nom de votre serveur d’install . Toutes les autres informations -sont uniquement des données liées au réseau, qui est utilisé dans -presque toutes les configurations DHCP. Ajustez ces paramètres de réseau - à vos besoins locaux.

    -
    -
    -
    deny unknown-clients;
    -option dhcp-max-message-size 2048;
    -use-host-decl-names on;
    -
    -subnet 192.168.33.0 netmask 255.255.255.0 {
    -   option routers 192.168.33.250;
    -   option domain-name "my.example";
    -   option domain-name-servers 192.168.33.250;
    -   option time-servers faiserver;
    -   option ntp-servers faiserver;
    -   server-name faiserver;
    -   next-server faiserver;
    -   filename "fai/pxelinux.0";
    -}
    -
    -

    Si vous apportez des modifications à la configuration DHCP, vous devez redémarrer le démon.

    -
    -
    -
    # /etc/init.d/isc-dhcp-server restart
    -
    -

    Si vous disposez de plusieurs interfaces réseau, vous pouvez définir l’interface que le serveur écoutera dans /etc/default/isc-dhcp-server. Par défaut, le démon DHCP écrit ses messages de journalisation dans /var/log/daemon.log.

    -
    -
    -

    Ajout d’une entrée d’hôte au DHCP

    -

    L’adresse MAC est donnée par le matériel de la - carte réseau. Pour chaque client d’installation, vous collectez son -adresse MAC et la mappez à une adresse IP et à un nom d’hôte. Tout -d’abord, nous ajoutons l’adresse IP et le nom d’hôte à /etc/hosts [9].

    -
    -
    -
    192.168.33.100    demohost
    -
    -

    Le mappage de l’adresse MAC à l’adresse IP est effectué dans le fichier dhcpd.conf. Ici, nous ajoutons une entrée d’hôte en utilisant la commande dhcp-edit(8) . Ici, vous devez remplacer 01:02:03:AB:CD:EF avec le MAC que vous avez trouvé.

    -
    -
    -
    # dhcp-edit demohost 01:02:03:AB:CD:EF
    -
    -

    Après avoir appelé cette commande, c’est ce que l’entrée hôte dans dhcpd.conf ressemblera à:

    -
    -
    -
    host demohost {hardware ethernet 01:02:03:AB:CD:EF;fixed-address demohost;}
    -
    -
    -
    -

    TFTP

    -

    Normalement, vous n’avez pas besoin d’apporter - de modifications à la configuration dameon TFTP. Les fichiers fournis -par TFTP sont situés dans /srv/tftp/fai.

    -
    -
    -

    NFS

    -

    La commande fai-setup a déjà configuré le démon NFS et ajouté quelques lignes au fichier de configuration /etc/exports. Il exporte les répertoires en utilisant NFS v3.

    -
    -
    -
    -

    Création de la configuration PXELINUX

    -

    La dernière étape avant de démarrer votre -client pour la première fois est de spécifier quelle configuration le -client doit démarrer lors de l’amorçage PXE. Nous fai-chboot(8) la -commande fai-chboot(8) pour créer une configuration -pxelinux pour chaque client d’installation. Cela comprend des -informations sur le noyau, l’initrd, l’espace de configuration et -certains paramètres d’amorçage. Vous devriez lire la page de manuel, qui - vous donne quelques bons exemples. Voici la commande pour démarrer -l’installation de l’hôte demohost.

    -
    -
    -
    $ fai-chboot -IFv -u nfs://faiserver/srv/fai/config demohost
    -Booting kernel vmlinuz-3.16.0-4-amd64
    - append initrd=initrd.img-3.16.0-4-amd64 ip=dhcp
    -   FAI_FLAGS=verbose,sshd,createvt
    -   FAI_CONFIG_SRC=nfs://faiserver/srv/fai/config
    -
    -demohost has 192.168.33.100 in hex C0A82164
    -Writing file /srv/tftp/fai/pxelinux.cfg/C0A82164 for demohost
    -
    -

    À ce stade, vous devriez avoir une -configuration faiserver de travail et vos clients devraient démarrer -dans FAI et être en mesure d’installer l’un des exemples.

    -

    Dans la section suivante, vous pouvez lire la -planification de votre installation, adapter votre espace de -configuration à vos besoins particuliers et étendre FAI à l’aide de -hooks.

    -
    -
    -

    Serveur personnalisé

    -

    Le faiseur et sa configuration n’est nullement - statique. Il est possible de personnaliser et d'étendre votre serveur. -Pour cela, reportez-vous à la section [Customizing your install server setup] dans [advanced].

    -
    -
    -
    -
    -

    Planifiez votre installation

    -
    -

    Avant de commencer votre installation, vous -devriez investir beaucoup de temps dans la planification de votre -installation. Une fois que vous êtes satisfait de votre concept -d’installation, FAI peut faire toutes les tâches ennuyeuses et -répétitives pour transformer vos plans en réalité. FAI ne peut pas faire - de bonnes installations si votre concept est imparfait ou manque de -quelques détails importants. Commencez à planifier l’installation en -répondant aux questions suivantes:

    -
      -
    • -

      -Est-ce que je vais créer un cluster Beowulf ou dois-je installer des machines de bureau? -

      -
    • -
    • -

      -À quoi ressemble ma topologie LAN? -

      -
    • -
    • -

      -Ai-je un matériel uniforme? Le matériel sera-t-il uniforme à l’avenir? -

      -
    • -
    • -

      -Le matériel a-t-il besoin d’un noyau spécial? -

      -
    • -
    • -

      -Comment nommer les hôtes? -

      -
    • -
    • -

      -Comment les disques durs locaux doivent-ils être partitionnés? -

      -
    • -
    • -

      -Quelles applications seront éxécuté par les utilisateurs? -

      -
    • -
    • -

      -Les utilisateurs ont-ils besoin d’un système de mise en file d’attente? -

      -
    • -
    • -

      -Quel logiciel doit être installé? -

      -
    • -
    • -

      -Quels démons devraient être lancés, et à quoi devrait ressembler la configuration? -

      -
    • -
    • -

      -Quels systèmes de fichiers distants doivent être montés? -

      -
    • -
    • -

      -Comment effectuer les sauvegardes? How should backups be performed? -

      -
    • -
    -

    Vous devez également penser à des comptes -d’utilisateur, des imprimantes, un système de courrier, des travaux de -cron, des cartes graphiques, l’initialisation double, le NIS, le NTP, le - fuseau horaire, la disposition de clavier, l’exportation et le montage -des annuaires via NFS et beaucoup d’autres choses. Donc, il ya beaucoup à - faire avant de commencer une installation. Et rappelez-vous que la -connaissance est le pouvoir, et c’est à vous de l’utiliser. -L’installation et l’administration sont un processus et non un produit. -FAI ne peut pas faire les choses que vous ne lui dites pas de faire.

    -

    Mais vous ne devez pas commencer à partir de -zéro. Examinez les fichiers et les scripts dans l’espace de -configuration. Il ya beaucoup de choses que vous pouvez utiliser pour -votre propre installation. Un bon article intitulé «Bootstrapping an -Infrastructure» avec d’autres aspects de la construction d’une -infrastructure est disponible sur http://www.infrastructures.org/papers/bootstrap/bootstrap.html

    -
    -

    L’espace de configuration et ses sous-répertoires

    -

    L’espace de configuration est la collection -d’informations sur la façon exacte d’installer un client. L’espace de -configuration central pour tous les clients d’installation se trouve sur - le serveur d’installation dans /srv/fai/config et ses sous-répertoires. Cela sera monté par les clients d’installation dans /var/lib/fai/config. La commande d’installation principale fai(8) utilise tous ces sous-répertoires dans l’ordre indiqué sauf pour les hooks.

    -
    -
    -class/ -
    -
    -

    - Scripts et fichiers pour définir des classes et des variables. -

    -
    -
    -disk_config/ -
    -
    -

    - Fichiers de configuration pour le partitionnement de disque, RAID logiciel, LVM et création de système de fichiers. -

    -
    -
    -basefiles/ -
    -
    -

    -Normalement , le fichier base.tar.xz (situé à l' intérieur du -nfsroot) est extrait sur le client d’installation après la création des -nouveaux systèmes de fichiers et avant l’installation du package. Il -s’agit d’une image de base minimale, créée juste après avoir appelé -debootstrap lors de la création du nfsroot sur le serveur -d’installation. Si vous voulez installer une autre distribution que la -nfsroot, vous pouvez mettre un fichier tar dans le sous-répertoire basefiles/ - et le nommer après une classe. Ensuite, la commande ‘ftar(8)` est -utilisée pour extraire le fichier tar en fonction des classes définies. -Ainsi, le fichier doit être nommé’ CLASS.tar.xz et non CLASS.base.tar.xz . Cela se fait dans la tâche extrbase. - Utilisez cette option si vous souhaitez installer une autre -distribution ou une version différente de celle exécutée pendant -l’installation. -

    -

    Ce fichier de base peut également être reçu en - fonction des classes FAI via HTTP ou FTP en définissant la variable -FAI_BASEFILEURL. FAI téléchargera un fichier CLASSNAME.tar.xz (ou tgz, -ou tar.gz, …) à partir de cette URL, si CLASSNAME correspond à une -classe FAI.

    -

    Exemple:

    -
    -
    -
    -
    -
    FAI_BASEFILEURL=http://fai-project.org/download/basefiles
    -
    -

    Le dossier doit prendre en charge la liste des répertoires. FAI ne recherchera pas de fichiers potentiellement correspondants.

    -

    Voir le chapitre [otherdists] pour savoir comment installer différentes distributions.

    -
    -
    -debconf/ -
    -
    -

    -Ce répertoire contient toutes les données debconf(7). Le format est le même que celui utilisé par debconf-set-selections(8). -

    -
    -
    -package_config/ -
    -
    -

    -Les fichiers contenant des noms de classe contiennent des listes de -progiciels à installer ou à désinstallé par ‘install_packages(8). Les fichiers nommés <CLASS>.asc sont ajoutés à la liste des clés utilisées par apt (à l’aide d’ `apt-key(8) ) pour les dépôts de paquets approuvés. -

    -
    -
    -scripts/ -
    -
    -

    -Scripts pour la personnalisation de votre site local. Utilisé par fai-do-scripts(1). -

    -
    -
    -files/ -
    -
    -

    -Les Fichiers utilisés par les scripts de personnalisation. La plupart -des fichiers se trouvent dans une structure de sous-arborescence qui -reflète l’arborescence de répertoires ordinaire. Par exemple, les -modèles de nsswitch.conf se trouvent dans $FAI/files/etc/nsswitch.conf et sont nommés en fonction des classes auxquelles ils doivent correspondre: $FAI/files/etc/nsswitch.conf/NIS est la version de /etc/nsswitch.conf - à utiliser pour la classe NIS. Notez que le contenu du répertoire n’est - pas automatiquement copié sur la machine cible, mais qu’il doit être -explicitement copié par des scripts de personnalisation à l’aide de la -commande fcopy(8) -. -

    -
    -
    -hooks/ -
    -
    -

    - Les hooks sont des programmes ou des scripts définis par -l’utilisateur, qui sont appelés pendant le processus d’installation. -cela peut étendre ou remplacer les tâches par défaut. Le nom du fichier -doit être de format taskname.CLASSNAME[.sh]. Un hook appelé updatebase.DEBIAN est exécuté avant la mise à jour de la tâche updatebase et seulement si l’installation du client appartient à la classe DEBIAN. -

    -
    -
    -
    -
    -

    Définition des classes

    -

    Il existe différentes possibilités pour définir des classes: -. Certaines classes par défaut sont définies pour chaque hôte: DEFAULT, LAST et son nom d’hôte. -. Les classes peuvent être répertoriées dans un fichier. -. Les classes peuvent être dynamiquement définies par des scripts.

    -

    La dernière option est une fonctionnalité très - intéressante, puisque ces scripts définiront des classes est un moyen -très flexible. Par exemple, plusieurs classes peuvent être définies -uniquement si certains matériels sont identifiés ou si une classe est -définie en fonction des informations de sous-réseau du réseau.

    -

    Tous les noms de classes, sauf le nom d’hôte, -sont écrits en majuscules.ILs ne doivent pas contenir un trait d’union, -un dièse, un Point-Virgule OÜ un point, mais PEUVENT contenir des -characters de soulignement et des Chiffres.

    -

    La Tache defclass Appelle la commande fai-class(1) pour definir les classes. Tous les scripts correspondant ^[0-9][0-9]* (qui Commencent Avec Deux Chiffres) Dans le sous-repertoire $FAI/class - sont exécutées afin de definir les classes. Tout ce qui is affiché sur -STDOUT est automatiquement definie Comme une classe. pour Plus -d’informations sur Les définisions de Classe , lire les pages de manuel -versent fai-class(1). Le script 50-host-classes (voir ci - dessous la version allégée) est utilisé pour les définir des classes en fonction du nom d’hôte.

    -
    -
    -
    # use a list of classes for our demo machines
    -case $HOSTNAME in
    -    demohost)
    -        echo "FAIBASE GRUB DHCPC DEMO" ;;
    -    xfcehost)
    -        echo "FAIBASE GRUB DHCPC DEMO XORG XFCE";;
    -    faiserver)
    -        echo "FAIBASE DEBIAN DHCPC DEMO FAISERVER" ;;
    -    *)
    -        echo "FAIBASE GRUB DHCPC" ;;
    -esac
    -
    -

    Les noms d’hôtes doivent Rarement Être utilisé - Pour Les Fichiers de configuration dans l’Espace de configuration.à la -place une classe Doit Être definie et ensuite ajouté Pour un hôte Donné. - En effet, la Plupart du Temps les Données de configuration ne sont pas -Spécifiques au d’nom hôte, mais peut etre partager entre differants -hôtes./p>

    -

    L’ordre des classes est important car Elle Définit la priorité des classes de Faible à Élevé.

    -
    -
    -

    Définition des Variables

    -

    La Tache defvar definit les variables pour l’installation du client. Les variables sont définies par les scripts Dans la class/*.var. Toutes les variables Globales PEUVENT Être définies Dans DEFAULT.var. Pour certains groupes d’hôtes utiliser un Fichier de classe ou Pour un seul hôte utiliser le Fichier $HOSTNAME .var . Ici aussi, il est utile d'étudier Tous les exemples.

    -

    Les variables suivantes sont utilisées dans les exemples et peuvent etre aussi utiles pour votre installation:

    -
    -
    -FAI_ACTION -
    -
    -

    -Réglez les actions que doit éffectuer FAI. Normalement, ceci se fait par fai-chboot(8). Si vous ne pouvez pas utiliser cette commande, définir la variable dans le script LAST.var. -

    -
    -
    -FAI_ALLOW_UNSIGNED -
    -
    -

    -Si défini à 1, FAI Permet l’installation de de paquets à partir de référentiels non Signés. -

    -
    -
    -CONSOLEFONT -
    -
    -

    -La police de qui est chargée lors de l’installation par setfont(8). -

    -
    -
    -KEYMAP -
    -
    -

    -Définit les Fichiers de mappage du clavier Dans /usr/share/keymaps et $FAI/files. Vous ne Devez pas spécifier le chemin complet, puisque ce fichier sera localisé automatiquement. -

    -
    -
    -ROOTPW -
    -
    -

    -Le mot de passe root chiffré pour le nouveau système. Vous pouvez utiliser ‘crypt(3), md5 et d’ Autres types de hachage pour le mot de passe. Utilisez `mkpasswd(1) pour créer le hachage d’un certain mot de passe. Par exemple, pour Générer le hachage MD5 pour l’utilisation du mot de passe. -

    -
    -
    -
    -
    -
    $ echo "yoursecrectpassword" | mkpasswd -Hmd5 -s
    -
    -
    -
    -UTC -
    -
    -

    -Réglez l’horloge du matériel à UTC si UTC=yes. Sinon, régler l’horloge à l’heure locale. Voir clock(8) pour en plus d’informations. -

    -
    -
    -TIMEZONE -
    -
    -

    -Est-ce que le fichier d’initialisation par rapport à /usr/share/zoneinfo/' indique votre fuseau horaire. Par exemple: TIMEZONE=Europe/Berlin. -

    -
    -
    -MODULESLIST -
    -
    -

    -Une liste des modules du Noyau qui sont chargés pendent Le démarrage du nouveau systême (Écrit dans /etc/modules). -

    -
    -
    -
    -
    -

    Configuration du disque dur

    -

    L’outil setup-storage(8) lit le fichier dans $FAI/disk_config - pour la configuration du disque. Ce fichier décrit comment tous les -disques Locaux devrons etre partitionné, Quels types de Systèmes de -Fichiers doivent etre écris (Comme ext3/4, xfs, btrfs), et où ils seront - Montés. Vous pouvez aussi créer des configurations RAID logiciel et LVM - en Utilisant le Fichier de configuration. Il Est aussi possible de la -mise en Conservation de le partitionnage du disque ou de conserver Les -Donnees sur CERTAINES partitions.

    -

    Pendant le Processus d’installation de tous les Systèmes de Fichiers Locaux Sont Montés par rapport à /target. Par exemple, si vous Specifiez le Point de montage /home Dans un Fichier de configuration de disque, ce sera le répertoire /target/home pendant le Processus d’installation et deviendra /home pour le nouveau systéme Installé.

    -
    -
    -

    Extraction du fichier de base

    -
    -
    -

    Debconf préconfiguration

    -
    -
    -

    L’Accès au dépôt de paquetages

    -
    -
    -

    configuration du progiciel

    -

    Avant l’installation de de paquets, FAI va ajouter le contenu de Tous les Fichiers nommés package_config/class.asc - à la liste des clés apt. Si votre depo locale est signé par votre keyid - AB12CD34 vous pouvez Facilement ajouter cette clé, aussi FAI -l’utilisera pendant l’installation. Utilisez cette commande pour Créer -le fichier CLASS.asc:

    -
    -
    -
    faiserver$ gpg -a --export AB12CD34 > /srv/fai/config/package_config/MYCLASS.asc
    -
    -

    Le script install_packages(8) installe les Logiciels Sélectionnés. Il lira tous les fichiers de configuration Dans $FAI/package_config Dont le nom correspond aux classes definie. La syntaxe est tres simple.

    -
    -
    -
    # an example package class
    -
    -PACKAGES taskinst
    -german
    -
    -PACKAGES aptitude
    -adduser netstd ae
    -less passwd
    -
    -PACKAGES remove
    -gpm xdm
    -
    -PACKAGES aptitude GRUB
    -lilo- grub
    -
    -

    Commentaires Commencent par un Dièse et se terminent à la fin de la ligne. Chaqué commande de paquetage commence par Le mot PACKAGES - Suivi par un nom de commande, Ce qui correspond à l’outil de package -Comme apt-get, aptitude ou yum par exemple. la commande qui définit la -commandent qui sera utilisé pour installer les paquets nommés après -cette commande. La liste de toutes les commandes disponibles peuvent -Être listé en utilisant install_packages -H. Les paquets d’outils pris en charges son aptitude, apt-get, smart, yast, yum, rpm, zypper

    -
    -
    -hold -
    -
    -

    -Mettez un paquet en attente. Ce Paquet ne sera pas pris en charges par dpkg, pas exemple non mis à niveau. -

    -
    -
    -install -
    -
    -

    -Installez Tous les paquets (en utilisant apt-get) Qui sont -précise dans les lignes Suivantes. Si un tiret est ajouté au nom du -paquet (sans espace intermédiaire), le paquet sera supprimé, pas -installé. Tous les noms de paquets sont vérifiées pour les fautes -d’orthographe. Tout paquet qui n’existe pas, seront retiré de la liste -des paquets à l’installation. Soyer donc prudentes de ne pas mal -orthographier les noms de paquets. -

    -
    -
    -install-norec -
    -
    -

    -Comme install,mais sans installer les paquets recommandés. -

    -
    -
    -remove -
    -
    -

    -Supprimer tous les paquets qui sont péciser dans les lignes suivantes. -Annexer un + au nom du paquet si le paquet doit Être installé. -

    -
    -
    -taskinst -
    -
    -

    -Installez tous les paquets appartenant aux tâches qui sont spécifiées dans les lignes suivantes à l’aide de tasksel(1). Vous pouvez aussi utiliser aptitude pour installer les tâches. -

    -
    -
    -aptitude -
    -
    -

    -Installez Ttus les paquets avec la commande aptitude. Ce sera la Valeur par défaut à l’avenir et pourra remplacer apt-get et taskinst. Aptitudes peut aussi installer les paquets -

    -
    -
    -aptitude-r -
    -
    -

    -Idem aptitude avec l’option --with-recommends. -

    -
    -
    -unpack -
    -
    -

    -Télécharge les paquets et décompresse seulement. Ne configure pas le paquet. -

    -
    -
    -dselect-upgrade -
    -
    -

    -Defini la sélections des paquets en Utilisant les lignes suivantes et -installe ou supprime les paquets précisés. Ces lignes sont le résultat -de la commande dpkg --get-selections. Il est recommandé de ne -pas utiliser ce format, puisque vous devez aussi specifiez tous les -paquets qui ne sont pas installés en raison d’une dépendance ou -recommandation. Il vaut mieux juste spécifier le paquet que vous voulez -avoir, et de laisser FAI (et apt-get) résoudre les dépendances. -

    -
    -
    -

    Plusieurs lignes avec des listes de noms de -paquets séparés par des espaces suivent les directive PACKAGES. Toutes -les dépendances sont résolues. Les paquetages avec suffixe - (par exemple, lilo-) - seront supprimés au lieu d'être installés. L’ordre des paquet n’a pas -d’importance. Si vous souhaitez installer des paquets d’une autre -version que la valeur par défaut, vous pouvez ajouter le nom de la -version au nom du paquet comme dans openoffice.org/etch-backports. Vous pouvez également spécifier une certaine version comme apt=0.3.1. Plus d’informations sur ces fonctionnalités sont décrites dans aptitude(8).

    -

    Une ligne qui contient la commande PRELOADRM, télécharge un fichier à l’aide de wget(1) dans un répertoire avant d’installer les packages. À l’aide du file: URL, ce fichier est copié de $FAI_ROOT vers le répertoire de téléchargement. Par exemple, le package realplayer a besoin d’une archive pour installer le logiciel, donc cette archive est téléchargée dans le répertoire /root. - Après l’installation des paquets, ce fichier sera supprimé. Si le -fichier ne doit pas être supprimé, utilisez plutôt la commande PRELOAD.

    -

    Il est possible d’ajouter une liste de noms de classes après la commande pour apt-get. Ainsi, cette commande PACKAGE - ne sera exécutée que si la classe correspondante est définie. Ainsi, -vous pouvez combiner de nombreux petits fichiers dans le fichier -DEFAULT. ATTENTION! Utilisez cette fonctionnalité uniquement dans le -fichier DEFAULT pour garder tout simple. Voir ce fichier pour quelques -exemples.

    -

    Si vous souhaitez supprimer un nom de paquet -d’une certaine classe faisait partie avant de cette classe , vous ne -devez pas supprimer le nom du paquet classe, mais plutôt de lui ajouter -un tiret (-). Cela garantira que le paquet est enlevé pendant une mise a - jour sur des hôtes qui étaient Installé en utilisant l’ancienne -définition de classe qui comprenait ce nom de paquet.

    -

    Si vous spécifiez un paquet qui n’existe pas, -ce paquet sera supprimé automatiquement de la liste d’installation -uniquement si la commande install est utilisée.

    -
    -
    -

    Scripts de personnalisation

    -

    La commande fai-do-scripts(1) est - appelée pour exécuter tous les scripts dans ce répertoire. Si un -répertoire avec un nom de classe existe, tous les scripts correspondant à - ^[0-9][0-9]* sont exécutés par ordre alphabétique. Il est donc - possible d’utiliser des scripts de différentes langues (shell, -cfengine, Perl, Python, Ruby, expect,..) pour une classe.

    -

    Ces scripts écrivent leur sortie dans -différents fichiers journaux, selon le type de script. Par exemple, Tous - les scripts shell écrivent leur journal dans shell.log.

    -
    -

    Scripts shell

    -

    La plupart des scripts sont des scripts Bourne - shell. Les scripts shell sont utiles si la tâche de configuration ne -doit seulement appeler certaines commandes shell ou créer un fichier à -partir de zéro. Afin de ne pas écrire beaucoup de scripts courts, il est - possible d’utiliser la commande ifclass pour tester si certaines classes sont définies.

    -
    -
    -
    ifclass -o A B C
    -
    -

    Vérifie si l’une des classes A, B ou C est -définie. L’utilisation de -a (AND logique) vérifie si toutes les classes - d’une liste sont définies. La commande ifclass C vérifie si seule la -classe C est définie.

    -

    Pour copier des fichiers avec des classes, utilisez la commande fcopy(8). Si vous voulez extraire une archive à l’aide de classes, utilisez ftar(8). Pour ajouter des lignes à un fichier de configuration, utilisez ainsl(1) au lieu de simplement echo string >> filename.

    -

    FAI prend également en charge les scripts zsh(1) pendant la tâche de personnalisation. Dans les scripts, la variable $classes contient une liste séparée par des espaces avec les noms de toutes les classes définies.

    -
    -
    -

    Scripts cfengine

    -

    CFEngine dispose d’un riche ensemble de fonctions pour modifier les fichiers de configuration existants, par exemple LocateLineMatching, ReplaceAll, InsertLine, AppendIfNoSuchLine, HashCommentLinesContaining. - Mais il ne peut pas traiter les variables qui sont indéfinies. Si une -variable n’est pas définie, l’ensemble du script cfengine s’arrêtera.

    -

    Plus d’informations peuvent être trouvées dans la page de manuel cfengine(8) ou sur la page d’accueil cfengine http://www.cfengine.org.

    -
    -
    -
    -

    Hooks

    -

    Les Hooks vous permettent de spécifier des -fonctions ou des programmes qui sont exécutés à certaines étapes du -processus d’installation. Avant qu’une tâche soit appelée, FAI recherche - les hooks existants pour cette tâche et les exécute. Comme on peut s’y -attendre, les classes sont également utilisées lors de l’appel de hooks. - Les hooks sont exécutés pour chaque classe définie. Vous n’avez qu'à -créer le hook avec le nom de la classe désirée et il sera utilisé. Si -plusieurs hooks pour une tâche existent, ils sont appelés dans l’ordre -défini par les classes. Si debug est inclus dans $FAI_FLAG l’option -d - est passée à tous les hooks, donc vous pouvez déboguer vos propres -hooks. Si certaines tâches par défaut doivent être ignorées, utilisez la - sous-routine skiptask et une liste de tâches par défaut comme -paramètres. Dans les exemples fournis, les hooks de la classe CENTOS -ignorent certaines tâches spécifiques de Debian.

    -

    Le répertoire $FAI/hooks/' contient tous les hooks. Un hook est un fichier exécutable qui suit le nom de tâche taskname.CLASSNAME[.sh]' (par exemple, repository.CENTOS ou savelog.LAST.sh), - un nom de tâche et un nom de classe séparés par un point, -éventuellement suivi de '.sh. Le nom de la tâche spécifie la tâche -devant précéder l’exécution de ce hook, si la classe spécifiée est -définie pour le client d’installation. Voir la section [tasks] pour une liste complète des tâches par défaut pouvant être utilisées.

    -

    Un hook du formulaire hookprefix.classname - ne peut pas définir de variables pour le script d’installation, car il -s’agit d’un sous-processus. Mais vous pouvez utiliser n’importe quel -exécutable binaire ou n’importe quel script que vous avez écrit. Les -hooks qui ont le suffixe .sh (par exemple, -'partition.DEFAULT.sh) doivent être des scripts Bourne shell et sont -sourcé. Il est donc possible de redéfinir des variables pour les scripts - d’installation.

    -

    Dans la première partie de FAI, tous les hooks avec le préfixe confdir - sont appelés. Ces hooks ne peuvent pas être localisés dans l’espace de -configuration, car il n’est pas encore disponible. Par conséquent, ces -hooks sont les seuls hooks situés dans $nfsroot/$FAI/hooks sur le serveur d’installation. Tous les autres hooks se trouvent dans $FAI_CONFIGDIR/hooks sur le serveur d’installation.

    -

    Tous les hooks appelés avant la définition des classes ne peuvent utiliser que les classes suivantes: DEFAULT $HOSTNAME LAST. Si un hook pour la classe DEFAULT doit être appelé uniquement si aucun hook pour la classe $HOSTNAME n’est disponible, insérez ces lignes sur le hook par défaut:

    -
    -
    -
    hookexample.DEFAULT:
    -
    -#! /bin/sh
    -
    -# skip DEFAULT hook if a hook for $HOSTNAME exists
    -scriptname=$(basename $0 .DEFAULT)
    -[-f $FAI/hooks/$scriptname.$HOSTNAME ] && exit
    -# here follows the actions for class DEFAULT
    -.
    -.
    -
    -

    Quelques exemples de ce que les hooks pourraient être utilisés:

    -
      -
    • -

      -Charger les modules du noyau avant que les classes soient définies dans $FAI/class. -

      -
    • -
    • -

      -Envoyez un courriel à l’administrateur si l’installation est terminée. -

      -
    • -
    • -

      -Installez un client sans disque et sautez le partitionnement de disque local. -

      -
    • -
    • -

      -Jetez un oeil à hooks/debconf.IMAGE pour savoir comment cloner une machine en utilisant une image de système de fichiers. -

      -
    • -
    -
    -
    -

    FAI flags

    -

    La variable $FAI_FLAGS contient une liste de flags séparés par des espaces. Les flags suivants sont connus:

    -
    -
    -verbose -
    -
    -

    -Créez une sortie verbeuse pendant l’installation. Cela doit toujours -être le premier flag, de sorte que les définitions consécutives des -flags seront affichées verbeusement. -

    -
    -
    -debug -
    -
    -

    -Créer une sortie de débogage. Aucune installation sans assistance n’est -effectuée. Pendant l’installation du paquet, vous devez répondre à -toutes les questions des scripts postinstall sur la console du client. -Beaucoup d’informations de débogage seront imprimées. Ce flag n’est -utile que pour les développeurs FAI. -

    -
    -
    -sshd -
    -
    -

    -Démarrez le démon ssh pour activer les connexions à distance. Vous -pouvez ensuite vous connecter en tant que root à tous les clients -d’installation pendant l’installation. Le mot de passe par défaut est -fai et peut être modifié en définissant FAI_ROOTPW dans nfsroot.conf(5). - Pour vous connecter à partir de votre serveur vers le client -d’installation (nommé demohost dans cet exemple), utilisez: -

    -
    -
    -
    -
    -
    $ ssh root@demohost
    -Warning: Permanently added 'demohost,192.168.33.100' to the list of known hosts.
    -root@demohost's password:
    -
    -

    Ce n’est que le mot de passe root pendant le -processus d’installation, pas pour le nouveau système installé. Vous -pouvez également vous connecter sans mot de passe lorsque vous utilisez $SSH_IDENTITY.

    -
    -
    -createvt -
    -
    -

    -Créez deux terminaux virtuels et exécutez un bash si ctrl-c est tapé dans le terminal de console. Vous pouvez accéder aux terminaux supplémentaires en tapant Alt-F2 ou Alt-F3. Sinon, aucun terminal n’est disponible et la saisie ctrl-c - va redémarrer le client d’installation. La définition de ce flag est -utile pour le débogage. Si vous voulez une installation qui ne devrait -pas être interruptible, ne définissez pas ce flag. -

    -
    -
    -menu -
    -
    -

    -Cela permet à un menu utilisateur de sélectionner un profil. Tous les fichiers class/*.profile sont lus et un menu basé sur des curses sera créé. -

    -
    -
    -reboot -
    -
    -

    -Redémarrez le client d’installation une fois l’installation terminée -sans taper RETURN sur la console. Si ce drapeau n’est pas défini, et que - error.log contient quelque chose, le client d’installation s’arrêtera -et attendra que vous appuyez sur RETURN. Si aucune erreur ne s’est -produite, le client redémarre automatiquement automatiquement. -

    -
    -
    -halt -
    -
    -

    -Arrêtez le client d’installation à la fin de l’installation, au lieu de redémarrer dans le nouveau système. -

    -
    -
    -initial -
    -
    -

    -Utilisé par setup-storage(8). Les partitions marquées avec preserve_reinstall sont préservées à moins que ce flag ne soit défini. Souvent, ce drapeau est placé dans un fichierclass/*.var en utilisant le paramètre flag_initial=1. -

    -
    -
    -
    -
    -
    -
    -

    FAI installe votre planification

    -
    -
    -

    La première partie d’une installation

    -

    Après le démarrage du noyau, il monte le -système de fichiers racine via NFS à partir du serveur d’installation et - démarre le script /usr/sbin/fai [10]. Ce script contrôle la séquence de l’installation. Aucun autre script dans /etc/init.d/ n’est utilisé.

    -

    L’espace de configuration est rendu disponible - via la méthode configurée (un montage NFS par défaut) du serveur -d’installation au chemin défini dans $FAI [11].

    -
    -
    -

    Messages de boot

    -

    Lorsque vous démarrez le client d’installation à partir de la carte réseau avec PXE, vous obtiendrez des messages comme ceci:

    -
    -
    -
    Managed PC Boot Agent (MBA) v4.00
    -Pre-boot eXecution Environment (PXE) v2.00
    -DHCP MAC ADDR: 00 A2 A3 04 05 06
    -DHCP.../
    -
    -CLIENT MAC ADDR: 00 A2 A3 04 05 06  GUID: 3D6C4552
    -CLIENT IP: 192.168.33.100 MASK: 255.255.255.0  DHCP IP: 192.168.33.250
    -GATEWAY IP: 192.168.33.1
    -
    -!PXE entry point found (we hope) at 9854:0106 via plan A
    -UNDI code segment at: 9854 len 5260
    -UNDI data segment at: 921D len 63A2
    -Getting cached packet  01 02 03
    -My Ip address seems to be C0A82164 192.168.33.100
    -ip=192.168.33.100:192.168.33.250:192.168.33.1:255.255.255.0
    -BOOTIF=01-00-A2-A3-04-05-06
    -SYSUUID=
    -TFTP prefix: fai/
    -Trying to load pxelinux.cfg/C0A82164
    -
    -Loading vmlinuz-3.16.0-4-amd64..................
    -Loading initrd.img-3.16.0-4-amd64......................ready.
    -
    -

    À ce stade, le client d’installation a réussi à - recevoir le réseau Config via DHCP et le noyau et initrd via TFTP. Il -démarre maintenant Le noyau Linux et l’initrd. Si tout allait bien, -l’initrd Monte nfsroot [12] Et les scripts FAI sont lancés. La première chose que vous voyez est le message en rouge de copyright FAI.

    -
    -
    -
                 -------------------------------------------------
    -                   Fully Automatic Installation  -  FAI
    -
    -                   5.3.3~bpo8+2  (c) 1999-2017
    -               Thomas Lange  <lange@informatik.uni-koeln.de>
    -             -------------------------------------------------
    -
    -Calling task_confdir
    -Kernel currently running: Linux 3.16.0-4-amd64 x86_64 GNU/Linux
    -Kernel parameters: BOOT_IMAGE=vmlinuz-3.16.0-4-amd64 initrd=initrd.img-3.16.0-4-amd64 \
    - rw aufs ip=dhcp root=192.168.33.250:/srv/fai/nfsroot FAI_FLAGS=verbose,sshd,createvt\
    - FAI_CONFIG_SRC=nfs://faiserver/srv/fai/cskoeln FAI_ACTION=install quiet\
    - BOOTIF=01-00-a2-a3-04-05-06
    -Reading /tmp/fai/boot.log
    -FAI_FLAGS: verbose sshd createvt
    -Setting SERVER=faiserver. Value extracted from FAI_CONFIG_SRC.
    -FAI_CONFIG_SRC is set to nfs://faiserver/srv/fai/config
    -Configuration space faiserver:/srv/fai/config mounted to /var/lib/fai/config
    -Calling task_setup
    -FAI_FLAGS: verbose sshd createvt
    -15 Jan 13:22:37 ntpdate[1533]: step time server 192.168.33.250 offset -0.342793 sec
    -Press ctrl-c to interrupt FAI and to get a shell
    -Starting FAI execution - 20170115_132237
    -Calling task_defclass
    -fai-class: Defining classes.
    -Executing /var/lib/fai/config/class/10-base-classes.
    -10-base-classes      OK.
    -Executing /var/lib/fai/config/class/20-hwdetect.source.
    -Loading kernel module md-mod
    -20-hwdetect.source   OK.
    -Executing /var/lib/fai/config/class/50-host-classes.
    -50-host-classes      OK.
    -List of all classes: DEFAULT LINUX AMD64 FAIBASE DHCPC DEMO GRUB client01 LAST
    -
    -

    Vous pouvez également voir la liste des -classes FAI, qui sont définies pour ce hôte. Cette liste est très -importante pour le reste de l’installation.

    -

    La première tâche est appelée confdir, - qui est chargée de Accès à l’espace de configuration. Ici, nous -utilisons un montage NFS à partir de l’installation Comme vous pouvez le - voir sur la console (et plus tard dans les journaux).

    -
    -
    -
    FAI_CONFIG_SRC is set to nfs://faiserver/srv/fai/config
    -Configuration space faiserver:/srv/fai/config mounted to /var/lib/fai/config
    -
    -

    Avant de lancer l’installation ($FAI_ACTION=install), - l’ordinateur Bip trois fois. Donc, faites attention quand vous entendez - trois bips mais vous Ne voulez pas effectuer une installation et -laisser FAI effacer toutes vos données sur Le disque local!

    -
    -
    -

    Redémarrage de l’ordinateur dans le nouveau système

    -

    Pour redémarrer l’ordinateur pendant ou à la fin de l’installation, vous devez utiliser la commande faireboot en faveur de la commande de redémarrage normal. Utilisez aussi faireboot si vous êtes connecté depuis la télécommande. Si l’installation n’est pas terminée, utilisez faireboot -s, donc les fichiers journaux sont également copiés sur le serveur d’installation.

    -

    Si l’installation est terminée, l’ordinateur doit démarrer un petit système Debian. Vous pouvez vous connecter en tant que demo ou root avec le mot de passe fai.

    -
    -
    -

    Démarrage de FAI (tâche confdir)

    -

    Une fois le client d’installation démarré, seul le script /usr/sbin/fai est exécuté. Il effectuera une initialisation minimale. La variable $FAI_CONFIG_SRC [13] est utilisée pour accéder à l’espace de configuration FAI qui est alors disponible dans le répertoire $FAI [14]. FAI ne se déroulera pas sans l’espace de configuration.

    -
    -
    -

    Définition de classes et de variables (tâches defclass et defvar)

    -

    La commande fai-class(1) exécute des scripts dans $FAI/class - pour définir des classes. Si les scripts écrivent une chaîne sur -stdout, cela sera défini comme une classe. Lisez tous les détails dans -la page de manuel de fai-class(1).

    -

    Après avoir défini les classes, chaque fichier correspondant à .var avec un préfixe qui correspond à une classe définie provient de variables définies. Il doit contenir le code shell vaild.

    -
    -
    -

    Partitionnement de disques locaux, création de systèmes de fichiers (tâches de partitionnement)

    -

    Pour le partitionnement du disque, un fichier de configuration de disque de $FAI/disk_config est sélectionné à l’aide de classes.

    -

    Le format de la configuration du disque est similaire à un fichier fstab.

    -

    L’outil de partitionnement setup-storage(8) - exécute toutes les commandes nécessaires à la création de la -disposition de la partition du disque, du RAID logiciel, du LVM et de la - création des systèmes de fichiers. Lisez la page de manuel de setup-storage(8) pour une description détaillée et quelques exemples du format.

    -
    -
    -

    Préréglage Debconf (tâche debconf)

    -

    Les fichiers dans $FAI/debconf sont utilisés par debconf(7) habituel en présselectionnant si les noms de fichier correspondent à un nom de classe.

    -
    -
    -

    Installation de progiciels (tâche instsoft)

    -

    La commande install_packages(8) lit les fichiers de configuration à partir de $FAI/package_config en classe et installe des progiciels sur le nouveau système de fichiers.

    -

    Il installe les paquets en utilisant apt-get(8), aptitude(1), yum - ou d’autres outils de paquetage sans aucune interaction manuelle -nécessaire. Les paquets sont également résolus par les outils de -paquets.

    -

    Le format des fichiers de configuration est décrit dans [packageconfig].

    -
    -
    -

    Personnalisation spécifique au site (task configure)

    -

    Souvent, les configurations par défaut des -progiciels ne répondent pas à vos besoins spécifiques au site. Vous -pouvez appeler des scripts arbitraires qui ajustent la configuration du -système. Par conséquent, la commande fai-do-scripts(1) exécute des scripts dans $FAI/scripts - d’une manière basée sur la classe. Il est possible d’avoir plusieurs -scripts de différents types (shell, cfengine, …) à exécuter pour une -classe.

    -

    L’ensemble de scripts par défaut dans $FAI/scripts - inclut des exemples d’installation de machines Debian et CentOS. Ils -définissent le mot de passe root, ajoutent un compte utilisateur démo, -paramétrent le fuseau horaire, configurent le réseau pour DHCP ou -utilisent une adresse IP fixe,la configuration grub et plus encore. Ils -devraient faire un travail raisonnable pour votre installation. Vous -pouvez les modifier ou ajouter de nouveaux scripts pour répondre à vos -besoins locaux.

    -

    Plus d’informations sur ces scripts sont décrits dans [cscripts].

    -
    -
    -

    Enregistrement des fichiers journaux (tâche savelog)

    -

    Lorsque toutes les tâches sont terminées, les fichiers journaux sont écrits dans /var/log/fai/$HOSTNAME/install/_[15] sur le nouveau système et sur le compte sur le serveur d’installation si $LOGUSER - est défini. Il est également possible de spécifier un autre hôte comme -enregistrement en enregistrant la destination via la variable $LOGSERVER. Si $LOGSERVER n’est pas défini, FAI utilise la variable $SERVER qui n’est définie que lors d’une installation initiale (par get-boot-info). Assurez-vous de définir $LOGSERVER dans un script _class/*.var si vous utilisez l’action softupdate.

    -

    De plus, deux liens symboliques seront créés pour indiquer le dernier répertoire écrit. Le lien symbolique last pointe vers le répertoire journal de la dernière action FAI exécutée. Les liens symboliques last-install et last-sysinfo - pointent vers le répertoire avec la dernière action correspondante. Par - défaut, les fichiers journaux seront copiés sur le serveur de journal à - l’aide de scp. Vous pouvez utiliser la variable $FAI_LOGPROTO dans le fichier fai.conf(5) - pour choisir une autre méthode d’enregistrement des journaux sur le -serveur distant. Voici un exemple de structure de lien symbolique:

    -
    -
    -
    lrwxrwxrwx   1 fai fai   23 Dec  2  2013 last-sysinfo -> sysinfo-20131202_161237
    -drwxr-xr-x   2 fai fai 4096 Dec  2  2013 sysinfo-20131202_161237
    -drwxr-xr-x   2 fai fai 4096 Feb 14  2014 install-20140214_142150
    -drwxr-xr-x   2 fai fai 4096 Dec  2 11:47 install-20141202_113918
    -lrwxrwxrwx   1 fai fai   23 Dec  4 13:22 last-install -> install-20141204_131351
    -lrwxrwxrwx   1 fai fai   23 Dec  4 13:22 last -> install-20141204_131351
    -drwxr-xr-x   2 fai fai 4096 Dec  4 13:22 install-20141204_131351
    -
    -

    Vous trouverez des exemples de fichiers journaux à l’adresse http://fai-project.org/logs.

    -
    -
    -

    Redémarrez le nouveau système installé

    -

    Avant de redémarrer, le client d’installation appelle fai-chboot -d <hostname> - sur le serveur d’installation, pour désactiver sa propre configuration -PXELINUX. Sinon, il redémarrera l’installation lors de la prochaine -initialisation. Normalement, cela devrait démarrer le nouveau système -installé à partir de son second périphérique d’amorçage, le disque dur -local.

    -

    À la fin, le système est automatiquement redémarré si "reboot" a été ajouté à $FAI_FLAGS.

    -
    -
    -
    -
    -

    Chapitre avancés de FAI

    -
    -
    -

    Vérification des paramètres reçus des serveurs DHCP

    -

    Si le client d’installation démarre, vous -pouvez vérifier si toutes les informations provenant du démon DHCP sont -correctement reçues. Les informations reçues sont écrites dans /tmp/fai/boot.log. Un exemple de résultat d’une requête DHCP peut être trouvé dans les fichiers journaux d’exemple.

    -
    -
    -

    Surveillance de plusieurs installations clientes

    -

    Vous pouvez surveiller l’installation de tous les clients d’installation avec la commande fai-monitor(8). - Tous les clients vérifient si ce démon est en cours d’exécution sur le -serveur d’installation (ou sur l’ordinateur défini par la variable -$monserver). Chaque fois qu’une tâche démarre ou se termine, un message -est envoyé. Le démon du moniteur FAI imprime ces messages à la sortie -standard. Il ya aussi un frontend graphique disponible, appelé fai-monitor-gui(1).

    -
    -
    -
    $  fai-monitor | fai-monitor-gui - &
    -
    -
    -
    -

    Collecte d’adresses Ethernet pour plusieurs hôtes

    -

    Vous devez collecter toutes les adresses -Ethernet (MAC) des clients à l’installation et affecter un nom d’hôte et - une adresse IP à chaque client. Pour collecter les adresses MAC, -démarrez vos clients pour l’installation. Vous pouvez déjà le faire -avant que n’importe quel démon DHCP s’exécute dans votre sous-réseau. -Ils échoueront à démarrer (en raison du manque de DHCP ou de TFTP -manquant), mais vous pouvez toujours collecter les adresses MAC.

    -

    Pendant que les clients d’installation -démarrent, ils envoient des paquets de diffusion au LAN. Vous pouvez -enregistrer les adresses MAC de ces hôtes en exécutant simultanément la -commande suivante sur le serveur:

    -
    -
    -
    faiserver# tcpdump -qtel broadcast and port bootpc >/tmp/mac.list
    -
    -

    Une fois que les hôtes ont été envoyés, certains paquets de diffusion annule tcpdump en tapant ctrl-c. Vous obtenez une liste de toutes les adresses MAC uniques avec ces commandes:

    -
    -
    -
    faiserver$ perl -ane 'print "\U$F[0]\n"' /tmp/mac.list|sort|uniq
    -
    -

    Après cela, vous n’avez qu'à assigner ces -adresses MAC aux noms d’hôte et aux adresses IP (/etc/ethers et -/etc/hosts ou aux cartes NIS correspondantes). Avec ces informations, -vous pouvez configurer votre démon DHCP (voir la section [bootdhcp]). [16]

    -
    -

    Débogage du trafic réseau

    -

    Si le client ne peut démarrer correctement à partir de la carte réseau, utilisez tcpdump(8) - pour rechercher des paquets Ethernet entre le serveur d’installation et - le client. Recherchez également les entrées de plusieurs fichiers -journaux effectués par tftpd(8) et dhcpd(8) :

    -
    -
    -
    faiserver$ egrep "tftpd|dhcpd" /var/log/*
    -
    -
    -
    -
    -

    Détails du démarrage PXE

    -

    Ici, nous décrivons les détails du démarrage -PXE, qui ne sont nécessaires que si vous avez des problèmes lors du -démarrage de vos clients d’installation.

    -

    Presque toutes les cartes réseau modernes -prennent en charge l’environnement de démarrage PXE. PXE est -l’environnement d’exécution de pré-lancement. Cela nécessite le chargeur - de démarrage PXELINUX et une version spéciale du démonTFTP, disponible -dans les paquets Debian pxelinux et tftpd-hpa. - Le démarrage PXE nécessite également un serveur DHCP, afin que la carte - réseau puisse configurer ses paramètres IP. Il s’agit de la séquence -d’une amorce PXE:

    -
      -
    • -

      -La carte réseau du client envoie son adresse MAC -

      -
    • -
    • -

      -Le serveur DHCP répond à la configuration IP du client -

      -
    • -
    • -

      -La carte réseau configure son IP -

      -
    • -
    • -

      -Le client d’installation obtient le binaire pxelinux.0 via TFTP -

      -
    • -
    • -

      -Obtenez le fichier de configuration pxelinux.cfg/C0A8210C via TFTP -

      -
    • -
    • -

      -C0A8210C est l’adresse IP du client en hexadécimal -

      -
    • -
    • -

      -Cette configuration contient le noyau, initrd et les paramètres de ligne - de commande supplémentaires du noyau, qui a été créé par fai-chboot. -

      -
    • -
    • -

      -Obtenez le noyau et initrd via TFTP. -

      -
    • -
    -

    Exemple d’un fichier pxelinux.cfg:

    -
    -
    -
    default fai-generated
    -
    -label fai-generated
    -kernel vmlinuz-3.16.0-4-amd64
    -append initrd=initrd.img-3.16.0-4-amd64 ip=dhcp  root=/srv/fai/nfsroot aufs  FAI_FLAGS=verbose,sshd,createvt FAI_CONFIG_SRC=nfs://faiserver/srv/fai/config FAI_ACTION=install
    -
    -

    Voir /usr/share/doc/syslinux/pxelinux.doc - pour des informations plus détaillées sur PXELINUX. Il existe un -nouveau binaire lpxelinux qui prend également en charge le chargement du - noyau et de l’initrd via FTP ou HTTP. La commande fai-chboot(8)' prend en charge cette option avec l’option -U.

    -
    -
    -

    Personnalisation de la configuration de votre serveur d’installation

    -
      -
    • -

      -Miroir de paquetage local/plus rapide -

      -
    • -
    • -

      -Loguser différent -

      -
    • -
    • -

      -Local root password dans nfsroot -

      -
    • -
    -

    La configuration du paquet FAI (et non les données de configuration pour les clients d’installation) est définie dans fai.conf(5). Les définitions qui sont utilisées uniquement pour créer le nfsroot sont situées dans nfsroot.conf(5). Vérifiez ces variables importantes dans nfsroot.conf avant d’appeler fai-setup ou fai-make-nfsroot.

    -
    -
    -FAI_DEBOOTSTRAP -
    -
    -

    -La construction de nfsroot utilise la commande debootstrap(8). - Il a besoin de l’emplacement d’un miroir Debian et du nom de la -distribution (wheezy, jessie, stretch, sid) pour lequel le système -Debian de base devrait être construit. N’utilisez pas de distributions -différentes ici et dans /etc/fai/apt/sources.list. Cela créera un nfsroot brisé. -

    -
    -
    -NFSROOT_ETC_HOSTS -
    -
    -

    -Cette variable n’est nécessaire que si les clients n’ont pas accès à un -serveur DNS. Cette variable multiligne est ajoutée à /etc/hosts dans le -nfsroot. Ensuite, les clients d’installation peuvent accéder à ces hôtes - par leur nom sans utiliser DNS. -

    -
    -
    -

    Le contenu de /etc/fai/apt/sources.list - est utilisé par le serveur d’installation et par les clients. Si votre -serveur d’installation a plusieurs cartes réseau et différents noms -d’hôte pour chaque carte (comme pour un serveur Beowulf), utilisez le -nom du serveur d’installation qui est connu des clients d’installation.

    -

    Si vous avez des problèmes lors de l’exécution de fai-setup, ils proviennent habituellement de fai-make-nfsroot(8) qui est appelé par la commande précédente. L’ajout de -v vous donne une sortie plus détaillée qui vous aide à repérer l’erreur. La sortie est écrite dans /var/log/fai/fai-make-nfsroot.log. [17]

    -

    L’installation crée également le compte fai (défini par $LOGUSER) s’il n’est pas déjà disponible. Vous pouvez donc ajouter un utilisateur avant d’appeler fai-setup(8) à l’aide de la commande adduser(8) - et utiliser ce compte local pour enregistrer des fichiers journaux. Les - fichiers journaux de tous les clients d’installation sont enregistrés -dans le répertoire de base de ce compte. Vous devriez changer le groupe -principal de ce compte, donc ce compte a des droits d'écriture sur /srv/tftp/fai pour appeler fai-chboot pour créer la configuration PXE pour les hôtes.

    -

    Lorsque vous apportez des modifications à fai.conf, nfsroot.conf, le nfsroot doit être reconstruit en appelant fai-make-nfsroot(8). Si vous souhaitez uniquement installer un nouveau paquet kernel sur nfsroot, ajoutez les flags -k ou -K à fai-make-nfsroot. - Cela ne recréera pas votre nfsroot, mais ne mettra à jour que vos -noyaux et les modules du noyau dans le nfsroot ou ajoutera des paquets -supplémentaires dans le nfsroot.

    -
    -
    -

    Création d’un CD FAI ou d’une clé USB

    -

    Vous pouvez facilement créer un CD -d’installation (ou clé USB) pour votre installation réseau. Cela -permettra d’effectuer la même installation et la même configuration à -partir du CD sans avoir besoin du serveur d’installation. Par -conséquent, vous devez créer un miroir partiel de tous les paquets -Debian nécessaires à vos classes FAI (à l’aide de fai-mirror(1)). Ensuite, la commande fai-cd(8) mettra ce miroir, le nfsroot et l’espace de configuration sur un CD amorçable. C’est tout!

    -

    Ce CD d’installation contient toutes les données nécessaires à l’installation. La commande fai-cd(8) - place le nfsroot, l’espace de configuration et un sous-ensemble du -miroir Debian sur un CD-ROM. Un miroir de paquets partiel est créé à -l’aide de la commande fai-mirror(1) qui contient tous les -paquetages utilisés par les classes utilisées dans votre espace de -configuration. Un échantillon d’image ISO est disponible à l’adresse http://fai-project.org/fai-cd.

    -

    Avec la commande dd(1), vous -pouvez également créer une clé USB bootable en écrivant simplement le -contenu du fichier ISO sur votre clé USB (ici le stick est /dev/sdf).

    -
    -
    -
     faiserver# dd if=fai-cd.iso of=/dev/sdf bs=1M
    -
    -

    Il ne s’agit pas d’un live CD du serveur d’installation.

    -
    -
    -

    Création d’images de disque VM à l’aide de FAI

    -

    En utilisant la commande fai-diskimage(8), - vous pouvez créer des images de disques de machines Linux qui peuvent -être utilisées avec une machine virtuelle comme KVM, VMware, VirtualBox -ou un service cloud comme OpenStack, GCE, EC2 et autres. Le processus -d’installation exécute les tâches FAI normales sur une image de disque -brut. Après l’installation, vous pouvez démarrer l’image disque et avoir - un système en cours d’exécution. L’image disque peut également être -convertie au format qcow2.

    -
    -
    -
     faiserver# export FAI_BASEFILEURL=http://fai-project.org/download/basefiles/
    - faiserver# fai-diskimage -u cloud3 -S 2G -cDEBIAN,JESSIE64,AMD64,FAIBASE,GRUB_PC,CLOUD,GCE disk.raw
    -
    -

    Crée le fichier disk.raw pour un hôte appelé cloud3, avec un petit ensemble de progiciels.

    -
    -
    -
     # export FAI_BASEFILEURL=http://fai-project.org/download/basefiles/
    - # cl=DEFAULT,DHCPC,DEBIAN,AMD64,FAIBASE,GRUB_PC,UBUNTU,XENIAL,XENIAL64,XORG
    - # fai-diskimage -v -u foobar -S5G -c$cl ubuntu.qcow2
    -
    -

    Crée une image de disque appelée ubuntu.qcow2 pour un bureau Ubuntu 16.04 avec un nom d’hôte défini sur foobar.

    -

    Vous ne devez pas configurer le nfsroot -lorsque vous utilisez uniquement fai-diskimage. Mais vous avez besoin -d’un fichier de base dans votre espace de configuration. Vous pouvez -télécharger une image de base Debian à partir de http://fai-project.org/download/basefile - et copier ceci dans votre espace de configuration. Si vous avez déjà -configuré le nfsroot, vous pouvez copier le fichier de base Debian -depuis le nfsroot dans votre espace de configuration à l’aide de cette -commande:

    -
    -
    -
     $ cp /srv/fai/nfsroot/var/tmp/base.tar.xz
    - $ /srv/fai/config/basefiles/JESSIE64.tar.xz
    -
    -
    -
    -

    Système de sauvetage FAI

    -

    Si vous définissez la variable $FAI_ACTION sur sysinfo (par exemple en utilisant fai-chboot -S), le client n’installera pas de nouveau système, mais collectera beaucoup d’informations système. Si vous définissez $FAI_ACTION sur inventory, - vous ne recevrez que quelques informations sur le matériel. Les deux -actions peuvent être utilisées pour FAI comme un système de sauvetage.

    -

    Tapez ctrl-c pour obtenir un shell ou utilisez Alt-F2 ou Alt-F3 et vous obtiendrez un autre terminal de console, si vous avez ajouté createvt à $FAI_FLAGS.

    -

    Vous avez maintenant un système Linux en cours - d’exécution sur le client d’installation sans utiliser le disque dur -local. Utilisez-le comme système de secours si votre disque local est -endommagé ou si l’ordinateur ne peut pas démarrer correctement à partir -du disque dur. Vous obtiendrez un shell et vous pouvez exécuter diverses - commandes (dmesg, lsmod, df, lspci, …). Regardez le fichier journal dans /tmp/fai. Vous y trouverez de nombreuses informations sur le processus d’amorçage.

    -

    FAI monte tous les systèmes de fichiers qu’il -trouve sur les disques locaux en lecture seule. Il vous indique -également sur quelle partition un fichier /etc/fstab existe. -Lorsqu’une seule table de système de fichiers est trouvée, les -partitions sont montées selon ces informations. Voici un exemple:

    -
    -
    -
    demohost:~# df
    -Filesystem      1K-blocks      Used Available Use% Mounted on
    -rootfs            4099064    414088   3645296  11% /
    -192.168.33.250:/srv/fai/nfsroot
    -                  3905600    410976   3454944  11% /live/image
    -tmpfs              193464      3112    190352   2% /live/cow
    -aufs              4099064    414088   3645296  11% /
    -
    -192.168.33.250:/srv/fai/config
    -                  3905600    410976   3454944  11% /var/lib/fai/config
    -/dev/sda1          241116     74519    154149  33% /target
    -/dev/sda9         4364212    139888   4179988   4% /target/home
    -/dev/sda7          553376     16840    536536   4% /target/tmp
    -/dev/sda8         2221628    275936   1832840  14% /target/usr
    -/dev/sda6          577096    172924    374856  32% /target/var
    -
    -

    Cette méthode peut être utilisée comme un environnement de secours! Si vous avez besoin d’un système de fichiers avec accès en lecture/écriture, utilisez la commande rwmount:

    -
    -
    -
    demohost# rwmount /target/home
    -
    -
    -
    -

    FAI sans NFS

    -

    Pour démarrer dans FAI et commencer la -séquence d’installation sans utiliser le protocole NFS. Vous démarrez la - machine cliente en utilisant PXE comme d’habitude, puis récupérez une -image contenant le nfsroot via http.

    -

    Pour créer une image, utilisez l’argument -S de fai-cd

    -
    -
    -
    faiserver# fai-cd -S squash.img
    -
    -

    Déplacez cette image vers un répertoire à -partir duquel elle peut être demandée via http (généralement un -répertoire desservi par le serveur web)

    -

    Pour demander maintenant l’image squashfs, -ajoutez ce qui suit à votre ligne de commande du noyau, p. Dans votre -fichier de configuration pxelinux pour le client.

    -
    -
    -
    root=live:http://faiserver/cskoeln/squash.img
    -
    -

    Remplacez faiserver par le nom de domaine ou IP de la machine à laquelle votre image de squash est servie.

    -
    -
    -

    Installation d’autres distributions à l’aide d’un nfsroot Debian

    -

    Vous pouvez installer toutes sortes de -distributions Linux à partir d’un seul nfsroot Debian. Par conséquent, -vous devez créer un fichier base.tar.xz de la distribution que vous -souhaitez installer et le placer dans le répertoire basefiles. - Puis nommez-le UBUNTU1404.tar.xz par exemple. Un client d’installation -appartenant à la classe UBUNTU1404 extrait ensuite ce fichier de base -dans son système de fichiers vide. De plus, vous devez ajuster les -sources.list ou les fichiers de configuration similaires nécessaires -pour spécifier l’emplacement du référentiel de paquets.

    -

    L’outils rinse(8) est utilisé -pour créer des fichiers de base pour la distribution comme CentOS, -openSUSE, Scientific Linux Cern ou Fedora. Certains fichiers de base -peuvent être téléchargés à partir de http://fai-project.org/download/basefiles/.

    -

    Le script mk-basefile dans /usr/share/doc/fai-doc/examples/simple/basefiles/' aide à créer ces fichiers de base.

    -
    -
    -

    Création d’environnements chrooter et virtualiser

    -

    Si vous devez créer certains environnements -chroot, ou un environnement de virtualisation où vous ne pouvez ni ne -voulez exécuter un programme d’installation Debian normal pour accéder à - un système opérationnel (par exemple, les domaines hôtes Xen), il ya -l’action FAI dirinstall. -En appelant

    -
    -
    -
    faiserver# fai <options> dirinstall <target-directory>
    -
    -

    Et en utilisant l’option -c <classes> ou -N - vous obtenez une installation FAI, sans l’action de partitionnement, -directement dans le répertoire cible. Le nom d’hôte de l’installation -cible peut être spécifié à l’aide de -u <host-name>

    -

    Ceci, par exemple, peut être utilisé pour combiner FAI avec l’outil xen-tools, qui vous aide à construire des domaines invités Xen. xen-tools - est très agréable pour générer des fichiers de configuration et bloquer - des périphériques pour de nouveaux invités basés sur des commandes -simples et/ou des fichiers de configuration, mais ils ne peuvent -assigner qu’un seul rôle par installation pour la personnalisation. Les -FAI-utilisateurs ont besoin et veulent plus, car ils sont utilisés pour -avoir le système de classe. Ils les obtiennent même dans les -installations xen-tools, en utilisant le code suivant en tant que rôle -xen-tools script:

    -
    -
    -
    #!/bin/sh
    -TARGET=$1
    -CMD="fai -N  -v -u ${hostname} dirinstall $TARGET"
    -echo running $CMD
    -$CMD
    -
    -

    Ensuite, vous voulez définir la variable install=0 de la configuration xen-tools pour cet hôte.

    -
    -
    -

    Utilisation de FAI pour les mises à jour

    -

    FAI peut également effectuer des mises à jour -de systèmes déjà en cours d’exécution, sans réinstallation à partir de -zéro. C’est ce qu’on appelle softupdate. Un FAI softupdate ignore les -tâches qui ne sont pas adaptées à la mise à jour d’un système en cours -d’exécution, comme le partitionnement des disques durs et la création de - systèmes de fichiers. Au lieu de cela, il exécute uniquement les tâches - de mise à jour et d’installation des progiciels et de l’appel des -scripts de personnalisation.

    -

    Pour exécuter un appel softupdate:

    -
    -
    -
    # fai -v -s nfs://faiserver/srv/fai/config softupdate
    -
    -

    Par défaut, un softupdate utilise la liste des - classes définies lors de l’installation initiale. Assurez-vous de -définir la variable $LOGSERVER (effectuée dans un fichier class/*.var) si FAI doit enregistrer les fichiers journaux sur une machine distante.

    -

    C’est à vous, comment démarrer un softupdate -sur un plus grand nombre d’hôtes. Vous pouvez faire le softupdate sur -une base régulière via cron ou vous pouvez utiliser des outils comme clusterssh(1) pour démarrer un softupdate via un push sur une liste d’hôtes.

    -

    Gardez à l’esprit que les scripts de -personnalisation sont exécutés chaque fois que vous faites un -softupdate. Cela signifie qu’ils doivent être idempotents, - c’est-à-dire que le résultat de leur fonctionnement doit toujours -produire le même résultat, même lorsqu’ils fonctionnent plus d’une fois.

    -

    Par exemple, l’ajout d’une ligne à un fichier ne doit pas se faire via ce code:

    -
    -
    -
    $ echo "some strings" >> /etc/fstab
    -
    -

    Utilisez plutôt la commande ainsl(1) dans un script shell ou utilisez la fonction AppendIfNoSuchLine de cfengine.

    -

    Toutes les commandes du script de -personnalisation doivent être capables de modifier le système de -fichiers cible s’il est disponible dans /target lors de l’installation initiale ou si c’est le système de fichiers normal relatif à / pendant le softtupdate.

    -

    Voici quelques variables qui aident à écrire ces scripts:

    -
    -
    -$target -
    -
    -

    -Pointe vers le répertoire racine du client, qui est /target pendant l’installation et / pendant un softupdate. -

    -
    -
    -$FAI_ROOT -
    -
    -

    -C’est la même valeur que $target. Pour des raisons historiques, nous avons ces deux variables dans FAI. -

    -
    -
    -$ROOTCMD -
    -
    -

    -Dans le cas de l’installation, il s’agit d’un alias pour chroot $target - en cas de softupdate c’est juste vide. Vous pouvez ajouter ceci aux -commandes si vous avez besoin d’exécuter une commande dans le système de - fichiers cible des clients via chroot. -

    -
    -
    -$FAI_ACTION -
    -
    -

    -Si vous devez appeler le code en fonction de l’action FAI effectuée, -vous pouvez utiliser cette variable. Il contient l’action actuellement -exécutée: install, softupdate, dirinstall, sysinfo, inventory ou votre propre action définie. -

    -
    -
    -
    -
    -

    Comment installer un système d’exploitation 32 bits à partir d’un système d’exploitation 64 bits

    -

    Pour installer un ordinateur avec un système -d’exploitation 32 bits, vous avez besoin d’un nfsroot i386. La création -de cette nfsroot 32 bits sur un serveur d’installation exécutant amd64 -est assez simple. Installez et configurez les paquets FAI. Copiez -ensuite vos fichiers de configuration FAI dans un nouveau -sous-répertoire.

    -
    -
    -
    faiserver# cp -a /etc/fai /etc/fai-i386
    -
    -

    Modifiez la variable $FAI_DEBOOTSTRAP_OPTS dans /etc/fai-i386/nfsroot.conf et ajoutez l’option --arch i386. Choisissez également un répertoire différent pour votre nouveau nfsroot. Voici les deux lignes après l'édition.

    -
    -
    -
    NFSROOT=/srv/fai/nfsroot-i386
    -FAI_DEBOOTSTRAP_OPTS="--arch i386 --exclude=info --include=aptitude""
    -
    -

    Appelez maintenant fai-make-nfsroot qui crée le nfsroot 32 bits dans /srv/fai/nfsroot-i386

    -
    -
    -
    faiserver# fai-make-nfsroot -v -C/etc/fai-i386
    -
    -

    La création d’un miroir partiel utilisant fai-mirror(1) - nécessaire à un CD amorçable ou une clé USB est également possible sur -une architecture différente. Vous devez spécifier l’architecture lors de - l’appel de fai-mirror.

    -
    -
    -
    $ fai-mirror -m800 -B -a i386 -v -cDEFAULT,DEBIAN,FAIBASE,I386 /srv/mirror-i386
    -
    -

    C’est tout!

    -
    -
    -
    -
    -

    Divers conseils et détails

    -
    -
    -

    La liste des tâches

    -

    La plupart des tâches de l’installation sont définies comme des sous-routines qui sont définies dans /usr/lib/fai/subroutines (par exemple task_instsoft). Certains sont des scripts shell externes situés dans /usr/lib/fai/. Ils sont appelés via un sous-programme supérieur appelé task. Ce sous-programme appelle les hooks si disponibles, puis appelle la tâche (définie comme task<name>_). Une tâche et ses hooks peuvent être ignorés à la demande en utilisant la commande skiptask().

    -

    Suit maintenant la description de toutes les tâches, énumérées dans l’ordre dans lequel elles sont exécutées.

    -
    -
    -confdir -
    -
    -

    -Les paramètres ajoutés au noyau peuvent définir des variables, le démon -syslog est démarré. La liste des périphériques réseau est stockée dans $netdevices. - Ensuite, des paramètres supplémentaires sont extraits d’un serveur -DHCP. Le fichier de configuration du résolveur DNS est créé. -

    -

    L’emplacement de l’espace de configuration est défini par la variable $FAI_CONFIG_SRC.

    -

    Ensuite, le fichier $FAI/hooks/subroutines - est sourcé s’il existe. En utilisant ce fichier, vous pouvez définir -vos propres sous-programmes ou remplacer la définition des -sous-programmes FAI.

    -
    -
    -setup -
    -
    -

    -Cette tâche définit l’heure du système, tous les $FAI_FLAGS - sont définis et deux terminaux virtuels supplémentaires sont ouverts à -la demande. Un démon de shell sécurisé est lancé à la demande pour les -connexions à distance. -

    -
    -
    -defclass -
    -
    -

    -Appellez fai-class(1) pour définir des classes à l’aide de scripts et de fichiers dans $FAI/class et classes de /tmp/fai/additional-classes et la variable $ADDCLASSES. La liste de toutes les classes définies est stockée dans la variable $classes et enregistrée dans /tmp/fai/FAI_CLASSES. -

    -
    -
    -defvar -
    -
    -

    -Sourcez tous les fichiers $FAI/class/*.var pour chaque classe définie. Si un hook a écrit quelques définitions de variables dans le fichier $LOGDIR/additional.var, ce fichier est également sourcé. -

    -
    -
    -action -
    -
    -

    -En fonction de la valeur de $FAI_ACTION, ce sous-programme décide de l’action FAI à exécuter. Les actions disponibles par défaut sont: sysinfo, install, inventory, dirinstall et softupdate. Si $FAI_ACTION a une autre valeur, une action définie par l’utilisateur est appelée si un fichier $FAI/hooks/$FAI_ACTION existe. Ainsi, vous pouvez facilement définir vos propres actions. -

    -
    -
    -sysinfo -
    -
    -

    -Appelée lorsque aucune installation n’est effectuée mais que l’action est sysinfo. Il affiche des informations sur le matériel détecté et monte les disques durs locaux en lecture uniquement sur /target/partitionname ou en regard d’un fichier fstab trouvé à l’intérieur d’une partition. Les fichiers journaux sont stockés sur le serveur d’installation. -

    -
    -
    -inventory -
    -
    -

    -Une courte liste des informations système est imprimée. -

    -
    -
    -install -
    -
    -

    -Cette tâche contrôle la séquence d’installation. Vous entendrez trois -bips avant le début de l’installation. Le travail principal consiste à -appeler d’autres tâches et à enregistrer la sortie dans /tmp/fai/fai.log. Si vous avez des problèmes pendant l’installation, regardez tous les fichiers dans /tmp/fai/. Vous trouverez des exemples de fichiers journaux à l’adresse http://fai-project.org/logs/. -

    -
    -
    -dirinstall -
    -
    -

    -Installez dans un répertoire, et non pas sur un disque local. Utilisez-le pour créer des environnements chrootés. -

    -
    -
    -softupdate -
    -
    -

    -Cette tâche, exécutée à l’intérieur d’un système en cours d’exécution via l’interface de ligne de commande fai(8), effectue un softupdate. Voir le chapitre [softupdate] pour plus de détails. -

    -
    -
    -partition -
    -
    -

    -Appelle setup-storage(8) pour partitionner les disques durs - et créer des systèmes de fichiers. La tâche écrit des définitions de -variables pour la partition et le périphérique racine et de démarrage ($ROOT_PARTITION, $BOOT_PARTITION, $BOOT_DEVICE) dans /tmp/fai/disk_var.sh et crée un fichier fstab pour le nouveau système. -

    -
    -
    -mountdisks -
    -
    -

    -Montez les partitions créées en fonction du fichier /tmp/fai/fstab créé par rapport à $FAI_ROOT. -

    -
    -
    -extrbase -
    -
    -

    -Extrait un système minimal après lequel un chroot peut y être introduit. Par défaut, le fichier tar base /var/tmp/base.tar.xz sera extrait. Les fichiers correspondant à un nom de classe dans $FAI/basefiles/ - sont également utilisés pour décompresser un autre fichier tar selon -les classes définies. Cela peut être utilisé pour installer des -distributions Linux différentes de celles utilisées pour créer le -nfsroot. Le fichier par défaut base.tar.xz est un instantané d’un système Debian de base créé par debootstrap(8) Cette tâche utilise la variable FAI_BASEFILEURL pour extraire le fichier de base via FTP ou HTTP si elle est définie. -

    -
    -
    -debconf -
    -
    -

    -Appelle fai-debconf(1) pour définir les valeurs de la base de données de préconfiguration de debconf. -

    -
    -
    -repository -
    -
    -

    -Préparez l’accès au référentiel de paquets en préparant la configuration - apt. Cela peut également ajouter des clés de référentiel via apt-key(8) en classe à partir de fichiers comme CLASSNAME.asc dans le répertoire package_config. -

    -
    -
    -updatebase -
    -
    -

    -Met à jour les paquets de base du nouveau système et met à jour la liste - des paquets disponibles. Il falsifie également certaines commandes -(appelées diversions) à l’intérieur du nouveau système installé à l’aide - de dpkg-divert(8), de sorte qu’aucun démon ne sera démarré pendant l’installation. -

    -
    -
    -instsoft -
    -
    -

    -Installe les progiciels souhaités en utilisant des fichiers de classe dans $FAI/package_config/. -

    -
    -
    -configure -
    -
    -

    -Appelle les scripts dans $FAI/scripts/ et ses sous-répertoires pour chaque classe définie. -

    -
    -
    -tests -
    -
    -

    -Appelle les scripts de test dans $FAI/tests/ et ses sous-répertoires pour chaque classe définie. -

    -
    -
    -finish -
    -
    -

    -Démonte tous les systèmes de fichiers dans le nouveau système installé -et supprime les diversions de fichiers à l’aide de la commande fai-divert. -

    -
    -
    -chboot -
    -
    -

    -Modifie la configuration PXE d’un hôte sur le serveur d’installation qui - indique quelle configuration PXELINUX doit être chargée lors de la -prochaine initialisation à partir de la carte réseau via TFTP. Par -conséquent, la commande fai-chboot(8) est exécutée à distance sur le serveur d’installation. -

    -
    -
    -savelog -
    -
    -

    -Enregistre les fichiers journaux sur le disque local et sur le compte $LOGUSER sur $LOGSERVER (par défaut sur le serveur d’installation). -

    -
    -
    -faiend -
    -
    -

    -Attendez que les travaux en arrière-plan se terminent (par exemple, -emacs compile des fichiers lisp) et redémarre automatiquement les -clients d’installation ou attend la saisie manuelle avant le -redémarrage. -

    -
    -
    -
    -
    -

    Tests automatisés

    -

    Après l’exécution des scripts de -personnalisation, FAI exécutera certains tests si disponibles. En -utilisant ces tests, vous pouvez vérifier les erreurs de l’installation. - Les scripts de test sont appelés via fai-do-scripts(1) et doivent ajouter leurs messages à $LOGDIR/test.log. Un module Perl comprenant des sous-routines utiles peut être trouvé dans Faitest.pm. Un test peut également définir une nouvelle classe pour exécuter d’autres tests lors du prochain démarrage via la variable $ADDCLASSES.

    -
    -
    -

    Découvrir automatiquement

    -

    Dans FAI 5.0, nous avons publié une -fonctionnalité qui permet aux clients de rechercher le faiserver dans -leur sous-réseau respectif. Cela soulève la nécessité de récupérer -l’adresse MAC de chaque client et de configurer le démon DHCP.

    -

    Cela se fait en démarrant à partir d’une -petite autodiscover FAI bootmedium (CD, USB, etc.), qui peut être créée -via la commande:

    -
    -
    -
    faiserver# fai-cd -A autodiscover.iso
    -
    -

    L’image a une taille d’environ 25 Mo et -analyse le sous-réseau d’un serveur FAI. Par défaut, il affiche un menu -avec tous les profils disponibles dans l’espace de configuration de la -même manière que le drapeau de menu. Dans ce menu, vous pouvez -sélectionner le type d’installation que vous souhaitez effectuer.

    -

    Pour que les clients puissent trouver le faiserver, le faiserver doit exécuter fai-monitor.

    -
    -
    -

    Modification du périphérique d’amorçage

    -

    La modification de la séquence d’amorçage -s’effectue normalement dans la configuration du BIOS. Mais vous ne -pouvez pas changer le BIOS d’un système Linux en cours d’exécution.

    -

    Ainsi, la séquence d’amorçage du BIOS restera -inchangée et votre ordinateur devrait toujours démarrer en premier à -partir de sa carte réseau et le deuxième périphérique d’amorçage devrait - être le disque local. Ensuite, vous pouvez changer le périphérique -d’amorçage du client en créant différentes configurations PXELINUX. Cela - définira si une installation doit être effectuée, ou si le client doit -démarrer à partir du disque local. Cela se fait à l’aide de fai-chboot(8).

    -
    -
    -

    Comment créer un miroir Debian local

    -

    Le script mkdebmirror [18] peut être utilisé pour créer votre propre miroir Debian local. Ce script utilise la commande debmirror(1). - Un miroir Debian partiel pour l’architecture i386 et amd64 pour Debian -8.0 (aka jessie) sans les paquets source nécessite environ 56Go d’espace - disque. L’accès au miroir via HTTP sera la méthode par défaut dans la -plupart des cas. Pour afficher plus de résultats à partir du script, -appelez mkdebmirror -v. Un compte root n’est pas nécessaire pour créer et maintenir le miroir Debian.

    -

    Pour utiliser l’accès HTTP au miroir Debian -local, installez un serveur Web et créez un lien symbolique vers le -répertoire local où se trouve votre miroir:

    -
    -
    -
    faiserver# apt-get install apache2
    -faiserver# ln -s /files/scratch/debmirror /var/www/html/debmirror
    -
    -

    Créez un fichier sources.list(5) dans /etc/fai/apt qui donne accès à votre miroir Debian. Ajoutez également l’adresse IP du serveur HTTP à la variable $NFSROOT_ETC_HOSTS dans nfsroot.conf si les clients d’installation n’ont pas de résolution DNS.

    -
    -
    -

    Petits conseils

    -
      -
    • -

      -Lorsque vous utilisez l’accès HTTP à un miroir Debian, la partition locale /var - sur tous les clients d’installation doit être suffisamment grande pour -conserver les paquets Debian téléchargés. N’essayez pas avec moins de -250 Moctets à moins que vous sachiez pourquoi. Vous pouvez limiter le -nombre de paquets installés à la fois avec la variable $MAXPACKAGES. -

      -
    • -
    • -

      -Vous pouvez supprimer le logo rouge sur le client d’installation en appelant simplement une fois reset. Il ne s’affichera pas si vous créez un fichier à l’aide de cette commande sur le serveur d’installation: -

      -
    • -
    -
    -
    -
    touch /srv/fai/nfsroot/.nocolorlogo
    -
    -
      -
    • -

      -Une liste des variables utilisées par FAI peut être trouvée à http://wiki.fai-project.org/wiki/Variables. -

      -
    • -
    • -

      -Vous pouvez raccourcir certains scripts de personnalisation en utilisant une seule commande fcopy fcopy -r /. -

      -
    • -
    • -

      -Si vous reconstruisez le nfsroot, vous allez créer une nouvelle clé hôte - ssh dans le nfsroot. La connexion à un client d’installation peut -échouer, car la clé hôte change. Vous pouvez utiliser ceci: -

      -
    • -
    -
    -
    -
    $ ssh -o StrictHostKeyChecking=no root@installclient
    -
    -
      -
    • -

      -Vous pouvez également supprimer l’entrée hôte de votre client d’installation dans votre fichier ~/.ssh/known_hosts à l’aide de la commande ssh-keygen -R. -

      -
    • -
    • -

      -Dans les tâches chboot et savelog, une connexion utilisant un shell sécurisé est ouverte au serveur FAI (voir [isavelog]). Pour garantir que cela fonctionne de manière non interactive, une entrée appropriée dans NFSROOT/root/.ssh/known_hosts - doit être créée. Lors de l’utilisation de fai-setup, cela se fait -automatiquement, mais il peut s’avérer nécessaire de l'éditer -manuellement si le nom de votre serveur FAI n’a pas été correctement -déterminé. Si vous trébuchez sur des connexions ssh qui nécessitent de -taper "yes" pour accepter la clé hôte pendant l’installation, vérifiez -le contenu de votre fichier NFSROOT/root/.ssh/known_hosts -

      -
    • -
    • -

      -Une liste de tous les disques durs locaux est stockée dans $disklist. Il est défini après l’appel de set_disk_info. -

      -
    • -
    • -

      -Utilisez fai-divert -a si un script postinst appelle un -programme de configuration, par exemple Le script postinst pour package -apache appelle apacheconfig, qui nécessite une entrée manuelle. Vous -pouvez fausser le programme de configuration pour que l’installation -puisse être entièrement automatique. -

      -
    • -
    • -

      -Parfois, l’installation semble s’arrêter, mais souvent il ya seulement -un script postinstall d’un logiciel qui nécessite une entrée manuelle de - la console. Passez à un autre terminal virtuel et regardez quel -processus fonctionne avec des outils comme top(1) et pstree(1). Vous pouvez ajouter debug à FAI_FLAGS - pour faire en sorte que le processus d’installation affiche toutes les -sorties des scripts postinst sur la console et obtenir son entrée aussi à - partir de la console. -

      -
    • -
    • -

      -Comment puis-je définir des classes sur la ligne de commande du noyau? -

      -

      Lisez la page de manuel de fai-class(8). Si vous souhaitez définir des classes supplémentaires (par exemple A, B, C) sur la ligne de commande du noyau, ajoutez ceci: ADDCLASSES=A,B,C

      -
    • -
    • -

      -Comment utiliser un noyau personnalisé dans le nfsroot? -

      -

      Construisez votre noyau personnalisé en construisant un paquet kernel à l’aide de make-kpkg(8) et utilisez l’option --initrd. - Copiez ce paquet Debian dans un référentiel local et ajoutez-le à -/etc/fai/sources.list. Ajoutez le nom de votre package à -/etc/fai/NFSROOT. Ensuite appeler

      -
      -
      -
      # fai-make-nfsroot -k
      -
      -
    • -
    • -

      -Puis-je utiliser un noyau 4.X? -

      -

      Oui. L’utilisation de FAI 5.1 et dracut -044+150-1 overlayfs (au lieu d’aufs) est prise en charge, de même que le - noyau 4.x. Lorsque vous utilisez Debian jessie, vous pouvez utiliser un - noyau de backports ou consulter https://lists.uni-koeln.de/pipermail/linux-fai/2016-March/011283.html

      -
    • -
    • -

      -Comment utiliser le nfsroot comme système pour les clients sans disque? -

      - -
    • -
    • -

      -Comment faire pour servir plusieurs arborescence nfsroot sur un serveur FAI? -

      -

      Si vous souhaitez diffuser plusieurs répertoires nfsroot, vous devez créer des répertoires de configuration spécifiques dans /etc pour FAI, comme /etc/fai-jessie et /etc/fai-stretch. Ensuite, vous devez définir les variables $NFSROOT dans différents répertoires et exécuter

      -
    • -
    -
    -
    -
    faiserver#fai-make-nfsroot -c /etc/fai-jessie
    -
    -
    -
    -

    flag_reboot (FAI_FLAGS)

    -

    Si flag_reboot est défini, en ajoutant "reboot" à $FAI_FLAGS, - votre ordinateur client redémarrera après la fin de la tâche. Ceci est -vrai pour les installations de réseau ainsi que pour les installations -de bootmedium.

    -
    -
    -

    CentOS reboot

    -

    Après l’installation, CentOS nécessite -habituellement un redémarrage supplémentaire, en raison des correctifs -de sécurité SELinux qui sont appliqués après l’installation.

    -
    -
    -

    Fichiers journaux

    -

    FAI crée plusieurs fichiers journaux. Pendant l’installation, ils sont stockés dans /tmp/fai sur le client d’installation lui-même. A la fin de l’installation, ils seront copiés sur le serveur d’installation (voir [isavelog]). - Une fois le client d’installation redémarré dans son système -nouvellement installé, vous pouvez trouver les journaux FAI dans /var/log/fai. Les fichiers journaux sont également créés lors de l’action softupdate ou dirinstall.

    -

    Sur le faiserver, vous pouvez trouver les fichiers journaux (distants) sous le répertoire ~fai.

    -

    Les exemples de fichiers journaux des ordinateurs installés avec succès sont disponibles sur http://fai-project.org/logs. Ce sont quelques fichiers journaux qui sont créés par FAI.

    -
    -
    -FAI_CLASSES -
    -
    -

    -Contient une liste de toutes les classes définies. -

    -
    -
    -dmesg.log -
    -
    -

    -La sortie de la commande dmesg. Contient des messages utiles de la mémoire tampon du noyau. -

    -
    -
    -fai.log -
    -
    -

    -Le fichier journal principal. Contient toutes les informations importantes. Vous devez toujours lire ce fichier. -

    -
    -
    -boot.log -
    -
    -

    -Une liste de variables de paramètres de réseau, principalement définis par le démon DHCP. -

    -
    -
    -format.log -
    -
    -

    -Sortie de l’outil de partition setup-storage(8). -

    -
    -
    -shell.log -
    -
    -

    -La sortie de tous les scripts shell, utilisés pour la personnalisation. -

    -
    -
    -variables.log -
    -
    -

    -Une liste de toutes les variables shell qui sont disponibles au cours d’une installation. -

    -
    -
    -error.log -
    -
    -

    -Résumé des erreurs possibles dans tous les fichiers journaux. -

    -
    -
    -disk_var.sh -
    -
    -

    -Une liste des variables contenant des informations sur les périphériques - et les partitions à partir desquelles la partition racine et une liste -de périphériques de swap. Ces informations sont utilisées par certains -scripts de personnalisation (par exemple GRUB_PC/10-setup). -

    -
    -
    -

    Si le processus d’installation se termine, le hook savelog.LAST.sh recherche tous les fichiers journaux pour les erreurs courantes et les écrit dans le fichier error.log. Donc, vous devriez d’abord regarder dans ce fichier pour les erreurs. Le fichier status.log - vous donne également le code de sortie de la dernière commande exécutée - dans un script. Pour être sûr, vous devriez rechercher plus de détails -dans tous les fichiers journaux.

    -
    -
    -

    Comment utiliser HTTP pour le démarrage PXE

    -
    -
    -
    cp /usr/lib/PXELINUX/lpxelinux.0 /srv/tftp/fai/pxelinux.0
    -
    -

    Activer l’accès HTTP au répertoire tftp:

    -
    -
    -
    cd /var/www/html
    -ln -s /srv/tftp/fai
    -
    -

    Ajoutez -U URL à l’appel fai-chboot. Par exemple:

    -
    -
    -
    fai-chboot -U http://faiserver/fai -IFv .......
    -
    -
    -
    -
    -
    -

    Dépannage

    -
    -
    -

    Erreurs d’amorçage

    -

    Le message d’erreur suivant indique que votre -client d’installation n’obtient pas de réponse d’un serveur DHCP. -Vérifiez vos câbles ou démarrez le démon dhcpd(8) avec le debug flag activé.

    -
    -
    -

    PXE-E51: No DHCP or BOOTP offers received -Network boot aborted

    -
    -
    -
    -

    Si vous ne voyez pas le message suivant, le -noyau d’installation n’a pas pu détecter votre carte réseau, par exemple - en raison d’un pilote manquant:

    -
    -
    -
    Starting dhcp for interface eth0
    -dhcp: PREINIT eth0 up
    -dhcp: BOND setting eth
    -
    -

    Vérifiez l’initrd dans le nfsroot (lsinird) si le pilote du noyau de votre carte réseau est inclus et vérifiez si vous souhaitez ajouter le paquet firmware-linux-nonfree dans /etc/fai/NFSROOT et reconstruisez l’initrd en appelant fai-make-nfsroot -k. Vous pouvez également ajouter un pilote à /srv/fai/nfsroot/etc/dracut.conf dans la ligne add_drivers+=.

    -

    C’est le message d’erreur que vous verrez, -lorsque votre carte réseau fonctionne, mais le serveur d’installation -n’exporte pas le répertoire nfsroot vers les clients d’installation. -Cela est souvent dû aux permissions NFS manquantes du côté serveur.

    -
    -
    -
    Starting dhcp for interface eth0
    -dhcp: PREINIT eth0 up
    -dhcp: BOND setting eth
    -mount.nfs: access denied by server while mounting 192.168.33.250:/srv/fai/nfsroot
    -.
    -.
    -dracut Warning: Could not boot
    -.
    -Dropping to debug shell
    -dracut:/#
    -
    -

    Maintenant, vous êtes à l’intérieur du shell d’urgence de l’initrd qui a été créé par dracut(8). - Vous obtiendrez une invite du shell et pourrez consulter les fichiers -journaux. Pour plus d’informations sur le débogage du processus de -démarrage précoce à l’aide de dracut, consultez dracut.cmdline(7)

    -

    Utilisez la commande suivante sur le serveur -d’installation pour voir quels répertoires sont exportés à partir du -serveur d’installation (nommé faiserver):

    -
    -
    -
    $ showmount -e faiserver
    -
    -
    -
    -
    -
    -

    1. Solaris 8 Advanced Installation Guide at https://docs.oracle.com/cd/E19455-01/806-0957/806-0957.pdf
    3. fai-kvm a besoin de beaucoup de ram pour la vm, à cause de la mise en cache de /var, 2GB sont OK
    4. Cette installation consommera environ 2 Go d’espace dans /tmp.
    5. - Il est également possible d’utiliser uniquement le fichier de -configuration avec la plus haute priorité puisque l’ordre des classes -définit une priorité de bas à haut dans la liste des classes.
    6. Si vous souhaitez utiliser un miroir plus rapide, ajustez l’URL dans /etc/fai/apt/sources.list et FAI_DEBOOTSTRAP in /etc/fai/nfsroot.conf avant d’appeler fai-setup.
    7. Ceci appellera fai-make-nfsroot(8) interne.
    8. Ces fichiers ne doivent pas appartenir au compte racine.
    9. Vous pouvez également ajouter ceci dans votre système de noms de domaine (DNS)
    10. Puisque le système de fichiers racine sur les clients est monté via NFS, fai est localisé in /srv/fai/nfsroot/usr/sbin sur le servuer d’installation.
    11. $FAI est une variable interne utilisée par les scripts FAI. Par défaut, le chemin est /var/lib/fai/config.
    12. /srv/fai/nfsroot depuis le serveur d’installation via NFS
    13. Il a été défini sur la ligne de commande du noyau
    14. /var/lib/fai/config
    15. /var/log/fai/localhost/install/ est un lien vers ce répertoire.
    16. - Je recommande d'écrire les adresses MAC (les trois derniers octets -suffiront si vous avez des cartes réseau du même fournisseur) et le nom -d’hôte à l’avant de chaque châssis.
    17. Pour le débogage, il peut être utile d’entrer l’environnement chroot manuellement à l’aide de cette commande. faiserver# chroot /srv/fai/nfsroot bash
    18. Vous pouvez trouver le script dans /usr/share/doc/fai-doc/examples/utils/ Version 5.3
    - - - - \ No newline at end of file diff --git a/doc/fr-old/fai_guide.txt b/doc/fr-old/fai_guide.txt deleted file mode 100644 index 3fbbe743c..000000000 --- a/doc/fr-old/fai_guide.txt +++ /dev/null @@ -1,2830 +0,0 @@ -[[header]] -== FAI Guide (Fully Automatic Installation) - -[#author]#Thomas Lange# + -[#email]#`+<+`mailto:lange@informatik.uni-koeln.de[`+lange@informatik.uni-koeln.de+`]`+>+`# + -[#revnumber]#version 5.3,# [#revdate]#16 Jan 2017# - -[[toc]] -[[toctitle]] -Table of Contents - -*JavaScript must be enabled in your browser to display the table of -contents.* - -link:#_abstrait[Abstrait] - -link:#_a_id_introduction_a_introduction[Introduction] - -link:#_a_id_disponibilité_a_disponibilité[Disponibilité] - -link:#_a_id_motivation_a_motivation[Motivation] - -link:#_a_id_work_a_comment_fonctionne_fai[Comment fonctionne FAI] - -link:#_a_id_features_a_caractéristiques[Caractéristiques] - -link:#_le_temps_de_l_8217_installation[Le temps de l’installation] - -link:#_a_id_impatient_a_quickstart_pour_l_8217_utilisateur_impatient[Quickstart -- Pour l’utilisateur impatient] - -link:#_a_id_first_a_ma_première_installation[Ma première installation] - -link:#_a_id_cdserver_a_mon_premier_serveur_d_8217_installation[Mon -premier serveur d’installation] - -link:#_a_id_overview_a_vue_d_8217_ensemble_et_concepts[Vue d’ensemble et -concepts] - -link:#_a_id_terms_a_conditions_générales[Conditions Générales] - -link:#_a_id_classc_a_le_concept_de_classe[Le concept de classe] - -link:#_a_id_setup_a_configurer_votre_faiserver[Configurer votre -faiserver] - -link:#_installer_les_paquetages_fai[Installer les paquetages FAI] - -link:#_créez_le_nfsroot[Créez le nfsroot] - -link:#_création_de_l_8217_espace_de_configuration[Création de l’espace -de configuration] - -link:#_configurer_les_démons_réseau[Configurer les démons réseau] - -link:#_a_id_bootdhcp_a_configuration_du_démon_dhcp[Configuration du -démon DHCP] - -link:#_ajout_d_8217_une_entrée_d_8217_hôte_au_dhcp[Ajout d’une entrée -d’hôte au DHCP] - -link:#_tftp[TFTP] - -link:#_nfs[NFS] - -link:#_création_de_la_configuration_pxelinux[Création de la -configuration PXELINUX] - -link:#_a_id_custom_server_a_serveur_personnalisé[Serveur personnalisé] - -link:#_a_id_plan_a_planifiez_votre_installation[Planifiez votre -installation] - -link:#_a_id_c3_a_l_8217_espace_de_configuration_et_ses_sous_répertoires[L’espace -de configuration et ses sous-répertoires] - -link:#_a_id_defining_classes_a_définition_des_classes[Définition des -classes] - -link:#_a_id_classvariables_a_définition_des_variables[Définition des -Variables] - -link:#_a_id_diskconfig_a_configuration_du_disque_dur[Configuration du -disque dur] - -link:#_a_id_extrbase_a_extraction_du_fichier_de_base[Extraction du -fichier de base] - -link:#_a_id_debconf_a_debconf_préconfiguration[Debconf préconfiguration] - -link:#_a_id_repository_a_l_8217_accès_au_dépôt_de_paquetages[L’Accès au -dépôt de paquetages] - -link:#_a_id_packageconfig_a_configuration_du_progiciel[configuration du -progiciel] - -link:#_a_id_cscripts_a_scripts_de_personnalisation[Scripts de -personnalisation] - -link:#_a_id_shell_a_scripts_shell[Scripts shell] - -link:#_a_id_cfengine_a_scripts_cfengine[Scripts cfengine] - -link:#_a_id_hooks_a_hooks[Hooks] - -link:#_a_id_faiflags_a_fai_flags[FAI flags] - -link:#_a_id_install_a_fai_installe_votre_planification[FAI installe -votre planification] - -link:#_la_première_partie_d_8217_une_installation[La première partie -d’une installation] - -link:#_a_id_bootmesg_a_messages_de_boot[Messages de boot] - -link:#_a_id_reboot_a_redémarrage_de_l_8217_ordinateur_dans_le_nouveau_système[Redémarrage -de l’ordinateur dans le nouveau système] - -link:#_a_id_isetup_a_démarrage_de_fai_tâche_confdir[Démarrage de FAI -(tâche confdir)] - -link:#_a_id_iclass_a_définition_de_classes_et_de_variables_tâches_defclass_et_defvar[Définition -de classes et de variables (tâches defclass et defvar)] - -link:#_a_id_ipartition_a_partitionnement_de_disques_locaux_création_de_systèmes_de_fichiers_tâches_de_partitionnement[Partitionnement -de disques locaux, création de systèmes de fichiers (tâches de -partitionnement)] - -link:#_a_id_ipreseed_a_préréglage_debconf_tâche_debconf[Préréglage -Debconf (tâche debconf)] - -link:#_a_id_ipackages_a_installation_de_progiciels_tâche_instsoft[Installation -de progiciels (tâche instsoft)] - -link:#_a_id_icscripts_a_personnalisation_spécifique_au_site_task_configure[Personnalisation -spécifique au site (task configure)] - -link:#_a_id_isavelog_a_enregistrement_des_fichiers_journaux_tâche_savelog[Enregistrement -des fichiers journaux (tâche savelog)] - -link:#_a_id_ireboot_a_redémarrez_le_nouveau_système_installé[Redémarrez -le nouveau système installé] - -link:#_a_id_advanced_a_chapitre_avancés_de_fai[Chapitre avancés de FAI] - -link:#_a_id_checkbootp_a_vérification_des_paramètres_reçus_des_serveurs_dhcp[Vérification -des paramètres reçus des serveurs DHCP] - -link:#_a_id_fai_monitor_a_surveillance_de_plusieurs_installations_clientes[Surveillance -de plusieurs installations clientes] - -link:#_a_id_mac_a_collecte_d_8217_adresses_ethernet_pour_plusieurs_hôtes[Collecte -d’adresses Ethernet pour plusieurs hôtes] - -link:#_débogage_du_trafic_réseau[Débogage du trafic réseau] - -link:#_a_id_pxeboot_a_détails_du_démarrage_pxe[Détails du démarrage PXE] - -link:#_a_id_customizing_your_install_server_setup_a_personnalisation_de_la_configuration_de_votre_serveur_d_8217_installation[Personnalisation -de la configuration de votre serveur d’installation] - -link:#_a_id_cdboot_a_création_d_8217_un_cd_fai_ou_d_8217_une_clé_usb[Création -d’un CD FAI ou d’une clé USB] - -link:#_a_id_diskimage_a_création_d_8217_images_de_disque_vm_à_l_8217_aide_de_fai[Création -d’images de disque VM à l’aide de FAI] - -link:#_a_id_sysinfo_a_système_de_sauvetage_fai[Système de sauvetage FAI] - -link:#_a_id_nonfs_a_fai_sans_nfs[FAI sans NFS] - -link:#_a_id_otherdists_a_installation_d_8217_autres_distributions_à_l_8217_aide_d_8217_un_nfsroot_debian[Installation -d’autres distributions à l’aide d’un nfsroot Debian] - -link:#_a_id_dirinstall_a_création_d_8217_environnements_chrooter_et_virtualiser[Création -d’environnements chrooter et virtualiser] - -link:#_a_id_softupdate_a_utilisation_de_fai_pour_les_mises_à_jour[Utilisation -de FAI pour les mises à jour] - -link:#_a_id_archcross_a_comment_installer_un_système_d_8217_exploitation_32_bits_à_partir_d_8217_un_système_d_8217_exploitation_64_bits[Comment -installer un système d’exploitation 32 bits à partir d’un système -d’exploitation 64 bits] - -link:#_a_id_hints_a_divers_conseils_et_détails[Divers conseils et -détails] - -link:#_a_id_tasks_a_la_liste_des_tâches[La liste des tâches] - -link:#_a_id_itests_a_tests_automatisés[Tests automatisés] - -link:#_a_id_autodiscover_a_découvrir_automatiquement[Découvrir -automatiquement] - -link:#_a_id_changeboot_a_modification_du_périphérique_d_8217_amorçage[Modification -du périphérique d’amorçage] - -link:#_a_id_debian_mirror_a_comment_créer_un_miroir_debian_local[Comment -créer un miroir Debian local] - -link:#_petits_conseils[Petits conseils] - -link:#_flag_reboot_fai_flags[flag_reboot (FAI_FLAGS)] - -link:#_centos_reboot[CentOS reboot] - -link:#_a_id_logfiles_a_fichiers_journaux[Fichiers journaux] - -link:#_comment_utiliser_http_pour_le_démarrage_pxe[Comment utiliser HTTP -pour le démarrage PXE] - -link:#_a_id_troubleshoot_a_dépannage[Dépannage] - -link:#_a_id_booterror_a_erreurs_d_8217_amorçage[Erreurs d’amorçage] - -[[content]] -[[_abstrait]] -== Abstrait - -FAI est un système non interactif permettant d’installer, de -personnaliser et de gérer les configurations de systèmes et de logiciels -Linux sur les ordinateurs ainsi que sur les machines virtuelles et les -environnements chroot, des petits réseaux aux grandes infrastructures et -clusters. - -Ce manuel décrit le logiciel d’installation entièrement automatique. -Cela inclut l’installation des paquets, la configuration du serveur, la -création de la configuration et la gestion des erreurs. - -.... - +-----------------------------------------------------------------------+ - | This manual describes FAI 5.3 but most things are also valid for 4.x. | - +-----------------------------------------------------------------------+ -.... - -{empty}(c) 2000-2017 Thomas Lange - -Copyright - -Ce manuel est un logiciel libre; Vous pouvez le redistribuer et / ou le -modifier selon les termes de la Licence Publique Générale GNU publiée -par la Free Software Foundation; Soit la version 2, soit (à votre choix) -toute version ultérieure. - -Ceci est distribué dans l’espoir qu’il sera utile, mais sans aucune -garantie ; Sans même la garantie implicite de qualité marchande ou -d’adaptation à un usage particulier. Pour plus de détails, consultez la -GNU General Public License.< - -Une copie de la GNU General Public License est disponible sous la forme -/usr/share/common-licenses/GPL dans la distribution Debian GNU/Linux ou -sur le World Wide Web sur le site GNU Vous pouvez également l’obtenir en -écrivant à la Free Software Foundation , Inc., 59 Temple Place - Suite -330, Boston, MA 02111-1307, États-Unis. - -[[_a_id_introduction_a_introduction]] -== [#Introduction]####Introduction - -[[_a_id_disponibilité_a_disponibilité]] -=== [#Disponibilité]####Disponibilité - -Page d’accueil:: - http://fai-project.org/[http://fai-project.org] -FAI wiki:: - http://wiki.fai-project.org/[http://wiki.fai-project.org] -Téléchargement:: - http://fai-project.org/download -Entrée pour _sources.list_:: - `+deb http://fai-project.org/download jessie koeln+` -Pages du manuel:: - http://fai-project.org/doc/man/ -Liste de diffusion:: - https://lists.uni-koeln.de/mailman/listinfo/linux-fai -Retour d’information:: - Envoyez vos commentaires et vos commentaires à fai@fai-project.orgou à - la liste de diffusion . -Bogues:: - Utiliser le système de suivi des bogues Debian (BTS) - http://bugs.debian.org/[http://bugs.debian.org] -Changements visibles par l’utilisateur:: - http://fai-project.org/NEWS -Arbre source via git:: - git clone git://github.com/faiproject/fai.git -Voir l’arbre source avec http:: - https://github.com/faiproject/fai - -Les pages man incluent toujours des informations à jour et beaucoup de -détails sur toutes les commandes FAI. Alors, n’oubliez pas de les lire -attentivement. Lisez maintenant ce manuel, puis profitez de -l’installation entièrement automatique et de votre temps économisé. - -[[_a_id_motivation_a_motivation]] -=== [#Motivation]####Motivation - -Avez-vous déjà effectué des installations identiques d’un système -d’exploitation à plusieurs reprises? Souhaitez-vous être en mesure -d’installer un cluster Linux avec des dizaines de nœuds à lui seul? - -Répéter la même tâche encore et encore est ennuyeux - et conduira -certainement à des erreurs. Aussi beaucoup de temps pourrait être sauvé -si les installations ont été faites automatiquement. Un processus -d’installation avec interaction manuelle n’est pas à l'échelle. Mais les -grappes ont l’habitude de croître au fil des ans. Pensez à long terme -plutôt que de planifier quelques mois dans l’avenir. - -En 1999, j’ai dû effectuer une installation d’un cluster Linux avec un -serveur et 16 clients. Puisque j’ai eu beaucoup d’expérience en faisant -des installations automatiques des systèmes d’exploitation de Solaris -sur le matériel de SUN SPARC, l’idée de construire une installation -automatique pour Debian est née. Solaris dispose d’une fonctionnalité -d’installation automatique appelée JumpStart -[.footnote]#[link:#_footnote_1[1]]#. En conjonction avec les scripts -d’auto-installation de Casper Dik [.footnote]#[link:#_footnote_2[2]]#, -Je pourrais sauver beaucoup de temps non seulement pour chaque nouvel -ordinateur de SUN, mais aussi pour la réinstallation des postes de -travail existants. Par exemple, j’ai dû construire un LAN temporaire -avec quatre stations de travail SUN pour une conférence, qui a duré -seulement quelques jours. J’ai retiré ces postes de travail de notre -réseau de recherche habituel et mis en place une nouvelle installation -pour la conférence. Quand il était terminé, j’ai simplement intégré les -postes de travail dans le réseau de recherche, redémarré une seule fois, -et après une demi-heure, tout était opérationnel comme avant. La -configuration de tous les postes de travail était exactement la même -qu’avant la conférence, car tout était effectué par le même processus -d’installation. J’ai également utilisé l’installation automatique pour -réinstaller un poste de travail après un disque dur endommagé avait été -remplacé. Il m’a fallu deux semaines pour recevoir le nouveau disque -dur, mais seulement quelques minutes après l’installation du nouveau -disque, le poste de travail fonctionnait comme avant. Et c’est pourquoi -j’ai choisi d’adapter cette technique à un cluster de PC sous Linux. - -[[_a_id_work_a_comment_fonctionne_fai]] -=== [#work]####Comment fonctionne FAI - -Le client d’installation qui sera installé à l’aide de FAI, est démarré -via une carte réseau ou à partir d’un CD ou d’une clé USB. Il obtient -une adresse IP et démarre un noyau Linux qui monte son système de -fichiers racine via NFS (nfsroot) du serveur d’installation. Une fois le -noyau démarré, le script de démarrage FAI exécute l’installation -automatique qui n’a pas besoin d’interaction. Tout d’abord, les disques -durs seront partitionnés, les systèmes de fichiers seront créés et des -progiciels seront ensuite installés. Après cela, le nouveau système -d’exploitation installé est configuré selon vos besoins locaux en -utilisant quelques scripts. Enfin, le nouveau système d’exploitation -sera démarré à partir du disque local. - -Les détails sur la façon d’installer l’ordinateur (la configuration) -sont stockés dans l’espace de configuration du serveur d’installation. -Les fichiers de configuration sont partagés entre des groupes -d’ordinateurs s’ils sont similaires en utilisant le concept de classe. -Vous n’avez donc pas besoin de créer une configuration pour chaque -nouvel hôte. Par conséquent, FAI est une méthode évolutive pour -installer un gros cluster avec un grand nombre de nœuds même si leur -configuration n’est pas identique. - -FAI peut également être utilisé comme un système de sauvetage ou pour -l’inventaire matériel. Vous pouvez démarrer votre ordinateur, mais il -n’effectuera pas une installation. Au lieu de cela, il exécutera un -Debian GNU / Linux entièrement fonctionnel sans utiliser les disques -durs locaux. Ensuite, vous pouvez effectuer une connexion à distance et -sauvegarder ou restaurer une partition de disque, vérifier un système de -fichiers, inspecter le matériel ou effectuer toute autre tâche. - -[[_a_id_features_a_caractéristiques]] -=== [#features]####Caractéristiques - -* Une installation entièrement automatisée peut être effectuée. -* Très rapide installation sans surveillance. -* Système flexible grâce à un concept de classe simple. -* Mise à jour des systèmes en cours d’exécution sans réinstallation. -* Création facile d’un environnement de virtualisation ou d’un chroot -* Les hôtes peuvent démarrer à partir d’une carte réseau, d’un CD, d’une -clé USB. -* Création simple d’un CD d’installation ou d’une clé USB. -* PXE avec la méthode de démarrage DHCP est pris en charge. -* ReiserFS, ext3 / ext4, btrfs et support de système de fichiers XFS. -* Support logiciel RAID et LVM. -* Détection automatique du matériel. -* Vous pouvez déployer Debian, Ubuntu, CentOS, SuSE, Scientific Linux -* Connexion à distance via ssh lors du processus d’installation -possible. -* Toutes les configurations similaires sont partagées entre tous les -clients d’installation. -* Les fichiers journaux de toutes les installations sont enregistrés sur -le serveur d’installation. -* Les scripts Shell, Perl, Python, Ruby, expect et CFEngine sont pris en -charge lors de l'étape de personnalisation. -* Prise en charge de nombreux protocoles comme NFS, FTP, HTTP, git -* Peut être utilisé comme un système de sauvetage et pour l’inventaire -matériel. -* Prise en charge du client sans disque. -* Ajoutez facilement vos propres fonctions via des hooks ou modifiez le -comportement par défaut. -* Clonage de machines utilisant des images de disque est pris en charge - -[[_le_temps_de_l_8217_installation]] -=== Le temps de l’installation - -Le temps d’installation est déterminé par la quantité de logiciel et la -vitesse du disque dur. Voici quelques exemples de temps. Tous les -clients d’installation avaient une carte réseau 1Gbit installée. - -[width="98%",cols="<28%,^13%,<20%,>26%,>13%",options="header",] -|=== -|CPU |RAM |Disk |Software installed |time -|i7-3770T 2.50GHz |8GB |SSD |6 GB software |8.5 min -|Core-i7 3.2GHz |6GB |SATA disk |4.3GB software |7 min -|Core-i7 3.2GHz |6GB |SATA disk |471 MB software |77sec -|Intel Core2 Duo |2GB |SATA disk |3 GB software |14 min -|=== - -[[_a_id_impatient_a_quickstart_pour_l_8217_utilisateur_impatient]] -== [#impatient]####Quickstart - Pour l’utilisateur impatient - -[[_a_id_first_a_ma_première_installation]] -=== [#first]####Ma première installation - -Sans plus tarder, cette section fournira une démonstration rapide et -facile d’une installation entièrement automatique à l’aide du CD FAI et -d’une machine virtuelle. - -Il suffit de télécharger l' image ISO du CD à partir de -http://fai-project.org/fai-cd et de démarrer votre VM à l’aide de ce CD. -Vous verrez un menu grub où vous pouvez choisir parmi différents types -d’installation. - -Cette installation s’exécutera sans serveur d’installation. -L’installation du CD est identique à celle exécutée dans un -environnement réseau à l’aide du serveur d’installation FAI. - -[[_a_id_cdserver_a_mon_premier_serveur_d_8217_installation]] -=== [#cdserver]####Mon premier serveur d’installation - -S’il vous plaît noter, si vous avez l’intention d’utiliser QEMU/KVM, -vous devez avoir qemu-kvm qemu-utils bridge-utils installés sur la -machine à utiliser fai-mk-network et fai-kvm -[.footnote]#[link:#_footnote_3[3]]#. - -Vous pouvez le faire via - -.... -# apt-get install qemu-kvm qemu-utils bridge-utils -.... - -Si vous avez l’intention d’utiliser VMware ou VirtualBox, assurez-vous -que votre client utilise une connexion réseau pontée. En outre, il n’est -pas possible d’utiliser des interfaces réseau pontées via le réseau sans -fil, car la plupart des cartes réseau WiFi ne prennent pas en charge -cette fonctionnalité. - -our configurer votre propre serveur FAI, nous vous recommandons de créer -un réseau de test sur votre ordinateur et d’utiliser KVM. Pour créer ce -réseau privé, il ya le script fai-mk-network (dans le paquet -fai-server). Il configure un pont logiciel avec plusieurs dispositifs de -dérivation qui appartiennent à l’utilisateur. - -.... -fai-mk-network -.... - -Après cela, vous pouvez utiliser fai-kvm (-h vous aidera) pour démarrer -des machines virtuelles en utilisant KVM qui sont connectés à ce réseau -privé. Fais attention. Par défaut, fai-kvm créera les images de disque -pour les machines `+/tmp+`, qui est un disque RAM sur la plupart des -systèmes. Il n’y a aucun problème à créer une image de disque vide de -20G dans /tmp (même si cette partition est de 4 Go de taille), mais -alors que la VM écrit des données sur son disque, cela commencera à -consommer de l’espace dans `+/tmp+`. - -Démarrez le premier hôte virtuel, qui deviendra le serveur FAI -[.footnote]#[link:#_footnote_4[4]]#: - -.... -fai-kvm -Vn -s20 -u 1 cd fai-cd.iso -.... - -Dans le menu grub faiserver,`+faiserver, fixed IP+`. Cela va installer -un hôte appelé faiserver avec IP 192.168.33.250 qui contient tous les -logiciels nécessaires pour un serveur FAI. Il configurera également un -cache de paquets local (en utilisant apt-cacher-ng). Une fois -l’installation terminée, redémarrez la machine. Lors du premier -démarrage du nouveau système, il configurera automatiquement le nfsroot. -Cela peut prendre quelques minutes. - -Après cela, vous pouvez démarrer des hôtes supplémentaires en utilisant -le démarrage réseau. Pour chaque nouvel hôte, vous devez utiliser une -valeur différente pour `+-u+`, qui sera utilisée pour générer des -adresses MAC différentes et utiliser des noms de fichier d’image de -disque différents. - -.... -fai-kvm -Vn -u 2 pxe -.... - -Ces clients d’installation vous montreront un menu, où vous pouvez -sélectionner le type d’installation que vous souhaitez effectuer. Si le -client d’installation ne trouve pas le serveur, c’est généralement parce -que fai-monitor ne fonctionne plus. Cela peut se produire si vous -redémarrez le faiserver après l’installation. Pour remédier à cela, -exécutez simplement fai-monitor sur le faiserver et relancez le -démarrage du client. - -Un autre client pourrait être lancé avec: - -.... -fai-kvm -Vn -u 3 pxe -.... - -Vous pouvez démarrer autant de machines dans le réseau que les -périphériques de prise sont disponibles. Toutes ces machines peuvent se -connecter à l’Internet extérieur, mais sont seulement accessibles à -partir de votre machine hôte. - -[[_a_id_overview_a_vue_d_8217_ensemble_et_concepts]] -== [#overview]####Vue d’ensemble et concepts - -FAI est un système non interactif permettant d’installer, de -personnaliser et de gérer les configurations de systèmes et de logiciels -Linux sur les ordinateurs ainsi que sur les machines virtuelles et les -environnements chroot, des petits réseaux aux grandes infrastructures et -clusters. Vous pouvez prendre un ou plusieurs PC vierges, mettre sous -tension et après quelques minutes, Linux est installé, configuré et -exécuté sur l’ensemble du cluster, sans aucune interaction nécessaire. -Ainsi, il s’agit d’une méthode évolutive pour installer et mettre à jour -un cluster sans surveillance avec peu d’efforts impliqués. FAI utilise -le système d’exploitation Linux et une collection de scripts shell et -Perl pour le processus d’installation. Les modifications apportées aux -fichiers de configuration du système d’exploitation peuvent être -effectuées par CFEngine, shell (bash et zsh), Perl, Python, Ruby et -attendent des scripts. - -Le groupe cible de FAI sont des administrateurs système qui doivent -installer Linux sur une ou même des centaines d’ordinateurs. Parce qu’il -s’agit d’un outil d’installation à usage général, il peut être utilisé -pour l’installation d’un cluster Beowulf, d’une batterie de rendu ou -d’un laboratoire Linux ou d’une salle de classe. De plus, des réseaux -Linux de grande envergure avec différents matériels ou différentes -exigences d’installation sont faciles à établir à l’aide de FAI. Mais -n’oubliez pas de planifier votre installation. Le chapitre -link:#plan[[plan]] contient quelques conseils utiles pour ce sujet. - -[[_a_id_terms_a_conditions_générales]] -=== [#terms]## Conditions Générales - -Premièrement, certains termes utilisés dans ce manuel sont décrits. - -Installer le serveur:: - Il fournit les services DHCP, TFTP et NFS ainsi que les données de - configuration pour tous les clients d’installation. Dans les exemples - de ce manuel, cet hôte s’appelle _faiserver_. L’hôte où le package - _fai-server_ est installé. -Installer le client:: - Un hôte qui sera installé à l’aide de FAI et une configuration fournie - par le serveur d’installation. Aussi appelé client pour courte. Dans - ce manuel, les hôtes d’exemple sont appelés demohost, xfcehost, - gnomehost … Cet ordinateur doit démarrer à partir de son interface - réseau à l’aide de PXE. -Espace de configuration:: - Une structure de sous-répertoire contenant plusieurs fichiers. Ces - fichiers décrivent les détails de la manière dont l’installation des - clients sera effectuée. Toutes les données de configuration sont - stockées ici. Il est également appelé config space pour le court. Il - comprend des informations sur: - + - * Disposition du disque dur dans un format similaire à fstab - * Systèmes de fichiers locaux, leurs types, points de montage et - options de montage - * Logiciels - * Disposition du clavier, fuseau horaire, configuration Xorg, systèmes - de fichiers distants, comptes utilisateurs, imprimantes … - + - Le package _fai-doc_ inclut un exemple d’espace de configuration - incluant des exemples pour les hôtes utilisant l’environnement XFCE et - GNOME parmi d’autres exemples. -nfsroot, NFS-Root:: - Un système de fichiers situé sur le serveur d’installation. Pendant le - processus d’installation, c’est le système de fichiers complet pour - les clients d’installation. Tous les clients partagent le même - nfsroot, qu’ils montent en lecture seule. Le nfsroot a besoin - d’environ 690 Mo d’espace disque libre. -TFTP:: - Sert aux clients l’initrd et le noyau utilisés pour le processus - d’installation. Avec le système de fichiers servi par NFS, ces deux - composent un OS temporaire dans lequel les installations sont - exécutées. -Classes FAI:: - Les classes sont des noms qui déterminent quel fichier de - configuration est sélectionné. Si un client appartient à la classe - WEBSERVER, il sera configuré en tant que serveur Web, la classe - DESKTOP pour, par exemple, détermine les progiciels qui seront - installés. -profil:: - Un profil FAI est juste une liste de classes FAI assiged à un nom de - profil, qui est étendu par une description de ce profil. C’est-à-dire - que l’on peut avoir deux profils "Webserver", l’un incluant la classe - APACHE, y compris la classe NGINX, pour ensuite installer la solution - webserver respective. -les tâches:: - L’installation d’un client se compose de plusieurs parties, appelées - tâches. Les tâches sont des sous-programmes prédéfinis qui effectuent - une certaine partie de la FAI. Les tâches FAI suivantes sont exécutées - au cours d’une installation sur les clients d’installation. - -confdir # get the config space setup # some initialization, start sshd -on demand defclass # define FAI classes defvar # define variables action -# evaluate FAI_ACTION install # Start the installation partition # -partition the harddisks, create file systems mountdisks # mount the file -systems extrbase # extract the base.tar.xz debconf # do the Debian -debconf preseeding repository # prepare access to the package repository -updatebase # Set up package tools and update packages instsoft # install -software packages configure # call customization scripts finish # do -some cleanup, show installation statistics tests # call tests if defined -chboot # call fai-chboot on the install server savelog # save log files -to local and remote location faiend # reboot host, eject CD if needed - -Il s’agit de tâches qui ne sont exécutées que lorsqu’une action -différente est exécutée - -dirinstall # install a chroot environment softupdate # only do the -system configuration sysinfo # print detailed system information -inventory # print short hardware inventory list - -Pour une description plus détaillée des _tâches_ , voir -link:#tasks[[tasks]]. - -Notez que vous n'êtes pas limité aux tâches FAI. Vous pouvez également -définir des programmes ou des scripts supplémentaires qui seront -exécutés à certaines occasions. On les appelle des _hooks_. - -hooks:: - Les Hooks sont des plugins, ils peuvent ajouter des fonctionnalités - supplémentaires au processus d’installation ou même remplacer des - tâches entières de FAI. Les Hooks sont expliqués en détail dans - link:#hooks[[hooks]]. - -[[_a_id_classc_a_le_concept_de_classe]] -=== [#classc]####Le concept de classe - -Les classes sont utilisées dans presque toutes les tâches de -l’installation. Les classes déterminent quels fichiers de configuration -choisir parmi une liste d’alternatives disponibles. Pour déterminer les -fichiers de configuration à utiliser, FAI recherche la liste des classes -définies et utilise tous les fichiers de configuration correspondant à -un nom de classe [.footnote]#[link:#_footnote_5[5]]#. La boucle suivante -implémente cette fonction en pseudo code shell: - -.... -for class in $all_classes; do - if [ -r $config_dir/$class ]; then # if a file with name $class exists - your_command $config_dir/$class # call a command with this file name - # exit if only the first matching file is needed - fi -done -.... - -La caractéristique très intéressante de ceci est que vous pouvez ajouter -une nouvelle alternative de configuration et elle sera automatiquement -utilisée par FAI sans changer le code, si le fichier de configuration -utilise un nom de classe. - -C’est parce que la boucle détecte automatiquement les nouveaux fichiers -de configuration qui doivent être utilisés. L’idée d’utiliser des -classes en général et d’utiliser certains fichiers correspondant à un -nom de classe pour une configuration est adoptée à partir des scripts -d’installation par Casper Dik pour Solaris. Cette technique s’est avérée -très utile et facile. - -Vous pouvez regrouper plusieurs hôtes partageant les mêmes fichiers de -configuration en utilisant la même classe. Vous pouvez également diviser -l’ensemble des données de configuration pour tous les clients en -plusieurs classes et les utiliser comme des briques de lego et -construire la configuration entière pour un seul client en assemblant -les briques ensemble. - -Si un client appartient à la classe _A_, nous disons que la classe _A_ -est définie pour ce client. Une classe n’a pas de valeur, elle est juste -définie ou non définie. - -Les classes déterminent comment l’installation est effectuée. Par -exemple, un client d’installation peut être configuré pour obtenir le -bureau XFCE en y ajoutant simplement la classe _XFCE_ . Naturellement, -des configurations plus granulaires sont également possibles. Par -exemple, les classes peuvent décrire comment le disque dur doit être -partitionné, ils peuvent définir quels paquets logiciels seront -installés ou quelles étapes de personnalisation seront exécutées. - -Souvent, une configuration client est créée en modifiant ou en ajoutant -uniquement les classes auxquelles ce client appartient, ce qui rend -l’installation d’un nouveau client très facile. Ainsi, aucune -information supplémentaire ne doit être ajoutée à l’espace de -configuration si les classes existantes suffisent à vos besoins. - -Comme vous pouvez le voir, les classes sont un pilier central de la -personnalisation de votre espace de configuration et de l’installation -de votre client. Pour définir vos propres classes, reportez-vous à -link:#defining%20classes[[defining classes]]. - -[[_a_id_setup_a_configurer_votre_faiserver]] -== [#setup]####Configurer votre faiserver - -Voici comment configurer le serveur d’installation en quelques minutes. -Les étapes suivantes sont nécessaires: - -. Configurer le serveur d’installation -+ -.. Installer des packages FAI -.. Créez le nfsroot -.. Copiez les exemples dans l’espace de configuration -.. Configurer les démons réseau -.. Créer les configurations PXELINUX -. Démarrage et installation des clients - -[[_installer_les_paquetages_fai]] -=== Installer les paquetages FAI - -* Installez la clé du référentiel de package de projet FAI: -* Ajoutez l’URL du référentiel de packages du projet FAI. -* Installez le paquet fai-quickstart sur votre serveur d' installation . - -.... -# wget -O - http://fai-project.org/download/074BCDE4.asc | apt-key add - -# echo "deb http://fai-project.org/download jessie koeln" > /etc/apt/sources.list.d/fai.list -# apt-get update -# aptitude install fai-quickstart -.... - -Cela installera également les paquets pour les démons de serveur DHCP, -TFTP et NFS. - -[[_créez_le_nfsroot]] -=== Créez le nfsroot - -* Activez également le référentiel de package du projet FAI dans un -autre fichier _sources.list_ qui est utilisé lors de la construction du -nfsroot. Ensuite, activez l’utilisateur de journal pour FAI. - -.... -# sed -i -e 's/^#deb/deb/' /etc/fai/apt/sources.list -# sed -i -e 's/#LOGUSER/LOGUSER/' /etc/fai/fai.conf -.... - -* Par défaut, FAI utilise -http://httpredir.debian.org/[http://httpredir.debian.org] comme mirror -de paquets, qui devrait tenter de trouver un référentiel de paquets -rapide pour vous. [.footnote]#[link:#_footnote_6[6]]# Maintenant, nous -pouvons exécuter `+fai-setup(8)+` [.footnote]#[link:#_footnote_7[7]]# Et -vérifier si tout s’est bien passé. Le fichier journal est écrit dans -/var/log/fai/fai-setup.log. - -.... -# fai-setup -v -.... - -* Ce sont quelques-unes des lignes que vous verrez à la fin de fai-setup -. Un exemple complet de fai-setup.log est disponible sur la page Web FAI -à l’adresse http://fai-project.org/logs/fai-setup.log. - -.... -FAI packages and related packages inside the nfsroot: -dracut 044+189-2 -dracut-network 044+189-2 -fai-client 5.3.3~bpo8+2 -fai-nfsroot 5.3.3~bpo8+2 -fai-setup-storage 5.3.3~bpo8+2 -Waiting for background jobs to finish -fai-make-nfsroot finished properly. -Log file written to /var/log/fai/fai-make-nfsroot.log -Adding line to /etc/exports: /srv/fai/config 192.168.33.250/25(async,ro,no_subtree_check) -Adding line to /etc/exports: /srv/fai/nfsroot 192.168.33.250/25(async,ro,no_subtree_check,no_root_squash) -Reloading nfs-kernel-server configuration (via systemctl): nfs-kernel-server.service. - - You have no FAI configuration space yet. Copy the simple examples with: - cp -a /usr/share/doc/fai-doc/examples/simple/* /srv/fai/config - Then change the configuration files to meet your local needs. -Please don't forget to fill out the FAI questionnaire after you've finished your project with FAI. - -FAI setup finished. -Log file written to /var/log/fai/fai-setup.log -.... - -* Fai-setup a créé le LOGUSER, le nfsroot et a ajouté des lignes -supplémentaires à _/etc/exports_. Les sous-répertoires ajoutés à -_/etc/exports_ sont exportés via NFS v3, de sorte que tous les clients -d’installation dans le même sous-réseau peuvent les monter via NFS. - -[[_création_de_l_8217_espace_de_configuration]] -=== Création de l’espace de configuration - -Installez les exemples simples dans l’espace de configuration -[.footnote]#[link:#_footnote_8[8]]#. - -.... -$ cp -a /usr/share/doc/fai-doc/examples/simple/* /srv/fai/config/ -.... - -Ces exemples contiennent la configuration pour certains hôtes d’exemple. -Selon le nom d’hôte utilisé, votre ordinateur sera configuré comme suit: - -demohost:: - Une machine qui n’a besoin que d’un petit disque dur. Cette machine - est configurée avec le réseau en tant que client DHCP, et une démo de - compte est créée. -xfcehost:: - Un bureau XFCE est installé, utilisant LVM, et la démo du compte est - créée. -gnomehost:: - Un bureau GNOME est installé et la démo du compte est créée. -other host names:: - Les hôtes disposant d’un autre nom d’hôte utiliseront notamment les - classes FAIBASE, DHCPC et GRUB. - -Tous les hôtes auront un compte appelé demo avec mot de passe _fai_. Le -compte root a également le mot de passe _fai_. - -Si l’indicateur FAI `+menu+` est ajouté, au lieu d’utiliser le nom -d’hôte pour déterminer le type d’installation, un menu est présenté et -l’utilisateur peut choisir un profil pour l’installation. - -[[_configurer_les_démons_réseau]] -=== Configurer les démons réseau - -Pour démarrer le client d’installation via PXE, le serveur -d’installation a besoin d’un DHCP et d’un démon TFTP en cours -d’exécution. Le paquet _fai-quickstart_ a déjà installé les progiciels -pour ces daemons. En outre, le paquetage du serveur NFS pour -l’exportation du nfsroot et de l’espace de configuration a été installé. - -[[_a_id_bootdhcp_a_configuration_du_démon_dhcp]] -==== [#bootdhcp]####Configuration du démon DHCP - -déalement, votre faiserver doit également être votre serveur DHCP. Si ce -n’est pas le cas, demandez à l’administrateur responsable du serveur -DHCP de le configurer conformément à cette section. En option, il est -possible d'éviter cela en utilisant la fonctionnalité -link:#autodiscover[[autodiscover]] diffusée dans FAI 5.0. - -n exemple pour `+dhcpd.conf(5)+` est fourni avec le paquet _fai-doc_. -Commencez à utiliser cet exemple et regardez toutes les options qui y -sont utilisées. - -.... -# cp /usr/share/doc/fai-doc/examples/etc/dhcpd.conf /etc/dhcp/ -.... - -Les seules informations spécifiques FAI contenues dans ce fichier de -configuration sont de définir le `+filename+` de `+fai/pxelinux.0+` et -de définir `+next-server+` et `+server-name+` sur le nom de votre -serveur d’install . Toutes les autres informations sont uniquement des -données liées au réseau, qui est utilisé dans presque toutes les -configurations DHCP. Ajustez ces paramètres de réseau à vos besoins -locaux. - -.... -deny unknown-clients; -option dhcp-max-message-size 2048; -use-host-decl-names on; - -subnet 192.168.33.0 netmask 255.255.255.0 { - option routers 192.168.33.250; - option domain-name "my.example"; - option domain-name-servers 192.168.33.250; - option time-servers faiserver; - option ntp-servers faiserver; - server-name faiserver; - next-server faiserver; - filename "fai/pxelinux.0"; -} -.... - -Si vous apportez des modifications à la configuration DHCP, vous devez -redémarrer le démon. - -.... -# /etc/init.d/isc-dhcp-server restart -.... - -Si vous disposez de plusieurs interfaces réseau, vous pouvez définir -l’interface que le serveur écoutera dans _/etc/default/isc-dhcp-server_. -Par défaut, le démon DHCP écrit ses messages de journalisation dans -_/var/log/daemon.log_. - -[[_ajout_d_8217_une_entrée_d_8217_hôte_au_dhcp]] -==== Ajout d’une entrée d’hôte au DHCP - -L’adresse MAC est donnée par le matériel de la carte réseau. Pour chaque -client d’installation, vous collectez son adresse MAC et la mappez à une -adresse IP et à un nom d’hôte. Tout d’abord, nous ajoutons l’adresse IP -et le nom d’hôte à _/etc/hosts_ [.footnote]#[link:#_footnote_9[9]]#. - -.... -192.168.33.100 demohost -.... - -Le mappage de l’adresse MAC à l’adresse IP est effectué dans le fichier -_dhcpd.conf_. Ici, nous ajoutons une entrée d’hôte en utilisant la -commande `+dhcp-edit(8)+` . Ici, vous devez remplacer 01:02:03:AB:CD:EF -avec le MAC que vous avez trouvé. - -.... -# dhcp-edit demohost 01:02:03:AB:CD:EF -.... - -Après avoir appelé cette commande, c’est ce que l’entrée hôte dans -dhcpd.conf ressemblera à: - -.... -host demohost {hardware ethernet 01:02:03:AB:CD:EF;fixed-address demohost;} -.... - -[[_tftp]] -==== TFTP - -Normalement, vous n’avez pas besoin d’apporter de modifications à la -configuration dameon TFTP. Les fichiers fournis par TFTP sont situés -dans _/srv/tftp/fai_. - -[[_nfs]] -==== NFS - -La commande `+fai-setup+` a déjà configuré le démon NFS et ajouté -quelques lignes au fichier de configuration _/etc/exports_. Il exporte -les répertoires en utilisant NFS v3. - -[[_création_de_la_configuration_pxelinux]] -=== Création de la configuration PXELINUX - -La dernière étape avant de démarrer votre client pour la première fois -est de spécifier quelle configuration le client doit démarrer lors de -l’amorçage PXE. Nous fai-chboot(8) la commande `+fai-chboot(8)+` pour -créer une configuration pxelinux pour chaque client d’installation. Cela -comprend des informations sur le noyau, l’initrd, l’espace de -configuration et certains paramètres d’amorçage. Vous devriez lire la -page de manuel, qui vous donne quelques bons exemples. Voici la commande -pour démarrer l’installation de l’hôte demohost. - -.... -$ fai-chboot -IFv -u nfs://faiserver/srv/fai/config demohost -Booting kernel vmlinuz-3.16.0-4-amd64 - append initrd=initrd.img-3.16.0-4-amd64 ip=dhcp - FAI_FLAGS=verbose,sshd,createvt - FAI_CONFIG_SRC=nfs://faiserver/srv/fai/config - -demohost has 192.168.33.100 in hex C0A82164 -Writing file /srv/tftp/fai/pxelinux.cfg/C0A82164 for demohost -.... - -À ce stade, vous devriez avoir une configuration faiserver de travail et -vos clients devraient démarrer dans FAI et être en mesure d’installer -l’un des exemples. - -Dans la section suivante, vous pouvez lire la planification de votre -installation, adapter votre espace de configuration à vos besoins -particuliers et étendre FAI à l’aide de hooks. - -[[_a_id_custom_server_a_serveur_personnalisé]] -=== [#custom server]## Serveur personnalisé - -Le faiseur et sa configuration n’est nullement statique. Il est possible -de personnaliser et d'étendre votre serveur. Pour cela, reportez-vous à -la section -link:#Customizing%20your%20install%20server%20setup[[Customizing your -install server setup]] dans link:#advanced[[advanced]]. - -[[_a_id_plan_a_planifiez_votre_installation]] -== [#plan]####Planifiez votre installation - -Avant de commencer votre installation, vous devriez investir beaucoup de -temps dans la planification de votre installation. Une fois que vous -êtes satisfait de votre concept d’installation, FAI peut faire toutes -les tâches ennuyeuses et répétitives pour transformer vos plans en -réalité. FAI ne peut pas faire de bonnes installations si votre concept -est imparfait ou manque de quelques détails importants. Commencez à -planifier l’installation en répondant aux questions suivantes: - -* Est-ce que je vais créer un cluster Beowulf ou dois-je installer des -machines de bureau? -* À quoi ressemble ma topologie LAN? -* Ai-je un matériel uniforme? Le matériel sera-t-il uniforme à l’avenir? -* Le matériel a-t-il besoin d’un noyau spécial? -* Comment nommer les hôtes? -* Comment les disques durs locaux doivent-ils être partitionnés? -* Quelles applications seront éxécuté par les utilisateurs? -* Les utilisateurs ont-ils besoin d’un système de mise en file -d’attente? -* Quel logiciel doit être installé? -* Quels démons devraient être lancés, et à quoi devrait ressembler la -configuration? -* Quels systèmes de fichiers distants doivent être montés? -* Comment effectuer les sauvegardes? How should backups be performed? - -Vous devez également penser à des comptes d’utilisateur, des -imprimantes, un système de courrier, des travaux de cron, des cartes -graphiques, l’initialisation double, le NIS, le NTP, le fuseau horaire, -la disposition de clavier, l’exportation et le montage des annuaires via -NFS et beaucoup d’autres choses. Donc, il ya beaucoup à faire avant de -commencer une installation. Et rappelez-vous que la connaissance est le -pouvoir, et c’est à vous de l’utiliser. L’installation et -l’administration sont un processus et non un produit. FAI ne peut pas -faire les choses que vous ne lui dites pas de faire. - -Mais vous ne devez pas commencer à partir de zéro. Examinez les fichiers -et les scripts dans l’espace de configuration. Il ya beaucoup de choses -que vous pouvez utiliser pour votre propre installation. Un bon article -intitulé «Bootstrapping an Infrastructure» avec d’autres aspects de la -construction d’une infrastructure est disponible sur -http://www.infrastructures.org/papers/bootstrap/bootstrap.html - -[[_a_id_c3_a_l_8217_espace_de_configuration_et_ses_sous_répertoires]] -=== [#c3]####L’espace de configuration et ses sous-répertoires - -L’espace de configuration est la collection d’informations sur la façon -exacte d’installer un client. L’espace de configuration central pour -tous les clients d’installation se trouve sur le serveur d’installation -dans _/srv/fai/config_ et ses sous-répertoires. Cela sera monté par les -clients d’installation dans _/var/lib/fai/config_. La commande -d’installation principale `+fai(8)+` utilise tous ces sous-répertoires -dans l’ordre indiqué sauf pour les hooks. - -_class/_:: - Scripts et fichiers pour définir des classes et des variables. -_disk_config/_:: - Fichiers de configuration pour le partitionnement de disque, RAID - logiciel, LVM et création de système de fichiers. -_basefiles/_:: - Normalement , le fichier _base.tar.xz_ (situé à l' intérieur du - nfsroot) est extrait sur le client d’installation après la création - des nouveaux systèmes de fichiers et avant l’installation du package. - Il s’agit d’une image de base minimale, créée juste après avoir appelé - debootstrap lors de la création du nfsroot sur le serveur - d’installation. Si vous voulez installer une autre distribution que la - nfsroot, vous pouvez mettre un fichier tar dans le sous-répertoire - _basefiles/_ et le nommer après une classe. Ensuite, la commande - ‘ftar(8)` est utilisée pour extraire le fichier tar en fonction des - classes définies. Ainsi, le fichier doit être nommé__’ CLASS.tar.xz__ - et non _CLASS.base.tar.xz_ . Cela se fait dans la tâche _extrbase_. - Utilisez cette option si vous souhaitez installer une autre - distribution ou une version différente de celle exécutée pendant - l’installation. - + - Ce fichier de base peut également être reçu en fonction des classes - FAI via HTTP ou FTP en définissant la variable FAI_BASEFILEURL. FAI - téléchargera un fichier CLASSNAME.tar.xz (ou tgz, ou tar.gz, …) à - partir de cette URL, si CLASSNAME correspond à une classe FAI. - + - Exemple: - -.... -FAI_BASEFILEURL=http://fai-project.org/download/basefiles -.... - -Le dossier doit prendre en charge la liste des répertoires. FAI ne -recherchera pas de fichiers potentiellement correspondants. - -Voir le chapitre link:#otherdists[[otherdists]] pour savoir comment -installer différentes distributions. - -_debconf/_:: - Ce répertoire contient toutes les données `+debconf(7)+`. Le format - est le même que celui utilisé par `+debconf-set-selections(8)+`. -_package_config/_:: - Les fichiers contenant des noms de classe contiennent des listes de - progiciels à installer ou à désinstallé par - ‘install_packages(8)`+. Les fichiers nommés +`_`+.asc+`_`+ sont ajoutés à la liste des clés utilisées par apt (à l’aide d’ \'apt-key(8)+` - ) pour les dépôts de paquets approuvés. -_scripts/_:: - Scripts pour la personnalisation de votre site local. Utilisé par - `+fai-do-scripts(1)+`. -_files/_:: - Les Fichiers utilisés par les scripts de personnalisation. La plupart - des fichiers se trouvent dans une structure de sous-arborescence qui - reflète l’arborescence de répertoires ordinaire. Par exemple, les - modèles de _nsswitch.conf_ se trouvent dans - _$FAI/files/etc/nsswitch.conf_ et sont nommés en fonction des classes - auxquelles ils doivent correspondre: - _$FAI/files/etc/nsswitch.conf/NIS_ est la version de - _/etc/nsswitch.conf_ à utiliser pour la classe NIS. Notez que le - contenu du répertoire n’est pas automatiquement copié sur la machine - cible, mais qu’il doit être explicitement copié par des scripts de - personnalisation à l’aide de la commande `+fcopy(8)+` . -_hooks/_:: - Les hooks sont des programmes ou des scripts définis par - l’utilisateur, qui sont appelés pendant le processus d’installation. - cela peut étendre ou remplacer les tâches par défaut. Le nom du - fichier doit être de format _taskname.CLASSNAME[.sh]_. Un hook appelé - `+updatebase.DEBIAN+` est exécuté avant la mise à jour de la tâche - `+updatebase+` et seulement si l’installation du client appartient à - la classe DEBIAN. - -[[_a_id_defining_classes_a_définition_des_classes]] -=== [#defining classes]## Définition des classes - -Il existe différentes possibilités pour définir des classes: . Certaines -classes par défaut sont définies pour chaque hôte: DEFAULT, LAST et son -nom d’hôte. . Les classes peuvent être répertoriées dans un fichier. . -Les classes peuvent être dynamiquement définies par des scripts. - -La dernière option est une fonctionnalité très intéressante, puisque ces -scripts définiront des classes est un moyen très flexible. Par exemple, -plusieurs classes peuvent être définies uniquement si certains matériels -sont identifiés ou si une classe est définie en fonction des -informations de sous-réseau du réseau. - -Tous les noms de classes, sauf le nom d’hôte, sont écrits en -majuscules.ILs ne doivent pas contenir un trait d’union, un dièse, un -Point-Virgule OÜ un point, mais PEUVENT contenir des characters de -soulignement et des Chiffres. - -La Tache _defclass_ Appelle la commande `+fai-class(1)+` pour definir -les classes. Tous les scripts correspondant _^[0-9][0-9]*_ (qui -Commencent Avec Deux Chiffres) Dans le sous-repertoire _$FAI/class_ sont -exécutées afin de definir les classes. Tout ce qui is affiché sur STDOUT -est automatiquement definie Comme une classe. pour Plus d’informations -sur Les définisions de Classe , lire les pages de manuel versent -`+fai-class(1)+`. Le script _50-host-classes_ (voir ci - dessous la -version allégée) est utilisé pour les définir des classes en fonction du -nom d’hôte. - -.... -# use a list of classes for our demo machines -case $HOSTNAME in - demohost) - echo "FAIBASE GRUB DHCPC DEMO" ;; - xfcehost) - echo "FAIBASE GRUB DHCPC DEMO XORG XFCE";; - faiserver) - echo "FAIBASE DEBIAN DHCPC DEMO FAISERVER" ;; - *) - echo "FAIBASE GRUB DHCPC" ;; -esac -.... - -Les noms d’hôtes doivent Rarement Être utilisé Pour Les Fichiers de -configuration dans l’Espace de configuration.à la place une classe Doit -Être definie et ensuite ajouté Pour un hôte Donné. En effet, la Plupart -du Temps les Données de configuration ne sont pas Spécifiques au d’nom -hôte, mais peut etre partager entre differants hôtes./p> - -L’ordre des classes est important car Elle Définit la priorité des -classes de Faible à Élevé. - -[[_a_id_classvariables_a_définition_des_variables]] -=== [#classvariables]####Définition des Variables - -La Tache _defvar_ definit les variables pour l’installation du client. -Les variables sont définies par les scripts Dans la _class/*.var_. -Toutes les variables Globales PEUVENT Être définies Dans _DEFAULT.var_. -Pour certains groupes d’hôtes utiliser un Fichier de classe ou Pour un -seul hôte utiliser le Fichier `+$HOSTNAME+` _.var_ . Ici aussi, il est -utile d'étudier Tous les exemples. - -Les variables suivantes sont utilisées dans les exemples et peuvent etre -aussi utiles pour votre installation: - -FAI_ACTION:: - Réglez les actions que doit éffectuer FAI. Normalement, ceci se fait - par `+fai-chboot(8)+`. Si vous ne pouvez pas utiliser cette commande, - définir la variable dans le script _LAST.var_. -FAI_ALLOW_UNSIGNED:: - Si défini à 1, FAI Permet l’installation de de paquets à partir de - référentiels non Signés. -CONSOLEFONT:: - La police de qui est chargée lors de l’installation par - `+setfont(8)+`. -KEYMAP:: - Définit les Fichiers de mappage du clavier Dans _/usr/share/keymaps_ - et _$FAI/files_. Vous ne Devez pas spécifier le chemin complet, - puisque ce fichier sera localisé automatiquement. -ROOTPW:: - Le mot de passe root chiffré pour le nouveau système. Vous pouvez - utiliser - ‘crypt(3)`+, md5 et d’ Autres types de hachage pour le mot de passe. Utilisez \'mkpasswd(1)+` - pour créer le hachage d’un certain mot de passe. Par exemple, pour - Générer le hachage MD5 pour l’utilisation du mot de passe. - -.... -$ echo "yoursecrectpassword" | mkpasswd -Hmd5 -s -.... - -UTC:: - Réglez l’horloge du matériel à UTC si _UTC=yes_. Sinon, régler - l’horloge à l’heure locale. Voir `+clock(8)+` pour en plus - d’informations. -TIMEZONE:: - Est-ce que le fichier d’initialisation par rapport à - _/usr/share/zoneinfo/_' indique votre fuseau horaire. Par exemple: - _TIMEZONE=Europe/Berlin_. -MODULESLIST:: - Une liste des modules du Noyau qui sont chargés pendent Le démarrage - du nouveau systême (Écrit dans /etc/modules). - -[[_a_id_diskconfig_a_configuration_du_disque_dur]] -=== [#diskconfig]####Configuration du disque dur - -L’outil `+setup-storage(8)+` lit le fichier dans _$FAI/disk_config_ pour -la configuration du disque. Ce fichier décrit comment tous les disques -Locaux devrons etre partitionné, Quels types de Systèmes de Fichiers -doivent etre écris (Comme ext3/4, xfs, btrfs), et où ils seront Montés. -Vous pouvez aussi créer des configurations RAID logiciel et LVM en -Utilisant le Fichier de configuration. Il Est aussi possible de la mise -en Conservation de le partitionnage du disque ou de conserver Les -Donnees sur CERTAINES partitions. - -Pendant le Processus d’installation de tous les Systèmes de Fichiers -Locaux Sont Montés par rapport à _/target_. Par exemple, si vous -Specifiez le Point de montage _/home_ Dans un Fichier de configuration -de disque, ce sera le répertoire _/target/home_ pendant le Processus -d’installation et deviendra _/home_ pour le nouveau systéme Installé. - -[[_a_id_extrbase_a_extraction_du_fichier_de_base]] -=== [#extrbase]####Extraction du fichier de base - -[[_a_id_debconf_a_debconf_préconfiguration]] -=== [#debconf]####Debconf préconfiguration - -[[_a_id_repository_a_l_8217_accès_au_dépôt_de_paquetages]] -=== [#repository]####L’Accès au dépôt de paquetages - -[[_a_id_packageconfig_a_configuration_du_progiciel]] -=== [#packageconfig]####configuration du progiciel - -Avant l’installation de de paquets, FAI va ajouter le contenu de Tous -les Fichiers nommés _package_config/class.asc_ à la liste des clés apt. -Si votre depo locale est signé par votre keyid AB12CD34 vous pouvez -Facilement ajouter cette clé, aussi FAI l’utilisera pendant -l’installation. Utilisez cette commande pour Créer le fichier -_CLASS.asc_: - -.... -faiserver$ gpg -a --export AB12CD34 > /srv/fai/config/package_config/MYCLASS.asc -.... - -Le script `+install_packages(8)+` installe les Logiciels Sélectionnés. -Il lira tous les fichiers de configuration Dans _$FAI/package_config_ -Dont le nom correspond aux classes definie. La syntaxe est tres simple. - -.... -# an example package class - -PACKAGES taskinst -german - -PACKAGES aptitude -adduser netstd ae -less passwd - -PACKAGES remove -gpm xdm - -PACKAGES aptitude GRUB -lilo- grub -.... - -Commentaires Commencent par un Dièse et se terminent à la fin de la -ligne. Chaqué commande de paquetage commence par Le mot _PACKAGES_ Suivi -par un nom de commande, Ce qui correspond à l’outil de package Comme -apt-get, aptitude ou yum par exemple. la commande qui définit la -commandent qui sera utilisé pour installer les paquets nommés après -cette commande. La liste de toutes les commandes disponibles peuvent -Être listé en utilisant _install_packages -H_. Les paquets d’outils pris -en charges son _aptitude, apt-get, smart, yast, yum, rpm, zypper_ - -hold:: - Mettez un paquet en attente. Ce Paquet ne sera pas pris en charges par - dpkg, pas exemple non mis à niveau. -install:: - Installez Tous les paquets (en utilisant `+apt-get+`) Qui sont précise - dans les lignes Suivantes. Si un tiret est ajouté au nom du paquet - (sans espace intermédiaire), le paquet sera supprimé, pas installé. - Tous les noms de paquets sont vérifiées pour les fautes d’orthographe. - Tout paquet qui n’existe pas, seront retiré de la liste des paquets à - l’installation. Soyer donc prudentes de ne pas mal orthographier les - noms de paquets. -install-norec:: - Comme install,mais sans installer les paquets recommandés. -remove:: - Supprimer tous les paquets qui sont péciser dans les lignes suivantes. - Annexer un + au nom du paquet si le paquet doit Être installé. -taskinst:: - Installez tous les paquets appartenant aux tâches qui sont spécifiées - dans les lignes suivantes à l’aide de `+tasksel(1)+`. Vous pouvez - aussi utiliser _aptitude_ pour installer les tâches. -aptitude:: - Installez Ttus les paquets avec la commande `+aptitude+`. Ce sera la - Valeur par défaut à l’avenir et pourra remplacer apt-get et taskinst. - Aptitudes peut aussi installer les paquets -aptitude-r:: - Idem aptitude avec l’option _--with-recommends_. -unpack:: - Télécharge les paquets et décompresse seulement. Ne configure pas le - paquet. -dselect-upgrade:: - Defini la sélections des paquets en Utilisant les lignes suivantes et - installe ou supprime les paquets précisés. Ces lignes sont le résultat - de la commande _dpkg --get-selections_. Il est recommandé de ne pas - utiliser ce format, puisque vous devez aussi specifiez tous les - paquets qui ne sont pas installés en raison d’une dépendance ou - recommandation. Il vaut mieux juste spécifier le paquet que vous - voulez avoir, et de laisser FAI (et apt-get) résoudre les dépendances. - -Plusieurs lignes avec des listes de noms de paquets séparés par des -espaces suivent les directive PACKAGES. Toutes les dépendances sont -résolues. Les paquetages avec suffixe _-_ (par exemple, _lilo-_) seront -supprimés au lieu d'être installés. L’ordre des paquet n’a pas -d’importance. Si vous souhaitez installer des paquets d’une autre -version que la valeur par défaut, vous pouvez ajouter le nom de la -version au nom du paquet comme dans _openoffice.org/etch-backports_. -Vous pouvez également spécifier une certaine version comme _apt=0.3.1_. -Plus d’informations sur ces fonctionnalités sont décrites dans -`+aptitude(8)+`. - -Une ligne qui contient la commande _PRELOADRM_, télécharge un fichier à -l’aide de `+wget(1)+` dans un répertoire avant d’installer les packages. -À l’aide du _file:_ URL, ce fichier est copié de `+$FAI_ROOT+` vers le -répertoire de téléchargement. Par exemple, le package `+realplayer+` a -besoin d’une archive pour installer le logiciel, donc cette archive est -téléchargée dans le répertoire _/root_. Après l’installation des -paquets, ce fichier sera supprimé. Si le fichier ne doit pas être -supprimé, utilisez plutôt la commande _PRELOAD_. - -Il est possible d’ajouter une liste de noms de classes après la commande -pour apt-get. Ainsi, cette commande _PACKAGE_ ne sera exécutée que si la -classe correspondante est définie. Ainsi, vous pouvez combiner de -nombreux petits fichiers dans le fichier DEFAULT. ATTENTION! Utilisez -cette fonctionnalité uniquement dans le fichier DEFAULT pour garder tout -simple. Voir ce fichier pour quelques exemples. - -Si vous souhaitez supprimer un nom de paquet d’une certaine classe -faisait partie avant de cette classe , vous ne devez pas supprimer le -nom du paquet classe, mais plutôt de lui ajouter un tiret (-). Cela -garantira que le paquet est enlevé pendant une mise a jour sur des hôtes -qui étaient Installé en utilisant l’ancienne définition de classe qui -comprenait ce nom de paquet. - -Si vous spécifiez un paquet qui n’existe pas, ce paquet sera supprimé -automatiquement de la liste d’installation uniquement si la commande -_install_ est utilisée. - -[[_a_id_cscripts_a_scripts_de_personnalisation]] -=== [#cscripts]## Scripts de personnalisation - -La commande `+fai-do-scripts(1)+` est appelée pour exécuter tous les -scripts dans ce répertoire. Si un répertoire avec un nom de classe -existe, tous les scripts correspondant à _^[0-9][0-9]*_ sont exécutés -par ordre alphabétique. Il est donc possible d’utiliser des scripts de -différentes langues (shell, cfengine, Perl, Python, Ruby, expect,..) -pour une classe. - -Ces scripts écrivent leur sortie dans différents fichiers journaux, -selon le type de script. Par exemple, Tous les scripts shell écrivent -leur journal dans _shell.log_. - -[[_a_id_shell_a_scripts_shell]] -==== [#shell]####Scripts shell - -La plupart des scripts sont des scripts Bourne shell. Les scripts shell -sont utiles si la tâche de configuration ne doit seulement appeler -certaines commandes shell ou créer un fichier à partir de zéro. Afin de -ne pas écrire beaucoup de scripts courts, il est possible d’utiliser la -commande `+ifclass+` pour tester si certaines classes sont définies. - -.... -ifclass -o A B C -.... - -Vérifie si l’une des classes A, B ou C est définie. L’utilisation de -a -(AND logique) vérifie si toutes les classes d’une liste sont définies. -La commande ifclass C vérifie si seule la classe C est définie. - -Pour copier des fichiers avec des classes, utilisez la commande -`+fcopy(8)+`. Si vous voulez extraire une archive à l’aide de classes, -utilisez `+ftar(8)+`. Pour ajouter des lignes à un fichier de -configuration, utilisez `+ainsl(1)+` au lieu de simplement -`+echo string >> filename+`. - -FAI prend également en charge les scripts _zsh(1)_ pendant la tâche de -personnalisation. Dans les scripts, la variable `+$classes+` contient -une liste séparée par des espaces avec les noms de toutes les classes -définies. - -[[_a_id_cfengine_a_scripts_cfengine]] -==== [#cfengine]####Scripts cfengine - -CFEngine dispose d’un riche ensemble de fonctions pour modifier les -fichiers de configuration existants, par exemple _LocateLineMatching, -ReplaceAll, InsertLine, AppendIfNoSuchLine, HashCommentLinesContaining_. -Mais il ne peut pas traiter les variables qui sont indéfinies. Si une -variable n’est pas définie, l’ensemble du script cfengine s’arrêtera. - -Plus d’informations peuvent être trouvées dans la page de manuel -`+cfengine(8)+` ou sur la page d’accueil cfengine -http://www.cfengine.org/[http://www.cfengine.org]. - -[[_a_id_hooks_a_hooks]] -=== [#hooks]####Hooks - -Les Hooks vous permettent de spécifier des fonctions ou des programmes -qui sont exécutés à certaines étapes du processus d’installation. Avant -qu’une tâche soit appelée, FAI recherche les hooks existants pour cette -tâche et les exécute. Comme on peut s’y attendre, les classes sont -également utilisées lors de l’appel de hooks. Les hooks sont exécutés -pour chaque classe définie. Vous n’avez qu'à créer le hook avec le nom -de la classe désirée et il sera utilisé. Si plusieurs hooks pour une -tâche existent, ils sont appelés dans l’ordre défini par les classes. Si -_debug_ est inclus dans `+$FAI_FLAG+` l’option _-d_ est passée à tous -les hooks, donc vous pouvez déboguer vos propres hooks. Si certaines -tâches par défaut doivent être ignorées, utilisez la sous-routine -_skiptask_ et une liste de tâches par défaut comme paramètres. Dans les -exemples fournis, les hooks de la classe CENTOS ignorent certaines -tâches spécifiques de Debian. - -Le répertoire _$FAI/hooks/_' contient tous les hooks. Un hook est un -fichier exécutable qui suit le nom de tâche _taskname.CLASSNAME[.sh]_' -(par exemple, _repository.CENTOS_ ou _savelog.LAST.sh_), un nom de tâche -et un nom de classe séparés par un point, éventuellement suivi de '.sh. -Le nom de la tâche spécifie la tâche devant précéder l’exécution de ce -hook, si la classe spécifiée est définie pour le client d’installation. -Voir la section link:#tasks[[tasks]] pour une liste complète des tâches -par défaut pouvant être utilisées. - -Un hook du formulaire _hookprefix.classname_ ne peut pas définir de -variables pour le script d’installation, car il s’agit d’un -sous-processus. Mais vous pouvez utiliser n’importe quel exécutable -binaire ou n’importe quel script que vous avez écrit. Les hooks qui ont -le suffixe _.sh_ (par exemple, 'partition.DEFAULT.sh) doivent être des -scripts Bourne shell et sont sourcé. Il est donc possible de redéfinir -des variables pour les scripts d’installation. - -Dans la première partie de FAI, tous les hooks avec le préfixe _confdir_ -sont appelés. Ces hooks ne peuvent pas être localisés dans l’espace de -configuration, car il n’est pas encore disponible. Par conséquent, ces -hooks sont les seuls hooks situés dans `+$nfsroot+`_/$FAI/hooks_ sur le -serveur d’installation. Tous les autres hooks se trouvent dans -_$FAI_CONFIGDIR/hooks_ sur le serveur d’installation. - -Tous les hooks appelés avant la définition des classes ne peuvent -utiliser que les classes suivantes: _DEFAULT $HOSTNAME LAST_. Si un hook -pour la classe _DEFAULT_ doit être appelé uniquement si aucun hook pour -la classe `+$HOSTNAME+` n’est disponible, insérez ces lignes sur le hook -par défaut: - -.... -hookexample.DEFAULT: - -#! /bin/sh - -# skip DEFAULT hook if a hook for $HOSTNAME exists -scriptname=$(basename $0 .DEFAULT) -[-f $FAI/hooks/$scriptname.$HOSTNAME ] && exit -# here follows the actions for class DEFAULT -. -. -.... - -Quelques exemples de ce que les hooks pourraient être utilisés: - -* Charger les modules du noyau avant que les classes soient définies -dans $FAI/class. -* Envoyez un courriel à l’administrateur si l’installation est terminée. -* Installez un client sans disque et sautez le partitionnement de disque -local. -* Jetez un oeil à hooks/debconf.IMAGE pour savoir comment cloner une -machine en utilisant une image de système de fichiers. - -[[_a_id_faiflags_a_fai_flags]] -=== [#faiflags]####FAI flags - -La variable `+$FAI_FLAGS+` contient une liste de flags séparés par des -espaces. Les flags suivants sont connus: - -verbose:: - Créez une sortie verbeuse pendant l’installation. Cela doit toujours - être le premier flag, de sorte que les définitions consécutives des - flags seront affichées verbeusement. -debug:: - Créer une sortie de débogage. Aucune installation sans assistance - n’est effectuée. Pendant l’installation du paquet, vous devez répondre - à toutes les questions des scripts postinstall sur la console du - client. Beaucoup d’informations de débogage seront imprimées. Ce flag - n’est utile que pour les développeurs FAI. -sshd:: - Démarrez le démon ssh pour activer les connexions à distance. Vous - pouvez ensuite vous connecter en tant que root à tous les clients - d’installation pendant l’installation. Le mot de passe par défaut est - fai et peut être modifié en définissant FAI_ROOTPW dans - nfsroot.conf(5). Pour vous connecter à partir de votre serveur vers le - client d’installation (nommé demohost dans cet exemple), utilisez: - -.... -$ ssh root@demohost -Warning: Permanently added 'demohost,192.168.33.100' to the list of known hosts. -root@demohost's password: -.... - -Ce n’est que le mot de passe root pendant le processus d’installation, -pas pour le nouveau système installé. Vous pouvez également vous -connecter sans mot de passe lorsque vous utilisez `+$SSH_IDENTITY+`. - -createvt:: - Créez deux terminaux virtuels et exécutez un bash si _ctrl-c_ est tapé - dans le terminal de console. Vous pouvez accéder aux terminaux - supplémentaires en tapant _Alt-F2_ ou _Alt-F3_. Sinon, aucun terminal - n’est disponible et la saisie _ctrl-c_ va redémarrer le client - d’installation. La définition de ce flag est utile pour le débogage. - Si vous voulez une installation qui ne devrait pas être interruptible, - ne définissez pas ce flag. -menu:: - Cela permet à un menu utilisateur de sélectionner un profil. Tous les - fichiers `+class/*.profile+` sont lus et un menu basé sur des curses - sera créé. -reboot:: - Redémarrez le client d’installation une fois l’installation terminée - sans taper RETURN sur la console. Si ce drapeau n’est pas défini, et - que error.log contient quelque chose, le client d’installation - s’arrêtera et attendra que vous appuyez sur RETURN. Si aucune erreur - ne s’est produite, le client redémarre automatiquement - automatiquement. -halt:: - Arrêtez le client d’installation à la fin de l’installation, au lieu - de redémarrer dans le nouveau système. -initial:: - Utilisé par `+setup-storage(8)+`. Les partitions marquées avec - `+preserve_reinstall+` sont préservées à moins que ce flag ne soit - défini. Souvent, ce drapeau est placé dans un _fichierclass/*.var_ en - utilisant le paramètre _flag_initial=1_. - -[[_a_id_install_a_fai_installe_votre_planification]] -== [#install]## FAI installe votre planification - -[[_la_première_partie_d_8217_une_installation]] -=== La première partie d’une installation - -Après le démarrage du noyau, il monte le système de fichiers racine via -NFS à partir du serveur d’installation et démarre le script -_/usr/sbin/fai_ [.footnote]#[link:#_footnote_10[10]]#. Ce script -contrôle la séquence de l’installation. Aucun autre script dans -_/etc/init.d/_ n’est utilisé. - -L’espace de configuration est rendu disponible via la méthode configurée -(un montage NFS par défaut) du serveur d’installation au chemin défini -dans $FAI [.footnote]#[link:#_footnote_11[11]]#. - -[[_a_id_bootmesg_a_messages_de_boot]] -=== [#bootmesg]####Messages de boot - -Lorsque vous démarrez le client d’installation à partir de la carte -réseau avec PXE, vous obtiendrez des messages comme ceci: - -.... -Managed PC Boot Agent (MBA) v4.00 -Pre-boot eXecution Environment (PXE) v2.00 -DHCP MAC ADDR: 00 A2 A3 04 05 06 -DHCP.../ - -CLIENT MAC ADDR: 00 A2 A3 04 05 06 GUID: 3D6C4552 -CLIENT IP: 192.168.33.100 MASK: 255.255.255.0 DHCP IP: 192.168.33.250 -GATEWAY IP: 192.168.33.1 - -!PXE entry point found (we hope) at 9854:0106 via plan A -UNDI code segment at: 9854 len 5260 -UNDI data segment at: 921D len 63A2 -Getting cached packet 01 02 03 -My Ip address seems to be C0A82164 192.168.33.100 -ip=192.168.33.100:192.168.33.250:192.168.33.1:255.255.255.0 -BOOTIF=01-00-A2-A3-04-05-06 -SYSUUID= -TFTP prefix: fai/ -Trying to load pxelinux.cfg/C0A82164 - -Loading vmlinuz-3.16.0-4-amd64.................. -Loading initrd.img-3.16.0-4-amd64......................ready. -.... - -À ce stade, le client d’installation a réussi à recevoir le réseau -Config via DHCP et le noyau et initrd via TFTP. Il démarre maintenant Le -noyau Linux et l’initrd. Si tout allait bien, l’initrd Monte nfsroot -[.footnote]#[link:#_footnote_12[12]]# Et les scripts FAI sont lancés. La -première chose que vous voyez est le message en rouge de copyright FAI. - -.... - ------------------------------------------------- - Fully Automatic Installation - FAI - - 5.3.3~bpo8+2 (c) 1999-2017 - Thomas Lange - ------------------------------------------------- - -Calling task_confdir -Kernel currently running: Linux 3.16.0-4-amd64 x86_64 GNU/Linux -Kernel parameters: BOOT_IMAGE=vmlinuz-3.16.0-4-amd64 initrd=initrd.img-3.16.0-4-amd64 \ - rw aufs ip=dhcp root=192.168.33.250:/srv/fai/nfsroot FAI_FLAGS=verbose,sshd,createvt\ - FAI_CONFIG_SRC=nfs://faiserver/srv/fai/cskoeln FAI_ACTION=install quiet\ - BOOTIF=01-00-a2-a3-04-05-06 -Reading /tmp/fai/boot.log -FAI_FLAGS: verbose sshd createvt -Setting SERVER=faiserver. Value extracted from FAI_CONFIG_SRC. -FAI_CONFIG_SRC is set to nfs://faiserver/srv/fai/config -Configuration space faiserver:/srv/fai/config mounted to /var/lib/fai/config -Calling task_setup -FAI_FLAGS: verbose sshd createvt -15 Jan 13:22:37 ntpdate[1533]: step time server 192.168.33.250 offset -0.342793 sec -Press ctrl-c to interrupt FAI and to get a shell -Starting FAI execution - 20170115_132237 -Calling task_defclass -fai-class: Defining classes. -Executing /var/lib/fai/config/class/10-base-classes. -10-base-classes OK. -Executing /var/lib/fai/config/class/20-hwdetect.source. -Loading kernel module md-mod -20-hwdetect.source OK. -Executing /var/lib/fai/config/class/50-host-classes. -50-host-classes OK. -List of all classes: DEFAULT LINUX AMD64 FAIBASE DHCPC DEMO GRUB client01 LAST -.... - -Vous pouvez également voir la liste des classes FAI, qui sont définies -pour ce hôte. Cette liste est très importante pour le reste de -l’installation. - -La première tâche est appelée _confdir_, qui est chargée de Accès à -l’espace de configuration. Ici, nous utilisons un montage NFS à partir -de l’installation Comme vous pouvez le voir sur la console (et plus tard -dans les journaux). - -.... -FAI_CONFIG_SRC is set to nfs://faiserver/srv/fai/config -Configuration space faiserver:/srv/fai/config mounted to /var/lib/fai/config -.... - -Avant de lancer l’installation (`+$FAI_ACTION=install+`), l’ordinateur -Bip trois fois. Donc, faites attention quand vous entendez trois bips -mais vous Ne voulez pas effectuer une installation et laisser FAI -effacer toutes vos données sur Le disque local! - -[[_a_id_reboot_a_redémarrage_de_l_8217_ordinateur_dans_le_nouveau_système]] -=== [#reboot]####Redémarrage de l’ordinateur dans le nouveau système - -Pour redémarrer l’ordinateur pendant ou à la fin de l’installation, vous -devez utiliser la commande `+faireboot+` en faveur de la commande de -redémarrage normal. Utilisez aussi `+faireboot+` si vous êtes connecté -depuis la télécommande. Si l’installation n’est pas terminée, utilisez -_faireboot -s_, donc les fichiers journaux sont également copiés sur le -serveur d’installation. - -Si l’installation est terminée, l’ordinateur doit démarrer un petit -système Debian. Vous pouvez vous connecter en tant que _demo_ ou _root_ -avec le mot de passe _fai_. - -[[_a_id_isetup_a_démarrage_de_fai_tâche_confdir]] -=== [#isetup]####Démarrage de FAI (tâche confdir) - -Une fois le client d’installation démarré, seul le script -_/usr/sbin/fai_ est exécuté. Il effectuera une initialisation minimale. -La variable `+$FAI_CONFIG_SRC+` [.footnote]#[link:#_footnote_13[13]]# -est utilisée pour accéder à l’espace de configuration FAI qui est alors -disponible dans le répertoire `+$FAI+` -[.footnote]#[link:#_footnote_14[14]]#. FAI ne se déroulera pas sans -l’espace de configuration. - -[[_a_id_iclass_a_définition_de_classes_et_de_variables_tâches_defclass_et_defvar]] -=== [#iclass]####Définition de classes et de variables (tâches defclass et defvar) - -La commande `+fai-class(1)+` exécute des scripts dans _$FAI/class_ pour -définir des classes. Si les scripts écrivent une chaîne sur stdout, cela -sera défini comme une classe. Lisez tous les détails dans la page de -manuel de `+fai-class(1)+`. - -Après avoir défini les classes, chaque fichier correspondant à _.var_ -avec un préfixe qui correspond à une classe définie provient de -variables définies. Il doit contenir le code shell vaild. - -[[_a_id_ipartition_a_partitionnement_de_disques_locaux_création_de_systèmes_de_fichiers_tâches_de_partitionnement]] -=== [#ipartition]####Partitionnement de disques locaux, création de systèmes de fichiers (tâches de partitionnement) - -Pour le partitionnement du disque, un fichier de configuration de disque -de _$FAI/disk_config_ est sélectionné à l’aide de classes. - -Le format de la configuration du disque est similaire à un fichier -fstab. - -L’outil de partitionnement `+setup-storage(8)+` exécute toutes les -commandes nécessaires à la création de la disposition de la partition du -disque, du RAID logiciel, du LVM et de la création des systèmes de -fichiers. Lisez la page de manuel de `+setup-storage(8)+` pour une -description détaillée et quelques exemples du format. - -[[_a_id_ipreseed_a_préréglage_debconf_tâche_debconf]] -=== [#ipreseed]####Préréglage Debconf (tâche debconf) - -Les fichiers dans _$FAI/debconf_ sont utilisés par `+debconf(7)+` -habituel en présselectionnant si les noms de fichier correspondent à un -nom de classe. - -[[_a_id_ipackages_a_installation_de_progiciels_tâche_instsoft]] -=== [#ipackages]####Installation de progiciels (tâche instsoft) - -La commande `+install_packages(8)+` lit les fichiers de configuration à -partir de _$FAI/package_config_ en classe et installe des progiciels sur -le nouveau système de fichiers. - -Il installe les paquets en utilisant `+apt-get(8)+`, `+aptitude(1)+`, -`+yum+` ou d’autres outils de paquetage sans aucune interaction manuelle -nécessaire. Les paquets sont également résolus par les outils de -paquets. - -Le format des fichiers de configuration est décrit dans -link:#packageconfig[[packageconfig]]. - -[[_a_id_icscripts_a_personnalisation_spécifique_au_site_task_configure]] -=== [#icscripts]####Personnalisation spécifique au site (task configure) - -Souvent, les configurations par défaut des progiciels ne répondent pas à -vos besoins spécifiques au site. Vous pouvez appeler des scripts -arbitraires qui ajustent la configuration du système. Par conséquent, la -commande `+fai-do-scripts(1)+` exécute des scripts dans _$FAI/scripts_ -d’une manière basée sur la classe. Il est possible d’avoir plusieurs -scripts de différents types (shell, cfengine, …) à exécuter pour une -classe. - -L’ensemble de scripts par défaut dans _$FAI/scripts_ inclut des exemples -d’installation de machines Debian et CentOS. Ils définissent le mot de -passe root, ajoutent un compte utilisateur démo, paramétrent le fuseau -horaire, configurent le réseau pour DHCP ou utilisent une adresse IP -fixe,la configuration grub et plus encore. Ils devraient faire un -travail raisonnable pour votre installation. Vous pouvez les modifier ou -ajouter de nouveaux scripts pour répondre à vos besoins locaux. - -Plus d’informations sur ces scripts sont décrits dans -link:#cscripts[[cscripts]]. - -[[_a_id_isavelog_a_enregistrement_des_fichiers_journaux_tâche_savelog]] -=== [#isavelog]####Enregistrement des fichiers journaux (tâche savelog) - -Lorsque toutes les tâches sont terminées, les fichiers journaux sont -écrits dans -_/var/log/fai/$HOSTNAME/install/_[.footnote]#[link:#_footnote_15[15]]# -sur le nouveau système et sur le compte sur le serveur d’installation si -`+$LOGUSER+` est défini. Il est également possible de spécifier un autre -hôte comme enregistrement en enregistrant la destination via la variable -`+$LOGSERVER+`. Si `+$LOGSERVER+` n’est pas défini, FAI utilise la -variable `+$SERVER+` qui n’est définie que lors d’une installation -initiale (par get-boot-info). Assurez-vous de définir `+$LOGSERVER+` -dans un script _class/*.var_ si vous utilisez l’action _softupdate_. - -De plus, deux liens symboliques seront créés pour indiquer le dernier -répertoire écrit. Le lien symbolique _last_ pointe vers le répertoire -journal de la dernière action FAI exécutée. Les liens symboliques -_last-install_ et _last-sysinfo_ pointent vers le répertoire avec la -dernière action correspondante. Par défaut, les fichiers journaux seront -copiés sur le serveur de journal à l’aide de scp. Vous pouvez utiliser -la variable `+$FAI_LOGPROTO+` dans le fichier _fai.conf(5)_ pour choisir -une autre méthode d’enregistrement des journaux sur le serveur distant. -Voici un exemple de structure de lien symbolique: - -.... -lrwxrwxrwx 1 fai fai 23 Dec 2 2013 last-sysinfo -> sysinfo-20131202_161237 -drwxr-xr-x 2 fai fai 4096 Dec 2 2013 sysinfo-20131202_161237 -drwxr-xr-x 2 fai fai 4096 Feb 14 2014 install-20140214_142150 -drwxr-xr-x 2 fai fai 4096 Dec 2 11:47 install-20141202_113918 -lrwxrwxrwx 1 fai fai 23 Dec 4 13:22 last-install -> install-20141204_131351 -lrwxrwxrwx 1 fai fai 23 Dec 4 13:22 last -> install-20141204_131351 -drwxr-xr-x 2 fai fai 4096 Dec 4 13:22 install-20141204_131351 -.... - -Vous trouverez des exemples de fichiers journaux à l’adresse -http://fai-project.org/logs. - -[[_a_id_ireboot_a_redémarrez_le_nouveau_système_installé]] -=== [#ireboot]####Redémarrez le nouveau système installé - -Avant de redémarrer, le client d’installation appelle -`+fai-chboot -d +` sur le serveur d’installation, pour -désactiver sa propre configuration PXELINUX. Sinon, il redémarrera -l’installation lors de la prochaine initialisation. Normalement, cela -devrait démarrer le nouveau système installé à partir de son second -périphérique d’amorçage, le disque dur local. - -À la fin, le système est automatiquement redémarré si "reboot" a été -ajouté à `+$FAI_FLAGS+`. - -[[_a_id_advanced_a_chapitre_avancés_de_fai]] -== [#advanced]####Chapitre avancés de FAI - -[[_a_id_checkbootp_a_vérification_des_paramètres_reçus_des_serveurs_dhcp]] -=== [#checkbootp]####Vérification des paramètres reçus des serveurs DHCP - -Si le client d’installation démarre, vous pouvez vérifier si toutes les -informations provenant du démon DHCP sont correctement reçues. Les -informations reçues sont écrites dans _/tmp/fai/boot.log_. Un exemple de -résultat d’une requête DHCP peut être trouvé dans les fichiers journaux -d’exemple. - -[[_a_id_fai_monitor_a_surveillance_de_plusieurs_installations_clientes]] -=== [#fai-monitor]####Surveillance de plusieurs installations clientes - -Vous pouvez surveiller l’installation de tous les clients d’installation -avec la commande `+fai-monitor(8)+`. Tous les clients vérifient si ce -démon est en cours d’exécution sur le serveur d’installation (ou sur -l’ordinateur défini par la variable $monserver). Chaque fois qu’une -tâche démarre ou se termine, un message est envoyé. Le démon du moniteur -FAI imprime ces messages à la sortie standard. Il ya aussi un frontend -graphique disponible, appelé `+fai-monitor-gui(1)+`. - -.... -$ fai-monitor | fai-monitor-gui - & -.... - -[[_a_id_mac_a_collecte_d_8217_adresses_ethernet_pour_plusieurs_hôtes]] -=== [#mac]####Collecte d’adresses Ethernet pour plusieurs hôtes - -Vous devez collecter toutes les adresses Ethernet (MAC) des clients à -l’installation et affecter un nom d’hôte et une adresse IP à chaque -client. Pour collecter les adresses MAC, démarrez vos clients pour -l’installation. Vous pouvez déjà le faire avant que n’importe quel démon -DHCP s’exécute dans votre sous-réseau. Ils échoueront à démarrer (en -raison du manque de DHCP ou de TFTP manquant), mais vous pouvez toujours -collecter les adresses MAC. - -Pendant que les clients d’installation démarrent, ils envoient des -paquets de diffusion au LAN. Vous pouvez enregistrer les adresses MAC de -ces hôtes en exécutant simultanément la commande suivante sur le -serveur: - -.... -faiserver# tcpdump -qtel broadcast and port bootpc >/tmp/mac.list -.... - -Une fois que les hôtes ont été envoyés, certains paquets de diffusion -annule `+tcpdump+` en tapant _ctrl-c_. Vous obtenez une liste de toutes -les adresses MAC uniques avec ces commandes: - -.... -faiserver$ perl -ane 'print "\U$F[0]\n"' /tmp/mac.list|sort|uniq -.... - -Après cela, vous n’avez qu'à assigner ces adresses MAC aux noms d’hôte -et aux adresses IP (/etc/ethers et /etc/hosts ou aux cartes NIS -correspondantes). Avec ces informations, vous pouvez configurer votre -démon DHCP (voir la section [bootdhcp]). -[.footnote]#[link:#_footnote_16[16]]# - -[[_débogage_du_trafic_réseau]] -==== Débogage du trafic réseau - -Si le client ne peut démarrer correctement à partir de la carte réseau, -utilisez `+tcpdump(8)+` pour rechercher des paquets Ethernet entre le -serveur d’installation et le client. Recherchez également les entrées de -plusieurs fichiers journaux effectués par `+tftpd(8)+` et `+dhcpd(8)+` : - -.... -faiserver$ egrep "tftpd|dhcpd" /var/log/* -.... - -[[_a_id_pxeboot_a_détails_du_démarrage_pxe]] -=== [#pxeboot]####Détails du démarrage PXE - -Ici, nous décrivons les détails du démarrage PXE, qui ne sont -nécessaires que si vous avez des problèmes lors du démarrage de vos -clients d’installation. - -Presque toutes les cartes réseau modernes prennent en charge -l’environnement de démarrage PXE. PXE est l’environnement d’exécution de -pré-lancement. Cela nécessite le chargeur de démarrage PXELINUX et une -version spéciale du démonTFTP, disponible dans les paquets Debian -`+pxelinux+` et `+tftpd-hpa+`. Le démarrage PXE nécessite également un -serveur DHCP, afin que la carte réseau puisse configurer ses paramètres -IP. Il s’agit de la séquence d’une amorce PXE: - -* La carte réseau du client envoie son adresse MAC -* Le serveur DHCP répond à la configuration IP du client -* La carte réseau configure son IP -* Le client d’installation obtient le binaire pxelinux.0 via TFTP -* Obtenez le fichier de configuration pxelinux.cfg/C0A8210C via TFTP -* C0A8210C est l’adresse IP du client en hexadécimal -* Cette configuration contient le noyau, initrd et les paramètres de -ligne de commande supplémentaires du noyau, qui a été créé par -fai-chboot. -* Obtenez le noyau et initrd via TFTP. - -Exemple d’un fichier pxelinux.cfg: - -.... -default fai-generated - -label fai-generated -kernel vmlinuz-3.16.0-4-amd64 -append initrd=initrd.img-3.16.0-4-amd64 ip=dhcp root=/srv/fai/nfsroot aufs FAI_FLAGS=verbose,sshd,createvt FAI_CONFIG_SRC=nfs://faiserver/srv/fai/config FAI_ACTION=install -.... - -Voir _/usr/share/doc/syslinux/pxelinux.doc_ pour des informations plus -détaillées sur PXELINUX. Il existe un nouveau binaire lpxelinux qui -prend également en charge le chargement du noyau et de l’initrd via FTP -ou HTTP. La commande _fai-chboot(8)_' prend en charge cette option avec -l’option _-U_. - -[[_a_id_customizing_your_install_server_setup_a_personnalisation_de_la_configuration_de_votre_serveur_d_8217_installation]] -=== [#Customizing your install server setup]## Personnalisation de la configuration de votre serveur d’installation - -* Miroir de paquetage local/plus rapide -* Loguser différent -* Local root password dans nfsroot - -La configuration du paquet FAI (et non les données de configuration pour -les clients d’installation) est définie dans _fai.conf(5)_. Les -définitions qui sont utilisées uniquement pour créer le nfsroot sont -situées dans _nfsroot.conf(5)_. Vérifiez ces variables importantes dans -_nfsroot.conf_ avant d’appeler _fai-setup_ ou _fai-make-nfsroot_. - -FAI_DEBOOTSTRAP:: - La construction de nfsroot utilise la commande `+debootstrap(8)+`. Il - a besoin de l’emplacement d’un miroir Debian et du nom de la - distribution (wheezy, jessie, stretch, sid) pour lequel le système - Debian de base devrait être construit. N’utilisez pas de distributions - différentes ici et dans _/etc/fai/apt/sources.list_. Cela créera un - nfsroot brisé. -NFSROOT_ETC_HOSTS:: - Cette variable n’est nécessaire que si les clients n’ont pas accès à - un serveur DNS. Cette variable multiligne est ajoutée à /etc/hosts - dans le nfsroot. Ensuite, les clients d’installation peuvent accéder à - ces hôtes par leur nom sans utiliser DNS. - -Le contenu de _/etc/fai/apt/sources.list_ est utilisé par le serveur -d’installation et par les clients. Si votre serveur d’installation a -plusieurs cartes réseau et différents noms d’hôte pour chaque carte -(comme pour un serveur Beowulf), utilisez le nom du serveur -d’installation qui est connu des clients d’installation. - -Si vous avez des problèmes lors de l’exécution de `+fai-setup+`, ils -proviennent habituellement de `+fai-make-nfsroot(8)+` qui est appelé par -la commande précédente. L’ajout de _-v_ vous donne une sortie plus -détaillée qui vous aide à repérer l’erreur. La sortie est écrite dans -_/var/log/fai/fai-make-nfsroot.log_. -[.footnote]#[link:#_footnote_17[17]]# - -L’installation crée également le compte fai (défini par `+$LOGUSER+`) -s’il n’est pas déjà disponible. Vous pouvez donc ajouter un utilisateur -avant d’appeler `+fai-setup(8)+` à l’aide de la commande `+adduser(8)+` -et utiliser ce compte local pour enregistrer des fichiers journaux. Les -fichiers journaux de tous les clients d’installation sont enregistrés -dans le répertoire de base de ce compte. Vous devriez changer le groupe -principal de ce compte, donc ce compte a des droits d'écriture sur -_/srv/tftp/fai_ pour appeler fai-chboot pour créer la configuration PXE -pour les hôtes. - -Lorsque vous apportez des modifications à _fai.conf_, _nfsroot.conf_, le -nfsroot doit être reconstruit en appelant `+fai-make-nfsroot(8)+`. Si -vous souhaitez uniquement installer un nouveau paquet kernel sur -nfsroot, ajoutez les flags _-k_ ou _-K_ à `+fai-make-nfsroot+`. Cela ne -recréera pas votre nfsroot, mais ne mettra à jour que vos noyaux et les -modules du noyau dans le nfsroot ou ajoutera des paquets supplémentaires -dans le nfsroot. - -[[_a_id_cdboot_a_création_d_8217_un_cd_fai_ou_d_8217_une_clé_usb]] -=== [#cdboot]####Création d’un CD FAI ou d’une clé USB - -Vous pouvez facilement créer un CD d’installation (ou clé USB) pour -votre installation réseau. Cela permettra d’effectuer la même -installation et la même configuration à partir du CD sans avoir besoin -du serveur d’installation. Par conséquent, vous devez créer un miroir -partiel de tous les paquets Debian nécessaires à vos classes FAI (à -l’aide de `+fai-mirror(1)+`). Ensuite, la commande `+fai-cd(8)+` mettra -ce miroir, le nfsroot et l’espace de configuration sur un CD amorçable. -C’est tout! - -Ce CD d’installation contient toutes les données nécessaires à -l’installation. La commande `+fai-cd(8)+` place le nfsroot, l’espace de -configuration et un sous-ensemble du miroir Debian sur un CD-ROM. Un -miroir de paquets partiel est créé à l’aide de la commande -`+fai-mirror(1)+` qui contient tous les paquetages utilisés par les -classes utilisées dans votre espace de configuration. Un échantillon -d’image ISO est disponible à l’adresse http://fai-project.org/fai-cd. - -Avec la commande `+dd(1)+`, vous pouvez également créer une clé USB -bootable en écrivant simplement le contenu du fichier ISO sur votre clé -USB (ici le stick est _/dev/sdf_). - -.... - faiserver# dd if=fai-cd.iso of=/dev/sdf bs=1M -.... - -Il ne s’agit pas d’un live CD du serveur d’installation. - -[[_a_id_diskimage_a_création_d_8217_images_de_disque_vm_à_l_8217_aide_de_fai]] -=== [#diskimage]####Création d’images de disque VM à l’aide de FAI - -En utilisant la commande `+fai-diskimage(8)+`, vous pouvez créer des -images de disques de machines Linux qui peuvent être utilisées avec une -machine virtuelle comme KVM, VMware, VirtualBox ou un service cloud -comme OpenStack, GCE, EC2 et autres. Le processus d’installation exécute -les tâches FAI normales sur une image de disque brut. Après -l’installation, vous pouvez démarrer l’image disque et avoir un système -en cours d’exécution. L’image disque peut également être convertie au -format qcow2. - -.... - faiserver# export FAI_BASEFILEURL=http://fai-project.org/download/basefiles/ - faiserver# fai-diskimage -u cloud3 -S 2G -cDEBIAN,JESSIE64,AMD64,FAIBASE,GRUB_PC,CLOUD,GCE disk.raw -.... - -Crée le fichier disk.raw pour un hôte appelé cloud3, avec un petit -ensemble de progiciels. - -.... - # export FAI_BASEFILEURL=http://fai-project.org/download/basefiles/ - # cl=DEFAULT,DHCPC,DEBIAN,AMD64,FAIBASE,GRUB_PC,UBUNTU,XENIAL,XENIAL64,XORG - # fai-diskimage -v -u foobar -S5G -c$cl ubuntu.qcow2 -.... - -Crée une image de disque appelée ubuntu.qcow2 pour un bureau Ubuntu -16.04 avec un nom d’hôte défini sur foobar. - -Vous ne devez pas configurer le nfsroot lorsque vous utilisez uniquement -fai-diskimage. Mais vous avez besoin d’un fichier de base dans votre -espace de configuration. Vous pouvez télécharger une image de base -Debian à partir de http://fai-project.org/download/basefile et copier -ceci dans votre espace de configuration. Si vous avez déjà configuré le -nfsroot, vous pouvez copier le fichier de base Debian depuis le nfsroot -dans votre espace de configuration à l’aide de cette commande: - -.... - $ cp /srv/fai/nfsroot/var/tmp/base.tar.xz - $ /srv/fai/config/basefiles/JESSIE64.tar.xz -.... - -[[_a_id_sysinfo_a_système_de_sauvetage_fai]] -=== [#sysinfo]####Système de sauvetage FAI - -Si vous définissez la variable `+$FAI_ACTION+` sur sysinfo (par exemple -en utilisant `+fai-chboot -S+`), le client n’installera pas de nouveau -système, mais collectera beaucoup d’informations système. Si vous -définissez `+$FAI_ACTION+` sur _inventory_, vous ne recevrez que -quelques informations sur le matériel. Les deux actions peuvent être -utilisées pour FAI comme un système de sauvetage. - -Tapez _ctrl-c_ pour obtenir un shell ou utilisez _Alt-F2_ ou _Alt-F3_ et -vous obtiendrez un autre terminal de console, si vous avez ajouté -_createvt_ à `+$FAI_FLAGS+`. - -Vous avez maintenant un système Linux en cours d’exécution sur le client -d’installation sans utiliser le disque dur local. Utilisez-le comme -système de secours si votre disque local est endommagé ou si -l’ordinateur ne peut pas démarrer correctement à partir du disque dur. -Vous obtiendrez un shell et vous pouvez exécuter diverses commandes -(`+dmesg+`, `+lsmod+`, `+df+`, `+lspci+`, …). Regardez le fichier -journal dans `+/tmp/fai+`. Vous y trouverez de nombreuses informations -sur le processus d’amorçage. - -FAI monte tous les systèmes de fichiers qu’il trouve sur les disques -locaux en lecture seule. Il vous indique également sur quelle partition -un fichier _/etc/fstab_ existe. Lorsqu’une seule table de système de -fichiers est trouvée, les partitions sont montées selon ces -informations. Voici un exemple: - -.... -demohost:~# df -Filesystem 1K-blocks Used Available Use% Mounted on -rootfs 4099064 414088 3645296 11% / -192.168.33.250:/srv/fai/nfsroot - 3905600 410976 3454944 11% /live/image -tmpfs 193464 3112 190352 2% /live/cow -aufs 4099064 414088 3645296 11% / - -192.168.33.250:/srv/fai/config - 3905600 410976 3454944 11% /var/lib/fai/config -/dev/sda1 241116 74519 154149 33% /target -/dev/sda9 4364212 139888 4179988 4% /target/home -/dev/sda7 553376 16840 536536 4% /target/tmp -/dev/sda8 2221628 275936 1832840 14% /target/usr -/dev/sda6 577096 172924 374856 32% /target/var -.... - -*Cette méthode peut être utilisée comme un environnement de secours!* Si -vous avez besoin d’un système de fichiers avec accès en -lecture/écriture, utilisez la commande `+rwmount+`: - -.... -demohost# rwmount /target/home -.... - -[[_a_id_nonfs_a_fai_sans_nfs]] -=== [#nonfs]####FAI sans NFS - -Pour démarrer dans FAI et commencer la séquence d’installation sans -utiliser le protocole NFS. Vous démarrez la machine cliente en utilisant -PXE comme d’habitude, puis récupérez une image contenant le nfsroot via -http. - -Pour créer une image, utilisez l’argument -S de fai-cd - -.... -faiserver# fai-cd -S squash.img -.... - -Déplacez cette image vers un répertoire à partir duquel elle peut être -demandée via http (généralement un répertoire desservi par le serveur -web) - -Pour demander maintenant l’image squashfs, ajoutez ce qui suit à votre -ligne de commande du noyau, p. Dans votre fichier de configuration -pxelinux pour le client. - -.... -root=live:http://faiserver/cskoeln/squash.img -.... - -Remplacez faiserver par le nom de domaine ou IP de la machine à laquelle -votre image de squash est servie. - -[[_a_id_otherdists_a_installation_d_8217_autres_distributions_à_l_8217_aide_d_8217_un_nfsroot_debian]] -=== [#otherdists]####Installation d’autres distributions à l’aide d’un nfsroot Debian - -Vous pouvez installer toutes sortes de distributions Linux à partir d’un -seul nfsroot Debian. Par conséquent, vous devez créer un fichier -base.tar.xz de la distribution que vous souhaitez installer et le placer -dans le répertoire `+basefiles+`. Puis nommez-le UBUNTU1404.tar.xz par -exemple. Un client d’installation appartenant à la classe UBUNTU1404 -extrait ensuite ce fichier de base dans son système de fichiers vide. De -plus, vous devez ajuster les sources.list ou les fichiers de -configuration similaires nécessaires pour spécifier l’emplacement du -référentiel de paquets. - -L’outils `+rinse(8)+` est utilisé pour créer des fichiers de base pour -la distribution comme CentOS, openSUSE, Scientific Linux Cern ou Fedora. -Certains fichiers de base peuvent être téléchargés à partir de -http://fai-project.org/download/basefiles/. - -Le script `+mk-basefile+` dans -_/usr/share/doc/fai-doc/examples/simple/basefiles/_' aide à créer ces -fichiers de base. - -[[_a_id_dirinstall_a_création_d_8217_environnements_chrooter_et_virtualiser]] -=== [#dirinstall]####Création d’environnements chrooter et virtualiser - -Si vous devez créer certains environnements chroot, ou un environnement -de virtualisation où vous ne pouvez ni ne voulez exécuter un programme -d’installation Debian normal pour accéder à un système opérationnel (par -exemple, les domaines hôtes Xen), il ya l’action FAI _dirinstall_. En -appelant - -.... -faiserver# fai dirinstall -.... - -Et en utilisant l’option _-c _ ou _-N_ vous obtenez une -installation FAI, sans l’action de partitionnement, directement dans le -répertoire cible. Le nom d’hôte de l’installation cible peut être -spécifié à l’aide de _-u _ - -Ceci, par exemple, peut être utilisé pour combiner FAI avec l’outil -_xen-tools_, qui vous aide à construire des domaines invités Xen. -_xen-tools_ est très agréable pour générer des fichiers de configuration -et bloquer des périphériques pour de nouveaux invités basés sur des -commandes simples et/ou des fichiers de configuration, mais ils ne -peuvent assigner qu’un seul rôle par installation pour la -personnalisation. Les FAI-utilisateurs ont besoin et veulent plus, car -ils sont utilisés pour avoir le système de classe. Ils les obtiennent -même dans les installations xen-tools, en utilisant le code suivant en -tant que rôle xen-tools script: - -.... -#!/bin/sh -TARGET=$1 -CMD="fai -N -v -u ${hostname} dirinstall $TARGET" -echo running $CMD -$CMD -.... - -Ensuite, vous voulez définir la variable _install=0_ de la configuration -xen-tools pour cet hôte. - -[[_a_id_softupdate_a_utilisation_de_fai_pour_les_mises_à_jour]] -=== [#softupdate]####Utilisation de FAI pour les mises à jour - -FAI peut également effectuer des mises à jour de systèmes déjà en cours -d’exécution, sans réinstallation à partir de zéro. C’est ce qu’on -appelle softupdate. Un FAI softupdate ignore les tâches qui ne sont pas -adaptées à la mise à jour d’un système en cours d’exécution, comme le -partitionnement des disques durs et la création de systèmes de fichiers. -Au lieu de cela, il exécute uniquement les tâches de mise à jour et -d’installation des progiciels et de l’appel des scripts de -personnalisation. - -Pour exécuter un appel softupdate: - -.... -# fai -v -s nfs://faiserver/srv/fai/config softupdate -.... - -Par défaut, un softupdate utilise la liste des classes définies lors de -l’installation initiale. Assurez-vous de définir la variable -`+$LOGSERVER+` (effectuée dans un fichier _class/*.var_) si FAI doit -enregistrer les fichiers journaux sur une machine distante. - -C’est à vous, comment démarrer un softupdate sur un plus grand nombre -d’hôtes. Vous pouvez faire le softupdate sur une base régulière via cron -ou vous pouvez utiliser des outils comme `+clusterssh(1)+` pour démarrer -un softupdate via un push sur une liste d’hôtes. - -Gardez à l’esprit que les scripts de personnalisation sont exécutés -chaque fois que vous faites un softupdate. Cela signifie qu’ils doivent -être *idempotents*, c’est-à-dire que le résultat de leur fonctionnement -doit toujours produire le même résultat, même lorsqu’ils fonctionnent -plus d’une fois. - -Par exemple, l’ajout d’une ligne à un fichier ne doit pas se faire via -ce code: - -.... -$ echo "some strings" >> /etc/fstab -.... - -Utilisez plutôt la commande `+ainsl(1)+` dans un script shell ou -utilisez la fonction _AppendIfNoSuchLine_ de cfengine. - -Toutes les commandes du script de personnalisation doivent être capables -de modifier le système de fichiers cible s’il est disponible dans -_/target_ lors de l’installation initiale ou si c’est le système de -fichiers normal relatif à _/_ pendant le softtupdate. - -Voici quelques variables qui aident à écrire ces scripts: - -`+$target+`:: - Pointe vers le répertoire racine du client, qui est _/target_ pendant - l’installation et _/_ pendant un softupdate. -`+$FAI_ROOT+`:: - C’est la même valeur que `+$target+`. Pour des raisons historiques, - nous avons ces deux variables dans FAI. -`+$ROOTCMD+`:: - Dans le cas de l’installation, il s’agit d’un alias pour _chroot - $target_ en cas de softupdate c’est juste vide. Vous pouvez ajouter - ceci aux commandes si vous avez besoin d’exécuter une commande dans le - système de fichiers cible des clients via chroot. -`+$FAI_ACTION+`:: - Si vous devez appeler le code en fonction de l’action FAI effectuée, - vous pouvez utiliser cette variable. Il contient l’action actuellement - exécutée: _install_, _softupdate_, _dirinstall_, _sysinfo_, - _inventory_ ou votre propre action définie. - -[[_a_id_archcross_a_comment_installer_un_système_d_8217_exploitation_32_bits_à_partir_d_8217_un_système_d_8217_exploitation_64_bits]] -=== [#archcross]####Comment installer un système d’exploitation 32 bits à partir d’un système d’exploitation 64 bits - -Pour installer un ordinateur avec un système d’exploitation 32 bits, -vous avez besoin d’un nfsroot i386. La création de cette nfsroot 32 bits -sur un serveur d’installation exécutant amd64 est assez simple. -Installez et configurez les paquets FAI. Copiez ensuite vos fichiers de -configuration FAI dans un nouveau sous-répertoire. - -.... -faiserver# cp -a /etc/fai /etc/fai-i386 -.... - -Modifiez la variable `+$FAI_DEBOOTSTRAP_OPTS+` dans -_/etc/fai-i386/nfsroot.conf_ et ajoutez l’option `+--arch i386+`. -Choisissez également un répertoire différent pour votre nouveau nfsroot. -Voici les deux lignes après l'édition. - -.... -NFSROOT=/srv/fai/nfsroot-i386 -FAI_DEBOOTSTRAP_OPTS="--arch i386 --exclude=info --include=aptitude"" -.... - -Appelez maintenant fai-make-nfsroot qui crée le nfsroot 32 bits dans -_/srv/fai/nfsroot-i386_ - -.... -faiserver# fai-make-nfsroot -v -C/etc/fai-i386 -.... - -La création d’un miroir partiel utilisant `+fai-mirror(1)+` nécessaire à -un CD amorçable ou une clé USB est également possible sur une -architecture différente. Vous devez spécifier l’architecture lors de -l’appel de fai-mirror. - -.... -$ fai-mirror -m800 -B -a i386 -v -cDEFAULT,DEBIAN,FAIBASE,I386 /srv/mirror-i386 -.... - -C’est tout! - -[[_a_id_hints_a_divers_conseils_et_détails]] -== [#hints]## Divers conseils et détails - -[[_a_id_tasks_a_la_liste_des_tâches]] -=== [#tasks]## La liste des tâches - -La plupart des tâches de l’installation sont définies comme des -sous-routines qui sont définies dans _/usr/lib/fai/subroutines_ (par -exemple `+task_instsoft+`). Certains sont des scripts shell externes -situés dans _/usr/lib/fai/_. Ils sont appelés via un sous-programme -supérieur appelé _task_. Ce sous-programme appelle les hooks si -disponibles, puis appelle la tâche (définie comme __task___). Une -tâche et ses hooks peuvent être ignorés à la demande en utilisant la -commande _skiptask()_. - -Suit maintenant la description de toutes les tâches, énumérées dans -l’ordre dans lequel elles sont exécutées. - -confdir:: - Les paramètres ajoutés au noyau peuvent définir des variables, le - démon syslog est démarré. La liste des périphériques réseau est - stockée dans `+$netdevices+`. Ensuite, des paramètres supplémentaires - sont extraits d’un serveur DHCP. Le fichier de configuration du - résolveur DNS est créé. - + - L’emplacement de l’espace de configuration est défini par la variable - `+$FAI_CONFIG_SRC+`. - + - Ensuite, le fichier _$FAI/hooks/subroutines_ est sourcé s’il existe. - En utilisant ce fichier, vous pouvez définir vos propres - sous-programmes ou remplacer la définition des sous-programmes FAI. -setup:: - Cette tâche définit l’heure du système, tous les `+$FAI_FLAGS+` sont - définis et deux terminaux virtuels supplémentaires sont ouverts à la - demande. Un démon de shell sécurisé est lancé à la demande pour les - connexions à distance. -defclass:: - Appellez `+fai-class(1)+` pour définir des classes à l’aide de scripts - et de fichiers dans _$FAI/class_ et classes de - _/tmp/fai/additional-classes_ et la variable `+$ADDCLASSES+`. La liste - de toutes les classes définies est stockée dans la variable - `+$classes+` et enregistrée dans _/tmp/fai/FAI_CLASSES_. -defvar:: - Sourcez tous les fichiers _$FAI/class/*.var_ pour chaque classe - définie. Si un hook a écrit quelques définitions de variables dans le - fichier _$LOGDIR/additional.var_, ce fichier est également sourcé. -action:: - En fonction de la valeur de `+$FAI_ACTION+`, ce sous-programme décide - de l’action FAI à exécuter. Les actions disponibles par défaut sont: - _sysinfo_, _install_, _inventory_, _dirinstall_ et _softupdate_. Si - `+$FAI_ACTION+` a une autre valeur, une action définie par - l’utilisateur est appelée si un fichier _$FAI/hooks/$FAI_ACTION_ - existe. Ainsi, vous pouvez facilement définir vos propres actions. -sysinfo:: - Appelée lorsque aucune installation n’est effectuée mais que l’action - est _sysinfo_. Il affiche des informations sur le matériel détecté et - monte les disques durs locaux en lecture uniquement sur - _/target/`+partitionname+`_ ou en regard d’un fichier _fstab_ trouvé à - l’intérieur d’une partition. Les fichiers journaux sont stockés sur le - serveur d’installation. -inventory:: - Une courte liste des informations système est imprimée. -install:: - Cette tâche contrôle la séquence d’installation. Vous entendrez trois - bips avant le début de l’installation. Le travail principal consiste à - appeler d’autres tâches et à enregistrer la sortie dans - _/tmp/fai/fai.log_. Si vous avez des problèmes pendant l’installation, - regardez tous les fichiers dans _/tmp/fai/_. Vous trouverez des - exemples de fichiers journaux à l’adresse - http://fai-project.org/logs/. -dirinstall:: - Installez dans un répertoire, et non pas sur un disque local. - Utilisez-le pour créer des environnements chrootés. -softupdate:: - Cette tâche, exécutée à l’intérieur d’un système en cours d’exécution - via l’interface de ligne de commande `+fai(8)+`, effectue un - softupdate. Voir le chapitre link:#softupdate[[softupdate]] pour plus - de détails. -partition:: - Appelle `+setup-storage(8)+` pour partitionner les disques durs et - créer des systèmes de fichiers. La tâche écrit des définitions de - variables pour la partition et le périphérique racine et de démarrage - (`+$ROOT_PARTITION, $BOOT_PARTITION, $BOOT_DEVICE+`) dans - _/tmp/fai/disk_var.sh_ et crée un fichier _fstab_ pour le nouveau - système. -mountdisks:: - Montez les partitions créées en fonction du fichier _/tmp/fai/fstab_ - créé par rapport à `+$FAI_ROOT+`. -extrbase:: - Extrait un système minimal après lequel un chroot peut y être - introduit. Par défaut, le fichier tar base _/var/tmp/base.tar.xz_ sera - extrait. Les fichiers correspondant à un nom de classe dans - _$FAI/basefiles/_ sont également utilisés pour décompresser un autre - fichier tar selon les classes définies. Cela peut être utilisé pour - installer des distributions Linux différentes de celles utilisées pour - créer le nfsroot. Le fichier par défaut _base.tar.xz_ est un - instantané d’un système Debian de base créé par `+debootstrap(8)+` - Cette tâche utilise la variable `+FAI_BASEFILEURL+` pour extraire le - fichier de base via FTP ou HTTP si elle est définie. -debconf:: - Appelle `+fai-debconf(1)+` pour définir les valeurs de la base de - données de préconfiguration de debconf. -repository:: - Préparez l’accès au référentiel de paquets en préparant la - configuration apt. Cela peut également ajouter des clés de référentiel - via `+apt-key(8)+` en classe à partir de fichiers comme - _CLASSNAME.asc_ dans le répertoire _package_config_. -updatebase:: - Met à jour les paquets de base du nouveau système et met à jour la - liste des paquets disponibles. Il falsifie également certaines - commandes (appelées diversions) à l’intérieur du nouveau système - installé à l’aide de `+dpkg-divert(8)+`, de sorte qu’aucun démon ne - sera démarré pendant l’installation. -instsoft:: - Installe les progiciels souhaités en utilisant des fichiers de classe - dans _$FAI/package_config/_. -configure:: - Appelle les scripts dans _$FAI/scripts/_ et ses sous-répertoires pour - chaque classe définie. -tests:: - Appelle les scripts de test dans _$FAI/tests/_ et ses sous-répertoires - pour chaque classe définie. -finish:: - Démonte tous les systèmes de fichiers dans le nouveau système installé - et supprime les diversions de fichiers à l’aide de la commande - `+fai-divert+`. -chboot:: - Modifie la configuration PXE d’un hôte sur le serveur d’installation - qui indique quelle configuration PXELINUX doit être chargée lors de la - prochaine initialisation à partir de la carte réseau via TFTP. Par - conséquent, la commande `+fai-chboot(8)+` est exécutée à distance sur - le serveur d’installation. -savelog:: - Enregistre les fichiers journaux sur le disque local et sur le compte - `+$LOGUSER+` sur `+$LOGSERVER+` (par défaut sur le serveur - d’installation). -faiend:: - Attendez que les travaux en arrière-plan se terminent (par exemple, - emacs compile des fichiers lisp) et redémarre automatiquement les - clients d’installation ou attend la saisie manuelle avant le - redémarrage. - -[[_a_id_itests_a_tests_automatisés]] -=== [#itests]####Tests automatisés - -Après l’exécution des scripts de personnalisation, FAI exécutera -certains tests si disponibles. En utilisant ces tests, vous pouvez -vérifier les erreurs de l’installation. Les scripts de test sont appelés -via `+fai-do-scripts(1)+` et doivent ajouter leurs messages à -_$LOGDIR/test.log_. Un module Perl comprenant des sous-routines utiles -peut être trouvé dans _Faitest.pm_. Un test peut également définir une -nouvelle classe pour exécuter d’autres tests lors du prochain démarrage -via la variable `+$ADDCLASSES+`. - -[[_a_id_autodiscover_a_découvrir_automatiquement]] -=== [#autodiscover]## Découvrir automatiquement - -Dans FAI 5.0, nous avons publié une fonctionnalité qui permet aux -clients de rechercher le faiserver dans leur sous-réseau respectif. Cela -soulève la nécessité de récupérer l’adresse MAC de chaque client et de -configurer le démon DHCP. - -Cela se fait en démarrant à partir d’une petite autodiscover FAI -bootmedium (CD, USB, etc.), qui peut être créée via la commande: - -.... -faiserver# fai-cd -A autodiscover.iso -.... - -L’image a une taille d’environ 25 Mo et analyse le sous-réseau d’un -serveur FAI. Par défaut, il affiche un menu avec tous les profils -disponibles dans l’espace de configuration de la même manière que le -drapeau de menu. Dans ce menu, vous pouvez sélectionner le type -d’installation que vous souhaitez effectuer. - -Pour que les clients puissent trouver le faiserver, le faiserver doit -exécuter fai-monitor. - -[[_a_id_changeboot_a_modification_du_périphérique_d_8217_amorçage]] -=== [#changeboot]####Modification du périphérique d’amorçage - -La modification de la séquence d’amorçage s’effectue normalement dans la -configuration du BIOS. Mais vous ne pouvez pas changer le BIOS d’un -système Linux en cours d’exécution. - -Ainsi, la séquence d’amorçage du BIOS restera inchangée et votre -ordinateur devrait toujours démarrer en premier à partir de sa carte -réseau et le deuxième périphérique d’amorçage devrait être le disque -local. Ensuite, vous pouvez changer le périphérique d’amorçage du client -en créant différentes configurations PXELINUX. Cela définira si une -installation doit être effectuée, ou si le client doit démarrer à partir -du disque local. Cela se fait à l’aide de `+fai-chboot(8)+`. - -[[_a_id_debian_mirror_a_comment_créer_un_miroir_debian_local]] -=== [#debian-mirror]####Comment créer un miroir Debian local - -Le script `+mkdebmirror+` [.footnote]#[link:#_footnote_18[18]]# peut -être utilisé pour créer votre propre miroir Debian local. Ce script -utilise la commande `+debmirror(1)+`. Un miroir Debian partiel pour -l’architecture i386 et amd64 pour Debian 8.0 (aka jessie) sans les -paquets source nécessite environ 56Go d’espace disque. L’accès au miroir -via HTTP sera la méthode par défaut dans la plupart des cas. Pour -afficher plus de résultats à partir du script, appelez -`+mkdebmirror -v+`. Un compte root n’est pas nécessaire pour créer et -maintenir le miroir Debian. - -Pour utiliser l’accès HTTP au miroir Debian local, installez un serveur -Web et créez un lien symbolique vers le répertoire local où se trouve -votre miroir: - -.... -faiserver# apt-get install apache2 -faiserver# ln -s /files/scratch/debmirror /var/www/html/debmirror -.... - -Créez un fichier `+sources.list(5)+` dans _/etc/fai/apt_ qui donne accès -à votre miroir Debian. Ajoutez également l’adresse IP du serveur HTTP à -la variable `+$NFSROOT_ETC_HOSTS+` dans _nfsroot.conf_ si les clients -d’installation n’ont pas de résolution DNS. - -[[_petits_conseils]] -=== Petits conseils - -* Lorsque vous utilisez l’accès HTTP à un miroir Debian, la partition -locale _/var_ sur tous les clients d’installation doit être suffisamment -grande pour conserver les paquets Debian téléchargés. N’essayez pas avec -moins de 250 Moctets à moins que vous sachiez pourquoi. Vous pouvez -limiter le nombre de paquets installés à la fois avec la variable -`+$MAXPACKAGES+`. -* Vous pouvez supprimer le logo rouge sur le client d’installation en -appelant simplement une fois `+reset+`. Il ne s’affichera pas si vous -créez un fichier à l’aide de cette commande sur le serveur -d’installation: - -.... -touch /srv/fai/nfsroot/.nocolorlogo -.... - -* Une liste des variables utilisées par FAI peut être trouvée à -http://wiki.fai-project.org/wiki/Variables. -* Vous pouvez raccourcir certains scripts de personnalisation en -utilisant une seule commande fcopy _fcopy -r /_. -* Si vous reconstruisez le nfsroot, vous allez créer une nouvelle clé -hôte ssh dans le nfsroot. La connexion à un client d’installation peut -échouer, car la clé hôte change. Vous pouvez utiliser ceci: - -.... -$ ssh -o StrictHostKeyChecking=no root@installclient -.... - -* Vous pouvez également supprimer l’entrée hôte de votre client -d’installation dans votre fichier _~/.ssh/known_hosts_ à l’aide de la -commande _ssh-keygen -R_. -* Dans les tâches chboot et savelog, une connexion utilisant un shell -sécurisé est ouverte au serveur FAI (voir link:#isavelog[[isavelog]]). -Pour garantir que cela fonctionne de manière non interactive, une entrée -appropriée dans _NFSROOT/root/.ssh/known_hosts_ doit être créée. Lors de -l’utilisation de fai-setup, cela se fait automatiquement, mais il peut -s’avérer nécessaire de l'éditer manuellement si le nom de votre serveur -FAI n’a pas été correctement déterminé. Si vous trébuchez sur des -connexions ssh qui nécessitent de taper "yes" pour accepter la clé hôte -pendant l’installation, vérifiez le contenu de votre fichier -_NFSROOT/root/.ssh/known_hosts_ -* Une liste de tous les disques durs locaux est stockée dans -`+$disklist+`. Il est défini après l’appel de `+set_disk_info+`. -* Utilisez `+fai-divert -a+` si un script postinst appelle un programme -de configuration, par exemple Le script postinst pour package apache -appelle apacheconfig, qui nécessite une entrée manuelle. Vous pouvez -fausser le programme de configuration pour que l’installation puisse -être entièrement automatique. -* Parfois, l’installation semble s’arrêter, mais souvent il ya seulement -un script postinstall d’un logiciel qui nécessite une entrée manuelle de -la console. Passez à un autre terminal virtuel et regardez quel -processus fonctionne avec des outils comme `+top(1)+` et `+pstree(1)+`. -Vous pouvez ajouter _debug_ à _FAI_FLAGS_ pour faire en sorte que le -processus d’installation affiche toutes les sorties des scripts postinst -sur la console et obtenir son entrée aussi à partir de la console. -* Comment puis-je définir des classes sur la ligne de commande du noyau? -+ -Lisez la page de manuel de `+fai-class(8)+`. Si vous souhaitez définir -des classes supplémentaires (par exemple A, B, C) sur la ligne de -commande du noyau, ajoutez ceci: _ADDCLASSES=A,B,C_ -* Comment utiliser un noyau personnalisé dans le nfsroot? -+ -Construisez votre noyau personnalisé en construisant un paquet kernel à -l’aide de `+make-kpkg(8)+` et utilisez l’option `+--initrd+`. Copiez ce -paquet Debian dans un référentiel local et ajoutez-le à -/etc/fai/sources.list. Ajoutez le nom de votre package à -/etc/fai/NFSROOT. Ensuite appeler -+ -.... -# fai-make-nfsroot -k -.... -* Puis-je utiliser un noyau 4.X? -+ -Oui. L’utilisation de FAI 5.1 et dracut 044+150-1 overlayfs (au lieu -d’aufs) est prise en charge, de même que le noyau 4.x. Lorsque vous -utilisez Debian jessie, vous pouvez utiliser un noyau de backports ou -consulter -https://lists.uni-koeln.de/pipermail/linux-fai/2016-March/011283.html -* Comment utiliser le nfsroot comme système pour les clients sans -disque? -+ -http://wiki.fai-project.org/wiki/Use_nfsroot_for_diskless_clients -* Comment faire pour servir plusieurs arborescence nfsroot sur un -serveur FAI? -+ -Si vous souhaitez diffuser plusieurs répertoires nfsroot, vous devez -créer des répertoires de configuration spécifiques dans _/etc_ pour FAI, -comme _/etc/fai-jessie_ et _/etc/fai-stretch_. Ensuite, vous devez -définir les variables `+$NFSROOT+` dans différents répertoires et -exécuter - -.... -faiserver#fai-make-nfsroot -c /etc/fai-jessie -.... - -[[_flag_reboot_fai_flags]] -=== flag_reboot (FAI_FLAGS) - -Si flag_reboot est défini, en ajoutant "reboot" à `+$FAI_FLAGS+`, votre -ordinateur client redémarrera après la fin de la tâche. Ceci est vrai -pour les installations de réseau ainsi que pour les installations de -bootmedium. - -[[_centos_reboot]] -=== CentOS reboot - -Après l’installation, CentOS nécessite habituellement un redémarrage -supplémentaire, en raison des correctifs de sécurité SELinux qui sont -appliqués après l’installation. - -[[_a_id_logfiles_a_fichiers_journaux]] -=== [#logfiles]####Fichiers journaux - -FAI crée plusieurs fichiers journaux. Pendant l’installation, ils sont -stockés dans _/tmp/fai_ sur le client d’installation lui-même. A la fin -de l’installation, ils seront copiés sur le serveur d’installation (voir -link:#isavelog[[isavelog]]). Une fois le client d’installation redémarré -dans son système nouvellement installé, vous pouvez trouver les journaux -FAI dans _/var/log/fai_. Les fichiers journaux sont également créés lors -de l’action softupdate ou dirinstall. - -Sur le faiserver, vous pouvez trouver les fichiers journaux (distants) -sous le répertoire ~fai. - -Les exemples de fichiers journaux des ordinateurs installés avec succès -sont disponibles sur http://fai-project.org/logs. Ce sont quelques -fichiers journaux qui sont créés par FAI. - -FAI_CLASSES:: - Contient une liste de toutes les classes définies. -dmesg.log:: - La sortie de la commande `+dmesg+`. Contient des messages utiles de la - mémoire tampon du noyau. -fai.log:: - Le fichier journal principal. Contient toutes les informations - importantes. Vous devez *toujours* lire ce fichier. -boot.log:: - Une liste de variables de paramètres de réseau, principalement définis - par le démon DHCP. -format.log:: - Sortie de l’outil de partition `+setup-storage(8)+`. -shell.log:: - La sortie de tous les scripts shell, utilisés pour la - personnalisation. -variables.log:: - Une liste de toutes les variables shell qui sont disponibles au cours - d’une installation. -error.log:: - Résumé des erreurs possibles dans tous les fichiers journaux. -disk_var.sh:: - Une liste des variables contenant des informations sur les - périphériques et les partitions à partir desquelles la partition - racine et une liste de périphériques de swap. Ces informations sont - utilisées par certains scripts de personnalisation (par exemple - _GRUB_PC/10-setup_). - -Si le processus d’installation se termine, le hook _savelog.LAST.sh_ -recherche tous les fichiers journaux pour les erreurs courantes et les -écrit dans le fichier _error.log_. Donc, vous devriez d’abord regarder -dans ce fichier pour les erreurs. Le fichier _status.log_ vous donne -également le code de sortie de la dernière commande exécutée dans un -script. Pour être sûr, vous devriez rechercher plus de détails dans tous -les fichiers journaux. - -[[_comment_utiliser_http_pour_le_démarrage_pxe]] -=== Comment utiliser HTTP pour le démarrage PXE - -.... -cp /usr/lib/PXELINUX/lpxelinux.0 /srv/tftp/fai/pxelinux.0 -.... - -Activer l’accès HTTP au répertoire tftp: - -.... -cd /var/www/html -ln -s /srv/tftp/fai -.... - -Ajoutez _-U URL_ à l’appel _fai-chboot_. Par exemple: - -.... -fai-chboot -U http://faiserver/fai -IFv ....... -.... - -[[_a_id_troubleshoot_a_dépannage]] -== [#troubleshoot]####Dépannage - -[[_a_id_booterror_a_erreurs_d_8217_amorçage]] -=== [#booterror]####Erreurs d’amorçage - -Le message d’erreur suivant indique que votre client d’installation -n’obtient pas de réponse d’un serveur DHCP. Vérifiez vos câbles ou -démarrez le démon `+dhcpd(8)+` avec le debug flag activé. - -PXE-E51: No DHCP or BOOTP offers received Network boot aborted - -Si vous ne voyez pas le message suivant, le noyau d’installation n’a pas -pu détecter votre carte réseau, par exemple en raison d’un pilote -manquant: - -.... -Starting dhcp for interface eth0 -dhcp: PREINIT eth0 up -dhcp: BOND setting eth -.... - -Vérifiez l’initrd dans le nfsroot (`+lsinird+`) si le pilote du noyau de -votre carte réseau est inclus et vérifiez si vous souhaitez ajouter le -paquet _firmware-linux-nonfree_ dans `+/etc/fai/NFSROOT+` et -reconstruisez l’initrd en appelant `+fai-make-nfsroot -k+`. Vous pouvez -également ajouter un pilote à `+/srv/fai/nfsroot/etc/dracut.conf+` dans -la ligne `+add_drivers+`+`+=+`. - -C’est le message d’erreur que vous verrez, lorsque votre carte réseau -fonctionne, mais le serveur d’installation n’exporte pas le répertoire -nfsroot vers les clients d’installation. Cela est souvent dû aux -permissions NFS manquantes du côté serveur. - -.... -Starting dhcp for interface eth0 -dhcp: PREINIT eth0 up -dhcp: BOND setting eth -mount.nfs: access denied by server while mounting 192.168.33.250:/srv/fai/nfsroot -. -. -dracut Warning: Could not boot -. -Dropping to debug shell -dracut:/# -.... - -Maintenant, vous êtes à l’intérieur du shell d’urgence de l’initrd qui a -été créé par _dracut(8)_. Vous obtiendrez une invite du shell et pourrez -consulter les fichiers journaux. Pour plus d’informations sur le -débogage du processus de démarrage précoce à l’aide de dracut, consultez -`+dracut.cmdline(7)+` - -Utilisez la commande suivante sur le serveur d’installation pour voir -quels répertoires sont exportés à partir du serveur d’installation -(nommé faiserver): - -.... -$ showmount -e faiserver -.... - -[[footnotes]] - -''''' - -[[_footnote_1]] -link:#_footnoteref_1[1]. Solaris 8 Advanced Installation Guide at -https://docs.oracle.com/cd/E19455-01/806-0957/806-0957.pdf - -[[_footnote_2]] -link:#_footnoteref_2[2]. -http://www.science.uva.nl/pub/solaris/auto-install - -[[_footnote_3]] -link:#_footnoteref_3[3]. fai-kvm a besoin de beaucoup de ram pour la vm, -à cause de la mise en cache de /var, 2GB sont OK - -[[_footnote_4]] -link:#_footnoteref_4[4]. Cette installation consommera environ 2 Go -d’espace dans `+/tmp+`. - -[[_footnote_5]] -link:#_footnoteref_5[5]. Il est également possible d’utiliser uniquement -le fichier de configuration avec la plus haute priorité puisque l’ordre -des classes définit une priorité de bas à haut dans la liste des -classes. - -[[_footnote_6]] -link:#_footnoteref_6[6]. Si vous souhaitez utiliser un miroir plus -rapide, ajustez l’URL dans _/etc/fai/apt/sources.list_ et -`+FAI_DEBOOTSTRAP+` in _/etc/fai/nfsroot.conf_ avant d’appeler -fai-setup. - -[[_footnote_7]] -link:#_footnoteref_7[7]. Ceci appellera `+fai-make-nfsroot(8)+` interne. - -[[_footnote_8]] -link:#_footnoteref_8[8]. Ces fichiers ne doivent pas appartenir au -compte racine. - -[[_footnote_9]] -link:#_footnoteref_9[9]. Vous pouvez également ajouter ceci dans votre -système de noms de domaine (DNS) - -[[_footnote_10]] -link:#_footnoteref_10[10]. Puisque le système de fichiers racine sur les -clients est monté via NFS, `+fai+` est localisé in -_/srv/fai/nfsroot/usr/sbin_ sur le servuer d’installation. - -[[_footnote_11]] -link:#_footnoteref_11[11]. _$FAI_ est une variable interne utilisée par -les scripts FAI. Par défaut, le chemin est _/var/lib/fai/config_. - -[[_footnote_12]] -link:#_footnoteref_12[12]. _/srv/fai/nfsroot_ depuis le serveur -d’installation via NFS - -[[_footnote_13]] -link:#_footnoteref_13[13]. Il a été défini sur la ligne de commande du -noyau - -[[_footnote_14]] -link:#_footnoteref_14[14]. /var/lib/fai/config - -[[_footnote_15]] -link:#_footnoteref_15[15]. _/var/log/fai/localhost/install/_ est un lien -vers ce répertoire. - -[[_footnote_16]] -link:#_footnoteref_16[16]. Je recommande d'écrire les adresses MAC (les -trois derniers octets suffiront si vous avez des cartes réseau du même -fournisseur) et le nom d’hôte à l’avant de chaque châssis. - -[[_footnote_17]] -link:#_footnoteref_17[17]. Pour le débogage, il peut être utile d’entrer -l’environnement chroot manuellement à l’aide de cette commande. -_faiserver# chroot /srv/fai/nfsroot bash_ - -[[_footnote_18]] -link:#_footnoteref_18[18]. Vous pouvez trouver le script dans -_/usr/share/doc/fai-doc/examples/utils/_ Version 5.3 - -[[footer]] -[[footer-text]] -Version 5.3 + -Last updated 2017-04-20 11:27:23 CEST

    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

  • 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