Install Debian sans les mains (presque)

Donc, une installation de Debian (presque) sans les mains, ça vous paraît impossible? C’est pourtant ce que permet l’installeur Debian (d-i) grâce à sa fonction de preseeding.

Personnellement, je m’en sers pour aller vite sur la partie pas drôle de l’installation d’un nouveau serveur: installation et configuration de base (jusqu’à la conf du shell et des outils de base).

Prérequi: mon article “Install Debian 100% réseau

Attention: Avec ce qui est décrit là, vous ruinez le disque de la machine que vous réinstallez (on flingue la table de partition – et tout ou partie des données – et on recommence au propre).

Pour les impatients, voir l’exemple d’utilisation 😉

Continue reading

Install et conf de base d’une Debian

Remarques pour la suite:

  • Ce n’est pas précisé dans la suite, mais la commande de gestion de package à utilisé est aptitude, il faut oublier apt-get;
  • Cette documentation s’applique pour une installation en mode TEXTE et EXPERT ;
  • Je fais en sorte que ça m’installe le moins de merde possible, typiquement , je sélectionne rien 🙂 ;
  • Le document n’aborde pas la mise en place d’un RAID soft dès l’installation, en fouillant, ça se fait assez facilement avec l’outils de partitionnement ;
  • Idem pour les partoches cryptées ;
  • Personnellement, je fais l’installation en anglais, et j’aime bien avoir un système compatible avec unicode, du coup, mon choix de langue ou de locale est en_US.UTF-8 ;
  • Après le premier boot du système, il faut installer au moins le paquet openssh-server (enfin, surtout pour un serveur auquel on a pas prévu de brancher d’ecran et de clavier).

Mon partitionnement standard:

  • montage: /boot, taille: 150MB, type: ext3, options: nodev,nosuid ,noexec, label: /boot, “bootable flag”: oui ;
  • montage: none, taille: 2GB, type: swap, label: swap (si on prévois de mettre le système en veille avec un suspend to disk, on peut mettre 2x la quantité de RAM de la machine) ;
  • montage: /, taille: 20GB, type: ext4, options: relatime, label: / ;
  • montage: /tmp, taille: 10GB, type: ext4, options: relatime,nodev,nosuid,noexec, label: /tmp (logique – on peut s’en passer, surtout si on compte passer le /tmp en tmpfs plus tard) ;
  • montage: /var, taille: 10GB, type: ext4, options: relatime,nodev, label: /var (logique) ;
  • montage: /home, taille: tout le reste, type: ext4, options: relatime,nodev,nosuid, label: /home (logique – sur un serveur, je limite à 10GB, j’ai souvent une partition de data en prime) ;
  • montage /var/log, type: XFS options: noatime,nodiratime,nodev,nosuid,noexec, label: logs (celle-là, je la met surtout sur mes serveurs, et je la prévois aussi grande que possible, on peut compléter les options avec ce qui est décrit )

Configuration de base 1/2:

Pour le gestionnaire de package, le fichier /etc/apt/sources.list doit contenir au moins (pour stable):

deb http://ftp2.fr.debian.org/debian/ squeeze main contrib non-free
deb http://security.debian.org/ squeeze/updates main contrib non-free
deb http://ftp2.fr.debian.org/debian squeeze-updates main contrib non-free
deb http://backports.debian.org/debian-backports squeeze-backports main

On peut remplacer stable par testing sur un desktop/laptop et ajouter ces sources:

deb http://www.debian-multimedia.org testing main
deb http://dl.google.com/linux/chrome/deb/ stable main
deb http://deb.opera.com/opera/ sid non-free
deb http://deb.playonlinux.com/ squeeze main
deb http://download.virtualbox.org/virtualbox/debian squeeze non-free

Sur un serveur ou une machine restreinte en espace disque, je créé aussi un fichier /etc/apt/apt.conf.d/10reco_and_suggests, qui contient:

APT::Install-Recommends "0";
APT::Install-Suggests "0";

Ensuite, lancer les commandes:

# aptitude update
# aptitude safe-upgrade

Installation des packages de base:

J’installe au moins:

# aptitude install vim-nox xfsprogs hdparm ethtool sudo screen pciutils nfs-common smartmontools pciutils dmidecode inetutils-telnet snmp ntpdate bsd-mailx logrotate multitail tcpdump nmap lsof inotify-tools ssmtp bind9-host resolvconf atop iptraf psmisc less parted mlocate mtr minicom lshw python rsync unzip dnsutils read-edid whois

Sur un serveur, j’ajoute aussi tout ça:

# aptitude install mdadm reiserfsprofs vlan ifenslave bridge-utils nagios-nrpe-server cron-apt ocsinventory-agent nagios-plugins geoip-database snmpd

Configuration de base 2/2:

  • Éditeur par défaut: update-alternatives --set editor /usr/bin/vim.nox
  • Pager par défaut: update-alternatives --set pager /bin/less
  • Configuration de vim:
syntax on
set hls
set showmatch
set laststatus=2
set statusline=%t\ %y%r%{&ff}%m%=[%c%V,%l,%P]
set modeline
set modelines=1
set titlestring=%{expand($USER)}@%{hostname()}:vim\ %F%m%r
set title
  • Configuration du “serveur” SMTP local – /etc/ssmtp/ssmtp.conf:
root=moi@mondomain.net
mailhub=smtp.mondomain.net:465
rewriteDomain=mondomain.net
FromLineOverride=YES
AuthUser=moi
AuthPass=monMotDePasse
UseTLS=YES
  •  Configuration du portmaper – /etc/default/portmap:
OPTIONS="-i 127.0.0.1"
  • Configuration du client NFS – /etc/default/nfs-common:
NEED_STATD=no
STATDOPTS=
NEED_IDMAPD=no
NEED_GSSD=no
  • [serveur] Configuration du serveur SNMP – /etc/default/snmpd (1/2):
export MIBS=
SNMPDRUN=yes
SNMPDOPTS='-Lsd -Lf /dev/null -u snmp -g snmp -I -smux -p /var/run/snmpd.pid 127.0.0.1 X.Y.Z.T'
TRAPDRUN=no
TRAPDOPTS='-Lsd -p /var/run/snmptrapd.pid'
SNMPDCOMPAT=yes
  • [serveur] Configuration du serveur SNMP – /etc/snmp/snmpd.conf (2/2):
com2sec local     localhost       coincoin
com2sec mynetwork X.Y.0.0/16      coincoin
group MyRWGroup v1         local
group MyRWGroup v2c        local
group MyRWGroup usm        local
group MyROGroup v1         mynetwork
group MyROGroup v2c        mynetwork
group MyROGroup usm        mynetwork
view all    included  .1                               80
access MyROGroup ""      any       noauth    exact  all    none   none
access MyRWGroup ""      any       noauth    exact  all    all    none
syslocation qqpart
syscontact MOI - moi@mondomain.net
proc sshd 0 1
disk / 10000
load 4 6 8
  • Configuration de SSHd – /etc/ssh/sshd_config:
Port 22
#ListenAddress x.y.z.t # si on veut binder le service sur une seul IP/interface de la machine
Protocol 2
HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_dsa_key
UsePrivilegeSeparation yes
KeyRegenerationInterval 3600
ServerKeyBits 768
SyslogFacility AUTH
LogLevel INFO
LoginGraceTime 120
PermitRootLogin no
StrictModes yes
RSAAuthentication yes
PubkeyAuthentication yes
IgnoreRhosts yes
RhostsRSAAuthentication no
HostbasedAuthentication no
PermitEmptyPasswords no
ChallengeResponseAuthentication no
X11Forwarding no # bon, là, ça dépend de ce qu'on veut faire
X11DisplayOffset 10
PrintMotd no
PrintLastLog yes
TCPKeepAlive yes
AcceptEnv LANG LC_*
Subsystem sftp /usr/lib/openssh/sftp-server
UsePAM yes
ClientAliveInterval 3600
ClientAliveCountMax 0
UseDNS no # ça, ça me gonfle souvent
  • [serveur] Configuration de NRPE:

Convention: X.Y.Z.T est l’IP de la machine, Lm1, Lm5, Lm15, LM1, LM5, LM15 sont les valeurs à adapter en fonction de la machine pour les charges min (m) et max (M).
il faut que le fichier /etc/nagios/nrpe.cfg ressemble à ça:

log_facility=daemon
pid_file=/var/run/nrpe.pid
server_port=5666
server_address=X.Y.Z.T
nrpe_user=nagios
nrpe_group=nagios
dont_blame_nrpe=1
debug=0
command_timeout=60
connection_timeout=300
command[check_users]=/usr/lib/nagios/plugins/check_users -w 5 -c 10
command[check_zombie_procs]=/usr/lib/nagios/plugins/check_procs -w 5 -c 10 -s Z
command[check_dead_procs]=/usr/lib/nagios/plugins/check_procs -w 5 -c 10 -s D
command[check_total_procs]=/usr/lib/nagios/plugins/check_procs -w 150 -c 200
include=/etc/nagios/nrpe_local.cfg
include_dir=/etc/nagios/nrpe.d/

Le fichier /etc/nagios/nrpe_local.cfg doit contenir au moins (les scripts check_*.sh seront copiés-collés en annexe):

command[check_load]=/usr/lib64/nagios/plugins/check_load -w Lm1,Lm5,Lm15 -c LM1,LM5,LM15
command[check_swap]=/usr/lib/nagios/plugins/check_swap -w 10% -c 5%
command[check_space]=/usr/lib64/nagios/plugins/check_disk -w 20% -c 10% -p $ARG1$
command[check_mount]=/usr/local/bin/check_mount.sh $ARG1$ $ARG2$
command[check_ofiles]=/usr/local/bin/check_ofiles.sh
command[check_bonding]=/usr/local/bin/check_bonding.sh
  • [serveur] Initialiastion de l’agent OCS Inventory:
/usr/bin/ocsinventory-agent -s http://172.16.99.253/ocsinventory
  • Configuration de logrotate:
/etc/logrotate.conf:
daily
rotate 31
create
include /etc/logrotate.d
/var/log/wtmp {
    missingok
    monthly
    create 0664 root utmp
    rotate 1
}
/var/log/btmp {
    missingok
    monthly
    create 0660 root utmp
    rotate 1
}

Annexes:

check_bonding.sh

#!/bin/bash
if [ -r /proc/net/bonding/bond0 ]
then
 m=`grep -i -m1 "bonding mode:" /proc/net/bonding/bond0 | cut -d':' -f2 | sed -e 's/^\s*//' -e 's/\s*$//'`
if [ "$m" != "adaptive load balancing" ]
 then
 echo "KO: bonding mode is [$m]"
 else
 declare -i N=`cat /proc/net/bonding/bond0 | grep -i "MII Status" | grep -u up | wc -l | sed 's/^0*//'`
 if [ $N -lt 1 ]
 then
 echo "WARNING: bonding mode is OK, but no interfaces are UP!"
 else
 echo "OK: bonding mode is [$m], $((N - 1)) interfaces UP"
 fi
 fi
else
 echo "OK: no bonding configured"
fi

check_mount.sh

#!/bin/sh
if [ $# -ne 2 ]
then
 echo "Usage: $0 fs mount_point"
 exit $STATE_CRITICAL
fi
STATE_OK=0
STATE_WARNING=1
STATE_CRITICAL=2
STATE_UNKNOWN=3
STATE_DEPENDENT=4
ls -1An "$2" &> /dev/null
s=`mount | grep "$1" | grep -m 1 -F "$2 "`
if [ -z "$s" ]
then
 echo "CRITICAL: $2 not mounted!"
 exit $STATE_CRITICAL
else
 echo "OK: $s"
 exit $STATE_OK
fi

check_ofiles.sh

#!/bin/bash
STATE_OK=0
STATE_WARNING=1
STATE_CRITICAL=2
STATE_UNKNOWN=3
STATE_DEPENDENT=4
declare -i max
declare -i all
declare -i soc
declare -i p
max=`cat /proc/sys/fs/file-max`
all=`cat /proc/sys/fs/file-nr | sed 's/^\([0-9][0-9]*\).*$/\1/'`
soc=`snmpwalk -v 2c -c coincoin -O q -O v 127.0.0.1 .1.3.6.1.2.1.6.9.0`
p=$((100 * all / max))
if [ $p -lt 80 ]
then
 echo "OK: ${soc} sockets, $((all - soc)) files, max = ${max}"
 exit $STATE_OK
elif [ $p -lt 90 ]
then
 echo "WARNING: ${all}/${max} (${p}%) opened files"
 exit $STATE_WARNING
else # [ $p -ge 90 ]
 echo "CRITICAL: ${all}/${max} (${p}%) opened files!"
 exit $STATE_CRITICAL
fi
echo "UNKNOWN: ${soc} sockets, $((all - soc)) files, max = ${max} / ${p}% of ${max} opened files..."
exit $STATE_UNKNOWN

Faire rapidement une clef d’install Debian

Préparation:

Récupérer les fichiers suivants:

ou:

Création de la clef proprement dite:

En root depuis n’importe quel Linux, en ayant pris soin de repérer le device correspondant à la clef USB «sacrifiée»:

[root@host: Downloads]# zcat boot.img.gz > /dev/sdX
[root@host: Downloads]# mkdir /mnt/usb # s'il n'existe pas
[root@host: Downloads]# mount /dev/sdX /mnt/usb
[root@host: Downloads]# cp debian-XXXX-YY-netinst.iso /mnt/usb
[root@host: Downloads]# umount /mnt/usb

On branche la clef sur la machine à installer, on vérifie que le BIOS permet bien de booter sur ladite clef, et c’est parti!