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

streamer en RTMP avec ffmpeg

Il y a pas longtemps, j’ai découvert qu’on pouvait se servir de ffmpeg comme encodeur Flash, pour pousser en utilisant le protocole propriétaire d’Adobe (le RTMP). J’ai testé ça avec un serveur Wowza comme cible (c’est pratique dès fois de bosser dans une boîte qui fait du streaming).

Ça se passe donc comme ça:

ffmpeg -i $src <mes options> -f flv rtmp://mon_serveur_flash/mon_appli_flash/mon_flux
  • <mes options> : c’est détaillé  ;
  • -f flv : on prend un container Flash Video pour pousser du Flash (c’est plutôt logique :-)) ;
  • la destination: au lieu d’un fichier ou d’une spec de flux rtp (par exemple), on spécifie une URL en rtmp:// avec les infos qui sont normalement fournies par votre fournisseur (en général: un hostname, un nom d’«application» – c’est la partie du serveur Flash qui est dédiée à un client –), et un nom de flux que l’on choisit comme on veut (en respectant la règle habituelle: pas d’accents, pas d’espaces, pas de caractères bizarroïdes).

Si on a la bande passante pour, et que l’on veut pousser sur plusieurs serveur, on peut multiplier les <mes options> et les URLs de destinations:

ffmpeg -i $src <mes options> -f flv rtmp://serveur1/mon_appli/mon_flux <mes options> -f flv rtmp://serveur2/mon_appli/mon_flux [...]

On peut aussi pousser sur un ou plusieurs serveurs plusieurs versions du flux $src (pour avoir plusieurs débits quand on veut faire Apple HTTP Live Streaming ou du Adobe HTTP Dynamic Streaming). On peut s’aider de la cochonnerie que j’ai publiée sur commandelinefu pour un flux RTP 🙂